选中内容(绿色)时除了会搜索文章名,还会搜索文章内容
点击结果中的文章名进入文章界面后可以按Ctrl+F在页面内搜索
  • 版权:CC BY-SA 4.0
  • 创建:2022-12-12
  • 更新:2023-01-20
ROCK5B 上手使用记录和踩坑记录,包括基本系统安装,电源,nvme,GPU使用,视频硬解,NPU等等功能的验证


还在更新中,目前是随便记录的,内容可能会比较乱,参考即可,后面会整理

本文记录了 Rock5B 的开箱记录,以及遇到的问题及解决方法,有些地方可能时临时加进去或者后来加进去的,整篇文章从前到后不一定完全时先后顺序发生的,可以根据自己遇到的问题查找一下,也可以通篇浏览查看。

使用 SD(Micro-SD/TF) 卡烧录系统并启动

按照 https://wiki.radxa.com/Rock5/5b/getting_started 下载并烧录系统,这里先测试下 ubuntu(server 版本)(不建议一开始使用这个系统,bug多,先用debian或者 armbian(推荐) 或者 安卓, 安卓是最好上手的)。

这里系统盘制作好了会发现磁盘最后面有一段空闲分区,不用手动去扩展,ubuntu 系统第一次启动会自动扩容根目录到卡的最大空间。

可以使用串口模块查看日志,串口连接(波特率是 1500000 ,可能有些串口模块不支持这么高的波特率)
seriel

但是日志是不完全的,因为默认系统都关闭了日志打印,也不能看到什么消息

Ubuntu 第一次开机 会一直循环

  1. [ 9.952843] BUG: spinlock bad magic on CPU#1, systemd-udevd/433
  2. [ 9.957383] lock: 0xffffffc012b26080, .magic: 00000000, .owner: <none>/-1, .owner_cpu: 0
  3. [ 12.590411] reboot: Restarting system
  4. DDR Version V1.08 20220617
  5. LPDDR4X, 2112MHz
  6. channel[0] BW=16 Col=10 Bk=8 CS0 Row=17 CS1 Row=17 CS=2 Die BW=8 Size=4096MB
  7. channel[1] BW=16 Col=10 Bk=8 CS0 Row=17 CS1 Row=17 CS=2 Die BW=8 Size=4096MB
  8. channel[2] BW=16 Col=10 Bk=8 CS0 Row=17 CS1 Row=17 CS=2 Die BW=8 Size=4096MB
  9. channel[3] BW=16 Col=10 Bk=8 CS0 Row=17 CS1 Row=17 CS=2 Die BW=8 Size=4096MB
  10. Manufacturer ID:0x6
  11. CH0 RX Vref:28.7%, TX Vref:24.8%,25.8%
  12. CH1 RX Vref:28.7%, TX Vref:24.8%,23.8%
  13. CH2 RX Vref:27.7%, TX Vref:24.8%,23.8%
  14. CH3 RX Vref:29.7%, TX Vref:24.8%,24.8%
  15. change to F1: 528MHz
  16. change to F2: 1068MHz
  17. change to F3: 1560MHz
  18. change to F0: 2112MHz
  19. out
  20. INFO: Preloader serial: 2
  21. NOTICE: BL31: v2.3():v2.3-405-gb52c2eadd:derrick.huang
  22. NOTICE: BL31: Built : 11:23:47, Aug 15 2022
  23. INFO: spec: 0x1
  24. INFO: ext 32k is not valid
  25. INFO: GICv3 without legacy support detected.
  26. INFO: ARM GICv3 driver initialized in EL3
  27. INFO: system boots from cpu-hwid-0
  28. INFO: idle_st=0x21fff, pd_st=0x11fff9, repair_st=0xfff70001
  29. INFO: dfs DDR fsp_params[0].freq_mhz= 2112MHz
  30. INFO: dfs DDR fsp_params[1].freq_mhz= 528MHz
  31. INFO: dfs DDR fsp_params[2].freq_mhz= 1068MHz
  32. INFO: dfs DDR fsp_params[3].freq_mhz= 1560MHz
  33. INFO: BL31: Initialising Exception Handling Framework
  34. INFO: BL31: Initializing runtime services
  35. WARNING: No OPTEE provided by BL2 boot loader, Booting device without OPTEE initialization. SMC`s destined for OPTEE will return SMC_UNK
  36. ERROR: Error initializing runtime service opteed_fast
  37. INFO: BL31: Preparing for EL3 exit to normal world
  38. INFO: Entry point address = 0x200000
  39. INFO: SPSR = 0x3c9
  40. [ 10.314850] BUG: spinlock bad magic on CPU#5, systemd-udevd/394
  41. [ 10.316119] lock: 0xffffffc012b05080, .magic: 00000000, .owner: <none>/-1, .owner_cpu: 0

暂时不知道为什么,担心电源不行,从苹果的 18w 充电头换成了苹果 ipad 送的 20w 充电头以防万一(确实跟电源关系很大,看后文),果然立马就能跑起来,虽然还是报错

  1. [ 10.305132] BUG: spinlock bad magic on CPU#7, systemd-udevd/379
  2. [ 10.305139] lock: 0xffffffc012a25080, .magic: 00000000, .owner: <none>/-1, .owner_cpu: 0

先跑起来后面再说

HDMI 插上也没有反应,串口终端

  1. [ 723.967060] rockchip-hdptx-phy-hdmi fed70000.hdmiphy: hdptx phy pll locked!
  2. [ 723.967381] rockchip-hdptx-phy-hdmi fed70000.hdmiphy: hdptx phy lane locked!
  3. [ 726.353844] Buffer I/O error on device mmcblk0p2, logical block 12289
  4. [ 726.354406] Buffer I/O error on device mmcblk0p2, logical block 141311
  5. [ 726.354819] Buffer I/O error on device mmcblk0p2, logical block 141312
  6. [ 726.355469] Buffer I/O error on device mmcblk0p2, logical block 141318
  7. [ 726.355885] Buffer I/O error on device mmcblk0p2, logical block 141319
  8. [ 726.356330] Buffer I/O error on device mmcblk0p2, logical block 141323
  9. [ 726.356738] Buffer I/O error on device mmcblk0p2, logical block 141324
  10. [ 726.357180] Buffer I/O error on device mmcblk0p2, logical block 141326
  11. [ 726.357586] Buffer I/O error on device mmcblk0p2, logical block 141327
  12. [ 726.357992] Buffer I/O error on device mmcblk0p2, logical block 141328
  13. [ 726.363448] Aborting journal on device mmcblk0p2-8.
  14. [ 726.363592] JBD2: Error -5 detected when updating journal superblock for mmcblk0p2-8.
  15. [ 726.364213] EXT4-fs (mmcblk0p2): I/O error while writing superblock
  16. [ 726.364331] EXT4-fs error (device mmcblk0p2): ext4_journal_check_start:83: Detected aborted journal
  17. [ 726.364484] EXT4-fs (mmcblk0p2): Remounting filesystem read-only
  18. [ 726.364594] EXT4-fs (mmcblk0p2): ext4_writepages: jbd2_start: 9223372036854775779 pages, ino 11320; err -30
  19. [ 726.418700] JBD2: Error while async write back metadata bh 814.
  20. [ 726.428108] EXT4-fs error (device mmcblk0p2): __ext4_find_entry:1611: inode #4508: comm systemd-udevd: reading directory lblock 0
  21. [ 726.428414] EXT4-fs (mmcblk0p2): I/O error while writing superblock
  22. [ 726.428590] EXT4-fs error (device mmcblk0p2): __ext4_find_entry:1611: inode #548: comm systemd-udevd: reading directory lblock 0
  23. [ 726.428767] EXT4-fs (mmcblk0p2): I/O error while writing superblock
  24. [ 726.428883] EXT4-fs error (device mmcblk0p2): __ext4_find_entry:1611: inode #2119: comm systemd-udevd: reading directory lblock 0
  25. [ 726.429062] EXT4-fs error (device mmcblk0p2): __ext4_find_entry:1611: inode #2: comm systemd-udevd: reading directory lblock 0
  26. [ 726.429233] EXT4-fs error (device mmcblk0p2): __ext4_find_entry:1611: inode #4508: comm systemd-udevd: reading directory lblock 0

这读取文件系统错误,有可能TF卡松动了,裸板的设计,没有外壳的时候TF卡确实很容易松动, 断电插紧重启即可

运行一会儿后又出现了问题。。。

  1. [ 1147.255838] rk806 spi2.0: SPI transfer timed out
  2. [ 1147.263313] spi_master spi2: failed to transfer one message from queue
  3. [ 1147.270938] cpu cpu0: rockchip_cpufreq_set_volt: failed to set voltage (925000 925000 950000 uV): -11
  4. [ 1147.278907] cpufreq: __target_index: Failed to change cpu frequency: -110
  5. [ 1147.489206] rk806 spi2.0: SPI transfer timed out

rk806 貌似是电源管理 IC,看样子有可能是充电协议握手出现了啥问题,先不管,断电重启,之后再说。

更换国内源,比如中科大 mirrors.ustc.edu.cn,编辑 /etc/apt/sources.list

  1. deb http://mirrors.ustc.edu.cn/ubuntu-ports/ focal main restricted universe multiverse
  2. #deb-src http://mirrors.ustc.edu.cn/ubuntu-ports/ focal main restricted universe multiverse
  3. deb http://mirrors.ustc.edu.cn/ubuntu-ports/ focal-security main restricted universe multiverse
  4. #deb-src http://mirrors.ustc.edu.cn/ubuntu-ports/ focal-security main restricted universe multiverse
  5. deb http://mirrors.ustc.edu.cn/ubuntu-ports/ focal-updates main restricted universe multiverse
  6. #deb-src http://mirrors.ustc.edu.cn/ubuntu-ports/ focal-updates main restricted universe multiverse
  7. deb http://mirrors.ustc.edu.cn/ubuntu-ports/ focal-backports main restricted universe multiverse
  8. #deb-src http://mirrors.ustc.edu.cn/ubuntu-ports/ focal-backports main restricted universe multiverse

apt update发现报错, 又报错了

  1. W: GPG error: http://apt.radxa.com/focal-stable focal InRelease: The following signatures couldn't be v
  2. erified because the public key is not available: NO_PUBKEY 9B98116C9AA302C7

按照通用做法

  1. sudo gpg --keyserver keyserver.ubuntu.com --recv-keys 9B98116C9AA302C7

报错 gpg: keyserver receive failed: No data,于是去apt.radxa.com源看看

  1. 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 连接到芯片的,可以在系统看到当前协商的电压:

  1. sensors tcpm_source_psy_4_0022-i2c-4-22

以及可以看到 typec 的相关信息

  1. grep "" /sys/class/typec/port0/* 2>/dev/null

实际电压可以(需要除以~172.5)

  1. awk '{printf ("%0.2f\n",$1/172.5); }' </sys/devices/iio_sysfs_trigger/subsystem/devices/iio\:device0/in_voltage6_raw
  2. 11.98

另外可以在 dts 看到 pd 电源相关

CPU

看看 cpu

  1. cat /proc/cpuinfo
  2. sudo apt-get install cpufrequtils
  3. sudo cpufreq-info

可以看到最大频率为 2.4GHz, 以及 4个小核 1.8GHz
用 7z 在没有风扇的情况下先跑个分看看情况,跑起来手摸cpu盖子还是很烫的

  1. $ apt install p7zip
  2. $ 7zr b
  3. 7-Zip (a) [64] 16.02 : Copyright (c) 1999-2016 Igor Pavlov : 2016-05-21
  4. p7zip Version 16.02 (locale=C.UTF-8,Utf16=on,HugeFiles=on,64 bits,8 CPUs LE)
  5. LE
  6. CPU Freq: 64000000 - - - - - - - -
  7. RAM size: 15722 MB, # CPU hardware threads: 8
  8. RAM usage: 1765 MB, # Benchmark threads: 8
  9. Compressing | Decompressing
  10. Dict Speed Usage R/U Rating | Speed Usage R/U Rating
  11. KiB/s % MIPS MIPS | KiB/s % MIPS MIPS
  12. 22: 13939 726 1867 13560 | 199330 682 2494 17002
  13. 23: 13416 748 1828 13670 | 193846 684 2452 16775
  14. 24: 12832 759 1818 13797 | 186688 681 2406 16385
  15. 25: 12244 758 1846 13980 | 179663 680 2350 15989
  16. ---------------------------------- | ------------------------------
  17. Avr: 748 1840 13752 | 682 2426 16538
  18. Tot: 715 2133 15145

可以看到这里的 speed 和 rating 是树莓派4B 的至少 3 倍了

尝试看看温度,用 ssh 登录试试,串口执行

  1. ifconfig

看到ip,然后ssh root@ip输入密码root,报错Permission denied, please try again.,在串口终端修改密码passwd rootroot,还是不行,可能默认设置不允许 root 用户登录,修改vim /etc/ssh/sshd_config 添加PermitRootLogin yes 后 重启服务systemctl restart sshd即可

  1. watch -n 0.1 cat /sys/class/thermal/thermal_zone0/temp

同时跑分,温度最高跑到了72℃,还是很凉快的。
同时,看一下频率是否跑满了

  1. 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

  1. rock@rock-5b:~$ dmesg |grep pvtm
  2. [ 8.110543] rockchip-pvtm fda40000.pvtm: pvtm@0 probed
  3. [ 8.110598] rockchip-pvtm fda50000.pvtm: pvtm@1 probed
  4. [ 8.110647] rockchip-pvtm fda60000.pvtm: pvtm@2 probed
  5. [ 8.110693] rockchip-pvtm fdaf0000.pvtm: pvtm@3 probed
  6. [ 8.110736] rockchip-pvtm fdb30000.pvtm: pvtm@4 probed
  7. [ 9.051869] cpu cpu0: pvtm=1456
  8. [ 9.051948] cpu cpu0: pvtm-volt-sel=2
  9. [ 9.060591] cpu cpu4: pvtm=1705
  10. [ 9.064527] cpu cpu4: pvtm-volt-sel=4
  11. [ 9.073916] cpu cpu6: pvtm=1724
  12. [ 9.077872] cpu cpu6: pvtm-volt-sel=5
  13. [ 9.162917] mali fb000000.gpu: pvtm=877
  14. [ 9.162950] mali fb000000.gpu: pvtm-volt-sel=3
  15. [ 9.346530] RKNPU fdab0000.npu: pvtm=880
  16. [ 9.351791] RKNPU fdab0000.npu: pvtm-volt-sel=3

看不太懂,不知道每个数值对应了什么级别的频率

上面的信息是由内核报告的 Operating Performance Point (OPP), 但是实际跑的频率通过 ThomasKaiser/SBC-Bench.sh 可以获得(内置的armbian-config命令中集成了此工具的,可以直接用),比如我的

  1. Checking cpufreq OPP for cpu0-cpu3 (Cortex-A55):
  2. Cpufreq OPP: 1800 Measured: 1798 (1798.646/1798.490/1798.372)
  3. Cpufreq OPP: 1608 Measured: 1614 (1614.427/1614.033/1613.875)
  4. Cpufreq OPP: 1416 Measured: 1414 (1415.323/1414.869/1414.627)
  5. Cpufreq OPP: 1200 Measured: 1233 (1233.787/1233.729/1233.585) (+2.8%)
  6. Cpufreq OPP: 1008 Measured: 1007 (1007.980/1007.956/1007.524)
  7. Cpufreq OPP: 816 Measured: 806 (806.096/806.077/806.039) (-1.2%)
  8. Cpufreq OPP: 600 Measured: 589 (589.884/589.422/589.281) (-1.8%)
  9. Cpufreq OPP: 408 Measured: 391 (391.542/391.489/391.356) (-4.2%)
  10. Checking cpufreq OPP for cpu4-cpu5 (Cortex-A76):
  11. Cpufreq OPP: 2400 Measured: 2227 (2227.990/2227.846/2227.750) (-7.2%)
  12. Cpufreq OPP: 2208 Measured: 2161 (2162.236/2161.558/2161.286) (-2.1%)
  13. Cpufreq OPP: 2016 Measured: 1998 (1998.559/1998.559/1998.414)
  14. Cpufreq OPP: 1800 Measured: 1826 (1826.351/1826.351/1826.271) (+1.4%)
  15. Cpufreq OPP: 1608 Measured: 1623 (1623.824/1623.824/1623.744)
  16. Cpufreq OPP: 1416 Measured: 1442 (1442.152/1442.089/1441.869) (+1.8%)
  17. Cpufreq OPP: 1200 Measured: 1197 (1197.094/1197.094/1196.904)
  18. Cpufreq OPP: 1008 Measured: 1002 (1002.915/1002.132/1002.060)
  19. Cpufreq OPP: 816 Measured: 807 (808.040/806.980/806.826) (-1.1%)
  20. Cpufreq OPP: 600 Measured: 592 (592.867/592.828/592.802) (-1.3%)
  21. Cpufreq OPP: 408 Measured: 394 (394.914/394.905/394.842) (-3.4%)
  22. Checking cpufreq OPP for cpu6-cpu7 (Cortex-A76):
  23. Cpufreq OPP: 2400 Measured: 2243 (2244.059/2243.815/2243.718) (-6.5%)
  24. Cpufreq OPP: 2208 Measured: 2160 (2160.970/2160.925/2160.744) (-2.2%)
  25. Cpufreq OPP: 2016 Measured: 1990 (1990.232/1990.040/1990.040) (-1.3%)
  26. Cpufreq OPP: 1800 Measured: 1812 (1812.294/1812.174/1812.055)
  27. Cpufreq OPP: 1608 Measured: 1604 (1604.397/1604.319/1604.203)
  28. Cpufreq OPP: 1416 Measured: 1421 (1421.929/1421.837/1421.837)
  29. Cpufreq OPP: 1200 Measured: 1214 (1214.996/1214.968/1214.912) (+1.2%)
  30. Cpufreq OPP: 1008 Measured: 1019 (1019.959/1019.934/1019.910) (+1.1%)
  31. Cpufreq OPP: 816 Measured: 818 (818.552/818.433/818.394)
  32. Cpufreq OPP: 600 Measured: 592 (592.906/592.893/592.854) (-1.3%)
  33. 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

内存

查看频率:

  1. cat /sys/class/devfreq/dmc/cur_freq
  2. 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, 查看可用频率

  1. cat /sys/class/devfreq/dmc/available_frequencies
  2. 528000000 1068000000 1560000000 2112000000
  3. # 设置 DDR 频率,例如,设置 1560MHz
  4. echo userspace > /sys/class/devfreq/dmc/governor
  5. echo 1560000000 > /sys/class/devfreq/dmc/userspace/set_freq

HDMI 输出

到此为止,HDMI 仍然没有输出,我的显示器是 2k(2560x1440)

  1. 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

I got https://raw.githubusercontent.com/amazingfate/radxa-rock5b-overlays/main/rk3588-add-hdptxphy_hdmi_clk.dts 34

compile the dts file
dtc -O dtb -o rk3588-add-hdptxphy_hdmi_clk.dtbo rk3588-add-hdptxphy_hdmi_clk.dts

and 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

  1. sudo cp ~/.config/monitors.xml /var/lib/gdm3/.config
  2. sudo dpkg-reconfigure gdm3

但是没有成功
参考这里: https://forums.linuxmint.com/viewtopic.php?t=289229
原来有登录窗口的设置GUI程序的,把后HiDPI支持从启用变成自动即可,如果换成高分辨率显示器后没有启动hidpi,可以再来选成启用:
loginsettings

用 iwatch工具监测发现是该动了/etc/lightdm/slick-greeter.conf文件

功耗

因为从苹果的 18w 充电器换到苹果的20w 充电器后才能使用,难道是超过 18w 了?于是用一个电表大致上看一下功耗:
注意这里都是我在家肉眼看的普通电表测得功耗,没用专业仪器比如有曲线记录或者峰值记录的电源,可能无法测到瞬时跳变功耗:

  • 启动过程中最高 5w 左右功耗,也没到 18w,而且发现其实用 20w 的苹果充电器也会遇到开机无限循环并且偶尔每次循环能听到某个器件发出一声的啪的生意,以及每次循环所有指示灯都会熄灭,以及能听到器件的小小的啸叫声,还能味道一股微弱的烧焦味道。。。所以更大的可能性是充电协议握手可能出现了什么奇怪的问题?经过很长时间的循环最终可以启动成功
  • 跑起来后 4.4w,拔掉 HDMI 后 3.1w
  • 使用 7z 跑分时最高 11.4w

用浏览器放 b站视频会重启,重启后串口终端日志

  1. DDR Version V1.08 20220617
  2. LPDDR4X, 2112MHz
  3. channel[0] BW=16 Col=10 Bk=8 CS0 Row=17 CS1 Row=17 CS=2 Die BW=8 Size=4096MB
  4. channel[1] BW=16 Col=10 Bk=8 CS0 Row=17 CS1 Row=17 CS=2 Die BW=8 Size=4096MB
  5. channel[2] BW=16 Col=10 Bk=8 CS0 Row=17 CS1 Row=17 CS=2 Die BW=8 Size=4096MB
  6. channel[3] BW=16 Col=10 Bk=8 CS0 Row=17 CS1 Row=17 CS=2 Die BW=8 Size=4096MB
  7. Manufacturer ID:0x6
  8. CH0 RX Vref:29.7%, TX Vref:24.8%,25.8%
  9. CH1 RX Vref:29.7%, TX Vref:24.8%,23.8%
  10. CH2 RX Vref:28.7%, TX Vref:24.8%,23.8%
  11. change to F2: 1068MHz
  12. change to F3: 1560MHz
  13. change to F0: 2112MHz
  14. out
  15. INFO: Preloader serial: 2
  16. NOTICE: BL31: v2.3():v2.3-405-gb52c2eadd:derrick.huang
  17. NOTICE: BL31: Built : 11:23:47, Aug 15 2022
  18. INFO: spec: 0x1
  19. INFO: ext 32k is not valid
  20. INFO: GICv3 without legacy support detected. 2.8 | VT102 | 脱机 | ttyUSB0 INFO: ARM GICv3 driver initialized in EL3
  21. INFO: system boots from cpu-hwid-0
  22. INFO: idle_st=0x21fff, pd_st=0x11fff9, repair_st=0xfff70001
  23. INFO: dfs DDR fsp_params[0].freq_mhz= 2112MHz
  24. INFO: dfs DDR fsp_params[1].freq_mhz= 528MHz
  25. INFO: dfs DDR fsp_params[2].freq_mhz= 1068MHz
  26. INFO: dfs DDR fsp_params[3].freq_mhz= 1560MHz
  27. INFO: BL31: Initialising Exception Handling Framework
  28. INFO: BL31: Initializing runtime services
  29. WARNING: No OPTEE provided by BL2 boot loader, Booting device without OPTEE initialization. SMC`s destined for OPTEE will return SMC_UNK
  30. ERROR: Error initializing runtime service opteed_fast
  31. INFO: BL31: Preparing for EL3 exit to normal world
  32. INFO: Entry point address = 0x200000
  33. INFO: SPSR = 0x3c9
  34. Debian GNU/Linux 11 rock-5b ttyFIQ0
  35. rock-5b login: root (automatic login)
  36. Linux rock-5b 5.10.110-34-rockchip-gca15bbe36e6c #rockchip SMP Wed Dec 7 06:54:05 UTC 2022 aarch64
  37. The programs included with the Debian GNU/Linux system are free software;
  38. the exact distribution terms for each program are described in the
  39. individual files in /usr/share/doc/*/copyright.
  40. Debian GNU/Linux comes with ABSOLUTELY NO WARRANTY, to the extent
  41. permitted by applicable law.
  42. 上一次登录: 二 12月 13 09:14:02 UTC 2022 ttyFIQ0 上root@rock-5b:~#

debian

用户名密码rock``rock
装上后没有中文,需要改下国内源,然后

  1. sudo apt update
  2. sudo apt install locales
  3. sudo dpkg-reconfigure locales

选择所有 zh_CN开头的, 然后选择 zh_CN.UTF-8 UTF-8作为默认, 然后
vim ~/.bashrc 最后添加一行 export LANG=zh_CN.UTF-8

然后安装中文字体,不装字体的话全是口口口口口

  1. sudo apt install fonts-wqy-zenhei

重启

  1. sudo reboot

另外, debian xfce 出现了有些奇奇怪怪的图像显示问题,有些方块,比如窗口周围一圈黑色的,在 armbian上面没有出现这样的问题

sogou input method

  1. (WARN-9857 dbusstuff.c:248) DBus Service Already Exists
  2. (ERROR-9857 instance.c:443) Exiting.

Armbian

Armbian 适配得更好一点,推荐使用
因为 GPU 驱动大多需要在 wayland 模式下使用,可以设置默认登录到 wayland 窗口管理模式,这样就不用每次登录时选择一次了

  1. 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 就好了

  1. ping rock-5b.local

中文输入法

装了 armbian, 尝试装搜狗输入法,但是没办法使用,于是转头去装了 fcitx5 + rime输入法 + clover 输入习惯配置

  1. sudo apt install rime
  2. sudo apt install fcitx5-config-qt fcitx5-frontend-qt5 fcitx5-frontend-gtk4 fcitx5-frontend-gtk3 fcitx5-frontend-gtk2

另外 编辑~/.xprofile:

  1. export GTK_IM_MODULE=fcitx5
  2. export QT_IM_MODULE=fcitx5
  3. export XMODIFIERS="@im=fcitx5"
  4. export LANG="zh_CN.UTF-8"
  5. export LC_CTYPE="zh_CN.UTF-8"

然后系统输入法和语言里面配置 选择 fcitx5(也可以终端执行im-config来配置) ,另外 fcitx5-configtool 中启用中州韻[yùn]输入法, 重启 fcitx5,我遇到了不能显示候选框的问题,经过一顿乱装上面这一堆重启后可以用了hhhhh

重启后 fcitx5 可能没有自动启动,需要手动在开始菜单点一下以启动,也可以将desktop文件拷贝到自动启动目录下

  1. 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:
sd1
sd2

从这里只能看出来卡2其它各项数据都比卡1好,除了 4k 随机写入,也许是这个影响,又测了一遍卡2:
sd2
也差不了多少

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 默认没勾上,注意勾上

rkdevtool

然后下载系统,可以用官方的 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:

  1. sudo add-apt-repository ppa:liujianfeng1994/panfork-mesa
  2. sudo add-apt-repository ppa:liujianfeng1994/rockchip-multimedia
  3. sudo apt update
  4. sudo apt dist-upgrade
  5. 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:

  1. update-alternatives set iptables /usr/sbin/iptables-legacy
  2. update-alternatives set ip6tables /usr/sbin/ip6tables-legacy

没买 m.2 转 USB转接器,所以直接把 nvme ssd 装到板子上,然后用 SD 卡进 debian 系统

  1. rock@rock-5b:~$ lsblk
  2. NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
  3. mtdblock0 31:0 0 16M 0 disk
  4. mmcblk1 179:0 0 29.2G 0 disk
  5. ├─mmcblk1p1 179:1 0 512M 0 part /boot
  6. └─mmcblk1p2 179:2 0 28.6G 0 part /
  7. nvme0n1 259:0 0 931.5G 0 disk

可以看到 直接能读到 nvme0n1,直接操作这个固态即可,因为是初次测试,硬盘也是空的,直接

  1. 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

写入完成后

  1. nvme0n1 259:0 0 931.5G 0 disk
  2. ├─nvme0n1p1 259:1 0 256M 0 part
  3. └─nvme0n1p2 259:2 0 6.8G 0 part

然后断电,拔掉 SD 卡上电即可从 nvme ssd 中的系统启动

进系统后看看接口情况

  1. sudo dmidecode | grep --color "PCI"

speed test:
iozone, fio

  1. iozone -e -I -a -s 100M -r 4k -r 16k -r 512k -r 1024k -r 16384k -i 0 -i 1 -i 2
  2. random random bkwd record stride
  3. kB reclen write rewrite read reread read write read rewrite read fwrite frewrite fread freread
  4. 102400 4 131760 167822 191255 204110 49352 108890
  5. 102400 16 400881 478178 340041 289103 164730 277126
  6. 102400 512 1444041 1676845 1619100 1573208 1314692 1723524
  7. 102400 1024 1797630 1854966 1684764 1714470 1559952 1803609
  8. 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 协议),速度如下:
samsung-980pro

板子上装的硬盘是 三星970 evo plus 1TB版本,支持 PCIE3.0x4,虽然没在电脑上跑分,根据别人的测评来看和980 pro 装到PCIE3.0x4 上差不多,这是网上找的跑分图(更多参考新技术回馈经典产品:三星970EVO Plus深度对比测试):
970evoplus_score
970_evo_plus_score 970_evo_plus_score2

虽然都是 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看到固态温度

  1. sudo apt install nvme-cli
  2. sudo nvme smart-log /dev/nvme0 |grep -i "^Temperature"

GPU 硬解

装好 armbian 发现自带的 mpv 播放器只能软解,跑个 4k 直接把 CPU 吃得差不多一卡一卡。

按照 armbian 下载页面的源装了 kodi,不能直接用只能放声音没有画面,是因为无法解码导致的。

参考这个帖子的步骤即可(可以直接重装系统,amazingfate 打包了带这些软件包的系统,也可以自己手动更新包,自己更新会麻烦一点):https://forum.radxa.com/t/rk3588-kodi-rkmpp-accelerated-decoding-working-out-of-box/12785/2https://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

  1. You have to create the following udev rules to enable mpp and rga hardware acceleration:
  2. KERNEL=="mpp_service", MODE="0660", GROUP="video"
  3. KERNEL=="rga", MODE="0660", GROUP="video"
  4. KERNEL=="system-dma32", MODE="0666", GROUP="video"
  5. KERNEL=="system-uncached-dma32", MODE="0666", GROUP="video" RUN+="/usr/bin/chmod a+rw /dev/dma_heap"
  6. to /etc/udev/rules.d/11-rockchip-multimedia.rules
  7. To enable libv4l-rkmpp for chromium, you have to install libv4l-rkmpp, v4l-utils and chromium-browser in this ppa:
  8. 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
  9. Then run the following commands:
  10. sudo ln -s /lib /usr/lib64
  11. cd /usr/lib64/ && sudo ln -s aarch64-linux-gnu/libv4l2.so.0.0.0 libv4l2.so
  12. And add the following lines to /etc/rc.local:
  13. echo dec > /dev/video-dec0
  14. chown root:video /dev/video-dec0
  15. chmod 0660 /dev/video-dec0
  16. echo enc > /dev/video-enc0
  17. chown root:video /dev/video-enc0
  18. chmod 0660 /dev/video-enc0
  19. Add chrome flags "--use-gl=egl" to /etc/chromium-browser/default:
  20. CHROMIUM_FLAGS="--use-gl=egl"
  21. ==================================================
  22. chromium related FYI: https://github.com/JeffyCN/libv4l-rkmpp
  1. sudo add-apt-repository ppa:liujianfeng1994/panfork-mesa
  2. sudo apt update
  3. wget https://github.com/JeffyCN/rockchip_mirrors/raw/libmali/firmware/g610/mali_csffw.bin
  4. sudo mv mali_csffw.bin /lib/firmware

需要在 lightdm 或者 gdm 或者 wayland 窗口模式下运行,即开机登录时选择 kodi 或者 wayland

然后打开 kodi 在系统信息处可以看到 windowing system 使用了 gbm 或者 wayland
kodi0
kodi

可是发现木有画面,解码失败了。。。但是 chromium 已经可以硬解了,经群佬tokyo的解答,先看 libav是否安装

  1. dpkg -l|grep libav

发现 各种解码库已经安装
libav
然后使用 mpv 开启硬件播放

  1. pmv --hwdec=rkmpp *.mp4

mpv
发现报错了,初始化 mpp 失败了,通过

  1. ls /dev/mpp_service

dev_mpp
发现用户组属于 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度左右)。。。所以这个壳子如果在夏天高负荷用估计有点难:
temp
temp

最后手动钻孔加了一个风扇往里面吹,但有落灰的风险:
case

xbox 手柄驱动

使用 https://github.com/medusalix/xone , 另外还有个 xpadneo 的项目,貌似没有无线接收器的驱动,所以用这个 xone 貌似比较好

发现没有linux headers, 需要先安装,(注意armbian-config这个脚本通过 dpkg -l 来判断是否已经安装了,如果事先已经安装了 headers,需要先卸载才能用 armbian-config 这个脚本安装, 具体可以看 github/armbin/config) armbian 下直接

  1. armbian-config -> soft -> headers install
  2. cd /usr/src/linux-headers-$(uname -r)
  3. # sudo make prepare
  4. sudo make scripts
  1. sudo ./install.sh

实际遇到了编译时找不到scripts/module.lds,看安装脚本是用了 dkms Install命令来编译安装驱动的
待解决

HDMI 输入

摄像头读取

官方的 imx415 摄像头,卖 ¥188

默认只有官方的 debian 是可以直接使用摄像头的, armbian 没有提供使用文档

debian 使用摄像头

/boot/config.txt添加

  1. dtoverlay=rock-5ab-camera-imx415

执行

  1. update_extlinux.sh

重启 会出现/dev/video0/dev/video19
Start rkaiq camera preview.
Execute the following command with root user in terminal on desktop.

  1. $ sudo su
  2. # 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 使能驱动

  1. sudo find / -name "rock-5ab-camera-imx415*"

会发现源码目录有 dts,以及 /usr/lib/目录下有 dtb 文件,于是按照文档说明 往/boot/armbianEnv.txt 里面添加

  1. overlays=rock-5ab-camera-imx415

但是重启后ls /dev/video*没有看到一堆设备出现,理论上应该直接能用的,于是又手动添加了 dtb

  1. armbian-add-overlay 源码目录下的 dts 文件

这会往 /boot/overlay-user 下添加文件
然后往/boot/armbianEnv.txt添加

  1. user_overlays: rock-5ab-camera-imx415

实际上我不添加这行重启后也能用了,会有一大堆/dev/video*设备,不同设备分辨率不同,查看:

  1. $ v4l2-ctl --device /dev/video11 --list-formats-ext
  2. [0]: 'UYVY' (UYVY 4:2:2)
  3. Size: Stepwise 32x16 - 3840x2160 with step 8/8
  4. [1]: 'NV16' (Y/CbCr 4:2:2)
  5. Size: Stepwise 32x16 - 3840x2160 with step 8/8
  6. [2]: 'NV61' (Y/CrCb 4:2:2)
  7. Size: Stepwise 32x16 - 3840x2160 with step 8/8
  8. [3]: 'NV21' (Y/CrCb 4:2:0)
  9. Size: Stepwise 32x16 - 3840x2160 with step 8/8
  10. [4]: 'NV12' (Y/CbCr 4:2:0)
  11. Size: Stepwise 32x16 - 3840x2160 with step 8/8
  12. [5]: 'NM21' (Y/CrCb 4:2:0 (N-C))
  13. Size: Stepwise 32x16 - 3840x2160 with step 8/8
  14. [6]: 'NM12' (Y/CbCr 4:2:0 (N-C))
  15. Size: Stepwise 32x16 - 3840x2160 with step 8/8

看起来格式很多,实际上只支持NV12:

  1. $ v4l2-ctl --device /dev/video11 --all
  2. Format Video Capture Multiplanar:
  3. Width/Height : 3840/2160
  4. Pixel Format : 'NM12' (Y/CbCr 4:2:0 (N-C))

然后可以使用 GStreamer 工具 打开摄像头了

  1. gst-launch-1.0 v4l2src device=/dev/video11 ! video/x-raw,format=NV12,width=3840,height=2160, framerate=30/1 ! xvimagesink

能看到图像了,不过我的摄像头看起来黑乎乎的(镜头盖已经去掉了)绿绿的,这就是没有 3A 处理的样子
image

然后参考论坛帖子的用法使用:
这里提到了一个 json 的 IQ 配置文件以及提到了 camera engine, armbian下貌似没有,所以是黑乎乎的画面

  1. /etc/iqfiles/imx415_CMK-OT2022-PX1_IR0147-50IRC-8M-F20.json
  2. Note: You might have a newer file from radxa:
  3. /etc/iqfiles/imx415_RADXA-CAMERA-4K_DEFAULT.json
  4. 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.
  1. $ gst-inspect-1.0 |grep mpp
  2. typefindfunctions: audio/x-musepack: mpc, mpp, mp+
  3. $ systemctl status rkaiq_3A
  4. Unit rkaiq_3A.service could not be found.

发现这两个命令都表现不对,GStreamer 的 mpp 编解码插件没有(可以用,CPU占用高), rkaiq_3A ,如果是 debian系的系统,可以直接在radxa/debos-radxa仓库找到 rkaiq 的 deb 包,另外一个是 rkisp 包,这是旧版包,RK3588 不需要,找不到也可以从 官方的 debian 系统里面扣程序和 IQ 文件到 armbian 中

  1. sudo dpkg -i camera-engine-rkaiq_3.0.2_arm64.deb # 这会安装 ISP 程序和校准文件到 /usr/bin 和 /etc/iqfiles/
  2. sudo systemctl start rkaiq_3A
  3. sudo systemctl enable rkaiq_3A

另外需要安装 gstreamer 的编码插件,使用这个源

  1. $ sudo apt install gstreamer1.0-rockchip1
  2. $ gst-inspect-1.0 |grep mpp
  3. rockchipmpp: mpph264enc: Rockchip Mpp H264 Encoder
  4. rockchipmpp: mpph265enc: Rockchip Mpp H265 Encoder
  5. rockchipmpp: mppjpegdec: Rockchip's MPP JPEG image decoder
  6. rockchipmpp: mppjpegenc: Rockchip Mpp JPEG Encoder
  7. rockchipmpp: mppvideodec: Rockchip's MPP video decoder
  8. rockchipmpp: mppvpxalphadecodebin: VP8/VP9 Alpha Decoder
  9. typefindfunctions: audio/x-musepack: mpc, mpp, mp+

效果(4k 采集,1080p 显示器截图)
cam4k_imx415_screenshot

定焦的,摄像头打了胶,室内噪点很明显,还算清晰

然后也可以使用 python 程序拍照或者录制视频了

  1. # take_photo.py
  2. import gi
  3. import sys
  4. import time
  5. gi.require_version('Gst', '1.0')
  6. from gi.repository import Gst
  7. # initialize GStreamer
  8. Gst.init(sys.argv)
  9. 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])
  10. pipeline.set_state(Gst.State.PLAYING)
  11. time.sleep(1)
  12. pipeline.set_state(Gst.State.NULL)
  1. python take_photo.py img.jpg

另外,上面那个源里面还有 obs gsteamer 插件可以使用

但是直接 vlc 无法直接打开,可以通过 gstreamer 输出一个 rtp 流,但是直接推流 mpph264 产生的 h264,vlc 提示没有 SDP 信息,不太熟悉 gstreamer,以后弄了回来补,总之就是通过 gstreamer 可以获得数据了,
下面的命令提示 mpp264enc 不能输出到 MP4mux,暂时无法使用,以后需要再说吧,另外可以参考这里 编译 rtsp server 使用。

  1. $ gst-inspect-1.0 --plugin
  2. 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

看设备分别含义,不同设备有着不同的格式支持和分辨率支持

  1. v4l2-ctl --list-devices
  2. v4l2-ctl --device /dev/video12 --all

发现驱动只能输出 NV12 格式的图,但是我们一般在程序里面都想用 RGB 或者 BGR 的图,看 gstreamer 的 mpp 插件也没有写转换的插件,所以暂时只能自己使用 mpp 写了, mpp 有API转换例程 ,先用 软件转换成 BGR 用着,反正 CPU 够强,实在需要再去用 mpp 添加一个转换方法也行

直接使用 gstreamer 的API 读取

  1. import cv2
  2. def read_cam():
  3. cap = cv2.VideoCapture("v4l2src device=/dev/video11 ! video/x-raw,format=NV12,width=3840,height=2160, framerate=30/1 ! appsink")
  4. if cap.isOpened():
  5. cv2.namedWindow("demo", cv2.WINDOW_AUTOSIZE)
  6. while True:
  7. ret_val, img = cap.read()
  8. img2 = cv2.cvtColor(img, cv2.COLOR_YUV2BGR_NV12)
  9. cv2.imshow('demo',img2)
  10. cv2.waitKey(1)
  11. else:
  12. print("camera open failed")
  13. cv2.destroyAllWindows()
  14. if __name__ == '__main__':
  15. 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的则可以,可以先试试,可以通过

  1. 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 插件版本的

  1. conda list |grep gst
  2. conda remove --force gst-plugins-base
  3. conda remove --force gstreamer

注意这里用了 —force 保证不删除其它包
然后发现就可以使用了

NPU 跑 AI 模型

测试

使用 RK 家的 rknn-toolkit2 以及在板子上的 runtime rknpu2

前者仓库里面有文档(使用入门和算子支持列表)和转换工具(在仓库里面以一个whl包方式提供,也就是说表面上放到 github 实际还是闭源的。。。目前做芯片的几家公司基本都这样,做得一般,且藏着掖着,并且都还想做行业标准,都还在梦里),看文档按装好环境,安装的时候最好创建一个虚拟环境用,因为这个包强制安装特定版本的包,不然可能会破坏你原有的环境,或者是直接用他们提供的docker环境。

  1. conda create -n rknn python=3.8
  2. conda activate rknn
  3. pip install -i https://pypi.douban.com/simple -r doc/requirements_cp38-1.4.0.txt
  4. 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就好了

  1. cd examples/onnx/yolov5/

修改 test.py 中的 API 设置平台

  1. rknn.config(前面的参数保持原样, target_platform="rk3588")

运行

  1. 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),注意不止一处,官方的脚本写得比较随便,比如

  1. if (CMAKE_C_COMPILER MATCHES "aarch64")
  2. set(LIB_ARCH aarch64)
  3. else()
  4. set(LIB_ARCH armhf)
  5. endif()
  6. set(LIB_ARCH aarch64)

把转换好的模型拷贝到 examples/rknn_yolov5_demo/model/RK3588下面,并且修改 build-linux_RK3588.sh 中的 CCgccg++, 另外,修改 examples/rknn_yolov5_demo/main.ccPERF_WITH_POST 值 为0,以及 test_count50, 这样我们测试的模型运行时间不包含后处理,只是模型运行的时间

  1. cd examples/rknn_yolov5_demo
  2. ./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

  1. ./rknn_yolov5_demo model/RK3588/yolov5s-640-640.rknn model/bus.jpg
  2. sdk version: 1.4.0 (a10f100eb@2022-09-09T09:07:14) driver version: 0.8.2
  3. model input height=640, width=640, channel=3
  4. once run use 37.527000 ms
  5. loop count = 10 , average run 38.967600 ms

这里可以看到运行一次花费了 37.527ms,10 次平均值 38.967600 ms,然后试试我们转的官方的255通道的模型:

  1. ./rknn_yolov5_demo ~/yolov5s.rknn model/bus.jpg
  2. once run use 51.609000 ms
  3. loop count = 50 , average run 49.051640 ms

这速度,很糟糕! rk3588 宣称 6Tops 算力,作为对比,爱芯 AX620A 3.6Tops 算力,光是运行模型时间(不算加载模型和后处理时间)能达到 12.6 ms,貌似看起来反而不如 3.6Tops 算力的芯片,爱芯 1.8Tops 算力耗时 23ms, RK3588 跑了快 50ms 确实非常慢,但是得确认这个时间是不是纯粹跑模型时间,看源码确认下:

  1. gettimeofday(&start_time, NULL);
  2. rknn_inputs_set(ctx, io_num.n_input, inputs);
  3. rknn_output outputs[io_num.n_output];
  4. memset(outputs, 0, sizeof(outputs));
  5. for (int i = 0; i < io_num.n_output; i++) {
  6. outputs[i].want_float = 0;
  7. }
  8. ret = rknn_run(ctx, NULL);
  9. ret = rknn_outputs_get(ctx, io_num.n_output, outputs, NULL);
  10. gettimeofday(&stop_time, NULL);
  11. printf("once run use %f ms\n", (__get_us(stop_time) - __get_us(start_time)) / 1000);
  12. gettimeofday(&start_time, NULL);
  13. for (int i = 0; i < test_count; ++i) {
  14. rknn_inputs_set(ctx, io_num.n_input, inputs);
  15. ret = rknn_run(ctx, NULL);
  16. ret = rknn_outputs_get(ctx, io_num.n_output, outputs, NULL);
  17. #if PERF_WITH_POST
  18. post_process((int8_t*)outputs[0].buf, (int8_t*)outputs[1].buf, (int8_t*)outputs[2].buf, height, width,
  19. box_conf_threshold, nms_threshold, scale_w, scale_h, out_zps, out_scales, &detect_result_group);
  20. #endif
  21. ret = rknn_outputs_release(ctx, io_num.n_output, outputs);
  22. }
  23. gettimeofday(&stop_time, NULL);

很遗憾,确实就是运行一次,并且没有算上加载模型和后处理的时间,看来宣称的 NPU6Tops 水分很大哦~ 本来觉得爱芯的算力都是很理论的了,这家伙更离谱呢。
也有可能是硬件支持的算子太少,有算子是 CPU 实现的导致的,用个简单的模型试试 mobilnetv2:发现推理时间在2.3ms ~ 3.8ms之间,作为对比,爱芯1,8Tops 算力 4ms, 3.6Tops 算力 2ms,CR182x 0.5Tops 算力 5.8ms,看起来比和爱芯的 2Tops 算力相当

查看 NPU 频率:

  1. sudo cat /sys/kernel/debug/clk/clk_summary | grep clk_npu_dsu0
  2. 250000000

咋才 250MHz,尝试修改

  1. # 设置 NPU 频率,例如,设置 1GHz
  2. sudo echo 1000000000 > /sys/kernel/debug/clk/clk_npu_dsu0/clk_rate

提示权限不够,看样子是不支持手动修改,尝试在运行模型时看看频率

后面发现多跑几次 耗时有缩减loop count = 10 , average run 25.978200 ms

结果经过群友提示发现貌似是 NPU 架构问题
npu
npu2
npu3

所以其实 RK3588 的 NPU 是三核,其实只用了一核,也就是理论 2Tops 算力,另外两个是没用的, 2Tops 37.5ms 和 AX620A 的一半算力 1.8Tops 22ms 比起来也还是差得挺多的。。。

于是又去查看了最新的 API 文档,发现 上面的暂不支持多核 NPU 的红字没了,那是不是可以用多核了呢,如果用上位机运行就修改init_runtime函数加参数,如果是使用rknpu2 写代码则有个rknn_set_core_mask函数,在rknn_init函数之后调用,添加代码

  1. ret = rknn_set_core_mask(ctx, RKNN_NPU_CORE_0_1_2);
  2. if (ret < 0) {
  3. printf("rknn_set_core_mask error ret=%d\n", ret);
  4. return -1;
  5. }

结果发现貌似确实变快了,但不多。。。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 为测试,以后如果有更新欢迎评论告知或者我自己会更新

结合摄像头使用 NPU

Python 调用摄像头和NPU 使用 yolov5s 检测模型,使用 knn-toolkit2-lite,但是官方没有封装 yolov5 的后处理,需要自己从yolov官方代码里面扣,或者自己封装一个 c 后处理的函数。
先安装 rknn-toolkit2-lite 包,需要特定的 python 版本,先装个 miniconda

自己先搞好网络代理,终端使用代理参考Linux 终端代理设置 proxychains polipo

  1. wget https://repo.anaconda.com/miniconda/Miniconda3-latest-Linux-aarch64.sh
  2. chmod + x Miniconda3-latest-Linux-aarch64.sh
  3. ./Miniconda3-latest-Linux-aarch64.sh
  4. conda create -n rknn python=3.9
  5. conda activate rknn
  6. pip install conda create -n rknn python=3.9
  7. pip install rknn_toolkit_lite2-1.4.0-cp39-cp39-linux_aarch64.whl
  8. conda install opencv

然后为了使用摄像头,我们用opencv,根据前面摄像头使用, conda 环境用conda install opencv安装 opencv 才有 gstreamer 支持

结合前面的cv2_camera.py 就可以写一个读取摄像头并且运行模型的程序yolov5_camera.py

  1. import sys
  2. import cv2
  3. import numpy as np
  4. from rknnlite.api import RKNNLite
  5. def read_cam(nn, w, h, callback):
  6. max_w = 3840
  7. min_h = 2160
  8. if max_w / w > min_h / h:
  9. cap_h = h
  10. cap_w = max_w / (min_h // h)
  11. else:
  12. cap_w = w
  13. cap_h = min_h / (max_w // w)
  14. # 16 align
  15. cap_w = int((cap_w + 15) // 16 * 16)
  16. cap_h = int((cap_h + 15) // 16 * 16)
  17. print("capture size:", cap_w, cap_h)
  18. cap = cv2.VideoCapture(f"v4l2src device=/dev/video11 ! video/x-raw,format=NV12,width={cap_w},height={cap_h}, framerate=30/1 ! appsink")
  19. if cap.isOpened():
  20. cv2.namedWindow("demo", cv2.WINDOW_AUTOSIZE)
  21. while True:
  22. ret_val, img = cap.read()
  23. # img2 = cv2.cvtColor(img, cv2.COLOR_YUV2BGR_NV12)
  24. img2 = cv2.cvtColor(img, cv2.COLOR_YUV2RGB_NV12)
  25. # crop wxh from center of img2
  26. img2 = img2[(img2.shape[0] - h) // 2:(img2.shape[0] + h) // 2, (img2.shape[1] - w) // 2:(img2.shape[1] + w) // 2]
  27. boxes = callback(nn, img2)
  28. img2 = cv2.cvtColor(img2, cv2.COLOR_RGB2BGR)
  29. cv2.imshow('demo',img2)
  30. cv2.waitKey(1)
  31. else:
  32. print("camera open failed")
  33. cv2.destroyAllWindows()
  34. def nn_init(rknn_model):
  35. rknn_lite = RKNNLite()
  36. ret = rknn_lite.load_rknn(rknn_model)
  37. if ret != 0:
  38. raise Exception('Load RKNN model failed')
  39. ret = rknn_lite.init_runtime(core_mask=RKNNLite.NPU_CORE_0_1_2) # NPU_CORE_0
  40. if ret != 0:
  41. raise Exception('Init runtime environment failed')
  42. return rknn_lite
  43. def on_image(nn, img):
  44. '''
  45. @img RGB hwc image
  46. '''
  47. # normalization will be done automatically in inference method
  48. outs = nn.inference(inputs=[img])
  49. for i, out in enumerate(outs):
  50. print(f"output {i}: {out.shape}")
  51. print("------")
  52. # TODO: post process
  53. boxes = []
  54. return boxes
  55. if __name__ == '__main__':
  56. width = 640
  57. height = 640
  58. if len(sys.argv) != 2:
  59. print("Usage:")
  60. print(" python yolov5_camera.py yolov5s.rknn")
  61. sys.exit(0)
  62. model = sys.argv[1]
  63. nn = nn_init(model)
  64. read_cam(nn, width, height, on_image)

每次运行前记得激活 conda 环境conda activate rknn, 以及运行时不能用 sudo,

  1. python yolov5_camera.py ../data/models/yolov5s.rknn

就会看到终端打印出了 3 个输出层的形状,还没有加入后处理, 以后需要在移植吧,如果你移植好了,欢迎开源以及告诉我,可以参考 yolov5 官方仓库和 这里,其实最好还是用 c 封装一个函数比较好,效率更高;如果运行分类模型后处理加一个 softmax 就好了,更简单。

打印了一下各个环节的运行时间

  1. capture use time: 0.000926971435546875
  2. nv12 to RGB use time: 0.002031087875366211
  3. crop to 640x640 use time: 2.0503997802734375e-05
  4. inference use time: 0.05722999572753906
  5. output 0: (1, 255, 80, 80)
  6. output 1: (1, 255, 40, 40)
  7. output 2: (1, 255, 20, 20)
  8. 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

  1. systemctl status bluetooth
  2. systemctl start bluetooth
  3. apt-get install -y pulseaudio-module-bluetooth pulseaudio
  4. hciconfig
  5. pulseaudio --start

/etc/modprobe.d/blacklist.conf添加

  1. blacklist pgdrv
  2. blacklist btusb
  3. blacklist btrtl
  4. blacklist btbcm
  5. blacklist btintel

然后重启

docker

  1. sudo apt install docker.io
  2. sudo update-alternatives --set iptables /usr/sbin/iptables-legacy
  3. sudo update-alternatives --set ip6tables /usr/sbin/ip6tables-legacy
  1. sudo docker run -it --rm -v `pwd`:/data ubuntu /bin/bash

更多参考

文章有误?有想法想讨论?查看或者发起勘误/讨论 主题
(发起评论需要先登录 github)

/wallpaper/wallhaven-m9lyy1.jpg