16.05.2018 PetaLinux
Lipa (обсуждение | вклад) (→RTC) |
Lipa (обсуждение | вклад) (→RTC) |
||
Строка 1131: | Строка 1131: | ||
modprobe rtc-pcf85363 | modprobe rtc-pcf85363 | ||
</source> | </source> | ||
+ | |||
+ | '''Но!, если все ок и в девайс три прописан правильный драйвер для устройства, то модуль будет загружен сам''' | ||
Чтение времени из rtc если этот rtc не дефолтный (у нас rtc2) | Чтение времени из rtc если этот rtc не дефолтный (у нас rtc2) |
Версия 13:34, 21 марта 2019
Содержание |
Требования
Vivado 2018.1 (для single-gigabit ethernet можно более ранние версии)
Начиная с petalinux_2018.1 отсутствует devcfg. Необходимо использовать FPGA manager. Технология нами пока не освоена
Необходима Ubuntu-16.04
Требуется поставить ряд пакетов, полный список приведен в документе UG1144
Устанавливаем PetaLinux в систему. Дистрибутив есть на Xilinx, либо у меня на компьютере. Ставить PetaLinux необходимо БЕЗ прав суперюзера!
кидаем в /components/yocto/ sstate-rel-v2017.4.tar.gz
Подготовка завершена
Правка Vivado
Для поддержки MDIO в Vivado 17.1-17.4 нужен патч. Ставим!
Не помогло. Ставим 2018.1
Сборка
Пошаговое руководство по сборке содержится в документе UG1156
В консоли пишем source/[путь к петалинух]/settings.sh
Выполняем шаги из UG1156 по главе 5:
- экспортируем из Vivado .hdf (в блок дизайн File->Export->Export Hardware)
- создаем проект PetaLinux
- переходим в папку с текущим проектом
- подключаем файл .hdf
- перед сборкой системы необходимо выполнить все команды конфигурации в данной последовательности:
$ petalinux-config -c kernel
$ petalinux-config -c rootfs
petalinux-config
Если хотим спользовать внешний файл device-tree включаем:
Advances bootable images storage settings->
dtb image settings->
image storage media
primary sd
Необходимо править netboot offset если оперативной памяти менее ~256МБ
Для клоникуса с 256МБ ставим 8'000'000
netboot offset
Выставляем точку начала распаковки образа системы
Выключаем копирование образа по sftp и отключаем интернет-sstate
petalinux-config -c kernel
- Подключаем в ядре поддержку физика и его дров.
для oryx:
[*]Network device support ->
[*]Ethernet driver support ->
[*] Micrel devices
[*] PHY Device support and infastructure -->
[*] Drivers for Micrel PHYs
для clonicus:
[*]Network device support ->
[*] PHY Device support and infastructure -->
[*] Texas Instruments DP83867 Gigabit PHY
petalinux-config -c rootfs
Подключаем при необходимости ethtool, gdbserver(просто gdb не заработал), libstdc, libgcc, glib2.0, glibc(glibc & ltd)
misc ->
gcc-runtime ->
[*] libstdc ++
gdb -->
[*] gdb
glib-2.0
[*] glib-2.0
glibc
[*] glibc
[*] ldd
devel ->
python ->
python ->
[*] python
Опционально:
base ->
i2c-tools ->
[*] i2c-tools
console ->
network ->
ethtool ->
[*] ethtool // необходимо для oryx! для перенастройки autonegotiation
Можно еще подключать дебаг i2c
Необходимо убедиться, что образ может распаковаться в размер оперативы
Если будут проблемы, то надо будет править netboot offset
device tree
Если необходимо внести изменения в device tree, то смотрим конец статьи
Интересная статья по правке devicetree из uboot
Сборка проекта
- далее (сборка идет 30-60 минут)
- делаем boot.bin
$ petalinux-package --boot --format BIN --fsbl ./zynq_fsbl.elf --fpga name.bit --u-boot --force
- записываем в загрузочную область флешки файлы boot.bin и image.ub
Всякое
Если мало памяти как у нас - возможна ошибка image is not a fdt ссылка
Необходимо править netboot offset
netboot offset
Можно вручную загрузиться из u-boot'а.
$ bootm 0xA000000
либо
$ fatload mmc 0 0x9000000 system.dtb
$ bootm 0xA000000 0xA000000 0x9000000
Можно поварьировать адрес
Проверка статуса прошитости FPGA
Uboot
Для внесения правок в загрузку линукса используем список команд env
Просмотр текущих команд printenv
Сброс настроек в дефолт env default -a
Создать переменную env set <имя> <значение>
Правка переменной env edit <имя переменной>
---
Для каждой платы делаем следующее:
- Берем Файл:Uboot.env.c
- Удаляем в конце имени ".c"
- Записываем на флешку рядом с образом линукса
- Запускаем плату и прерываем autoboot
- Пишем editenv ethaddr
- Редактируем MAC-адрес
- Пишем saveenv
- Все! можем ребутать reset
Сохранить в файл saveenv
Автозапуск приложений
Во-первых тыц
Далее пишем
Правим файл /project-spec/meta-user/recipes-apps/myapp-init/myapp-init.bb
# This file is the myapp-init recipe.
#
SUMMARY = "Simple myapp-init application"
SECTION = "PETALINUX/apps"
LICENSE = "MIT"
LIC_FILES_CHKSUM = "file://${COMMON_LICENSE_DIR}/MIT;md5=0835ade698e0bcf8506ecda2f7b4f302"
SRC_URI = "file://myapp-init"
S = "${WORKDIR}"
FILESEXTRAPATHS_prepend := "${THISDIR}/files:"
inherit update-rc.d
INITSCRIPT_NAME = "myapp-init"
INITSCRIPT_PARAMS = "start 99 S ."
do_install() {
install -d ${D}${sysconfdir}/init.d
install -m 0755 ${S}/myapp-init ${D}${sysconfdir}/init.d/myapp-init
}
FILES_${PN} += "${sysconfdir}/*"
Правим сам исполняемый скрипт project-spec/meta-user/recipes-apps/myapp-init/files/myapp-init
echo "Autorun script"
echo "Try run custom_init"
sh /run/media/mmcblk0p1/custom_init.sh
Записываем на флешку скрипт custom_init.sh с нужными командами и делаем его исполняемым
Записываем файл interfaces
Скачать архив: Файл:Init interfaces.rar
SSH
Как победить сохранение ssh-ключей:
Добавляем в init_script следующие строки:
ln -s /run/media/mmcblk0p2/.ssh/ /home/root/
mkdir /run/media/mmcblk0p2/dropbear/
chmod 400 /run/media/mmcblk0p2/dropbear/
rm -r /etc/dropbear/
ln -s /run/media/mmcblk0p2/dropbear/ /etc/
- Создается ссылка на флешку, где хранятся авторизованные пользователи
- Создается папка для хранения секретного ключа платы
- При запуске платы свежесозданный ключ заменяется тем, что лежит на флешке
- При первом включении платы будет создан новый ключ
Помимо добавления указанных команд в скрипт ничего больше делать не надо
Daemon
Для настройки демона:
- Добавляем строки в файл custom_init.sh
- Кидаем на загрузочный раздел флешки папку из архива File:daemon.rar
cp /run/media/mmcblk0p1/daemon/receiver.conf /etc/
cp /run/media/mmcblk0p1/daemon/receiver /etc/init.d/
device tree
Для внесения изменений в device tree добавляем нужные строки в файл
project-spec/meta-user/recipes-bsp/device-tree/files/system-user.dtsi
Для разборки device-tree ссылка
Для сборки device-tree
Модификация device-tree
После долгих мучений получилось поднять DP83867 только после добавления модификатора в файл волшебная статья
project-spec/meta-user/recipes-bsp/device-tree/files/system-user.dtsi
Single Kit-board eth
В Vivado включен eth1(с mdio) и выключен eth0.
Так работает
status = "okay";
phy-handle = <&phy0>;
phy-mode = "rgmii-id";
xlnx,eth-mode = <0x1>;
mdio {
status = "okay";
#address-cells = <1>;
#size-cells = <0>;
phy0: phy@12 {
compatible = "ethernet-phy-ieee802.3-c22";
device_type = "ethernet-phy";
reg = <12>;
ti,rx-internal-delay = <0x7>;
ti,tx-internal-delay = <0x7>;
ti,fifo-depth = <0x01>;
ti,min-output-impedance;
ti,dp83867-rxctrl-strap-quirk;
status = "okay";
};
};
};
Single On-board eth
В Vivado включен eth0(с mdio) и выключен eth1.
Работает гигабит через type-c! Работает hot plug. Успех.
status = "okay";
phy-handle = <&phy0>;
phy-mode = "rgmii-id";
xlnx,eth-mode = <0x1>;
mdio {
status = "okay";
#address-cells = <1>;
#size-cells = <0>;
phy0: phy@0 {
compatible = "ethernet-phy-ieee802.3-c22";
device_type = "ethernet-phy";
reg = <0>;
ti,rx-internal-delay = <0x7>;
ti,tx-internal-delay = <0x7>;
ti,fifo-depth = <0x01>;
ti,min-output-impedance;
ti,dp83867-rxctrl-strap-quirk;
status = "okay";
};
};
};
Dual eth
Попытка поднять два физика. Пока не работает
local-mac-address = [00 0a 35 00 00 00];
enet-reset = <&gpio0 47 0>;
status = "okay";
phy-handle = <&phy0>;
phy-mode = "rgmii-id";
xlnx,eth-mode = <0x1>;
mdio {
status = "okay";
#address-cells = <1>;
#size-cells = <0>;
phy0: phy@0 {
compatible = "ethernet-phy-ieee802.3-c22";
device_type = "ethernet-phy";
reg = <0>;
ti,rx-internal-delay = <0x8>;
ti,tx-internal-delay = <0xa>;
ti,fifo-depth = <0x01>;
ti,min-output-impedance;
ti,dp83867-rxctrl-strap-quirk;
status = "okay";
};
phy1: phy@12 {
compatible = "ethernet-phy-ieee802.3-c22";
device_type = "ethernet-phy";
reg = <12>;
ti,rx-internal-delay = <0x8>;
ti,tx-internal-delay = <0xa>;
ti,fifo-depth = <0x01>;
ti,min-output-impedance;
ti,dp83867-rxctrl-strap-quirk;
status = "okay";
};
};
};
&gem1{
local-mac-address = [00 0a 35 00 00 01];
enet-reset = <&gpio0 47 0>;
status = "okay";
phy-handle = <&phy1>;
phy-mode = "rgmii-id";
xlnx,eth-mode = <0x1>;
};
Oryx
В Vivado включен eth0(с mdio) и выключен eth1. Pullup пока что все включены
Работает
На новых платах(с отпаянными линиями линиями eth):
- на полноценных проводах с ходу
- на обкусанных проводах только если выставить 10 в ethtool
На старых платах:
- на полноценных проводах только если выставить 100 в ethtool
- на обкусанных проводах только если выставить 10 в ethtool
Везде работает так:
Спидометр показывает 2,5МБ/с, т.е. 20Мбит/с!
status = "okay";
phy-handle = <&phy0>;
phy-mode = "rgmii-id";
xlnx,eth-mode = <0x1>;
mdio {
status = "okay";
#address-cells = <1>;
#size-cells = <0>;
phy0: phy@1 {
compatible = "ethernet-phy-ieee802.3-c22";
device_type = "ethernet-phy";
rxc-skew-ps = <1800>;
rxdv-skew-ps = <0>;
txc-skew-ps = <1800>;
txen-skew-ps = <0>;
reg = <1>;
status = "okay";
};
};
};
В принципе, работает сеть на новой плате с нормальным кабелем без модификации devicetree. Остальные комбинации плат-кабелей надо проверять
i2c
В rootfs включаем
base ->
i2c-tools ->
[*] i2c-tools
Для поиска устройств можно написать
Статья по i2c и RTC
RTC
- Включаем в ядро подходящий драйвер
- Модифицируем device-tree
Вставляем в девайс три:
i2c: i2c@e0004000 {
rtc@51 {
compatible = "nxp,pcf85363";
reg = <0x51>;
};
};
};
Будет выглядеть так:
compatible = "cdns,i2c-r1p10";
status = "okay";
clocks = <0x1 0x26>;
interrupt-parent = <0x4>;
interrupts = <0x0 0x19 0x4>;
reg = <0xe0004000 0x1000>;
#address-cells = <0x1>;
#size-cells = <0x0>;
clock-frequency = <0x61a80>;
rtc@51 {
compatible = "nxp,pcf85363";
reg = <0x51>;
};
};
Если готового драйвера нет:
UG1144 pg.54
Создаем новый модуль
petalinux-create -t modules --name rtc-pcf85363 --enable
Правим исходный код в project-spec/meta-user/recipes-modules/rtc-pcf85363/files
Исправленный драйвер лежит в git Clonicus\linux\
Для удаления модуля:
- удаляем папку из project-spec/meta-user/recipes-modules
- В файле project-spec/meta-user/recipes-core/images/petalinux-image.bbappend удаляем соответствующую строку
Пробуем собрать модуль
Если ОК, собираем
И перепаковываем BOOT.bin
Пересобираем deveice-tree с указанием нового драйвера
Важно! Если при загрузке системы недоступен i2c (в клоникус i2c доступен только со специальным .bit). Иначе rtc не будет обнаружен и не будет добавлено устройство в систему
Не понятно - должен ли быть загружен модуль драйвера - просмотр модулей
загрузить драйвер можно
или
Но!, если все ок и в девайс три прописан правильный драйвер для устройства, то модуль будет загружен сам
Чтение времени из rtc если этот rtc не дефолтный (у нас rtc2)
Синхронизация rtc по системному времени
Правим custom_init.sh для изменения default-rtc на наше устройство
ln -s /dev/rtc2 /dev/rtc
Установка системного времени
Запись системного времени в RTC
Запись времени RTC в системное время
При перезагрузке "reboot" система автоматически запишет системное время в RTC
IRQ
Для поддержки irq добавляем в device-tree
Важно - мы перетираем bootargs!
chosen {
bootargs = "console=ttyPS0,115200 earlyprintk uio_pdrv_genirq.of_id=generic-uio";
};
};
&amba {
hififo: hififo@40000000 {
compatible = "generic-uio";
interrupt-parent = <&intc>;
interrupts = <0 29 1>;
reg = <0x40000000 0x1000 0x18000000 0x8000000>;
};
};
USB
Запустил на Z706
В дефолтных настройках ядра petalinux_2018.1 все было включено
включаем ресет на MIO7 pullup disabled
все ноги интерфейса ulpi pullup disabled
Содержимое system-user.dtsi
/{
usb_phy0:phy0 {
compatible="ulpi-phy";
#phy-cells = <0>;
reg = <0xe0002000 0x1000>;
view-port=<0x170>;
drv-vbus;
};
};
&usb0 {
status = "okay";
dr_mode = "host";
usb-phy = <&usb_phy0>;
} ;
[ Хронологический вид ]Комментарии
Войдите, чтобы комментировать.