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设备树。