16.05.2018 PetaLinux

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


Содержание

Требования

Vivado 2018.1 (для single-gigabit ethernet можно более ранние версии)

Начиная с petalinux_2018.1 отсутствует devcfg. Необходимо использовать FPGA manager. Технология нами пока не освоена

Необходима Ubuntu-16.04

Требуется поставить ряд пакетов, полный список приведен в документе UG1144

Устанавливаем PetaLinux в систему. Дистрибутив есть на Xilinx, либо у меня на компьютере. Ставить PetaLinux необходимо БЕЗ прав суперюзера!

Подготовка завершена

Правка 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

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

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)

Необходимо убедиться, что добавление libstdc и gdb не увеличивает образ на столько, что он не может распаковаться в 0x8000000


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

device tree

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

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

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

  • далее (сборка идет 30-60 минут)
petalinux-build
  • делаем boot.bin
$ petalinux-package --boot --format BIN --fsbl ./zynq_fsbl.elf --u-boot --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
  • Пишем run MAC
  • Редактируем 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 следующие строки:

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

device tree

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

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

пример

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

$ scripts/dtc/dtc -I dtb -O dts -o /path/to/fromdtb.dts /path/to/booted_with_this.dtb

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

$ dtc -I dts -O dtb -o <devicetree name>.dtb <devicetree 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
&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. Остальные комбинации плат-кабелей надо проверять

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

} ;

WiFi Dongle

раз

WiFi ESP

Xilinx SDIP WiFi

Zedboard раз

два

picozed три

zedboard четыре

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

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

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

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

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