U-Boot가 FIT 이미지에서 dtb를 로드하도록 허용

U-Boot가 FIT 이미지에서 dtb를 로드하도록 허용

Kernel+fdt FIT 이미지에서 검증된 Linux 커널만 부팅하도록 U-Boot를 설정하려고 합니다. (모든 것은 Yocto 아래에 구축되었습니다). U-Boot bin은 부팅을 위한 기본 장치 트리를 연결하지만 FIT 이미지에는 커널의 전체 트리가 있습니다.

커널이 부팅될 때 U-Boot가 FIT 이미지의 장치 트리를 무시하고 대신 fdtaddr(== 0x11000000) 값을 기반으로 자체 장치 트리를 전달한다는 점을 제외하면 모든 것이 잘 작동합니다.

Hit any key to stop autoboot:  0
reading uImage
3346230 bytes read in 100 ms (31.9 MiB/s)
## Loading kernel from FIT Image at 18000000 ...
No configuration specified, trying default...
Found default configuration: 'conf@1'
   Using 'conf@1' configuration
   Verifying Hash Integrity ... sha1,rsa2048:dev+ OK
   Trying 'kernel@1' kernel subimage
     Description:  Linux kernel
     Type:         Kernel Image
     Compression:  uncompressed
     Data Start:   0x180000e8
     Data Size:    3304016 Bytes = 3.2 MiB
     Architecture: ARM
     OS:           Linux
     Load Address: 0x10008000
     Entry Point:  0x10008000
     Hash node:    'hash@1'
     Hash algo:    sha1
     Hash value:   ff0333f01a894f81d716605f7c7995d651ff8111
     Hash len:     20
   Verifying Hash Integrity ... sha1+ OK
*  fdt: cmdline image address = 0x11000000
## Checking for 'FDT'/'FDT Image' at 11000000
Wrong FIT format: no description
*  fdt: raw FDT blob
## Flattened Device Tree blob at 11000000
   Booting using the fdt blob at 0x11000000
   of_flat_tree at 0x11000000 size 0x0000505a
   Loading Kernel Image ... OK
## device tree at 11000000 ... 11005059 (len=32858 [0x805A])
   Loading Device Tree to 2f72e000, end 2f736059 ... OK

[참고: 내 U-Boot에는 보드 제조업체에서 제공하는 일부 보드별 모듈이 있으며 이로 인해 U-Boot의 표준 동작이 변경될 수 있습니다.]

이미지를 로드한 후 올바른 작업을 얻을 수 있으면 "setenv fdtaddr ${loadaddr}" (== 0x18000000) - 그런 다음 U-Boot하다FIT 이미지에서 장치 트리를 찾아 전달합니다.

Hit any key to stop autoboot:  0
reading uImage
3346230 bytes read in 101 ms (31.6 MiB/s)
## Loading kernel from FIT Image at 18000000 ...
No configuration specified, trying default...
Found default configuration: 'conf@1'
   Using 'conf@1' configuration
   Verifying Hash Integrity ... sha1,rsa2048:dev+ OK
   Trying 'kernel@1' kernel subimage
     Description:  Linux kernel
     Type:         Kernel Image
     Compression:  uncompressed
     Data Start:   0x180000e8
     Data Size:    3304016 Bytes = 3.2 MiB
     Architecture: ARM
     OS:           Linux
     Load Address: 0x10008000
     Entry Point:  0x10008000
     Hash node:    'hash@1'
     Hash algo:    sha1
     Hash value:   ff0333f01a894f81d716605f7c7995d651ff8111
     Hash len:     20
   Verifying Hash Integrity ... sha1+ OK
*  fdt: cmdline image address = 0x18000000
## Checking for 'FDT'/'FDT Image' at 18000000
## Loading fdt from FIT Image at 18000000 ...
No configuration specified, trying default...
Found default configuration: 'conf@1'
   Using 'conf@1' configuration
   Trying 'fdt@1' fdt subimage
     Description:  Flattened Device Tree blob
     Type:         Flat Device Tree
     Compression:  uncompressed
     Data Start:   0x18326c2c
     Data Size:    38269 Bytes = 37.4 KiB
     Architecture: ARM
     Hash node:    'hash@1'
     Hash algo:    sha1
     Hash value:   79d5eeb892ef059566c04d98cdc6b30e92a665a2
     Hash len:     20
   Verifying Hash Integrity ... sha1+ OK
Can't get 'load' property from FIT 0x18000000, node: offset 3304372, name fdt@1 (FDT_ERR_NOTFOUND)
   Booting using the fdt blob at 0x18326c2c
   of_flat_tree at 0x18326c2c size 0x0000957d
   Loading Kernel Image ... OK
## device tree at 18326c2c ... 183301a8 (len=50557 [0xC57D])
   Loading Device Tree to 2f72a000, end 2f73657c ... OK

이것은 잘 작동하지만(위 명령을 "default_bootargs"에 추가할 수 있음) 동일한 동작을 얻기 위한 "적절한" 트릭이 누락되었는지 궁금합니다. FIT 이미지를 로드하면 다음과 같이 가정할 것입니다. , 그러면 u-Boot는 자연스럽게 커널뿐만 아니라 장치 트리도 로드합니다. (아직 bootm 명령의 옵션을 파악하지 못했습니다...)

감사해요

[편집하다:]

/dts-v1/;

/ {
        description = "U-Boot fitImage for MyBoard/4.4/tx6";
        #address-cells = <1>;

        images {
                kernel@1 {
                        description = "Linux kernel";
                        data = /incbin/("linux.bin");
                        type = "kernel";
                        arch = "arm";
                        os = "linux";
                        compression = "none";
                        load = <0x10008000>;
                        entry = <0x10008000>;
                        hash@1 {
                                algo = "sha1";
                        };
                };
                fdt@1 {
                        description = "Flattened Device Tree blob";
                        data = /incbin/("arch/arm/boot/dts/tx6.dtb");
                        type = "flat_dt";
                        arch = "arm";
                        compression = "none";
                        hash@1 {
                                algo = "sha1";
                        };
                };
    };

        configurations {
                default = "conf@1";
                conf@1 {
                        description = "Linux kernel, FDT blob";
            kernel = "kernel@1";
            fdt = "fdt@1";


                        hash@1 {
                                algo = "sha1";
                        };
                        signature@1 {
                                algo = "sha1,rsa2048";
                                key-name-hint = "dev-example";
                sign-images = "kernel", "fdt";
                        };
                };
    };
};

[편집하다:]

autoload=no
autostart=no
baseboard=stk5-v3
baudrate=115200
boot_mode=mmc
bootargs_jffs2=run default_bootargs;setenv bootargs ${bootargs} root=/dev/mtdblock3 rootfstype=jffs2
bootargs_mmc=run default_bootargs;setenv bootargs ${bootargs} root=PARTUUID=${rootpart_uuid} rootwait
bootargs_nfs=run default_bootargs;setenv bootargs ${bootargs} root=/dev/nfs nfsroot=${nfs_server}:${nfsroot},nolock ip=dhcp
bootargs_sdcard=run default_bootargs;setenv bootargs ${bootargs} root=/dev/mmcblk0p2 rootwait
bootargs_ubifs=run default_bootargs;setenv bootargs ${bootargs} ubi.mtd=rootfs root=ubi0:rootfs rootfstype=ubifs
bootcmd=run bootcmd_${boot_mode} bootm_cmd
bootcmd_jffs2=setenv autostart no;run bootargs_jffs2;nboot linux
bootcmd_mmc=setenv autostart no;run bootargs_mmc;fatload mmc 0 ${loadaddr} ${bootfile}
bootcmd_net=setenv autoload y;setenv autostart n;run bootargs_nfs;dhcp
bootcmd_sdcard=setenv autostart no;run bootargs_sdcard;fatload mmc 1:1 ${loadaddr} ${bootfile}
bootdelay=1
bootfile=uImage
bootm_cmd=bootm ${loadaddr} - ${fdtaddr}
cpu_clk=792
default_bootargs=setenv bootargs init=/sbin/init console=ttymxc0,115200 ro debug panic=1 ${append_bootargs}; setenv fdtaddr ${loadaddr}
emmc_boot_ack=1
emmc_boot_part=1
ethact=FEC
ethaddr=00:01:02:7f:e5:50
fdtaddr=11000000
fdtsave=mmc partconf 0 ${emmc_boot_ack} ${emmc_boot_part} ${emmc_boot_part};mmc write ${fdtaddr} 0x680 80;mmc partconf 0 ${emmc_boot_ack} ${emmc_boot_part} 0
fdtsize=505a
loadaddr=18000000
nfsroot=/tftpboot/rootfs
otg_mode=device
rootpart_uuid=0cc66cc0-02
splashimage=18000000
stderr=serial
stdin=serial
stdout=serial
touchpanel=edt-ft5x06
ver=U-Boot 2015.10-rc2 (Aug 11 2017 - 18:57:06 +0100)
video_mode=VGA

답변1

이 정확한 질문에 대한 대답은 U-Boot가 극도로 유연하려고 시도하여 때로는 혼란을 야기한다는 것을 이해하는 것에서 나옵니다. 제공된 환경을 살펴보면 bootcmd(부팅 지연이 끝날 때 실행됨)가 다음과 같이 요약되는 것을 볼 수 있습니다.

bootm ${loadaddr} - ${fdtaddr}

이는 우리가 본다는 것을 의미합니다.${주소 로드}우리 이미지의 경우,갈 곳없는램디스크의 경우${fdtaddr}장치 트리에서 사용됩니다. 전통적인 스타일의 uImage의 경우 램디스크와 장치 트리가 (아마도) 파일에 포함되어 있지 않기 때문에 이는 의미가 있습니다. 그러나 FIT 이미지에는 이 모든 것이 포함되어 있으며 게시자가 사용하고 싶어하는 유용한 추가 기능을 많이 제공합니다. FIT 이미지에 포함된 장치 트리를 선택한 후 U-Boot는 나머지 매개변수를 구문 분석하고 장치 트리를 사용하기 위해 ${fdtaddr}을 찾습니다. 만약에시작 명령단순으로 설정:

bootm ${loadaddr}

대신 예상대로 작동합니다.

답변2

fdt 노드에 로드 추가

fdt@1 {
    description = "Flattened Device Tree blob";
    data = /incbin/("arch/arm/boot/dts/tx6.dtb");
    type = "flat_dt";
    arch = "arm";
    load = <0x18000000>
    compression = "none";
    hash@1 {
        algo = "sha1";
    };
};

관련 정보