16.05.2018 PetaLinux

Материал из SRNS
Перейти к: навигация, поиск
(petalinux-config)
 
(не показаны 258 промежуточных версий 4 участников)
Строка 6: Строка 6:
  
 
</summary>
 
</summary>
 
{{Форма3}}
 
  
 
== Требования ==
 
== Требования ==
 +
 +
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/2017-4.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
  
 
Подготовка завершена
 
Подготовка завершена
 +
 +
== Правка Vivado ==
 +
 +
Для поддержки MDIO в Vivado 17.1-17.4 нужен [https://www.xilinx.com/support/answers/69132.html патч]. Ставим!
 +
 +
'''Не помогло.''' Ставим 2018.1
  
 
== Сборка ==
 
== Сборка ==
Строка 64: Строка 74:
  
 
Необходимо править netboot offset если оперативной памяти менее ~256МБ
 
Необходимо править netboot offset если оперативной памяти менее ~256МБ
 +
 +
Для клоникуса с 256МБ ставим 8'000'000
  
 
<source lang="bash">
 
<source lang="bash">
Строка 73: Строка 85:
 
     netboot offset
 
     netboot offset
 
</source>
 
</source>
 +
 +
Выставляем точку начала распаковки образа системы
 +
 +
Выключаем копирование образа по sftp (Image Packaging Configuration -> Copy final images)
 +
 +
Отключаем интернет-sstate (Yocto Settings -> Enable Network sstate feeds)
 +
 +
=== petalinux-config -c kernel===
 +
 +
* Подключаем в ядре поддержку физика и его дров.
 +
 +
<source lang="bash">
 +
$ petalinux-config -c kernel
 +
</source>
 +
 +
'''для oryx:'''
 +
 +
<source lang="bash">
 +
Device Drivers->
 +
    [*]Network device support ->
 +
          [*]Ethernet driver support ->
 +
              [*] Micrel devices
 +
          [*] PHY Device support and infastructure -->
 +
              [*] 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>
 +
 +
=== petalinux-config -c rootfs ===
 +
 +
Подключаем при необходимости 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
 +
 +
'''Необходимо убедиться, что  образ может распаковаться в размер оперативы'''
 +
 +
 +
Если будут проблемы, то надо будет править netboot offset
 +
 +
=== device tree ===
 +
 +
Если необходимо внести изменения в device tree, то смотрим конец статьи
 +
 +
[https://xilinx-wiki.atlassian.net/wiki/spaces/A/pages/18841676/U-Boot+Flattened+Device+Tree Интересная статья по правке devicetree из uboot]
 +
 +
=== Сборка проекта ===
  
 
* далее (сборка идет 30-60 минут)
 
* далее (сборка идет 30-60 минут)
 
<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>
  
Строка 105: Строка 208:
  
 
<source lang="bash">
 
<source lang="bash">
$ fatload mmc 0 0x8000000 image.ub
+
$ fatload mmc 0 0xA000000 image.ub
$ bootm 0x8000000
+
$ bootm 0xA000000
 +
</source>
 +
 
 +
либо
 +
 
 +
<source lang="bash">
 +
$ fatload mmc 0 0xA000000 image.ub
 +
$ fatload mmc 0 0x9000000 system.dtb
 +
$ bootm 0xA000000 0xA000000 0x9000000
 
</source>
 
</source>
  
Строка 117: Строка 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>
  
Строка 129: Строка 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">
$ scripts/dtc/dtc -I dtb -O dts -o /path/to/fromdtb.dts /path/to/booted_with_this.dtb
+
$ dtc -I dtb -O dts -o <name>.dts <name>.dtb
 
</source>
 
</source>
 +
 +
Для сборки device-tree
 +
<source lang="bash">
 +
$ dtc -I dts -O dtb -o <name>.dtb <name>.dts
 +
</source>
 +
 +
== Модификация device-tree ==
 +
 +
После долгих мучений получилось поднять DP83867 только после добавления модификатора в файл [https://forums.xilinx.com/t5/Embedded-Linux/ZC702-Like-Board-with-DP83867CR-Ethernet-Petalinux-2017-4/td-p/831873 волшебная статья]
 +
 +
[https://www.kernel.org/doc/Documentation/devicetree/bindings/net/ti%2Cdp83867.txt описание параметров]
 +
 +
project-spec/meta-user/recipes-bsp/device-tree/files/system-user.dtsi
 +
 +
=== Single Kit-board eth ===
 +
 +
В Vivado включен eth1(с mdio) и выключен eth0.
 +
 +
'''Так работает'''
 +
 +
<source lang="bash">
 +
&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";
 +
        };
 +
    };
 +
};
 +
</source>
 +
 +
{{Начало скрытого блока|Выравнивание_заголовка = left| Ссылка = left|Заголовок =  Развернутый .dtb:}}
 +
<source lang="bash">
 +
/dts-v1/;
 +
 +
/ {
 +
#address-cells = <0x1>;
 +
#size-cells = <0x1>;
 +
compatible = "xlnx,zynq-7000";
 +
 +
cpus {
 +
#address-cells = <0x1>;
 +
#size-cells = <0x0>;
 +
 +
cpu@0 {
 +
compatible = "arm,cortex-a9";
 +
device_type = "cpu";
 +
reg = <0x0>;
 +
clocks = <0x1 0x3>;
 +
clock-latency = <0x3e8>;
 +
cpu0-supply = <0x2>;
 +
operating-points = <0xa2c2a 0xf4240 0x51615 0xf4240>;
 +
};
 +
 +
cpu@1 {
 +
compatible = "arm,cortex-a9";
 +
device_type = "cpu";
 +
reg = <0x1>;
 +
clocks = <0x1 0x3>;
 +
};
 +
};
 +
 +
fpga-full {
 +
compatible = "fpga-region";
 +
fpga-mgr = <0x3>;
 +
#address-cells = <0x1>;
 +
#size-cells = <0x1>;
 +
ranges;
 +
};
 +
 +
pmu@f8891000 {
 +
compatible = "arm,cortex-a9-pmu";
 +
interrupts = <0x0 0x5 0x4 0x0 0x6 0x4>;
 +
interrupt-parent = <0x4>;
 +
reg = <0xf8891000 0x1000 0xf8893000 0x1000>;
 +
};
 +
 +
fixedregulator {
 +
compatible = "regulator-fixed";
 +
regulator-name = "VCCPINT";
 +
regulator-min-microvolt = <0xf4240>;
 +
regulator-max-microvolt = <0xf4240>;
 +
regulator-boot-on;
 +
regulator-always-on;
 +
linux,phandle = <0x2>;
 +
phandle = <0x2>;
 +
};
 +
 +
amba {
 +
u-boot,dm-pre-reloc;
 +
compatible = "simple-bus";
 +
#address-cells = <0x1>;
 +
#size-cells = <0x1>;
 +
interrupt-parent = <0x4>;
 +
ranges;
 +
 +
adc@f8007100 {
 +
compatible = "xlnx,zynq-xadc-1.00.a";
 +
reg = <0xf8007100 0x20>;
 +
interrupts = <0x0 0x7 0x4>;
 +
interrupt-parent = <0x4>;
 +
clocks = <0x1 0xc>;
 +
};
 +
 +
can@e0008000 {
 +
compatible = "xlnx,zynq-can-1.0";
 +
status = "disabled";
 +
clocks = <0x1 0x13 0x1 0x24>;
 +
clock-names = "can_clk", "pclk";
 +
reg = <0xe0008000 0x1000>;
 +
interrupts = <0x0 0x1c 0x4>;
 +
interrupt-parent = <0x4>;
 +
tx-fifo-depth = <0x40>;
 +
rx-fifo-depth = <0x40>;
 +
};
 +
 +
can@e0009000 {
 +
compatible = "xlnx,zynq-can-1.0";
 +
status = "disabled";
 +
clocks = <0x1 0x14 0x1 0x25>;
 +
clock-names = "can_clk", "pclk";
 +
reg = <0xe0009000 0x1000>;
 +
interrupts = <0x0 0x33 0x4>;
 +
interrupt-parent = <0x4>;
 +
tx-fifo-depth = <0x40>;
 +
rx-fifo-depth = <0x40>;
 +
};
 +
 +
gpio@e000a000 {
 +
compatible = "xlnx,zynq-gpio-1.0";
 +
#gpio-cells = <0x2>;
 +
clocks = <0x1 0x2a>;
 +
gpio-controller;
 +
interrupt-controller;
 +
#interrupt-cells = <0x2>;
 +
interrupt-parent = <0x4>;
 +
interrupts = <0x0 0x14 0x4>;
 +
reg = <0xe000a000 0x1000>;
 +
emio-gpio-width = <0x40>;
 +
gpio-mask-high = <0x0>;
 +
gpio-mask-low = <0x5600>;
 +
};
 +
 +
i2c@e0004000 {
 +
compatible = "cdns,i2c-r1p10";
 +
status = "disabled";
 +
clocks = <0x1 0x26>;
 +
interrupt-parent = <0x4>;
 +
interrupts = <0x0 0x19 0x4>;
 +
reg = <0xe0004000 0x1000>;
 +
#address-cells = <0x1>;
 +
#size-cells = <0x0>;
 +
};
 +
 +
i2c@e0005000 {
 +
compatible = "cdns,i2c-r1p10";
 +
status = "disabled";
 +
clocks = <0x1 0x27>;
 +
interrupt-parent = <0x4>;
 +
interrupts = <0x0 0x30 0x4>;
 +
reg = <0xe0005000 0x1000>;
 +
#address-cells = <0x1>;
 +
#size-cells = <0x0>;
 +
};
 +
 +
interrupt-controller@f8f01000 {
 +
compatible = "arm,cortex-a9-gic";
 +
#interrupt-cells = <0x3>;
 +
interrupt-controller;
 +
reg = <0xf8f01000 0x1000 0xf8f00100 0x100>;
 +
num_cpus = <0x2>;
 +
num_interrupts = <0x60>;
 +
linux,phandle = <0x4>;
 +
phandle = <0x4>;
 +
};
 +
 +
cache-controller@f8f02000 {
 +
compatible = "arm,pl310-cache";
 +
reg = <0xf8f02000 0x1000>;
 +
interrupts = <0x0 0x2 0x4>;
 +
arm,data-latency = <0x3 0x2 0x2>;
 +
arm,tag-latency = <0x2 0x2 0x2>;
 +
cache-unified;
 +
cache-level = <0x2>;
 +
};
 +
 +
memory-controller@f8006000 {
 +
compatible = "xlnx,zynq-ddrc-a05";
 +
reg = <0xf8006000 0x1000>;
 +
};
 +
 +
ocmc@f800c000 {
 +
compatible = "xlnx,zynq-ocmc-1.0";
 +
interrupt-parent = <0x4>;
 +
interrupts = <0x0 0x3 0x4>;
 +
reg = <0xf800c000 0x1000>;
 +
};
 +
 +
serial@e0000000 {
 +
compatible = "xlnx,xuartps", "cdns,uart-r1p8";
 +
status = "okay";
 +
clocks = <0x1 0x17 0x1 0x28>;
 +
clock-names = "uart_clk", "pclk";
 +
reg = <0xe0000000 0x1000>;
 +
interrupts = <0x0 0x1b 0x4>;
 +
device_type = "serial";
 +
port-number = <0x0>;
 +
};
 +
 +
serial@e0001000 {
 +
compatible = "xlnx,xuartps", "cdns,uart-r1p8";
 +
status = "disabled";
 +
clocks = <0x1 0x18 0x1 0x29>;
 +
clock-names = "uart_clk", "pclk";
 +
reg = <0xe0001000 0x1000>;
 +
interrupts = <0x0 0x32 0x4>;
 +
};
 +
 +
spi@e0006000 {
 +
compatible = "xlnx,zynq-spi-r1p6";
 +
reg = <0xe0006000 0x1000>;
 +
status = "disabled";
 +
interrupt-parent = <0x4>;
 +
interrupts = <0x0 0x1a 0x4>;
 +
clocks = <0x1 0x19 0x1 0x22>;
 +
clock-names = "ref_clk", "pclk";
 +
#address-cells = <0x1>;
 +
#size-cells = <0x0>;
 +
};
 +
 +
spi@e0007000 {
 +
compatible = "xlnx,zynq-spi-r1p6";
 +
reg = <0xe0007000 0x1000>;
 +
status = "disabled";
 +
interrupt-parent = <0x4>;
 +
interrupts = <0x0 0x31 0x4>;
 +
clocks = <0x1 0x1a 0x1 0x23>;
 +
clock-names = "ref_clk", "pclk";
 +
#address-cells = <0x1>;
 +
#size-cells = <0x0>;
 +
};
 +
 +
spi@e000d000 {
 +
clock-names = "ref_clk", "pclk";
 +
clocks = <0x1 0xa 0x1 0x2b>;
 +
compatible = "xlnx,zynq-qspi-1.0";
 +
status = "disabled";
 +
interrupt-parent = <0x4>;
 +
interrupts = <0x0 0x13 0x4>;
 +
reg = <0xe000d000 0x1000>;
 +
#address-cells = <0x1>;
 +
#size-cells = <0x0>;
 +
};
 +
 +
memory-controller@e000e000 {
 +
#address-cells = <0x1>;
 +
#size-cells = <0x1>;
 +
status = "disabled";
 +
clock-names = "memclk", "aclk";
 +
clocks = <0x1 0xb 0x1 0x2c>;
 +
compatible = "arm,pl353-smc-r2p1";
 +
interrupt-parent = <0x4>;
 +
interrupts = <0x0 0x12 0x4>;
 +
ranges;
 +
reg = <0xe000e000 0x1000>;
 +
 +
flash@e1000000 {
 +
status = "disabled";
 +
compatible = "arm,pl353-nand-r2p1";
 +
reg = <0xe1000000 0x1000000>;
 +
#address-cells = <0x1>;
 +
#size-cells = <0x1>;
 +
};
 +
 +
flash@e2000000 {
 +
status = "disabled";
 +
compatible = "cfi-flash";
 +
reg = <0xe2000000 0x2000000>;
 +
#address-cells = <0x1>;
 +
#size-cells = <0x1>;
 +
};
 +
};
 +
 +
ethernet@e000b000 {
 +
compatible = "cdns,zynq-gem", "cdns,gem";
 +
reg = <0xe000b000 0x1000>;
 +
status = "disabled";
 +
interrupts = <0x0 0x16 0x4>;
 +
clocks = <0x1 0x1e 0x1 0x1e 0x1 0xd>;
 +
clock-names = "pclk", "hclk", "tx_clk";
 +
#address-cells = <0x1>;
 +
#size-cells = <0x0>;
 +
};
 +
 +
ethernet@e000c000 {
 +
compatible = "cdns,zynq-gem", "cdns,gem";
 +
reg = <0xe000c000 0x1000>;
 +
status = "okay";
 +
interrupts = <0x0 0x2d 0x4>;
 +
clocks = <0x1 0x1f 0x1 0x1f 0x1 0xe>;
 +
clock-names = "pclk", "hclk", "tx_clk";
 +
#address-cells = <0x1>;
 +
#size-cells = <0x0>;
 +
phy-mode = "rgmii-id";
 +
xlnx,ptp-enet-clock = <0x69f6bcb>;
 +
local-mac-address = [00 0a 35 00 22 01];
 +
phy-handle = <0x5>;
 +
xlnx,eth-mode = <0x1>;
 +
 +
mdio {
 +
status = "okay";
 +
#address-cells = <0x1>;
 +
#size-cells = <0x0>;
 +
 +
phy@12 {
 +
compatible = "ethernet-phy-ieee802.3-c22";
 +
device_type = "ethernet-phy";
 +
reg = <0xc>;
 +
ti,rx-internal-delay = <0x8>;
 +
ti,tx-internal-delay = <0xa>;
 +
ti,fifo-depth = <0x1>;
 +
ti,min-output-impedance;
 +
ti,dp83867-rxctrl-strap-quirk;
 +
status = "okay";
 +
linux,phandle = <0x5>;
 +
phandle = <0x5>;
 +
};
 +
};
 +
};
 +
 +
sdhci@e0100000 {
 +
compatible = "arasan,sdhci-8.9a";
 +
status = "okay";
 +
clock-names = "clk_xin", "clk_ahb";
 +
clocks = <0x1 0x15 0x1 0x20>;
 +
interrupt-parent = <0x4>;
 +
interrupts = <0x0 0x18 0x4>;
 +
reg = <0xe0100000 0x1000>;
 +
xlnx,has-cd = <0x1>;
 +
xlnx,has-power = <0x0>;
 +
xlnx,has-wp = <0x0>;
 +
};
 +
 +
sdhci@e0101000 {
 +
compatible = "arasan,sdhci-8.9a";
 +
status = "disabled";
 +
clock-names = "clk_xin", "clk_ahb";
 +
clocks = <0x1 0x16 0x1 0x21>;
 +
interrupt-parent = <0x4>;
 +
interrupts = <0x0 0x2f 0x4>;
 +
reg = <0xe0101000 0x1000>;
 +
};
 +
 +
slcr@f8000000 {
 +
u-boot,dm-pre-reloc;
 +
#address-cells = <0x1>;
 +
#size-cells = <0x1>;
 +
compatible = "xlnx,zynq-slcr", "syscon", "simple-mfd";
 +
reg = <0xf8000000 0x1000>;
 +
ranges;
 +
linux,phandle = <0x6>;
 +
phandle = <0x6>;
 +
 +
clkc@100 {
 +
u-boot,dm-pre-reloc;
 +
#clock-cells = <0x1>;
 +
compatible = "xlnx,ps7-clkc";
 +
fclk-enable = <0x0>;
 +
clock-output-names = "armpll", "ddrpll", "iopll", "cpu_6or4x", "cpu_3or2x", "cpu_2x", "cpu_1x", "ddr2x", "ddr3x", "dci", "lqspi", "smc", "pcap", "gem0", "gem1", "fclk0", "fclk1", "fclk2", "fclk3", "can0", "can1", "sdio0", "sdio1", "uart0", "uart1", "spi0", "spi1", "dma", "usb0_aper", "usb1_aper", "gem0_aper", "gem1_aper", "sdio0_aper", "sdio1_aper", "spi0_aper", "spi1_aper", "can0_aper", "can1_aper", "i2c0_aper", "i2c1_aper", "uart0_aper", "uart1_aper", "gpio_aper", "lqspi_aper", "smc_aper", "swdt", "dbg_trc", "dbg_apb";
 +
reg = <0x100 0x100>;
 +
ps-clk-frequency = <0x1fca055>;
 +
linux,phandle = <0x1>;
 +
phandle = <0x1>;
 +
};
 +
 +
rstc@200 {
 +
compatible = "xlnx,zynq-reset";
 +
reg = <0x200 0x48>;
 +
#reset-cells = <0x1>;
 +
syscon = <0x6>;
 +
};
 +
 +
pinctrl@700 {
 +
compatible = "xlnx,pinctrl-zynq";
 +
reg = <0x700 0x200>;
 +
syscon = <0x6>;
 +
};
 +
};
 +
 +
dmac@f8003000 {
 +
compatible = "arm,pl330", "arm,primecell";
 +
reg = <0xf8003000 0x1000>;
 +
interrupt-parent = <0x4>;
 +
interrupt-names = "abort", "dma0", "dma1", "dma2", "dma3", "dma4", "dma5", "dma6", "dma7";
 +
interrupts = <0x0 0xd 0x4 0x0 0xe 0x4 0x0 0xf 0x4 0x0 0x10 0x4 0x0 0x11 0x4 0x0 0x28 0x4 0x0 0x29 0x4 0x0 0x2a 0x4 0x0 0x2b 0x4>;
 +
#dma-cells = <0x1>;
 +
#dma-channels = <0x8>;
 +
#dma-requests = <0x4>;
 +
clocks = <0x1 0x1b>;
 +
clock-names = "apb_pclk";
 +
};
 +
 +
devcfg@f8007000 {
 +
compatible = "xlnx,zynq-devcfg-1.0";
 +
interrupt-parent = <0x4>;
 +
interrupts = <0x0 0x8 0x4>;
 +
reg = <0xf8007000 0x100>;
 +
clocks = <0x1 0xc 0x1 0xf 0x1 0x10 0x1 0x11 0x1 0x12>;
 +
clock-names = "ref_clk", "fclk0", "fclk1", "fclk2", "fclk3";
 +
syscon = <0x6>;
 +
linux,phandle = <0x3>;
 +
phandle = <0x3>;
 +
};
 +
 +
efuse@f800d000 {
 +
compatible = "xlnx,zynq-efuse";
 +
reg = <0xf800d000 0x20>;
 +
};
 +
 +
timer@f8f00200 {
 +
compatible = "arm,cortex-a9-global-timer";
 +
reg = <0xf8f00200 0x20>;
 +
interrupts = <0x1 0xb 0x301>;
 +
interrupt-parent = <0x4>;
 +
clocks = <0x1 0x4>;
 +
};
 +
 +
timer@f8001000 {
 +
interrupt-parent = <0x4>;
 +
interrupts = <0x0 0xa 0x4 0x0 0xb 0x4 0x0 0xc 0x4>;
 +
compatible = "cdns,ttc";
 +
clocks = <0x1 0x6>;
 +
reg = <0xf8001000 0x1000>;
 +
};
 +
 +
timer@f8002000 {
 +
interrupt-parent = <0x4>;
 +
interrupts = <0x0 0x25 0x4 0x0 0x26 0x4 0x0 0x27 0x4>;
 +
compatible = "cdns,ttc";
 +
clocks = <0x1 0x6>;
 +
reg = <0xf8002000 0x1000>;
 +
};
 +
 +
timer@f8f00600 {
 +
interrupt-parent = <0x4>;
 +
interrupts = <0x1 0xd 0x301>;
 +
compatible = "arm,cortex-a9-twd-timer";
 +
reg = <0xf8f00600 0x20>;
 +
clocks = <0x1 0x4>;
 +
};
 +
 +
usb@e0002000 {
 +
compatible = "xlnx,zynq-usb-2.20a", "chipidea,usb2";
 +
status = "disabled";
 +
clocks = <0x1 0x1c>;
 +
interrupt-parent = <0x4>;
 +
interrupts = <0x0 0x15 0x4>;
 +
reg = <0xe0002000 0x1000>;
 +
phy_type = "ulpi";
 +
};
 +
 +
usb@e0003000 {
 +
compatible = "xlnx,zynq-usb-2.20a", "chipidea,usb2";
 +
status = "disabled";
 +
clocks = <0x1 0x1d>;
 +
interrupt-parent = <0x4>;
 +
interrupts = <0x0 0x2c 0x4>;
 +
reg = <0xe0003000 0x1000>;
 +
phy_type = "ulpi";
 +
};
 +
 +
watchdog@f8005000 {
 +
clocks = <0x1 0x2d>;
 +
compatible = "cdns,wdt-r1p2";
 +
interrupt-parent = <0x4>;
 +
interrupts = <0x0 0x9 0x1>;
 +
reg = <0xf8005000 0x1000>;
 +
timeout-sec = <0xa>;
 +
};
 +
};
 +
 +
chosen {
 +
bootargs = "console=ttyPS0,115200 earlyprintk";
 +
stdout-path = "serial0:115200n8";
 +
};
 +
 +
aliases {
 +
ethernet0 = "/amba/ethernet@e000c000";
 +
serial0 = "/amba/serial@e0000000";
 +
};
 +
 +
memory {
 +
device_type = "memory";
 +
reg = <0x0 0x10000000>;
 +
};
 +
};
 +
 +
</source>
 +
{{Конец скрытого блока}}
 +
 +
=== Single On-board eth ===
 +
 +
В Vivado включен eth0(с mdio) и выключен eth1.
 +
 +
'''Работает гигабит через type-c! Работает hot plug. Успех.'''
 +
 +
<source lang="bash">
 +
&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";
 +
        };
 +
    };
 +
};
 +
</source>
 +
 +
=== Dual eth ===
 +
 +
[https://forums.xilinx.com/t5/Embedded-Linux/Dual-phys-on-MDIO-EMIO/td-p/737716 интересная статья о дуал eth]
 +
 +
Попытка поднять два физика. '''Пока не работает'''
 +
 +
<source lang="bash">
 +
&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>;
 +
};
 +
</source>
 +
 +
=== 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.
 +
Pullup пока что все включены
 +
 +
[https://github.com/Xilinx/u-boot-xlnx/blob/master/doc/device-tree-bindings/net/micrel-ksz90x1.txt статья в помощь]
 +
 +
'''Работает'''
 +
 +
На новых платах(с отпаянными линиями линиями eth):
 +
* на полноценных проводах с ходу
 +
* на обкусанных проводах только если выставить 10 в 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">
 +
&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";
 +
        };
 +
    };
 +
};
 +
</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]]
Строка 138: Строка 1734:
 
[[Category:Clonicus]]
 
[[Category:Clonicus]]
  
{{wl-publish: 2018-04-12 16:56:17 +0300 | Lipa }}
 
 
{{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
$ 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 (0x0A) в наших данных меняется на символы CR LF, т.е. (0x0D0A). И тогда, в нашем битовом потоке меняется размер и содержимое и парсеры работают некорректно. Старый линукс на Ориксах добавляет только 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

Итоговый system-user.dtsi

Меняем номера uart, чтобы системным был ttyPS1, а пользовательским ttyPS0

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


В 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 -y -r 0

Статья по i2c и RTC

[править] QSPI Flash

для работы по флешь памяти как в ките (S25FL128S) - оставляем в дев.три родные compatible = "n25q512a","micron,m25p80";

[править] SWDT System Watchdog Timer

  • Модифицируем Uenv для настройки wawtchdog через uboot:
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
  • Создаем скрипт для сброса watchdog:

swdt_rst.sh

watch -n 5 'devmem 0xf8005008 32 0x1999' &>/dev/null &
  • Добавляем вызов скрипта в автозагрузку

PS Посмотреть можно в проекте bin/Clonicus, коммит ffc437e435d3b5c207bb1186a9561fd06a46d89f

[править] RTC

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

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

&amba {
    i2c0: i2c@e0004000 {
        clock-frequency = <0xC350>;
        rtc@51 {
                compatible = "nxp,pcf85363";
                reg = <0x51>;
        };
    };
    i2c1: i2c@e0005000 {
        clock-frequency = <0xC350>;
    };
};

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

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

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

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МБайт - указываем размер битника с запасом. Теоретически может так не работать, но работает

[править] ETH over TTY

В ядре включаем: slip, Universal TUN/TAP

В rootfs включаем net-tools

Включаем iptables для перемршрутизации между подсетями и для него:

[*] 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]

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>

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

Если ПЛИС не прошита - будет кернел паник

[править] 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 четыре


[править] Оживление 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 compile -f
petalinux-build -c kernel -x deploy -f
petalinux-build
  • Забираем image.ub

ИЛИ

Правим device-tree, заменяем адрес efuse на 0xf800cff0

[править] 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 сервер поднимется автоматически.

[править] Добавление слоев в сборку

Переехало в статью

[ Иерархический вид ]Комментарии

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

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

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

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