나는 이것이 주제이고 그것에 관한 다른 게시물이 여러 개 있다는 것을 알고 있습니다. 하지만? 그들 중 일부는 승인된 답변이나 유용한 의견을 갖고 있습니다. 간단히 말해서 (커널을 다시 컴파일하지 않고) 장치 트리 모듈을 로드하려면 어떻게 해야 합니까?
지금까지 다음 방법을 찾을 수 있습니다.
- 런타임에 로드되는 모든
cat enI2C4.dtbo>/sys/kernel/config/device-tree/overlays
. .dtbo
및/또는 에서 파일을 지정하여/boot/bootenv.txt
부팅 프로세스 중에 로드합니다/boot/uEnv.txt
. 두 경우 모두 내용은 다음과 같습니다(enI2C4.dtbo
아래에 저장됨/boot
).
overlays=enI2C4.dtbo
안타깝게도 그들 중 누구도 나를 위해 일하지 않았습니다.
- 디렉토리
device-tree
가 존재하지 않으며 mkdir이 을 반환합니다Operation not permitted
. 이 질문에 대한 대부분의 솔루션은 자체 커널을 컴파일하는 것처럼 보이지만 실제로는 필요하지도 않고 내가 원하는 것도 아닙니다. - 이 파일 중 하나를 편집/생성해도 아무 효과가 없는 것 같습니다. 오버레이를 찾을 수도 없고 특별한 것을 반환할
find /proc/device-tree/ -type f -exec head {} + | grep I2C
수도 없습니다 .dmesg
그렇다면 내가 여기서 무엇을 놓치고 있는 걸까요? 세 번째 옵션이 있나요? 아니면 여기서 뭔가 빠졌나요(아마도 어리석은 일인가요)?
배경 및 추가 정보:
i.MX 8M에서 I2C4를 활성화하려고 합니다.
$ lsb_release -a
Distributor ID: ampliPHY
Description: ampliPHY GNU/Linux BSP-Yocto-NXP-i.MX8MP-PD22.1.0 (hardknott)
Release: BSP-Yocto-NXP-i.MX8MP-PD22.1.0
Codename: hardknott
파일 .dts
은 다음과 같습니다
/dts-v1/;
#include "imx8mp.dtsi"
&i2c4 {
clock-frequency = <400000>;
pinctrl-names = "default", "gpio";
status = "okay";
};
/boot/bootenv.txt
이것은 및 /boot/uEnv.txt
파일이 있는 bootpromp(/boot/ 마운트 후)입니다 .
[ OK ] Mounted /boot.
[ OK ] Reached target Local File Systems.
Starting Create Volatile Files and Directories...
[ OK ] Finished Create Volatile Files and Directories.
Starting Network Name Resolution...
Starting Network Time Synchronization...
[ OK ] Started Network Name Resolution.
[ OK ] Started Network Time Synchronization.
[ OK ] Reached target Network.
[ OK ] Reached target Host and Network Name Lookups.
[ OK ] Reached target System Initialization.
[ 6.550051] imx-sdma 30bd0000.dma-controller: sdma firmware not ready!
[ 6.557338] imx-sdma 30bd0000.dma-controller: sdma firmware not ready!
[ 6.564225] imx-sdma 30bd0000.dma-controller: sdma firmware not ready!
[ 6.570968] imx-sdma 30bd0000.dma-controller: sdma firmware not ready!
[ 6.577572] imx-sdma 30bd0000.dma-controller: sdma firmware not ready!
[ 6.597437] imx-cdnhdmi sound-hdmi: snd_soc_register_card failed (-517)
[ OK ] Started 6.605376] fsl-aud2htx 30cb0000.aud2htx: Unbalanced pm_runtime_enable!
;39mDaily Cleanup of Temporary Di[ 6.613814] fsl-aud2htx 30cb0000.aud2htx: failed to init imx pcm dma: -517
rectories.
[ OK ] Reached target System Time Set.
[ OK ] Reached target System Time Synchronized.
[ OK ] Reached target Timers.
[ OK ] Listening on D-Bus System Message Bus Socket.
[ OK ] Listening on PC/SC Smart Card Daemon Activation Socket.
Starting sshd.socket.
[ OK ] Started NFS status monitor for NFSv2/3 locking..
[ OK ] Listening on sshd.socket.
[ OK ] Reached target Sockets.
[ OK ] Reached target Basic System.
Starting Save/Restore Sound Card State...
[ OK ] Started D-Bus System Message Bus.
[ OK ] Started Start fan control, if configured.
[ OK ] Started Linux Firmware Loader Daemon.
Starting User Login Management...
Starting Permit User Sessions...
[ 6.927296] imx-sdma 30bd0000.dma-controller: firmware found.
Starting OpenSS[ 6.934041] imx-sdma 30bd0000.dma-controller: loaded firmware 4.6
H Key Generation...
[ OK ] Finished Save/Restore Sound Card State.
[ OK ] Finished Permit User Sessions.
[ OK ] Finished OpenSSH Key Generation.
[ OK ] Reached target Sound Card.
[ OK ] Started Getty on tty1.
[ OK ] Started Serial Getty on ttymxc0.
[ OK ] Reached target Login Prompts.
[ OK ] Started User Login Management.
[ OK ] Reached target Multi-User System.
[ 7.198435] IPv6: ADDRCONF(NETDEV_CHANGE): can0: link becomes ready
[ 7.204785] IPv6: ADDRCONF(NETDEV_CHANGE): can1: link becomes ready
____ _ _ __ __ _____ _____ ____
| _ \ | | | |\ \ / /|_ _|| ____| / ___|
| |_) || |_| | \ V / | | | _| | |
| __/ | _ | | | | | | |___ | |___
|_| |_| |_| |_| |_| |_____| \____|
_ __ __ ____ _ ___ ____ _ _ __ __
/ \ | \/ || _ \ | | |_ _|| _ \ | | | |\ \ / /
/ _ \ | |\/| || |_) || | | | | |_) || |_| | \ V /
/ ___ \ | | | || __/ | |___ | | | __/ | _ | | |
/_/ \_\|_| |_||_| |_____||___||_| |_| |_| |_|
답변1
다른 답변에서 설명했듯이 런타임 시(재부팅하지 않고) 오버레이를 로드하려면 사용자 정의 Linux 커널이 필요합니다. 즉, 커널 소스 코드를 패치하고 구성을 조정한 다음 Linux 배포판이 이미 있지 않은 한 사용자 정의 Linux 커널을 컴파일하고 설치해야 합니다. 이러한 수정된 커널을 제공합니다.
일반적으로 재정의는 런타임에 적용되지 않고 일반적으로 u-boot 부트로더에 적용됩니다. u-boot에서 커널 장치 트리에 오버레이를 추가하는 방법에는 여러 가지가 있습니다. 가장 일반적인 방법은 다양한 u-boot 명령을 사용하여 장치 트리와 모든 오버레이를 메모리에 "수동으로" 로드한 다음 각 오버레이를 사용하여 업데이트하는 것입니다. 장치 트리 회전, 그리고 마지막으로 생성된 장치 트리로 Linux 커널이 시작됩니다. 이러한 단계는 일반적으로 부팅 스크립트(u-boot 부팅 시 실행되는 스크립트)에 배치됩니다. 이 스크립트는 일반적으로 boot.scr이라고 불리며 사람이 읽을 수 없고 수정할 수 없는 이진 이미지 형식입니다. (boot.scr은 boot.cmd라는 스크립트 소스 코드 파일을 컴파일하여 생성할 수 있습니다).
그러나 대부분의 사람들은 이러한 세부 사항을 다룰 필요가 없습니다. 사용 중인 Linux 배포판에 따라 이 모든 것이 처리되며 u-boot 환경 변수에 나열된 재정의를 로드하고 적용하는 부팅 스크립트(또는 일부 대체 메커니즘)가 있습니다. 이름은 "overlays"일 수 있습니다. "이며 일반적으로 /boot/uEnv.txt라는 파일을 편집하여 수정할 수 있습니다.
다시 말하지만, 이 모든 것들은 배포 설계자가 u-boot, 부팅 스크립트, 커널 및 Linux 시스템을 설정한 방법에 따라 다르게 작동합니다. 예를 들어, u-boot 환경은 eeprom이나 spi nvram과 같은 하드웨어 칩, 하드 드라이브의 특수 파티션이나 섹터 또는 기타 비밀 위치에 저장될 수도 있습니다. u-boot 환경 변수나 부팅 스크립트를 수정하는 것은 보안상 취약할 수 있으므로 루트 권한이 있어도 사용자가 수정하지 못하는 경우가 많습니다. u-boot 환경을 수정할 수 있더라도 부팅 스크립트에는 재정의를 추가하는 기능이 포함되어 있지 않을 수 있습니다. 배포판이 제공하는 내용에 따라 다릅니다.
마지막 예: Armbian을 사용하고 Armbian이 오버레이를 지원하는 플랫폼을 가지고 있다면 운이 좋을 것입니다. /boot/armbianEnv.txt에 저장된 "overlays" 변수만 수정하면 됩니다. 이 변수는 Linux 커널을 부팅하기 전에 u-boot가 추가하려고 시도하는 공백으로 구분된 재정의 목록입니다. .dtbo 접미사 없이 원하는 오버레이의 파일 이름을 추가합니다. 여기에 추가하는 재정의는 /boot/dtb/XXX 아래에 있어야 합니다. 여기서 XXX는 플랫폼의 하위 디렉터리입니다. 작동하지 않는 오버레이를 추가하면 시스템이 부팅되지 않을 수 있지만 일반적으로 u-boot는 잘못된 오버레이를 건너뛰고 오류 메시지를 표시합니다.
.dts 오버레이 소스 코드 파일에서 사용자 정의 오버레이 .dtbo 파일을 컴파일할 수 있는 "armbian-add-overlay" 도구도 있습니다. 생성된 .dtbo는 /boot/overlay_user/에 자동으로 복사되고 /boot/armbianEnv.txt의 user_overlays u-boot 환경 변수에 참조가 추가됩니다. 정돈된!
예를 들어 참조하십시오.https://docs.armbian.com/User-Guide_Allwinner_overlays/
답변2
/sys/kernel/config/device-tree/overlays/
빌드된 커널이 있어야 하기 때문입니다 CONFIG_OF_CONFIGFS=y
(이것은 업스트림 기능은 아니지만 일부 커널에서 사용 가능).