Amlogic HDMI驱动分析

news2025/4/21 23:01:11

目录

一、简介

二、代码结构介绍

三、HDMI资料

四、宏观认识一下HDMI

1、硬件连接

2、Amlogic方案中HDMI的位置

3、Amlogic HDMI驱动模块的划分

五、HDMI-RX驱动分析

1、芯片手册解读

2、RX -makefile

3、驱动模型分析

4、RX的运行

5、HDMI RX调试

六、HDMI-TX驱动代码分析

七、HDMI-CEC驱动分析

1、芯片手册解读

2、CEC - makefile

3、驱动模型分析

4、cec驱动的运行

5、cec调试方法

1)cec相关系统sfs属性列表

2)输入子系统调试

八、Hotplug

1、Hotplug功能介绍

2、hotplug基本控制流程

3、HPD接口

4、hotplug场景分析

1)hotplug场景-CEC

2)其它场景,待补充

九、功能元&缺陷记录


一、简介

HDMI涉及的知识较多,这里做一些HDMI的简要分析,希望能给大家提供一些思路

二、代码结构介绍

所在层次名称代码路径

kernel

driver

release/aml-comp/kernel/aml-5.4/drivers/amlogic/media/cec

release/aml-comp/kernel/aml-5.4/drivers/amlogic/media/vin/tvin/hdmirx

//注意TV没有tx的应用场景

release/aml-comp/kernel/aml-5.4/drivers/amlogic/media/vout/hdmitx

release/aml-comp/kernel/aml-5.4/drivers/amlogic/media/vout/hdmitx21

kerneldts

release/aml-comp/kernel/aml-5.4/arch/arm/boot/dts/amlogic/t5d_t950d4_am301_linux_1.5g_cvte.dts //1.5g指ddr内存

release/aml-comp/kernel/aml-5.4/arch/arm/boot/dts/amlogic/t5d_t950d4_am301_linux_1g_cvte.dts

release/aml-comp/kernel/aml-5.4/arch/arm/boot/dts/amlogic/t5d_t950d4_am301_linux_512m_cvtelinux.dts

//以上修改的话最好一起修改,覆盖不同芯片多个方案

kernelpinctrl子系统release/aml-comp/kernel/aml-5.4/kernel/aml-5.4/drivers/pinctrl/meson/*
bootboard config

release/aml-comp/uboot/bl33/v2015/board/amlogic/configs/t5d_am301_v1.h

boothdmi

release/aml-comp/uboot/bl33/v2015/arch/arm/cpu/armv8/txl/hdmirx

release/aml-comp/uboot/bl33/v2015/arch/arm/cpu/armv8/txl/hdmitx20

release/aml-comp/uboot/bl33/v2015/arch/arm/cpu/armv8/txl/cec

bootcli 命令行实现release/aml-comp/linux/uboot/bl33/v2015/common/cmd_hdmirx.c

三、HDMI资料

1、T950D4 原厂文档 通过最重要的datasheet文档查看HDMI简介和寄存器;

2、内部kb

HDMI简介培训文档

HDMI大总结

硬件专区:22.HDMI

维基百科:https://zh.wikipedia.org/wiki/HDMI

3、标准协议

HDMI2.1 spec

CEC_Specs.pdf

hdmi_cts_1_4b.pdf

4、知网论文

HDMI相关论文.zip

5、网络资料

HDMI接口规范:HDMI 信号接口及显示规范 - 百度文库

HDMI驱动框架(安卓方案,可参考):S5pv210 HDMI 接口在 Linux 3.0.8 驱动框架解析 (By liukun321 咕唧咕唧)_liukun321咕唧咕唧-CSDN博客

6、Debug文档

Amlogic-HDMI调试指南.doc

CEC基本介绍及debug方法总结.docx

hdmirx测试常见问题分析方法.xls

7、HDMI相关名词缩写速查表

HDMI: High-Definition Multimedia Interface
HDMI视屏和音频信号传输通道采用了的TMDS(Time Minimized Differential Signal)最小化差分信号传输。是一种差分信号传输方式。
HDCP: HDCP的全称是High-bandwidthDigital Content Protection,也就是“高带宽数字内容保护”。
DDC(IIC总线): Display Data Channel
CEC(单总线): Consumer Electronics Control消费电子控制通道
EDID: Extended Display Identification Data
E-EDIO: Enhanced Extended Display Identification Data 增强扩展显示识别数据
HDP(高低电平信号):HotPlugDetection
ARC:Audio Return Channel
ESM:ESM是HDMIRX里面跟HDCP2.2相关的模块
OTP(CEC):One Touch Play 一键播放

四、宏观认识一下HDMI

1、硬件连接

1)原理图

TP.SK513S.PB802(T)D维修原理图.pdf

2)通过原理图查看HDMI电路是端子通过简单的阻容电路,然后直连主芯片的,注意这里只有HDMI_RX相关IO口,无HDMI_TX

2、Amlogic方案中HDMI的位置

详细介绍在手册Video Path章节,这里可以看出HDMI作为Video输入接口,由于TV方案没有TX场景(HDMI单向传输模式是最常见的用法,,也有高版本Hdmi2.1支持双向传输场景),因此这里没有HDMI_TX。

这里的框图也指示着video驱动系统的基本组成:

3、Amlogic HDMI驱动模块的划分

1)HDMI相关的驱动都是编进内核的

2)由于HDMI由多个组件组成,不同组件被划分为单个驱动模块管理,大致分类如下:

五、HDMI-RX驱动分析

1、芯片手册解读

1、

2、RX -makefile

值得注意,hdmirx文件夹下包含两个驱动

一个是hdcp相关的esm_rx模块

release/aml-comp/kernel/aml-5.4/drivers/amlogic/media/vin/tvin/hdmirx/hdcp_rx_main.c

一个是hdmi rx,这里重点分析

3、hdmi rx设备树介绍

release/aml-comp/kernel/aml-5.4/arch/arm/boot/dts/amlogic/t5d_t950d4_am301_linux_1.5g_cvte.dts

1)pinctrl

3、驱动模型分析

1)驱动入口init

release/aml-comp/kernel/aml-5.4/drivers/amlogic/media/vin/tvin/hdmirx/hdmi_rx_drv.c

驱动模型为平台设备驱动,这里实现了driver,没有实现device,设备信息从设备树里获取;

alloc_chrdev_region注册主设备号,后面会使用

class_create 在/sys/class创建hdmirx文件目录

2)probe初始化函数中的关键操作

1、获取设备树里的设备信息

后面使用设备树相关api获取设备信息

of_property_read_u32

2、寄存器map

3、字符设备注册与设备文件创建

hdmirx_add_cdev 将字符设备添加到系统

hdmirx_create_device:

分别在/dev/创建hdmirx0设备文件,在/sys/class/hdmirx创建hdmirx0文件目录

4、创建tasklet和队列任务处理中断等任务

5、hdmi寄存器初始化

6、创建输入设备

会统一在/dev/input/下创建event*文件,/sys/class/input/创建input*文件

具体的event号/input号可以通过查看 cat /proc/bus/input/devices (该文件记录所有的输入设备信息)获得

可以使用evtest/cat来监测event1事件

至此,driver probe完成

4、RX的运行

1)上电会执行hdmirx与esm hld驱动初始化

2)HDMI驱动的交互方法

1、用户->系统:用户主动调用fops接口

2、系统→用户:中断

5、HDMI RX调试

1)

六、HDMI-TX驱动代码分析

TV产品中,没有用到TX功能,这里就不做分析。

七、HDMI-CEC驱动分析

1、芯片手册解读

AO CEC说明 : media: platform: Add support for the Amlogic Meson G12A AO CEC Controller [LWN.net]

实际作用是什么?可以支持同时与两个HDMI设备进行交互和控制

2、CEC - makefile

从上可以判断走的是else分支,接下来可以分析以下三个文件

├── hdmi_aocec_api.c //提供应用操作、硬件相关、msg相关、逻辑处理的api接口
├── hdmi_ao_cec.c //cec驱动实现文件
├── hdmi_cec_dump.c //提供dump调试接口

3、驱动模型分析

驱动模型在hdmi_ao_cec.c文件中实现,接下来主要分析这个文件

1)CEC采用的是经典的平台设备驱动模型

cec实现了driver,没有实现device,设备信息从设备树里获取;

2)先看probe的关键初始化操作

1、注册class和字符设备

1)class注册会在/sys/class创建名为cec的文件夹,用来放一些cec驱动相关的系统属性文件

2)字符设备注册后调用device_create 会在/dev和/sys/class/cec目录下生成cec设备文件"cec"

2、获取设备树id

后续可以使用设备树相关api去获取dts的配置

of_property_read_u32

of_property_read_bool

platform_get_resource_byname

3、注册输入设备

会统一在/dev/input/下创建event*文件,/sys/class/input/创建input*文件

具体的event号/input号可以通过查看 cat /proc/bus/input/devices (该文件记录所有的输入设备信息)获得

4、硬件初始化(配置cec寄存器)

5、创建队列和tasklet(中断下部分)来处理cec消息

6、fs_init

该操作主要目的是在/sys/class/cec下生成系统属性文件

4、cec驱动的运行

1)上电初始化

可以看到上电会调用cec_init->cec probe:

2)cec驱动的交互方法

1、用户->系统:用户主动调用fops接口

2、系统->用户:中断 - 当有cec消息来到,首先进入中断,然后通过输入子系统上报给上层处理

5、cec调试方法

1)cec相关系统sfs属性列表

可以利用以下属性来获取驱动信息和配置驱动

详细使用可详见驱动代码(原理参见linux sysfs机制):

release/aml-comp/kernel/aml-5.4/drivers/amlogic/media/cec/hdmi_ao_cec.c
release/aml-comp/kernel/aml-5.4/drivers/amlogic/media/cec/hdmi_cec_dump.c

以开启cec的log为例:

1、根据文件名找到对应的函数,查看文件的具体作用

dbg_en对应如下两个函数(说明,系统会省略掉show/store后缀)

2、操作dbg_en_show,则使用cat

cat /sys/class/cec/dbg_en

3、操作dbg_en_store,,则使用echo

echo 1 > /sys/class/cec/dbg_en

4、常用的还有:

2)输入子系统调试

/sys/class/input/

八、Hotplug

1、Hotplug功能介绍

TV端HDMI的Hotplug功能依赖HPD/5V信号线,HPD/5V是主从设备交互的信号线,因此多个HDMI组件都会涉及HPD操作,比如edid交换、HDCP、CEC等都会用到,其中TV端负责接收,会操作HPD,source端(比如DVD碟机)负责5v。

2、hotplug基本控制流程

以DVD碟机为source端为例:

1、DVD碟机(source端)->5v信号->TV(接受端)
2、TV检测到5V,再拉高HDP,完成握手,注意发送端负责主动拉5V,接收端负责拉HPD回应source端
3、DVD碟机读取TV的EDID,决定输出什么类型信号给TV

3、HPD接口

hotplug相关接口在hdmi_rx_hw.c文件中
1、设置接口
void hdmirx_hdcp22_hpd(bool value);
void rx_force_hpd_cfg(u8 hpd_level);
int rx_set_port_hpd(u8 port_id, bool val);
void rx_set_cur_hpd(u8 val, u8 func);
unsigned int rx_get_hdmi5v_sts(void);
unsigned int rx_get_hpd_sts(void);
void rx_force_hpd_cfg(u8 hpd_level);
void rx_force_rxsense_cfg(u8 level);
void rx_force_hpd_rxsense_cfg(u8 level);
void rx_hpd_to_esm_handle(struct work_struct *work);

2、相关标志位
hpd_low_cec_off
初始化代码(hdmi_rx_drv.c):
ret = of_property_read_u32(pdev->dev.of_node,"hpd_low_cec_off", &hpd_low_cec_off);
if (ret)
	hpd_low_cec_off = 1;
设备树配置:
hpd_low_cec_off = <1>;

关于RxSense的简单介绍:原理是通过TMDS信号来检查是否插入,是5V和HPD的重要补充。

https://www.linkedin.com/pulse/importance-hdmi-rxsense-accurate-connection-detection-ariel-marcus

4、hotplug场景分析

hotplug接口比较零散,被不同的场景功能函数所调用,需要具体场景具体分析

1)hotplug场景-CEC

1、hdmi_rx驱动中会Export一个hotplug控制接口给到cec驱动调用 - “hdmirx_set_cec_cfg”

hdmitx_cec_ioctl中两个case会涉及hotplug操作

CEC_IOC_SET_OPTION_ENALBE_CEC

CEC_IOC_SET_OPTION_WAKEUP

即CEC使能,CEC唤醒功能

2、hdmi_rx休眠关闭时会根据hdmirx_set_cec_cfg接口中设置cec和auto_power_on使能标志位是否拉低或者无动作

3、关于CEC唤醒为什么要求Hotplug为高的说明,这是因为考虑到设备兼容性问题,设备与TV的交互大致流程如下:

当设备唤醒TV后,TV输出hdp信号时间不确定,有些外设备如果上电后检测不到hotplug信号,则之后不会输出信号给TV,即使等到TV上电完后拉高hpd也不会输出,因此要保持待机时hpd为恒高,或者TV开机第一时间拉高hpd。

2)其它场景,待补充

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

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

相关文章

单列集合Collection常用api

集合体系结构 Collection Collection是单列集合的祖宗接口&#xff0c;它的功能是全部单列集合都可以继承使用的。 public static void main(String[] args) {//TODO Collection类 所有集合的接口 /*public boolean add(E e) 添加public void clear() …

Ubuntu20.04 上启用 VCAN 用作本地调试

目录 一、启用本机的 VCAN​ 编辑 1.1 加载本机的 vcan 1.2 添加本机的 vcan0 1.3 查看添加的 vcan0 1.4 开启本机的 vcan0 1.5 关闭本机的 vcan0 1.6 删除本机的 vcan0 二、测试本机的 VCAN 2.1 CAN 发送数据 代码 2.2 CAN 接收数据 代码 2.3 CMakeLists.…

图像质量评估:使用 SSIM 计算图像相似性

在图像处理领域&#xff0c;衡量两幅图像之间相似性的一种常见方法是使用结构相似性指数&#xff08;SSIM&#xff09;。SSIM 是一种全参考的图像质量评估指标&#xff0c;它不仅考虑了图像的亮度、对比度&#xff0c;还考虑了结构信息。在本文中&#xff0c;我们将介绍一个使用…

Qt QAction添加图片

QAction用的时候&#xff0c;时常需要添加图片&#xff0c;如上图所示&#xff0c;代码如下所示&#xff1a; 测试的图片格式包含png,jpg,bmp,svg&#xff0c;其他未测试

OpenCV-Python(9):图像基础操作

目录 学习目标 获取图像像素并修改像素值 获取图像属性 图像ROI 拆分及合并图像通道 图像边缘扩充 学习目标 获取像素值并修改获取图像的属性(信息)图像的ROI获取图像通道拆分及合并图像扩边 获取图像像素并修改像素值 几乎所有这些操作与Numpy 的关系要比与OpenCV 的…

大语言模型(LLM)框架及微调 (Fine Tuning)

大语言模型&#xff08;LLM&#xff09; 技术作为人工智能领域的一项重要创 新在今年引起了广泛的关注。 LLM 是利用深度学习和大数据训练的人工智能系统&#xff0c;专门 设计来理解、生成和回应自然语言。这些模型通过分析大量 的文本数据来学习语言的结构和用法&#xff0c;…

跟着LearnOpenGL学习11--材质

文章目录 一、材质二、设置材质三、光的属性四、不同的光源颜色 一、材质 在现实世界里&#xff0c;每个物体会对光产生不同的反应。 比如&#xff0c;钢制物体看起来通常会比陶土花瓶更闪闪发光&#xff0c;一个木头箱子也不会与一个钢制箱子反射同样程度的光。 有些物体反…

器件的静态特性

器件的静态特性 静态特性&#xff08;伏安特性&#xff09; 1.器件在导通或关断的状态下&#xff0c;其电压与电流对应关系。 2.静态过程体现器件最基本的电压与电流稳态特性。 动态特性&#xff08;开关特性&#xff09; 1.器件在开或关过程中&#xff0c;其电压、电流随时…

关于java循环结构for

关于java循环结构for 在上一篇文章中&#xff0c;我们了解到了while和do…while的结构以及用法&#xff0c;这篇文章我们主要学习一下最常用的循环结构&#xff0c;for结构&#x1f600;&#xff0c;这个结构理解起来相对while结构会难一些&#xff0c;本篇文章内容会很多&…

深入Mybatis数据源

数据源是持久层框架中最核心的组件之一&#xff0c;在实际工作中比较常见的数据源有 C3P0、Apache Common DBCP、Proxool 等。作为一款成熟的持久化框架&#xff0c;MyBatis 不仅自己提供了一套数据源实现&#xff0c;而且还能够方便地集成第三方数据源。 javax.sql.DataSourc…

Linux之缓冲区的理解

目录 一、问题引入 二、缓冲区 1、什么是缓冲区 2、刷新策略 3、缓冲区由谁提供 4、重看问题 三、缓冲区的简单实现 一、问题引入 我们先来看看下面的代码&#xff1a;我们使用了C语言接口和系统调用接口来进行文件操作。在代码的最后&#xff0c;我们还使用fork函数创建…

单纯形的几何意义 Simplex

单纯形是 n 维空间 n1 个仿射无关的点的集合的凸包。在几何意义上&#xff1a; 1维单纯形是一个线段2维单纯形是一个三角形3维单纯形是一个四面体&#xff08;tetrahedron&#xff09;

MySQL线上慢SQL问题分析处理小记

相同数据量表结构&#xff0c;线上执行12s 本地执行0.1s过程分析 1. 慢SQL信息 SELECT t1.id,t2.idFROM t_platform_target_standard_target_index t1LEFT JOIN t_platform_target_standard t2 ON t1.target_number t2.target_numberWHERE t1.delete_flag 0 AND t2.user_num …

Linux上管理不同版本的 JDK

当在 Linux 上管理不同版本的 JDK 时&#xff0c;使用 yum 和 dnf 可以方便地安装和切换不同的 JDK 版本。本文将介绍如何通过这两个包管理工具安装 JDK 1.8 和 JDK 11&#xff0c;并利用软连接动态关联这些版本。 安装 JDK 1.8 和 JDK 11 使用 yum 安装 JDK 1.8 打开终端并…

如何在 Linux 中配置 firewalld 规则

什么是FirewallD “firewalld”是firewall daemon。它提供了一个动态管理的防火墙&#xff0c;带有一个非常强大的过滤系统&#xff0c;称为 Netfilter&#xff0c;由 Linux 内核提供。 FirewallD 使用zones和services的概念&#xff0c;而 iptables 使用chain和rules。与 ip…

22款奔驰S450L升级主动式氛围灯 浪漫婉转的氛围感

主动式氛围灯有263个可多色渐变的LED光源&#xff0c;营造出全情沉浸的动态光影氛围。结合智能驾驶辅助系统&#xff0c;可在转向或检测到危险时&#xff0c;予以红色环境光提示&#xff0c;令光影艺术彰显智能魅力。配件有6个氛围灯&#xff0c;1个电脑模块。 1、气候&#xf…

Spring系列学习四、Spring数据访问

Spring数据访问 一、Spring中的JDBC模板介绍1、新建SpringBoot应用2、引入依赖&#xff1a;3、配置数据库连接&#xff0c;注入dbcTemplate对象&#xff0c;执行查询&#xff1a;4&#xff0c;测试验证&#xff1a; 二、整合MyBatis Plus1&#xff0c;在你的项目中添加MyBatis …

IP地址的四大类型:动态IP、固定IP、实体IP、虚拟IP的区别与应用

在网络通信中&#xff0c;IP地址是设备在互联网上唯一标识的关键元素。动态IP、固定IP、实体IP和虚拟IP是四种不同类型的IP地址&#xff0c;它们各自具有独特的特点和应用场景。 1. 动态IP地址&#xff1a; 动态IP地址是由Internet Service Provider&#xff08;ISP&#xff…

【嵌入式开发学习必备专栏】

文章目录 嵌入式开发学习必备专栏1.1 ARM Coresight SoC-400/SoC-600 专栏导读目录1.1.1 Performance Profiling1.1.2 ARM Coresight Debug 工具系列1.1.2.1 ARM DS5 系列1.1.2.2 劳特巴赫 Trace32 系列1.1.2.3 JTAG OpenOCD 系列 1.2 ARM Cache 专栏1.3 ARM AMBA Bus 专栏1.3.…

vue3 组件之间传值

vue3 组件之间传值 非常好&#xff0c;为啥突然开这样一篇博文&#xff0c;首先是因为 vue3 是未来发展的趋势。其次&#xff0c;vue 官方已经确认&#xff0c;将于2023年最后一天停止对 vue2 项目的维护&#xff0c;这个是官方发出的通知&#xff0c;并且呢&#xff0c;尤雨溪…