RK3568平台(显示篇)HDMIOUT调试

一.HDMIOUT代码路径

DRM 全称是 Direct Rendering Manager 是 DRI ( Direct Rendering Infrastructure ) 框架的一个

组件。LINUX 4.4/4.19 内核采用 DRM 框架, HDMI 驱动的路径为:

kernel/drivers/gpu/drm/rockchip/dw_hdmi-Rockchip.c 
kernel/drivers/gpu/drm/rockchip/inno_hdmi.c 
kernel/drivers/gpu/drm/bridge/synopsys/

二.DTS修改

&hdmi0 {status = "okay";
};

在 Rockchip 的各个平台中,各种显示接口(HDMI、DP、CVBS等)输出的图像数据来自于 VOP:

HDMI 绑定到 VOPB 需要添加:

 &hdmi0_in_vp1 {status = "okay";
};

打开开机 logo:

在 dts 里面将 route_hdmi 使能即可打开 U-Boot logo 支持:

&route_hdmi0 {status = "okay";
};

三.HDMIOUT调试

板子上电:插上hdmiout能显示输出的log打印:

[  169.342420][  T467] dwhdmi-rockchip fde80000.hdmi: set ops ok!!
[  169.342507][  T467] dwhdmi-rockchip fde80000.hdmi: use tmds mode
[  169.342812][  T467] rockchip-vop2 fdd90000.vop: [drm:vop2_crtc_atomic_enable [rockchipdrm]] Update mode to 1920x1080p60, type: 11(if:800) for vp1 dclk: 148500000
[  169.343293][  T467] rockchip-vop2 fdd90000.vop: [drm:vop2_crtc_atomic_enable [rockchipdrm]] dclk_out1 div: 0 dclk_core1 div: 2
[  169.343538][  T467] rockchip-vop2 fdd90000.vop: [drm:vop2_crtc_atomic_enable [rockchipdrm]] set dclk_vop1 to 148500000, get 148500000
[  169.343603][  T467] rockchip-hdptx-phy-hdmi fed60000.hdmiphy: hdptx_ropll_cmn_config bus_width:16a8c8 rate:1485000
[  169.343941][  T467] rockchip-hdptx-phy-hdmi fed60000.hdmiphy: hdptx phy pll locked!
[  169.343960][  T467] dwhdmi-rockchip fde80000.hdmi: final tmdsclk = 148500000
[  169.344010][  T467] dwhdmi-rockchip fde80000.hdmi: don't use dsc mode
[  169.344025][  T467] dwhdmi-rockchip fde80000.hdmi: dw hdmi qp use tmds mode
[  169.344044][  T467] rockchip-hdptx-phy-hdmi fed60000.hdmiphy: bus_width:0x16a8c8,bit_rate:1485000
[  169.344277][  T467] rockchip-hdptx-phy-hdmi fed60000.hdmiphy: hdptx phy lane locked!
[  169.780527][  T458] dwhdmi-rockchip fde80000.hdmi: failed to get edid
[  169.782177][  T458] dwhdmi-rockchip fde80000.hdmi: set ops ok!!
[  169.782212][  T458] dwhdmi-rockchip fde80000.hdmi: use tmds mode
[  173.866716][  T467] rockchip-vop2 fdd90000.vop: [drm:vop2_crtc_atomic_disable [rockchipdrm]] Crtc atomic disable vp1
[  174.459116][  T467] dwhdmi-rockchip fde80000.hdmi: set ops ok!!
[  174.459168][  T467] dwhdmi-rockchip fde80000.hdmi: use tmds mode
[  174.459526][  T467] rockchip-vop2 fdd90000.vop: [drm:vop2_crtc_atomic_enable [rockchipdrm]] Update mode to 3840x2160p60, type: 11(if:800) for vp1 dclk: 594000000
[  174.460048][  T467] rockchip-vop2 fdd90000.vop: [drm:vop2_crtc_atomic_enable [rockchipdrm]] dclk_out1 div: 0 dclk_core1 div: 1
[  174.460572][  T467] rockchip-vop2 fdd90000.vop: [drm:vop2_crtc_atomic_enable [rockchipdrm]] set dclk_vop1 to 297000000, get 297000000
[  174.460658][  T467] rockchip-hdptx-phy-hdmi fed60000.hdmiphy: hdptx_ropll_cmn_config bus_width:2d5190 rate:1485000
[  174.460978][  T467] rockchip-hdptx-phy-hdmi fed60000.hdmiphy: hdptx phy pll locked!
[  174.461050][  T467] rockchip-hdptx-phy-hdmi fed60000.hdmiphy: hdptx_ropll_cmn_config bus_width:2d5190 rate:2970000
[  174.461570][  T467] rockchip-hdptx-phy-hdmi fed60000.hdmiphy: hdptx phy pll locked!
[  174.461594][  T467] dwhdmi-rockchip fde80000.hdmi: final tmdsclk = 297000000
[  174.466034][  T467] dwhdmi-rockchip fde80000.hdmi: don't use dsc mode
[  174.466068][  T467] dwhdmi-rockchip fde80000.hdmi: dw hdmi qp use tmds mode
[  174.466095][  T467] rockchip-hdptx-phy-hdmi fed60000.hdmiphy: bus_width:0x2d5190,bit_rate:2970000
[  174.466324][  T467] rockchip-hdptx-phy-hdmi fed60000.hdmiphy: hdptx phy lane locked!
[  174.715197][  T458] dwhdmi-rockchip fde80000.hdmi: set ops ok!!
[  174.715257][  T458] dwhdmi-rockchip fde80000.hdmi: use tmds mode
[  186.705988][  T597] healthd: battery none chg=au

在/dev/dri/ 目录下可以看到驱动注册的各个显卡:

130|console:/ # ls /dev/dri/ -l
total 0
crw-rw-rw- 1 root graphics 226,   0 2021-01-01 09:00 card0
crw-rw-rw- 1 root graphics 226,   1 2021-01-01 09:00 card1
crw-rw-rw- 1 root graphics 226, 128 2021-01-01 09:00 renderD128
crw-rw-rw- 1 root graphics 226, 129 2021-01-01 09:00 renderD129
console:/ # ls /sys/class/drm -l
total 0
lrwxrwxrwx 1 root root    0 2021-01-01 09:54 card0 -> ../../devices/platform/display-subsystem/drm/card0
lrwxrwxrwx 1 root root    0 2021-01-01 09:54 card0-DP-1 -> ../../devices/platform/display-subsystem/drm/card0/card0-DP-1
lrwxrwxrwx 1 root root    0 2021-01-01 09:08 card0-HDMI-A-1 -> ../../devices/platform/display-subsystem/drm/card0/card0-HDMI-A-1
lrwxrwxrwx 1 root root    0 2021-01-01 09:54 card0-HDMI-A-2 -> ../../devices/platform/display-subsystem/drm/card0/card0-HDMI-A-2
lrwxrwxrwx 1 root root    0 2021-01-01 09:54 card0-Writeback-1 -> ../../devices/platform/display-subsystem/drm/card0/card0-Writeback-1
lrwxrwxrwx 1 root root    0 2021-01-01 09:54 card1 -> ../../devices/platform/fdab0000.npu/drm/card1
lrwxrwxrwx 1 root root    0 2021-01-01 09:54 renderD128 -> ../../devices/platform/display-subsystem/drm/renderD128
lrwxrwxrwx 1 root root    0 2021-01-01 09:54 renderD129 -> ../../devices/platform/fdab0000.npu/drm/renderD129
lrwxrwxrwx 1 root root    0 2021-01-01 09:54 ttm -> ../../devices/virtual/drm/ttm
-r--r--r-- 1 root root 4096 2021-01-01 09:54 version

 查看hdmi输出使能状态:

cat /sys/class/drm/card0-HDMI-A-1/enabled
enabled

在使用cat命令读取enabled文件时调用enabled_show方法:

static ssize_t enabled_show(struct device *device,struct device_attribute *attr,char *buf)
{struct drm_connector *connector = to_drm_connector(device);bool enabled;enabled = READ_ONCE(connector->encoder);return sysfs_emit(buf, enabled ? "enabled\n" : "disabled\n");
}

查看hdmi的插拔连接状态;

console:/ # cat /sys/class/drm/card0-HDMI-A-1/status
disconnected   //拔掉状态console:/ # cat /sys/class/drm/card0-HDMI-A-1/status
connected  //连接状态

在使用cat命令读取status文件时调用status_show方法:

static ssize_t status_show(struct device *device,struct device_attribute *attr,char *buf)
{struct drm_connector *connector = to_drm_connector(device);enum drm_connector_status status;status = READ_ONCE(connector->status);return sysfs_emit(buf, "%s\n",drm_get_connector_status_name(status));
}

通过如下命令可以查看edid信息:

console:/ # busybox hexdump /sys/class/drm/card0-HDMI-A-1/edid
0000000 ff00 ffff ffff 00ff d024 3588 0001 0000
0000010 202d 0301 7880 7844 cf0a a374 4c57 23b0
0000020 4809 214c 0008 4061 0101 0081 0095 c0a9
0000030 0101 0101 0101 e808 3000 70f2 805a 58b0
0000040 008a 8ec4 0021 1e00 3a02 1880 3871 402d
0000050 2c58 0045 a8b9 0042 1e00 0000 fc00 4900
0000060 5046 4420 7369 6c70 7961 200a 0000 fd00
0000070 3b00 1f46 3c8c 0a00 2020 2020 2020 dd01
0000080 0302 f235 0751 1416 0105 1203 8413 1f22
0000090 5d90 5f5e 6160 0923 0707 0183 0000 0365
00000a0 000c 0040 d867 c45d 7801 00c0 05e3 0103
00000b0 0fe4 8000 0801 00e8 f230 5a70 b080 8a58
00000c0 c400 218e 0000 021e 803a 7118 2d38 5840
00000d0 452c b900 42a8 0000 009e 0000 0000 0000
00000e0 0000 0000 0000 0000 0000 0000 0000 0000
00000f0 0000 0000 0000 0000 0000 0000 0000 1600
0000100

Established Timings其定义在drivers/gpu/drm/drm_edid.c文件的edid_est_modes数组中:

static const struct drm_display_mode drm_dmt_modes[] = {/* 0x55 - 1280x720@60Hz */{ DRM_MODE("1280x720", DRM_MODE_TYPE_DRIVER, 74250, 1280, 1390,1430, 1650, 0, 720, 725, 730, 750, 0,DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC) },/* 0x23 - 1280x1024@60Hz */{ DRM_MODE("1280x1024", DRM_MODE_TYPE_DRIVER, 108000, 1280, 1328,1440, 1688, 0, 1024, 1025, 1028, 1066, 0,DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC) },/* 0x2f - 1440x900@60Hz */{ DRM_MODE("1440x900", DRM_MODE_TYPE_DRIVER, 106500, 1440, 1520,1672, 1904, 0, 900, 903, 909, 934, 0,DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_PVSYNC) },/* 0x53 - 1600x900@60Hz */{ DRM_MODE("1600x900", DRM_MODE_TYPE_DRIVER, 108000, 1600, 1624,1704, 1800, 0, 900, 901, 904, 1000, 0,DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC) },/* 0x3a - 1680x1050@60Hz */{ DRM_MODE("1680x1050", DRM_MODE_TYPE_DRIVER, 146250, 1680, 1784,1960, 2240, 0, 1050, 1053, 1059, 1089, 0,DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_PVSYNC) },/* 0x52 - 1920x1080@60Hz */{ DRM_MODE("1920x1080", DRM_MODE_TYPE_DRIVER, 148500, 1920, 2008,2052, 2200, 0, 1080, 1084, 1089, 1125, 0,DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_NVSYNC) },/* 0x45 - 1920x1200@60Hz */{ DRM_MODE("1920x1200", DRM_MODE_TYPE_DRIVER, 193250, 1920, 2056,2256, 2592, 0, 1200, 1203, 1209, 1245, 0,DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_PVSYNC) },......
}

使用命令查看这款HDMI显示屏支持:

3840x2160

1920x1080

1600x900

1440x900

1280x800

1280x720

1024x768

800x600

720x576

720x480

640x480

需要注意的是1152x864@60Hz并没有在drm_dmt_modes数组中定义,如果想要支持该显示模式,需要我们自己在数组里面添加分辨率1152x864。

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

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

相关文章

【Spine学习07】之跑步动作制作思路总结

前几节试着做了待机和走路动画 现在开始尝试做跑步动作 注意跑步动作和走路一样 暂时不需要使用IK约束但是会用到塞贝尔曲线(模拟裙子飞起动效) 第一步: 先将人物整体斜放置(因为人跑步的时候,身体前倾) …

电池包断路单元DBU的预充电电阻应用案例

当电池组接触器闭合到电机和逆变器上时,逆变器电容器中会有电流涌入。这种非常高的电流至少可能会使接触器老化,并可能永久损坏接触器。 因此,当我们关闭电池组上的接触器时,我们分三个步骤执行此操作: 1.关闭主负极…

2024-06-10 Unity 编辑器开发之编辑器拓展10 —— 其他常见工具类

文章目录 1 AssetDatabase1.1 准备工作1.2 常用 API 2 PrefabUtility1 准备工作2 常用 API 3 EditorApplication3.1 准备工作3.2 常用 API 4 CompilationPipeline4.1 CompilationPipeline.assemblyCompilationFinished4.2 CompilationPipeline.compilationFinished4.3 示例 5 A…

git 怎么设置代理

Git 设置代理通常用于在公司内网或需要通过代理服务器访问外网的情况下。以下是一些常用的设置方法: 命令行一次性设置代理: 使用 git config 命令可以临时设置代理,这将只影响当前的仓库。 git config --global http.proxy http://proxyuser…

MMDetection实用工具详解(下):模型复杂度、基准测试

工具目录 四、模型复杂度应用展示结果解析 五、基准测试鲁棒性测试基准应用展示结果解析Testing gaussian_noise at severity 0Testing gaussian_noise at severity 2Aggregated results 遇到的tools自定义导包模块No Module Error错误解决思路 上期MMDetection内三个实用工具详…

Mongodb使用$<identifier>过滤更新数组元素

学习mongodb,体会mongodb的每一个使用细节,欢迎阅读威赞的文章。这是威赞发布的第65篇mongodb技术文章,欢迎浏览本专栏威赞发布的其他文章。如果您认为我的文章对您有帮助或者解决您的问题,欢迎在文章下面点个赞,或者关…

JAVA学习笔记DAY5——SSM_Spring

文章目录 技术体系结构单体架构分布式架构 框架 FrameworkSpringIoc容器和核心概念组件Spring管理组件优点Spring Ioc 容器和容器实现普通容器复杂容器SpringIoc容器具体接口和实现类SpringIoc 容器管理配置方式 SpringIoc Ioc DI Spring Ioc 实践和应用Spring Ioc创建步骤配置…

算法day29

第一题 695. 岛屿的最大面积 本题解法:采用bfs的算法; 本题使用象限数组的遍历方法和定义布尔数组vis来遍历每一个元素的上下左右元素,防治被遍历的元素被二次遍历; 本题具体分析如上题故事,但是由于要求区域的最大面…

如何更新 iOS 18 Beta 版本?具体步骤总结

如何更新 iOS 18 Beta 想必有一些用户已经迫不及待的想要知道怎么更新 iOS 18 Beta 版本了吧,下面就给大家总结了具体的操作步骤: 在更新 iOS 18 Beta 版本之前记得我们需要将手机的数据进行备份,大家可以自行选用备份软件比如 iCloud 等。…

Codeforces Round 952 (Div. 4) c++题解(A-H1)

开头 : 这场没打,今天vp了一下,写了A-G,然后就去吃饭了! 比赛链接 : Dashboard - Codeforces Round 952 (Div. 4) - Codeforces A 直接交换,输出即可 inline void solve(){string a , b ; cin >> a>> b ;char c a[0] ;a…

GaussDB系统视图归纳总结及常用运维SQL

文章目录 一、GaussDB系统视图归纳总结二、常用运维SQL 一、GaussDB系统视图归纳总结 GaussDB 是华为基于开源数据库PostgreSQL开发的商业数据库,在兼容oracle和mysql上做出了不少努力,GaussDB的系统视图对标Oracle,有以下对应关系&#xff…

嵌入式硬件VS软件,到底哪个更难?

在嵌入式系统开发中,硬件和软件是密不可分的两个方面。但是,究竟是硬件开发更具挑战性,还是软件开发更难以应对呢?本文将就这一问题展开讨论,探究嵌入式硬件和软件在开发过程中的各种挑战与特点。 一、硬件开发&#…

html是什么?http是什么?

html Html是什么?http是什么? Html 超文本标记语言;负责网页的架构; http((HyperText Transfer Protocol)超文本传输协议; https(全称:Hypertext Transfer Protocol …

Java | Leetcode Java题解之第149题直线上最多的点数

题目&#xff1a; 题解&#xff1a; class Solution {public int maxPoints(int[][] points) {int n points.length;if (n < 2) {return n;}int ret 0;for (int i 0; i < n; i) {if (ret > n - i || ret > n / 2) {break;}Map<Integer, Integer> map ne…

Docker-Portainer可视化管理工具

Docker-Portainer可视化管理工具 文章目录 Docker-Portainer可视化管理工具介绍资源列表基础环境一、安装Docker二、配置Docker加速器三、拉取Portainer汉化版本镜像四、运行容器五、访问可视化界面 介绍 Portainer是一款开源的容器管理平台&#xff0c;它提供了一个直观易用的…

AI数字人的开源解决方案

目前&#xff0c;国内外已经涌现出一些优秀的数字人开源解决方案&#xff0c;这些解决方案为开发者提供了构建数字人应用的工具和基础设施。以下是一些比较知名的数字人开源解决方案。北京木奇移动技术有限公司&#xff0c;专业的软件外包开发公司&#xff0c;欢迎交流合作。 1…

如何通过 6 种方法从 iPhone 恢复已删除的文件

想知道如何从 iPhone 恢复已删除的文件吗&#xff1f;本文将指导您如何从 iPhone 恢复数据&#xff0c;无论您是否有 iTunes/iCloud 备份。 iPhone 上已删除的文件去哪儿了&#xff1f; 许多 iPhone 用户抱怨他们经常丢失 iPhone 上的一些重要文件。由于意外删除、iOS 更新失败…

【StableDiffusion】Embedding 底层原理,Prompt Embedding,嵌入向量

Embedding 是什么&#xff1f; Embedding 是将自然语言词汇&#xff0c;映射为 固定长度 的词向量 的技术 说到这里&#xff0c;需要介绍一下 One-Hot 编码 是什么。 One-Hot 编码 使用了众多 5000 长度的1维矩阵&#xff0c;每个矩阵代表一个词语。 这有坏处&#xff0c…

SpringBoot系列——使用Spring Cache和Redis实现查询数据缓存

文章目录 1. 前言2. 缓存2.1 什么是缓存2.2 使用缓存的好处2.3 缓存的成本2.4 使用Spring Cache和Redis的优点 3. Spring Cache基础知识3.1 Spring Cache的核心概念3.2 Spring Cache的注解3.2.1 SpEL表达式3.2.2 Cacheable3.2.3 CachePut3.2.4 CacheEvict 4. 实现查询数据缓存4…

递归函数知识点

基本概念 递归函数就是让函数自己调用自己。 static void Fun() {if (false){return;}Fun(); } 一个正确的递归函数 1.必须有结束调用的条件 2.用于体检判断的&#xff0c;这个条件&#xff0c;必须改变能够达到停止的目的。 实例 用递归函数打印出0~10。 递归函数就是…