Проверка функционирования ППМ для семейства микропроцессоров NXP серии i.MX8M под ЗОСРВ «Нейтрино».
Список проверок:
Тестовый стенд представляет из себя ПМ на базе микропроцессора NXP серии i.MX8M, соединённый с инструментальным ПК по интерфейсам RS-232 и Ethernet.
На инструментальный ПК должно быть установлено:
Перед проведением проверок необходимо запустить ЗОСРВ «Нейтрино» на ПМ на базе микропроцессора NXP серии i.MX8M в соответствии с главой документации Загрузка образа ОС.
Дополнительные тестовые программы i2c-scan, ticksize и другие не входят в состав ППМ и должны быть самостоятельно загружены из публичного git-репозитория и собраны командой:
$ cd utils $ make install
Затем следует скопировать ppcbe версии тестовых программ на SD карту памяти и подключить её к ПМ или передать файлы по сети с помощью FTP или NFS.
# uname -s
Проверка считается выполненной успешно, если в терминале будет выведено сообщение вида:
KPDA
Для вывода информации о запущенных компонентов выполнить команду pidin ar:
# pidin ar pid Arguments 1 procnto-smp -vvv -mnP 2 slogger -s64k 3 pipe 4 devc-pty 5 devc-sermx1 -u 1 -e -F -c24000000 0x30890000,59 6 random -t 7 gpio-imx8m 8 i2c-mx35 -p 0x30a20000 -i67 -c66000000 9 spi-master -u1 -d mx51ecspi base=0x30820000,irq=63,loopback=1 10 devb-sdmmc cam pnp,verbose blk rw,cache=2M sdio addr=0x30b50000,irq=55,\ bs=cd_base=0x30210000:cd_pin=0:wp_base=0x30210000:wp_pin=1:cd_irq=12 disk name=sd1 11 io-pkt-v4 -v -dmx6x verbose=1 8205 inetd 12302 qconn 36879 mksh 36881 /usr/sbin/sshd 45068 pidin ar
Для вывода информации о процессоре и доступной оперативной памяти выполнить команду pidin info:
# pidin info CPU:AARCH64 Release:2024 FreeMem:978Mb/1024Mb BootTime:Jan 01 00:00:00 UTC 1970 Processes: 16, Threads: 49 Processor1: 1091555380 Cortex-A53 1000MHz FPU Processor2: 1091555380 Cortex-A53 1000MHz FPU Processor3: 1091555380 Cortex-A53 1000MHz FPU Processor4: 1091555380 Cortex-A53 1000MHz FPU
Для проверки функционирования контроллера оперативной памяти используется утилита memcheck. Ее требуется запустить и дождаться завершения проверки:
# /tmp/memcheck
Проверка считается выполненной успешно, если выведено сообщение:
PASS: all memory allocated
Для вывода информации о используемых прерываниях выполнить команду pidin ir:
# pidin ir pid tid name 1 1 procnto-smp 1 2 procnto-smp 1 3 procnto-smp 1 4 procnto-smp 0 0x1b 0 -P- @0xffffff80600bda18:0x0 1 6 procnto-smp 1 7 procnto-smp 1 8 procnto-smp 1 10 procnto-smp 1 11 procnto-smp 1 13 procnto-smp 1 14 procnto-smp 1 15 procnto-smp 1 16 procnto-smp 1 17 procnto-smp 1 18 procnto-smp 2 1 slogger 3 1 pipe 3 2 pipe 3 3 pipe 3 4 pipe 4 1 devc-pty 5 1 devc-sermx1 1 0x3b 0 T-- @0x4032e8:0x439028 5 2 devc-sermx1 6 1 random 6 2 random 6 3 random 7 1 gpio-imx8m 8 1 i2c-mx35 3 0x43 0 T-- =INTR 9 1 spi-master 9 2 spi-master 2 0x3f 0 T-- @0x780a7220:0x424028 10 1 devb-sdmmc 4 0x37 0 TP- =PULSE 0x40000005:21 0x3:0 5 0xc 0 TP- =PULSE 0x40000005:21 0x1:0 10 2 devb-sdmmc 10 3 devb-sdmmc 10 4 devb-sdmmc 10 5 devb-sdmmc 10 6 devb-sdmmc 10 7 devb-sdmmc 10 8 devb-sdmmc 11 1 io-pkt-v4 11 2 io-pkt-v4 6 0x98 0 T-- @0x780accc8:0x4dda40 11 3 io-pkt-v4 11 4 io-pkt-v4 11 5 io-pkt-v4 8205 1 inetd 12302 1 qconn 12302 2 qconn 28687 1 mksh 36881 1 sshd 61452 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.13 mks ------------------------------------
Для вывода информации о количестве процессоров выполнить команду pidin info:
# pidin info CPU:AARCH64 Release:2024 FreeMem:978Mb/1024Mb BootTime:Jan 01 00:00:00 UTC 1970 Processes: 16, Threads: 49 Processor1: 1091555380 Cortex-A53 1000MHz FPU Processor2: 1091555380 Cortex-A53 1000MHz FPU Processor3: 1091555380 Cortex-A53 1000MHz FPU Processor4: 1091555380 Cortex-A53 1000MHz FPU
Для проверки функционирования на всех ядрах выполнить следующее:
# for cpu in 0 1 2 3; do on -C$cpu pidin -P pidin -fl; done
Проверка считается выполненной успешно, если вывод содержит следующие строки:
cpu 0 cpu 1 cpu 2 cpu 3
Для работы с последовательным портом используется драйвер devc-sermx1. Настройки последовательного порта по умолчанию: скорость 115200, 8 бит, без контроля четности, 1 стоп-бит. В составе загрузочного образа драйвер запускается автоматически.
В случае успешного запуска драйвера в директории /dev/
будет создано устройство ser1
.
# ls /dev/ser* /dev/ser1
Для проверки функционирования драйвера UART подключите ПМ к последовательному порту ПК (или через преобразователь по USB) и запустите терминальную программу. В последовательном или удалённом терминале выполните следующую команду:
# echo Test message > /dev/ser1
Проверка считается выполненной успешно, если в терминальной программе будет выведено сообщение:
Test message
Для работы с контроллером интерфейса Ethernet используется драйвер devnp-mx6x.so и менеджер ресурсов io-pkt-v4-hc. В составе загрузочного образа драйвер запускается автоматически. Для вывода информации о сетевых интерфейсах выполните команду ifconfig.
В случае успешного запуска драйвера будет создан сетевой интерфейс dsec0 и в результате выполнения команды ifconfig на экран будут выведены следующие данные:
lo0: flags=8049<UP,LOOPBACK,RUNNING,MULTICAST> mtu 33136 inet 127.0.0.1 netmask 0xff000000 fec0: flags=8843<UP,BROADCAST,RUNNING,SIMPLEX,MULTICAST> mtu 1500 address: 1e:37:77:3f:14:8d media: Ethernet autoselect (1000baseT full-duplex) status: active inet 192.168.1.11 netmask 0xffffff00 broadcast 192.168.1.255
Для проверки функционирования сетевого обмена выполнить следующую команду, инициирующую отправку ICMP пакетов существующему сетевому узлу:
# ping -c 3 192.168.1.100 PING 192.168.1.100 (192.168.1.100): 56 data bytes 64 bytes from 192.168.1.100: icmp_seq=0 ttl=64 time=0 ms 64 bytes from 192.168.1.100: icmp_seq=1 ttl=64 time=0 ms 64 bytes from 192.168.1.100: icmp_seq=2 ttl=64 time=0 ms ----192.168.1.100 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 lo0: flags=8049<UP,LOOPBACK,RUNNING,MULTICAST> mtu 33136 inet 127.0.0.1 netmask 0xff000000 fec0: flags=8843<UP,BROADCAST,RUNNING,SIMPLEX,MULTICAST> mtu 1500 address: 1e:37:77:3f:14:8d 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 192.168.1.11 netmask 0xffffff00 broadcast 192.168.1.255
Для проверки автоматического определения сетевого режима выполнить следующие команды:
# ifconfig fec0 media autoselect down up
Проверка считается пройденной успешно, если в выводе ifconfig -m присутствует строка
media: Ethernet autoselect
с указанием автоматически выбранного режима.
Для проверки установки требуемого сетевого режима необходимо установить его на ПМ и на инструментальной машине, с которой устанавливается сетевое соединение. Выполнить следующую команду на ПМ, где <режим> - требуемый сетевой режим из списка доступных сетевых режимов:
# ifconfig fec0 media <режим> down up
На инструментальной машине необходимо выполнить следующую команду, где <интерфейс> - сетевой интерфейс, <скорость> - требуемая скорость соединения, <тип> - half / full:
# ethtool -s <интерфейс> speed <скорость> duplex <тип> autoneg off
Проверка считается выполненной успешно, если после переключения режима корректно изменяется параметр media при вызове команды ifconfig для выбранного интерфейса, а команда ping отправляет и получает пакеты:
# ifconfig fec0 media 100baseTX mediaopt full-duplex down up # ifconfig fec0 fec0: flags=8843<UP,BROADCAST,RUNNING,SIMPLEX,MULTICAST> mtu 1500 address: 1e:37:77:3f:14:8d media: Ethernet 100baseTX full-duplex status: active inet 192.168.1.11 netmask 0xffffff00 broadcast 192.168.1.255
$ ethtool -s enp2s0 speed 100 duplex full autoneg off $ ping 192.168.1.11 PING 192.168.1.11 (192.168.1.11) 56(84) bytes of data. 64 bytes from 192.168.1.11: icmp_seq=1 ttl=255 time=0.188 ms 64 bytes from 192.168.1.11: icmp_seq=2 ttl=255 time=0.169 ms 64 bytes from 192.168.1.11: icmp_seq=3 ttl=255 time=0.184 ms 64 bytes from 192.168.1.11: icmp_seq=4 ttl=255 time=0.179 ms 64 bytes from 192.168.1.11: icmp_seq=5 ttl=255 time=0.174 ms 64 bytes from 192.168.1.11: icmp_seq=6 ttl=255 time=0.176 ms ^C --- 192.168.1.11 ping statistics --- 6 packets transmitted, 6 received, 0% packet loss, time 5111ms rtt min/avg/max/mdev = 0.169/0.178/0.188/0.012 ms
Для работы с контроллером SD/MMC используется драйвер devb-sdmmc. В составе загрузочного образа драйвер запускается автоматически. В случае успешного запуска драйвера в директории /dev/
будет создано устройство sd10
, соответствующее SD-карте, либо устройство emmc0
, соответствующее eMMC-карте, а также устройства, соответствующие разделам. Для управления устройствами могут быть использованы стандартные утилиты для управления и чтения/записи блочных устройств. Проверка считается выполненной успешно, если при выполнении команды ls /dev/sd10* отображаются устройства, соответствующие SD-карте и разделам, например:
# ls /dev/sd10* /dev/sd10 /dev/sd10t177
В выводе утилиты mount увидеть точку монтирования одного из разделов SD-карты, например:
# mount /dev/sd10t177 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-mx35. В составе загрузочного образа драйвер запускается автоматически. В случае успешного запуска драйвера в директории /dev/
будут создано устройство i2c0
.
# ls /dev/i2c* /dev/i2c0
Проверка функционирования заключается в запуске утилиты i2c-scan и считается выполненной успешно, если вывод i2c-scan соответствует ожидаемому, например:
# i2c-scan -d /dev/i2c1 Scanning I2C device /dev/i2c0 for I2C devices... 0 1 2 3 4 5 6 7 8 9 a b c d e f 00: xx -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 10: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 20: -- -- -- -- -- 25 -- -- -- -- -- -- -- -- -- -- 30: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 40: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 50: -- 51 -- -- -- -- -- -- -- -- -- -- -- -- -- -- 60: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 70: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- Scanning done
Для работы с контроллером SPI используется драйвер spi-mx51ecspi.so. В составе загрузочного образа драйвер запускается автоматически. В случае успешного запуска драйвера в директории /dev/
будет создано устройство spi1
.
Проверка функционирования драйвера контроллера SPI считается выполненной успешно, если устройство успешно создано.
Для работы с контроллерами CAN используется драйвер dev-can-mx35. В составе загрузочкого образа драйвер запускается автоматически. В случае успешного запуска драйвера в директории /dev/
будут созданы устройства can0
,can1.
Проверка функционирования драйвера контроллера CAN описана ниже.
![]() | Подразумевается, что на CAN периферию приходит тактирование частотой 66.5Мгц. Подробнее смотрите параметры -b, -B, -C в dev-can-mx35. |
Проверяем наличие устройств после запуска драйвера:
# ls /dev/can0 rx0 rx16 rx23 rx30 tx32 tx40 tx48 tx56 rx1 rx17 rx24 rx31 tx33 tx41 tx49 tx57 rx10 rx18 rx25 rx4 tx34 tx42 tx50 tx58 rx11 rx19 rx26 rx5 tx35 tx43 tx51 tx59 rx12 rx2 rx27 rx6 tx36 tx44 tx52 tx60 rx13 rx20 rx28 rx7 tx37 tx45 tx53 tx61 rx14 rx21 rx29 rx8 tx38 tx46 tx54 tx62 rx15 rx22 rx3 rx9 tx39 tx47 tx55 tx63 # ls /dev/can1 rx0 rx16 rx23 rx30 tx32 tx40 tx48 tx56 rx1 rx17 rx24 rx31 tx33 tx41 tx49 tx57 rx10 rx18 rx25 rx4 tx34 tx42 tx50 tx58 rx11 rx19 rx26 rx5 tx35 tx43 tx51 tx59 rx12 rx2 rx27 rx6 tx36 tx44 tx52 tx60 rx13 rx20 rx28 rx7 tx37 tx45 tx53 tx61 rx14 rx21 rx29 rx8 tx38 tx46 tx54 tx62 rx15 rx22 rx3 rx9 tx39 tx47 tx55 tx63
Убеждаемся, что mailbox имеются.
Соединяем физически CAN0 и CAN1 интерфейсы.
CAN_H - CAN_H, CAN_L - CAN_L.
Затем запускаем на CAN1 - прослушивание mailbox 0. В CAN0 - будем отправлять пакеты в mailbox 32:
# cat /dev/can1/rx0 & # echo testing > /dev/can0/tx32 # testing
Мы убедились, что из can0-tx32 в can1-rx0 пришёл наш пакет.
То же самое проделываем и для последнего ящика в обратном направлении.
# cat /dev/can0/rx31 & # echo testing > /dev/can1/tx63 # testing
Мы убедились, что из can1-tx63 в can0-rx31 пришёл наш пакет.
Убеждаемся, что передача происходит физически, не в loopback режиме. Необходимо физически рассоединить CAN0-CAN1 и отправить несколько пакетов. Увидим, что они не выводятся у нас. Но после того, как подключим кабель - пакеты приходят.
# cat /dev/can0/rx31 & # echo testing > /dev/can1/tx63 # echo testing > /dev/can1/tx63 # echo testing > /dev/can1/tx63 # echo testing > /dev/can1/tx63 # echo testing > /dev/can1/tx63 # Соединили физически кабель # testing testing testing testing testing
Убеждаемся, что пакеты пришли после подключения кабеля.
На этом тестирование CAN можно считать завершённым успешно.
Для работы с блоком watchdog используется утилита wdtkick-imx. В составе загрузочного образа утилита запускается автоматически. Для проверки работоспособности блока watchdog вызвать завершение работы системы с помощью утилиты shutdown:
# shutdown -fb
Проверка считается выполненной успешно, если через ~10 секунд произойдет сброс ПМ.
Для работы с контроллером PCI используется драйвер pci-imx. В составе загрузочного образа драйвер запускается автоматически. В случае успешного запуска драйвера в директории /dev/
будут создано устройство pci
.
# ls /dev/pci /dev/pci
Проверка функционирования заключается в запуске утилиты pci и считается выполненной успешно, если вывод соответствует ожидаемому, например:
# pci PCI version = 2.10 Class = Network (Ethernet) Vendor ID = 8086h, Intel Corporation Device ID = 1533h, I210 Gigabit Network Connection PCI index = 0h BAR - 0 [Mem] = 0h disabled BAR - 3 [Mem] = 0h disabled PCI Expansion ROM = 0h disabled PCI Int Pin = INT A Interrupt line = 0 CPU Interrupt = 0h
Для работы с контроллером GPIO используется драйвер gpio-imx8m. В составе загрузочного образа драйвер запускается автоматически. В случае успешного запуска драйвера в директории /dev
будет создано устройство gpio
.
# ls /dev/gpio /dev/gpio
Проверка функционирования заключается в выводе информации с регистров контроллеров, внесении изменений в состояние регистров, проверке изменений и считается успешной, если вывод соответствует ожидаемому, а так же внесение изменений отражается на состоянии регистров.
# cat /dev/gpio 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 0 0i 0i 0i 0i 0i 1i 1i 0i 0i 0i 0i 0i 0i 0i 0i 0i 0i 0i 0i 0i 0i 0i 0i 0i 0i 0i 0i 0i 0i 0i 0i 0i gpio2 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 0 0i 0i 0i 0i 0i 0i 0i 0i 0i 0i 0i 0i 1i 0i 0i 0i 0i 0i 0i 1i 0i 0i 0i 0i 0i 0i 0i 0i 0i 0i 0i 0i gpio3 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 0 1i 1i 0i 0i 0i 0i 1i 1i 1i 1i 0i 0i 0i 0i 0i 0i 0i 0i 0i 0i 0i 0i 0i 1i 0i 0i 1i 1i 0i 0i 0i 0i gpio4 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 0 0i 0i 0i 0i 0i 0i 0i 0i 0i 0i 0i 0i 0i 0i 0i 0i 0i 0i 0i 1i 0i 0i 0i 0i 0i 0i 0i 0i 0i 0i 0i 0i gpio5 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 0 0i 0i 0i 1i 1i 1i 1i 0i 0i 0i 0i 0i 0i 0i 0i 0i 1i 1i 1i 1i 1i 1i 0i 1i 0i 0i 1i 1i 1i 0i 0i 0i # echo "3 16 1" > /dev/gpio # cat /dev/gpio 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 0 0i 0i 0i 0i 0i 1i 1i 0i 1o 0i 0i 0i 0i 0i 0i 0i 0i 0i 0i 0i 0i 0i 0i 0i 0i 0i 0i 0i 0i 0i 0i 0i gpio2 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 0 0i 0i 0i 0i 0i 0i 0i 0i 0i 0i 0i 0i 1i 0i 0i 0i 0i 0i 0i 1i 0i 0i 0i 0i 0i 0i 0i 0i 0i 0i 0i 0i gpio3 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 0 1i 1i 0i 0i 0i 0i 1i 1i 1i 1i 0i 0i 0i 0i 0i 0i 1o 0i 0i 0i 0i 0i 0i 1i 0i 0i 1i 1i 0i 0i 0i 0i gpio4 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 0 0i 0i 0i 0i 0i 0i 0i 0i 0i 0i 0i 0i 0i 0i 0i 0i 0i 0i 0i 1i 0i 0i 0i 0i 0i 0i 0i 0i 0i 0i 0i 0i gpio5 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 0 0i 0i 0i 1i 1i 1i 1i 0i 0i 0i 0i 0i 0i 0i 0i 0i 1i 1i 1i 1i 1i 1i 0i 1i 0i 0i 1i 1i 1i 0i 0i 0i
Предыдущий раздел: перейти