跳到主要内容
版本: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仓库寻找我们的关键字,找到rk3399rockpi-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)