INMYS WIKI

Инженерами для инженеров

Инструменты пользователя

Инструменты сайта


boards:nms-sm-rk3568:firmware_opensource:quick_start

Различия

Показаны различия между двумя версиями страницы.

Ссылка на это сравнение

Предыдущая версия справа и слеваПредыдущая версия
Следующая версия
Предыдущая версия
boards:nms-sm-rk3568:firmware_opensource:quick_start [2024/01/11 17:34] – [CAN] Артем Слеповboards:nms-sm-rk3568:firmware_opensource:quick_start [2025/02/18 09:23] (текущий) – [Работа с GPIO] Артем Слепов
Строка 1: Строка 1:
 ===== RK3568 Quick Start Kernel 6.1 ===== ===== RK3568 Quick Start Kernel 6.1 =====
  
-==== CAN ==== +===== CAN ===== 
-Драйвер CAN собирается как модуль ядра .ko с помощью buildroot-external. В **/etc/init.d/S49CANinit** + 
 +Для корректной работы шины CAN на отладочной плате NMS_SM_EVM необходимо подключить терминаторы - установить джамперы X13 и X14.\\  {{:boards:nms-sm-rk3568:firmware_opensource:2024-01-12_13-43-58.png?600&nolink}}\\  Драйвер CAN собирается как модуль ядра .ko с помощью buildroot-external. Исходники взяты из ядра 4.19, которое предоставляется Rockchip. Модуль ядра подгружается в **/etc/init.d/S49CANinit**
 + 
 +Пример настройки интерфейса и проверки в режиме loopback CAN0<->CAN1: 
 + 
 +<code -> 
 +#configure 
 +ip link set dev can0 down 
 +ip link set dev can1 down 
 +ip link set can0 up type can bitrate 1000000 dbitrate 1000000 fd on 
 +ip link set can1 up type can bitrate 1000000 dbitrate 1000000 fd on 
 + 
 +#test 
 +candump -T 1000 can0 > /tmp/1.txt& 
 +sleep 1 
 +cansend can1 500#DEADBEEF 
 +sleep 2 
 + 
 +cat /tmp/1.txt 
 +</code> 
 + 
 +<note important> 
 + 
 +CAN в ядре 6.1 работает только в режиме 
 + 
 +**fd on**</note> 
 +{{:boards:nms-sm-rk3568:firmware_opensource:can_test.png}} 
 +===== ETH LED configuration ===== 
 + 
 +Светодиоды Ethernet управляются [[https://doc.inmys.ru/open?hash=6676d0c51e40251e92242df2ca3afc1e&fn=PHY-DAP8211R-Full%2BV1.2-20220531.pdf|PHY DAP8211]]. Описания регистров п. 4.3.10 - 4.3.14 
 + 
 +PHY управляется через MDIO регистры. Для доступа к регистрам используется утилита [[https://github.com/PieVo/mdio-tool|mdio-tool]] 
 + 
 +Связь SMARC-пинов и регистров  
 + 
 +<table> 
 +^ SMARC Pin  ^ SMARC Name  ^ PHY LED  ^ PHY Reg  ^ 
 +| P21  | GBE0_LINK100#  | LED0  | 0xA00C 
 +| P22  | GBE0_LINK1000#  | LED1  | 0xA00D 
 +| P25  | GBE0_LINK_ACT#  | LED2  | 0xA00E 
 +| S19  | GBE1_LINK100#  | LED0  | 0xA00C 
 +| S22  | GBE1_LINK1000#  | LED1  | 0xA00D 
 +| S31  | GBE1_LINK_ACT#  | LED2  | 0xA00E 
 +</table> 
 + 
 +Для работы с регистрами светодиодов используется General Extend Mapping:  
 + 
 + 
 +^ Offset  ^ Name  ^ Description 
 +| 0x1E  | EXT_ADD  | Extended Register Address Registe 
 +| 0x1F  | EXT_DATA  | Extended Register Data Register 
 + 
 + 
 +В EXT_ADD требуется записать адрес желаемого Extended Register, в/из EXT_DATA можно писать/читать данные. 
 + 
 + 
 +** Пример настройки на [[https://wiki.inmys.ru/doku.php?id=boards:nms-sm-evm:start|NMS-SM-EVM]] ** 
 + 
 +На отладочной плате на ETH заведены GBE0_LINK1000 - на YELLOW LED, GBE1_LINK_ACT - на GREEN 
 + 
 +По умолчанию PHY настроен на режим 0x0620 - Yellow ACT 1Gbit/s; Green ACT 100Mbit/s; 
 + 
 +Пример настройки, при котором Yellow и Green будут ACT на скорости 1000: 
 +<code -> 
 +./mdio-tool w eth0 0x1e 0xA00D #set EXT reg 
 +./mdio-tool r eth0 0x1f #read EXT reg 
 +./mdio-tool w eth0 0x1f 0x0660 #write new value  
 +./mdio-tool w eth0 0x1e 0x0 #set EXT_ADDR reg to default 
 +</code> 
 + 
 + 
 +===== Работа с GPIO ===== 
 + 
 +Стандарт модулей SMARC предусматривает GPIO0-GPIO13, но не все они имплементированы в модулях NMS-SM-RK3568: 
 +  * В [[https://wiki.inmys.ru/doku.php?id=boards:nms-sm-rk3568:v1_ru:start|ревизии 1]] реализованы GPIO0-GPIO3 
 +  * В [[https://wiki.inmys.ru/doku.php?id=boards:nms-sm-rk3568:v2_ru:start|ревизии 2]] реализованы GPIO0-GPIO3, GPIO10, GPIO11 
 +  * В [[https://wiki.inmys.ru/doku.php?id=boards:nms-sm-rk3568:v3_ru:start|ревизии 3]] реализованы все GPIO стандарта SMARC. ([[https://gitlab.inmys.online/rk3568-kernel-5.10/kernel/-/blob/main/arch/arm64/boot/dts/rockchip/rk3568-inmys-smarc-som_v3.dtsi#L1287|ссылка на dts]]) 
 + 
 +Также при необходимости некоторые интерфейсные пины(в соответвии с таблицей "Распиновка разъема") можно переопределить как GPIO. 
 + 
 +Процессор содержит 5 банков по 32 пина. Все GPIO прописаны dts и видны ///sys/kernel/debug/gpio//. Для управления состоянием пина по имени (имя во 2 столбце)  можно использовать скрипт {{ :boards:nms-sm-rk3568:firmware_opensource:gpio.sh |gpio.sh}} 
 +<code> 
 +root@192-168-1-101:~# cat /sys/kernel/debug/gpio  
 +gpiochip0: GPIOs 0-31, parent: platform/fdd60000.gpio, gpio0: 
 + gpio-0   (GPIO0_A0            ) 
 + gpio-1   (GPIO0_A1            ) 
 + gpio-2   (GPIO0_A2            ) 
 + ....... 
 + gpio-30  (GPIO0_D6            ) 
 + gpio-31  (GPIO0_D7            ) 
 + 
 +gpiochip1: GPIOs 32-63, parent: platform/fe740000.gpio, gpio1: 
 + gpio-32  (GPIO1_A0            ) 
 + gpio-33  (GPIO1_A1            ) 
 + gpio-34  (GPIO1_A2            ) 
 + ........ 
 + gpio-62  (GPIO1_D6            ) 
 + gpio-63  (GPIO1_D7            ) 
 + 
 +gpiochip2: GPIOs 64-95, parent: platform/fe750000.gpio, gpio2: 
 + gpio-64  (GPIO2_A0            ) 
 + gpio-65  (GPIO2_A1            ) 
 + gpio-66  (GPIO2_A2            ) 
 + ......... 
 +gpiochip3: GPIOs 96-127, parent: platform/fe760000.gpio, gpio3: 
 + gpio-96  (GPIO3_A0            ) 
 + gpio-97  (GPIO3_A1            |reset               ) out hi  
 + gpio-98  (GPIO3_A2            ) 
 + ..... 
 + gpio-126 (GPIO3_D6            ) 
 + gpio-127 (GPIO3_D7            ) 
 + 
 +gpiochip4: GPIOs 128-159, parent: platform/fe770000.gpio, gpio4: 
 + gpio-128 (GPIO4_A0            ) 
 + gpio-129 (GPIO4_A1            ) 
 + gpio-130 (GPIO4_A2            ) 
 + ........ 
 + gpio-158 (GPIO4_D6            ) 
 + gpio-159 (GPIO4_D7            ) 
 + 
 +</code> 
 + 
 + 
 +=== Пример использования интерфейсного пина в качестве GPIO === 
 +Например, переопределим SPI0_CS как GPIO:  
 + 
 +{{:boards:nms-sm-rk3568:firmware_opensource:header_pinout.png?1000}}  
 + 
 +Необходимо в таблице "Распиновка разъема" узнать, доступна ли функция GPIO в качестве альтернативной: 
 + 
 +{{:boards:nms-sm-rk3568:firmware_opensource:spi_gpio.png?1000}} 
 + 
 +Управление пином:  
 +<code> 
 +root@192-168-1-101:~# cat /sys/kernel/debug/gpio | grep 4_C6 #проверка наличия  
 + gpio-150 (GPIO4_C6            )  
 +root@192-168-1-101:~# ./gpio.sh GPIO4_C6 1 #запись в единицу 
 +root@192-168-1-101:~# cat /sys/kernel/debug/gpio | grep 4_C6 
 + gpio-150 (GPIO4_C6            |sysfs               ) out hi  
 +root@192-168-1-101:~# ./gpio.sh GPIO4_C6 0 #запипсь в ноль 
 +root@192-168-1-101:~# cat /sys/kernel/debug/gpio | grep 4_C6 
 + gpio-150 (GPIO4_C6            |sysfs               ) out lo  
 +</code> 
 +=== I2C-GPIO расширитель на отладочной плате  SM_EVM === 
 + 
 +Отладочная плата содержит PCA9535PW расширитель на адресе 0x20, подключенный к i2c-контроллеру с адресом fe5c0000. В {{ :boards:nms-sm-rk3568:firmware_opensource:rk3568-inmys-smarc-evm.dtb | этой dtb}} прописаны I2C-GPIO в соответвии со схемой. [[https://wiki.inmys.ru/doku.php?id=boards:nms-sm-rk3568:firmware_opensource:start|Исходники dtb и инструкция по сборке]] 
 + 
 +<code> 
 +gpiochip5: GPIOs 496-511, parent: i2c/3-0020, 3-0020, can sleep: 
 + gpio-496 (DSI0_TP_RST_N       ) 
 + gpio-497 (DSI1_TP_RST_N       ) 
 + gpio-498 (DSI0_RST_N          ) 
 + gpio-499 (DSI1_RST_N          ) 
 + gpio-500 (CAM0_PWDN           ) 
 + gpio-501 (I2C_GPIO05          |sysfs               ) out lo  
 + gpio-502 (I2C_GPIO06          |sysfs               ) out hi  
 + gpio-503 (I2C_GPIO07          ) 
 + gpio-504 (I2C_GPIO10          ) 
 + gpio-505 (I2C_GPIO11          ) 
 + gpio-506 (I2C_GPIO12          ) 
 + gpio-507 (I2C_GPIO13          ) 
 + gpio-508 (I2C_GPIO14          ) 
 + gpio-509 (I2C_GPIO15          ) 
 + gpio-510 (I2C_GPIO16          ) 
 + gpio-511 (I2C_GPIO17          ) 
 +</code> 
 + 
 +Фрагмент dts с описание gpio-line-names: 
 +<code> 
 +        i2cgpio: pca9535@20 { 
 +                compatible = "nxp,pca9535"; 
 +                /* vcc-supply = <&regulator_i2c_1v8 */ 
 +                reg = <0x20>; 
 +                /*GPIO.3 -> P111 (som) -> gpio3_d2*/ 
 +                interrupt-parent = <&gpio3>; 
 +                interrupts = <27 IRQ_TYPE_LEVEL_LOW>; 
 +                interrupt-controller; 
 +                #interrupt-cells = <2>; 
 + 
 +                gpio-controller; 
 +                #gpio-cells = <2>; 
 +                gpio-line-names = 
 +                        "DSI0_TP_RST_N","DSI1_TP_RST_N","DSI0_RST_N","DSI1_RST_N","CAM0_PWDN","I2C_GPIO05","I2C_GPIO06","I2C_GPIO07", 
 +                        "I2C_GPIO10","I2C_GPIO11","I2C_GPIO12","I2C_GPIO13","I2C_GPIO14","I2C_GPIO15","I2C_GPIO16","I2C_GPIO17"; 
 +        }; 
 + 
 +</code> 
 + 
 +Выводы GPIO на headers:  
 + 
 +{{:boards:nms-sm-rk3568:firmware_opensource:gpio_headers.png?700}} 
 + 
 +Пример управления I2C_GPIO5: 
 +<code> 
 +root@192-168-1-101:~# ./gpio.sh I2C_GPIO05 1 #записать единицу 
 +root@192-168-1-101:~# ./gpio.sh I2C_GPIO05 0 #записать ноль 
 +</code> 
 + 
 +===== I2C в Debian ===== 
 +Если в Debian при попытке //i2cdetect// шин выходит ошибка, то нужно подгрузить Kernel Module //i2c-dev//
 +<code> 
 +root@192-168-1-101:~# i2cdetect -y 0 
 +Error: Could not open file `/dev/i2c-0' or `/dev/i2c/0': No such file or directory 
 +</code> 
 + 
 +Для этого необходимо в ///etc/modules// добавить имя модуля и перезагрузить устройство: 
 + 
 +{{:boards:nms-sm-rk3568:firmware_opensource:modules.png}} 
 + 
 +После перезагрузки в dev появятся i2c-линии: 
 +<code> 
 +root@192-168-1-101:~# i2cdetect -y 0 
 +      1  2  3  4  5  6  7  8  9  a  b  c  d  e  f 
 +00:                         -- -- -- -- -- -- -- --  
 +10: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --  
 +20: UU -- -- -- -- -- -- -- -- -- -- -- -- -- -- --  
 +30: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --  
 +40: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --  
 +50: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --  
 +60: 60 -- -- -- -- -- -- -- -- -- -- -- -- -- -- --  
 +70: -- -- -- -- -- -- -- --     
 +</code> 
 + 
 +===== SPI в Debian ===== 
 +Для общения с SPI устройствами в ядре должен быть модуль spidev. 
 + 
 +В качестве примера в ///root/// лежит программа //run_spi// и ее исходный код //spi.c// (либо на [[https://github.com/inmys/SPI-Example-W25Q128FV/blob/main/spi.c|github]]), которые реализуют коммуникацию с SPI устройством на примере SPI FLASH W25Q128FV. 
 + 
 +Инструкция JEDEC ID для данного устройства имеет вид: 0x9F [MF7-MF0] [ID15-ID8] [ID7-ID0]. 
 + 
 +То есть, первый байт последовательности указывается нами - 0x9F. Далее получаем 3 оставшихся байта. 
 + 
 +Скриншот выполнения инструкции JEDEC ID для SPI FLASH: 
 + 
 +{{:boards:nms-sm-rk3568:firmware_opensource:run_spi.jpeg|}} 
 + 
 +Как видно на скриншоте, вводить байты можно как с 0x, так и без. 
 + 
 +Если использовать несколько байт подряд, то указывать их оптимально через пробел (другие разделители не использовать)
boards/nms-sm-rk3568/firmware_opensource/quick_start.1704994460.txt.gz · Последнее изменение: 2024/01/11 17:34 — Артем Слепов