调试过程记录,尽可能用最简洁的话把原理说清楚。

CMS屏幕(B080UAN01.3)调试记录

一、引言


1.1、背景

CMS项目,屏幕驱动,双屏异显示。

1.2、文章目的

关键过程记录,原理记录,快速上手。测试人员或者电子工程师验证屏幕点亮情况,可以直接参考第五章

如果不想看详细记录,请直接移步第五章,快速上手。

二、项目概述


2.1、功能简介

把屏幕驱动起来,显示动画。

读取本地文件解码然后播放,在屏幕上播放。

三、环境准备


3.1、产品需求

CMS项目,屏幕驱动,双屏异显示。

3.2、硬件配置

1)八寸屏幕

资料请看(没什么大作用

产品简介:B080UAN01_3_MIPI_Primilary_Functional_Spec_0.6.pdf

产品:8.0” WUXGA 16:10 Color TFT-LCD with LED Backlight design

型号:B080UAN01.3 (H/W 0A)

2)M2 SS928主板

image

3)屏幕和主板接口

image

3.3、软件配置

请将M2卡的刷包写入设备中,以确保板子正常运行。同时,请开启SSH和Telnet登录功能,确保USB虚拟网卡能够正常工作,以保障系统的网络连接稳定性和可访问性。把M2的卡刷包刷进去,确保板子工作是正常的。

四、实现要点


关键步骤或代码示例

主要参考《屏幕对接 使用指南》和MPP参考文档以及计算器。

严格按照这个配置流程走:

image

4.1、供电(点亮背光)

参考《21AP10_PINOUT_CN.xlsx》参考表格将相关GPIO状态设置完整。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
//LCD power, 1-enable 0-disable
bspmm 0x0102F0110 0x00001201
echo 85 > /sys/class/gpio/export
echo out > /sys/class/gpio/gpio85/direction
echo 1 > /sys/class/gpio/gpio85/value

//lcd reset, 0 - active reset ; 1-normal
bspmm 0x0102F0110 0x00001201
echo 84 > /sys/class/gpio/export
echo out > /sys/class/gpio/gpio84/direction
echo 0 > /sys/class/gpio/gpio84/value
sleep 1;
echo 1 > /sys/class/gpio/gpio84/value

//backlight pwm
bspmm 0x0102F0104 0x00001201
echo 82 > /sys/class/gpio/export
echo out > /sys/class/gpio/gpio82/direction
echo 1 > /sys/class/gpio/gpio82/value

4.2、时序

这里说的时序是指同步时序,用来计算pixek clock的。

image

另外同步时序用这个:(从下面拷贝来的)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
.combo_dev_cfg = {
.devno = 0,
.lane_id = {0, 1, 2, 3},
.out_mode = OUT_MODE_DSI_VIDEO,
.out_format = OUT_FORMAT_RGB_24BIT,
.video_mode = BURST_MODE,
.sync_info = {
.hsa_pixels = 10, /* 24 pixel */
.hbp_pixels = 50, /* 80 pixel */
.hact_pixels = 1200, /* 1200 pixel */
.hfp_pixels = 30, /* 60 pixel */
.vsa_lines = 2, /* 2 line */
.vbp_lines = 3, /* 10 line */
.vact_lines = 1920, /* 1920 line */
.vfp_lines = 15, /* 15 line */
},
.phy_data_rate = 901,
.pixel_clk = 150156,
},

更新一个稳定点亮的配置:

PS:这个配置是 .devno = 1​的情况。

1
2
hi_vo_sync_info sync_info;
hi_vo_user_sync_info user_sync;
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
.user_sync = {
.user_sync_attr = {
.clk_src = OT_VO_CLK_SRC_FIXED,
// .vo_pll = { /* if hdmi, set it by pixel clk and div mode */
// .fb_div = 100, /* 80 fb div */
// .frac = 0x27EF9D,
// .ref_div = 1, /* 1 ref div */
// .post_div1 = 4, /* 6 post div1 */
// .post_div2 = 2, /* 2 post div2 */
// },
.lcd_m_clk_div = OT_VO_FIXED_CLK_148_5M
},
.pre_div = 1, /* if hdmi, set it by pixel clk */
.dev_div = 1, /* if rgb, set it by serial mode */
.clk_reverse_en = HI_FALSE,
},
.dev_frame_rate = 60,

4.3、SOC平台配置

综上所述,在配置视频输出时,需要特别关注常规显示屏的初始化命令。与一般屏幕不同,该屏幕已内置相应命令,因此只需配置video参数即可。具体配置细节请参见相关文档以获取更多信息。详见配置:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
static const sample_vo_mipi_tx_cfg g_vo_tx_cfg_1200x1920_user = {
.vo_config = {
.vo_dev = SAMPLE_VO_DEV_HD, //这里是1
.vo_intf_type = HI_VO_INTF_MIPI,
.intf_sync = HI_VO_OUT_USER,
.bg_color = COLOR_RGB_RED,
.pix_format = HI_PIXEL_FORMAT_YVU_SEMIPLANAR_420,
.disp_rect = {0, 0, 1200, 1920},
.image_size = {1200, 1920},
.vo_part_mode = HI_VO_PARTITION_MODE_SINGLE,
.dis_buf_len = 3, /* 3: def buf len for single */
.dst_dynamic_range = HI_DYNAMIC_RANGE_SDR8,
.vo_mode = VO_MODE_1MUX,
.compress_mode = HI_COMPRESS_MODE_NONE,

// .sync_info = {0, 1, 1, 1920, 6, 16, 1200, 58, 130, 1, 10, 9, 7, 50, 2, 0, 0, 0},
.sync_info = {
.syncm = 0,
.iop = 1,
.intfb = 1,
.vact = 1920,
.vbb = 5,
.vfb = 15,
.hact = 1200,
.hbb = 60,
.hfb = 30,
.hmid = 1,
.bvact = 10,
.bvbb = 9,
.bvfb = 7,
.hpw = 10,
.vpw = 2,
.idv = 0,
.ihs = 0,
.ivs = 0
},

.user_sync = {
.user_sync_attr = {
.clk_src = OT_VO_CLK_SRC_FIXED,
// .vo_pll = { /* if hdmi, set it by pixel clk and div mode */
// .fb_div = 100, /* 80 fb div */
// .frac = 0x27EF9D,
// .ref_div = 1, /* 1 ref div */
// .post_div1 = 4, /* 6 post div1 */
// .post_div2 = 2, /* 2 post div2 */
// },
.lcd_m_clk_div = OT_VO_FIXED_CLK_148_5M
},
.pre_div = 1, /* if hdmi, set it by pixel clk */
.dev_div = 1, /* if rgb, set it by serial mode */
.clk_reverse_en = HI_FALSE,
},
.dev_frame_rate = 60,
},
.tx_config = {
/* for combo dev config */
.intf_sync = HI_MIPI_TX_OUT_USER,

/* for screen cmd */
// .cmd_count = CMD_COUNT_1200X1920,
// .cmd_info = g_cmd_info_1200x1920,

/* for user sync */
.combo_dev_cfg = {
.devno = 0,
.lane_id = {0, 1, 2, 3},
.out_mode = OUT_MODE_DSI_VIDEO,
.out_format = OUT_FORMAT_RGB_24BIT,
.video_mode = BURST_MODE,
.sync_info = {
.hsa_pixels = 10, /* 24 pixel */
.hbp_pixels = 50, /* 80 pixel */
.hact_pixels = 1200, /* 1200 pixel */
.hfp_pixels = 30, /* 60 pixel */
.vsa_lines = 2, /* 2 line */
.vbp_lines = 3, /* 10 line */
.vact_lines = 1920, /* 1920 line */
.vfp_lines = 15, /* 15 line */
},
.phy_data_rate = 901,
.pixel_clk = 150156,
},
},
};

其它

时钟源(都是user_sync_attr里面的时钟源详细来源)

image

image

image

五、使用方法


快速上手指南

见测试用例。

测试用例

5.2、屏幕的单元测试

1)把测试依赖文件传到板端

1
2
3
4
5
scp -r .\aodicms root@192.168.2.249:/aoditest

ssh root@192.168.2.249

(改了目录名)

2)在板端运行命令

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
Welcome to Linux.


chmod 777 -R aoditest/
cd /aoditest/
./run.sh

日志:
start vo dhd0.
mipi intf sync = 48

_sample_test:press 'e' to exit; 'q' to query!;

chn 0, stream file:3840x2160_8bit.h264, userbufsize: 12441600
chn 0 send steam thread return ...
[Func]:mpi_hdmi_com_stop [Line]:444 [Info]:hdmi:0 do NOT open
hi_mpi_hdmi_stop failed at sample_comm_vo_hdmi_stop: LINE: 543 with 0xa0288004!
[main]-957: program exit normally!
sample_vdec exited gracefully
start vo dhd0.
mipi intf sync = 48

_sample_test:press 'e' to exit; 'q' to query!;

chn 0, stream file:3840x2160_8bit.h264, userbufsize: 12441600

3)预期测试结果:

1725000348848

六、参考资料

  1. 《21AP10_PINOUT_CN.xlsx》 - 该文档详细列出了21AP10接口的引脚定义。
  2. 《RGB_MIPI屏幕时钟时序计算器.xlsx》 - 一个用于计算RGB MIPI屏幕时序的实用工具。
  3. 《MPP 媒体处理软件 V5.0 开发参考.pdf》 - 与MPP媒体处理软件相关的开发文档。
  4. 《屏幕对接 使用指南.pdf》 - 关于如何连接屏幕的详细使用指南。