RK3568 解决MIPI屏幕开机只显示uboot logo的问题
1、前言
? ? ? 之前写过一篇文章介绍了RK3568驱动MIPI屏幕的方法,这次产品迭代,硬件改版,选型的新的屏幕了。所以再次开启调试屏幕的过程。本以为会和上次一样会轻车熟路,事情总是事与愿违,同样的路,遇到新的坑。
2、配置屏幕
? ? ? 适配MIPI屏幕只需要修改一下屏幕的相关的参数,主要是屏幕时序参数,初始化序列这些。整个设备树的配置如下:
&dsi0 {
status = "okay";
//rockchip,lane-rate = <1000>;
dsi0_panel: panel@0 {
status = "okay";
compatible = "simple-panel-dsi";
reg = <0>;
backlight = <&backlight_0>;
power-supply = <&vcc1v8_lcd0_power>;
//enable-gpios = <&gpio0 RK_PC6 GPIO_ACTIVE_HIGH>;
reset-gpios = <&gpio4 RK_PA1 GPIO_ACTIVE_LOW>;
enable-delay-ms = <35>;
prepare-delay-ms = <20>;
reset-delay-ms = <20>;
init-delay-ms = <120>;
unprepare-delay-ms = <0>;
disable-delay-ms = <20>;
mipi-data-delay-ms = <100>;
/*屏幕的宽度,高度,单位mm*/
size,width = <152>;
size,height = <244>;
dsi,flags = <(MIPI_DSI_MODE_VIDEO | MIPI_DSI_MODE_VIDEO_BURST | MIPI_DSI_MODE_LPM | MIPI_DSI_MODE_EOT_PACKET)>;
dsi,format = <MIPI_DSI_FMT_RGB888>;
dsi,lanes = <4>;
/*上海琪翰HQ10-21440B1-C 10寸屏 驱动芯片ILI9881C 寄存器初始操作, 0x15命令类型,单字节数据, 第2个字节为延时, 第3个字节为数据长度,第4,5个字节为数据表示寄存器地址和写入的数据 */
panel-init-sequence = [
39 00 04 FF 98 81 03
/*GPI_1*/
15 00 02 01 00
15 00 02 02 00
15 00 02 03 53
15 00 02 04 D3
15 00 02 05 00
15 00 02 06 0D
15 00 02 07 08
15 00 02 08 00
15 00 02 09 00
15 00 02 0a 00
15 00 02 0b 00
15 00 02 0c 00
15 00 02 0d 00
15 00 02 0e 00
15 00 02 0f 28
15 00 02 10 28
15 00 02 11 00
15 00 02 12 00
15 00 02 13 00
15 00 02 14 00
15 00 02 15 00
15 00 02 16 00
15 00 02 17 00
15 00 02 18 00
15 00 02 19 00
15 00 02 1a 00
15 00 02 1b 00
15 00 02 1c 00
15 00 02 1d 00
15 00 02 1e 40
15 00 02 1f 80
15 00 02 20 06
15 00 02 21 01
15 00 02 22 00
15 00 02 23 00
15 00 02 24 00
15 00 02 25 00
15 00 02 26 00
15 00 02 27 00
15 00 02 28 33
15 00 02 29 33
15 00 02 2a 00
15 00 02 2b 00
15 00 02 2c 00
15 00 02 2d 00
15 00 02 2e 00
15 00 02 2f 00
15 00 02 30 00
15 00 02 31 00
15 00 02 32 00
15 00 02 33 00
15 00 02 34 03
15 00 02 35 00
15 00 02 36 00
15 00 02 37 00
15 00 02 38 96
15 00 02 39 00
15 00 02 3a 00
15 00 02 3b 00
15 00 02 3c 00
15 00 02 3d 00
15 00 02 3e 00
15 00 02 3f 00
15 00 02 40 00
15 00 02 41 00
15 00 02 42 00
15 00 02 43 00
15 00 02 44 00
/*GIP_2*/
15 00 02 50 00
15 00 02 51 23
15 00 02 52 45
15 00 02 53 67
15 00 02 54 89
15 00 02 55 AB
15 00 02 56 01
15 00 02 57 23
15 00 02 58 45
15 00 02 59 67
15 00 02 5a 89
15 00 02 5b AB
15 00 02 5c CD
15 00 02 5d EF
/*GIP_3*/
15 00 02 5e 00
15 00 02 5f 08
15 00 02 60 08
15 00 02 61 06
15 00 02 62 06
15 00 02 63 01
15 00 02 64 01
15 00 02 65 00
15 00 02 66 00
15 00 02 67 02
15 00 02 68 15
15 00 02 69 15
15 00 02 6a 14
15 00 02 6b 14
15 00 02 6c 0D
15 00 02 6d 0D
15 00 02 6e 0C
15 00 02 6f 0C
15 00 02 70 0F
15 00 02 71 0F
15 00 02 72 0E
15 00 02 73 0E
15 00 02 74 02
15 00 02 75 08
15 00 02 76 08
15 00 02 77 06
15 00 02 78 06
15 00 02 79 01
15 00 02 7a 01
15 00 02 7b 00
15 00 02 7c 00
15 00 02 7d 02
15 00 02 7e 15
15 00 02 7f 15
15 00 02 80 14
15 00 02 81 14
15 00 02 82 0D
15 00 02 83 0D
15 00 02 84 0C
15 00 02 85 0C
15 00 02 86 0F
15 00 02 87 0F
15 00 02 88 0E
15 00 02 89 0E
15 00 02 8A 02
/*CMD_Page 4*/
39 00 04 FF 98 81 04
15 00 02 6E 2B
15 00 02 6F 37
15 00 02 3A A4
15 00 02 8D 1A
15 00 02 87 BA
15 00 02 B2 D1
15 00 02 88 0B
15 00 02 38 01
15 00 02 39 00
15 00 02 B5 07
15 00 02 31 75
15 00 02 3B 98
/*CMD_Page 1*/
39 00 04 FF 98 81 01
15 00 02 22 0A
15 00 02 31 00
15 00 02 53 40
15 00 02 55 40
15 00 02 50 99
15 00 02 51 94
15 00 02 60 10
15 00 02 62 20
/*Gamma start*/
15 00 02 A0 00
15 00 02 A1 00
15 00 02 A2 15
15 00 02 A3 14
15 00 02 A4 1B
15 00 02 A5 2F
15 00 02 A6 25
15 00 02 A7 24
15 00 02 A8 80
15 00 02 A9 1F
15 00 02 AA 2C
15 00 02 AB 6C
15 00 02 AC 16
15 00 02 AD 14
15 00 02 AE 4D
15 00 02 AF 20
15 00 02 B0 29
15 00 02 B1 4F
15 00 02 B2 5F
15 00 02 B3 23
/*Neg Register*/
15 00 02 C0 00
15 00 02 C1 2E
15 00 02 C2 3B
15 00 02 C3 15
15 00 02 C4 16
15 00 02 C5 28
15 00 02 C6 1A
15 00 02 C7 1C
15 00 02 C8 A7
15 00 02 C9 1B
15 00 02 CA 28
15 00 02 CB 92
15 00 02 CC 1F
15 00 02 CD 1C
15 00 02 CE 4B
15 00 02 CF 1F
15 00 02 D0 28
15 00 02 D1 4E
15 00 02 D2 5C
15 00 02 D3 23
/*Gamma End*/
39 00 04 FF 98 81 00
05 C8 01 11
05 14 01 29
];
disp_timings0: display-timings {
native-mode = <&dsi0_timing0>;
dsi0_timing0: timing0 {
clock-frequency = <70000000>;//时钟频率(hactive+ hsync-len + hfront-porch + hback-porch)*(vactive + vsync-len + vfront-porch + vback-porch) * Frame rate60Hz = 70060800
hactive = <800>; //水平像素点数
vactive = <1280>; //垂直像素点数
hsync-len = <10>; //水平同步信号宽度HSYNC/thp
hback-porch = <40>; //水平同步后肩
hfront-porch = <40>;//水平同步前肩
vsync-len = <2>; //垂直同步信号宽度VSYNC/tvp
vback-porch = <20>; //垂直同步后肩
vfront-porch = <10>;//垂直同步前肩
hsync-active = <0>; //hsync激活有效电平为低电平
vsync-active = <0>; //vsync激活有效电平为低电平
de-active = <1>; //de激活有效电平为高电平
pixelclk-active = <0>; //pixelclk激活有效电平为低电平
};
};
ports {
#address-cells = <1>;
#size-cells = <0>;
port@0 {
reg = <0>;
panel_in_dsi0: endpoint {
remote-endpoint = <&dsi0_out_panel>;
};
};
};
};
ports {
#address-cells = <1>;
#size-cells = <0>;
port@1 {
reg = <1>;
dsi0_out_panel: endpoint {
remote-endpoint = <&panel_in_dsi0>;
};
};
};
};
? ? 设备树配置好,检查好硬件屏幕的接口电路全部正确后,测试屏幕可以正常显示并进入系统桌面。看来还是顺利的。
?3、出现问题
? ? ? 前面调试很顺利,当时测试的一个供应商样品10寸屏,后面批量供货了10个屏幕,连接主板一测试,开机只显示uboot的logo之后屏幕就黑屏了,系统能正常启动并进入linux内核,屏幕无显示,背光有亮。一样的程序驱动,样品屏可以点亮,批量屏不行。所以大概率怀疑是屏的问题。
? ? ? ?联系厂家说了情况,厂家说也是第一次遇到这种情况,双方反复确认硬件接口电路,没有问题。厂家出了另外一个屏幕初始化序列设置屏幕可以自行显示测试彩条,测试屏幕正常。问题未定位,提供整机给厂家,厂家找人测试了硬件,分析到屏幕的供电的VCC_3V3_LCD电压启动后有跌落。
?
? ? ? 把屏幕的3.3V供电修改成使用RK3568核心板的3.3V供电后,系统启动后可以正常显示桌面图片。这是为什么呢?难道是内核启动后重新初始化控制屏幕的电源的IO导致电压临时降低的导致屏幕掉电需要重新初始屏幕?使用示波器测试U2芯片2脚与VCC_3V3_PRE的波形,其中黄色为2脚的控制波形,蓝色的为VCC_3V3_PRE波形,从波形看是控制信号在1秒后产生了8.8ms低电平,导致DC-DC关闭输出电压降低。
?
? ? ? ? 分析一下屏幕的供电电源树, 外部电源->DC-DC->Q14开关管->屏幕3.3V?,? DC-DC的开关由GPIO1_B1控制, Q14开关管由?GPIO0_C7控制。设备树驱动如下图
/*On-board peripherals 3.3V DC-DC poweren*/
vcc_3v3_bp_power:vcc-3v3-bp-regulator {
compatible = "regulator-fixed";
regulator-name = "vcc3v3_bp_power";
enable-active-high;
gpio = <&gpio1 RK_PB1 GPIO_ACTIVE_HIGH>;
pinctrl-names = "default";
pinctrl-0 = <&vcc3v3_bp_en_pin>;
regulator-always-on;
};
vcc1v8_lcd0_power: vcc1v8-lcd0-power-regulator {
compatible = "regulator-fixed";
regulator-name = "vcc1v8_lcd0_bl_power";
enable-active-high;
gpio = <&gpio0 RK_PC7 GPIO_ACTIVE_HIGH>;
pinctrl-names = "default";
pinctrl-0 = <&vcc1v8_lcd0_bl_en>;
regulator-always-on;
regulator-state-mem {
regulator-off-in-suspend;
};
};
? 4、分析解决问题
? ? ? ? 按上面的分析,uboot能显示logo,说明屏幕应该没有问题,uboot程序使用应用程序的设备树初始化了屏幕,内核启动后会调用panel-simple.c驱动屏幕。为分析问题做了如下测试:
? ? ? ?(1)、panel-simple.c增加打印信息,确认了内核启动后,调用了probe函数,没有调用这个文件中初始化屏幕的函数代码,所以是不是驱动问题,调用一下初始就可以了,修改代码在probe阶段时初始化一次屏幕,依然不行。
? ? ? ?(2)、关闭uboot中屏幕驱动代码,系统启动后uboot logo不显示了,系统启动显示黑屏,并且显示一个光标。panel-simple.c的屏幕初始化代码被调用过。
? ? ? ? 以上测试未解决问题,尝试检查一下regulator的设备树,?给前级regulator? vcc_3v3_bp_power增加了regulator-boot-on?属性。屏幕开机可以正常显示了。因此确认了屏幕电源控制时序的问题。此时再次测量U2芯片2脚与VCC_3V3_PRE的波形,发现电压跌落还在,所以上面的测试到的启动后1秒后的电压跌落应该是uboot初始化屏幕导致的,不是此问题的原因。至于真正的波形应该在2秒左右的位置,有时间可以测量验证下,项目时间紧就不深究了。
? ? ? 最后献上修改好的regulator设备树。
? ? ? ? ? ? ? ? ? ??
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。 如若内容造成侵权/违法违规/事实不符,请联系我的编程经验分享网邮箱:veading@qq.com进行投诉反馈,一经查实,立即删除!