RK3588 HDMIRX 调试笔记

RK3588 HDMIRX 笔记和开发文档


本文档主要介绍RK3588 HDMI RX模块调试过程中常见调试命令的常见问题如何debug。

HDMI IN功能配置,hdmi in功能SDK默认是关闭的,如需打开,按以下操作:

vim device/rockchip/rk3588/BoardConfig.mk
+BOARD_HDMI_IN_SUPPORT := true

通常调试HDMI RX相关功能需要将日志等级开到2,可以获取更加详细的串口打印。

echo 2 > /sys/module/rockchip_hdmirx/parameters/debug  // level 2
dmesg -n 8

调试命令

1、3588相关调试命令
ls /dev/video*  								// 查看总共多少video节点
grep '' /sys/class/video4linux/video*/name 		// 找到hdmirx节点videox
v4l2-ctl --verbose -d /dev/video20 -D			// 查看当前video节点的状态
v4l2-ctl -d /dev/video20 --query-dv-timings		// 实时查询分辨率、逐\隔行,像素时钟,HBP,HFP,HSYNC等等
v4l2-ctl -d /dev/video17 --get-dv-timings		// 查询已存储的timing信息
cat /d/clk/clk_summary | grep hdmirx			// 获取时钟树
v4l2-ctl -d /dev/video20 --get-edid				// 读取edid
vim rkbin/RKTRUST/RK3588TRUST.ini				// 查询bl31版本
v4l2-ctl -d /dev/v4l-subdev2 --poll-for-event=source_change=0	// 获取v4l2上报subdev事件
v4l2-ctl -d /dev/video20 --poll-for-event=source_change=0		// 获取v4l2上报video事件
cat /d/hdmirx/status							// 获取hdmirx当前状态
cat /d/hdmirx/ctrl								//dump控制器寄存器列表
cat /d/dri/0/summary							// 获取图层信息
adb shell setprop persist.sys.hdmiinmode 2		// 打开camera预览hdmiin
echo 2 > sys/class/hdmirx/hdmirx/edid			//切换edid分组600M
echo 1 > sys/class/hdmirx/hdmirx/edid			//切换edid分组340M
cat /sys/class/misc/hdmirx_hdcp/status			//获取hdcp状态
echo 2 >/sys/class/misc/hdmirx_hdcp/enable		//设置hdcp1.x、hdcp2.x
io -4 0xfdee0430 0xff00							//设置RGB AVMUTE红色,若是其他yuv格式可能会变色灰色
cat /sys/class/hdmirx/hdmirx/audio_present		//audio设备拔插状态
cat /sys/class/hdmirx/hdmirx/audio_rate			//audio 采样率
2、获取数据流:3588-hdmirx获取数据流需要关闭预览

需要根据实际情况修改:video节点、分辨率、buff数量类型(4)、fmt

v4l2-ctl --verbose -d /dev/video20 --set-fmt-video=width=3840,height=2160,pixelformat='NV16' --stream-mmap=4 --set-selection=target=crop,flags=0,top=0,left=0,width=3840,height=2160

v4l2-ctl --verbose -d /dev/video20 --set-fmt-video=width=1920,height=1080 pixelformat='RGB3' --stream-mmap=4 --set-selection=target=crop,flags=0,top=0,left=0,width=1920,height=1080

v4l2-ctl --verbose -d /dev/video20 --set-fmt-video=width=720,height=480,pixelformat='NV12' --stream-mmap=4 --set-selection=target=crop,flags=0,top=0,left=0,width=720,height=480
3、抓取数据帧

需要根据实际情况修改:video节点、分辨率、跳过多少帧、格式、抓取帧数

3840x2160:

v4l2-ctl -d /dev/video20 --set-fmt-video=width=3840,height=2160,pixelformat='NV12' --stream-mmap=4 --stream-skip=0 --stream-to=/data/output_4k_yuv420.yuv --stream-count=5 --stream-poll

v4l2-ctl -d /dev/video20 --set-fmt-video=width=3840,height=2160,pixelformat='NV16' --stream-mmap=4 --stream-skip=0 --stream-to=/data/output_4k_yuv422.yuv --stream-count=5 --stream-poll

v4l2-ctl -d /dev/video20 --set-fmt-video=width=3840,height=2160,pixelformat='RGB3' --stream-mmap=4 --stream-skip=0 --stream-to=/sdcard/output_4k_rgb888.yuv --stream-count=5 --stream-poll

1920x1080:

v4l2-ctl -d /dev/video20 --set-fmt-video=width=1920,height=1080,pixelformat='NV12' --stream-mmap=4 --stream-skip=0 --stream-to=/data/output_1080p_yuv420.yuv --stream-count=5 --stream-poll

v4l2-ctl -d /dev/video20 --set-fmt-video=width=1920,height=1080,pixelformat='NV16' --stream-mmap=4 --stream-skip=0 --stream-to=/data/output_1080p_yuv422.yuv --stream-count=5 --stream-poll

v4l2-ctl -d /dev/video20 --set-fmt-video=width=1920,height=1080,pixelformat='RGB3' --stream-mmap=4 --stream-skip=0 --stream-to=/sdcard/output_1080_rgb888.yuv --stream-count=5 --stream-poll

hdmirx not lock 调试

HDMI RX功能调试过程中可能会遇到某些信号源无法锁定的情况,相关log如下:

...
hdmirx-controller: hdmirx_wait_lock_and_get_timing signal not lock, tmds_clk_ratio:0
hdmirx-controller: hdmirx_wait_lock_and_get_timing mu_st:0x0, scdc_st:0x0, dma_st10:0x10
...

出现该异常的主要原因分析有以下几点:

  1. 信号源没有正常输出,可能源端休眠或者息屏;
  2. 信号质量较差,导致眼图质量不过关;
  3. 源端输出信号较慢或者中间经过多级桥接芯片导致收讯较慢;
  4. DDC通讯异常导致SCDC交互异常;
  5. 源端HDCP加密但RK3588没有使能HDCP或者没有烧KEY;
  6. 信号不良导致误码过高;
  7. edid限制为HDMI2.0以上,但源端只支持HDMI1.4;
  8. 检测到其他信号中断导致无法锁定;

=》问题1、2、4、6通常是硬件原因导致,需要硬件排查或者使用大示波器抓查看眼图质量。
=》问题3:通常增加驱动代码中等待锁定的时间可以解决;
=》问题5:是能HDCP并购买烧录HDCP Key;常见的加密设备包括:DVD机、碟机、Apple笔电、电视盒子等;
=》问题6:常出现于部分较老的信号源,或者10m长线测试,若要兼容可以考虑在代码中关闭模块的误码检测功能;

diff --git a/drivers/media/platform/rockchip/hdmirx/rk_hdmirx.c b/drivers/media/platform/rockchip/hdmirx/rk_hdmirx.c
--- a/drivers/media/platform/rockchip/hdmirx/rk_hdmirx.c
+++ b/drivers/media/platform/rockchip/hdmirx/rk_hdmirx.c
@@ -1416,11 +1416,7 @@ static void hdmirx_controller_init(struct rk_hdmirx_dev *hdmirx_dev)
                           CED_GBCHECKEN_QST |
                           CED_CTRLCHECKEN_QST |
                           CED_CHLOCKMAXER_QST_MASK,
-                          CED_VIDDATACHECKEN_QST|
-                          // CED_DATAISCHECKEN_QST |
-                          CED_GBCHECKEN_QST |
-                          CED_CTRLCHECKEN_QST |
-                          CED_CHLOCKMAXER_QST(0x10));
+                          0);
 }

 static void hdmirx_format_change(struct rk_hdmirx_dev *hdmirx_dev)

=》问题7:通过修改edid兼容HDMI1.4,或者直接执行命令修改edid,参考“3588相关调试命令”

预览黑屏问题调试思路

接入信号源后预览黑屏通常分为两类问题:驱动问题、应用问题
驱动问题:

  • 内核log判断信号是否锁定,分辨度是否读取正常;
[22011.966068][ T5766] fdee0000.hdmirx-controller: hdmirx_wait_lock_and_get_timing signal lock ok, i:114!
[22011.974260][    C4] fdee0000.hdmirx-controller: pkt_2_int_handler pk2_st:0x800
[22011.974273][    C4] fdee0000.hdmirx-controller: pkt_2_int_handler: AVIIF_RCV_IRQ
[22011.974278][    C4] fdee0000.hdmirx-controller: hdmirx_hdmi_irq_handler: en_fiq
[22011.974924][ T5766] fdee0000.hdmirx-controller: hdmirx_wait_lock_and_get_timing: avi_pkt_rcv i:7
[22012.176949][ T5766] fdee0000.hdmirx-controller: hdmirx_get_pix_fmt: pix_fmt: YUV444
[22012.176968][ T5766] fdee0000.hdmirx-controller: hdmirx_get_color_range: color_range: default
[22012.176975][ T5766] fdee0000.hdmirx-controller: hdmirx_get_color_space: video standard: xvYCC601
[22012.176980][ T5766] fdee0000.hdmirx-controller: hdmirx_get_colordepth: color_depth: 24, reg_val:4
[22012.176988][ T5766] fdee0000.hdmirx-controller: get timings from ctrl
[22012.176993][ T5766] fdee0000.hdmirx-controller: act:720x480p, total:858x525, fps:60, pixclk:27028000
[22012.176998][ T5766] fdee0000.hdmirx-controller: hfp:16, hs:62, hbp:60, vfp:9, vs:6, vbp:30
[22012.177002][ T5766] fdee0000.hdmirx-controller: tmds_clk:27028000, pix_clk:27028000
[22012.177007][ T5766] fdee0000.hdmirx-controller: interlace:0, fmt:2, vic:2, color:24, mode:hdmi
[22012.177011][ T5766] fdee0000.hdmirx-controller: deframer_st:0x11
console:/ # cat /d/hdmirx/status                                               
status: plugin
Clk-Ch:Lock     Ch0:Lock        Ch1:Lock        Ch2:Lock

Color Format: YUV444                    Store Format: YUV444 (8 bit)
Timing: 720x480p60 (858x525)            hfp:16  hs:62  hbp:60  vfp:9  vs:6  vbp:30
Pixel Clk: 27028000
Mode: HDMI
Color Depth: 8 bit
Color Range: DEFAULT
Color Space: xvYCC601
  • log等级开到3看看是否有帧数据,每半帧会打印一条log;
 [22085.046725][  T142] fdee0000.hdmirx-controller: dma_irq st1:0x100, st13:240
[22085.054345][  T142] fdee0000.hdmirx-controller: dma_irq st1:0x80, st13:480
[22085.063388][  T142] fdee0000.hdmirx-controller: dma_irq st1:0x100, st13:240
[22085.071006][  T142] fdee0000.hdmirx-controller: dma_irq st1:0x80, st13:480
[22085.080054][  T142] fdee0000.hdmirx-controller: dma_irq st1:0x100, st13:240
[22085.087672][  T142] fdee0000.hdmirx-controller: dma_irq st1:0x80, st13:480
[22085.096719][  T142] fdee0000.hdmirx-controller: dma_irq st1:0x100, st13:240
[22085.104339][  T142] fdee0000.hdmirx-controller: dma_irq st1:0x80, st13:480
[22085.113386][  T142] fdee0000.hdmirx-controller: dma_irq st1:0x100, st13:240

若驱动未锁定则参考“hdmirx not lock 调试”章节定位问题,若驱动重复锁定刷分辨率信息,并且报下面几句log,可能信号质量存在问题,可以尝试通过驱动里面关闭误码,或者等待信号稳定后读取分辨率。

[  330.630348] fdee0000.hdmirx-controller: hdmirx_format_change: queue res_chg_event
[  330.630356] fdee0000.hdmirx-controller: hdmirx_set_ddr_store_fmt: pix_fmt: RGB888, DMA_CONFIG1:0x12000001
[  330.630360] fdee0000.hdmirx-controller: hdmirx_interrupts_setup: enable
[  330.953932] fdee0000.hdmirx-controller: hdmirx_delayed_work_audio: no supported fs(0), cur_state 0
[  331.967266] fdee0000.hdmirx-controller: hdmirx_delayed_work_audio: no supported fs(0), cur_state 0
[  332.980599] rk_hdmirx fdee0000.hdmirx-controller: hdmirx_delayed_work_audio: restart audio fs(44100 -> 48000) ch(0 -> 2)
[  332.980627] rk_hdmirx fdee0000.hdmirx-controller: hdmirx_audio_fifo_init
[  333.183936] rk_hdmirx fdee0000.hdmirx-controller: audio on
[  342.385244] fdee0000.hdmirx-controller: mu2_st:0x2
[  342.385252] fdee0000.hdmirx-controller: mainunit_2_int_handler: TMDSVALID_STABLE_CHG	//phy状态异常或者lane接触异常
[  342.385256] fdee0000.hdmirx-controller: hdmirx_hdmi_irq_handler: en_fiq
[  342.385639] fdee0000.hdmirx-controller: mu0_st:0x10
[  342.385644] fdee0000.hdmirx-controller: mainunit_0_int_handler: TMDSQPCLK_LOCKED_CHG	//tmdsclk  lock change
[  342.385647] fdee0000.hdmirx-controller: hdmirx_hdmi_irq_handler: en_fiq
[  342.388638] fdee0000.hdmirx-controller: mu0_st:0x20
[  342.388642] fdee0000.hdmirx-controller: mainunit_0_int_handler: TMDSQPCLK_OFF_CHG	//tmdsclk off
[  342.388644] fdee0000.hdmirx-controller: hdmirx_hdmi_irq_handler: en_fiq
[  342.390638] fdee0000.hdmirx-controller: mu0_st:0x20
[  342.390641] fdee0000.hdmirx-controller: mainunit_0_int_handler: TMDSQPCLK_OFF_CHG
[  342.390644] fdee0000.hdmirx-controller: hdmirx_hdmi_irq_handler: en_fiq
[  342.393638] fdee0000.hdmirx-controller: mu0_st:0x10
[  342.393643] fdee0000.hdmirx-controller: mainunit_0_int_handler: TMDSQPCLK_LOCKED_CHG
[  342.393645] fdee0000.hdmirx-controller: hdmirx_hdmi_irq_handler: en_fiq
[  342.395552] fdee0000.hdmirx-controller: mu2_st:0x2
[  342.395556] fdee0000.hdmirx-controller: mainunit_2_int_handler: TMDSVALID_STABLE_CHG
[  342.395559] fdee0000.hdmirx-controller: hdmirx_hdmi_irq_handler: en_fiq
[  342.406146] fdee0000.hdmirx-controller: avpunit_1_int_handler: avp1_st:0x80000000
[  342.406150] fdee0000.hdmirx-controller: hdmirx_hdmi_irq_handler: en_fiq
[  342.406768] fdee0000.hdmirx-controller: avpunit_1_int_handler: avp1_st:0x80000000
[  342.406771] fdee0000.hdmirx-controller: hdmirx_hdmi_irq_handler: en_fiq
[  342.422828] fdee0000.hdmirx-controller: avpunit_1_int_handler: avp1_st:0x80000000
[  342.422830] fdee0000.hdmirx-controller: hdmirx_hdmi_irq_handler: en_fiq
[  342.423450] fdee0000.hdmirx-controller: avpunit_1_int_handler: avp1_st:0x80000000

应用问题:
当前hdmirx支持两种预览方式,TIF框架和camera框架。对比如下:

TIFCAMERA
优点延迟低app端能拿到数据做后处理,支持和其他camera类似的相关操作。
缺点不支持屏幕旋转、分屏、画中画、异显(vtunnel支持)功能;
app端拿不到预览buffer数据;
不支持screencap方式的截图命令;
延迟高于TIF,约200-300ms

camera框架的调试类似其他usb camera。
tv框架通过以下命令调试。

  • cat /d/dri/0/summary 查看图层信息,其中Esmart3即为HDMI图层。
console:/ # cat /d/dri/0/summary                                               
Video Port0: DISABLED
Video Port1: DISABLED
Video Port2: DISABLED
Video Port3: ACTIVE
   Connector: DSI-1
       bus_format[100a]: RGB888_1X24
       overlay_mode[0] output_mode[0] color_space[0], eotf:0
   Display mode: 1080x1920p60
       clk[132000] real_clk[132000] type[48] flag[a]
       H: 1080 1095 1099 1129
       V: 1920 1935 1937 1952
   Esmart3-win0: ACTIVE
       win_id: 11
       format: NV24 little-endian (0x3432564e) SDR[0] color_space[0] glb_alpha[0xff]
       rotate: xmirror: 0 ymirror: 0 rotate_90: 0 rotate_270: 0
       csc: y2r[1] r2y[0] csc mode[1]
       zpos: 0
       src: pos[0, 0] rect[1920 x 1080]
       dst: pos[0, 0] rect[1080 x 1920]
       buf[0]: addr: 0x00000000ee7a1000 pitch: 1920 offset: 0
       buf[1]: addr: 0x00000000ee7a1000 pitch: 3840 offset: 2073600
  • 抓图确认
    抓图命令参考上文。
    若使用驱动抓图,则关闭预览,使用v4l2命令抓图即可;
    若使用tv_input,在hal层dump图片,可参考下面的命令;
android12:
rm -rf data/system/dumpimage
mkdir data/system/dumpimage
chmod 777 data/system/dumpimage
setprop vendor.hdmiin.debug.dump 1
setprop vendor.hdmiin.debug.dumpnum 5
1s后立马
setprop vendor.hdmiin.debug.dumpnum 0
2s后立马
setprop vendor.hdmiin.debug.dump 0
把data/system/dumpimage 文件发出来

android13:
rm -rf data/system/dumpimage
mkdir data/system/dumpimage
chmod 777 data/system/dumpimage
setprop vendor.tvinput.debug.dump 1
setprop vendor.tvinput.debug.dumpnum 10
半s后立马
setprop vendor.tvinput.debug.dumpnum 0
等个2s后
setprop vendor.tvinput.debug.dump 0
看下data/system/dumpimage有没有文件
如果没看到有文件,可能是selinux的关系,setenforce 0后重新敲上面的命令
  • 10
    点赞
  • 51
    收藏
    觉得还不错? 一键收藏
  • 11
    评论
评论 11
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值