Проверка функционирования ППМ Xilinx Zynq 7000 под ЗОСРВ «Нейтрино».
Список проверок:
Тестовый стенд представляет из себя отладочный модуль Avnet ZedBoard, соединённый с инструментальным ПК по интерфейсам RS-232 и Ethernet.
На инструментальный ПК должно быть установлено:
Перед проведением проверок необходимо запустить ЗОСРВ «Нейтрино» на отладочном модуле Avnet ZedBoard в соответствии с главой документации Загрузка образа ОС.
Стоит учитывать, что некоторые штатные утилиты могут не входить в состав загрузочного образа.
Дополнительные тестовые программы i2c-scan, ticksize и другие не входят в состав ППМ и должны быть самостоятельно загружены из публичного git-репозитория и собраны командой:
$ cd utils $ make install
Затем следует скопировать armv7.le версии тестовых программ на SD карту памяти и подключить её к Avnet ZedBoard или передать файлы по сети с помощью FTP или NFS.
# uname -s
Проверка считается выполненной успешно, если в терминале будет выведено сообщение вида:
KPDA
Для вывода информации о процессоре и доступной оперативной памяти выполнить команду pidin info:
# pidin info CPU:ARM Release:2024 FreeMem:488Mb/512Mb BootTime:Jan 01 00:00:00 UTC 1970 Processes: 23, Threads: 50 Processor1: 1094697104 Cortex A9 MPCore 666MHz FPU Processor2: 1094697104 Cortex A9 MPCore 666MHz FPU
Для проверки функционирования контроллера оперативной памяти используется утилита memcheck. Ее требуется запустить и дождаться завершения проверки:
# /tmp/memcheck
Проверка считается выполненной успешно, если выведено сообщение:
PASS: all memory allocated
Для вывода информации о используемых прерываниях выполнить команду pidin ir:
# pidin ir pid tid name 1 1 procnto-smp 1 2 procnto-smp 0 0x1d 0 -P- @0xfe05e160:0x0 1 3 procnto-smp 1 4 procnto-smp 1 5 procnto-smp 1 6 procnto-smp 1 7 procnto-smp 1 8 procnto-smp 1 9 procnto-smp 1 10 procnto-smp 1 11 procnto-smp 1 12 procnto-smp 1 13 procnto-smp 2 1 platform-control 2 2 platform-control 3 1 devc-serxzynq 1 0x52 0 T-- @0x804a38c:0x8073c88 3 2 devc-serxzynq 4 1 pipe 4 2 pipe 4 3 pipe 5 1 mqueue 6 1 random 6 2 random 6 3 random 7 1 slogger 8 1 wdtkick-xzynq 10 1 devf-qspi-zynq7000 3 0x33 0 T-- @0x804b3b4:0x8078040 10 2 devf-qspi-zynq7000 10 3 devf-qspi-zynq7000 11 1 ocm-xzynq 12 1 xadc-zynq7000 4 0x27 0 T-- =INTR 12 2 xadc-zynq7000 13 1 fpga-zynq7000 14 1 io-pkt-v4-hc 14 2 io-pkt-v4-hc 5 0x36 0 T-- @0x780038e8:0x8192240 14 3 io-pkt-v4-hc 8207 1 devc-pty 8208 1 qconn 8208 2 qconn 8210 1 inetd 12305 1 ksh 24585 1 pidin
Проверка считается пройденной успешно, если вывод утилиты pidin ir содержит информацию об обработчиках прерывания, принадлежащих выполняемым процессам, в формате
pid tid Имя процесса id прерывания vector mask_count flags handler:area
Для проверки функционирования системного таймера необходимо воспользоваться программой ticksize:
# /tmp/ticksize
Проверка считается выполненной успешно, если вывод данной программы содержит аналогичные строки:
System timer ticksize: 1000 mks Measuring system timer interrupt latency for 10 sec... ------------------------------------ System Timer Latency = 0.54 mks ------------------------------------
Для проверки функционирования на всех ядрах выполнить следующее:
# for cpu in 0 1; do on -C$cpu pidin -P pidin -fl; done
Проверка считается выполненной успешно, если вывод содержит следующие строки:
cpu 0 cpu 1
Для работы с последовательным портом используется драйвер devc-serxzynq. Настройки последовательного порта по умолчанию: скорость 115200, 8 бит, без контроля четности, 1 стоп-бит. В составе загрузочного образа драйвер запускается автоматически.
В случае успешного запуска драйвера в директории /dev/ будет создано устройство ser1.
# ls /dev/ser* /dev/ser1
Для проверки функционирования драйвера UART подключить ПМ к ПК через преобразователь по USB и запустить терминальную программу minicom. В последовательном или удалённом терминале выполнить следующую команду:
# echo Test message > /dev/ser1
Проверка считается выполненной успешно, если в терминальной программе будет выведено сообщение:
Test message
Для работы с контроллером интерфейса Gigabit Ethernet используется драйвер devnp-zynq7000.so и менеджер ресурсов io-pkt-v4-hc. В составе загрузочного образа драйвер запускается автоматически. Для вывода информации о сетевых интерфейсах выполнить команду ifconfig.
В случае успешного запуска драйвера будет создан сетевой интерфейс xzynq0 и в результате выполнения команды ifconfig на экран будут выведены данные, аналогичные следующим, с указанием текущего ip-адреса, маски и широковещательного адреса:
lo0: flags=8049<UP,LOOPBACK,RUNNING,MULTICAST> mtu 33192 inet 127.0.0.1 netmask 0xff000000 xzynq0: flags=8843<UP,BROADCAST,RUNNING,SIMPLEX,MULTICAST> mtu 1500 address: 00:0a:35:02:78:11 media: Ethernet autoselect (1000baseT full-duplex) status: active inet <ip адрес> netmask <маска> broadcast <широковещательный адрес>
Для проверки функционирования сетевого обмена выполнить следующую команду, инициирующую отправку ICMP пакетов существующему сетевому узлу:
# ping -c 3 <ip получателя> PING <ip получателя> (<ip получателя>): 56 data bytes 64 bytes from <ip получателя>: icmp_seq=0 ttl=64 time=0 ms 64 bytes from <ip получателя>: icmp_seq=1 ttl=64 time=0 ms 64 bytes from <ip получателя>: icmp_seq=2 ttl=64 time=0 ms ----<ip получателя> PING Statistics---- 3 packets transmitted, 3 packets received, 0% packet loss round-trip min/avg/max = 0/0/0 ms variance = 0 ms^2
Проверка считается выполненной успешно, если все 3 пакета были успешно получены (процент потерь равен нулю).
Просмотр доступных сетевых режимов осуществляется утилитой ifconfig с опцией -m:
# ifconfig -m xzynq0 xzynq0: flags=8843<UP,BROADCAST,RUNNING,SIMPLEX,MULTICAST> mtu 1500 address: 00:0a:35:02:78:11 media: Ethernet autoselect (1000baseT full-duplex) status: active supported Ethernet media: media none media autoselect media 10baseT media 10baseT mediaopt full-duplex media 10baseT mediaopt full-duplex,flowcontrol media 10baseT mediaopt full-duplex,txpause media 10baseT mediaopt full-duplex,rxpause media 100baseTX media 100baseTX mediaopt full-duplex media 100baseTX mediaopt full-duplex,flowcontrol media 100baseTX mediaopt full-duplex,txpause media 100baseTX mediaopt full-duplex,rxpause media 1000baseT mediaopt full-duplex media 1000baseT mediaopt full-duplex,flowcontrol media 1000baseT mediaopt full-duplex,txpause media 1000baseT mediaopt full-duplex,rxpause inet <ip адрес> netmask <маска> broadcast <широковещательный адрес>
Для проверки автоматического определения сетевого режима выполнить следующие команды:
# ifconfig xzynq0 media autoselect down up # ifconfig -m xzynq0
Проверка считается пройденной успешно, если в выводе ifconfig -m присутствует строка
media: Ethernet autoselect
с указанием автоматически выбранного режима.
Для проверки установки требуемого сетевого режима необходимо установить его на ПМ и на инструментальной машине, с которой устанавливается сетевое соединение. Выполнить следующую команду на ПМ, где <режим> - требуемый сетевой режим из списка доступных сетевых режимов:
# ifconfig xzynq0 media <режим> down up
На инструментальной машине необходимо выполнить следующую команду, где <интерфейс> - сетевой интерфейс, <скорость> - требуемая скорость соединения, <тип> - half / full:
# ethtool -s <интерфейс> speed <скорость> duplex <тип> autoneg off
Проверка считается выполненной успешно, если после переключения режима корректно изменяется параметр media при вызове команды ifconfig для выбранного интерфейса, а команда ping отправляет и получает пакеты:
# ifconfig xzynq0 media 100baseTX mediaopt full-duplex down up # ifconfig xzynq0 lo0: flags=8049<UP,LOOPBACK,RUNNING,MULTICAST> mtu 33192 inet 127.0.0.1 netmask 0xff000000 xzynq0: flags=8843<UP,BROADCAST,RUNNING,SIMPLEX,MULTICAST> mtu 1500 address: 00:0a:35:02:78:11 media: Ethernet 100baseTX full-duplex status: active inet <ip адрес> netmask <маска> broadcast <широковещательный адрес>
$ ethtool -s enp2s0 speed 100 duplex full autoneg off $ ping -c3 <ip адрес> PING <ip адрес> (<ip адрес>) 56(84) bytes of data. 64 bytes from <ip адрес>: icmp_seq=1 ttl=255 time=0.228 ms 64 bytes from <ip адрес>: icmp_seq=2 ttl=255 time=0.119 ms 64 bytes from <ip адрес>: icmp_seq=3 ttl=255 time=0.147 ms --- <ip адрес> ping statistics --- 3 packets transmitted, 3 received, 0% packet loss, time 2028ms rtt min/avg/max/mdev = 0.119/0.164/0.228/0.046 ms
Для взаимодействия с контроллерами CAN используется драйвер dev-can-xzynq. В случае успешного запуска драйвера в директории /dev/ создаются соответствующие устройства: can#, где символ # обозначает номер интерфейса. Запуск драйвера для двух контроллеров CAN в loopback режиме:
# dev-can-xzynq -L can0 -L can1 # ls /dev/can0 rx0 rx1 rx2 rx3 tx4 # ls /dev/can1 rx0 rx1 rx2 rx3 tx4
После чего необходимо запустить процесс прослушивания на любом из интерфейсов и выполнить отправку тестовых пакетов:
# cat /dev/can0/rx0 & # echo testing > /dev/can0/tx4
Проверка считается выполненной успешно, если будет выведено сообщение:
# testing
Для работы с контроллером SPI используется драйвер spi-xzynq-zynq7000.so.
Запуск драйвера для двух контроллеров:
spi-master -u 0 -d xzynq-zynq7000 base=0xE0006000,irq=58 spi-master -u 1 -d xzynq-zynq7000 base=0xE0007000,irq=81
В случае успешного запуска драйвера в директории /dev/ создаются соответствующие устройства: spi#, где символ # обозначает номер интерфейса.
# ls /dev/spi* /dev/spi0 /dev/spi1
Так как для полноценной проверки функционирования необходимо slave устройство и драйвер под это устройство, а также написанный сценарий обмена данными, проверка ограничится некоторыми функциями драйвера и передачей на loopback.
Проверка функционирования заключается в запуске утилиты spitest и считается выполненной успешно, если конфигурация устройства изменяется в соответствии с заданными параметрами, вывод соответствует измененным ранее параметрам и входные данные при передаче на loopback соответствуют выходным.
Настройка конфигурации устройства:
# spitest setcfg 1 1 1288 5000 Set configuration for SPI Device /dev/spi1: cs1 mode 508 clock_rate 5000 Reading existing configuration of SPI Device... device = 0x1 name = SPI-DEV1 mode = 0x408 clock_rate = 5000000 Changing configuration of SPI Device... Reading updated configuration of SPI Device... device = 0x1 name = SPI-DEV1 mode = 0x508 clock_rate = 5000 Test OK!
Вывод информации об устройствах:
# spitest devinfo 1 1 === SPI Device /dev/spi1 info: === Reading info using SPI_DEV_DEFAULT bit... --- device 0x0000 info --- device = 0x0 name = SPI-DEV0 mode = 0x408 clock_rate = 5000000 --- device 0x0001 info --- device = 0x1 name = SPI-DEV1 mode = 0x508 clock_rate = 5000 --- device 0x0002 info --- device = 0x2 name = SPI-DEV2 mode = 0x408 clock_rate = 5000000 --- device 0x0003 info --- Done, 3 devices detected Reading info using SPI_DEV_ID_NONE bit... device = 0x0 name = SPI-DEV0 mode = 0x408 clock_rate = 5000000 device = 0x1 name = SPI-DEV1 mode = 0x508 clock_rate = 5000 device = 0x2 name = SPI-DEV2 mode = 0x408 clock_rate = 5000000 Done, 3 devices detected
Для работы с QSPI Flash используется драйвер devf-qspi-zynq7000. В составе загрузочного образа драйвер запускается автоматически. В каталоге /dev должно появиться устройство fs0. Для формирования файловой системы встроенного флэш накопителя используется утилита flashctl. Выполнить стирание данных флэш памяти с адреса 0x800000:
# flashctl -p /dev/fs0 -e -o 0x800000
Выполнить форматирование памяти для создания и монтирования файловой системы:
# flashctl -p /dev/fs0p0 -f -o 0x800000 -n /flash
Выполнить перезапуск драйвера для обновления таблицы разделов:
# slay -f devf-qspi-zynq7000 # devf-qspi-zynq7000 -r
Результатом проведения данных команд должно являться появление каталога /flash в корневом каталоге файловой системы. Далее выполнить следующие команды:
# touch /tmp/test_file # cp /tmp/test_file /flash/ # cksum /flash/test_file # cksum /tmp/test_file
Проверка считается выполненной успешно, если контрольные суммы, выведенные двумя последними командами, совпадают. Для измерения производительности операции записи и чтения необходимо создать файл и заполнить его случайными значениями с помощью утилиты dd, при этом измеряя время данной операции через time:
# dd if=/dev/urandom of=/dev/shmem/test_file bs=1000 count=256 # time dd if=/dev/shmem/test_file of=/flash/test_file bs=1000 count=256
Выводом данной команды будет является время записи:
256+0 records in 256+0 records out 256000 bytes transferred in 11.204 secs (22848 bytes/sec) 0m11.27s real 0m00.00s user 0m00.00s system
Для измерения скорости чтения необходимо скопировать созданный тестовый файл в /dev/null с помощью утилиты dd:
# time dd if=/flash/test_file of=/dev/null bs=1000 count=256
Выводом данной команды будет является время и скорость чтения:
256+0 records in 256+0 records out 256000 bytes transferred in 0.077 secs (3324675 bytes/sec) 0m00.09s real 0m00.00s user 0m00.00s system
Для работы с контроллером SD/MMC используется драйвер devb-sdmmc. В составе загрузочного образа драйвер запускается автоматически. В случае успешного запуска драйвера в директории /dev/ будет создано устройство sd0, соответствующее SD-карте, а также устройства, соответствующие разделам. Для управления устройствами могут быть использованы стандартные утилиты для управления и чтения/записи блочных устройств. Проверка считается выполненной успешно, если при выполнении команды ls отображаются устройства, соответствующие SD-карте и разделам, например:
# ls /dev/sd* /dev/sd0 /dev/sd0t12 /dev/sd0t131
В выводе утилиты mount увидеть точку монтирования одного из разделов SD-карты, например:
# mount /dev/sd0t131 on / type qnx6
Для измерения производительности операции записи и чтения необходимо создать файл и заполнить его случайными значениями с помощью утилиты dd, при этом измеряя время данной операции через time:
# dd if=/dev/urandom of=/dev/shmem/test_file bs=1000 count=256 # time dd if=/dev/shmem/test_file of=<точка монтирования>/test_file \ bs=1000 count=256
Выводом данной команды будет является время и скорость записи:
256+0 records in 256+0 records out 256000 bytes transferred in 0.025 secs (10240000 bytes/sec) 0m00.05s real 0m00.00s user 0m00.00s system
Для измерения скорости чтения необходимо скопировать созданный тестовый файл в /dev/null с помощью утилиты dd:
# time dd if=<точка монтирования>/test_file of=/dev/null bs=1000 count=256
Выводом данной команды будет является время и скорость чтения:
256+0 records in 256+0 records out 256000 bytes transferred in 0.004 secs (64000000 bytes/sec) 0m00.01s real 0m00.00s user 0m00.00s system
Для работы с контроллером I2C используется драйвер i2c-xzynq.
Запуск драйвера для двух контроллеров:
i2c-xzynq -p 0xE0004000 -i 57 --u 0 i2c-xzynq -p 0xE0005000 -i 80 --u 1
В случае успешного запуска драйвера в директории /dev/ будут созданы устройства i2c0 и i2c1.
# ls /dev/i2c* /dev/i2c0 /dev/i2c1
Перед проверкой функционирования убедитесь, что требуемые сигналы I2C корректно назначены на выводы MIO. Пример выводов представлен в разделе «Известные особенности».
Также для проверки необходимо какое-либо подключенное устройство к интерфейсу.
Проверка считается выполненной успешно, если утилита i2c-scan находит корректные адреса устройства, например:
# i2c-scan -d /dev/i2c1 Scanning I2C device /dev/i2c1 for I2C devices... 0 1 2 3 4 5 6 7 8 9 a b c d e f 00: xx -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 10: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 20: -- -- -- 23 -- -- -- -- -- -- -- -- -- -- -- -- 30: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 40: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 50: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 60: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 70: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- Scanning done
Для работы с блоком watchdog используется утилита wdtkick-xzynq. В составе загрузочного образа утилита запускается автоматически. Перед проверкой необходимо убедиться, что для startup-zedboard включена опция -W и указано количество секунд сброса.
Для проверки работоспособности контроллера watchdog необходимо вызвать завершение работы системы, введя следующую команду:
# slay -9 wdtkick-xzynq
Проверка считается выполненной успешно, если через указанное количество секунд произойдет сброс ПМ и появится приглашение для ввода загрузчика.
Для работы с контроллером накристальной памяти используется драйвер ocm-xzynq. В составе загрузочного образа драйвер ocm-xzynq запускается автоматически. Создать файл со случайным данными размером 256 килобайт и записать его в накристальную память:
# dd if=/dev/random of=/tmp/random.bin bs=512 count=512 # cat /tmp/random.bin > /dev/ocm
Для подсчета контрольной суммы данных в оригинальном файле и в накристальной памяти выполнить команду cksum:
# cksum /tmp/random.bin /dev/ocm 2937395622 262144 /tmp/random.bin 2937395622 262144 /dev/ocm
Проверка считается выполненной успешно, если контрольные суммы данных в оригинальном файле и в накристальной памяти совпали.
Для работы с блоком управления загрузкой битстрима FPGA используется менеджер fpga-zynq7000. В составе загрузочного образа драйвер fpga-zynq7000 запускается автоматически. Для проверки требуется битстрим FPGA в формате .bin, загрузка осуществляется командой cat:
# cat /tmp/example.bin > /dev/fpga
Для проверки загрузки битстрима выполнить команду:
# fpgactl-zynq7000 status
Проверка считается выполненной успешно, если fpgactl-zynq7000 вывела:
The PL configuration is done
Для работы с блоком управления аналого-цифрового преобразователя XADC используется менеджер xadc-zynq7000.
В случае успешного запуска драйвера в директории /dev/ будет создано устройство xadc.
# ls /dev/xadc /dev/xadc
# ls /dev/gpio /dev/gpio
Проверка функционирования заключается в выводе информации с регистров контроллеров, внесении изменений в состояние регистров, проверке изменений и считается успешной, если вывод соответствует ожидаемому, а также внесение изменений отражается на состоянии регистров.
# cat /dev/gpio gpio0 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 0i 1i 0i 0i 1i 1i 1i 0i 0i 1i 1i 1i 1i 1i 1i 1i 1i 0i 0i 0i 0i 0i 0i 1i 0i 1i 1i 0i 0i 0i 0i 0i gpio1 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 0i 0i 0i 0i 1i 0i 0i 0i 1i 1i 1i 1i 1i 1i 0i 0i 1i 1i 1i 1i 0i 1i 0i 0i 0i 0i 0i 0i 0i 0i 0i 0i # echo "P10 o" > /dev/gpio # echo "P10 1" > /dev/gpio # cat /dev/gpio gpio0 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 0i 1i 0i 0i 1i 1i 1i 0i 0i 1i 1o 1i 1i 1i 1i 1i 0i 0i 0i 0i 0i 0i 0i 1i 0i 1i 1i 0i 0i 0i 0i 0i gpio1 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 0i 0i 0i 0i 0i 0i 0i 0i 1i 1i 1i 1i 1i 1i 0i 0i 1i 1i 1i 1i 0i 1i 0i 0i 0i 0i 0i 0i 0i 0i 0i 0i
Предыдущий раздел: перейти