[RK3399][Android7.1] 移植笔记 --- 9.7寸eDP显示屏添加

Platform: RK3399
OS: Android 7.1
Kernel: v4.4.83

由于此屏在rk3288平台上使用过,原以为接上去就可以点亮,谁知道花了一天多时间折腾,最后还是发现是自己的大意造成的,ORZ…


原理图:

LCD:
这里写图片描述

背光:
这里写图片描述

这里写图片描述

EDP屏硬件直接按照上电时序连接好控制,软件无需干预。
EDP_HPD pin可接可不接。
所以要做的就是配置LCD_BL_EN pin, 对应的是GPIO4_D5.


屏幕参数:

物理参数:
这里写图片描述
时序参数:
这里写图片描述

附时序参数说明:

Property Comment
clock-frequency Dclk频率,单位Hz
hactive 行有效像素
vactive 列有效像素
hfront-porch 行前消隐
hsync-len 行同步信号
hback-porch 行后消隐
vfront-porch 列前消隐
vsync-len 列同步信号
vback-porch 列后消隐
hsync-active Hsync信号极性配置
vsync-active Vsync 信号极性配置
de-active Den 信号极性配置
pixelclk-active Dclk信号极性配置

DTS配置:

在rk3399-mid-818-android.dts基础上修改

edp_panel: edp-panel {
    //注意不要和lg_lp079qx1_sp0v弄混淆了。
    compatible = "lg,lp097qx1-spa1", "panel-simple";
    bus-format = <MEDIA_BUS_FMT_RGB666_1X18>;
    backlight = <&backlight>;
    power-supply = <&vcc3v3_s0>;
    enable-gpios = <&gpio3 8 GPIO_ACTIVE_HIGH>;
    ports {
        panel_in_edp: endpoint {
            remote-endpoint = <&edp_out_panel>;
        };
    };
};

backlight: backlight {
    compatible = "pwm-backlight";
    pwms = <&pwm0 0 25000 0>;
    brightness-levels = <
        255 200 199 198 197 197 196 195 194 193 193 192
        191 190 189 189 188 187 186 185 185 184 183 182
        181 181 180 179 178 177 177 176 175 174 173 173
        172 171 170 169 169 168 167 166 165 165 164 163
        162 161 161 160 159 158 157 157 156 155 154 153
        153 152 151 150 149 149 148 147 146 145 145 144
        143 142 141 141 140 139 138 137 137 136 135 134
        133 133 132 131 130 129 129 128 127 126 125 125
        124 123 122 121 121 120 119 118 117 117 116 115
        114 113 113 112 111 110 109 109 108 107 106 105
        105 104 103 102 101 101 100  99  98  97  97  96
         95  94  93  93  92  91  90  89  89  88  87  86
         85  85  84  83  82  81  81  80  79  78  77  77
         76  75  74  73  73  72  71  70  69  69  68  67
         66  65  65  64  63  62  61  61  60  59  58  57
         57  56  55  54  53  53  52  51  50  49  49  48
         47  46  45  45  44  43  42  41  41  40  39  38
         37  37  36  35  34  33  33  32  31  30  29  29
         28  27  26  25  25  24  23  22  21  21  20  19
         18  17  17  16  15  14  13  13  12  11  10   9
          9   8   7   6   5   5   4   3   2   1   1   0
          0   0   0   0>;
    default-brightness-level = <200>;
    //Kris, 用的是GPIO4_D5
    enable-gpios = <&gpio4 29 GPIO_ACTIVE_HIGH>;
};

建议先单独测试GPIO以及背光,然后再接屏幕,避免硬件电路设计有问题导致器件损坏。


调试遇到的问题:

问题一:
刚起来提示*ERROR* failed to find panel
此log是正常现象,刚开始由于DRM驱动先加载,这时候各个Components没准备好,导致master还是bring up。等后面Component(这里主要是等edp_panel加载完成)添加好后就还会bring up的。具体过程可参考:[RK3399][Android7.1] DRM中的Component System

问题二:
无法找到任何模式,提示:
rockchip-drm display-subsystem: connector[eDP-1] can't found any modes

查看/d/dri/0/summary下的vop状态也是不工作的,说明确实有问题。

rk3399_mid:/ # cat /d/dri/0/summary                                                                                   
VOP [ff900000.vop]: DISABLED
VOP [ff8f0000.vop]: DISABLED

跟踪了下流程:

rockchip_drm_fbdev_init ->
  drm_fb_helper_initial_config ->
    drm_fb_helper_probe_connector_modes ->
      connector->funcs->fill_modes ->
       drm_helper_probe_single_connector_modes ->
         drm_helper_probe_single_connector_modes_merge_bits ->
           connector->funcs->detect ->
             analogix_dp_detect-> 
                     analogix_dp_detect_hpd ->
                       analogix_dp_get_plug_in_status

因此HPD的状态决定了mode的返回是否正确。

int analogix_dp_get_plug_in_status(struct analogix_dp_device *dp)
{
    u32 reg;
    //如果EDP的hdp pin有接到GPIO,那么检测电平状态
    //上面原理图看到我们并未接。
    if (gpio_is_valid(dp->hpd_gpio)) {
        if (gpio_get_value(dp->hpd_gpio))
            return 0;
    } else {
    //直接读取ANALOGIX_DP_SYS_CTL_3寄存器中的HDP状态的值
        reg = readl(dp->reg_base + ANALOGIX_DP_SYS_CTL_3);
        if (reg & HPD_STATUS)
            return 0;
    }
    return -EINVAL;
}

加Log看发现并没有读到寄存器中的HPD状态。
然后我在dts中直接设置force hpd了(代码调用可看analogix_dp_detect_hpd())

&edp {
    force-hpd;
};

这时候vopb工作了,但是还无显示。

kris@eco:~/rk3399/rockdev/rk3399_mid-eng$ adb shell
rk3399_mid:/ # cat /d/dri/0/summary                                                                                   
VOP [ff900000.vop]: ACTIVE
    Connector: eDP
    bus_format[1009] output_mode[f]
    Display mode: 1536x2048p60
    clk[200000] real_clk[200000] type[0] flag[a]
    H: 1536 1548 1564 1612
    V: 2048 2056 2060 2068
    win0-0: DISABLED
    win1-0: DISABLED
    win2-0: ACTIVE
    format: XB24 little-endian (0x34324258)
    zpos: 0
    src: pos[0x0] rect[1536x2048]
    dst: pos[0x0] rect[1536x2048]
    buf[0]: addr: 0x0000000003106000 pitch: 6144 offset: 0
    win2-0: DISABLED
    win2-1: DISABLED
    win2-2: DISABLED
    win3-0: DISABLED
    win3-0: DISABLED
    win3-1: DISABLED
    win3-2: DISABLED

问题三:
此问题最奇葩,因为自己偷懒,没有检查和看清EDP的驱动中居然有两个很类似的驱动名字
“lg_lp079qx1_sp0v”“lg_lp097qx1_spa1”
屏对应的是后者,但DTS配置的是前者,真给自己跪了…

猜你喜欢

转载自blog.csdn.net/kris_fei/article/details/80842034