- 作者:
- 分类:知识&开发->MCU SOC->RK3588
- 阅读:18833
- 点赞:140
- 版权:CC BY-SA 4.0
- 创建:2022-12-12
- 更新:2023-08-17
原文链接(持续更新):https://neucrack.com/p/466
还在更新中,目前是随便记录的,内容可能会比较乱,参考即可,后面会整理
本文记录了 ROCK5B (RK3588) 的开箱记录,以及遇到的问题及解决方法,有些地方可能时临时加进去或者后来加进去的,整篇文章从前到后不一定完全时先后顺序发生的,可以根据自己遇到的问题查找一下,也可以通篇浏览查看。
ROCK5B (RK3588) 使用 SD(Micro-SD/TF) 卡烧录系统并启动
按照 https://wiki.radxa.com/Rock5/5b/getting_started 下载并烧录系统,这里先测试下 ubuntu(server 版本)(不建议一开始使用这个系统,bug多,先用debian或者 armbian(推荐) 或者 安卓, 安卓是最好上手的)。
这里系统盘制作好了会发现磁盘最后面有一段空闲分区,不用手动去扩展,ubuntu 系统第一次启动会自动扩容根目录到卡的最大空间。
可以使用串口模块查看日志,串口连接(波特率是 1500000 ,可能有些串口模块不支持这么高的波特率)
但是日志是不完全的,因为默认系统都关闭了日志打印,也不能看到什么消息
Ubuntu 第一次开机 会一直循环
[ 9.952843] BUG: spinlock bad magic on CPU#1, systemd-udevd/433
[ 9.957383] lock: 0xffffffc012b26080, .magic: 00000000, .owner: <none>/-1, .owner_cpu: 0
[ 12.590411] reboot: Restarting system
DDR Version V1.08 20220617
LPDDR4X, 2112MHz
channel[0] BW=16 Col=10 Bk=8 CS0 Row=17 CS1 Row=17 CS=2 Die BW=8 Size=4096MB
channel[1] BW=16 Col=10 Bk=8 CS0 Row=17 CS1 Row=17 CS=2 Die BW=8 Size=4096MB
channel[2] BW=16 Col=10 Bk=8 CS0 Row=17 CS1 Row=17 CS=2 Die BW=8 Size=4096MB
channel[3] BW=16 Col=10 Bk=8 CS0 Row=17 CS1 Row=17 CS=2 Die BW=8 Size=4096MB
Manufacturer ID:0x6
CH0 RX Vref:28.7%, TX Vref:24.8%,25.8%
CH1 RX Vref:28.7%, TX Vref:24.8%,23.8%
CH2 RX Vref:27.7%, TX Vref:24.8%,23.8%
CH3 RX Vref:29.7%, TX Vref:24.8%,24.8%
change to F1: 528MHz
change to F2: 1068MHz
change to F3: 1560MHz
change to F0: 2112MHz
out
INFO: Preloader serial: 2
NOTICE: BL31: v2.3():v2.3-405-gb52c2eadd:derrick.huang
NOTICE: BL31: Built : 11:23:47, Aug 15 2022
INFO: spec: 0x1
INFO: ext 32k is not valid
INFO: GICv3 without legacy support detected.
INFO: ARM GICv3 driver initialized in EL3
INFO: system boots from cpu-hwid-0
INFO: idle_st=0x21fff, pd_st=0x11fff9, repair_st=0xfff70001
INFO: dfs DDR fsp_params[0].freq_mhz= 2112MHz
INFO: dfs DDR fsp_params[1].freq_mhz= 528MHz
INFO: dfs DDR fsp_params[2].freq_mhz= 1068MHz
INFO: dfs DDR fsp_params[3].freq_mhz= 1560MHz
INFO: BL31: Initialising Exception Handling Framework
INFO: BL31: Initializing runtime services
WARNING: No OPTEE provided by BL2 boot loader, Booting device without OPTEE initialization. SMC`s destined for OPTEE will return SMC_UNK
ERROR: Error initializing runtime service opteed_fast
INFO: BL31: Preparing for EL3 exit to normal world
INFO: Entry point address = 0x200000
INFO: SPSR = 0x3c9
[ 10.314850] BUG: spinlock bad magic on CPU#5, systemd-udevd/394
[ 10.316119] lock: 0xffffffc012b05080, .magic: 00000000, .owner: <none>/-1, .owner_cpu: 0
暂时不知道为什么,担心电源不行,从苹果的 18w 充电头换成了苹果 ipad 送的 20w 充电头以防万一(确实跟电源关系很大,看后文),果然立马就能跑起来,虽然还是报错(这个错误也有可能是 bootloader 烧录错了,可以检查一下,比如 armbian 系统和官方系统的bootloader不一样。。)
[ 10.305132] BUG: spinlock bad magic on CPU#7, systemd-udevd/379
[ 10.305139] lock: 0xffffffc012a25080, .magic: 00000000, .owner: <none>/-1, .owner_cpu: 0
先跑起来后面再说
HDMI 插上也没有反应,串口终端
[ 723.967060] rockchip-hdptx-phy-hdmi fed70000.hdmiphy: hdptx phy pll locked!
[ 723.967381] rockchip-hdptx-phy-hdmi fed70000.hdmiphy: hdptx phy lane locked!
[ 726.353844] Buffer I/O error on device mmcblk0p2, logical block 12289
[ 726.354406] Buffer I/O error on device mmcblk0p2, logical block 141311
[ 726.354819] Buffer I/O error on device mmcblk0p2, logical block 141312
[ 726.355469] Buffer I/O error on device mmcblk0p2, logical block 141318
[ 726.355885] Buffer I/O error on device mmcblk0p2, logical block 141319
[ 726.356330] Buffer I/O error on device mmcblk0p2, logical block 141323
[ 726.356738] Buffer I/O error on device mmcblk0p2, logical block 141324
[ 726.357180] Buffer I/O error on device mmcblk0p2, logical block 141326
[ 726.357586] Buffer I/O error on device mmcblk0p2, logical block 141327
[ 726.357992] Buffer I/O error on device mmcblk0p2, logical block 141328
[ 726.363448] Aborting journal on device mmcblk0p2-8.
[ 726.363592] JBD2: Error -5 detected when updating journal superblock for mmcblk0p2-8.
[ 726.364213] EXT4-fs (mmcblk0p2): I/O error while writing superblock
[ 726.364331] EXT4-fs error (device mmcblk0p2): ext4_journal_check_start:83: Detected aborted journal
[ 726.364484] EXT4-fs (mmcblk0p2): Remounting filesystem read-only
[ 726.364594] EXT4-fs (mmcblk0p2): ext4_writepages: jbd2_start: 9223372036854775779 pages, ino 11320; err -30
[ 726.418700] JBD2: Error while async write back metadata bh 814.
[ 726.428108] EXT4-fs error (device mmcblk0p2): __ext4_find_entry:1611: inode #4508: comm systemd-udevd: reading directory lblock 0
[ 726.428414] EXT4-fs (mmcblk0p2): I/O error while writing superblock
[ 726.428590] EXT4-fs error (device mmcblk0p2): __ext4_find_entry:1611: inode #548: comm systemd-udevd: reading directory lblock 0
[ 726.428767] EXT4-fs (mmcblk0p2): I/O error while writing superblock
[ 726.428883] EXT4-fs error (device mmcblk0p2): __ext4_find_entry:1611: inode #2119: comm systemd-udevd: reading directory lblock 0
[ 726.429062] EXT4-fs error (device mmcblk0p2): __ext4_find_entry:1611: inode #2: comm systemd-udevd: reading directory lblock 0
[ 726.429233] EXT4-fs error (device mmcblk0p2): __ext4_find_entry:1611: inode #4508: comm systemd-udevd: reading directory lblock 0
这读取文件系统错误,有可能TF卡松动了,裸板的设计,没有外壳的时候TF卡确实很容易松动, 断电插紧重启即可
运行一会儿后又出现了问题。。。
[ 1147.255838] rk806 spi2.0: SPI transfer timed out
[ 1147.263313] spi_master spi2: failed to transfer one message from queue
[ 1147.270938] cpu cpu0: rockchip_cpufreq_set_volt: failed to set voltage (925000 925000 950000 uV): -11
[ 1147.278907] cpufreq: __target_index: Failed to change cpu frequency: -110
[ 1147.489206] rk806 spi2.0: SPI transfer timed out
rk806 貌似是电源管理 IC,看样子有可能是充电协议握手出现了啥问题,先不管,断电重启,之后再说。
更换国内源,比如中科大 mirrors.ustc.edu.cn
,编辑 /etc/apt/sources.list
deb http://mirrors.ustc.edu.cn/ubuntu-ports/ focal main restricted universe multiverse
#deb-src http://mirrors.ustc.edu.cn/ubuntu-ports/ focal main restricted universe multiverse
deb http://mirrors.ustc.edu.cn/ubuntu-ports/ focal-security main restricted universe multiverse
#deb-src http://mirrors.ustc.edu.cn/ubuntu-ports/ focal-security main restricted universe multiverse
deb http://mirrors.ustc.edu.cn/ubuntu-ports/ focal-updates main restricted universe multiverse
#deb-src http://mirrors.ustc.edu.cn/ubuntu-ports/ focal-updates main restricted universe multiverse
deb http://mirrors.ustc.edu.cn/ubuntu-ports/ focal-backports main restricted universe multiverse
#deb-src http://mirrors.ustc.edu.cn/ubuntu-ports/ focal-backports main restricted universe multiverse
apt update
发现报错, 又报错了
W: GPG error: http://apt.radxa.com/focal-stable focal InRelease: The following signatures couldn't be v
erified because the public key is not available: NO_PUBKEY 9B98116C9AA302C7
按照通用做法
sudo gpg --keyserver keyserver.ubuntu.com --recv-keys 9B98116C9AA302C7
报错 gpg: keyserver receive failed: No data
,于是去apt.radxa.com
源看看
wget -O - apt.radxa.com/focal-stable/public.key | sudo apt-key add -
电源
首先你可能就会遇到板子疯狂重启进不了系统,就像前面我遇到的一样。。。
电源因为用了 type-c 口供电,而且整个系统的功耗也不小,很轻松打到十几瓦,所以是支持快充的,问题也在这里,快充需要协商电压电流,这个工作时系统启动后系统(kernel)做的工作,而有些快充要求比较严格,可能在加载并运行kernel之前耗时太久了和快充通讯不够及时快充自己就断电了这样的情况,所以在用 SD 卡启动时比较容易遇到这个问题,因为 SD 读取太慢了耗费了太多时间,同时官方的系统默认都是关闭了串口打印调试信息的,而且默认把串口波特率设置成了 15000000, 并且说是优化了 uboot在 uboot阶段就协商电压,所以对于没在boot阶段就协商电压的固件就很难启动(那为什么不在从SPI flash启动时就协商好了算了呢,不太确定官方提供的SPI bootloader 有没有这样的作用),如果这样还是很容易出问题,所以解决方法有几个:
- 买官方的快充,据说是测试了很多情况的,我没买不清楚实际效果是不是更好
- 换 eMMC 启动, eMMC 一般都比你手上的 SD 卡读写速度更快
- 搞个不是快充的电源,提供足够的供电,比如固定 5v3A 的,据说板子上 5v 引脚也可以供电
- 搞个快充诱导的转接头,比如把快充诱导成 9v2A 输出,没了协商就不会出这档子事了(也许吧,我买了一个 PD诱导,诱导前起不来的 TF 卡,诱导后还是起不来哈哈哈哈)
- 搞个 M.2 nvme SSD,启动会很快,虽然我实测我的 苹果 18W 快充(PD)也同样一直重启,不过 20w的苹果快充(PD)倒是可以正常启动,偶尔会在开始重启几次但最终都能起来
- 也许你也可以改改系统的代码优化下协商危慢速的 SD 卡做做优化哈哈哈哈
- 另外,在用小米的另外一个快充时,也遇到了不停重启的问题,换了充电器带的线材就可以启动了,所以线材貌似也有影响(登录系统后看到协商的的电压电流是 20v/1.35A)
PMU 是通过 I2C 连接到芯片的,可以在系统看到当前协商的电压:
sensors tcpm_source_psy_4_0022-i2c-4-22
以及可以看到 typec 的相关信息
grep "" /sys/class/typec/port0/* 2>/dev/null
实际电压可以(需要除以~172.5)
awk '{printf ("%0.2f\n",$1/172.5); }' </sys/devices/iio_sysfs_trigger/subsystem/devices/iio\:device0/in_voltage6_raw
11.98
另外可以在 dts 看到 pd 电源相关
ROCK5B (RK3588) CPU
看看 cpu
cat /proc/cpuinfo
sudo apt-get install cpufrequtils
sudo cpufreq-info
可以看到最大频率为 2.4GHz, 以及 4个小核 1.8GHz
用 7z 在没有风扇的情况下先跑个分看看情况,跑起来手摸cpu盖子还是很烫的
$ apt install p7zip
$ 7zr b
7-Zip (a) [64] 16.02 : Copyright (c) 1999-2016 Igor Pavlov : 2016-05-21
p7zip Version 16.02 (locale=C.UTF-8,Utf16=on,HugeFiles=on,64 bits,8 CPUs LE)
LE
CPU Freq: 64000000 - - - - - - - -
RAM size: 15722 MB, # CPU hardware threads: 8
RAM usage: 1765 MB, # Benchmark threads: 8
Compressing | Decompressing
Dict Speed Usage R/U Rating | Speed Usage R/U Rating
KiB/s % MIPS MIPS | KiB/s % MIPS MIPS
22: 13939 726 1867 13560 | 199330 682 2494 17002
23: 13416 748 1828 13670 | 193846 684 2452 16775
24: 12832 759 1818 13797 | 186688 681 2406 16385
25: 12244 758 1846 13980 | 179663 680 2350 15989
---------------------------------- | ------------------------------
Avr: 748 1840 13752 | 682 2426 16538
Tot: 715 2133 15145
可以看到这里的 speed 和 rating 是树莓派4B 的至少 3 倍了
尝试看看温度,用 ssh 登录试试,串口执行
ifconfig
看到ip,然后ssh root@ip
输入密码root
,报错Permission denied, please try again.
,在串口终端修改密码passwd root
为root
,还是不行,可能默认设置不允许 root 用户登录,修改vim /etc/ssh/sshd_config
添加PermitRootLogin yes
后 重启服务systemctl restart sshd
即可
watch -n 0.1 cat /sys/class/thermal/thermal_zone0/temp
同时跑分,温度最高跑到了72℃
,还是很凉快的。
同时,看一下频率是否跑满了
watch -n 0.1 cpufreq-info -f -c 4
这里 -c 指令核心 id, 可以看到跑分时频率为 2400000Hz 或者 1800000Hz
到此为止,你以为真的跑到 2.4GHz 了吗,99.99%的可能并没有,只是显示 2.4GHz,最开始这个开发板甚至内置了一个测试软件来抽奖看自己买到的 CPU 处于什么水平。。。
RK在rk35系列使用了 PVTM (Process-Voltage-Temperature Monitor) (PVT)来监控系统状态,有一个 MCU 专门来控制频率CPU 频率,以及 NPU GPU
可以参考What is PVTM? Or why your Rockchip RK3588 CPU may not reach 2.4 GHz
还可以参考 cpufreq-rockchip.txt
使用命令 dmesg | grep -E 'pvtm|dmc' | grep -E 'pvtm=|sel='
来查看 CPU 电源情况
rock@rock-5b:~$ dmesg |grep pvtm
[ 8.110543] rockchip-pvtm fda40000.pvtm: pvtm@0 probed
[ 8.110598] rockchip-pvtm fda50000.pvtm: pvtm@1 probed
[ 8.110647] rockchip-pvtm fda60000.pvtm: pvtm@2 probed
[ 8.110693] rockchip-pvtm fdaf0000.pvtm: pvtm@3 probed
[ 8.110736] rockchip-pvtm fdb30000.pvtm: pvtm@4 probed
[ 9.051869] cpu cpu0: pvtm=1456
[ 9.051948] cpu cpu0: pvtm-volt-sel=2
[ 9.060591] cpu cpu4: pvtm=1705
[ 9.064527] cpu cpu4: pvtm-volt-sel=4
[ 9.073916] cpu cpu6: pvtm=1724
[ 9.077872] cpu cpu6: pvtm-volt-sel=5
[ 9.162917] mali fb000000.gpu: pvtm=877
[ 9.162950] mali fb000000.gpu: pvtm-volt-sel=3
[ 9.346530] RKNPU fdab0000.npu: pvtm=880
[ 9.351791] RKNPU fdab0000.npu: pvtm-volt-sel=3
大致上对应应该如下,总之值越大越好,最大值 7, 我这里只有 2 4 5 明显挺糟糕的
上面的信息是由内核报告的 Operating Performance Point (OPP), 但是实际跑的频率通过 ThomasKaiser/SBC-Bench.sh 可以获得(内置的armbian-config
命令中集成了此工具的,可以直接用),比如我的
Checking cpufreq OPP for cpu0-cpu3 (Cortex-A55):
Cpufreq OPP: 1800 Measured: 1798 (1798.646/1798.490/1798.372)
Cpufreq OPP: 1608 Measured: 1614 (1614.427/1614.033/1613.875)
Cpufreq OPP: 1416 Measured: 1414 (1415.323/1414.869/1414.627)
Cpufreq OPP: 1200 Measured: 1233 (1233.787/1233.729/1233.585) (+2.8%)
Cpufreq OPP: 1008 Measured: 1007 (1007.980/1007.956/1007.524)
Cpufreq OPP: 816 Measured: 806 (806.096/806.077/806.039) (-1.2%)
Cpufreq OPP: 600 Measured: 589 (589.884/589.422/589.281) (-1.8%)
Cpufreq OPP: 408 Measured: 391 (391.542/391.489/391.356) (-4.2%)
Checking cpufreq OPP for cpu4-cpu5 (Cortex-A76):
Cpufreq OPP: 2400 Measured: 2227 (2227.990/2227.846/2227.750) (-7.2%)
Cpufreq OPP: 2208 Measured: 2161 (2162.236/2161.558/2161.286) (-2.1%)
Cpufreq OPP: 2016 Measured: 1998 (1998.559/1998.559/1998.414)
Cpufreq OPP: 1800 Measured: 1826 (1826.351/1826.351/1826.271) (+1.4%)
Cpufreq OPP: 1608 Measured: 1623 (1623.824/1623.824/1623.744)
Cpufreq OPP: 1416 Measured: 1442 (1442.152/1442.089/1441.869) (+1.8%)
Cpufreq OPP: 1200 Measured: 1197 (1197.094/1197.094/1196.904)
Cpufreq OPP: 1008 Measured: 1002 (1002.915/1002.132/1002.060)
Cpufreq OPP: 816 Measured: 807 (808.040/806.980/806.826) (-1.1%)
Cpufreq OPP: 600 Measured: 592 (592.867/592.828/592.802) (-1.3%)
Cpufreq OPP: 408 Measured: 394 (394.914/394.905/394.842) (-3.4%)
Checking cpufreq OPP for cpu6-cpu7 (Cortex-A76):
Cpufreq OPP: 2400 Measured: 2243 (2244.059/2243.815/2243.718) (-6.5%)
Cpufreq OPP: 2208 Measured: 2160 (2160.970/2160.925/2160.744) (-2.2%)
Cpufreq OPP: 2016 Measured: 1990 (1990.232/1990.040/1990.040) (-1.3%)
Cpufreq OPP: 1800 Measured: 1812 (1812.294/1812.174/1812.055)
Cpufreq OPP: 1608 Measured: 1604 (1604.397/1604.319/1604.203)
Cpufreq OPP: 1416 Measured: 1421 (1421.929/1421.837/1421.837)
Cpufreq OPP: 1200 Measured: 1214 (1214.996/1214.968/1214.912) (+1.2%)
Cpufreq OPP: 1008 Measured: 1019 (1019.959/1019.934/1019.910) (+1.1%)
Cpufreq OPP: 816 Measured: 818 (818.552/818.433/818.394)
Cpufreq OPP: 600 Measured: 592 (592.906/592.893/592.854) (-1.3%)
Cpufreq OPP: 408 Measured: 394 (394.950/394.905/394.887) (-3.4%)
可以看到,实际只有2.2GHz
,和2.4GHz
足足差了200MHz, 6.5%
,确实很糟糕了。。。
我的开发板的完整的跑分情况看http://ix.io/4iM2
或者github gist
另外 CPU 频率调整策略对性能也有很大影响,如果时当作桌面用,可以考虑调整成“性能”档,让 CPU 一直跑在最高频率,这样界面更不容易卡顿,其它模式我都试过了,感觉很多情况下都不会拉满 CPU 频率,比如使用浏览器拖动窗口能看到明显的卡顿,不过这样发热量也更大,根据实际情况改吧,在armbian-config
命令中system -> CPU
选项中调整
另外,也可以指定特定的程序使用的CPU,用taskset
命令即可,比如设置只在大核跑
taskset -cp 4-7 PID号
或者指定程序执行taskset <COREMASK> <EXECUTABLE>
,比如这样将 vlc程序在核心0上跑
taskset 0x1 vlc
内存
查看频率:
cat /sys/class/devfreq/dmc/cur_freq
cat /sys/kernel/debug/clk/clk_summary | grep ddr
官方说明: The ram for ROCK 5B is LPDDR 4x, two 32bits LPDDR 4x chips make 64bits, data frequency is up to 4224Mhz. ROCK 5B offers 4GB, 8GB and 16GB ram size options.
可以看到实际频率 1068000000
, 1GHz, 查看可用频率
cat /sys/class/devfreq/dmc/available_frequencies
528000000 1068000000 1560000000 2112000000
# 设置 DDR 频率,例如,设置 1560MHz
echo userspace > /sys/class/devfreq/dmc/governor
echo 1560000000 > /sys/class/devfreq/dmc/userspace/set_freq
HDMI 输出
到此为止,HDMI 仍然没有输出,我的显示器是 2k(2560x1440)
cat /sys/class/drm/card0-HDMI-A-1/modes
发现没有 2k 的分辨率
换个 1080p 的显示器接上 HDMI,立马亮了,终端界面tty1出现了,没有桌面。
另外,在使用 debian 系统后,可以直接输出 1080p和4k输出,但均没有 2k 输出可以直接使用, 不过有个最简单的方法就是设置为 4k60fps,然后设置缩放200%即可,因为性能足够, 4k 也不卡。
一定要改也可以参考: https://docs.armbian.com/User-Guide_Fine-Tuning/#screen-resolution-within-xorg
或者参考这里: https://forum.radxa.com/t/ubuntu-image-with-x11-and-resolution-2560x1440/12553/8
compile the dts file
dtc -O dtb -o rk3588-add-hdptxphy_hdmi_clk.dtbo rk3588-add-hdptxphy_hdmi_clk.dtsand install it into your current kernel dtbs directory:
cp rk3588-add-hdptxphy_hdmi_clk.dtbo /boot/dtbs/uname -r/rockchip/overlay/sudo vim /boot/extlinux/extlinux.conf
and replace /dtbs/5.10.66-27-rockchip-gea60d388902d/rockchip/overlay/rock-5b-hdmi1-8k.dtbo with /dtbs/5.10.66-27-rockchip-gea60d388902d/rockchip/overlay/rk3588-add-hdptxphy_hdmi_clk.dtbo
use uname -r to get your current kernel release string and replace it accordingly.
reboot and then change the resolution in you running X11 session.
另外还遇到了开机输入登录界面模糊并且字体很大,登录选项和软键盘都看不到的问题的问题,应该时在2k屏幕时设置了4k@60,并且200%放大后,换成1080p屏幕时使用时会遇到貌似放大仍然生效的问题
本来参考这里: https://askubuntu.com/questions/912052/how-do-i-change-gdm3-login-screen-resolution
sudo cp ~/.config/monitors.xml /var/lib/gdm3/.config
sudo dpkg-reconfigure gdm3
但是没有成功
参考这里: https://forums.linuxmint.com/viewtopic.php?t=289229
原来有登录窗口的设置GUI程序的,把后HiDPI支持从启用变成自动即可,如果换成高分辨率显示器后没有启动hidpi,可以再来选成启用:
用 iwatch工具监测发现是该动了
/etc/lightdm/slick-greeter.conf
文件
功耗
因为从苹果的 18w 充电器换到苹果的20w 充电器后才能使用,难道是超过 18w 了?于是用一个电表大致上看一下功耗:
注意这里都是我在家肉眼看的普通电表测得功耗,没用专业仪器比如有曲线记录或者峰值记录的电源,可能无法测到瞬时跳变功耗:
- 启动过程中最高 5w 左右功耗,也没到 18w,而且发现其实用 20w 的苹果充电器也会遇到开机无限循环并且偶尔每次循环能听到某个器件发出一声的啪的生意,以及每次循环所有指示灯都会熄灭,以及能听到器件的小小的啸叫声,还能味道一股微弱的烧焦味道。。。所以更大的可能性是充电协议握手可能出现了什么奇怪的问题?经过很长时间的循环最终可以启动成功
- 跑起来后 4.4w,拔掉 HDMI 后 3.1w
- 使用 7z 跑分时最高 11.4w
用浏览器放 b站视频会重启,重启后串口终端日志
DDR Version V1.08 20220617
LPDDR4X, 2112MHz
channel[0] BW=16 Col=10 Bk=8 CS0 Row=17 CS1 Row=17 CS=2 Die BW=8 Size=4096MB
channel[1] BW=16 Col=10 Bk=8 CS0 Row=17 CS1 Row=17 CS=2 Die BW=8 Size=4096MB
channel[2] BW=16 Col=10 Bk=8 CS0 Row=17 CS1 Row=17 CS=2 Die BW=8 Size=4096MB
channel[3] BW=16 Col=10 Bk=8 CS0 Row=17 CS1 Row=17 CS=2 Die BW=8 Size=4096MB
Manufacturer ID:0x6
CH0 RX Vref:29.7%, TX Vref:24.8%,25.8%
CH1 RX Vref:29.7%, TX Vref:24.8%,23.8%
CH2 RX Vref:28.7%, TX Vref:24.8%,23.8%
change to F2: 1068MHz
change to F3: 1560MHz
change to F0: 2112MHz
out
INFO: Preloader serial: 2
NOTICE: BL31: v2.3():v2.3-405-gb52c2eadd:derrick.huang
NOTICE: BL31: Built : 11:23:47, Aug 15 2022
INFO: spec: 0x1
INFO: ext 32k is not valid
INFO: GICv3 without legacy support detected. 2.8 | VT102 | 脱机 | ttyUSB0 INFO: ARM GICv3 driver initialized in EL3
INFO: system boots from cpu-hwid-0
INFO: idle_st=0x21fff, pd_st=0x11fff9, repair_st=0xfff70001
INFO: dfs DDR fsp_params[0].freq_mhz= 2112MHz
INFO: dfs DDR fsp_params[1].freq_mhz= 528MHz
INFO: dfs DDR fsp_params[2].freq_mhz= 1068MHz
INFO: dfs DDR fsp_params[3].freq_mhz= 1560MHz
INFO: BL31: Initialising Exception Handling Framework
INFO: BL31: Initializing runtime services
WARNING: No OPTEE provided by BL2 boot loader, Booting device without OPTEE initialization. SMC`s destined for OPTEE will return SMC_UNK
ERROR: Error initializing runtime service opteed_fast
INFO: BL31: Preparing for EL3 exit to normal world
INFO: Entry point address = 0x200000
INFO: SPSR = 0x3c9
Debian GNU/Linux 11 rock-5b ttyFIQ0
rock-5b login: root (automatic login)
Linux rock-5b 5.10.110-34-rockchip-gca15bbe36e6c #rockchip SMP Wed Dec 7 06:54:05 UTC 2022 aarch64
The programs included with the Debian GNU/Linux system are free software;
the exact distribution terms for each program are described in the
individual files in /usr/share/doc/*/copyright.
Debian GNU/Linux comes with ABSOLUTELY NO WARRANTY, to the extent
permitted by applicable law.
上一次登录: 二 12月 13 09:14:02 UTC 2022 ttyFIQ0 上root@rock-5b:~#
debian
用户名密码rock``rock
。
装上后没有中文,需要改下国内源,然后
sudo apt update
sudo apt install locales
sudo dpkg-reconfigure locales
选择所有 zh_CN
开头的, 然后选择 zh_CN.UTF-8 UTF-8
作为默认, 然后vim ~/.bashrc
最后添加一行 export LANG=zh_CN.UTF-8
然后安装中文字体,不装字体的话全是口口口口口
sudo apt install fonts-wqy-zenhei
重启
sudo reboot
另外, debian xfce 出现了有些奇奇怪怪的图像显示问题,有些方块,比如窗口周围一圈黑色的,在 armbian上面没有出现这样的问题
sogou input method
(WARN-9857 dbusstuff.c:248) DBus Service Already Exists
(ERROR-9857 instance.c:443) Exiting.
Armbian
Armbian 适配得更好一点,推荐使用
因为 GPU 驱动大多需要在 wayland 模式下使用,可以设置默认登录到 wayland 窗口管理模式,这样就不用每次登录时选择一次了
sudo vim /etc/gdm3/custom.conf
修改WaylandEnable=true
另外,官网提供的链接不是最新的,可以到github.com/armbian/build/releases 找最新的。
另外, github.com/amazingfate/armbian-rock5b-images 据说是内置了 GPU 相关的驱动,在官方还没完全支持 GPU 前可以尝试这个,具体看后面 GPU 使用部分。
查看 IP
debian 和 armbian 默认都给板子声明了主机名,直接在局域网 ping rock-5b.local
就好了
ping rock-5b.local
中文输入法
装了 armbian, 尝试装搜狗输入法,但是没办法使用,于是转头去装了 fcitx5 + rime输入法 + clover 输入习惯配置
也可以使用 ibus + rime
看clover 习惯配置项目的wiki,看其中的 fcitx5 部分即可
sudo apt install rime
sudo apt install fcitx5-config-qt fcitx5-frontend-qt5 fcitx5-frontend-gtk4 fcitx5-frontend-gtk3 fcitx5-frontend-gtk2
然后系统输入法和语言里面配置 选择 fcitx5(也可以终端执行im-config
来配置) ,另外 fcitx5-configtool 中启用中州韻[yùn]
输入法, 重启 fcitx5,我遇到了不能显示候选框的问题,经过一顿乱装上面这一堆重启后可以用了hhhhh
另外,默写情况下也许需要编辑~/.xprofile
:
export GTK_IM_MODULE=fcitx5
export QT_IM_MODULE=fcitx5
export XMODIFIERS="@im=fcitx5"
export LANG="zh_CN.UTF-8"
export LC_CTYPE="zh_CN.UTF-8"
重启后 fcitx5 可能没有自动启动,需要手动在开始菜单点一下以启动,也可以将desktop文件拷贝到自动启动目录下
sudo cp /usr/share/applications/org.fcitx.Fcitx5.desktop /etc/xdg/autostart/
Android
安卓适配得挺好的,用起来非常流畅,就是在设置分辨率的时候遇到了只能输出 1080p60帧,修改成 1080p120 4k60都没变化。
以及也遇到了一些快充头疯狂重启的问题
SD 卡启动问题
SD 卡读取写入速度比较慢,这也会导致快充握手不及时从而导致系统疯狂上电断电重启。
这里有两张卡,一张慢一点(卡1),另一张快一点(卡2),结果表现却是速度慢的能启动安卓,快的反而不能。。
测速:(都格式化为 ext4并挂载,系统使用 nvme 上的armbian)
命令使用sudo iozone -e -I -a -s 100M -r 4k -r 16k -r 512k -r 1024k -r 16384k -i 0 -i 1 -i 2
卡1:
从这里只能看出来卡2其它各项数据都比卡1好,除了 4k 随机写入,也许是这个影响,又测了一遍卡2:
也差不了多少
ROCK 5B (RK3588) NVME 启动
SD 卡会比较慢,据说太慢还会影响到快充握手,因为快充握手协议是在系统驱动里面的,所以最好用 eMMc 或者 nvme ssd 或者 USB 启动读写更快。
启动流程: 内部有个叫 maskrom 的固件,会优先启动 SPI nor Flash -> sd -> eMMC
默认不支持从 nvme 启动,所以需要额外的引导,将引导保存到 SPI nor Flash中,然后这个固件再引导nvme的系统启动。
于是需要先更新 Nor Flash 的固件,使用 rk 官方的 rkdevtool,注意不能直接就给 nor flash 下载固件,还需要先给 maskrom 传一个用来和 rkdevtool 通讯以及写 flash 等操作的固件,这里名字叫 rk*_spl_loader.bin
,这个固件只会临时运行在内存中。
装 USB 驱动,然后打开 rkdevtool, 按住 maskroom 按钮,上电,软件会检测到设备。
Write by address 默认没勾上,注意勾上
然后下载系统,可以用官方的 debian 或者 armbian
armbian 页面有些提示比如带硬件加速的 kodi 使用
PD is broken on most revisions that are in the wild and is causing boot loop. Workaround is to use stupid / fixed at 5 volts USB-C power supply.
NVME boot can work with eMMC/SD boot or SPI. Check those instructions to install / update SPI boot loader.
In order to enable 3D acceleration:
sudo add-apt-repository ppa:liujianfeng1994/panfork-mesa
sudo add-apt-repository ppa:liujianfeng1994/rockchip-multimedia
sudo apt update
sudo apt dist-upgrade
sudo apt install kodi
To enable kodi hardware decode you have to run kodi under gbm or wayland.
In case you need to run Docker:
update-alternatives –set iptables /usr/sbin/iptables-legacy
update-alternatives –set ip6tables /usr/sbin/ip6tables-legacy
没买 m.2 转 USB转接器,所以直接把 nvme ssd 装到板子上,然后用 SD 卡进 debian 系统
rock@rock-5b:~$ lsblk
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
mtdblock0 31:0 0 16M 0 disk
mmcblk1 179:0 0 29.2G 0 disk
├─mmcblk1p1 179:1 0 512M 0 part /boot
└─mmcblk1p2 179:2 0 28.6G 0 part /
nvme0n1 259:0 0 931.5G 0 disk
可以看到 直接能读到 nvme0n1,直接操作这个固态即可,因为是初次测试,硬盘也是空的,直接
sudo xzcat Armbian_22.11.2_Rock-5b_jammy_legacy_5.10.110_gnome_desktop.img.xz | sudo dd of=/dev/nvme0n1 bs=1M status=progress
写入完成后
nvme0n1 259:0 0 931.5G 0 disk
├─nvme0n1p1 259:1 0 256M 0 part
└─nvme0n1p2 259:2 0 6.8G 0 part
然后断电,拔掉 SD 卡上电即可从 nvme ssd 中的系统启动
进系统后看看接口情况
sudo dmidecode | grep --color "PCI"
speed test:
iozone, fio
iozone -e -I -a -s 100M -r 4k -r 16k -r 512k -r 1024k -r 16384k -i 0 -i 1 -i 2
random random bkwd record stride
kB reclen write rewrite read reread read write read rewrite read fwrite frewrite fread freread
102400 4 131760 167822 191255 204110 49352 108890
102400 16 400881 478178 340041 289103 164730 277126
102400 512 1444041 1676845 1619100 1573208 1314692 1723524
102400 1024 1797630 1854966 1684764 1714470 1559952 1803609
102400 16384 2478047 2356570 2140251 2189357 2261106 2410056
可以看到 我的 SSD 是三星的 970 evo plus, 是支持 nvme3x4 的,1M 读写 分别是 1.68GB/s 1.79GB/s
作为比较,我的电脑主板华硕 z270 也支持 PCIE3.0x4,用了一条支持 PCIE4.0 的 三星980pro(由于主板只支持PCIE3.0x4 所以实际也是使用的PCIE3.0 协议),速度如下:
板子上装的硬盘是 三星970 evo plus 1TB版本,支持 PCIE3.0x4,虽然没在电脑上跑分,根据别人的测评来看和980 pro 装到PCIE3.0x4 上差不多,这是网上找的跑分图(更多参考新技术回馈经典产品:三星970EVO Plus深度对比测试):
虽然都是 PCIE3.0x4 接口,可以看到顺序读写都没有达到在电脑上 3.5GB/s 和 3.3GB/s 的水平,在板子上只能有 2.1GB/s 和 2.5GB/s,读写速度甚至没有写入速度高,随机 4k 读写也只能到 50MB/s 和 108MB/s,远远低于上面测评中的 >= 800MB/s,可见,开发板(armbian22)远远没有跑满 PCIE3.0x4 的速度,暂时不知是硬件还是软件的问题,以后发现了补上
另外,需要考虑散热问题,固态的发热量挺大的!可以通过/dev/nvme0n1
看到固态温度
sudo apt install nvme-cli
sudo nvme smart-log /dev/nvme0 |grep -i "^Temperature"
ROCK5B (RK3588) GPU 硬解
装好 armbian 发现自带的 mpv 播放器只能软解,跑个 4k 直接把 CPU 吃得差不多一卡一卡。
按照 armbian 下载页面的源装了 kodi,不能直接用只能放声音没有画面,是因为无法解码导致的。
参考这个帖子的步骤即可(可以直接重装系统,amazingfate 打包了带这些软件包的系统,也可以自己手动更新包,自己更新会麻烦一点):https://forum.radxa.com/t/rk3588-kodi-rkmpp-accelerated-decoding-working-out-of-box/12785/2 和 https://forum.armbian.com/topic/24802-kodi-for-rk35xx-510-legacy-kernel/
以及 GPU 相关也可以参考玩 我的世界 的帖子: https://forum.radxa.com/t/guide-run-minecraft-at-full-speed-on-rock-5b/11937/8
You have to create the following udev rules to enable mpp and rga hardware acceleration:
KERNEL=="mpp_service", MODE="0660", GROUP="video"
KERNEL=="rga", MODE="0660", GROUP="video"
KERNEL=="system-dma32", MODE="0666", GROUP="video"
KERNEL=="system-uncached-dma32", MODE="0666", GROUP="video" RUN+="/usr/bin/chmod a+rw /dev/dma_heap"
to /etc/udev/rules.d/11-rockchip-multimedia.rules
To enable libv4l-rkmpp for chromium, you have to install libv4l-rkmpp, v4l-utils and chromium-browser in this ppa:
sudo apt install chromium-browser=$(apt-cache show chromium-browser|grep Version|grep rkmpp|cut -d " " -f2) chromium-codecs-ffmpeg-extra=$(apt-cache show chromium-browser|grep Version|grep rkmpp|cut -d " " -f2) libv4l-rkmpp, v4l-utils
Then run the following commands:
sudo ln -s /lib /usr/lib64
cd /usr/lib64/ && sudo ln -s aarch64-linux-gnu/libv4l2.so.0.0.0 libv4l2.so
And add the following lines to /etc/rc.local:
echo dec > /dev/video-dec0
chown root:video /dev/video-dec0
chmod 0660 /dev/video-dec0
echo enc > /dev/video-enc0
chown root:video /dev/video-enc0
chmod 0660 /dev/video-enc0
Add chrome flags "--use-gl=egl" to /etc/chromium-browser/default:
CHROMIUM_FLAGS="--use-gl=egl"
==================================================
chromium related FYI: https://github.com/JeffyCN/libv4l-rkmpp
sudo add-apt-repository ppa:liujianfeng1994/panfork-mesa
sudo apt update
wget https://github.com/JeffyCN/rockchip_mirrors/raw/libmali/firmware/g610/mali_csffw.bin
sudo mv mali_csffw.bin /lib/firmware
需要在 lightdm 或者 gdm 或者 wayland 窗口模式下运行,即开机登录时选择 kodi 或者 wayland
然后打开 kodi 在系统信息处可以看到 windowing system 使用了 gbm 或者 wayland
可是发现木有画面,解码失败了。。。但是 chromium 已经可以硬解了,经群佬tokyo的解答,先看 libav是否安装
dpkg -l|grep libav
发现 各种解码库已经安装
然后使用 mpv 开启硬件播放
pmv --hwdec=rkmpp *.mp4
发现报错了,初始化 mpp 失败了,通过
ls /dev/mpp_service
发现用户组属于 root,前面设置了规则,在/etc/udev/rules.d/11-rockchip-multimedia.rules
,实际情况是没有正确设置 udev 规则! 赶紧检查下 rules 文件,结果发现文件后缀打错字了hhhhh!!改了重启就好了!!
但是还不能直接播放 10bit 的视频,退出登录从kodi
登入,以使用 gbm
windowing system 并且如上面得图配置中 PRIME 渲染方法改成 Direct to plane 就可以播放 10bit 的视频了!
更多信息 10bit 不支持的原因可以看上面 armbian 论坛的帖子讨论
amazingfate:
I’ve created an issue about 10 bit videos not playable on kodi: https://github.com/xbmc/xbmc/issues/22202.Here is the debug log of kodi: https://paste.ubuntu.com/p/C29gywz4Tg/. We can see “CEGLImage::SupportsFormat - format not supported: NA12”. NA12 should come from ffmpeg: https://github.com/JeffyCN/FFmpeg/blob/master/libavcodec/rkmppdec.c#L48. What I concern is why the support list of dma buf format doesn’t have NV15, the yuv420 10bit drm format, which should be supported by the rockchip’s drm driver: https://github.com/friendlyarm/kernel-rockchip/blob/nanopi5-v5.10.y_opt/include/uapi/drm/drm_fourcc.h#L244. Kodi uses eglQueryDmaBufFormatsEXT to get the supported dma buf format: https://github.com/xbmc/xbmc/blob/master/xbmc/utils/EGLImage.cpp#L225.
Anyone knows why egl doesn’t support 10 bit drm format NV15?
jernej:
NV15, although sounds standard, it’s not. It’s RK invention and used only (AFAIK) on their chips. So I would presume not many mesa developers are aware of it and even less care about it. Note, EGL has nothing to do with DRM planes. EGL lists format supported for GPU rendering and DRM planes lists formats supported by Direct to plane rendering. There is catch, though. ffmpeg must provide proper mapping to DRM descriptor. I have no idea if that’s done for NV15 in ffmpeg rkmpp module. If that’s not done, direct to plane method won’t work.Note that I don’t care about vendor solutions and I’m only indirectly involved with RK platforms, so I can’t help you more.
balbes150:
Sorry, I’m not an expert on ffmpeg. As a silly assumption. Have you tried changing the player settings from DRM to EGL ?
amazingfate:
yes I’ve tried both EGL and direct to planel. Direct to plane seems to support more formats.
amazingfate:
Solved by modifying the code of ffmpeg. I can play 10bit videos now. Thank you for your response @jernej @balbes150
另外,遇到了进系统后浏览器非常卡顿的问题,时因为开机登录界面不小心进入了 x11模式,进入wayland就没问题了
网络
有个 2.5G 以太网,是 PCIE 网卡,可以在系统中lspci
看到。
另外也可以用板子上的两个 M.2 接口外接网卡,比如小的 M.2E Key 2230 接口接 WiFi 网卡
外壳 温度
我买的官方的 ¥99 的被动散热外壳。
CPU 不能使用垫片,加了垫片后太高了会把板子顶起来,这个时候 m2 ssd 贴两层散热硅胶片太厚了,一层有不能和底板贴合。最开始不想涂硅脂就是担心硅脂会弄得到处都是,所以最后还是涂了硅脂,硅脂不要涂太多,一般不会弄得到处都是,送的硅脂黏度够,也不会流得到处都是。
另外,如果不想装外壳,只想要底部板子,底板和开发板其实可以用4颗螺丝钉先固定在一起的,但是卖家又没送螺丝钉,不过没有关系也不大,只想要底板不要外壳需要自己找螺丝钉。
加了外壳后 用 7z 跑分 + 播放 4K 视频,CPU温度会上升到 86℃(室温20度左右)。。。所以这个壳子如果在夏天高负荷用估计有点难:
最后手动钻孔加了一个风扇往里面吹,但有落灰的风险:
xbox 手柄驱动
使用 https://github.com/medusalix/xone , 另外还有个 xpadneo 的项目,貌似没有无线接收器的驱动,所以用这个 xone 貌似比较好
发现没有linux headers, 需要先安装,(注意armbian-config
这个脚本通过 dpkg -l 来判断是否已经安装了,如果事先已经安装了 headers,需要先卸载才能用 armbian-config 这个脚本安装, 具体可以看 github/armbin/config) armbian 下直接
armbian-config -> soft -> headers install
cd /usr/src/linux-headers-$(uname -r)
# sudo make prepare
sudo make scripts
sudo ./install.sh
实际遇到了编译时找不到scripts/module.lds
,看安装脚本是用了 dkms Install
命令来编译安装驱动的
待解决
HDMI 输入
摄像头读取
官方的 imx415 摄像头,卖 ¥188
默认只有官方的 debian 是可以直接使用摄像头的, armbian 没有提供使用文档
debian 使用摄像头
在/boot/config.txt
添加
dtoverlay=rock-5ab-camera-imx415
执行
update_extlinux.sh
重启 会出现/dev/video0
到 /dev/video19
Start rkaiq camera preview.
Execute the following command with root user in terminal on desktop.
$ sudo su
# gst-launch-1.0 v4l2src device=/dev/video11 ! video/x-raw,format=NV12,width=3840,height=2160, framerate=30/1 ! xvimagesink
armbian 使用摄像头
参考 armbian device tree 使能驱动
sudo find / -name "rock-5ab-camera-imx415*"
会发现源码目录有 dts,以及 /usr/lib/
目录下有 dtb 文件,于是按照文档说明 往/boot/armbianEnv.txt
里面添加
overlays=rock-5ab-camera-imx415
但是重启后ls /dev/video*
没有看到一堆设备出现,理论上应该直接能用的,于是又手动添加了 dtb
armbian-add-overlay 源码目录下的 dts 文件
这会往 /boot/overlay-user
下添加文件
然后往/boot/armbianEnv.txt
添加
user_overlays: rock-5ab-camera-imx415
实际上我不添加这行重启后也能用了,会有一大堆/dev/video*
设备,不同设备分辨率不同,查看:
$ v4l2-ctl --device /dev/video11 --list-formats-ext
[0]: 'UYVY' (UYVY 4:2:2)
Size: Stepwise 32x16 - 3840x2160 with step 8/8
[1]: 'NV16' (Y/CbCr 4:2:2)
Size: Stepwise 32x16 - 3840x2160 with step 8/8
[2]: 'NV61' (Y/CrCb 4:2:2)
Size: Stepwise 32x16 - 3840x2160 with step 8/8
[3]: 'NV21' (Y/CrCb 4:2:0)
Size: Stepwise 32x16 - 3840x2160 with step 8/8
[4]: 'NV12' (Y/CbCr 4:2:0)
Size: Stepwise 32x16 - 3840x2160 with step 8/8
[5]: 'NM21' (Y/CrCb 4:2:0 (N-C))
Size: Stepwise 32x16 - 3840x2160 with step 8/8
[6]: 'NM12' (Y/CbCr 4:2:0 (N-C))
Size: Stepwise 32x16 - 3840x2160 with step 8/8
看起来格式很多,实际上只支持NV12
:
$ v4l2-ctl --device /dev/video11 --all
Format Video Capture Multiplanar:
Width/Height : 3840/2160
Pixel Format : 'NM12' (Y/CbCr 4:2:0 (N-C))
然后可以使用 GStreamer
工具 打开摄像头了
gst-launch-1.0 v4l2src device=/dev/video11 ! video/x-raw,format=NV12,width=3840,height=2160, framerate=30/1 ! xvimagesink
能看到图像了,不过我的摄像头看起来黑乎乎的(镜头盖已经去掉了)绿绿的,这就是没有 3A 处理的样子
然后参考论坛帖子的用法使用:
这里提到了一个 json 的 IQ 配置文件以及提到了 camera engine, armbian下貌似没有,所以是黑乎乎的画面
/etc/iqfiles/imx415_CMK-OT2022-PX1_IR0147-50IRC-8M-F20.json
Note: You might have a newer file from radxa:
/etc/iqfiles/imx415_RADXA-CAMERA-4K_DEFAULT.json
Basically, when you take a picture, the camera engine does some pre-processing using that appropriate file, helping the camera adjust colors, light, and exposure. It runs in the background in auto mode. Without the camera engine, you get a dark and green image.
$ gst-inspect-1.0 |grep mpp
typefindfunctions: audio/x-musepack: mpc, mpp, mp+
$ systemctl status rkaiq_3A
Unit rkaiq_3A.service could not be found.
发现这两个命令都表现不对,GStreamer 的 mpp 编解码插件没有(可以用,CPU占用高), rkaiq_3A ,如果是 debian系的系统,可以直接在radxa/debos-radxa仓库找到 rkaiq 的 deb 包,另外一个是 rkisp 包,这是旧版包,RK3588 不需要,找不到也可以从 官方的 debian 系统里面扣程序和 IQ 文件到 armbian 中
sudo dpkg -i camera-engine-rkaiq_3.0.2_arm64.deb # 这会安装 ISP 程序和校准文件到 /usr/bin 和 /etc/iqfiles/
sudo systemctl start rkaiq_3A
sudo systemctl enable rkaiq_3A
另外需要安装 gstreamer 的编码插件,使用这个源
$ sudo apt install gstreamer1.0-rockchip1
$ gst-inspect-1.0 |grep mpp
rockchipmpp: mpph264enc: Rockchip Mpp H264 Encoder
rockchipmpp: mpph265enc: Rockchip Mpp H265 Encoder
rockchipmpp: mppjpegdec: Rockchip's MPP JPEG image decoder
rockchipmpp: mppjpegenc: Rockchip Mpp JPEG Encoder
rockchipmpp: mppvideodec: Rockchip's MPP video decoder
rockchipmpp: mppvpxalphadecodebin: VP8/VP9 Alpha Decoder
typefindfunctions: audio/x-musepack: mpc, mpp, mp+
效果(4k 采集,1080p 显示器截图)
定焦的,摄像头打了胶,室内噪点很明显,还算清晰
然后也可以使用 python 程序拍照或者录制视频了
# take_photo.py
import gi
import sys
import time
gi.require_version('Gst', '1.0')
from gi.repository import Gst
# initialize GStreamer
Gst.init(sys.argv)
pipeline = Gst.parse_launch ("v4l2src device=/dev/video11 io-mode=dmabuf num-buffers=1 ! video/x-raw,format=NV12,width=640,height=480 ! mppjpegenc ! filesink location=" + sys.argv[1])
pipeline.set_state(Gst.State.PLAYING)
time.sleep(1)
pipeline.set_state(Gst.State.NULL)
python take_photo.py img.jpg
另外,上面那个源里面还有 obs gsteamer 插件可以使用
但是直接 vlc 无法直接打开,可以通过 gstreamer 输出一个 rtp 流,但是直接推流 mpph264 产生的 h264,vlc 提示没有 SDP 信息,不太熟悉 gstreamer,以后弄了回来补,总之就是通过 gstreamer 可以获得数据了,
下面的命令提示 mpp264enc 不能输出到 MP4mux,暂时无法使用,以后需要再说吧,另外可以参考这里 编译 rtsp server 使用。
$ gst-inspect-1.0 --plugin
sudo gst-launch-1.0 v4l2src device=/dev/video11 ! video/x-raw,format=NV12,width=3840,height=2160, framerate=30/1 ! mpph264enc ! mp4mux ! rtpmp4vpay ! udpsink host=127.0.0.1 port=5000
python 实时读取图像
可以先看看gstreamer 或者三方教程比如All you want, to get started with GStreamer in Python
看设备分别含义,不同设备有着不同的格式支持和分辨率支持
v4l2-ctl --list-devices
v4l2-ctl --device /dev/video12 --all
发现驱动只能输出 NV12 格式的图,但是我们一般在程序里面都想用 RGB 或者 BGR 的图,看 gstreamer 的 mpp 插件也没有写转换的插件,所以暂时只能自己使用 mpp 写了, mpp 有API和转换例程 ,先用 软件转换成 BGR 用着,反正 CPU 够强,实在需要再去用 mpp 添加一个转换方法也行
直接使用 gstreamer 的API 读取
import cv2
def read_cam():
cap = cv2.VideoCapture("v4l2src device=/dev/video11 ! video/x-raw,format=NV12,width=3840,height=2160, framerate=30/1 ! appsink")
if cap.isOpened():
cv2.namedWindow("demo", cv2.WINDOW_AUTOSIZE)
while True:
ret_val, img = cap.read()
img2 = cv2.cvtColor(img, cv2.COLOR_YUV2BGR_NV12)
cv2.imshow('demo',img2)
cv2.waitKey(1)
else:
print("camera open failed")
cv2.destroyAllWindows()
if __name__ == '__main__':
read_cam()
执行sudo python cv2_camera.py
即可,要不用 sudo 使用,执行sudo usermod -aG video ${USER}
,注销生效。
可以把分辨率改小点v4l2src device=/dev/video11 ! video/x-raw,format=NV12,width=640,height=360, framerate=30/1 ! appsink"
, 此时此 python 进程的 CPU 占用率只有 1%,几乎没啥影响,如果是 4k 的话, CPU 占用率 23% 还是有一定的影响的
注意系统里面的 opencv 可能无法使用 GStreamer,比如我在 armbian conda 环境使用pip install opencv-python
装的无法使用,使用sudo apt install python3-opencv
的则可以,可以先试试,可以通过
python -c "import cv2; print(cv2.getBuildInformation())" | grep GStreamer
看到是否支持 GStreamer
,尝试conda install opencv
发现是支持的,如果还不支持恐怕的自己编译添加模块了。
但用conda
的opencv还是遇到了invalid cast from 'GstAppSink' to 'GstBin'
这个错误。。。可能是版本问题,我用系统安装的是 1.19 版本,conda 安装的是 1.14 版本,然而 conda 环境内的 gstreamer 的插件没装,conda search gst
可以看到 1.14 版本没有 plugin-good 插件,但是有一个 1.18 的版本有,所以最简单的就是直接把 conda 里面的删除就好了,或者卸载 1.14版本的装另外一个有 plugin-good 插件版本的
conda list |grep gst
conda remove --force gst-plugins-base
conda remove --force gstreamer
注意这里用了 —force 保证不删除其它包
然后发现就可以使用了
ROCK5B (RK3588) NPU 跑 AI 模型
测试
使用 RK 家的 rknn-toolkit2 以及在板子上的 runtime rknpu2
前者仓库里面有文档(使用入门和算子支持列表)和转换工具(在仓库里面以一个whl包方式提供,也就是说表面上放到 github 实际还是闭源的。。。目前做芯片的几家公司基本都这样,做得一般,且藏着掖着,并且都还想做行业标准,都还在梦里),看文档按装好环境,安装的时候最好创建一个虚拟环境用,因为这个包强制安装特定版本的包,不然可能会破坏你原有的环境,或者是直接用他们提供的docker环境。
conda create -n rknn python=3.8
conda activate rknn
pip install -i https://pypi.douban.com/simple -r doc/requirements_cp38-1.4.0.txt
pip install -i https://pypi.douban.com/simple packages/rknn_toolkit2-1.4.0_22dcfef4-cp38-cp38-linux_x86_64.whl
测试一下官方提供的 yolov5s, onnx 模型是去掉过后处理的,有三个输出,直接执行实例目录下的 test.py
就好了
cd examples/onnx/yolov5/
修改 test.py
中的 API 设置平台
rknn.config(前面的参数保持原样, target_platform="rk3588")
运行
python test.py
然后发现 CPU 利用率挺高的,不是像爱芯的转换工具一样单线程工作2333,不过也没有用到 GPU,全部是 CPU完成的工作,转换速度很快,不过貌似校准图片只用了一张,不知道多张会不会就很慢了。
就得到了 yolov5s.rknn
文件
然后需要 https://github.com/rockchip-linux/rknpu2 运行时环境
编译: 自己下个 aarch64-linux-gnu
工具链在电脑编译即可cd examples/rknn_yolov5_demo/ && build-linux_RK3588.sh
或者直接将 rknpu2 代码克隆到板子,不用像官方文档说的交叉编译, RK3588 性能足够,直接本机编译就不用下载工具链了,只不过官方脚本没有考虑过本机编译,稍微改下 examples/rknn_yolov5_demo/CMakeLists.txt
将所有设置set(LIB_ARCH )
后面强制设置变量set(LIB_ARCH aarch64)
,注意不止一处,官方的脚本写得比较随便,比如
if (CMAKE_C_COMPILER MATCHES "aarch64")
set(LIB_ARCH aarch64)
else()
set(LIB_ARCH armhf)
endif()
set(LIB_ARCH aarch64)
把转换好的模型拷贝到 examples/rknn_yolov5_demo/model/RK3588
下面,并且修改 build-linux_RK3588.sh
中的 CC
为gcc
和 g++
, 另外,修改 examples/rknn_yolov5_demo/main.cc
中 PERF_WITH_POST
值 为0
,以及 test_count
为 50
, 这样我们测试的模型运行时间不包含后处理,只是模型运行的时间
cd examples/rknn_yolov5_demo
./build-linux_RK3588.sh
然后在 install
目录下就有可执行文件了,把其中的 so 库文件拷贝到板子系统的中,比如直接拷贝到 /usr/lib
下就好了,或者不拷贝,设置环境变量指定export LD_LIBRARY_PATH=./lib
。
然后运行模型,先试试默认提供的 yolov5s-640-640.rknn
,这个模型是输出只有85
个通道,照理说官方提供的模型3个输出层都有255
个通道,即(80分类 + 5) * 9个anchor = 255
,这个模型只有 85 个就意味着只有一个 anchor,官方这样的做的目的应该是为了让模型运行看起来更快吧,模型输入都是 640x640
./rknn_yolov5_demo model/RK3588/yolov5s-640-640.rknn model/bus.jpg
sdk version: 1.4.0 (a10f100eb@2022-09-09T09:07:14) driver version: 0.8.2
model input height=640, width=640, channel=3
once run use 37.527000 ms
loop count = 10 , average run 38.967600 ms
这里可以看到运行一次花费了 37.527ms
,10 次平均值 38.967600 ms
,然后试试我们转的官方的255
通道的模型:
./rknn_yolov5_demo ~/yolov5s.rknn model/bus.jpg
once run use 51.609000 ms
loop count = 50 , average run 49.051640 ms
这速度,很糟糕! rk3588 宣称 6Tops 算力,作为对比,爱芯 AX620A 3.6Tops 算力,光是运行模型时间(不算加载模型和后处理时间)能达到 12.6 ms
,貌似看起来反而不如 3.6Tops 算力的芯片,爱芯 1.8Tops 算力耗时 23ms
, RK3588 跑了快 50ms 确实非常慢,但是得确认这个时间是不是纯粹跑模型时间,看源码确认下:
gettimeofday(&start_time, NULL);
rknn_inputs_set(ctx, io_num.n_input, inputs);
rknn_output outputs[io_num.n_output];
memset(outputs, 0, sizeof(outputs));
for (int i = 0; i < io_num.n_output; i++) {
outputs[i].want_float = 0;
}
ret = rknn_run(ctx, NULL);
ret = rknn_outputs_get(ctx, io_num.n_output, outputs, NULL);
gettimeofday(&stop_time, NULL);
printf("once run use %f ms\n", (__get_us(stop_time) - __get_us(start_time)) / 1000);
gettimeofday(&start_time, NULL);
for (int i = 0; i < test_count; ++i) {
rknn_inputs_set(ctx, io_num.n_input, inputs);
ret = rknn_run(ctx, NULL);
ret = rknn_outputs_get(ctx, io_num.n_output, outputs, NULL);
#if PERF_WITH_POST
post_process((int8_t*)outputs[0].buf, (int8_t*)outputs[1].buf, (int8_t*)outputs[2].buf, height, width,
box_conf_threshold, nms_threshold, scale_w, scale_h, out_zps, out_scales, &detect_result_group);
#endif
ret = rknn_outputs_release(ctx, io_num.n_output, outputs);
}
gettimeofday(&stop_time, NULL);
很遗憾,确实就是运行一次,并且没有算上加载模型和后处理的时间,看来宣称的 NPU6Tops 水分很大哦~ 本来觉得爱芯的算力都是很理论的了,这家伙更离谱呢。
也有可能是硬件支持的算子太少,有算子是 CPU 实现的导致的,用个简单的模型试试 mobilnetv2
:发现推理时间在2.3ms ~ 3.8ms
之间,作为对比,爱芯1,8Tops 算力 4ms, 3.6Tops 算力 2ms,CR182x 0.5Tops 算力 5.8ms,看起来比和爱芯的 2Tops 算力相当
查看 NPU 频率:
sudo cat /sys/kernel/debug/clk/clk_summary | grep clk_npu_dsu0
250000000
咋才 250MHz,尝试修改
# 设置 NPU 频率,例如,设置 1GHz
sudo su
echo 1000000000 > /sys/kernel/debug/clk/clk_npu_dsu0/clk_rate
必须要先登录 root 用户执行,不能只用 sudo,不然提示权限不够,再查看频率发现变成了 850MHz,但是实际跑这个yolov5s_demo
对速度却没有明显提升。
后面发现多跑几次 耗时有缩减loop count = 10 , average run 25.978200 ms
结果经过群友提示发现貌似是 NPU 架构问题
所以其实 RK3588 的 NPU 是三核,其实只用了一核,也就是理论 2Tops 算力,另外两个是没用的, 2Tops 37.5ms 和 AX620A 的一半算力 1.8Tops 22ms 比起来也还是差得挺多的。。。
于是又去查看了最新的 API 文档,发现 上面的暂不支持多核 NPU 的红字没了,那是不是可以用多核了呢,如果用上位机运行就修改init_runtime
函数加参数,如果是使用rknpu2
写代码则有个rknn_set_core_mask
函数,在rknn_init
函数之后调用,添加代码
ret = rknn_set_core_mask(ctx, RKNN_NPU_CORE_0_1_2);
if (ret < 0) {
printf("rknn_set_core_mask error ret=%d\n", ret);
return -1;
}
结果发现貌似确实变快了,但不多。。。50次平均时间从之前的50ms
到了38ms
,快了将近10ms
,但是离理论值 6Tops 算力也还是差很多,爱芯的 3.6Tops 12.6ms
, 1.8Tops 算力耗时 23ms
, 已经远远比这 38ms
快了,所以,
总结:
- RK3588 共 3 个NPU,每个 NPU 2Tops@INT8 算力
- 三个 NPU 用起来需要 SDK(rknn2)支持并且已经支持,可以分别单独使用也可以两个或者三个同时使用
- 运行简单的模型速度较快,比如 分类模型 mobilenet
- 运行稍微复杂的模型效率很低,不知道是有硬件无法加速的算子还是软件实现效率太低导致,没有完全发挥出宣称的 6Tops 算力,以 yolov5s 和 mobilnetv2 为测试,以后如果有更新欢迎评论告知或者我自己会更新
ROCK5B (RK3588) 结合摄像头使用 NPU,并跑 YOLOv5 识别摄像头中的物体
先看效果:
Python 调用摄像头和NPU 使用 yolov5s 检测模型,使用 knn-toolkit2-lite,但是官方没有封装 yolov5 的后处理,需要自己从yolov官方代码里面扣,或者自己封装一个 c 后处理的函数。
先安装 rknn-toolkit2-lite 包,需要特定的 python 版本,先装个 miniconda
自己先搞好网络代理,终端使用代理参考Linux 终端代理设置 proxychains polipo
wget https://repo.anaconda.com/miniconda/Miniconda3-latest-Linux-aarch64.sh
chmod + x Miniconda3-latest-Linux-aarch64.sh
./Miniconda3-latest-Linux-aarch64.sh
conda create -n rknn python=3.9
conda activate rknn
pip install conda create -n rknn python=3.9
pip install rknn_toolkit_lite2-1.4.0-cp39-cp39-linux_aarch64.whl
conda install opencv
然后为了使用摄像头,我们用opencv,根据前面摄像头使用, conda 环境用conda install opencv
安装 opencv 才有 gstreamer 支持
结合前面的cv2_camera.py
就可以写一个读取摄像头并且运行模型的程序yolov5_camera.py
辣
import sys
import cv2
import numpy as np
from rknnlite.api import RKNNLite
def read_cam(nn, w, h, callback):
max_w = 3840
min_h = 2160
if max_w / w > min_h / h:
cap_h = h
cap_w = max_w / (min_h // h)
else:
cap_w = w
cap_h = min_h / (max_w // w)
# 16 align
cap_w = int((cap_w + 15) // 16 * 16)
cap_h = int((cap_h + 15) // 16 * 16)
print("capture size:", cap_w, cap_h)
cap = cv2.VideoCapture(f"v4l2src device=/dev/video11 ! video/x-raw,format=NV12,width={cap_w},height={cap_h}, framerate=30/1 ! appsink")
if cap.isOpened():
cv2.namedWindow("demo", cv2.WINDOW_AUTOSIZE)
while True:
ret_val, img = cap.read()
# img2 = cv2.cvtColor(img, cv2.COLOR_YUV2BGR_NV12)
img2 = cv2.cvtColor(img, cv2.COLOR_YUV2RGB_NV12)
# crop wxh from center of img2
img2 = img2[(img2.shape[0] - h) // 2:(img2.shape[0] + h) // 2, (img2.shape[1] - w) // 2:(img2.shape[1] + w) // 2]
boxes = callback(nn, img2)
img2 = cv2.cvtColor(img2, cv2.COLOR_RGB2BGR)
cv2.imshow('demo',img2)
cv2.waitKey(1)
else:
print("camera open failed")
cv2.destroyAllWindows()
def nn_init(rknn_model):
rknn_lite = RKNNLite()
ret = rknn_lite.load_rknn(rknn_model)
if ret != 0:
raise Exception('Load RKNN model failed')
ret = rknn_lite.init_runtime(core_mask=RKNNLite.NPU_CORE_0_1_2) # NPU_CORE_0
if ret != 0:
raise Exception('Init runtime environment failed')
return rknn_lite
def on_image(nn, img):
'''
@img RGB hwc image
'''
# normalization will be done automatically in inference method
outs = nn.inference(inputs=[img])
for i, out in enumerate(outs):
print(f"output {i}: {out.shape}")
print("------")
# TODO: post process
boxes = []
return boxes
if __name__ == '__main__':
width = 640
height = 640
if len(sys.argv) != 2:
print("Usage:")
print(" python yolov5_camera.py yolov5s.rknn")
sys.exit(0)
model = sys.argv[1]
nn = nn_init(model)
read_cam(nn, width, height, on_image)
每次运行前记得激活 conda 环境conda activate rknn
, 以及运行时不能用 sudo,
python yolov5_camera.py ../data/models/yolov5s.rknn
就会看到终端打印出了 3 个输出层的形状,还没有加入后处理,后处理参考这里,yolov5 官方的后处理用了 pytorch,这里的代码是剥离成了纯numpy处理的,结合一下上面的代码就好了,完整的代码在这里
打印了一下各个环节的运行时间
capture use time: 0.000926971435546875
nv12 to RGB use time: 0.002031087875366211
crop to 640x640 use time: 2.0503997802734375e-05
inference use time: 0.05722999572753906
output 0: (1, 255, 80, 80)
output 1: (1, 255, 40, 40)
output 2: (1, 255, 20, 20)
postprocess 0.03584861755371094
draw time: 0.016243457794189453
可以看到主要耗时在模型推理花费了 57ms, 虽然代码设置了 3核NPU 运行,不过貌似没有起效果(和前面用 c sdk 跑的 40ms对比,说明他们这个 python sdk 参数根本没真正用到,包括 inference设置输出排列为 nhwc 也没有生效(2023.1.15)),以及画画面,摄像头因为有缓冲区,30帧摄像头就是需要33ms,其它地方消耗时间远远大于33ms,所以等其它地点运行完来取摄像头数据就直接从准备好数据的缓冲区拿就好了。
蓝牙
参考这里: https://wiki.radxa.com/Rock5/linux/debian#BT
systemctl status bluetooth
systemctl start bluetooth
apt-get install -y pulseaudio-module-bluetooth pulseaudio
hciconfig
pulseaudio --start
在/etc/modprobe.d/blacklist.conf
添加
blacklist pgdrv
blacklist btusb
blacklist btrtl
blacklist btbcm
blacklist btintel
然后重启
docker
sudo apt install docker.io
sudo update-alternatives --set iptables /usr/sbin/iptables-legacy
sudo update-alternatives --set ip6tables /usr/sbin/ip6tables-legacy
sudo docker run -it --rm -v `pwd`:/data ubuntu /bin/bash
远程控制
RDP 远程
sudo armbian-config
里面有个 software -> RDP ,启用即可,或者手动装
sudo apt install xrdp
sudo systemctl status xrdp
sudo systemctl enable xrdp
用 ubuntu 下的 remmina连接,发现只有 root用户登录才能显示界面
windows用自带的远程控制登录即可。
非 root 用户连接,看报错日志
cat /var/log/xrdp-sesman.log
[ERROR] sesman_data_in: scp_process_msg failed
[ERROR] sesman_main_loop: trans_check_wait_objs failed, removing trans
添加用户到组
sudo groupadd render
sudo groupadd ssl-cert
sudo usermod -aG render $USER
sudo usermod -aG ssl-cert xrdp
然后重启,连接就可以了,这次会提示确认 ssl 证书等
不想重启的话可以尝试newgrp ssl-cert
将当前用户临时切换到render
组试试
向日葵
向日葵 arm 版本即可
rustdesk
https://github.com/rustdesk/rustdesk/releases 下载 aarch64 版本即可
ubuntu下运行 Android
参考
- http://www.dalao.pub/2023/02/23/cuttlefish-and-redroid-on-rock5b/ (Armbian 推荐)
- https://zhz.moe/57/ 和 https://wiki.t-firefly.com/zh_CN/iCore-3588Q/usage_aic.html
- https://blog.seeflower.dev/archives/203/
- https://blog.csdn.net/u013833472/article/details/129485916
apt install linux-modules-extra-`uname -r`
modprobe binder_linux devices="binder,hwbinder,vndbinder"
modprobe ashmem_linux
这一步发现没法找到linux-modules-extra-5.10.110-rockchip-rk3588
去armbian 编译了一下,不过发现就算设置了 kernel only, 出来也是个 img 镜像文件,不知道是不是哪里步骤不对。
所以直接在板子里下载内核源码修改编译选项并编译
sudo apt install linux-source-5.10.110-legacy-rockchip-rk3588
cd /usr/src
xz -dkv linux-rockchip-rk3588-legacy_5.10.110_23.02.2_config.xz
cd linux-source-5.10.110-rockchip-rk3588
mv ../linux-rockchip-rk3588-legacy_5.10.110_23.02.2_config .config
make mrproper
make menuconfig
make -j$nproc
make modules_install
make install
cd /boot
sudo mv Image Image.old
sudo ln -s vmlinuz-5.10.110 Image
更改 /boot/armbianEnv.txt
,根据上面第一篇文章所说, Ubuntu22.04使用cgroup v2,不满足redroid需求,需要开启cgroup v1, 添加
extraargs=systemd.unified_cgroup_hierarchy=0
然后重启
尝试用这个命令
docker run -itd --rm --privileged \
--pull always \
-v /data:/data \
-p 5555:5555 \
chisbread/rk3588-gaming:redroid-firefly \
androidboot.redroid_height= 720\
androidboot.redroid_width=1080 \
androidboot.redroid_dpi=320 \
androidboot.redroid_gpu_mode=host \
--mount=type=bind,source=/dev/mali0,destination=/dev/mali0
但是发现显示器直接全屏了安卓,并且鼠标键盘都无法控制,需要使用 adb 进行控制,发现 adb 也连接不上,或者直接系统卡死。。。
感觉镜像还是有问题还是咋滴,反正挺麻烦,没跑起来,有时间又需要再试试,如果你解决了欢迎交流