2016-12-19 2 views
0

Я работаю с SoC Xilinx Zynq-7000, и я пытаюсь перейти от «наследия» (изображение uImage + DTB + initramfs) к потоку загрузки «современный» (FIT) , Это текущая последовательность команд, которые я использую, чтобы загрузить свою плату (выход отсутствует):Не удается загрузить с изображения FIT

setenv bootargs "console=ttyPS0,115200 root=/dev/ram rw ramdisk_size=0x1600000 earlyprintk init=/sbin/init" 
tftpboot 0x2000000 devicetree.dtb 
tftpboot 0x2080000 uImage 
tftpboot 0x4000000 initramfs.img 
bootm 0x2080000 0x4000000 0x2000000 

Я работаю над существующим проектом, и, насколько я знаю, TFTP загрузка адрес (0x2080000 и т.д. .) произвольны. Я не делаю они имеют значение, кроме того, что они отображаются в ОЗУ и не перекрываются с адресами загрузки. Поправьте меня, если я ошибаюсь.

Выполнение команды bootm генерирует следующий вывод:

Zynq> bootm 0x2080000 0x4000000 0x2000000 
## Booting kernel from Legacy Image at 02080000 ... 
    Image Name: Linux-4.0.0-00011-gcfd1f62 
    Image Type: ARM Linux Kernel Image (uncompressed) 
    Data Size: 3297728 Bytes = 3.1 MiB 
    Load Address: 00008000 
    Entry Point: 00008000 
    Verifying Checksum ... OK 
## Loading init Ramdisk from Legacy Image at 04000000 ... 
    Image Name: Ramdisk Image 
    Image Type: ARM Linux RAMDisk Image (gzip compressed) 
    Data Size: 22569621 Bytes = 21.5 MiB 
    Load Address: 00000000 
    Entry Point: 00000000 
    Verifying Checksum ... OK 
## Flattened Device Tree blob at 02000000 
    Booting using the fdt blob at 0x2000000 
    Loading Kernel Image ... OK 
    Loading Ramdisk to 1ea79000, end 1ffff295 ... OK 
    Loading Device Tree to 1ea73000, end 1ea78ba1 ... OK 

Starting kernel ... 

Uncompressing Linux... done, booting the kernel. 
Booting Linux on physical CPU 0x0 
[Omitted] 

Другими словами, bootm правильно загружает ядро.

Теперь, вместо того, чтобы загружать каждое изображение и передавать их адреса в bootm, я хочу создать одно изображение FIT со всеми тремя изображениями. Я могу предоставить .its источник, если это необходимо, но я указал все три изображений (uImage, DTB и initramfs), и это mkimage выхода:

FIT description: Test FIT Image 
Created:   Mon Dec 19 13:13:06 2016 
Image 0 ([email protected]) 
    Description: Linux Kernel 
    Created:  Mon Dec 19 13:13:06 2016 
    Type:   Kernel Image 
    Compression: uncompressed 
    Data Size: 3297792 Bytes = 3220.50 kB = 3.15 MB 
    Architecture: ARM 
    OS:   Linux 
    Load Address: 0x00008000 
    Entry Point: 0x00008000 
Image 1 ([email protected]) 
    Description: Device Tree Blob 
    Created:  Mon Dec 19 13:13:06 2016 
    Type:   Flat Device Tree 
    Compression: uncompressed 
    Data Size: 11170 Bytes = 10.91 kB = 0.01 MB 
    Architecture: ARM 
Image 2 ([email protected]) 
    Description: initramfs 
    Created:  Mon Dec 19 13:13:06 2016 
    Type:   RAMDisk Image 
    Compression: gzip compressed 
    Data Size: 22569685 Bytes = 22040.71 kB = 21.52 MB 
    Architecture: ARM 
    OS:   Linux 
    Load Address: 0x00000000 
    Entry Point: 0x00000000 
Default Configuration: '[email protected]' 
Configuration 0 ([email protected]) 
    Description: Boot Linux kernel with FDT blob 
    Kernel:  [email protected] 
    Init Ramdisk: [email protected] 
    FDT:   [email protected] 

адрес загрузки и точка входа линии с bootm выходом из моих предыдущая процедура загрузки. Это, как я пытаюсь загрузиться, используя мой новый .itb файл (выход опущен):

setenv bootargs "console=ttyPS0,115200 root=/dev/ram rw ramdisk_size=0x1600000 earlyprintk init=/sbin/init" 
tftpboot 0x2000000 image.itb 
bootm 0x2000000 

Вот выход из bootm:

Zynq> bootm 0x2000000 
## Loading kernel from FIT Image at 02000000 ... 
    Using '[email protected]' configuration 
    Verifying Hash Integrity ... OK 
    Trying '[email protected]' kernel subimage 
    Description: Linux Kernel 
    Type:   Kernel Image 
    Compression: uncompressed 
    Data Start: 0x020000c4 
    Data Size: 3297792 Bytes = 3.1 MiB 
    Architecture: ARM 
    OS:   Linux 
    Load Address: 0x00008000 
    Entry Point: 0x00008000 
    Verifying Hash Integrity ... OK 
## Loading ramdisk from FIT Image at 02000000 ... 
    Using '[email protected]' configuration 
    Trying '[email protected]' ramdisk subimage 
    Description: initramfs 
    Type:   RAMDisk Image 
    Compression: gzip compressed 
    Data Start: 0x02327f88 
    Data Size: 22569685 Bytes = 21.5 MiB 
    Architecture: ARM 
    OS:   Linux 
    Load Address: 0x00000000 
    Entry Point: 0x00000000 
    Verifying Hash Integrity ... OK 
## Loading fdt from FIT Image at 02000000 ... 
    Using '[email protected]' configuration 
    Trying '[email protected]' fdt subimage 
    Description: Device Tree Blob 
    Type:   Flat Device Tree 
    Compression: uncompressed 
    Data Start: 0x02325370 
    Data Size: 11170 Bytes = 10.9 KiB 
    Architecture: ARM 
    Verifying Hash Integrity ... OK 
    Booting using the fdt blob at 0x2325370 
    Loading Kernel Image ... OK 
    Loading Ramdisk to 1ea79000, end 1ffff2d5 ... OK 
    Loading Device Tree to 1ea73000, end 1ea78ba1 ... OK 

Starting kernel ... 

undefined instruction 
pc : [<0000800c>]   lr : [<3ff2b834>] 
reloc pc : [<c40dd00c>] lr : [<04000834>] 
sp : 3f30acb0 ip : 0000000c  fp : 3ff2b8c0 
r10: 00000000 r9 : 3f30aee0  r8 : 020000c4 
r7 : 00000000 r6 : 00008000  r5 : 3ff9c868 r4 : 00000000 
r3 : 00002ba2 r2 : 1ea73000  r1 : 00000000 r0 : 3f30afb0 
Flags: nZCv IRQs off FIQs off Mode SVC_32 
Resetting CPU ... 

resetting ... 

Это мой первый раз с помощью FIT изображения, но все до краха выглядит хорошо для меня. Адреса точек загрузки и входа выстраиваются в линию, а выход до Starting kernel... связан с моей старой загрузкой, более или менее.

Я не понимаю, как создавать/использовать изображения FIT?

Я уверен, что с изображением FIT U-Boot загружает uImage на адрес загрузки, 0x8000. Я тестировал с md в U-Boot:

Перед загрузкой FIT изображения

Zynq> md 0x8000 
00008000: dfdc3ffc dd5ffbfe ff7fbabe ffffd7fe .?...._......... 
00008010: 777fccfb fbbfeefb dde9f8cf ffffeee7 ...w............ 
00008020: ffcefebc f76ffffb ffadf2ed f5f776ff ......o......v.. 
00008030: eb31fdd9 fff28fff df5fb77f ffdbeeeb ..1......._..... 
00008040: dedfef7f ebeffebe fddfbbbf f7f7d4ff ................ 
00008050: ddcfaed7 e7fe33ee ff8eb89f fedd3df7 .....3.......=.. 
00008060: ffdffd7f 75bff5ad f2dff52b ffb7f03f .......u+...?... 
00008070: f7fffef3 ff9fbffb bf7fabfe ff96db5f ............_... 
00008080: f777feff f6b7bf5b fb27dffb e5beb98f ..w.[.....'..... 
00008090: ffbdf8f7 f3fefce7 e8fefdf6 ffc639ef .............9.. 
000080a0: f6ef8bfe f6bffcfd ffffd4cf defffdff ................ 
000080b0: edbf46bf ffdfbdbf 7edff6b7 fde5afbf .F.........~.... 
000080c0: b7cdf9bf fffefdbb ffbdfa7f eeffffb7 ................ 
000080d0: c5affdef ffcffbaf e73f6fef fdeff37f .........o?..... 
000080e0: f3ffeffb 76af599b ffff7dff 6dafbd8f .....Y.v.}.....m 
000080f0: efffaafd fdfff7fe effffbff bebf6cbe .............l.. 

После загрузки FIT изображений

00008000: 56190527 3328f51d dc265858 c0513200 '..V..(3XX&..2Q. 
00008010: 00800000 00800000 368dbc5f 00020205 ........_..6.... 
00008020: 756e694c 2e342d78 2d302e30 31303030 Linux-4.0.0-0001 
00008030: 63672d31 66316466 00003236 00000000 1-gcfd1f62...... 
00008040: e1a00000 e1a00000 e1a00000 e1a00000 ................ 
00008050: e1a00000 e1a00000 e1a00000 e1a00000 ................ 
00008060: ea000003 016f2818 00000000 003251c0 .....(o......Q2. 
00008070: 04030201 e10f9000 eb000bf8 e1a07001 .............p.. 
00008080: e1a08002 e10f2000 e3120003 1a000001 ..... .......... 
00008090: e3a00017 ef123456 e10f0000 e220001a ....V4........ . 
000080a0: e310001f e3c0001f e38000d3 1a000004 ................ 
000080b0: e3800c01 e28fe00c e16ff000 e12ef30e ..........o..... 
000080c0: e160006e e121f000 e16ff009 00000000 n.`...!...o..... 
000080d0: 00000000 00000000 00000000 00000000 ................ 
000080e0: e1a0400f e204433e e2844902 e1a0000f [email protected]>C...I...... 
000080f0: e1500004 359f01ac 3080000f 31540000 ..P....5...0..T1 

U-Boot сообщил, что данные ядра изображений начали по смещению 0xc4 откуда я загрузил изображение FIT. Если я прочитаю по этому адресу (0x20000c4), данные будут идентичны тому, что находится в 0x8000 после попытки загрузки. Таким образом, U-Boot определенно загружает ядро.

Вот результат моего ядра сборки при создании uImage:

/bin/sh ./scripts/mkuboot.sh -A arm -O linux -C none -T kernel -a 0x8000 -e 0x8000 -n 'Linux-4.0.0-00011-gcfd1f62' -d arch/arm/boot/zImage arch/arm/boot/uImage 
Image Name: Linux-4.0.0-00011-gcfd1f62 
Created:  Mon Dec 19 13:32:30 2016 
Image Type: ARM Linux Kernel Image (uncompressed) 
Data Size: 3297728 Bytes = 3220.44 kB = 3.14 MB 
Load Address: 00008000 
Entry Point: 00008000 

Опять же, все, кажется, кошерная здесь.

Любые идеи?

ответ

2

Увидев ваш источник FIT, вы можете подтвердить его, но, похоже, вы упаковываете uImage в FIT, утверждая, что это обычный образ ядра. Текст ядра, который должен быть в 0x8000, находится на 0x8040 в вашем дампе, а предыдущие 64 байта выглядят ужасно, как заголовок uImage.

Для ящика FIT используйте либо простую арку/руку/загрузку/изображение, либо самораспаковывающуюся арку/руку/загрузку/zImage, либо одну из различных сжатых арки/руки/загрузочного/изображения. * С "сжатием «установите соответствующим образом. В противном случае все становится немного «Yo dawg, я слышал, что вам нравятся форматы изображений U-boot ...»

+0

Это билет. Я понятия не имел, что вы не можете встроить ядро ​​формата U-Boot в образ FIT. Теперь мне жаль, что я не опубликовал свой источник FIT ... это облегчило бы вашу работу! Благодаря! –

Смежные вопросы