跳到主要内容
版本:0.17.0+

rockchip4 vr manual

  1. test diy and compile surfaceflinger
    1. 1. ✅ 虚拟机找不到 adb 设备
    2. 2. ✅ 启用投屏
    3. 3. ✅ 修改源码,尝试在surfaceflinger部分加入几句 log
    4. 4. ✅ 推入系统
    5. 5. ✅ 测试是否编译通过成功
  2. compile and run the first vr mode
    1. error of null pointer
  3. output 4k
    1. 分辨率输出逻辑
    2. TODO: check supported resolutions
    3. TODO: 自定义分辨率输出参数
    4. change hdmi output resolution
      1. resolution 1. set framebuffer and resolution
      2. resolution 2. change dts
      3. PASSED: change RkConfig
    5. 主板支持 4k60hz 输出修改
    6. 测试 edid 修改结果
  4. HDMI 相关介绍
    1. EDID
    2. HDMI 比例
    3. ✨✨ VOP(vopb | vopl)
      1. 启用vopb
      2. 绑定pll
      3. VOP 调试(hdmi 图层显示)
    4. ✨✨ 主副屏
      1. 启用 HDMI 为副屏
      2. 查看主副屏输出接口
    5. HDMI 引脚
    6. 显示桥接芯片

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

可以在这里修改:

picture 3

picture 2

但是刚刚发现还是不行,还是检测不到,后来意识到应该是板子里的系统已经(类似)休眠了,因为蓝灯已经不闪了。所以重新插拔供电线,强制重启板子系统,十几秒后就跳出 usb 连接哪个主机的弹窗,在选择连接到 linux 之后,ubuntu 内就出现了 adb 设备。

picture 4

尽管目前已经解决了问题,但是有弹窗也意味着刚刚的配置是失效的,所以检查了一下,果然又变成“ask what to do”了,为了测试是否能够直接连到 vmware,我又加强了一下设置:

picture 5

然后重新登录之后,发现是可行的,设备还在:

picture 6

但这不够,我们再加测板子重新插拔电后是否能够直接连到虚拟机。

测试结果很顺利,没有弹窗,虚拟机里的 adb 继续连上了。

并且watch adb devices可以发现,断电后设备消失,接电开机后设备自动显示。一切符合预期。

2. ✅ 启用投屏​

  1. 更改虚拟机的 vpn

picture 7

picture 8

picture 9

  1. 安装scrcpy

首先尝试sudo apt install scrcpy发现不行,好在snap里有,用snap install scrcpy装上了。

picture 10

目前一切顺利

3. ✅ 修改源码,尝试在surfaceflinger部分加入几句 log​

加 log 要在函数里加,不能直接加在文件级别,这是 C++和 python 之类语言的一个比较明显的区别,否则会报函数找不到错误:

picture 14

所以我最后是这么加的:

picture 15

编译成功:

picture 13

4. ✅ 推入系统​

  1. read-only system picture 12

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. ✅ 测试是否编译通过成功​

确认已经有了我们修改的信息:

picture 16

测试通过!

compile and run the first vr mode​

error of null pointer​

picture 22

picture 23

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,但实际上我拉的版本里目录已经完全不对了。

picture 41

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:

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 可不可以设置……(以及有没有必要设置)

picture 53

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,不过需要自己改。

不过实际上,我发现很多内容在我的开发板上都已经有了。

picture 15

picture 16


但后续发现,还是有些问题,对照国内朋友修改 dts 的记录,较为详细:[RK3399] HDMI 正常输出 4K_但行前路 无问西东-程序员宝宝 - 程序员宝宝

核心思路:编译 kernel 时,碰到错误会给出报错行,用 vim 去查看该行,看看是啥问题,对应的删改即可,✨✨。

这个问题主要是因为帖子中的connect = <&vopb_out_hdmi>; 已经不适用了,导致报错。

picture 38

考虑到这个只是用于开机 logo 的,所以无视,删掉重新编!

picture 39


新的问题是由于写错了:

picture 40

ref:

PASSED: change RkConfig​

看起来对,也改起来很简单,但是我并没有找到对应的配置。

picture 17

以下是我们的配置:

picture 18

ref:

主板支持 4k60hz 输出修改​

基于 rockchip 开发大佬的文章 (1 条消息) [RK3399][Android7.1] HDMI 显示屏(副屏)调试记录小结_Kris Fei's blog-CSDN 博客_hdmi 调试 ,可以知道修改主板 hdmi 输出主要改以下这几文件:

  1. drm_edid.c: edid 相关
  2. dw-hdmi.c: HDMI 驱动,包括内部 I2C 接口实现
  3. d_hdmi-rockchip.c: drm 框架部分

修改如下:

picture 45

此外根据官方文档,还要确认一下白名单:

picture 54

好在都是有的:

picture 55

测试 edid 修改结果​

/sys/class/drm/card0-HDMI-A-1/edid

picture 43

picture 44

ref:

HDMI 相关介绍​

EDID​

HDMI 比例​

在 hdmi.h - include/linux/hdmi.h - Linux source code (v5.16.9) - Bootlin 可以找到 HDMI 比例的定义:

picture 42

✨✨ VOP(vopb | vopl)​

ref:

启用vopb​

官方文档指示,想使用哪种 VOP,只要关闭另一种就可以了:

picture 46

在kernel仓库寻找我们的关键字,找到rk3399和rockpi-4b相关的文件:

picture 47

确认内部的信息,是把vopl关闭的,也就是开启了vopb,也就是默认打开了 4k 输出:

picture 48

绑定pll​

官方文档指示,需要将目标 vop 挂载到vpll,另一个挂载到cpll:

picture 49

还是同一个文件,检查确认,是默认的:

picture 50

ref:

VOP 调试(hdmi 图层显示)​

cat /d/dri/0/summary

主要查看Connector是不是HDMI-A,以及Display mode:

picture 56

每个图层的大小变化(src(source) --> dst(destination))也是很重要的信息:

picture 57

✨✨ 主副屏​

启用 HDMI 为副屏​

# device/rockchip/rk3368/rk3368_mid/system.prop
sys.hwc.device.extend=HDMI-A

picture 51

查看主副屏输出接口​

sys.hwc.device.main # 主显输出接口
sys.hwc.device.aux # 副显输出接口

picture 52

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)