Для того чтобы FSBL сконфигурировал ПЛИС при включении питания и перед запуском Linux, его необходимо добавить в загрузочный файл сразу после FSBL, иначе он его не найдёт. Необходимо использовать *.bit файл в *.bin файле нет заголовка и он не запуститься через FSBL. Это выглядит следующим образом:
Рис.1 Изменение загрузочного образа |
Но при попытке выполнить это, Xilinx SDK выдаст ошибку:
[ERROR] : Section uImage.0 offset of 0x100000 overlaps with prior section end address of 2A13C0
Это означает, что файлы добавленные перед uImage занимают больший размер чем установленный для него начальный адрес 0x100000, и добавить uImage в требуемое место не представляется возможным.
Для того чтобы подробнее проанализировать занимаемый каждым файлом объём, можно запустить создание загрузочного файла с опцией "-debug". Для этого нужно скопировать выполняемую команду из консоли которая находится в нижней части экрана:
Рис.2 Копирование команды из консоли |
cmd /C bootgen -image zybo.bif -arch zynq -o D:\study\maga2\V\BOOT.bin -w onДалее открыть терминал. Это можно сделать через Xilinx SDK, нажав Xilinx -> Launch Shell
Рис.3 Запуск терминала |
Рис.4 Результат выполнения команды для создания загрузчика |
Рис.5 Адресное пространство загрузочного образа |
В Zybo находится QSPI на 128 Mb, адрес последней ячейки 0x8000000, у нас ещё достаточно место для того чтобы всё передвинуть. Бинарный файл FPGA и FSBL не должны сильно меняться в размере вне зависимости от сложности проекта.
Изменим смещения файлов на следующие:
uImage 0x300000
devicetree.dtb 0x800000
uramdisk.image.gz 0x820000
Теперь zybo.bif имеет следующее содержимое:
//arch = zynq; split = false; format = BIN the_ROM_image: { [bootloader]D:\study\maga2\V\Zybo-base-linux-aster\zybo_19\zybo_19.sdk\fsbl\Debug\fsbl.elf D:\study\maga2\V\Zybo-base-linux-aster\zybo_19\zybo_19.runs\impl_1\design_1_wrapper.bit D:\study\maga2\V\Linux_files\u-boot.elf [offset = 0x300000]D:\study\maga2\V\Linux_files\uImage [offset = 0x800000]D:\study\maga2\V\Linux_files\devicetree.dtb [offset = 0x820000]D:\study\maga2\V\Linux_files\uramdisk.image.gz }Загрузочный файл успешно создаётся, но при попытке его запуска на устройстве появится ошибка о том, что U-Boot не нашёл Linux образ. Для того чтобы это исправить, нужно изменить исходники U-Boot, указав правильные адреса смещений и перекомпилировать его.
U-Boot был взят с Git сервера. Нам необходимо изменить файл
u-boot-xlnx/include/configs/zynq-common.h
Вместо этой части:
"qspiboot=run xilinxcmd && " \ " echo Copying Linux from QSPI flash to RAM... && " \ "sf probe 0 0 0 && " \ "sf read ${kernel_load_address} 0x100000 ${kernel_size} && " \ "sf read ${devicetree_load_address} 0x600000 ${devicetree_size} && " \ "echo Copying ramdisk... && " \ "sf read ${ramdisk_load_address} 0x620000 ${ramdisk_size} && " \ "bootm ${kernel_load_address} ${ramdisk_load_address} ${devicetree_load_address}\0" \Прописать эту:
"qspiboot=run xilinxcmd && " \ " echo Copying Linux from QSPI flash to RAM... && " \ "sf probe 0 0 0 && " \ "sf read ${kernel_load_address} 0x300000 ${kernel_size} && " \ "sf read ${devicetree_load_address} 0x800000 ${devicetree_size} && " \ "echo Copying ramdisk... && " \ "sf read ${ramdisk_load_address} 0x820000 ${ramdisk_size} && " \ "bootm ${kernel_load_address} ${ramdisk_load_address} ${devicetree_load_address}\0" \Далее необходимо перекомпилировать U-Boot, как это сделать было описано в другой статье.
После выполнения всех действий, при запуске питания ПЛИС сконфигурируется, затем как и раньше запускается Linux.
Вечер добрый. Подскажите, а возможно ли загружать bit файл после загрузки линукса ? соответственно хранить bit файл на SD (или QSPI ), а не добавлять в boot.bin. Если такая возможность, тогда как это сделать?
ОтветитьУдалить