16.05.2018 PetaLinux

Материал из SRNS
Перейти к: навигация, поиск


Содержание

Требования

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
$ petalinux-create --type project --template zynq --name <PROJECT>
  • переходим в папку с текущим проектом
  • подключаем файл .hdf
$ petalinux-config --get-hw-description=[путь к папке с файлом .hdf]
  • перед сборкой системы необходимо выполнить все команды конфигурации в данной последовательности:
$ petalinux-config

$ petalinux-config -c kernel

$ petalinux-config -c rootfs

petalinux-config

Если хотим спользовать внешний файл device-tree включаем:

Subsystem AUTO Hardware Settings->
     Advances bootable images storage settings->
          dtb image settings->
               image storage media
                    primary sd

Необходимо править netboot offset если оперативной памяти менее ~256МБ

Для клоникуса с 256МБ ставим 8'000'000

$ petalinux-config
u-boot Configuration->
     netboot offset

Выставляем точку начала распаковки образа системы

Выключаем копирование образа по sftp (Image Packaging Configuration -> Copy final images)

Отключаем интернет-sstate (Yocto Settings -> Enable Network sstate feeds)

petalinux-config -c kernel

  • Подключаем в ядре поддержку физика и его дров.
$ petalinux-config -c kernel

для oryx:

Device Drivers->
     [*]Network device support ->
          [*]Ethernet driver support ->
               [*] Micrel devices
          [*] PHY Device support and infastructure -->
               [*] Drivers for Micrel PHYs

для clonicus:

Device Drivers->
     [*]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)

Filesystem Packages->
     misc ->
          gcc-runtime ->
               [*] libstdc ++
          gdb -->
               [*] gdb
          glib-2.0
               [*] glib-2.0
          glibc
               [*] glibc
               [*] ldd
     devel ->
          python ->
               python ->
                    [*] python

Опционально:

Filesystem Packages->
     base ->
          i2c-tools ->
               [*] i2c-tools
          usbutils ->
               [*] usbutils
     console ->
          network ->
               ethtool ->
                    [*] ethtool // необходимо для oryx! для перенастройки autonegotiation

Можно еще подключать дебаг i2c

Необходимо убедиться, что образ может распаковаться в размер оперативы


Если будут проблемы, то надо будет править netboot offset

device tree

Если необходимо внести изменения в device tree, то смотрим конец статьи

Интересная статья по правке devicetree из uboot

Сборка проекта

  • далее (сборка идет 30-60 минут)
petalinux-build

cd /images/linux/
  • делаем boot.bin в папке /images/linux/
$ 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
  • записываем в загрузочную область флешки файлы boot.bin и image.ub

Всякое

Если мало памяти как у нас - возможна ошибка image is not a fdt ссылка

Необходимо править netboot offset

$ petalinux-config
u-boot Configuration->
     netboot offset

Можно вручную загрузиться из u-boot'а.

$ fatload mmc 0 0xA000000 image.ub
$ bootm 0xA000000

либо

$ fatload mmc 0 0xA000000 image.ub
$ fatload mmc 0 0x9000000 system.dtb
$ bootm 0xA000000 0xA000000 0x9000000

Можно поварьировать адрес


Проверка статуса прошитости FPGA

cat /sys/class/xdevcfg/xdevcfg/device/prog_done

Uboot

Для внесения правок в загрузку линукса используем список команд env

Просмотр текущих команд printenv

Сброс настроек в дефолт env default -a

Создать переменную env set <имя> <значение>

Правка переменной env edit <имя переменной>

---

Для каждой платы делаем следующее:

  • Удаляем в конце имени ".c"
  • Записываем на флешку рядом с образом линукса
  • Запускаем плату и прерываем autoboot
  • Пишем editenv ethaddr
  • Редактируем MAC-адрес
  • Пишем saveenv
  • Все! можем ребутать reset


Сохранить в файл saveenv

Автозапуск приложений

Во-первых тыц

Далее пишем

petalinux-create -t apps --template install -n myapp-init --enable

Правим файл /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

#!/bin/sh

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 следующие строки:

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/
  • Создается ссылка на флешку, где хранятся авторизованные пользователи
  • Создается папка для хранения секретного ключа платы
  • При запуске платы свежесозданный ключ заменяется тем, что лежит на флешке
  • При первом включении платы будет создан новый ключ

Помимо добавления указанных команд в скрипт ничего больше делать не надо

Daemon

Для настройки демона:

  • Добавляем строки в файл custom_init.sh
  • Кидаем на загрузочный раздел флешки папку из архива File:daemon.rar
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/

Serial port на новом линуксе

Выяснилось, что без доп. настройки, в последовательный порт (dev/ttyPS0) после каждой посылки добавляются символы CR и LF. Оказалось, что и RTKLib, и софт Листопада не хотят работать с таким окончанием пакетов. Старый линукс на Ориксах добавляет только LF. Для решения проблемы нужно через stty выключить в настройках порта опцию onlcr (преобразовывать перевод строки в возврат каретки и новую строку).

Сделать это удалось пока только изменив скрипт демона receiver. Для решения проблемы заходим в /run/media/mmcblk0p1/daemon/receiver, и в начале секции receiver_start() {...} добавляем команду:

stty -F /dev/ttyPS0 -onlcr

device tree

Для внесения изменений в device tree добавляем нужные строки в файл

project-spec/meta-user/recipes-bsp/device-tree/files/system-user.dtsi

пример

Для разборки device-tree ссылка

$ dtc -I dtb -O dts -o <name>.dts <name>.dtb

Для сборки device-tree

$ dtc -I dts -O dtb -o <name>.dtb <name>.dts

Модификация device-tree

После долгих мучений получилось поднять DP83867 только после добавления модификатора в файл волшебная статья

описание параметров

project-spec/meta-user/recipes-bsp/device-tree/files/system-user.dtsi

Single Kit-board eth

В Vivado включен eth1(с mdio) и выключен eth0.

Так работает

&gem1{
    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. Успех.

&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@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

интересная статья о дуал eth

Попытка поднять два физика. Пока не работает

&gem0{
    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

Везде работает так:

ethtool -s eth0 speed 10 duplex full autoneg on

Спидометр показывает 2,5МБ/с, т.е. 20Мбит/с!

Можно в custom_itit.sh прописать:

ifdown eth0
ethtool -s eth0 speed 10 duplex full autoneg on
ifup eth0


&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";
        };
    };
};

В принципе, работает сеть на новой плате с нормальным кабелем без модификации devicetree. Остальные комбинации плат-кабелей надо проверять

i2c

В rootfs включаем

Filesystem Packages ->
     base ->
          i2c-tools ->
               [*] i2c-tools

Для поиска устройств можно написать

i2cdetect -r 0

Статья по i2c и RTC

RTC

  • Включаем в ядро подходящий драйвер
  • Модифицируем device-tree

Вставляем в девайс три:

&amba {
    i2c: i2c@e0004000 {
        rtc@51 {
                compatible = "nxp,pcf85363";
                reg = <0x51>;
        };
    };
};

Будет выглядеть так:

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 = <0x61a80>;

        rtc@51 {
                compatible = "nxp,pcf85363";
                reg = <0x51>;
        };
};

Если готового драйвера нет:

UG1144 pg.54

Создаем новый модуль

petalinux-create -t modules --name <name_module> --enable
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 -c <name_module>

Если ОК, собираем (собирать модуль необязательно, petalinux-build его соберет)

petalinux-build

И перепаковываем BOOT.bin

Пересобираем deveice-tree с указанием нового драйвера (petalinux-build соберет сам deveice-tree)

просмотр модулей

lsmod

загрузить драйвер можно

insmod /lib/modules/4.9.0-xilinx-v2017.4/extra/rtc-pcf85363.ko

или

modprobe rtc-pcf85363

Если все ок и в девайс три прописан правильный драйвер для устройства, то модуль будет загружен сам

Прошиваем .bit (для клоникуса нужен бит для работы PL-i2c). После этого можно пользоваться RTC

Чтение времени из rtc если этот rtc не дефолтный (у нас rtc2)

hwclock -r -f /dev/rtc2

Синхронизация rtc по системному времени

hwclock -w -f /dev/rtc2

Правим custom_init.sh для изменения default-rtc на наше устройство

rm /dev/rtc
ln -s /dev/rtc2 /dev/rtc

Установка системного времени

date --set "2013-7-31 09:30"

Запись системного времени в RTC

hwclock -w

Запись времени RTC в системное время

hwclock -s

Получить время с интеренета

rdate -s <IP address of time server>
rdate -s 132.163.96.5 (example)

При перезагрузке "reboot" система автоматически запишет системное время в RTC

FPGA CONFIG from Uboot

Для того, чтобы прошить PL из uboot используем команду:

fpga loadb 0 <ddr_file_addr> <file_size>

либо скриптами:

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 // вызов самих скриптов

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

/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>;

} ;

USB-ETHERNET

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

WiFi Dongle

раз два три

Творим:

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

rootfs

Filesystem packages ->
     network ->
          wpa-supplicant ->
               [*] wpa-supplicant

качаем файл

Модификаци инит-скрипта

cp /run/media/mmcblk0p1/wpa_supplicant.conf /etc/

mkdir /lib/firmware/
mkdir /lib/firmware/rtlwifi/
cp /run/media/mmcblk0p1/rtl8188eufw.bin /lib/firmware/rtlwifi/

WiFi ESP

Xilinx SDIP WiFi

Zedboard раз

два

picozed три

zedboard четыре


webserver


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

<!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>


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 SimpleHTTPServer
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...

QGIS server

Много непонятного.

[ Хронологический вид ]Комментарии

(нет элементов)

Войдите, чтобы комментировать.

Персональные инструменты
Пространства имён

Варианты
Действия
SRNS Wiki
Рабочие журналы
Приватный файлсервер
QNAP Сервер
Инструменты