16.05.2018 PetaLinux
Lipa (обсуждение | вклад) (→Oryx) |
Lipa (обсуждение | вклад) |
||
(не показаны 205 промежуточных версий 4 участников) | |||
Строка 6: | Строка 6: | ||
</summary> | </summary> | ||
− | |||
− | |||
== Требования == | == Требования == | ||
Vivado 2018.1 (для single-gigabit ethernet можно более ранние версии) | Vivado 2018.1 (для single-gigabit ethernet можно более ранние версии) | ||
+ | |||
+ | Начиная с petalinux_2018.1 отсутствует devcfg. Необходимо использовать FPGA manager. Технология нами пока не освоена | ||
Необходима Ubuntu-16.04 | Необходима Ubuntu-16.04 | ||
− | Требуется поставить ряд пакетов, полный список приведен в документе UG1144 | + | Требуется поставить ряд пакетов, полный список приведен в документе [https://www.xilinx.com/support/documentation/sw_manuals/xilinx2019_1/ug1144-petalinux-tools-reference-guide.pdf#page=9 UG1144] |
Устанавливаем PetaLinux в систему. Дистрибутив есть на [https://www.xilinx.com/support/download/index.html/content/xilinx/en/downloadNav/embedded-design-tools/2018-1.html Xilinx], либо у меня на компьютере. '''Ставить PetaLinux необходимо БЕЗ прав суперюзера!''' | Устанавливаем PetaLinux в систему. Дистрибутив есть на [https://www.xilinx.com/support/download/index.html/content/xilinx/en/downloadNav/embedded-design-tools/2018-1.html Xilinx], либо у меня на компьютере. '''Ставить PetaLinux необходимо БЕЗ прав суперюзера!''' | ||
+ | |||
+ | кидаем в /components/yocto/ sstate-rel-v2017.4.tar.gz | ||
Подготовка завершена | Подготовка завершена | ||
Строка 72: | Строка 74: | ||
Необходимо править netboot offset если оперативной памяти менее ~256МБ | Необходимо править netboot offset если оперативной памяти менее ~256МБ | ||
+ | |||
+ | Для клоникуса с 256МБ ставим 8'000'000 | ||
<source lang="bash"> | <source lang="bash"> | ||
Строка 83: | Строка 87: | ||
Выставляем точку начала распаковки образа системы | Выставляем точку начала распаковки образа системы | ||
+ | |||
+ | Выключаем копирование образа по sftp (Image Packaging Configuration -> Copy final images) | ||
+ | |||
+ | Отключаем интернет-sstate (Yocto Settings -> Enable Network sstate feeds) | ||
=== petalinux-config -c kernel=== | === petalinux-config -c kernel=== | ||
Строка 91: | Строка 99: | ||
$ petalinux-config -c kernel | $ petalinux-config -c kernel | ||
</source> | </source> | ||
+ | |||
+ | '''для oryx:''' | ||
<source lang="bash"> | <source lang="bash"> | ||
Строка 99: | Строка 109: | ||
[*] PHY Device support and infastructure --> | [*] PHY Device support and infastructure --> | ||
[*] Drivers for Micrel PHYs | [*] Drivers for Micrel PHYs | ||
+ | </source> | ||
+ | |||
+ | '''для clonicus:''' | ||
+ | |||
+ | <source lang="bash"> | ||
+ | Device Drivers-> | ||
+ | [*]Network device support -> | ||
+ | [*] PHY Device support and infastructure --> | ||
+ | [*] Texas Instruments DP83867 Gigabit PHY | ||
</source> | </source> | ||
=== petalinux-config -c rootfs === | === petalinux-config -c rootfs === | ||
− | Подключаем при необходимости ethtool, gdb, libstdc | + | Подключаем при необходимости ethtool, gdbserver, gdb, libstdc, libgcc, glib2.0, glibc(glibc & ltd) |
+ | <source lang="bash"> | ||
+ | Filesystem Packages-> | ||
+ | misc -> | ||
+ | gcc-runtime -> | ||
+ | [*] libstdc ++ | ||
+ | gdb --> | ||
+ | [*] gdb | ||
+ | glib-2.0 | ||
+ | [*] glib-2.0 | ||
+ | glibc | ||
+ | [*] glibc | ||
+ | [*] ldd | ||
+ | devel -> | ||
+ | python -> | ||
+ | python -> | ||
+ | [*] python | ||
+ | </source> | ||
+ | |||
+ | Опционально: | ||
+ | <source lang="bash"> | ||
+ | Filesystem Packages-> | ||
+ | base -> | ||
+ | i2c-tools -> | ||
+ | [*] i2c-tools | ||
+ | usbutils -> | ||
+ | [*] usbutils | ||
+ | console -> | ||
+ | network -> | ||
+ | ethtool -> | ||
+ | [*] ethtool // необходимо для oryx! для перенастройки autonegotiation | ||
+ | </source> | ||
+ | |||
+ | Можно еще подключать дебаг i2c | ||
− | '''Необходимо убедиться, что | + | '''Необходимо убедиться, что образ может распаковаться в размер оперативы''' |
Строка 113: | Строка 165: | ||
Если необходимо внести изменения в device tree, то смотрим конец статьи | Если необходимо внести изменения в device tree, то смотрим конец статьи | ||
+ | |||
+ | [https://xilinx-wiki.atlassian.net/wiki/spaces/A/pages/18841676/U-Boot+Flattened+Device+Tree Интересная статья по правке devicetree из uboot] | ||
=== Сборка проекта === | === Сборка проекта === | ||
Строка 119: | Строка 173: | ||
<source lang="bash"> | <source lang="bash"> | ||
petalinux-build | petalinux-build | ||
+ | |||
+ | cd /images/linux/ | ||
</source> | </source> | ||
− | * делаем boot.bin | + | * делаем boot.bin в папке /images/linux/ |
<source lang="bash"> | <source lang="bash"> | ||
$ petalinux-package --boot --format BIN --fsbl ./zynq_fsbl.elf --u-boot --force | $ petalinux-package --boot --format BIN --fsbl ./zynq_fsbl.elf --u-boot --force | ||
+ | |||
+ | $ 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 | ||
</source> | </source> | ||
Строка 147: | Строка 208: | ||
<source lang="bash"> | <source lang="bash"> | ||
− | $ fatload mmc 0 | + | $ fatload mmc 0 0xA000000 image.ub |
− | $ bootm | + | $ bootm 0xA000000 |
</source> | </source> | ||
Строка 154: | Строка 215: | ||
<source lang="bash"> | <source lang="bash"> | ||
− | $ fatload mmc 0 | + | $ fatload mmc 0 0xA000000 image.ub |
− | $ fatload mmc 0 | + | $ fatload mmc 0 0x9000000 system.dtb |
− | $ bootm | + | $ bootm 0xA000000 0xA000000 0x9000000 |
</source> | </source> | ||
Строка 167: | Строка 228: | ||
<source lang="bash"> | <source lang="bash"> | ||
cat /sys/class/xdevcfg/xdevcfg/device/prog_done | cat /sys/class/xdevcfg/xdevcfg/device/prog_done | ||
+ | </source> | ||
+ | |||
+ | ==Uboot== | ||
+ | |||
+ | Для внесения правок в загрузку линукса используем список команд '''env''' | ||
+ | |||
+ | Просмотр текущих команд '''printenv''' | ||
+ | |||
+ | Сброс настроек в дефолт '''env default -a''' | ||
+ | |||
+ | Создать переменную '''env set <имя> <значение>''' | ||
+ | |||
+ | Правка переменной '''env edit <имя переменной>''' | ||
+ | |||
+ | --- | ||
+ | |||
+ | Для каждой платы делаем следующее: | ||
+ | |||
+ | * Берем [[Файл:uboot.env.c]] | ||
+ | |||
+ | * Удаляем в конце имени ".c" | ||
+ | |||
+ | * Записываем на флешку рядом с образом линукса | ||
+ | |||
+ | * Запускаем плату и прерываем autoboot | ||
+ | |||
+ | * Пишем '''editenv ethaddr''' | ||
+ | |||
+ | * Редактируем MAC-адрес | ||
+ | |||
+ | * Пишем '''saveenv''' | ||
+ | |||
+ | * Все! можем ребутать '''reset''' | ||
+ | |||
+ | |||
+ | Сохранить в файл '''saveenv''' | ||
+ | |||
+ | ==Автозапуск приложений== | ||
+ | |||
+ | Во-первых [https://forums.xilinx.com/t5/Embedded-Linux/Petalinux-Runnning-a-script-file-at-startup/td-p/689051 тыц] | ||
+ | |||
+ | Далее пишем | ||
+ | |||
+ | <source lang="bash"> | ||
+ | petalinux-create -t apps --template install -n myapp-init --enable | ||
+ | </source> | ||
+ | |||
+ | Правим файл /project-spec/meta-user/recipes-apps/myapp-init/myapp-init.bb | ||
+ | |||
+ | <source lang="bash"> | ||
+ | # | ||
+ | # 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}/*" | ||
+ | </source> | ||
+ | |||
+ | Правим сам исполняемый скрипт project-spec/meta-user/recipes-apps/myapp-init/files/myapp-init | ||
+ | |||
+ | <source lang="bash"> | ||
+ | #!/bin/sh | ||
+ | |||
+ | echo "Autorun script" | ||
+ | |||
+ | echo "Try run custom_init" | ||
+ | sh /run/media/mmcblk0p1/custom_init.sh | ||
+ | </source> | ||
+ | |||
+ | Записываем на флешку скрипт custom_init.sh с нужными командами и делаем его исполняемым | ||
+ | |||
+ | Записываем файл interfaces | ||
+ | |||
+ | Скачать архив: [[Файл:Init_interfaces.rar]] | ||
+ | |||
+ | ==SSH== | ||
+ | |||
+ | Как победить сохранение ssh-ключей: | ||
+ | |||
+ | Добавляем в init_script следующие строки: | ||
+ | |||
+ | <source lang="bash"> | ||
+ | mkdir /run/media/mmcblk0p2/.ssh | ||
+ | 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/ | ||
+ | </source> | ||
+ | |||
+ | * Создается ссылка на флешку, где хранятся авторизованные пользователи | ||
+ | * Создается папка для хранения секретного ключа платы | ||
+ | * При запуске платы свежесозданный ключ заменяется тем, что лежит на флешке | ||
+ | * При первом включении платы будет создан новый ключ | ||
+ | |||
+ | Помимо добавления указанных команд в скрипт ничего больше делать не надо | ||
+ | |||
+ | ==Daemon== | ||
+ | |||
+ | Для настройки демона: | ||
+ | |||
+ | * Добавляем строки в файл custom_init.sh | ||
+ | * Кидаем на загрузочный раздел флешки папку из архива [[:File:daemon.rar]] | ||
+ | |||
+ | <source lang="bash"> | ||
+ | cp -r /run/media/mmcblk0p1/daemon/lsb /lib/ | ||
+ | cp /run/media/mmcblk0p1/daemon/receiver.conf /etc/ | ||
+ | cp /run/media/mmcblk0p1/daemon/receiver /etc/init.d/ | ||
+ | </source> | ||
+ | |||
+ | === Serial port на новом линуксе === | ||
+ | Выяснилось, что без доп. настройки, в последовательный порт (dev/ttyPS0) после каждой посылки добавляются символы CR и LF. Оказалось, что и RTKLib, и софт Листопада не хотят работать с таким окончанием пакетов. | ||
+ | |||
+ | Выше не совсем так, скорее мысль в том, что каждый символ LF (0x0A) в наших данных меняется на символы CR LF, т.е. (0x0D0A). И тогда, в нашем битовом потоке меняется размер и содержимое и парсеры работают некорректно. | ||
+ | Старый линукс на Ориксах добавляет только LF. Для решения проблемы нужно через stty выключить в настройках порта опцию '''onlcr''' (преобразовывать перевод строки в возврат каретки и новую строку). | ||
+ | |||
+ | Сделать это удалось пока только изменив скрипт демона receiver. Для решения проблемы заходим в /run/media/mmcblk0p1/daemon/receiver, и в начале секции receiver_start() {...} добавляем команду: | ||
+ | |||
+ | <source lang="bash"> | ||
+ | stty -F /dev/ttyPS0 -onlcr | ||
</source> | </source> | ||
Строка 179: | Строка 379: | ||
Для разборки device-tree [http://xillybus.com/tutorials/device-tree-zynq-1 ссылка] | Для разборки device-tree [http://xillybus.com/tutorials/device-tree-zynq-1 ссылка] | ||
<source lang="bash"> | <source lang="bash"> | ||
− | $ | + | $ dtc -I dtb -O dts -o <name>.dts <name>.dtb |
</source> | </source> | ||
Для сборки device-tree | Для сборки device-tree | ||
<source lang="bash"> | <source lang="bash"> | ||
− | $ dtc -I dts -O dtb -o < | + | $ dtc -I dts -O dtb -o <name>.dtb <name>.dts |
</source> | </source> | ||
Строка 791: | Строка 991: | ||
=== Oryx === | === Oryx === | ||
+ | |||
+ | Итоговый system-user.dtsi | ||
+ | |||
+ | Меняем номера uart, чтобы системным был ttyPS1, а пользовательским ttyPS0 | ||
+ | <source lang="bash"> | ||
+ | /include/ "system-conf.dtsi" | ||
+ | / { | ||
+ | aliases { | ||
+ | serial0 = &uart0; | ||
+ | serial1 = &uart1; | ||
+ | }; | ||
+ | }; | ||
+ | |||
+ | &gem0{ | ||
+ | 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"; | ||
+ | }; | ||
+ | }; | ||
+ | }; | ||
+ | |||
+ | / { | ||
+ | chosen { | ||
+ | bootargs = "console=ttyPS1,115200 earlyprintk uio_pdrv_genirq.of_id=generic-uio"; | ||
+ | stdout-path = "serial1:115200n8"; | ||
+ | }; | ||
+ | }; | ||
+ | |||
+ | &amba { | ||
+ | hififo: hififo@40000000 { | ||
+ | compatible = "generic-uio"; | ||
+ | interrupt-parent = <&intc>; | ||
+ | interrupts = <0 29 1>; | ||
+ | reg = <0x40000000 0x1000 0x18000000 0x8000000>; | ||
+ | }; | ||
+ | }; | ||
+ | |||
+ | &uart0{ | ||
+ | port-number = <0>; | ||
+ | }; | ||
+ | |||
+ | &uart1{ | ||
+ | port-number = <1>; | ||
+ | }; | ||
+ | </source> | ||
+ | |||
В Vivado включен eth0(с mdio) и выключен eth1. | В Vivado включен eth0(с mdio) и выключен eth1. | ||
Строка 797: | Строка 1059: | ||
[https://github.com/Xilinx/u-boot-xlnx/blob/master/doc/device-tree-bindings/net/micrel-ksz90x1.txt статья в помощь] | [https://github.com/Xilinx/u-boot-xlnx/blob/master/doc/device-tree-bindings/net/micrel-ksz90x1.txt статья в помощь] | ||
− | '''Работает''' | + | '''Работает''' |
+ | |||
+ | На новых платах(с отпаянными линиями линиями eth): | ||
+ | * на полноценных проводах с ходу | ||
+ | * на обкусанных проводах только если выставить 10 в ethtool | ||
На старых платах: | На старых платах: | ||
* на полноценных проводах только если выставить 100 в ethtool | * на полноценных проводах только если выставить 100 в ethtool | ||
− | * на | + | * на обкусанных проводах только если выставить 10 в ethtool |
+ | |||
+ | Везде работает так: | ||
+ | <source lang="bash"> | ||
+ | ethtool -s eth0 speed 10 duplex full autoneg on | ||
+ | </source> | ||
+ | Спидометр показывает 2,5МБ/с, т.е. 20Мбит/с! | ||
+ | |||
+ | Можно в custom_itit.sh прописать: | ||
+ | <source lang="bash"> | ||
+ | ifdown eth0 | ||
+ | ethtool -s eth0 speed 10 duplex full autoneg on | ||
+ | ifup eth0 | ||
+ | </source> | ||
+ | |||
+ | |||
<source lang="bash"> | <source lang="bash"> | ||
&gem0{ | &gem0{ | ||
Строка 828: | Строка 1109: | ||
}; | }; | ||
</source> | </source> | ||
+ | |||
+ | В принципе, работает сеть на новой плате с нормальным кабелем без модификации devicetree. Остальные комбинации плат-кабелей надо проверять | ||
+ | |||
+ | == i2c == | ||
+ | |||
+ | В rootfs включаем | ||
+ | <source lang="bash"> | ||
+ | Filesystem Packages -> | ||
+ | base -> | ||
+ | i2c-tools -> | ||
+ | [*] i2c-tools | ||
+ | </source> | ||
+ | |||
+ | Для поиска устройств можно написать | ||
+ | |||
+ | <source lang="bash"> | ||
+ | i2cdetect -y -r 0 | ||
+ | </source> | ||
+ | |||
+ | [https://xilinx-wiki.atlassian.net/wiki/spaces/A/pages/18842160/Cadence+I2C+Driver Статья] по i2c и RTC | ||
+ | |||
+ | == QSPI Flash == | ||
+ | |||
+ | для работы по флешь памяти как в ките (S25FL128S) - оставляем в дев.три родные compatible = "n25q512a","micron,m25p80"; | ||
+ | |||
+ | == SWDT System Watchdog Timer== | ||
+ | |||
+ | * Модифицируем Uenv для настройки wawtchdog через uboot: | ||
+ | |||
+ | <source lang="bash"> | ||
+ | bootcmd=run swdt_set && run fpga_config && run boot_image && run boot_dtb && bootm 0xA000000 0xA000000 0x9000000 | ||
+ | swdt_set=run swdt_ccr && run swdt_rst && run swdt_zmr | ||
+ | swdt_ccr=mw 0xf8005004 0x92063b | ||
+ | swdt_rst=mw 0xf8005008 0x1999 | ||
+ | swdt_zmr=mw 0xf8005000 0xabc043 | ||
+ | </source> | ||
+ | |||
+ | * Создаем скрипт для сброса watchdog: | ||
+ | |||
+ | swdt_rst.sh | ||
+ | |||
+ | <source lang="bash"> | ||
+ | watch -n 5 'devmem 0xf8005008 32 0x1999' &>/dev/null & | ||
+ | </source> | ||
+ | |||
+ | * Добавляем вызов скрипта в автозагрузку | ||
+ | |||
+ | PS Посмотреть можно в проекте bin/Clonicus, коммит ffc437e435d3b5c207bb1186a9561fd06a46d89f | ||
+ | |||
+ | == RTC == | ||
+ | |||
+ | * Включаем в ядро подходящий драйвер | ||
+ | |||
+ | * Модифицируем device-tree | ||
+ | |||
+ | Вставляем в девайс три: | ||
+ | <source lang="bash"> | ||
+ | &amba { | ||
+ | i2c0: i2c@e0004000 { | ||
+ | clock-frequency = <0xC350>; | ||
+ | rtc@51 { | ||
+ | compatible = "nxp,pcf85363"; | ||
+ | reg = <0x51>; | ||
+ | }; | ||
+ | }; | ||
+ | i2c1: i2c@e0005000 { | ||
+ | clock-frequency = <0xC350>; | ||
+ | }; | ||
+ | }; | ||
+ | </source> | ||
+ | |||
+ | Будет выглядеть так: | ||
+ | <source lang="bash"> | ||
+ | i2c@e0004000 { | ||
+ | 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 = <0xc350>; | ||
+ | |||
+ | rtc@51 { | ||
+ | compatible = "nxp,pcf85363"; | ||
+ | reg = <0x51>; | ||
+ | }; | ||
+ | }; | ||
+ | |||
+ | i2c@e0005000 { | ||
+ | compatible = "cdns,i2c-r1p10"; | ||
+ | status = "okay"; | ||
+ | clocks = <0x1 0x27>; | ||
+ | interrupt-parent = <0x4>; | ||
+ | interrupts = <0x0 0x30 0x4>; | ||
+ | reg = <0xe0005000 0x1000>; | ||
+ | #address-cells = <0x1>; | ||
+ | #size-cells = <0x0>; | ||
+ | clock-frequency = <0xc350>; | ||
+ | }; | ||
+ | </source> | ||
+ | |||
+ | Если готового драйвера нет: | ||
+ | |||
+ | UG1144 pg.54 | ||
+ | |||
+ | Создаем новый модуль | ||
+ | <source lang="bash"> | ||
+ | petalinux-create -t modules --name <name_module> --enable | ||
+ | petalinux-create -t modules --name rtc-pcf85363 --enable | ||
+ | </source> | ||
+ | |||
+ | Правим исходный код в 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 | ||
+ | |||
+ | Пробуем собрать модуль | ||
+ | <source lang="bash"> | ||
+ | petalinux-build -c <name_module> | ||
+ | </source> | ||
+ | |||
+ | Если ОК, собираем (собирать модуль необязательно, petalinux-build его соберет) | ||
+ | <source lang="bash"> | ||
+ | petalinux-build | ||
+ | </source> | ||
+ | |||
+ | И перепаковываем BOOT.bin | ||
+ | |||
+ | Пересобираем deveice-tree с указанием нового драйвера (petalinux-build соберет сам deveice-tree) | ||
+ | |||
+ | просмотр модулей | ||
+ | |||
+ | <source lang="bash"> | ||
+ | lsmod | ||
+ | </source> | ||
+ | |||
+ | загрузить драйвер можно | ||
+ | |||
+ | <source lang="bash"> | ||
+ | insmod /lib/modules/4.9.0-xilinx-v2017.4/extra/rtc-pcf85363.ko | ||
+ | </source> | ||
+ | или | ||
+ | <source lang="bash"> | ||
+ | modprobe rtc-pcf85363 | ||
+ | </source> | ||
+ | |||
+ | '''Если все ок и в девайс три прописан правильный драйвер для устройства, то модуль будет загружен сам''' | ||
+ | |||
+ | Прошиваем .bit (для клоникуса нужен бит для работы PL-i2c). После этого можно пользоваться RTC | ||
+ | |||
+ | Чтение времени из rtc если этот rtc не дефолтный (у нас rtc2) | ||
+ | <source lang="bash"> | ||
+ | hwclock -r -f /dev/rtc2 | ||
+ | </source> | ||
+ | |||
+ | Синхронизация rtc по системному времени | ||
+ | <source lang="bash"> | ||
+ | hwclock -w -f /dev/rtc2 | ||
+ | </source> | ||
+ | |||
+ | Правим custom_init.sh для изменения default-rtc на наше устройство | ||
+ | <source lang="bash"> | ||
+ | rm /dev/rtc | ||
+ | ln -s /dev/rtc2 /dev/rtc | ||
+ | </source> | ||
+ | |||
+ | Установка системного времени | ||
+ | <source lang="bash"> | ||
+ | date --set "2013-7-31 09:30" | ||
+ | </source> | ||
+ | |||
+ | Запись системного времени в RTC | ||
+ | <source lang="bash"> | ||
+ | hwclock -w | ||
+ | </source> | ||
+ | |||
+ | Запись времени RTC в системное время | ||
+ | <source lang="bash"> | ||
+ | hwclock -s | ||
+ | </source> | ||
+ | |||
+ | Получить время с интеренета | ||
+ | <source lang="bash"> | ||
+ | rdate -s <IP address of time server> | ||
+ | rdate -s 132.163.96.5 (example) | ||
+ | </source> | ||
+ | |||
+ | При перезагрузке "reboot" система автоматически запишет системное время в RTC | ||
+ | |||
+ | == FPGA CONFIG from Uboot == | ||
+ | |||
+ | Для того, чтобы прошить PL из uboot используем команду: | ||
+ | <source lang="bash"> | ||
+ | fpga loadb 0 <ddr_file_addr> <file_size> | ||
+ | </source> | ||
+ | |||
+ | либо скриптами: | ||
+ | <source lang="bash"> | ||
+ | load_bit=fatload mmc 0 0x100000 clonicus.bit // читаем файл в ddr | ||
+ | pl_load=fpga loadb 0 0x100000 0x1400000 // прошиваем PL | ||
+ | fpga_config=run load_bit && run pl_loadipaddr // вызов самих скриптов | ||
+ | </source> | ||
+ | 0x10_0000 - начальный адрес ddr | ||
+ | |||
+ | 0x1_400_000 - размер в байтах для 20МБайт - указываем размер битника с запасом. Теоретически может так не работать, но работает | ||
+ | |||
+ | == ETH over TTY== | ||
+ | |||
+ | В ядре включаем: slip, Universal TUN/TAP | ||
+ | |||
+ | В rootfs включаем net-tools | ||
+ | |||
+ | Включаем iptables для перемршрутизации между подсетями и для него: | ||
+ | |||
+ | <source lang="bash"> | ||
+ | [*] Networking support ---> [CONFIG_NET] | ||
+ | Networking Options ---> | ||
+ | [*] Network packet filtering framework (Netfilter) ---> [CONFIG_NETFILTER] | ||
+ | [*] Advanced netfilter configuration [CONFIG_NETFILTER_ADVANCED] | ||
+ | Core Netfilter Configuration ---> | ||
+ | <*/M> Netfilter connection tracking support [CONFIG_NF_CONNTRACK] | ||
+ | <*/M> Netfilter Xtables support (required for ip_tables) [CONFIG_NETFILTER_XTABLES] | ||
+ | <*/M> LOG target support [CONFIG_NETFILTER_XT_TARGET_LOG] | ||
+ | IP: Netfilter Configuration ---> | ||
+ | <*/M> IP tables support (required for filtering/masq/NAT) [CONFIG_IP_NF_IPTABLES] | ||
+ | |||
+ | </source> | ||
+ | |||
+ | PC1: | ||
+ | |||
+ | slattach -L -s 115200 -p slip /dev/ttyPS1 & | ||
+ | |||
+ | ifconfig sl0 192.168.1.1/24 up | ||
+ | |||
+ | route add default gw 192.168.1.1 sl0 | ||
+ | |||
+ | |||
+ | PC2: | ||
+ | |||
+ | slattach -L -s 115200 -p slip /dev/ttyPS1 & | ||
+ | |||
+ | ifconfig sl0 192.168.1.2/24 up | ||
+ | |||
+ | route add default gw 192.168.1.1 sl0 | ||
+ | |||
+ | == UART_PL == | ||
+ | |||
+ | Включаем в настройках ядра поддержку uart_lite, выставляем правильное максимальное число уартов | ||
+ | |||
+ | Модифицируем system-user.dtsi | ||
+ | |||
+ | Обращаем внимание на нумерацию serial, axi_uartlite, она должна не повторяться. То же самое с interrupts | ||
+ | Указываем верный физический адрес на шине и диапазон адресов в <reg> | ||
+ | |||
+ | <source lang="bash"> | ||
+ | /include/ "system-conf.dtsi" | ||
+ | / { | ||
+ | aliases { | ||
+ | serial2 = &axi_uartlite_0; | ||
+ | serial3 = &axi_uartlite_1; | ||
+ | }; | ||
+ | }; | ||
+ | / { | ||
+ | amba_pl { | ||
+ | #address-cells = <0x1>; | ||
+ | #size-cells = <0x1>; | ||
+ | compatible = "simple-bus"; | ||
+ | ranges; | ||
+ | |||
+ | axi_uartlite_0: serial@80000008 { | ||
+ | clock-names = "ref_clk"; | ||
+ | clocks = <&clkc 0>; | ||
+ | compatible = "xlnx,xps-uartlite-1.00.a"; | ||
+ | current-speed = <115200>; | ||
+ | device_type = "serial"; | ||
+ | interrupt-parent = <&intc>; | ||
+ | interrupts = <0 30 1>; | ||
+ | port-number = <3>; | ||
+ | reg = <0x80000008 0x10>; | ||
+ | xlnx,baudrate = <0x1c200>; | ||
+ | xlnx,data-bits = <0x8>; | ||
+ | xlnx,odd-parity = <0x0>; | ||
+ | xlnx,s-axi-aclk-freq-hz-d = "100.0"; | ||
+ | xlnx,use-parity = <0x0>; | ||
+ | }; | ||
+ | axi_uartlite_1: serial@8000001C { | ||
+ | clock-names = "ref_clk"; | ||
+ | clocks = <&clkc 0>; | ||
+ | compatible = "xlnx,xps-uartlite-1.00.a"; | ||
+ | current-speed = <115200>; | ||
+ | device_type = "serial"; | ||
+ | interrupt-parent = <&intc>; | ||
+ | interrupts = <0 31 1>; | ||
+ | port-number = <4>; | ||
+ | reg = <0x8000001C 0x10>; | ||
+ | xlnx,baudrate = <0x1c200>; | ||
+ | xlnx,data-bits = <0x8>; | ||
+ | xlnx,odd-parity = <0x0>; | ||
+ | xlnx,s-axi-aclk-freq-hz-d = "100.0"; | ||
+ | xlnx,use-parity = <0x0>; | ||
+ | }; | ||
+ | }; | ||
+ | }; | ||
+ | </source> | ||
+ | |||
+ | Если ПЛИС не прошита - будет кернел паник | ||
+ | |||
+ | == IRQ == | ||
+ | |||
+ | Для поддержки irq добавляем в device-tree | ||
+ | |||
+ | '''Важно - мы перетираем bootargs!''' | ||
+ | <source lang="bash"> | ||
+ | / { | ||
+ | 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>; | ||
+ | }; | ||
+ | }; | ||
+ | </source> | ||
+ | |||
+ | == USB == | ||
+ | |||
+ | Запустил на Z706 | ||
+ | |||
+ | [http://www.wiki.xilinx.com/Zynq+Linux+USB+Device+Driver во-первых] | ||
+ | [http://zedboard.org/content/using-petalinux-configure-zedboard%EF%BC%8C-usb-otg-can-not-work во-вторых] | ||
+ | [https://forums.xilinx.com/t5/Embedded-Linux/Petalinux-2016-3-zynq-7010-USB-not-working/td-p/737696 в-третьих] | ||
+ | |||
+ | В дефолтных настройках ядра petalinux_2018.1 все было включено | ||
+ | |||
+ | включаем ресет на MIO7 pullup disabled | ||
+ | |||
+ | все ноги интерфейса ulpi pullup disabled | ||
+ | |||
+ | Содержимое system-user.dtsi | ||
+ | <source lang="bash"> | ||
+ | /include/ "system-conf.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>; | ||
+ | |||
+ | } ; | ||
+ | </source> | ||
+ | |||
+ | == USB-ETHERNET == | ||
+ | <source lang="bash"> | ||
+ | Device Drivers -> | ||
+ | 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 | ||
+ | </source> | ||
+ | |||
+ | == WiFi Dongle == | ||
+ | |||
+ | [https://forum.trenz-electronic.de/index.php?topic=747.0 раз] | ||
+ | [https://github.com/jinchenglee/zybo_linux_setup_doc два] | ||
+ | [http://billauer.co.il/blog/2014/06/linux-realtek-hostapd/ три] | ||
+ | |||
+ | Творим: | ||
+ | <source lang="bash"> | ||
+ | Networking support -> | ||
+ | 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 | ||
+ | </source> | ||
+ | |||
+ | rootfs | ||
+ | <source lang="bash"> | ||
+ | Filesystem packages -> | ||
+ | network -> | ||
+ | wpa-supplicant -> | ||
+ | [*] wpa-supplicant | ||
+ | </source> | ||
+ | |||
+ | [https://github.com/lwfinger/rtl8188eu/blob/master/rtl8188eufw.bin качаем файл] | ||
+ | |||
+ | Модификаци инит-скрипта | ||
+ | <source lang="bash"> | ||
+ | cp /run/media/mmcblk0p1/wpa_supplicant.conf /etc/ | ||
+ | |||
+ | mkdir /lib/firmware/ | ||
+ | mkdir /lib/firmware/rtlwifi/ | ||
+ | cp /run/media/mmcblk0p1/rtl8188eufw.bin /lib/firmware/rtlwifi/ | ||
+ | </source> | ||
+ | |||
+ | == WiFi ESP == | ||
+ | |||
+ | [http://www.wiki.xilinx.com/Zynq+SDIO+Wifi Xilinx SDIP WiFi] | ||
+ | |||
+ | [http://zedboard.org/content/sdio-wifi-driver-ar6103-problem Zedboard раз] | ||
+ | |||
+ | [https://stackoverflow.com/questions/32129689/how-to-bind-sdio1-with-wi-fi-linux два] | ||
+ | |||
+ | [http://picozed.org/content/steps-get-wlink8-working-using-petalinux-picozed picozed три] | ||
+ | |||
+ | [http://zedboard.org/content/adding-wi-fi-and-bluetooth-connectivity-zedboard-using-murata-1dx-pmod zedboard четыре] | ||
+ | |||
+ | |||
+ | == Оживление 2-го ядра == | ||
+ | |||
+ | * Находим /home/ivan/clonicus_1.2.3/build/tmp/work-shared/plnx_arm/kernel-source/arch/arm/mach-zynq/efuse.c | ||
+ | * В функции zynq_efuse_cpu_state делаем сразу ретурн тру | ||
+ | * Че-нибудь меняем в настройках ядра для пересборки | ||
+ | * Выполняем: | ||
+ | |||
+ | <source lang="bash"> | ||
+ | petalinux-build -c kernel -x compile -f | ||
+ | petalinux-build -c kernel -x deploy -f | ||
+ | petalinux-build | ||
+ | </source> | ||
+ | |||
+ | * Забираем image.ub | ||
+ | |||
+ | '''ИЛИ''' | ||
+ | |||
+ | Правим device-tree, заменяем адрес efuse на 0xf800cff0 | ||
+ | |||
+ | == webserver == | ||
+ | |||
+ | * [https://github.com/emlid/ReachView Репозиторий emlid ReachView] (bnd на py/Flask, fnd на html/Ajax/js/Bootstrap) | ||
+ | |||
+ | |||
+ | '''Backend:''' | ||
+ | |||
+ | * [http://svenand.blogdrives.com/archive/195.html#.XPTYt4gzaUk Источник по busybox-httpd] | ||
+ | |||
+ | * [https://www.afternerd.com/blog/python-http-server/ Гайд по python server] | ||
+ | |||
+ | * [https://ru.wikibooks.org/wiki/Flask Викиучебник по Flask] | ||
+ | |||
+ | * [https://habr.com/ru/post/193242/ ХаброГайд по python/Flask] | ||
+ | |||
+ | |||
+ | '''Frontend:''' | ||
+ | |||
+ | * [https://unminify.com/ unminify CSS] | ||
+ | |||
+ | * [https://getbootstrap.com/docs/4.3/getting-started/introduction/ Bootstrap EN getting started] | ||
+ | |||
+ | * [https://bootstrap-4.ru/ Bootstrap RU] | ||
+ | |||
+ | * [http://htmlbook.ru/samhtml/tekst/spetssimvoly Справочник по операторам и тегам HTML/CSS] | ||
+ | |||
+ | * [https://www.w3schools.com/howto/default.asp Сборник шаблонов CSS W3schools] | ||
+ | |||
+ | * [https://www.w3schools.com/w3css/w3css_tabulators.asp Анимированный сайдбар/табы] | ||
+ | |||
+ | * [https://css-tricks.com/ CSS Tricks] | ||
+ | |||
+ | * [https://www.cssmatic.com/ Онлайн тени/границы/градиент блоков] | ||
+ | |||
+ | * [https://internetingishard.com/html-and-css/semantic-html/ Semantic HTML grid layout] | ||
+ | |||
+ | * [https://habr.com/ru/post/202408/ Хаброгайд(ч1) по верстке] | ||
+ | |||
+ | * [https://habr.com/ru/post/211032/ ХаброГайд(ч2) по Bootstrap] | ||
+ | |||
+ | * [https://fontawesome.com/icons?d=gallery Fontawesome ICONS open lib] | ||
+ | |||
+ | :* [https://htmlacademy.ru/courses/43/run/1 Нормальный онлайн HTML/CSS/JS editor] | ||
+ | |||
+ | |||
+ | === 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''' | ||
+ | <source lang="html4strict"> | ||
+ | <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> | ||
+ | <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> | ||
+ | </source> | ||
+ | |||
+ | |||
+ | === 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''': | ||
+ | |||
+ | <source lang="python"> | ||
+ | import SimpleHTTPServer | ||
+ | import SocketServer | ||
+ | |||
+ | PORT = 80 | ||
+ | |||
+ | Handler = SimpleHTTPServer.SimpleHTTPRequestHandler | ||
+ | |||
+ | httpd = SocketServer.TCPServer(("", PORT), Handler) | ||
+ | |||
+ | print "serving at port", PORT | ||
+ | httpd.serve_forever() | ||
+ | </source> | ||
+ | |||
+ | $ python webserver.py | ||
+ | |||
+ | При наличии в папке со скриптом файла index.html сервер поднимется автоматически. | ||
+ | |||
+ | === Добавление слоев в сборку === | ||
+ | |||
+ | [https://www.srns.ru/wiki/Blog:DneprovD/18.07.2019_Yocto_layers Переехало в статью] | ||
+ | |||
+ | |||
+ | |||
[[Категория:HOWTO]] | [[Категория:HOWTO]] | ||
Строка 835: | Строка 1734: | ||
[[Category:Clonicus]] | [[Category:Clonicus]] | ||
− | |||
{{wl-publish: 2018-05-16 10:06:30 +0300 | Lipa }} | {{wl-publish: 2018-05-16 10:06:30 +0300 | Lipa }} |
Версия 12:16, 5 мая 2022
Требования
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 (0x0A) в наших данных меняется на символы CR LF, т.е. (0x0D0A). И тогда, в нашем битовом потоке меняется размер и содержимое и парсеры работают некорректно. Старый линукс на Ориксах добавляет только 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
Итоговый system-user.dtsi
Меняем номера uart, чтобы системным был ttyPS1, а пользовательским ttyPS0
/ {
aliases {
serial0 = &uart0;
serial1 = &uart1;
};
};
&gem0{
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";
};
};
};
/ {
chosen {
bootargs = "console=ttyPS1,115200 earlyprintk uio_pdrv_genirq.of_id=generic-uio";
stdout-path = "serial1:115200n8";
};
};
&amba {
hififo: hififo@40000000 {
compatible = "generic-uio";
interrupt-parent = <&intc>;
interrupts = <0 29 1>;
reg = <0x40000000 0x1000 0x18000000 0x8000000>;
};
};
&uart0{
port-number = <0>;
};
&uart1{
port-number = <1>;
};
В 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
QSPI Flash
для работы по флешь памяти как в ките (S25FL128S) - оставляем в дев.три родные compatible = "n25q512a","micron,m25p80";
SWDT System Watchdog Timer
- Модифицируем Uenv для настройки wawtchdog через uboot:
swdt_set=run swdt_ccr && run swdt_rst && run swdt_zmr
swdt_ccr=mw 0xf8005004 0x92063b
swdt_rst=mw 0xf8005008 0x1999
swdt_zmr=mw 0xf8005000 0xabc043
- Создаем скрипт для сброса watchdog:
swdt_rst.sh
- Добавляем вызов скрипта в автозагрузку
PS Посмотреть можно в проекте bin/Clonicus, коммит ffc437e435d3b5c207bb1186a9561fd06a46d89f
RTC
- Включаем в ядро подходящий драйвер
- Модифицируем device-tree
Вставляем в девайс три:
i2c0: i2c@e0004000 {
clock-frequency = <0xC350>;
rtc@51 {
compatible = "nxp,pcf85363";
reg = <0x51>;
};
};
i2c1: i2c@e0005000 {
clock-frequency = <0xC350>;
};
};
Будет выглядеть так:
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 = <0xc350>;
rtc@51 {
compatible = "nxp,pcf85363";
reg = <0x51>;
};
};
i2c@e0005000 {
compatible = "cdns,i2c-r1p10";
status = "okay";
clocks = <0x1 0x27>;
interrupt-parent = <0x4>;
interrupts = <0x0 0x30 0x4>;
reg = <0xe0005000 0x1000>;
#address-cells = <0x1>;
#size-cells = <0x0>;
clock-frequency = <0xc350>;
};
Если готового драйвера нет:
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МБайт - указываем размер битника с запасом. Теоретически может так не работать, но работает
ETH over TTY
В ядре включаем: slip, Universal TUN/TAP
В rootfs включаем net-tools
Включаем iptables для перемршрутизации между подсетями и для него:
Networking Options --->
[*] Network packet filtering framework (Netfilter) ---> [CONFIG_NETFILTER]
[*] Advanced netfilter configuration [CONFIG_NETFILTER_ADVANCED]
Core Netfilter Configuration --->
<*/M> Netfilter connection tracking support [CONFIG_NF_CONNTRACK]
<*/M> Netfilter Xtables support (required for ip_tables) [CONFIG_NETFILTER_XTABLES]
<*/M> LOG target support [CONFIG_NETFILTER_XT_TARGET_LOG]
IP: Netfilter Configuration --->
<*/M> IP tables support (required for filtering/masq/NAT) [CONFIG_IP_NF_IPTABLES]
PC1:
slattach -L -s 115200 -p slip /dev/ttyPS1 &
ifconfig sl0 192.168.1.1/24 up
route add default gw 192.168.1.1 sl0
PC2:
slattach -L -s 115200 -p slip /dev/ttyPS1 &
ifconfig sl0 192.168.1.2/24 up
route add default gw 192.168.1.1 sl0
UART_PL
Включаем в настройках ядра поддержку uart_lite, выставляем правильное максимальное число уартов
Модифицируем system-user.dtsi
Обращаем внимание на нумерацию serial, axi_uartlite, она должна не повторяться. То же самое с interrupts Указываем верный физический адрес на шине и диапазон адресов в <reg>
/ {
aliases {
serial2 = &axi_uartlite_0;
serial3 = &axi_uartlite_1;
};
};
/ {
amba_pl {
#address-cells = <0x1>;
#size-cells = <0x1>;
compatible = "simple-bus";
ranges;
axi_uartlite_0: serial@80000008 {
clock-names = "ref_clk";
clocks = <&clkc 0>;
compatible = "xlnx,xps-uartlite-1.00.a";
current-speed = <115200>;
device_type = "serial";
interrupt-parent = <&intc>;
interrupts = <0 30 1>;
port-number = <3>;
reg = <0x80000008 0x10>;
xlnx,baudrate = <0x1c200>;
xlnx,data-bits = <0x8>;
xlnx,odd-parity = <0x0>;
xlnx,s-axi-aclk-freq-hz-d = "100.0";
xlnx,use-parity = <0x0>;
};
axi_uartlite_1: serial@8000001C {
clock-names = "ref_clk";
clocks = <&clkc 0>;
compatible = "xlnx,xps-uartlite-1.00.a";
current-speed = <115200>;
device_type = "serial";
interrupt-parent = <&intc>;
interrupts = <0 31 1>;
port-number = <4>;
reg = <0x8000001C 0x10>;
xlnx,baudrate = <0x1c200>;
xlnx,data-bits = <0x8>;
xlnx,odd-parity = <0x0>;
xlnx,s-axi-aclk-freq-hz-d = "100.0";
xlnx,use-parity = <0x0>;
};
};
};
Если ПЛИС не прошита - будет кернел паник
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
Оживление 2-го ядра
- Находим /home/ivan/clonicus_1.2.3/build/tmp/work-shared/plnx_arm/kernel-source/arch/arm/mach-zynq/efuse.c
- В функции zynq_efuse_cpu_state делаем сразу ретурн тру
- Че-нибудь меняем в настройках ядра для пересборки
- Выполняем:
petalinux-build -c kernel -x deploy -f
petalinux-build
- Забираем image.ub
ИЛИ
Правим device-tree, заменяем адрес efuse на 0xf800cff0
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 сервер поднимется автоматически.
[ Хронологический вид ]Комментарии
Войдите, чтобы комментировать.