Особенности работы с платформой rk3399

В данном документе описаны некоторые особенности работы системы на основе Radxa Rock Pi 4C в ОС Linux собранной с помощью Rockchip Linux SDK.

Работа с DDR

Получить информацию о состоянии памяти можно выполнив команду

cat /proc/meminfo

В текущей реализации функция динамического управления частотой памяти Dynamic Memory Controller (DMC) отключена.

Работа с CPUFreq

CPUFreq - подсистема ядра Linux для создания политик управления частотой процессора. Политики задают связи между питанием и частотой процессора.
По умолчанию используется политика динамического изменения частоты в зависимости от нагрузки.

Таблица зависимостей (OPP Table) определяется в файле DTSI для SoC RK3399

Посмотреть текущие настройки можно выполнив команду

cat /sys/kernel/debug/opp/opp_summary

Политики CPUFreq для для SoC RK3399 разбиты на 2 группы 0 - кластер из 4х А53 ,4 - кластер из 2х А72 и расположены в каталогах

/sys/devices/system/cpu/cpufreq/policy0/
/sys/devices/system/cpu/cpufreq/policy4/

В каталогах находятся следующие файлы:

  • related_cpus / All CPUs at the same cluster/
  • affected_cpus / All online CPUs at the same cluster /
  • cpuinfo_transition_latency / the transition time of two frequencies, unit is ns /
  • cpuinfo_max_freq / the maximun operated frequency /
  • cpuinfo_min_freq / the minimun operated frequency /
  • cpuinfo_cur_freq / current frequency get from hardware /
  • scaling_available_frequencies / available frequencies /
  • scaling_available_governors / available cpufreq governors /
  • scaling_governor / current cpufreq governor /
  • scaling_cur_freq / the last frequency set by software/
  • scaling_max_freq / the maximum frequency restricted on software/
  • scaling_min_freq / the minimum frequency restricted on software/
  • scaling_setspeed / used to change frequency when governor is userspace /
  • stats/time_in_state / record work time at each frequency, unit is 10ms /
  • stats/total_trans / record frequency scaling times /
  • stats/trans_table / record frequency scaling times of each frequency /

Для наблюдения за изменениями частоты можно использовать команду

watch -n1 cat /sys/devices/system/cpu/cpufreq/policy*/scaling_cur_freq

или

watch -n1 cat /sys/kernel/debug/clk/armclk*/clk_rate

Для наблюдения за изменениями питания можно использовать команду

watch -n1 cat /sys/kernel/debug/regulator/vdd_cpu_*/voltage

Модуль CPU PVTM (Process-Voltage-Temperature Monitor) расположен рядом с CPU, с его помощью можно управлять производительностью системы. Он используется в процессе регулирования питания CPU в зависимости от температуры.

Например для автоматического понижения частоты процессоров входящих в кластер в файле дерева устройств необходимо прописать следующие узлы

&cluster0_opp {
        // при достижении температуры в 75 градусов
        rockchip,high-temp = <75000>;
        // ограничить уровень питания (значение из oop таблицы соответствующее 1ГГц)
        rockchip,high-temp-max-volt = <925000>;
};

&cluster1_opp {
        rockchip,high-temp = <85000>;
        rockchip,high-temp-max-volt = <850000>;
};

Проверить установки автоматического понижения

echo $((0x`cat /proc/device-tree/opp-table0/rockchip,high-temp |od -t x1 -j1|head -n1|sed s/0000001//|sed -e 's/ //g'`))
echo $((0x`cat /proc/device-tree/opp-table0/rockchip,high-temp-max-volt |od -t x1 -j1|head -n1|sed s/0000001//|sed -e 's/ //g'`))

Политики и частоты можно задавать из командной строки для каждого кластера

echo userspace > /sys/devices/system/cpu/cpufreq/policy0/scaling_governor
echo 216000 > /sys/devices/system/cpu/cpufreq/policy0/scaling_setspeed
echo userspace > /sys/devices/system/cpu/cpufreq/policy4/scaling_governor
echo 408000 > /sys/devices/system/cpu/cpufreq/policy4/scaling_setspeed

Можно включить или отключить конкретный CPU и задать его частоту

echo 0 > /sys/devices/system/cpu/cpu2/online
echo 0 > /sys/devices/system/cpu/cpu3/online
echo 1200000 > /sys/devices/system/cpu/cpu0/cpufreq/scaling_max_freq

Работа с CAN

Перед работой интерфейс необходимо инициализировать.

Для этого необходимо выполнить команды:

ip link set can0 type can bitrate 125000
ip link set up can0

Для просмотра статистики по интерфейсу:

ip -details -statistics link show can0

Значение параметра bitrate , в соответствии со спецификацией CAN:

10000
20000
50000
100000
125000
250000
500000
800000
1000000

В системе сборки buildroot присутствует пакет can-utils содержащий набор утилит для работы с SocketCAN.

Базовые утилиты:

  • candump : отображает, фильтрует и сохраняет историю пакетов CAN интерфейса
  • canplayer : воспроизвоит сохраненную историю пакетов в CAN интерфейс
  • cansend : для отправки одного пакета
  • cangen : генератор трафика для CAN интерфейса

Тестовые уилиты:

  • canbusload : отображает загрузку CAN интерфейса
  • canfdtest : тастирование режима Full-duplex

Работа с GMAC

RGMII (Reduced Gigabit Media Independent Interface) — улучшенный интерфейс GMII указывает конкретный интерфейс между Ethernet MAC и PHY.

Настройки задаются в файле дерева устройств. Особенностью является задание частотных задержек для различных сетевых модулей

&gmac {
        phy-supply = <&vcc_phy>;
        phy-mode = "rgmii";
        clock_in_out = "input";
        snps,reset-gpio = <&gpio3 15 GPIO_ACTIVE_LOW>;
        snps,reset-active-low;
        snps,reset-delays-us = <0 10000 50000>;
        assigned-clocks = <&cru SCLK_RMII_SRC>;
        assigned-clock-parents = <&clkin_gmac>;
        pinctrl-names = "default", "sleep";
        pinctrl-0 = <&rgmii_pins>;
        pinctrl-1 = <&rgmii_sleep_pins>;
        status = "okay";
        // rtl8211e
        tx_delay = <0x26>;
        rx_delay = <0x2d>;
};

Работа с I2C

Для быстрой отладки и контроля работы I2C устройств в состав системы включены диагностические утилиты

i2cdetect - опрос линии, результат выполнения таблица (UU - используется драйвером)

[root@rockpi:~]# i2cdetect -y 0
     0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f
00:          -- -- -- -- -- -- -- -- -- -- -- -- --
10: -- -- -- -- -- -- -- -- -- -- -- -- UU -- -- --
20: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
30: -- -- -- -- -- -- -- -- -- -- -- -- 3c -- -- --
40: UU UU -- -- -- -- -- -- -- -- -- -- -- -- -- --
50: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
60: -- -- 62 -- -- -- -- -- -- -- -- -- -- -- -- --
70: -- -- -- -- -- -- -- --                         

i2cdump - получение данных с устройства

[root@rockpi:~]# i2cdump -f -y 0 0x1c
No size specified (using byte-data access)
     0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f    0123456789abcdef
00: 21 50 08 21 01 13 01 00 00 00 00 01 01 00 00 00    !P?!???....??...
10: 80 02 00 00 00 00 00 81 81 00 00 00 00 00 00 00    ??.....??.......
20: 01 02 08 7f ff 03 c7 00 00 00 00 7f ff 02 12 09    ????.??....?.???
30: 00 00 02 0f 00 00 02 04 00 00 09 0c 00 0c 00 0a    ..??..??..??.?.?
40: 00 0f 0f 0c 0c 07 07 0a 00 0f 00 00 00 dd 00 fc    .???????.?...?.?
50: 00 00 03 00 6c 0c 00 00 00 00 00 00 00 00 00 00    ..?.l?..........
60: 00 00 0c 00 48 00 00 00 00 00 00 00 00 00 00 00    ..?.H...........
70: 00 cf 03 00 00 00 8f 1d e0 21 00 35 24 00 00 00    .??...???!.5$...
80: 16 70 6f b8 00 00 10 49 00 00 08 08 00 00 00 00    ?po?..?I..??....
90: ff 00 00 00 00 00 00 00 01 00 00 00 00 00 00 00    ........?.......
a0: 84 f0 00 ea ca 02 8c 00 00 ff 00 ff 8f 00 80 00    ??.????.....?.?.
b0: 42 4e 01 40 01 20 af 48 01 1f 6a 2b 0f f4 00 00    BN?@? ?H??j+??..
c0: 00 00 0f ff 0f ff 00 c7 00 c7 0f ff 0f ff 00 00    ..?.?..?.??.?...
d0: 00 00 09 2c 00 0a d9 0f 40 00 00 00 00 09 02 00    ..?,.???@....??.
e0: 64 00 00 1e c9 00 00 00 1e ec 00 00 00 00 c0 00    d..??...??....?.
f0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00    ................

i2cget - получение значения регистра с устройства

[root@rockpi:~]# i2cget -f -y 0 0x1c 0xa0
0x84

i2cset - запись значения регистра на устройство

i2cset -f -y 0 0x1c 0xa0 0x84

Работа с IO-Domain

Вывести информацию по состоянию доменов питания

cat /sys/kernel/debug/regulator/regulator_summary

Работа с GPIO

Интерфейс ввода/вывода общего назначения (general-purpose input/output, GPIO)

Управление через sysfs

sysfs — виртуальная файловая система в операционной системе Linux. Экспортирует в пространство пользователя информацию ядра Linux о присутствующих в системе устройствах и драйверах.

Получить информацию о зарегистрированных в системе GPIO

cat /sys/kernel/debug/gpio

Пример определения GPIO как выхода (вместо xxx указывается расчетный номер)

echo xxx > /sys/class/gpio/export
echo out > /sys/class/gpioxxx/direction
echo 1 > /sys/class/gpioxxx/value
echo 0 > /sys/class/gpioxxx/value

Управление через libgpiod

Libgpiod (Library General Purpose Input/Output device) предоставляет набор API для вызова из своих программ и несколько утилит для управления.

В ядре Linux старше 4.8 система gpiolib занимается регистрацией и распределением GPIO. Эта структура доступна через API как для драйверов устройств, работающих в пространстве ядра (kernel space), так и для приложений пользовательского пространства (user space).

gpiodetect - информация о доступных линиях

[root@rockpi:~]# gpiodetect
gpiochip4 [gpio4] (32 lines)
gpiochip3 [gpio3] (32 lines)
gpiochip2 [gpio2] (32 lines)
gpiochip1 [gpio1] (32 lines)
gpiochip0 [gpio0] (32 lines)

gpioinfo - состояние линии

[root@rockpi:~]# gpioinfo gpio3
gpiochip3 - 32 lines:
    line   0:      unnamed       unused   input  active-high
    line   1:      unnamed       unused   input  active-high
    line   2:      unnamed       unused   input  active-high
    line   3:      unnamed       unused   input  active-high
    line   4:      unnamed       unused   input  active-high
    line   5:      unnamed       unused   input  active-high
    line   6:      unnamed       unused   input  active-high
    line   7:      unnamed       unused   input  active-high
    line   8:      unnamed       unused   input  active-high
    line   9:      unnamed       unused   input  active-high
    line  10:      unnamed       unused   input  active-high
    line  11:      unnamed       unused   input  active-high
    line  12:      unnamed       unused   input  active-high
    line  13:      unnamed       unused   input  active-high
    line  14:      unnamed       unused   input  active-high
    line  15:      unnamed "mdio-reset"  output  active-high [kernel]
    line  16:      unnamed       unused   input  active-high
    line  17:      unnamed       unused   input  active-high
    line  18:      unnamed       unused   input  active-high
    line  19:      unnamed       unused   input  active-high
    line  20:      unnamed       unused   input  active-high
    line  21:      unnamed       unused   input  active-high
    line  22:      unnamed       unused   input  active-high
    line  23:      unnamed       unused   input  active-high
    line  24:      unnamed       unused   input  active-high
    line  25:      unnamed       unused   input  active-high
    line  26:      unnamed       unused   input  active-high
    line  27:      unnamed       unused   input  active-high
    line  28:      unnamed  "user-led1"  output  active-high [kernel]
    line  29:      unnamed  "user-led2"  output  active-high [kernel]
    line  30:      unnamed       unused   input  active-high
    line  31:      unnamed       unused   input  active-high

gpioset - установить состояние выхода

gpioset 4 21=0
gpioset 4 21=1

gpioget - получить состояние выхода

gpioget 4 21

Управление светодиодами при помощи leds-gpio

leds-gpio - драйвер управления светодиодами подключенными к GPIO

Конфигурация задается в дереве устройств

Вывод доступных системных труггеров для светодиода

[root@rockpi:~]# cat /sys/class/leds/user-led2/trigger
none rfkill-any rfkill-none kbd-scrolllock kbd-numlock kbd-capslock
kbd-kanalock kbd-shiftlock kbd-altgrlock kbd-ctrllock kbd-altlock
kbd-shiftllock kbd-shiftrlock kbd-ctrlllock kbd-ctrlrlock
battery-charging-or-full battery-charging battery-full
battery-charging-blink-full-solid usb-online ac-online mmc0 mmc1 mmc2
timer disk-activity disk-read disk-write ide-disk [heartbeat] gpio
cpu cpu0 cpu1 cpu2 cpu3 cpu4 cpu5 default-on transient netdev rfkill0

Отключение триггера и ручное управление

echo none > /sys/class/leds/user-led2/trigger
echo 0 > /sys/class/leds/user-led2/brightness
echo 1 > /sys/class/leds/user-led2/brightness

Работа с BAT

Информация о подключенной к БП батарее

[root@rockpi:~]# cat /sys/devices/platform/ff3c0000.i2c/i2c-0/0-001c/rk818-battery/uevent
DEVTYPE=mfd_device
DRIVER=rk818-battery
OF_NAME=battery
OF_FULLNAME=/i2c@ff3c0000/pmic@1c/battery
OF_COMPATIBLE_0=rk818-battery
OF_COMPATIBLE_N=1
MODALIAS=of:NbatteryT<NULL>Crk818-battery

Включить/отключить режим вывода статусных сообщений

echo 1 > /sys/module/rk818_battery/parameters/dbg_level
echo 0 > /sys/module/rk818_battery/parameters/dbg_level

Мониторинг сообщений

tail -f /var/log/message
May 23 08:54:48 rockpi user.info kernel: [14674.411681] ------- DEBUG REGS, [Ver: 7.1] -------------------
May 23 08:54:48 rockpi user.info kernel: [14674.411681] GGCON=0x42, GGSTS=0x4e, RTC=0x 6, DCDC_EN2=0x7f
May 23 08:54:48 rockpi user.info kernel: [14674.411681] SUP_STS= 0x84, VB_MOD=0x 2, USB_CTRL=0xf0
May 23 08:54:48 rockpi user.info kernel: [14674.411681] THERMAL=0x 8, MISC_MARK=0xc0, TS_CTRL=0x8f
May 23 08:54:48 rockpi user.info kernel: [14674.411681] CHRG_CTRL:REG1=0xea, REG2=0xca, REG3=0x 2
May 23 08:54:48 rockpi user.info kernel: [14674.411681] INT_STS:  REG1=0x 0, REG2=0x 0
May 23 08:54:48 rockpi user.info kernel: [14674.411681] INT_MSK:  REG1=0xdd, REG2=0xfc
May 23 08:54:48 rockpi user.info kernel: [14674.412296] <rk818_bat_get_ioffset>. ioffset: 0x901
May 23 08:54:48 rockpi user.info kernel: [14674.413104] <rk818_bat_get_coffset>. coffset: 0x92c
May 23 08:54:48 rockpi user.info kernel: [14674.413191] ###############################################################
May 23 08:54:48 rockpi user.info kernel: [14674.413191] Dsoc=99, Rsoc=99, Vavg=4404, Iavg=-18, Cap=7844, Fcc=7916, d=0
May 23 08:54:48 rockpi user.info kernel: [14674.413191] K=-1000, Mode=SMOOTH, Oldcap=7844, Is=3000, Ip=450, Vs=4350
May 23 08:54:48 rockpi user.info kernel: [14674.413191] fb_temp=105, bat_temp=188, sample_res=20, USB=0, DC=0
May 23 08:54:48 rockpi user.info kernel: [14674.413191] off:i=0x901, c=0x92c, p=42, Rbat=65, age_ocv_cap=0, fb=0, hot=0
May 23 08:54:48 rockpi user.info kernel: [14674.413191] adp:finish=0, boot_min=244, sleep_min=0, adc=0, Vsys=4404
May 23 08:54:48 rockpi user.info kernel: [14674.413191] bat:BAT, meet: soc=100, calc: dsoc=100, rsoc=100, Vocv=4403
May 23 08:54:48 rockpi user.info kernel: [14674.413191] pwr: dsoc=100, rsoc=100, vol=4403, halt: st=0, cnt=0, reboot=0
May 23 08:54:48 rockpi user.info kernel: [14674.413191] ocv_c=0: 0 -> 0; max_c=0: 0 -> 0; force_c=0: 0 -> 0
May 23 08:54:48 rockpi user.info kernel: [14674.413191] min=0, init=0, sw=0, below0=0, first=1, changed=99
May 23 08:54:48 rockpi user.info kernel: [14674.413191] ###############################################################

Информация по доменам питания

cat /sys/kernel/debug/pm_genpd/pm_genpd_summary

Управление PWM Backlight

Получить текущий уровень подсветки

cat /sys/class/backlight/backlight/brightness

Задать уровень подсветки

echo xxx > /sys/class/backlight/backlight/brightness

Режим сна (suspend)

Посмотреть источники пробуждения

cat /sys/kernel/debug/wakeup_sources

Тест засыпания системы на 30 секунд

echo 30 > /sys/module/suspend/parameters/pm_test_delay
echo core > /sys/power/pm_test
echo mem > /sys/power/state

Проверка статуса

[root@rockpi:~]# cat /sys/kernel/debug/suspend_stats
success: 1
fail: 0
failed_freeze: 0
failed_prepare: 0
failed_suspend: 0
failed_suspend_late: 0
failed_suspend_noirq: 0
failed_resume: 0
failed_resume_early: 0
failed_resume_noirq: 0
failures:
  last_failed_dev:

  last_failed_errno:    0
            0
  last_failed_step:

Работа с SARADC

SARADC (successive-approximation ADC) - тип аналогоцифрового преобразователя

Получение данных со всех подключенных линий

cat /sys/bus/iio/devices/iio\:device0/in_voltage*_raw

Получение данных с линии 1

[root@rockpi:~]# cat /sys/bus/iio/devices/iio\:device0/in_voltage1_raw
1023

Работа с температурой

В системе определено несколько температурных зон

Получение температуры CPU

cat /sys/class/thermal/thermal_zone0/temp

Получение температуры GPU

cat /sys/class/thermal/thermal_zone1/temp

Мониторинг температуры CPU

watch -n1 cat /sys/class/thermal/thermal_zone0/temp

Работа с UART

Список зарегистрированных в системе

[root@rockpi:~]# ls /dev/ttyS*
/dev/ttyS0

Работа с USB

OTG порт USB может работать в двух режимах

  • host - используется для подключения внешних устройств (KBD,HDD,Mouse...)
  • peripheral - используется для подключения к компьютеру в качестве устройства (ADB,RNDIS,MTP...)

Переключение режимов работы

echo host > sys/devices/platform/ff770000.syscon/ff770000.syscon:usb2-phy@e450/otg_mode
echo peripheral > /sys/devices/platform/ff770000.syscon/ff770000.syscon:usb2-phy@e450/otg_mode

USB gadget mode

Дополнительные настройки ПО в режиме peripheral

Режим ADB

Режим по умолчанию

Инициализация происходит при загрузке скриптом

/etc/init.d/S50usbdevice

Конфигурация задана в файле

cat /etc/init.d/.usb_config
usb_adb_en

Режим RNDIS

Для включения режима необходимо

изменить конфигурацию

echo usb_rndis_en > /etc/init.d/.usb_config

Переместить скрипт инициализации перед инициализацией сети

mv /etc/init.d/S50usbdevice /etc/init.d/S30usbdevice

Запретить получение адреса по DHCP для сетевого интерфейса usb0

echo 'denyinterfaces usb0' >> /etc/dhcpcd.conf

Прописать статическую конфигурацию для сетевого интерфейса usb0

vi /etc/network/interfaces

auto usb0
iface usb0 inet static
address 192.168.77.77
netmask 255.255.255.0

Настроить DHCP server для сетевого интерфейса usb0

Работа с WATCHDOG

Для активации отправить любой символ

echo A > /dev/watchdog

Если в течение 20 секунд отпраку не повторить система будет перезагружена

Отключить активированный ВД

echo V > /dev/watchdog

Работа с системой обновлений

Положить файл update.img на контроллер в каталог /userdata

update ota /userdata/update.img

контроллер установит все сам и перезагрузится

Опубликовано: