Автор - Захаров Филипп
Программист ООО «СМАРТС-Кванттелеком»
В предыдущей статье я рассказал, как создать блок-дизайн c софт-процессором Microblaze, ethernet в режиме SGMII и SPI flash. В этой статье я расскажу про то, как собрать и настроить образ линукса, какие инструменты для этого понадобятся и про дорогие, любимые грабли, куда же без них.
Хотя установка Petalinux оказалась довольно запутанной, я не буду описывать этот процесс тут. У Xilinx есть отдельный гайд, следуя которому вы получите корректно работающую систему. Там же вы можете прочитать общую информацию по созданию и компиляции проекта. Могу лишь посоветовать брать все установщики одних и тех же версий (в моем случае для всего применялась версия 2022.1), иначе во время создания проекта вы можете получить непредсказуемые ошибки.
Также для корректной установки Petalinux, вам скорее всего понадобиться установить ряд дополнительных пакетов. Тут могу помочь еще одной полезной ссылкой. Для еще более удобной работы в терминале могу посоветовать попробовать установить Midnight Commander (sudo apt install mc).
Для запуска этой программы открываем терминал, вводим mc и видим довольно удобный и наглядный проводник. В нем можно даже пользоваться мышкой.
Итак, установив Petalinux, первым делом следует зайти в папку с программой (…/petalinux/2022.1) через терминал и ввести: source ./settings.sh. Это нужно для того, чтобы произвести настройку среды выполнения программы. Без этого мы не сможем использовать petalinux. Если программа и все дополнительные пакеты правильно установлены, то в результате приведенной выше команды вы увидите следующее.
Теперь, выбираем расположение для проекта и находясь по выбранному адресу вводим petalinux-create -t project – template microblaze –n (ваше название проекта). Таким образом мы создаем папку с проектом, открыв которую, можно увидеть несколько файлов и папок с предварительной настройкой проекта.
Далее заходим в эту папку и в командной строке вводим petalinux-config –get-hw-decription (путь до .xsa файла с платформой, экспортированной из Vivado в прошлой части статьи). Если все хорошо и файл успешно экспортирован, то откроется конфигурационное меню системы.
Большинство настроек можно оставить в их дефолтовом состоянии. Чтобы система заработала, нам понадобится изменить несколько пунктов. На данный момент, в этом меню нас интересует только Yocto Settings.
Yocto Project — это проект Linux Foundation с открытым исходным кодом, целью которого является создание инструментов позволяющих создавать дистрибутивы Linux для встроенного программного обеспечения и IoT, которые не зависят от базовой архитектуры встроенного оборудования.
Дело в том, что при сборке, petalinux обращается к yocto, и с их ресурсов начинает скачивать файлы, необходимые для сборки. Эти файлы называются sstate cache. Sstate cache различается между версиями petalinux. Таким образом, у petalinux версии 2022.1, есть своя версия sstate cache (2022.1).
Чтобы ускорить сборку и избежать возможных ошибок нам надо скачать кэш соответствующей версии и прописать путь к нему в yocto settings. Если этого не сделать, то как я и сказал, могут возникнуть некоторые ошибки или предупреждения при сборке, т.к. кэш в репозитории будет для самой свежей версии petalinux, что может не сходиться с установленной. А также, время сборки будет довольно долгим из-за того, что petalinux будет качать кэш из интернета (примерно 50 Гб) . Скачать кэш можно с официального сайта Xilinx. Нас интересует sstate cache именно для microblaze. Состоит он из двух папок: downloads и microblaze.
Сам Petalinux работает именно на базе yocto, как вы могли догадаться. Открыв Yocto Settings, деактивируем пункт Enable Network sstate feeds и активируем Enable BB NO NETWORK.
Теперь открываем Local sstate feeds settings → открываем local sstate feeds url. Прописываем путь к папке microblaze из распакованного архива с sstate cache.
Далее открываем Add pre-mirror url и пишем в нем путь к папке downloads из распакованного архива. Тут стоит отметить, что перед тем, как прописать путь, необходимо написать file://. То есть сам путь может выглядеть вот так (да, с тремя слэшами): file:///home/user/sstate-cache/downloads. Далее жмем Exit, чтобы выйти из конфигурационного меню. Выбираем Yes, когда при выходе нас спросят, хотим ли мы сохранить конфигурацию.
Теперь давайте настроим файловую систему нашего образа. В терминал вводим команду petalinux-config -c rootfs.
Открываем Filesystem Packages. Тут надо пройтись по всем пунктам и можно выключить все, кроме misc → packagegroup-core-boot → packagegroup-core boot, без этого пункта собрать образ не получится. А отключив все остальное мы существенно снизим размер образа, а также ускорим его включение. Под наши задачи такая настройка подойдет. Далее переходим в пункт Image Features и включаем пункт auto-login. Я включаю его для того, чтобы не вводить логин и пароль при каждой загрузке системы, а также, чтобы иметь root права доступа ко всему. Если вам нужно иметь несколько пользователей или вы не хотите, чтобы пользователь имел рут права, то не активируйте данный пункт. Можно выйти из настроек rootfs. Так же сохраняемся при выходе.
Далее настроим kernel. В терминал вводи petalinux-config -c kernel. В настройках кернела мы сделаем 3 вещи: отключим драйвера для PCI и I2C, а также включим сжатие образа, для того чтобы уменьшить размер прошивки.
Открываем General setup → Compiler optimization level и выбираем Optimize for size (-0s). Возвращаемся в главное меню и открываем Device Drivers. Тут отключаем PCI support. Теперь находим I2C support → I2C support, отключаем. После можно выйти из меню конфигурации и сохраниться.
Далее следует произвести настройки u-boot. Вот с этим пунктом возникли странности. По идее мы можем так же в терминале ввести petalinux-config -c u-boot, чтобы открылось то же как и в предыдущих случаях меню конфигурации и там спокойно настроить проект. Но!
Никакие из настроек, что я применял не сохранялись и менялись автоматически на дефолтные при выходе (естественно, я сохранялся). Отключить автоконфиг убута в первом конфигурационном меню тоже не принесло успеха, сборщик ломался и отказывался собирать проект. Помогло только прописывание настроек в файлах проекта вручную. В убуте нам также совсем немногое нужно изменить. Итак, в папке с проектом проходим по следующему пути: /project-spec/meta-user/recipes-bsp /u-boot/files. В папку files открываем bsp.cfg любым текстовым редактором (f4, если вы используете midnight commander). В этот файл добавляем следующие строки:
CONFIG_BOOT_SCRIPT_OFFSET=0x00FC0000
CONFIG_BOOTDELAY=1
CONFIG_FIT_FULL_CHECK=n
CONFIG_USE_PREBOOT=n
Первая строка говорит, по какому адресу будет во флэшке лежать скрип, запускающий кернела. Второй строкой мы уменьшаем ожидание автозапуска скрипта в убуте до одной секунды. Далее мы говорим не проверять целостность образа при загрузке из флэшки (немного сокращает время запуска, а так как мы все настроим и прошьем правильно, то мы точно знаем, что образ нормальный и его можно не проверять), а так же выключим пребут.
Теперь мы можем собрать наш образ для проверки его работоспособности перед формированием прошивки. В терминале даем команду petalinux-build. Ждем, когда закончится сборка.
После того, как сборка завершится, можем проверить нашу систему. Для этого соединяем плату с компьютером через mini usb (это наш uart) и micro usb (это jtag, через который прошивка будет загружаться в плату).
В первой части, я говорил, что для того, чтобы оно работало, необходимо установить драйвера. Драйвер называется Silicon Labs CP2103 USB to UART Bridge Controller. А также подключаем RJ45 с выходом в интернет в ethernet порт. Он должен быть подключен к роутеру, для того, чтобы наша система могла получить IP адрес по dhcp для выхода в интернет. На компьютере включаем Putty или Tera Term (я использую Tera Term). Baud rate необходимо выставить 115200.
Перед тем как включить плату, необходимо убедиться, что джамперы выставлены в правильном положении.
Теперь можно включить плату. В терминале компьютера вводим petalinux-boot –jtag –fpga –kernel.
В терминале компьютера мы можем видеть, какими файлами прошивается наша плата, а в терминале Tera Term мы можем наблюдать, как включается наша система. Со стадии u-boot. Тут мы видим, что эзернет порт работает в режиме SGMII.
В логе терминала мы можем увидеть, что наша SPI флэш, установленная на плате, определилась системой.
Также мы можем увидеть, что эзернет порт проинициализировался и получил IP адрес.
Чтобы убедиться в том, что у нас есть доступ в интернет, мы можем пингануть любой сайт на выбор, например Yandex)
Отлично! Мы собрали образ и убедились, что все нужные нам элементы системы в рабочем состоянии. Сейчас линукс существует только в оперативной памяти и прошивку мы загрузили тоже напрямую в DDR. Следовательно, как только мы выключим плату, прошивку придется снова грузить в память. Чтобы не делать это каждый раз, мы загрузим прошивку в SPI флэш, откуда прошивка будет считываться и запускаться в ram. Эта часть тоже не без нюансов.
Итак, сама прошивка будет состоять из 4ех файлов: download.bit (файл, содержащий битстрим, конфигурацию памяти платформы, а так же первичный загрузчик или first stage bootloader), u-boot-s.bin(убут), image.ub (образ линукса с файловой системой, а так же файл содержащий информацию про железо, на котором система включается), boot.scr (скрипи, запускающую ядро из убута). Последние три файла мы можем найти в папке проекта по следующему пути …/images/linux. Первый файл нам необходимо скомпилировать. Начнем с него.
Для подготовки прошивки нам нужно будет использовать команду petalinux-package. С помощью этой команды, петалинукс обращается к Vivado, чтобы компилировать необходимые фалы прошивки. Соответственно, нам необходимо настроить среду. Для этого открываем папку с вивадо и в терминале пишем source ./settings64.sh.
Теперь возвращаемся в папку с проектом и выполняем petalinux-package –boot –fsbl –fpga. В папке с проектом должен был появиться файл download.bit. Сейчас нам необходимо будет немного изменить настройки проекта, чтобы запуск с флешки работал корректно, а также, чтобы сформировать файл прошивки. Конкретно, нам нужно создать на флешке 4 раздела, в которые будут помещены файлы прошивки. Для этого надо знать размеры файлов. В моем случае download.bit имеет размер 4904034 байта, image.ub весит 7287564 байта, u-boot-s.bin весит 506512 байта, boot.scr весит 2763 байта. Указывать размеры разделов необходимо в шестнадцатеричном виде, поэтому сразу переведем эти числа. Сами разделы рекомендую делать немного больше, округлив в большую сторону, чтобы избежать ошибок.
Чтобы создать разделы, в терминале пишем petalinux-config. Далее в конфигурационном меню открываем Subsystem AUTO Hardware Settings à Flash Settings. После округления и перевода, я получил следующие значения.
Теперь необходимо сообщить скрипту адрес образа и его размер. Для этого из главного меню открываем u-boot Configuration → u-boot script configuration → QSPI/OSPI image offsets. Офсет образа можно получить путем сложения первых трех разделов, а размер указываем такой-же как и для раздела kernel. Так как образ, который мы используем, является fit image, то и значения вписываем в соответствующие поля.
Выходим, не забываем сохранить изменения, пересобираем проект с помощью petalinux-build. После завершения сборки следует ввести следующую команду petalinux-package –boot –fpga –u-boot –kernel –flash-size 16 –flash-intf SPIx4 –format MCS –force. По идее эта команда должна генерировать файл прошивки в .mcs формате, но по какой-то странной причине, где бы я не указывал офсет для boot.scr (в конфиге убута мы выставили 0x00FC0000, это небольшой отступ в конце флешки), он каждый раз сбрасывается на 0x1f00000. Если мы внимательно посмотрим лог в терминале, то увидим, что ошибка произошла во время выполнения tcl команды, находящейся в проекте по пути …/build/package-boot/write_cfgmem_hsm.tcl. Я пробовал изменить офсет в этом файле на нужный, но он обратно возвращается в дефолтное состояние. В проекте я находил файл с рецептом убута и менял офсет там, так же безрезультатно. Странный глюк, придется обходить…
Собственно, открываем файл tcl скрипта и копируем оттуда команду. Далее открываем Vivado. При открытии видим, что вивадо имеет tcl консоль. Вставляем туда команду. Там, где задается офсет скрипта, меняем на нужный, жмем enter…и о боги, мы получили файл прошивки, все выполнилось успешно. Ура!
Не выходя из программы, включаем плату, и нажимаем Open Hardware Manager.
В появившемся меню видим надпись - Open target в зеленой полоске, нажимаем и из выпадающего списка выбираем Auto Connect. После успешного соединения жмем правой кнопкой мыши на нашу плату и из выпадающего списка выбираем Add Configuration Memory Device…
В появившемся меню указываем нашу флешку, установленную на плате, жмем окей.
Далее программа спросит нас, хотим ли мы прошить флешку? Соглашаемся…
В появившемся меню указываем путь к файлу прошивки (в папке с проектом должен был появиться файл boot.mcs, это и есть наша прошивка). В Address Range указываем, что хотим прошить все запоминающее устройство, а также выставляем галочку около Blank Check. Нажимаем Apply, затем ОК. Дожидаемся окончания процесса прошивки. После успешного завершения проверяем нашу работу.
Сначала включим плату, затем выставим джамперы в положение запуска с SPI флэш. Остальные оставляем, как на предыдущем фото (Если забыл, то ищи подписанное "ФОТО 1" в статье).
Включаем Tera Term, включаем плату, наблюдаем за успешным результатом наших трудов!
Данные строки свидетельствуют о том, что запуск происходит с флешки и что загрузчик нашел образ в памяти, и успешно его прочитал. Дальнейшая загрузка выглядит также, как и когда мы грузились сразу в DDR.
Поздравляю! Теперь вы знаете, как создать платформу в Vivado, собрать образ линукса с помощью Petalinux Tools, проверить и создать свою прошивку и загрузить ее в энергонезависимую память. Надеюсь, эта статья была вам полезна. Всем Добра!
Первую часть статьи можно прочитать по ссылке - Установка OC Linux на плату Kintex 7 (KC705) от Xilinx с софт-процессором MicroBlaze часть 1 / Хабр (habr.com)