Особенности работы с платформой 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
контроллер установит все сам и перезагрузится