rockchip4 vr manual
test diy and compile surfaceflinger
1. ✅ 虚拟机找不到 adb 设备
目前 rc 通过 usb 默认连接到了主机上,导致虚拟机里的 ubuntu 找不到 adb,根据 In VMWare Player, I can't get adb devices to see my phone - Spiceworks
可以在这里修改:
但是刚刚发现还是不行,还是检测不到,后来意识到应该是板子里的系统已经(类似)休眠了,因为蓝灯已经不闪了。所以重新插拔供电线,强制重启板子系统,十几秒后就跳出 usb 连接哪个主机的弹窗,在选择连接到 linux 之后,ubuntu 内就出现了 adb 设备。
尽管目前已经解决了问题,但是有弹窗也意味着刚刚的配置是失效的,所以检查了一下,果然又变成“ask what to do”了,为了测试是否能够直接连到 vmware,我又加强了一下设置:
然后重新登录之后,发现是可行的,设备还在:
但这不够,我们再加测板子重新插拔电后是否能够直接连到虚拟机。
测试结果很顺利,没有弹窗,虚拟机里的 adb 继续连上了。
并且watch adb devices
可以发现,断电后设备消失,接电开机后设备自动显示。一切符合预期。
2. ✅ 启用投屏
- 更改虚拟机的 vpn
- 安装
scrcpy
首先尝试sudo apt install scrcpy
发现不行,好在snap
里有,用snap install scrcpy
装上了。
目前一切顺利
3. ✅ 修改源码,尝试在surfaceflinger
部分加入几句 log
加 log 要在函数里加,不能直接加在文件级别,这是 C++和 python 之类语言的一个比较明显的区别,否则会报函数找不到错误:
所以我最后是这么加的:
编译成功:
4. ✅ 推入系统
read-only system
step 1. disable-verity
echo "rooting"; adb root;
echo "waiting to disable verity"; sleep 10; adb disable-verity;
echo "waiting to remount"; adb remount;
step 2. adb push
BUILD_SYSTEM=out/target/product/rk3399_Android10/system
ADB_SYSTEM=/system
MODULE=surfaceflinger
LIB_MODULE=lib$MODULE.so
adb push $BUILD_SYSTEM/bin/$MODULE /system/bin/$MODULE
adb push $BUILD_SYSTEM/lib/$LIB_MODULE /system/lib/$LIB_MODULE
adb push $BUILD_SYSTEM/lib64/$LIB_MODULE /system/lib64/$LIB_MODULE
5. ✅ 测试是否编译通过成功
确认已经有了我们修改的信息:
测试通过!
compile and run the first vr mode
error of null pointer
output 4k
分辨率输出逻辑
SDK 默认的分辨率是读取电视的 edid,然后选择最大输出的
需要在修改内核和配合 Setting 才可以
所谓,内核,也就是 rk3399 已经定义的一些分辨率输出的参数,每种都有自己的时序设置。4k 目前支持的是 3920x2160,如果我们想要 3920x1080,得自己定制。
设置的话,按照题主的摸索,如下:
谢谢,修改内核代码搞定了 kernel\drivers\video\rockchip\hdmi\rockchip-hdmi.h #define HDMI_VIDEO_DEFAULT_MODE HDMI_1280X720P_60HZ 修改为 HDMI_1920x1080P_60HZ
所以要去kernel/drivers/video/rockchip/hdmi/
下找到rockchip-hdmi/h
文件,修改器HDMI_VIDEO_DEFAULT_MODE
,但实际上我拉的版本里目录已经完全不对了。
ref:
TODO: check supported resolutions
sudo tvservice --status
sudo tvservice --modes=CEA
sudo tvservice --modes=RGB
ref:
TODO: 自定义分辨率输出参数
change hdmi output resolution
resolution 1. set framebuffer
and resolution
ref:
- 重点看这个:✨RK3399 开发板香橙派 4 开发板连接 HDMI 显示屏如何输出 4K 分辨率_嵌入式系统与 MCU-面包板社区
- 跟上面差不多:firefly-rk3399 关于设置 4K 输出答疑 - 开发板使用 - 深圳风火轮科技 - Powered by Discuz!
approach 1. define in device and burn
# suggested: device/rockchip/rk3399/rk3399_mid/system.prop
# verified by mark: device/rockchip/common/system.prop
persist.sys.framebuffer.main = 2160x3840 persist.sys.resolution.main = 3840x2160@60
TODO: 不知道副显的 framebuffer
可不可以设置……(以及有没有必要设置)
approach 2. use adb
adb shell setprop persist.sys.framebuffer.main 2160x3840
adb shell setprop sys.display.timeline 1
adb shell setprop persist.sys.resolution.main = 3840x2160@60
adb shell setprop sys.display.timeline 1
resolution 2. change dts
参考由 4k HDMI output - Rockchip 3399 - armbian forum 指引到的 Comparing next-20200501...next-20200501-drm-rockchip · Kwiboo/linux-rockchip,这是一份 patch,不过需要自己改。
不过实际上,我发现很多内容在我的开发板上都已经有了。
但后续发现,还是有些问题,对照国内朋友修改 dts 的记录,较为详细:[RK3399] HDMI 正常输出 4K_但行前路 无问西东-程序员宝宝 - 程序员宝宝
核心思路:编译 kernel 时,碰到错误会给出报错行,用 vim 去查看该行,看看是啥问题,对应的删改即可,✨✨。
这个问题主要是因为帖子中的connect = <&vopb_out_hdmi>;
已经不适用了,导致报错。
考虑到这个只是用于开机 logo 的,所以无视,删掉重新编!
新的问题是由于写错了:
ref:
sparkles: ✨ ✨ 修改 dts 的 patch Comparing next-20200501...next-20200501-drm-rockchip · Kwiboo/linux-rockchip
修改 dts 的 patch 的来源与讨论: 4k HDMI output - Rockchip 3399 - armbian forum
写到了部分
edid
相关的:(1 条消息) [RK3399] HDMI 正常输出 4K30 帧 无法输出 60 帧以及设置分辨率的流程分析_但行前路 无问西东-CSDN 博客_hdmi 输出分辨率设置
PASSED: change RkConfig
看起来对,也改起来很简单,但是我并没有找到对应的配置。
以下是我们的配置:
ref:
主板支持 4k60hz 输出修改
基于 rockchip 开发大佬的文章 (1 条消息) [RK3399][Android7.1] HDMI 显示屏(副屏)调试记录小结_Kris Fei's blog-CSDN 博客_hdmi 调试 ,可以知道修改主板 hdmi 输出主要改以下这几文件:
- drm_edid.c: edid 相关
- dw-hdmi.c: HDMI 驱动,包括内部 I2C 接口实现
- d_hdmi-rockchip.c: drm 框架部分
修改如下:
此外根据官方文档,还要确认一下白名单:
好在都是有的:
测试 edid 修改结果
/sys/class/drm/card0-HDMI-A-1/edid
ref:
HDMI 相关介绍
EDID
HDMI 比例
在 hdmi.h - include/linux/hdmi.h - Linux source code (v5.16.9) - Bootlin 可以找到 HDMI 比例的定义:
✨✨ VOP(vopb
| vopl
)
ref:
启用vopb
官方文档指示,想使用哪种 VOP,只要关闭另一种就可以了:
在kernel
仓库寻找我们的关键字,找到rk3399
和rockpi-4b
相关的文件:
确认内部的信息,是把vopl
关闭的,也就是开启了vopb
,也就是默认打开了 4k 输出:
绑定pll
官方文档指示,需要将目标 vop 挂载到vpll
,另一个挂载到cpll
:
还是同一个文件,检查确认,是默认的:
ref:
VOP 调试(hdmi 图层显示)
cat /d/dri/0/summary
主要查看Connector
是不是HDMI-A
,以及Display mode
:
每个图层的大小变化(src
(source) --> dst
(destination))也是很重要的信息:
✨✨ 主副屏
启用 HDMI 为副屏
# device/rockchip/rk3368/rk3368_mid/system.prop
sys.hwc.device.extend=HDMI-A
查看主副屏输出接口
sys.hwc.device.main # 主显输出接口
sys.hwc.device.aux # 副显输出接口
HDMI 引脚
显示桥接芯片
看不懂……所以瑞芯微文档里各种组合是啥意思:
2.4.1 EDP(vopb) + HDMI(vopl) 2.4.2 LVDS(vopl) + HDMI(vopb) 2.4.3 MIPI(vopb) + HDMI(vopl) 2.4.4 HDMI(vopb) + DP(vopl)