장치 트리 오버레이를 로드하는 방법

장치 트리 오버레이를 로드하는 방법

나는 이것이 주제이고 그것에 관한 다른 게시물이 여러 개 있다는 것을 알고 있습니다. 하지만? 그들 중 일부는 승인된 답변이나 유용한 의견을 갖고 있습니다. 간단히 말해서 (커널을 다시 컴파일하지 않고) 장치 트리 모듈을 로드하려면 어떻게 해야 합니까?

지금까지 다음 방법을 찾을 수 있습니다.

  1. 런타임에 로드되는 모든 cat enI2C4.dtbo>/sys/kernel/config/device-tree/overlays.
  2. .dtbo및/또는 에서 파일을 지정하여 /boot/bootenv.txt부팅 프로세스 중에 로드합니다 /boot/uEnv.txt. 두 경우 모두 내용은 다음과 같습니다( enI2C4.dtbo아래에 저장됨 /boot).
overlays=enI2C4.dtbo

안타깝게도 그들 중 누구도 나를 위해 일하지 않았습니다.

  1. 디렉토리 device-tree가 존재하지 않으며 mkdir이 을 반환합니다 Operation not permitted. 이 질문에 대한 대부분의 솔루션은 자체 커널을 컴파일하는 것처럼 보이지만 실제로는 필요하지도 않고 내가 원하는 것도 아닙니다.
  2. 이 파일 중 하나를 편집/생성해도 아무 효과가 없는 것 같습니다. 오버레이를 찾을 수도 없고 특별한 것을 반환할 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(이것은 업스트림 기능은 아니지만 일부 커널에서 사용 가능).

관련 정보