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 (Image Packaging Configuration -> Copy final images)
Отключаем интернет-sstate (Yocto Settings -> Enable Network sstate feeds)
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
usbutils ->
[*] usbutils
console ->
network ->
ethtool ->
[*] ethtool // необходимо для oryx! для перенастройки autonegotiation
Можно еще подключать дебаг i2c
Необходимо убедиться, что образ может распаковаться в размер оперативы
Если будут проблемы, то надо будет править netboot offset
device tree
Если необходимо внести изменения в device tree, то смотрим конец статьи
Интересная статья по правке devicetree из uboot
Сборка проекта
- далее (сборка идет 30-60 минут)
cd /images/linux/
- делаем boot.bin в папке /images/linux/
$ 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/
Serial port на новом линуксе
Выяснилось, что без доп. настройки, в последовательный порт (dev/ttyPS0) после каждой посылки добавляются символы CR и LF. Оказалось, что и RTKLib, и софт Листопада не хотят работать с таким окончанием пакетов. Старый линукс на Ориксах добавляет только LF. Для решения проблемы нужно через stty выключить в настройках порта опцию onlcr (преобразовывать перевод строки в возврат каретки и новую строку).
Сделать это удалось пока только изменив скрипт демона receiver. Для решения проблемы заходим в /run/media/mmcblk0p1/daemon/receiver, и в начале секции receiver_start() {...} добавляем команду:
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-config -c rootfs
Пробуем собрать модуль
Если ОК, собираем (собирать модуль необязательно, 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 Modem (CDC ACM)
USB Gadget Support ->
[*] Ethernet Control Model (all)
[*] RNDIS
[*] Ethernet Emulation Model
[*] CDC Composite Device (Ethernet and ACM)
[*] USB Gadget Drivers (Ethernet gadget...)
Network device support ->
USB Network Adapters ->
[*] Realtek RTL8152/RTL8153
[*] Multi-purpose USB Networking Framework
WiFi Dongle
Творим:
Wireless ->
[*] cfg80211
[*] Generic IEEE 802.11 ... (mac80211)
Device Drivers ->
Network device support ->
Wireless LAN ->
Realtek rtlwifi family of devices ->
[*] Realtek ..../RTL8188CE Wireless Network Adapter ???
[*] Realtek RTL8188EE Wireless Network Adapter ???
[*] Realtek RTL8192CU/RTL8188CU USB Wireless Network Adapter
Staging drivers ->
[*] Realtek RTL8188EU wireless LAN MIC driver
rootfs
network ->
wpa-supplicant ->
[*] wpa-supplicant
Модификаци инит-скрипта
mkdir /lib/firmware/
mkdir /lib/firmware/rtlwifi/
cp /run/media/mmcblk0p1/rtl8188eufw.bin /lib/firmware/rtlwifi/
WiFi ESP
webserver
- Репозиторий emlid ReachView (bnd на py/Flask, fnd на html/Ajax/js/Bootstrap)
Backend:
Frontend:
busybox httpd
В petalinux многие пакеты скукожены до их минимальных вариантов и встроены в общий пакет busybox. В busybox есть также и вебсервер busybox-httpd. Для использования нужно на этапе настройки файловой системы его включить:
$ petalinux-config -c rootfs
Конфиг:
base -> busybox -> [*] busybox [*] busybox-httpd [ ] busybox-hwclock [*] busybox-inetd [*] busybox-mdev [ ] busybox-syslog [*] busybox-udhcpc [ ] busybox-udhcpd
Сам httpd будет в /usr/sbin. Рабочая папка по умолчанию в /srv/www/. Если в нее кидать файлы, то именно из нее будет отображаться контент в браузере. Папку можно изменить, перезапустив httpd с ключом -h <workdir>.
Порт по умолчанию 80. Работает, как демон в /etc/init.d/, вкл-выкл оттуда же.
Если положить в /srv/www/ файл index.html с неким кодом, то в браузере отобразится вебморда. Картинки работают по ссылкам.
index.html
<html>
<head>
<title>clonicus'112 webserver</title>
</head>
<body>
<h3>Hello, World!</h3>
<h4>Web server is now up!</h4>
<img src="https://i.redd.it/oagz5eobkkt11.jpg" width="50%">
<br><br>
<a href="http://www.srns.ru">For more information see SRNS.ru</a>
<br>
</body>
</html>
python в petalinux
В petalinux 2017.4 есть 2 питона - 2.7 и 3.5.
$ petalinux-config -c rootfs
python2.7
Filesystem Packages-> devel-> python->
python3.5
Filesystem Packages-> misc-> python3-*>
Модуль runpy.py для запуска команд вида 'python -m <module>' находится в python -> python-misc.
SimpleHTTPServer.py
Для первого теста поднимем встроенный в python2.7 минисервер SimpleHTTPServer.py в /usr/lib/python2.7.
Для его запуска напишем скрипт
webserver.py:
import SocketServer
PORT = 80
Handler = SimpleHTTPServer.SimpleHTTPRequestHandler
httpd = SocketServer.TCPServer(("", PORT), Handler)
print "serving at port", PORT
httpd.serve_forever()
$ python webserver.py
При наличии в папке со скриптом файла index.html сервер поднимется автоматически.
Добавление слоев в сборку
Оффлайн карта
Либо качать тайлы, либо поднимать svg сервер, и качать для него сырые данные.
Опенсорс - есть.
Сервер - с дб, SQL etc...
Много непонятного.
[ Хронологический вид ]Комментарии
Войдите, чтобы комментировать.