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.关闭主负极…

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

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

算法day29

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

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

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

嵌入式硬件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…

eclipse创建maven项目

第一步&#xff1a;打开eclipse 我们选择java项目即可 点击finish即可 它会自动下载插件 然后在控制台上输入Y即可

HCIE-QOS基本原理

QOS基本原理 QOS概述什么是QOSQoS服务模型区分服务模型QoS常用技术 (DiffServ模型)QoS数据处理流程 (DiffServ模型) QoS流分类和流标记QoS数据处理流程为什么需要流分类和流标记 简单流分类外部优先级 - VLAN报文外部优先级 - MPLS报文外部优先级 - IP报文各外部优先级间的对应…

机器学习作业7——PCA

目录 一、原理 1.数据中心化 2.白数据与目标 3.协方差与协方差矩阵 4.特征值与特征向量 5.最终结果构造 二、代码 代码解释&#xff1a; 三、结果 结果解释&#xff1a; pca优缺点分析&#xff1a; 参考视频&#xff1a; 一、原理 目的&#xff1a; pca是为了将原…

辽宁普通测径仪升级智能测径仪后都有哪些改进?

关键字: 普通测径仪, 智能测径仪, 测径仪升级, 测径仪特点, 智能测径仪优势, 目前多数厂家测径仪的数据处理方式是单片机计算出最终结果&#xff0c;然后传输到工控机后期处理。这样的电路系统对轧钢现场的高温、高粉尘和强电磁干扰的环境适应性很差&#xff0c;使得同一厂家、…

JUC并发编程-第一天

JUC并发编程-第一天 JUC开发基础知识进程、线程、协程 JUC开发基础知识 先有进程&#xff0c;然后进程可以创建线程&#xff0c;线程是依附在进程里面的&#xff0c;线程里面包含多个协程 进程之间不共享全局变量&#xff0c;线程之间共享全局变量(线程通信就是用的这个&#x…

经典的网站系统架构(入门级)

从开发到部署&#xff0c;从用户访问到底层数据库&#xff0c;介绍搭建网站系统的经典架构的10个核心部分。 &#xff08;图转自bytebytego&#xff0c;翻译整理by dogstar&#xff09; 1、使用Git管理和协同源代码&#xff0c;通过CI/CD或Git的Webhook方式自动同步更新部署到服…

java原子变量

在Java中&#xff0c;原子变量是一种特殊的变量&#xff0c;它们提供了一种不需要显式加锁的情况下进行线程安全的操作。Java.util.concurrent.atomic包提供了原子变量类&#xff0c;如AtomicInteger&#xff0c;AtomicLong等&#xff0c;它们利用底层硬件的原子操作来保证线程…