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

news2024/9/9 4:20:15

一、驱动eDP屏幕

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

        (1)显示时序配置

        将这些参数对应到设备树中,即可完成下面修改,关键节点就是显示时序配置的display-timings节点,在这个节点中将hactive,vactive,hsyn-len等数值填入对应的EDID表中的数值;

edp屏幕节点设备树配置:

edp_panel: edp-panel {
        status = "okay";                                        // 表示设备状态为启用
        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 输出端点
            };
        };
    };

其中上面代码中:

enable-gpios:这个gpio对应你设备上的eDP屏幕的使能引脚

        (2)背光

        在上面的edbpanel节点中背光引用的是backlight2,这是我的背光节点

backlight2: backlight2 {
                    compatible = "pwm-backlight";
                    pwms = <&pwm6 0 25000 0>;//根据原理图得知使用的是哪一个pwm
                    enable-gpios = <&gpio0 RK_PC7 GPIO_ACTIVE_HIGH>;//背光电路的使能引脚,有点屏幕没有,可以省略
                    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 = <50>; // 背光默认亮度
            };

        在背光中,要指定背光使用的是哪一个pwm,在原理图可以找到,若背光电路有使能引脚,则要设置gpio功能,再就是设置背光的默认亮度,也就是屏幕点亮后的默认亮度;

        (3)指定vop

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

        

        可以看到rk3568支持3个vop,若eDP使用vop0的话,MIPI只能使用vop1,eDP屏幕vop配置

&edp {
    force-hpd;                                                  // 强制热插拔检测
    status = "okay";
    connect = <&vp0_out_edp>;                                   // 连接到 VP0 的 eDP 输出
    ports {
        port@1 {
            reg = <1>; 

            edp_out_panel: endpoint {
                remote-endpoint = <&panel_in_edp>;              // 连接到 eDP 面板的输入端点
            };
        };
    };
};

 ports 节点中连接到edp-panel节点中的port

(4)使能相关接口

// 启用 eDP PHY
&edp_phy {
    status = "okay";
};

// 启用 eDP 输入 VP0
&edp_in_vp0 {
    status = "okay";
};

// 禁用 eDP 输入 VP1
&edp_in_vp1 {
    status = "disabled";
};

// 路由 eDP
&route_edp {
    status = "okay";
    connect = <&vp0_out_edp>;                                   // 连接到 VP0 的 eDP 输出
};

// 启用 PWM6
&pwm6 {
    status = "okay";
};

为了方便管理,我将eDP相关的配置单独放一个文件,如果要想我这样操作,需要将其他设备树文件中的类似于上述的操作语句注释,避免在此文件中启用了,但是顶层设备树又将它关闭了,完整设备树源码:

/*********************************************************************
* 文件名: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
&edp_phy {
    status = "okay";
};

// 启用 eDP 输入 VP0
&edp_in_vp0 {
    status = "okay";
};

// 禁用 eDP 输入 VP1
&edp_in_vp1 {
    status = "disabled";
};

// 路由 eDP
&route_edp {
    status = "okay";
    connect = <&vp0_out_edp>;                                   // 连接到 VP0 的 eDP 输出
};

// 启用 PWM6
&pwm6 {
    status = "okay";
};

// 配置 eDP
&edp {
    force-hpd;                                                  // 强制热插拔检测
    status = "okay";
    connect = <&vp0_out_edp>;                                   // 连接到 VP0 的 eDP 输出
    ports {
        port@1 {
            reg = <1>; 

            edp_out_panel: endpoint {
                remote-endpoint = <&panel_in_edp>;              // 连接到 eDP 面板的输入端点
            };
        };
    };
};

&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的分享

主要代码:

    /**
     * 在副屏上启动 Activity
     *
     * @param context 上下文对象
     */
    private void launchActivityOnSecondScreen(Context context) {
        ActivityOptions options = ActivityOptions.makeBasic();

        // 获取 DisplayManager 服务
        DisplayManager displayManager = (DisplayManager) context.getSystemService(Context.DISPLAY_SERVICE);
        // 获取所有的展示类型的显示设备
        Display[] presentationDisplays = displayManager.getDisplays(DisplayManager.DISPLAY_CATEGORY_PRESENTATION);

        // 如果有可用的副屏显示设备
        if (presentationDisplays.length > 0) {
            Display secondDisplay = presentationDisplays[0];
            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
                options.setLaunchDisplayId(secondDisplay.getDisplayId());
            }

            // 创建并启动新的 Activity
            Intent intent = new Intent(context, Screen2.class);
            intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
            context.startActivity(intent, options.toBundle());
        }
    }

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1961028.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

越是熟人之间,越要注意这三个方面

不管什么时候&#xff0c;不管与谁相处&#xff0c;社交的边界和底线永远都是不变的。 对待陌生人的时候&#xff0c;我们总会按照既定的章法和礼节行事&#xff0c;可是在对待熟人的时候&#xff0c;很多人却忘了这些章法和礼节。虽然彼此熟悉了&#xff0c;不需要那么在乎章…

狗都能看懂的Imitation Learning的讲解

上一篇博客讲述了奖励稀疏时的训练方法。实际场景中&#xff0c;可能难度还会更大一些。很多场景很难有一个明确的reward&#xff0c;甚至没有reward。那么这里就提出模仿学习&#xff0c;即agent模仿expert的操作。具体两个方法是&#xff1a;Behavior Cloning、Inverse Reinf…

从0到100:旅拍小程序开发笔记(上)

背景调研 旅拍店或者摄影师可以在小程序上设置自己的可预约时间&#xff0c;价格&#xff0c;拍摄介绍&#xff0c;并定义不同的套餐(服装套数&#xff0c;底片张数&#xff0c;精修数量&#xff0c;取景风格&#xff0c;套餐价格等)&#xff0c;顾客可以根据套餐内容和日程安…

定制化Windows系统

定制化Windows系统 1、定制化需求介绍 预定义安装常用软件的原版操作系统&#xff0c;节省花费的时间。定制前提&#xff0c;你需要1块硬盘、1台&#xff08;2台&#xff09;测试电脑、一个PE盘&#xff08;wepe最好&#xff09;&#xff0c;原版系统镜像&#xff0c;虚拟光驱…

鸿蒙应用框架开发【选择并查看文档与媒体文件】 本地数据与文件

选择并查看文档与媒体文件 介绍 应用使用ohos.file.picker、ohos.file.fs等接口&#xff0c;实现了picker拉起文档编辑保存、拉起系统相册图片查看、拉起视频并播放的功能。 效果预览 使用说明&#xff1a; 在首页&#xff0c;应用显示查看最近打开文件功能的跳转按钮&…

GD32手把手教你移植FlashDB(片外Flash) -- 3.FlashDB使用

GD32手把手教你移植FlashDB(片外Flash) – 1.FlashDB-sfud移植 GD32手把手教你移植FlashDB(片外Flash) – 2.FlashDB移植 GD32手把手教你移植FlashDB(片外Flash) – 3.FlashDB使用 示例代码: https://gitee.com/ljmRD/GD32F427_FlashDB 3.FlashDB使用 main() /*************…

浅谈取样器之SSH Command

浅谈取样器之SSH Command JMeter的SSH Command取样器是一个强大的功能&#xff0c;允许用户在JMeter测试计划中执行远程SSH命令。这对于需要与Linux/Unix服务器交互以执行系统命令、脚本或者进行性能测试验证的场景尤为有用。通过这个取样器&#xff0c;您可以集成服务器端操作…

Linux中进程通信之信号

信号 信号通信&#xff0c;其实就是内核向用户空间进程发送信号&#xff0c;只有内核才能发信号&#xff0c;用户空间进程不能发送信号。 关于信号指令的查看&#xff1a;kill -l 例如我们之前使用的kill -9 pid用于杀死一个进程 使用一个死循环 成功发送kill -9指令&#x…

对于AI大模型发展态势的几点认识

本期内容从AI大模型产业的视角出发&#xff0c;全面审视该产业的发展现状&#xff0c;深入剖析其成长轨迹和未来趋势&#xff0c;旨在为人工智能产业的参与者提供一个全面的视角&#xff0c;更好地理解AI大模型产业的复杂性、动态性和潜力&#xff0c;以及如何在这个快速变化的…

Ruoyi 快速开发平台

Ruoyi 快速开发平台 一、官网二、准备工作2.1 环境要求2.2 必要配置 三、运行系统3.1 后端运行3.2 前端安装及运行 四、自定义开发4.1 新增业务模块4.2 代码生成4.2.1 创建菜单4.2.2 后端代码4.2.3 前端代码 一、官网 链接: 前后端分离版本 回到目录 二、准备工作 2.1 环境要…

UDP服务器端bind失败问题

本人使用microchip芯片开发&#xff0c;使用UDP虚拟机通讯&#xff0c;经常提示bind失败&#xff0c;返回-1&#xff0c;尝试了以前UDP作为客户端使用时正常&#xff0c;故硬件链路没问题。 一、可能有几个原因&#xff1a; 端口实际上被占用&#xff1a;最明显的原因是端口真…

基于入侵野草算法的KNN分类优化matlab仿真

目录 1.程序功能描述 2.测试软件版本以及运行结果展示 3.核心程序 4.本算法原理 4.1 入侵野草算法 4.2 K近邻分类器&#xff08;KNN&#xff09; 4.3 基于IWO的KNN分类优化 5.完整程序 1.程序功能描述 基于入侵野草算法的KNN分类优化。其中&#xff0c;入侵野草算法是一…

GEE APP:利用谷歌地球引擎实现更有效的草原管理:决策支持应用视角

简介 草原占地球表面和农田的很大一部分,对人类福祉和畜牧业至关重要。由于牧区基础设施不发达、通信不畅,牧民和草原管理部门在有效控制牧民放牧行为和草原利用方面面临挑战。要解决这一问题,促进草原的可持续利用并保护其生态系统服务,就需要基于云的放牧管理和决策支持…

C++初阶大总结

目录 一.命名空间 1.命名空间定义 2.命名空间使用 二.C++输入&输出 三.缺省参数 四. 函数重载 五.引用 1.常引用 2.传值、传引用效率比较 3.引用和指针的区别 4.引用和指针的不同点: 小知识点: 六.内联函数 七.auto关键字(C++11) 1.auto的使用细则 八.基于…

24暑假算法刷题 | Day23 | LeetCode 39. 组合总和,40. 组合总和 II,131. 分割回文串

目录 39. 组合总和题目描述题解 40. 组合总和 II题目描述题解 131. 分割回文串题目描述题解 39. 组合总和 点此跳转题目链接 题目描述 给你一个 无重复元素 的整数数组 candidates 和一个目标整数 target &#xff0c;找出 candidates 中可以使数字和为目标数 target 的 所有…

Dolphinscheduler 3.2.1bug记录

问题1&#xff1a;分页只展示首页 解决方案&#xff1a; [Bug][API] list paging missing totalpage by Gallardot Pull Request #15619 apache/dolphinscheduler GitHub 问题2:Hive 数据源连接失败 解决方案&#xff1a;修改源码&#xff1a;HiveDataSourceProcessor.cla…

A Survey on Multimodal Large Language Models(from gpt-4o)

目录 A Survey on Multimodal Large Language Models1. INTRODUCTION2. ARCHITECTURE2.1 Modality encoder2.2 Pre-trained LLM2.3 Modality interface 3. TRAINING STRATEGY AND DATA3.1 Pre-training3.1.1 Training Detail3.1.2 Data 3.2 Instruction-tuning3.2.1 Introducti…

Linux下文件编译器-GCC/G++

前言 本文介绍了c/c的编译过程以及gcc/g的时使用 一.c/c翻译的本质&#xff1a;将高级语言翻译成二进制 1&#xff09;程序翻译过程&#xff1a; &#xff08;1&#xff09;预处理&#xff08;头文件展开、宏替换、去注释、条件编译&#xff09;还是C语言代码 ​ …

hash表如何形成,hash函数如何计算,什么是hash冲突 如何解决 ,Golang map的底层原理及扩容机制

散列表 散列表&#xff08;hash表&#xff09;:根据给定的关键字来计算出关键字在表中的地址的数据结构。也就是说&#xff0c;散列表建立了关键字和 存储地址之间的一种直接映射关系。 问题&#xff1a;如何建立映射管血 散列函数:一个把查找表中的关键字映射成该关键字对应…