16.05.2018 PetaLinux
Содержание |
Требования
Vivado 2018.1 (для single-gigabit ethernet можно более ранние версии)
Начиная с petalinux_2018.1 отсутствует devcfg. Необходимо использовать FPGA manager. Технология нами пока не освоена
Необходима Ubuntu-16.04
Требуется поставить ряд пакетов, полный список приведен в документе UG1144
Устанавливаем PetaLinux в систему. Дистрибутив есть на Xilinx, либо у меня на компьютере. Ставить PetaLinux необходимо БЕЗ прав суперюзера!
кидаем в /components/yocto/ sstate-rel-v2017.4.tar.gz
Подготовка завершена
Правка Vivado
Для поддержки MDIO в Vivado 17.1-17.4 нужен патч. Ставим!
Не помогло. Ставим 2018.1
Сборка
Пошаговое руководство по сборке содержится в документе UG1156
В консоли пишем source/[путь к петалинух]/settings.sh
Выполняем шаги из UG1156 по главе 5:
- экспортируем из Vivado .hdf (в блок дизайн File->Export->Export Hardware)
- создаем проект PetaLinux
- переходим в папку с текущим проектом
- подключаем файл .hdf
- перед сборкой системы необходимо выполнить все команды конфигурации в данной последовательности:
$ petalinux-config -c kernel
$ petalinux-config -c rootfs
petalinux-config
Если хотим спользовать внешний файл device-tree включаем:
Advances bootable images storage settings->
dtb image settings->
image storage media
primary sd
Необходимо править netboot offset если оперативной памяти менее ~256МБ
Для клоникуса с 256МБ ставим 8'000'000
netboot offset
Выставляем точку начала распаковки образа системы
Выключаем копирование образа по sftp и отключаем интернет-sstate
petalinux-config -c kernel
- Подключаем в ядре поддержку физика и его дров.
для oryx:
[*]Network device support ->
[*]Ethernet driver support ->
[*] Micrel devices
[*] PHY Device support and infastructure -->
[*] Drivers for Micrel PHYs
для clonicus:
[*]Network device support ->
[*] PHY Device support and infastructure -->
[*] Texas Instruments DP83867 Gigabit PHY
petalinux-config -c rootfs
Подключаем при необходимости ethtool, gdbserver(просто gdb не заработал), libstdc, libgcc, glib2.0, glibc(glibc & ltd)
misc ->
gcc-runtime ->
[*] libstdc ++
gdb -->
[*] gdb
glib-2.0
[*] glib-2.0
glibc
[*] glibc
[*] ldd
devel ->
python ->
python ->
[*] python
Опционально:
base ->
i2c-tools ->
[*] i2c-tools
console ->
network ->
ethtool ->
[*] ethtool // необходимо для oryx! для перенастройки autonegotiation
Можно еще подключать дебаг i2c
Необходимо убедиться, что образ может распаковаться в размер оперативы
Если будут проблемы, то надо будет править netboot offset
device tree
Если необходимо внести изменения в device tree, то смотрим конец статьи
Интересная статья по правке devicetree из uboot
Сборка проекта
- далее (сборка идет 30-60 минут)
- делаем boot.bin
$ petalinux-package --boot --format BIN --fsbl ./zynq_fsbl.elf --fpga name.bit --u-boot --force
$ petalinux-package --boot --format BIN --fsbl ./zynq_fsbl.elf --fpga name.bit --u-boot --kernel --force
- записываем в загрузочную область флешки файлы boot.bin и image.ub
Всякое
Если мало памяти как у нас - возможна ошибка image is not a fdt ссылка
Необходимо править netboot offset
netboot offset
Можно вручную загрузиться из u-boot'а.
$ bootm 0xA000000
либо
$ fatload mmc 0 0x9000000 system.dtb
$ bootm 0xA000000 0xA000000 0x9000000
Можно поварьировать адрес
Проверка статуса прошитости FPGA
Uboot
Для внесения правок в загрузку линукса используем список команд env
Просмотр текущих команд printenv
Сброс настроек в дефолт env default -a
Создать переменную env set <имя> <значение>
Правка переменной env edit <имя переменной>
---
Для каждой платы делаем следующее:
- Берем Файл:Uboot.env.c
- Удаляем в конце имени ".c"
- Записываем на флешку рядом с образом линукса
- Запускаем плату и прерываем autoboot
- Пишем editenv ethaddr
- Редактируем MAC-адрес
- Пишем saveenv
- Все! можем ребутать reset
Сохранить в файл saveenv
Автозапуск приложений
Во-первых тыц
Далее пишем
Правим файл /project-spec/meta-user/recipes-apps/myapp-init/myapp-init.bb
# This file is the myapp-init recipe.
#
SUMMARY = "Simple myapp-init application"
SECTION = "PETALINUX/apps"
LICENSE = "MIT"
LIC_FILES_CHKSUM = "file://${COMMON_LICENSE_DIR}/MIT;md5=0835ade698e0bcf8506ecda2f7b4f302"
SRC_URI = "file://myapp-init"
S = "${WORKDIR}"
FILESEXTRAPATHS_prepend := "${THISDIR}/files:"
inherit update-rc.d
INITSCRIPT_NAME = "myapp-init"
INITSCRIPT_PARAMS = "start 99 S ."
do_install() {
install -d ${D}${sysconfdir}/init.d
install -m 0755 ${S}/myapp-init ${D}${sysconfdir}/init.d/myapp-init
}
FILES_${PN} += "${sysconfdir}/*"
Правим сам исполняемый скрипт project-spec/meta-user/recipes-apps/myapp-init/files/myapp-init
echo "Autorun script"
echo "Try run custom_init"
sh /run/media/mmcblk0p1/custom_init.sh
Записываем на флешку скрипт custom_init.sh с нужными командами и делаем его исполняемым
Записываем файл interfaces
Скачать архив: Файл:Init interfaces.rar
SSH
Как победить сохранение ssh-ключей:
Добавляем в init_script следующие строки:
ln -s /run/media/mmcblk0p2/.ssh/ /home/root/
mkdir /run/media/mmcblk0p2/dropbear/
chmod 400 /run/media/mmcblk0p2/dropbear/
rm -r /etc/dropbear/
ln -s /run/media/mmcblk0p2/dropbear/ /etc/
- Создается ссылка на флешку, где хранятся авторизованные пользователи
- Создается папка для хранения секретного ключа платы
- При запуске платы свежесозданный ключ заменяется тем, что лежит на флешке
- При первом включении платы будет создан новый ключ
Помимо добавления указанных команд в скрипт ничего больше делать не надо
Daemon
Для настройки демона:
- Добавляем строки в файл custom_init.sh
- Кидаем на загрузочный раздел флешки папку из архива File:daemon.rar
cp /run/media/mmcblk0p1/daemon/receiver.conf /etc/
cp /run/media/mmcblk0p1/daemon/receiver /etc/init.d/
device tree
Для внесения изменений в device tree добавляем нужные строки в файл
project-spec/meta-user/recipes-bsp/device-tree/files/system-user.dtsi
Для разборки device-tree ссылка
Для сборки device-tree
Модификация device-tree
После долгих мучений получилось поднять DP83867 только после добавления модификатора в файл волшебная статья
project-spec/meta-user/recipes-bsp/device-tree/files/system-user.dtsi
Single Kit-board eth
В Vivado включен eth1(с mdio) и выключен eth0.
Так работает
status = "okay";
phy-handle = <&phy0>;
phy-mode = "rgmii-id";
xlnx,eth-mode = <0x1>;
mdio {
status = "okay";
#address-cells = <1>;
#size-cells = <0>;
phy0: phy@12 {
compatible = "ethernet-phy-ieee802.3-c22";
device_type = "ethernet-phy";
reg = <12>;
ti,rx-internal-delay = <0x7>;
ti,tx-internal-delay = <0x7>;
ti,fifo-depth = <0x01>;
ti,min-output-impedance;
ti,dp83867-rxctrl-strap-quirk;
status = "okay";
};
};
};
Single On-board eth
В Vivado включен eth0(с mdio) и выключен eth1.
Работает гигабит через type-c! Работает hot plug. Успех.
status = "okay";
phy-handle = <&phy0>;
phy-mode = "rgmii-id";
xlnx,eth-mode = <0x1>;
mdio {
status = "okay";
#address-cells = <1>;
#size-cells = <0>;
phy0: phy@0 {
compatible = "ethernet-phy-ieee802.3-c22";
device_type = "ethernet-phy";
reg = <0>;
ti,rx-internal-delay = <0x7>;
ti,tx-internal-delay = <0x7>;
ti,fifo-depth = <0x01>;
ti,min-output-impedance;
ti,dp83867-rxctrl-strap-quirk;
status = "okay";
};
};
};
Dual eth
Попытка поднять два физика. Пока не работает
local-mac-address = [00 0a 35 00 00 00];
enet-reset = <&gpio0 47 0>;
status = "okay";
phy-handle = <&phy0>;
phy-mode = "rgmii-id";
xlnx,eth-mode = <0x1>;
mdio {
status = "okay";
#address-cells = <1>;
#size-cells = <0>;
phy0: phy@0 {
compatible = "ethernet-phy-ieee802.3-c22";
device_type = "ethernet-phy";
reg = <0>;
ti,rx-internal-delay = <0x8>;
ti,tx-internal-delay = <0xa>;
ti,fifo-depth = <0x01>;
ti,min-output-impedance;
ti,dp83867-rxctrl-strap-quirk;
status = "okay";
};
phy1: phy@12 {
compatible = "ethernet-phy-ieee802.3-c22";
device_type = "ethernet-phy";
reg = <12>;
ti,rx-internal-delay = <0x8>;
ti,tx-internal-delay = <0xa>;
ti,fifo-depth = <0x01>;
ti,min-output-impedance;
ti,dp83867-rxctrl-strap-quirk;
status = "okay";
};
};
};
&gem1{
local-mac-address = [00 0a 35 00 00 01];
enet-reset = <&gpio0 47 0>;
status = "okay";
phy-handle = <&phy1>;
phy-mode = "rgmii-id";
xlnx,eth-mode = <0x1>;
};
Oryx
В Vivado включен eth0(с mdio) и выключен eth1. Pullup пока что все включены
Работает
На новых платах(с отпаянными линиями линиями eth):
- на полноценных проводах с ходу
- на обкусанных проводах только если выставить 10 в ethtool
На старых платах:
- на полноценных проводах только если выставить 100 в ethtool
- на обкусанных проводах только если выставить 10 в ethtool
Везде работает так:
Спидометр показывает 2,5МБ/с, т.е. 20Мбит/с!
Можно в custom_itit.sh прописать:
ethtool -s eth0 speed 10 duplex full autoneg on
ifup eth0
status = "okay";
phy-handle = <&phy0>;
phy-mode = "rgmii-id";
xlnx,eth-mode = <0x1>;
mdio {
status = "okay";
#address-cells = <1>;
#size-cells = <0>;
phy0: phy@1 {
compatible = "ethernet-phy-ieee802.3-c22";
device_type = "ethernet-phy";
rxc-skew-ps = <1800>;
rxdv-skew-ps = <0>;
txc-skew-ps = <1800>;
txen-skew-ps = <0>;
reg = <1>;
status = "okay";
};
};
};
В принципе, работает сеть на новой плате с нормальным кабелем без модификации devicetree. Остальные комбинации плат-кабелей надо проверять
i2c
В rootfs включаем
base ->
i2c-tools ->
[*] i2c-tools
Для поиска устройств можно написать
Статья по i2c и RTC
RTC
- Включаем в ядро подходящий драйвер
- Модифицируем device-tree
Вставляем в девайс три:
i2c: i2c@e0004000 {
rtc@51 {
compatible = "nxp,pcf85363";
reg = <0x51>;
};
};
};
Будет выглядеть так:
compatible = "cdns,i2c-r1p10";
status = "okay";
clocks = <0x1 0x26>;
interrupt-parent = <0x4>;
interrupts = <0x0 0x19 0x4>;
reg = <0xe0004000 0x1000>;
#address-cells = <0x1>;
#size-cells = <0x0>;
clock-frequency = <0x61a80>;
rtc@51 {
compatible = "nxp,pcf85363";
reg = <0x51>;
};
};
Если готового драйвера нет:
UG1144 pg.54
Создаем новый модуль
petalinux-create -t modules --name rtc-pcf85363 --enable
Правим исходный код в project-spec/meta-user/recipes-modules/rtc-pcf85363/files
Исправленный драйвер лежит в git Clonicus\linux\
Для удаления модуля:
- удаляем папку из project-spec/meta-user/recipes-modules
- В файле project-spec/meta-user/recipes-core/images/petalinux-image.bbappend удаляем соответствующую строку
Пробуем собрать модуль
Если ОК, собираем (собирать модуль необязательно, petalinux-build его соберет)
И перепаковываем BOOT.bin
Пересобираем deveice-tree с указанием нового драйвера (petalinux-build соберет сам deveice-tree)
просмотр модулей
загрузить драйвер можно
или
Если все ок и в девайс три прописан правильный драйвер для устройства, то модуль будет загружен сам
Прошиваем .bit (для клоникуса нужен бит для работы PL-i2c). После этого можно пользоваться RTC
Чтение времени из rtc если этот rtc не дефолтный (у нас rtc2)
Синхронизация rtc по системному времени
Правим custom_init.sh для изменения default-rtc на наше устройство
ln -s /dev/rtc2 /dev/rtc
Установка системного времени
Запись системного времени в RTC
Запись времени RTC в системное время
Получить время с интеренета
rdate -s 132.163.96.5 (example)
При перезагрузке "reboot" система автоматически запишет системное время в RTC
FPGA CONFIG from Uboot
Для того, чтобы прошить PL из uboot используем команду:
либо скриптами:
pl_load=fpga loadb 0 0x100000 0x1400000 // прошиваем PL
fpga_config=run load_bit && run pl_loadipaddr // вызов самих скриптов
0x10_0000 - начальный адрес ddr
0x1_400_000 - размер в байтах для 20МБайт - указываем размер битника с запасом. Теоретически может так не работать, но работает
IRQ
Для поддержки irq добавляем в device-tree
Важно - мы перетираем bootargs!
chosen {
bootargs = "console=ttyPS0,115200 earlyprintk uio_pdrv_genirq.of_id=generic-uio";
};
};
&amba {
hififo: hififo@40000000 {
compatible = "generic-uio";
interrupt-parent = <&intc>;
interrupts = <0 29 1>;
reg = <0x40000000 0x1000 0x18000000 0x8000000>;
};
};
USB
Запустил на Z706
В дефолтных настройках ядра petalinux_2018.1 все было включено
включаем ресет на MIO7 pullup disabled
все ноги интерфейса ulpi pullup disabled
Содержимое system-user.dtsi
/{
usb_phy0:phy0 {
compatible="ulpi-phy";
#phy-cells = <0>;
reg = <0xe0002000 0x1000>;
view-port=<0x170>;
drv-vbus;
};
};
&usb0 {
status = "okay";
dr_mode = "host";
usb-phy = <&usb_phy0>;
} ;
USB-ETHERNET
USB support ->
USB Gadget Support ->
[*] Ethernet Control Model (all)
[*] RNDIS
[*] Ethernet Emulation Model
Network device support ->
USB Network Adapters ->
[*] Realtek RTL8152/RTL8153
[ Иерархический вид ]Комментарии
Войдите, чтобы комментировать.