16 июля 2019 г.

Как добавить FPGA bit файл в загрузочный BOOT.bin, для конфигурации ПЛИС вместе с Linux

В данном руководстве будет рассказано каким образом перекомпилировать U-Boot, для того, чтобы, добавить бинарный файл для конфигурации FPGA, в загрузочный файл BOOT.bin.

Для того чтобы 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 Результат выполнения команды для создания загрузчика
Следует прописать путь к файлу и в конец программы добавить "-debug", если всё выполнено корректно, должна появиться информация об объёме фалов на загрузочном файле:

Рис.5 Адресное пространство загрузочного образа
Как можно заметить U-Boot начинается с 0x21А300, он занимает 0x870BC, следовательно закончится примерно на 0x2A13BC, стоит отметить, что некоторый файлы на диске занимают больше места чем здесь и в загрузочном образе между файлами может быть промежуток.

В 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.


1 комментарий :

  1. Вечер добрый. Подскажите, а возможно ли загружать bit файл после загрузки линукса ? соответственно хранить bit файл на SD (или QSPI ), а не добавлять в boot.bin. Если такая возможность, тогда как это сделать?

    ОтветитьУдалить