Памятка по сборке PetaLinux (2025.2) для Alinx AC7020C на базе Zynq 7020
Введение
Следуя нижеописанным шагам, вы получите полностью рабочую сборку PetaLinux 2025.2 для платы Alinx AC7020C на базе Zynq 7020 с настроенным SPI1, корректным часовым поясом, русской кодировкой, автовходом в систему и поддержкой SD-карты в качестве корневой файловой системы.
Встроенный Ethernet-контроллер Zynq 7020 (GEM0 / GEM1) автоматически настраивается драйвером macb при загрузке системы и получает IP-адрес динамически (по DHCP).
Проектирование и сборка встраиваемых операционных систем Linux на базе архитектур AMD Zynq-7000, Zynq UltraScale+ и Versal с помощью инструментария PetaLinux требует строгого соблюдения системных требований к операционной системе хоста.
AMD Technical Information Portal docs.amd.com
Для обеспечения максимальной стабильности, предсказуемости и лучшей совместимости компонентов Yocto Project компания AMD рекомендует использовать в качестве базовой ОС дистрибутив Ubuntu 22.04 LTS. Если основной рабочей станцией инженера является ПК под управлением Windows 10/11, вынужденной и при этом полностью оправданной мерой становится применение технологий виртуализации. В рамках подготовки данного материала были всесторонне протестированы следующие платформы:
- Oracle VirtualBox (полноценная виртуальная машина);
- Docker (изолированные Linux-контейнеры);
- WSL2 (подсистема Windows для Linux).
В каждой из перечисленных сред дистрибутив Ubuntu 22.04 показал стопроцентную стабильность, а финальная сборка образа Linux завершилась успешно.
Архитектура экосистемы PetaLinux и компилятора BitBake жестко контролирует права доступа: все действия по конфигурации и сборке проекта категорически запрещено выполнять под учетной записью root. Сборка в режиме суперпользователя будет мгновенно заблокирована системой.
Для работы в системе был создан стандартный бесправный пользователь с именем petalinux. Все проекты, исходные коды и файлы аппаратного описания (.xsa) изолированы и размещаются строго в его домашней директории по пути:
📂 /home/petalinux/petalinux_projects/
Шаг 1. Конфигурация локали системы (Locale)
Перед установкой пакетов необходимо решить скрытую, но критическую проблему, с которой сталкиваются пользователи виртуальных сред — некорректную настройку языковых стандартов. Если локаль системы повреждена или не настроена, утилиты конфигурации menuconfig и внутренние скрипты AMD будут аварийно завершать работу.
Выполните принудительную генерацию и фиксацию системной локали en_US.UTF-8:
sudo locale-gen en_US.UTF-8
sudo update-locale LANG=en_US.UTF-8
# Экспортируем переменные в текущую сессию терминала
export LANG=en_US.UTF-8
export LC_ALL=en_US.UTF-8
Чтобы проверить, что настройки применились, введите команду locale. В выводе терминала напротив каждого параметра должно быть жестко прописано "en_US.UTF-8".
Шаг 2. Установка системных зависимостей и библиотек.
Современный установщик PetaLinux 2025.2 требует наличия как актуальных инструментов компиляции, так и старых библиотек обратной совместимости, включая 32-битные пакеты архитектуры i386.
Обратите внимание, что в современных репозиториях пакет libsdl1.2-dev признан устаревшим, поэтому вместо него используется актуальный libsdl1.2-compat-dev.
Добавляем поддержку 32-битной архитектуры i386:
sudo dpkg --add-architecture i386
sudo apt update
Для работы графических и текстовых утилит AMD (таких как XSCT) критически важен пакет libtinfo5.
sudo apt install -y libtinfo5 libtinfo5:i386
Устанавливаем официальный массив пакетов для PetaLinux 2025.2:
sudo apt-get update && sudo apt-get install -y autoconf bc bison build-essential chrpath cpio debianutils diffstat flex g++ gawk gcc gcc-multilib git gzip iproute2 iputils-ping libegl1-mesa libelf-dev libglib2.0-dev libgstreamer1.0-0 libncurses5-dev libsdl2-dev libselinux1 libssl-dev libtool lsb-release make mc net-tools openssh-client pax pylint python3 python3-git python3-jinja2 python3-pexpect python3-pip python3-setuptools rsync screen socat tar texinfo tftpd unzip vim xinetd xterm xz-utils zlib1g:i386 zlib1g-dev:i386
sudo apt-get update && sudo apt-get install -y dnsutils
Дополнительные Python-пакеты (для корректной работы скриптов AMD):
pip3 install --user pyelftools
Шаг 3. Подготовка целевой директории установки
Инструментарий PetaLinux традиционно разворачивается в системный каталог /opt/. Однако, помня о главном правиле безопасности Yocto, сам инсталлятор ни в коем случае нельзя запускать через sudo.
Чтобы совместить требования иерархии файловой системы Linux и ограничения установщика, применяется классическая практика: директория создается с правами суперпользователя, но её владельцем назначается текущий бесправный пользователь petalinux.
Выполните подготовку путей следующими командами:
sudo mkdir -p /opt/petalinux/2025.2/
sudo chown -R petalinux:petalinux /opt/petalinux/
Шаг 4. Запуск инсталлятора PetaLinux 2025.2
Предполагается, что официальный тяжеловесный файл установщика petalinux-v2025.2-final-installer.run уже скачан с сайта AMD/Xilinx.
Важное примечание для пользователей виртуальных платформ и WSL2: Если вы используете общие папки хост-системы Windows (например, /mnt/c/...), обязательно скопируйте файл инсталлятора внутрь домашней директории Linux (в /home/petalinux/). Запуск установки напрямую из смонтированных дисков Windows может снизить скорость распаковки в десятки раз или привести к ошибкам прав доступа.
Перейдите в каталог с инсталлятором и запустите процесс:
chmod +x petalinux-v2025.2-final-installer.run
./petalinux-v2025.2-final-installer.run -d /opt/petalinux/2025.2/
В процессе распаковки инсталлятор временно перейдет в режим отображения лицензионных соглашений (End User License Agreement):
- Используйте клавишу Пробел (Space) для быстрого постраничного пролистывания текста соглашений, а не Enter, чтобы не листать документ построчно.
- Скрипт трижды остановится и потребует подтверждения. Каждый раз вводите символ y и нажимайте Enter, соглашаясь с условиями.
По завершении процесса утилиты будут полностью развернуты в целевую папку.
Шаг 5. Настройка рабочего окружения хоста
Чтобы сделать исполняемые файлы компиляторов и утилит PetaLinux видимыми для операционной системы, необходимо инициализировать переменные окружения. Для этого AMD предоставляет готовый скрипт settings.sh.
Разовый вызов для текущей сессии терминала выглядит так:
source /opt/petalinux/2025.2/settings.sh
Создание постоянного псевдонима (Alias) вместо автозапуска
Многие разработчики добавляют команду source напрямую в конец конфигурационного файла ~/.bashrc, чтобы среда активировалась автоматически при каждом открытии консоли. Для PetaLinux это плохая практика. Тулчейн AMD содержит собственную изолированную среду Python, которая при автоматическом импорте подменит системный Python дистрибутива Ubuntu. Профессиональным решением является создание изолированного псевдонима (alias). Запишите его в свой профиль:
echo "alias cdt='source /opt/petalinux/2025.2/settings.sh'" >> ~/.bashrc
Теперь, открыв терминал, когда вам потребуется начать работу с проектом AMD Zynq, достаточно ввести короткую команду: cdt
Шаг 6. Создание проекта, импорт аппаратной платформы и конфигурация SPI
Когда инструментарий полностью развёрнут, а рабочее окружение активировано, можно переходить к созданию базового образа операционной системы для платы Alinx AC7020C (чип Zynq-7000).
Выполните в терминале хоста последовательную цепочку команд под пользователем petalinux:
# 1. Переходим в изолированную папку проектов
cd /home/petalinux/petalinux_projects/
# 2. Создаем проект на базе универсального шаблона для чипов Zynq
petalinux-create project --template zynq --name ac7020c_alinx
# 3. Переходим в директорию созданного проекта
cd ac7020c_alinx
Критически важный шаг: Перед запуском инициализации проекта скопируйте сгенерированный в Vivado 2025.2 файл аппаратного описания system_wrapper.xsa напрямую в корень созданной директории /home/petalinux/petalinux_projects/ac7020c_alinx/.
После того как файл физически размещен в корне проекта, запустите команду импорта «железа», указав текущую папку в качестве источника:
petalinux-config --get-hw-description=.
Скрипт автоматически запустит парсинг аппаратных регистров файла .xsa и начнет фоновую сборку конфигуратора. Через некоторое время откроется текстовое графическое меню настроек (System Configuration).
На данном этапе для базового запуска платы Alinx достаточно сохранить настройки по умолчанию, выбрав на нижней панели пункт <Save> (нажмите Enter для подтверждения записи в файл .config), после чего полностью выйти из конфигуратора через пункт <Exit>.
По умолчанию PetaLinux настраивает проект так, что корень файловой системы (RootFS) при старте платы будет разворачиваться и полностью размещаться в оперативной памяти (режим INITRAMFS). Это удобно для быстрых тестов, но любые изменения внутри ОС (установка пакетов, сохранение файлов) будут бесследно исчезать после перезагрузки платы Alinx.
Переключение корневой файловой системы на SD-карту
Если вам необходимо разместить полноценную корневую систему на втором разделе (EXT4) вашей SD-карты, выполните переключение прямо в открывшемся меню:
Перейдите в раздел Image Packaging Configuration.
- Найдите пункт Root filesystem type и зайдите в него (нажмите Enter).
- Измените значение с дефолтного INITRAMFS на EXT4 (SD/eMMC/SATA/USB) и подтвердите выбор.
- Выйдите обратно в главное меню.
- Зайдите в раздел Subsystem AUTO Hardware Settings → Advanced bootable images storage settings → boot image settings.
- Убедитесь, что в пункте image storage media выставлено значение primary sd (это укажет загрузчику U-Boot искать ядро и RootFS на карте).
На нижней панели выберите пункт <Save> (нажмите Enter для подтверждения записи конфигурации в файл по умолчанию .config), после чего полностью выйдите из конфигуратора через пункт <Exit>.
Автоматический вход в систему (без пароля)
Чтобы консоль последовательного порта (UART/COM-порт) платы Alinx загружалась сразу в командную строку root@ac7020calinx:~# без требования ввода логина и пароля, включите функцию serial-autologin-root в конфигураторе файловой системы — она автоматически включает empty-root-password (пустой пароль root).
Начиная с PetaLinux 2025.x вход root по умолчанию запрещён, а штатный пользователь — petalinux с паролем, задаваемым при первом входе. Устаревшие опции debug-tweaks и sysvinit-inittab-autologin из старых версий в актуальной документации (UG1144 2025.x) не используются.
Запустите конфигуратор файловой системы:
petalinux-config -c rootfs
В открывшемся текстовом графическом меню настроек выполните следующие шаги:
1. Выбор системы инициализации Init Manager:
- Перейдите в раздел Image Features (нажмите Enter) — здесь находится настройка Init Manager.
- Найдите пункт Init Manager (или Init system).
- Выберите значение systemd. Для Zynq-7000 по умолчанию используется sysvinit, поэтому переключение нужно выполнить явно.
2. Автоматический вход в систему:
- Оставаясь в разделе Image Features, найдите пункт serial-autologin-root.
- Установите на нём звездочку [*] (нажмите Пробел). При этом автоматически включится empty-root-password.
Настройка синхронизации времени (NTP) и временной зоны (Москва)
По умолчанию утилиты работы со временем и текстовые редакторы скрыты из графического конфигуратора PetaLinux. Чтобы они появились в меню, их необходимо принудительно зарегистрировать в файле пользовательских пакетов проекта.
Откройте конфигурационный файл в терминале:
nano project-spec/meta-user/conf/user-rootfsconfig
Допишите в конец файла имена необходимых пакетов времени и системного редактора nano строго в следующем виде (по одному пакету на строку):
CONFIG_ntp
CONFIG_ntp-tickadj
CONFIG_nano
(Сохраните изменения: Ctrl + O → Enter → Ctrl + X).
Теперь, когда пакеты успешно зарегистрированы, запустите конфигуратор файловой системы:
petalinux-config -c rootfs
В открывшемся синем меню перейдите в самый нижний раздел: User Packages (он создается специально для пакетов, прописанных в user-rootfsconfig).
Внутри этого раздела по очереди отметьте все появившиеся пункты звездочками, нажимая клавишу Пробел:
- [*] nano
- [*] ntp
- [*] ntp-tickadj
Чтобы Yocto при сборке сам назначил московское время по умолчанию, не выходя из графического меню, выполните следующее:
- Вернитесь в главное меню RootFS и перейдите по честному пути: Filesystem Packages → base → tzdata. (После активации в User Packages этот раздел станет доступен).
- Найдите там строку tzdata-core-timezone (в некоторых версиях DEFAULT_TIMEZONE).
- Нажмите Enter и в открывшемся текстовом окне вручную введите точный путь к часовому поясу:
Чтобы сборщик Yocto при компиляции дистрибутива гарантированно применил московский часовой пояс и сам создал все необходимые системные ссылки, зафиксируйте переменную часового пояса в глобальных настройках сборки «железа».
Откройте конфигурационный файл BSP вашего проекта:
nano project-spec/meta-user/conf/petalinuxbsp.conf
Добавьте в самый конец файла следующую строку, принудительно переопределяющую системную зону:
DEFAULT_TIMEZONE:forcevariable = "Europe/Moscow"
Конфигурация подсистемы SPI1 (MIO 10-13)
В рассматриваемой конфигурации платы Alinx задействован жесткий процессорный интерфейс SPI1, выведенный на разъём расширения через выводы MIO 10-13 (без использования логики EMIO/FPGA). Любые попытки ручной перестройки блоков pinctrl0 или внедрения программного GPIO-управления (cs-gpios) в версии PetaLinux 2025.2 являются полностью неработоспособными. Они вызывают внутренний конфликт ядра Device or resource busy, из-за чего файл устройства /dev/spidev вообще пропадает из системы, а линия CS0 намертво зависает в высоком состоянии (+3.3V).
Для реализации стабильного, чистого аппаратного режима, когда встроенный контроллер Cadence SPI процессора Zynq сам управляет пином CS0 (MIO13) на уровне ядра, откройте файл пользовательского дерева устройств:
nano project-spec/meta-user/recipes-bsp/device-tree/files/system-user.dtsi
Полностью замените его содержимое на следующий лаконичный и гарантированно рабочий вариант:
Конфигурация драйверов в ядре Linux (Kernel)
Чтобы операционная система смогла распознать контроллер и создать файл символьного устройства в каталоге /dev/, необходимые драйверы должны быть жестко вкомпилированы в ядро Linux.
Запустите графический конфигуратор ядра:
petalinux-config -c kernel
В открывшемся текстовом меню перейдите по следующему пути:
Device Drivers → SPI support
Убедитесь, что нужные пункты отмечены звездочками [*] (режим <M> в виде внешнего модуля не использовать):
- [*] SPI support
- [*] Cadence SPI controller (драйвер PS-SPI — SPI0/SPI1 на Zynq/ZynqMP, в том числе вашей шины SPI1 на MIO)
- [*] Xilinx Zynq QSPI controller (драйвер QSPI Flash памяти платы)
- [*] User mode SPI device driver support (необходим для работы /dev/spidev1.0 из Си-кода)
Отдельной опции «Xilinx Zynq SPI controller» в ядре нет — PS-SPI обслуживает Cadence SPI controller. Пункт Xilinx SPI controller common module относится к AXI SPI из PL и для SPI1 не требуется.
Сохраните изменения (<Save>), подтвердив запись в файл .config, и полностью выйдите из меню (<Exit>).
Настройка поддержки кириллицы (UTF-8) в консоли PetaLinux
По умолчанию в минимальных сборках PetaLinux библиотека readline экранирует любые 8-битные символы, превращая русские буквы в восьмеричные коды (например, :\266\321\210). При попытке принудительно задать переменные среды возникает ошибка -sh: warning: setlocale: LC_ALL: cannot change locale (ru_RU.UTF-8), так как файлы локализации отсутствуют в базовом образе.
Решение состоит в интеграции генерации локалей на этапе сборки дистрибутива, принудительном включении пакетов локализации и временных зон в состав корневой файловой системы (rootfs), создании конфигурационного файла /etc/inputrc и правильном конфигурировании демона NTP.
- Откройте главный конфигурационный файл проекта:
nano project-spec/meta-user/conf/petalinuxbsp.conf
- Добавьте в самый конец файла следующие строки :
# Фиксация дефолтной временной зоны для сборщика и платы
DEFAULT_TIMEZONE:forcevariable = "Europe/Moscow"
# Включение генерации русской и английской локалей UTF-8
ENABLE_BINARY_LOCALE_GENERATION = "1"
GLIBC_GENERATE_LOCALES = "en_US.UTF-8 ru_RU.UTF-8"
IMAGE_LINGUAS = "en-us ru-ru"
LOCALE_UTF8_IS_DEFAULT = "1"
# Запрет на вырезание языковой поддержки из минимального образа
IMAGE_FEATURES:append = " package-management"
# Точные имена пакетов локалей для копирования в файловую систему платы
IMAGE_INSTALL:append = " glibc-utils localedef locale-base-en-us locale-base-ru-ru glibc-gconv-ibm850"
# Отключение QA-предупреждений (если требуется)
ERROR_QA:remove = "build-deps"
Сохраните и закройте файл (Ctrl+O, Enter, Ctrl+X).
Важно: контролируйте наличие пробела в начале строк после знака += или :append = " "
- Создайте необходимую структуру каталогов (если не создана) и откройте файл-дополнение к вашему минимальному образу:
mkdir -p project-spec/meta-user/recipes-core/base-files/
- Откройте файл на редактирование
nano project-spec/meta-user/recipes-core/base-files/base-files_%.bbappend
- Вставьте в него строку, которая принудительно упакует скомпилированные языковые пакеты в итоговую прошивку платы:
do_install:append() {
# 1. Устраняем конфликт пакетов (удаляем дубликат файла inputrc)
rm -f ${D}${sysconfdir}/inputrc
# 2. Настраиваем автоматическое включение русской локали в консоли платы
echo "export LANG=ru_RU.UTF-8" >> ${D}${sysconfdir}/profile
echo "export LANGUAGE=ru_RU.UTF-8" >> ${D}${sysconfdir}/profile
echo "export LC_ALL=ru_RU.UTF-8" >> ${D}${sysconfdir}/profile
}
Чтобы избежать конфликтов файловой системы при сборке do_rootfs из-за файла ntp.conf, добавление серверов времени выполняется строго через расширение родного рецепта ntp.
- Создайте каталог и файл дополнения рецепта NTP:
mkdir -p project-spec/meta-user/recipes-support/ntp/
nano project-spec/meta-user/recipes-support/ntp/ntp_%.bbappend
- Вставьте код для добавления пула серверов с опцией быстрого старта синхронизации (iburst):
do_install:append() {
echo "server pool.ntp.org iburst" >> ${D}${sysconfdir}/ntp.conf
}
Если осуществлялась пересборка Petalinux для включения в него поддержки русских букв, выполните команды.
petalinux-build -c base-files -x cleansstate
petalinux-build -c petalinux-image-minimal -x cleansstate
petalinux-build
Результат проверки на плате AC7020C
После прошивки и загрузки Linux, при вводе команды locale система выдает чистый и полностью локализованный список переменных:
root@ac7020c:~# locale
LANG=ru_RU.UTF-8
LC_CTYPE="ru_RU.UTF-8"
...
LC_ALL=ru_RU.UTF-8
Предупреждения смены локалей исчезают, а ввод и отображение русских букв (включая имена папок при выводе команды ls) работают в штатном режиме.
Шаг 7. Финальная пересборка проекта и подготовка загрузочного носителя
После того как дерево устройств отредактировано, а конфигурации RootFS и Ядра успешно сохранены, необходимо запустить компиляцию всей операционной системы.
Чтобы стереть старые ошибочные кэши компилятора Yocto и принудительно зафиксировать рабочую конфигурацию, выполните последовательную очистку и пересборку дерева устройств:
# 1. Очищаем кэш и принудительно собираем обновленное дерево устройств
petalinux-build -c device-tree -x clean
petalinux-build -c device-tree
# 2. Запускаем глобальную сборку всего дистрибутива Linux
petalinux-build
# 3. Упаковываем загрузочные компоненты в монолитный файл BOOT.BIN
petalinux-package --boot --fsbl --fpga --u-boot --force
Все готовые бинарные файлы появятся в каталоге проекта по пути images/linux/.
Подготовка и запись SD-карты
Для работы в данной конфигурации используемая SD-карта объемом 32 ГБ должна быть предварительно разбита на два независимых раздела:
- Первый загрузочный раздел: размер ровно 2 ГБ, метка BOOT, файловая система FAT32. На него копируются файлы первичной загрузки. Варианты содержимого загрузочного раздела: Вариант А (монолитный FIT-образ): BOOT.BIN, boot.scr, image.ub Вариант Б (классический раздельный образ): BOOT.BIN, boot.scr, uImage, system.dtb
- Второй системный раздел: занимает всё оставшееся свободное пространство (~30 ГБ), метка rootfs, файловая система EXT4.
Для записи файловой системы смонтируйте второй раздел карты в WSL и распакуйте в EXT4 раздел флешки архив rootfs.tar.gz:
sudo tar -xf rootfs.tar.gz -C /mnt/sd_rootfs/
Принудительно сбрасываем кэш записи из оперативной памяти на физический накопитель:
sync
Полная последовательность после изменения DT:
# 1. Очистить кэш device tree
petalinux-build -c device-tree -x cleanall
# 2. Пересобрать device tree
petalinux-build -c device-tree
# 3. Полная пересборка проекта
petalinux-build
# 4. Упаковка boot образа
petalinux-package --boot --fsbl --fpga --u-boot
Подключение SD-карты (кардридера) к WSL2 через usbipd-win
Если вы используете WSL2 на Windows и хотите напрямую записать загрузочные файлы на SD-карту (разделы FAT32 и EXT4) , необходимо пробросить USB-устройство (кардридер) внутрь WSL. Для этого используется утилита usbipd-win, которая обязательно устанавливается из Microsoft Store.
1. Определение busid кардридера
Подключите SD-карту к кардридеру, а кардридер — к USB-порту Windows. В PowerShell (администратор) выполните:
usbipd list
Найдите своё устройство. Обычно оно выглядит как USB Mass Storage Device или по vendor ID: 14cd:1212 (как в вашем примере). Запомните BUSID (например, 5-1).
2. Привязка (bind) устройства
usbipd bind --busid 5-1
Если устройство уже было в общем доступе, вы увидите сообщение was already shared — это нормально.
3. Подключение (attach) устройства к WSL
usbipd attach --wsl --hardware-id 14cd:1212
Замените 14cd:1212 на vendor-id вашего устройства (можно подсмотреть в usbipd list). После этого устройство станет доступно внутри WSL2 как /dev/sdX (обычно /dev/sdb или /dev/sdc).
4. Проверка внутри WSL
Откройте терминал WSL (Ubuntu) и выполните:
lsblk
Вы должны увидеть новое блочное устройство (например, sdb) с разделами sdb1, sdb2 и т.д. Теперь с ним можно работать стандартными средствами Linux (fdisk, mkfs, dd, tar).
5. Отключение (detach) устройства после работы
Когда закончите работу с SD-картой, в PowerShell (администратор) выполните:
usbipd detach --busid 5-1
После этого кардридер можно безопасно извлечь из USB-порта и вставлять в слот платы Alinx AC7020C и включать питание.
Операционная система Linux загрузится в терминале COM-порта и сразу предоставит доступ к консоли root@ac7020calinx:~# без ввода пароля, в каталоге появится рабочее устройство /dev/spidev1.0, а линия CS начнет синхронно опускаться в ноль при отправке данных из Си-кода.
Создаём новый проект через petalinux-create
# 1. Создаём приложение (не spidev-test, а spidev)
petalinux-create apps --template c --name spidev --enable
# 2. Скачиваем исходник
wget -O project-spec/meta-user/recipes-apps/spidev/files/spidev.c \
https://raw.githubusercontent.com/torvalds/linux/master/tools/spi/spidev_test.c
# 3. Собираем
petalinux-build -c spidev
# 4. Включаем приложение в финальный образ RootFS
petalinux-build
Проверяем результат
# Бинарник появился внутри rootfs.tar.gz
tar -tzf images/linux/rootfs.tar.gz | grep spidev
Ожидаемый вывод:
./usr/bin/spidev
./usr/bin/spidev_fdx
./usr/bin/spidev_test
Для просмотра на осциллографе:
while true; do spidev -D /dev/spidev1.0 -s 1000000 -v -p "\xAA\x55" -I 1; sleep 0.1; done
Проверка loopback командой
# Однократная проверка
spidev -D /dev/spidev1.0 -s 1000000 -v -l -I 1
# Бесконечная для осциллографа
while true; do spidev -D /dev/spidev1.0 -s 1000000 -v -l -I 1; done
Ожидаемый вывод
При замкнутых MOSI-MISO данные должны возвращаться без изменений:
TX | AA 55 01 02
RX | AA 55 01 02 ← те же байты
Создание AXI-Lite IP блока для ALINX AC7020C
Enzian | How to make a fully-fledged Local Memory Bus (LMB) IP in Vivado enzian.systems
Часть 1: Создание IP блока в Vivado
1.1 Создание нового IP
Tools → Create and Package IP → Next → Create a new AXI4 peripheral → Next → Name: axilite_ac7020c → Interface Type: Lite → Interface Mode: Slave → Data Width: 32 → Number of Registers: 4 → Finish
1.2 Модификация файлов IP
Файл 1: axilite_ac7020c_slave_lite_v1_0_S00_AXI.vhd
Что добавить в entity:
port (
-- ПОЛЬЗОВАТЕЛЬСКИЕ ПОРТЫ
o_write_port0 : out std_logic_vector(31 downto 0);
o_write_port1 : out std_logic_vector(31 downto 0);
o_led : out std_logic;
i_read_port0 : in std_logic_vector(31 downto 0);
i_read_port1 : in std_logic_vector(31 downto 0);
-- AXI порты (оставить как есть)
...
);
Что добавить после begin:
-- Подключение портов
o_write_port0 <= slv_reg0;
o_write_port1 <= slv_reg1;
o_led <= slv_reg1(0); -- младший бит на LED
-- Захват входов из PL
process(S_AXI_ACLK)
begin
if rising_edge(S_AXI_ACLK) then
slv_reg2 <= i_read_port0;
slv_reg3 <= i_read_port1;
end if;
end process;
Что изменить в процессе сброса:
if S_AXI_ARESETN = '0' then
slv_reg0 <= (others => '0');
slv_reg1 <= (others => '0');
-- slv_reg2 и slv_reg3 НЕ СБРАСЫВАТЬ
Что изменить в процессе записи:
when b"10" => null; -- 0x08 - только чтение
when b"11" => null; -- 0x0C - только чтение
Файл 2: axilite_ac7020c.vhd
Добавить пользовательские порты в entity, component и port map (те же 5 портов).
o_write_port0 : out std_logic_vector(31 downto 0);
o_write_port1 : out std_logic_vector(31 downto 0);
o_led : out std_logic;
i_read_port0 : in std_logic_vector(31 downto 0);
i_read_port1 : in std_logic_vector(31 downto 0);
o_write_port1 : out std_logic_vector(31 downto 0);
o_led : out std_logic;
i_read_port0 : in std_logic_vector(31 downto 0);
i_read_port1 : in std_logic_vector(31 downto 0);
1.3 Обновление IP
Tools → Refresh IP Catalog
Фиксация драйвера в ядре (bsp.cfg)
Чтобы избежать сброса параметров графического меню menuconfig при пересборках, жестко вшиваем UIO-драйвер в ядро.
- Перейдите в папку рецепта ядра из корня вашего проекта:
cd project-spec/meta-user/recipes-kernel/linux/linux-xlnx/
- Откройте или создайте файл bsp.cfg
nano bsp.cfg
- Добавьте в конец файла следующие строки (старые автосгенерированные файлы user_*.cfg в этой папке не трогаем и не удаляем):
CONFIG_UIO=y
CONFIG_UIO_PDRV_GENIRQ=y
CONFIG_UIO_DMEM_GENIRQ=y
Сохраните и закройте файл (Ctrl+O, Enter, Ctrl+X).
Вернитесь в корень проекта: cd ~/petalinux_projects/ac7020c
Описание в дереве устройств (system-user.dtsi)
Связываем физический адрес вашего IP-блока с универсальным идентификатором UIO.
- Откройте пользовательский файл DTS
nano project-spec/meta-user/recipes-bsp/device-tree/files/system-user.dtsi
- Добавьте или приведите узел вашего контроллера к следующему виду:
&timing_controller_0 {
compatible = "generic-uio", "uio";
status = "okay";
};
Сохраните и закройте файл (Ctrl+O, Enter, Ctrl+X).
Создание пакета автоматической привязки (UDEV + Скрипт)
Так как у IP-блока нет аппаратного прерывания, драйвер uio_pdrv_genirq проигнорирует его при старте. Создаем udev-правило и асинхронный скрипт, которые принудительно свяжут железо и драйвер «на лету».
- Создайте шаблон нового приложения в корне проекта:
petalinux-create apps --name uio-udev-rule --template install --force
- Откройте файл правила UDEV:
nano project-spec/meta-user/recipes-apps/uio-udev-rule/files/uio-udev-rule
- Полностью сотрите дефолтный текст шаблона и вставьте строго одну строку:
ACTION=="add", SUBSYSTEM=="platform", KERNEL=="43c00000.timing_controller", RUN+="/usr/bin/uio-bind-helper.sh"
(Сохраните и закройте: Ctrl+O, Enter, Ctrl+X).
- Создайте и откройте файл скрипта-помощника:
nano project-spec/meta-user/recipes-apps/uio-udev-rule/files/uio-bind-helper.sh
- Вставьте в него код (обязательно с круглыми скобками и знаком & для асинхронной работы в фоне):
#!/bin/sh
(
echo "uio_pdrv_genirq" > /sys/bus/platform/devices/43c00000.timing_controller/driver_override
echo "43c00000.timing_controller" > /sys/bus/platform/drivers/uio_pdrv_genirq/bind
) &
(Сохраните и закройте: Ctrl+O, Enter, Ctrl+X).
- Откройте рецепт BitBake (.bb), управляющий установкой файлов пакета:
nano project-spec/meta-user/recipes-apps/uio-udev-rule/uio-udev-rule.bb
- Полностью сотрите старый текст шаблона и замените его на этот рабочий вариант:
SUMMARY = "Custom UDEV rule for automatic UIO binding"
SECTION = "PETALINUX/apps"
LICENSE = "MIT"
LIC_FILES_CHKSUM = "file://${COMMON_LICENSE_DIR}/MIT;md5=0835ade698e0bcf8506ecda2f7b4f302"
SRC_URI = " \
file://uio-udev-rule \
file://uio-bind-helper.sh \
"
S = "${WORKDIR}"
do_install() {
# Создаем необходимые папки в будущем образе платы
install -d ${D}${sysconfdir}/udev/rules.d
install -d ${D}${bindir}
# Устанавливаем текстовое правило udev (права 0644 - чтение)
install -m 0644 ${S}/uio-udev-rule ${D}${sysconfdir}/udev/rules.d/99-uio-bind.rules
# Устанавливаем исполняемый скрипт в /usr/bin/ (права 0755 - запуск!)
install -m 0755 ${S}/uio-bind-helper.sh ${D}${bindir}/uio-bind-helper.sh
}
FILES:${PN} = " \
${sysconfdir}/udev/rules.d/99-uio-bind.rules \
${bindir}/uio-bind-helper.sh \
"
(Сохраните и закройте: Ctrl+O, Enter, Ctrl+X).
Активация пакета и запуск компиляции
- Откройте конфигуратор файловой системы вашего проекта:
petalinux-config -c rootfs
Найдите строку uio-udev-rule и нажмите Пробел, чтобы слева от имени появилась звездочка: [*] uio-udev-rule.
- Запустите стандартную сборку всего проекта: petalinux-build
Проверка на плате Alinx AC7020C
ls -l /dev/uio*
В терминале должна отобразиться строка: /dev/uio0.
Как делать правильно и быстро (Лайфхак)
Вместо долгого полного petalinux-build (который может проверять все пакеты системы), используйте ускоренную команду сборки только файловой системы:
# 1. Собираем приложение spidev
petalinux-build -c spidev
# 2. Быстро обновляем rootfs (займет всего 1-2 минуты вместо полной сборки)
petalinux-build -c rootfs
# 3. Собираем финальный image.ub
petalinux-build -x package
Используйте код с осторожностью.
3. Финальный шаг (Обязательно)
После того как вы обновили образ, вам в любом случае нужно пересобрать загрузочный файл BOOT.BIN, чтобы внутри него обновились все привязки:
petalinux-package --boot --fsbl images/linux/zynq_fsbl.elf --fpga images/linux/system.bit --u-boot --force
Используйте код с осторожностью.
Полная инструкция по добавлению скрипта в Petalinux
📌 1. Создать структуру рецепта
# Перейти в проект Petalinux
cd ~/petalinux_projects/ac7020c
# Создать директории для рецепта
mkdir -p project-spec/meta-user/recipes-apps/reg-gen/files
📌 2. Скопировать скрипт
# Скопировать скрипт в директорию files
cp /path/to/reg_gen.sh project-spec/meta-user/recipes-apps/reg-gen/files/
📌 3. Создать рецепт reg-gen.bb
nano project-spec/meta-user/recipes-apps/reg-gen/reg-gen.bb
Вставить содержимое:
SUMMARY = "Register generator script for timing_controller"
LICENSE = "CLOSED"
SRC_URI = "file://reg_gen.sh"
RDEPENDS:${PN} += "bash"
do_install() {
install -d ${D}/usr/bin
install -m 0755 ${WORKDIR}/reg_gen.sh ${D}/usr/bin/reg_gen.sh
}
FILES:${PN} = "/usr/bin/reg_gen.sh"
📌 4. Добавить в образ
- Минимальный образ (petalinux-image-minimal):
nano project-spec/meta-user/recipes-core/images/petalinux-image-minimal.bbappend
- Добавить содержимое:
IMAGE_INSTALL:append = " reg-gen"
Сохранить: Ctrl+O, Enter, Ctrl+X
📌 5. Проверить структуру
ls -la project-spec/meta-user/recipes-apps/reg-gen/
ls -la project-spec/meta-user/recipes-apps/reg-gen/files
📌 6. Пересобрать
petalinux-build -c reg-gen -x do_install
petalinux-build -c reg-gen
petalinux-build -c rootfs
petalinux-build
📌 7. Проверить наличие скрипта в rootfs.tar.gz
tar -tzf images/linux/rootfs.tar.gz | grep reg_gen
Ожидаемый результат:
./usr/bin/reg_gen.sh