【RK3568】点亮eDP屏幕+双屏异显

打印 上一主题 下一主题

主题 1897|帖子 1897|积分 5691

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

x
一、驱动eDP屏幕

        一般来说,屏幕的规格书中会找到屏幕的相干参数,如没有,也可直接找屏幕厂商要,起首打开屏幕的规格书,搜刮EDID Table,可找到如下信息:

        (1)显示时序配置

        将这些参数对应到设备树中,即可完成下面修改,关键节点就是显示时序配置的display-timings节点,在这个节点中将hactive,vactive,hsyn-len等数值填入对应的EDID表中的数值;
edp屏幕节点设备树配置:
  1. edp_panel: edp-panel {
  2.         status = "okay";                                        // 表示设备状态为启用
  3.         compatible = "simple-panel";                            // 指定兼容的设备类型
  4.         backlight = <&backlight2>;                              // 指定背光设备
  5.         enable-gpios = <&gpio2 RK_PA3 GPIO_ACTIVE_LOW>;         // 用于启用 eDP 面板的 GPIO 引脚,低电平有效
  6.         pinctrl-names = "default";                              // 引脚控制器的名称
  7.         pinctrl-0 = <&zhx_edp_en_gpio>;                         // 引脚控制器的配置
  8.         prepare-delay-ms = <120>;                               // 准备时间延迟,单位为毫秒
  9.         enable-delay-ms = <120>;                                // 启用时间延迟,单位为毫秒
  10.         unprepare-delay-ms = <120>;                             // 取消准备时间延迟,单位为毫秒
  11.         disable-delay-ms = <120>;                               // 禁用时间延迟,单位为毫秒
  12.         bus-format = <MEDIA_BUS_FMT_RGB888_1X24>;               // 总线格式,24 位 RGB888
  13.         bpc = <8>;                                              // 位深度(Bits Per Channel),8 位
  14.         // 显示时序配置
  15.         display-timings {
  16.             native-mode = <&edp_timing1>;                       // 本地模式配置
  17.             edp_timing1: timing1 {
  18.                 clock-frequency = <112200000>;                  // 时钟频率,单位为 Hz
  19.                 hactive = <1920>;                               // 水平有效像素
  20.                 vactive = <1080>;                               // 垂直有效像素
  21.                 hfront-porch = <100>;                           // 水平前肩
  22.                 hsync-len = <100>;                              // 水平同步脉冲长度
  23.                 hback-porch = <205>;                            // 水平后肩
  24.                 vfront-porch = <20>;                            // 垂直前肩
  25.                 vsync-len = <20>;                               // 垂直同步脉冲长度
  26.                 vback-porch = <20>;                             // 垂直后肩
  27.                 hsync-active = <0>;                             // 水平同步极性,0 表示低电平有效
  28.                 vsync-active = <0>;                             // 垂直同步极性,0 表示低电平有效
  29.                 de-active = <0>;                                // 数据使能极性,0 表示低电平有效
  30.                 pixelclk-active = <0>;                          // 像素时钟极性,0 表示低电平有效
  31.             };
  32.         };
  33.         // 定义 eDP 面板的端口
  34.         port {
  35.             panel_in_edp: endpoint {
  36.                 remote-endpoint = <&edp_out_panel>;             // 连接到 eDP 输出端点
  37.             };
  38.         };
  39.     };
复制代码
其中上面代码中:
enable-gpios:这个gpio对应你设备上的eDP屏幕的使能引脚
        (2)背光

        在上面的edbpanel节点中背光引用的是backlight2,这是我的背光节点
  1. backlight2: backlight2 {
  2.                     compatible = "pwm-backlight";
  3.                     pwms = <&pwm6 0 25000 0>;//根据原理图得知使用的是哪一个pwm
  4.                     enable-gpios = <&gpio0 RK_PC7 GPIO_ACTIVE_HIGH>;//背光电路的使能引脚,有点屏幕没有,可以省略
  5.                     pinctrl-names = "default";
  6.                     pinctrl-0 = <&edp_bl_en>;
  7.                     brightness-levels = <
  8.                             0  20  20  21  21  22  22  23
  9.                             23  24  24  25  25  26  26  27
  10.                             27  28  28  29  29  30  30  31
  11.                             31  32  32  33  33  34  34  35
  12.                             35  36  36  37  37  38  38  39
  13.                             40  41  42  43  44  45  46  47
  14.                             48  49  50  51  52  53  54  55
  15.                             56  57  58  59  60  61  62  63
  16.                             64  65  66  67  68  69  70  71
  17.                             72  73  74  75  76  77  78  79
  18.                             80  81  82  83  84  85  86  87
  19.                             88  89  90  91  92  93  94  95
  20.                             96  97  98  99 100 101 102 103
  21.                             104 105 106 107 108 109 110 111
  22.                             112 113 114 115 116 117 118 119
  23.                             120 121 122 123 124 125 126 127
  24.                             128 129 130 131 132 133 134 135
  25.                             136 137 138 139 140 141 142 143
  26.                             144 145 146 147 148 149 150 151
  27.                             152 153 154 155 156 157 158 159
  28.                             160 161 162 163 164 165 166 167
  29.                             168 169 170 171 172 173 174 175
  30.                             176 177 178 179 180 181 182 183
  31.                             184 185 186 187 188 189 190 191
  32.                             192 193 194 195 196 197 198 199
  33.                             200 201 202 203 204 205 206 207
  34.                             208 209 210 211 212 213 214 215
  35.                             216 217 218 219 220 221 222 223
  36.                             224 225 226 227 228 229 230 231
  37.                             232 233 234 235 236 237 238 239
  38.                             240 241 242 243 244 245 246 247
  39.                             248 249 250 251 252 253 254 255
  40.                     >;
  41.                     default-brightness-level = <50>; // 背光默认亮度
  42.             };
复制代码
        在背光中,要指定背光利用的是哪一个pwm,在原理图可以找到,若背光电路有使能引脚,则要设置gpio功能,再就是设置背光的默认亮度,也就是屏幕点亮后的默认亮度;
        (3)指定vop

        rk3568中必须要为屏幕设置vop,并且假如要开发多屏异显的话,vop还不能辩论,如下表

        
        可以看到rk3568支持3个vop,若eDP利用vop0的话,MIPI只能利用vop1,eDP屏幕vop配置
  1. &edp {
  2.     force-hpd;                                                  // 强制热插拔检测
  3.     status = "okay";
  4.     connect = <&vp0_out_edp>;                                   // 连接到 VP0 的 eDP 输出
  5.     ports {
  6.         port@1 {
  7.             reg = <1>;
  8.             edp_out_panel: endpoint {
  9.                 remote-endpoint = <&panel_in_edp>;              // 连接到 eDP 面板的输入端点
  10.             };
  11.         };
  12.     };
  13. };
复制代码

 ports 节点中毗连到edp-panel节点中的port
(4)使能相干接口

  1. // 启用 eDP PHY
  2. &edp_phy {
  3.     status = "okay";
  4. };
  5. // 启用 eDP 输入 VP0
  6. &edp_in_vp0 {
  7.     status = "okay";
  8. };
  9. // 禁用 eDP 输入 VP1
  10. &edp_in_vp1 {
  11.     status = "disabled";
  12. };
  13. // 路由 eDP
  14. &route_edp {
  15.     status = "okay";
  16.     connect = <&vp0_out_edp>;                                   // 连接到 VP0 的 eDP 输出
  17. };
  18. // 启用 PWM6
  19. &pwm6 {
  20.     status = "okay";
  21. };
复制代码

为了方便管理,我将eDP相干的配置单独放一个文件,假如要想我这样操作,需要将其他设备树文件中的类似于上述的操作语句注释,制止在此文件中启用了,但是顶层设备树又将它关闭了,完整设备树源码:
  1. /********************************************************************** 文件名:rk3568-ZHX-eDP.dtsi* 描述:  eDP屏幕配置* 更新:* 时间:  2024/7/19                   * 版本:  V1.1                                 **********************************************************************// {    // 界说 eDP 面板    edp_panel: edp-panel {        status = "disable";                                        // 表现设备状态为启用        compatible = "simple-panel";                            // 指定兼容的设备范例        backlight = <&backlight2>;                              // 指定背光设备        enable-gpios = <&gpio2 RK_PA3 GPIO_ACTIVE_LOW>;         // 用于启用 eDP 面板的 GPIO 引脚,低电平有用        pinctrl-names = "default";                              // 引脚控制器的名称        pinctrl-0 = <&zhx_edp_en_gpio>;                         // 引脚控制器的配置        prepare-delay-ms = <120>;                               // 预备时间延迟,单位为毫秒        enable-delay-ms = <120>;                                // 启用时间延迟,单位为毫秒        unprepare-delay-ms = <120>;                             // 取消预备时间延迟,单位为毫秒        disable-delay-ms = <120>;                               // 禁用时间延迟,单位为毫秒        bus-format = <MEDIA_BUS_FMT_RGB888_1X24>;               // 总线格式,24 位 RGB888        bpc = <8>;                                              // 位深度(Bits Per Channel),8 位        // 显示时序配置        display-timings {            native-mode = <&edp_timing1>;                       // 本地模式配置            edp_timing1: timing1 {                clock-frequency = <112200000>;                  // 时钟频率,单位为 Hz                hactive = <1920>;                               // 程度有用像素                vactive = <1080>;                               // 垂直有用像素                hfront-porch = <100>;                           // 程度前肩                hsync-len = <100>;                              // 程度同步脉冲长度                hback-porch = <205>;                            // 程度后肩                vfront-porch = <20>;                            // 垂直前肩                vsync-len = <20>;                               // 垂直同步脉冲长度                vback-porch = <20>;                             // 垂直后肩                hsync-active = <0>;                             // 程度同步极性,0 表现低电平有用                vsync-active = <0>;                             // 垂直同步极性,0 表现低电平有用                de-active = <0>;                                // 数据使能极性,0 表现低电平有用                pixelclk-active = <0>;                          // 像素时钟极性,0 表现低电平有用            };        };        // 界说 eDP 面板的端口        port {            panel_in_edp: endpoint {                remote-endpoint = <&edp_out_panel>;             // 毗连到 eDP 输出端点            };        };    };    // 界说背光设备    backlight2: backlight2 {        compatible = "pwm-backlight";                           // 指定兼容的设备范例为 PWM 背光        pwms = <&pwm6 0 25000 0>;                               // PWM 配置,利用 pwm6,频率为 25000 Hz        enable-gpios = <&gpio0 RK_PC7 GPIO_ACTIVE_HIGH>;        // 用于启用背光的 GPIO 引脚,高电平有用        pinctrl-names = "default";                              // 引脚控制器的名称        pinctrl-0 = <&edp_bl_en>;                               // 引脚控制器的配置        brightness-levels = <                                   /* 背光亮度级别配置 */            0  20  20  21  21  22  22  23            23  24  24  25  25  26  26  27            27  28  28  29  29  30  30  31            31  32  32  33  33  34  34  35            35  36  36  37  37  38  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  86  87            88  89  90  91  92  93  94  95            96  97  98  99 100 101 102 103            104 105 106 107 108 109 110 111            112 113 114 115 116 117 118 119            120 121 122 123 124 125 126 127            128 129 130 131 132 133 134 135            136 137 138 139 140 141 142 143            144 145 146 147 148 149 150 151            152 153 154 155 156 157 158 159            160 161 162 163 164 165 166 167            168 169 170 171 172 173 174 175            176 177 178 179 180 181 182 183            184 185 186 187 188 189 190 191            192 193 194 195 196 197 198 199            200 201 202 203 204 205 206 207            208 209 210 211 212 213 214 215            216 217 218 219 220 221 222 223            224 225 226 227 228 229 230 231            232 233 234 235 236 237 238 239            240 241 242 243 244 245 246 247            248 249 250 251 252 253 254 255        >;        default-brightness-level = <100>;                        // 默认亮度级别    };};// 启用 eDP PHY
  2. &edp_phy {
  3.     status = "okay";
  4. };
  5. // 启用 eDP 输入 VP0
  6. &edp_in_vp0 {
  7.     status = "okay";
  8. };
  9. // 禁用 eDP 输入 VP1
  10. &edp_in_vp1 {
  11.     status = "disabled";
  12. };
  13. // 路由 eDP
  14. &route_edp {
  15.     status = "okay";
  16.     connect = <&vp0_out_edp>;                                   // 连接到 VP0 的 eDP 输出
  17. };
  18. // 启用 PWM6
  19. &pwm6 {
  20.     status = "okay";
  21. };// 配置 eDP&edp {
  22.     force-hpd;                                                  // 强制热插拔检测
  23.     status = "okay";
  24.     connect = <&vp0_out_edp>;                                   // 连接到 VP0 的 eDP 输出
  25.     ports {
  26.         port@1 {
  27.             reg = <1>;
  28.             edp_out_panel: endpoint {
  29.                 remote-endpoint = <&panel_in_edp>;              // 连接到 eDP 面板的输入端点
  30.             };
  31.         };
  32.     };
  33. };&pinctrl {    zhx_edp_bl_en: zhx_edp_bl_en {        rockchip,pins = <0 RK_PC7 RK_FUNC_GPIO &pcfg_pull_down>;    };    zhx_edp_en_gpio: edp-en-gpio {        rockchip,pins = <2 RK_PA3 RK_FUNC_GPIO &pcfg_pull_none>;    };};
复制代码
        将该文件在rk3568-evb5-ddr4-v10.dtsi文件中包含,编译查看征象即可
二、双屏异显

        我这里利用MIPI+eDP屏幕双屏异显的方式,条件条件,MIPI屏幕已经点亮。
        (1)指定主副屏

        在rk3568中双屏异显需要先配置主副屏,若不设置主副屏,显示可能会有问题,
device/rockchip/rk356x/rk3568_r/rk3568_r.mk文件中末了添加
   PRODUCT_PROPERTY_OVERRIDES += vendor.hwc.device.primary=DSI
  PRODUCT_PROPERTY_OVERRIDES += vendor.hwc.device.extend=eDP
    vendor.hwc.device.primary指定主屏为MIPI, vendor.hwc.device.extend指定副屏为eDP
        (2)异显的两种方案



  • Android Presentation,需要 APP 应用开发中调用相应接口使指定的 view (Presentationview 是一个特殊的 dialog 范例 view)在副屏中显示。 
  • Android Activity 指定屏幕启动,APP 在启动 activity 时可以利用 display id 参数在对应的屏幕上直接显示
        这里利用的是第二种方法。
        这里提供一个Demo,可以自行测试显示情况,
链接: https://pan.baidu.com/s/19zjnUSb2Ser-P_64GvJ8EQ?pwd=dh7h 提取码: dh7h 
--来自百度网盘超级会员v6的分享

重要代码:
  1.     /**
  2.      * 在副屏上启动 Activity
  3.      *
  4.      * @param context 上下文对象
  5.      */
  6.     private void launchActivityOnSecondScreen(Context context) {
  7.         ActivityOptions options = ActivityOptions.makeBasic();
  8.         // 获取 DisplayManager 服务
  9.         DisplayManager displayManager = (DisplayManager) context.getSystemService(Context.DISPLAY_SERVICE);
  10.         // 获取所有的展示类型的显示设备
  11.         Display[] presentationDisplays = displayManager.getDisplays(DisplayManager.DISPLAY_CATEGORY_PRESENTATION);
  12.         // 如果有可用的副屏显示设备
  13.         if (presentationDisplays.length > 0) {
  14.             Display secondDisplay = presentationDisplays[0];
  15.             if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
  16.                 options.setLaunchDisplayId(secondDisplay.getDisplayId());
  17.             }
  18.             // 创建并启动新的 Activity
  19.             Intent intent = new Intent(context, Screen2.class);
  20.             intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
  21.             context.startActivity(intent, options.toBundle());
  22.         }
  23.     }
复制代码

附MIPI屏幕设备树配置

  1. /{
  2.     backlight1: backlight1 {
  3.                         compatible = "pwm-backlight";
  4.                         pwms = <&pwm4 0 25000 0>;
  5.                         brightness-levels = <
  6.                                 0  20  20  21  21  22  22  23
  7.                                 23  24  24  25  25  26  26  27
  8.                                 27  28  28  29  29  30  30  31
  9.                                 31  32  32  33  33  34  34  35
  10.                                 35  36  36  37  37  38  38  39
  11.                                 40  41  42  43  44  45  46  47
  12.                                 48  49  50  51  52  53  54  55
  13.                                 56  57  58  59  60  61  62  63
  14.                                 64  65  66  67  68  69  70  71
  15.                                 72  73  74  75  76  77  78  79
  16.                                 80  81  82  83  84  85  86  87
  17.                                 88  89  90  91  92  93  94  95
  18.                                 96  97  98  99 100 101 102 103
  19.                                 104 105 106 107 108 109 110 111
  20.                                 112 113 114 115 116 117 118 119
  21.                                 120 121 122 123 124 125 126 127
  22.                                 128 129 130 131 132 133 134 135
  23.                                 136 137 138 139 140 141 142 143
  24.                                 144 145 146 147 148 149 150 151
  25.                                 152 153 154 155 156 157 158 159
  26.                                 160 161 162 163 164 165 166 167
  27.                                 168 169 170 171 172 173 174 175
  28.                                 176 177 178 179 180 181 182 183
  29.                                 184 185 186 187 188 189 190 191
  30.                                 192 193 194 195 196 197 198 199
  31.                                 200 201 202 203 204 205 206 207
  32.                                 208 209 210 211 212 213 214 215
  33.                                 216 217 218 219 220 221 222 223
  34.                                 224 225 226 227 228 229 230 231
  35.                                 232 233 234 235 236 237 238 239
  36.                                 240 241 242 243 244 245 246 247
  37.                                 248 249 250 251 252 253 254 255
  38.                         >;
  39.                         default-brightness-level = <50>;
  40.         };
  41. }
  42. // for light mipi LCd
  43. &dsi1 {
  44.         status = "okay";
  45.         dsi1_panel: panel@0 {
  46.                 status = "okay";
  47.                 compatible = "simple-panel-dsi";
  48.                 reg = <0>;
  49.                 backlight = <&backlight1>;
  50.                 reset-delay-ms = <60>;
  51.                 enable-delay-ms = <60>;
  52.                 prepare-delay-ms = <60>;
  53.                 unprepare-delay-ms = <60>;
  54.                 disable-delay-ms = <60>;
  55.         init-delay-ms = <120>;
  56.                 dsi,flags = <(MIPI_DSI_MODE_VIDEO | MIPI_DSI_MODE_VIDEO_BURST |
  57.                         MIPI_DSI_MODE_LPM | MIPI_DSI_MODE_EOT_PACKET)>;
  58.                 dsi,format = <MIPI_DSI_FMT_RGB888>;
  59.                 dsi,lanes  = <4>;
  60.                 panel-init-sequence = [
  61.             //屏初始化代码
  62.             39 00 04 FF 98 81 03   
  63.             ....
  64.             05 78 01 11                                      
  65.                         05 1E 01 29                                      
  66.                                                                   
  67.                 ];
  68.                 panel-exit-sequence = [
  69.                         05 00 01 28
  70.                         05 00 01 10
  71.                 ];
  72.                 disp_timings1: display-timings {
  73.                         native-mode = <&dsi1_timing4>;
  74.             dsi1_timing4: timing4 {
  75.                         clock-frequency = <72000000>; //for X11
  76.                         hactive = <800>;
  77.                         vactive = <1280>;
  78.                         hfront-porch = <40>;
  79.                         hsync-len = <20>;
  80.                         hback-porch = <40>;
  81.                         vfront-porch = <20>;
  82.                         vsync-len = <10>;
  83.                         vback-porch = <20>;
  84.                         hsync-active = <0>;
  85.                         vsync-active = <0>;
  86.                         de-active = <0>;
  87.                         pixelclk-active = <0>;
  88.                 };
  89.                 };
  90.                 ports {
  91.                         #address-cells = <1>;
  92.                         #size-cells = <0>;
  93.                         port@0 {
  94.                                 reg = <0>;
  95.                                 panel_in_dsi1: endpoint {
  96.                                         remote-endpoint = <&dsi1_out_panel>;
  97.                                 };
  98.                         };
  99.                 };
  100.         };
  101.         ports {
  102.                 #address-cells = <1>;
  103.                 #size-cells = <0>;
  104.                 port@1 {
  105.                         reg = <1>;
  106.                         dsi1_out_panel: endpoint {
  107.                                 remote-endpoint = <&panel_in_dsi1>;
  108.                         };
  109.                 };
  110.         };
  111. };
  112. &dsi1 {
  113.         enable-gpios = <&gpio1 RK_PA1 GPIO_ACTIVE_LOW>; //hardware 1.1
  114.         reset-gpios = <&gpio0 RK_PB7 GPIO_ACTIVE_LOW>;//hardware 1.1
  115.         pinctrl-names = "default";
  116.         pinctrl-0 = <&dsi1_rst_gpio &dsi1_en_gpio>;
  117.         connect = <&vp1_out_dsi1>;
  118.         status = "okay";
  119. };
  120. &dsi1_in_vp0 {
  121.         status = "disabled";
  122. };
  123. &dsi1_in_vp1 {
  124.         status = "okay";
  125. };
  126. &dsi1_panel {
  127. //        power-supply = <&vcc3v3_lcd0_n>;
  128. };
  129. &route_dsi1 {
  130.         status = "okay";
  131.         connect = <&vp1_out_dsi1>;
  132. };
  133. &video_phy1 {
  134.         status = "okay";
  135. };
  136. &pwm4 {
  137.         status = "okay";
  138. };
复制代码


免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

花瓣小跑

论坛元老
这个人很懒什么都没写!
快速回复 返回顶部 返回列表