HDMI驱动框架

在介绍HDMI的驱动框架之前,首先需要了解一下HDCP,HPD,DDC 这几个新名词指的是什么,否则直接深入源码只会搞得晕头转向。

  • HDCP: HDCP的全称是High-bandwidthDigital Content Protection,也就是“高带宽数字内容保护”。

  • DDC: HDCP数据秘钥在CPU和显示设备间的交换以及EDID(EDID中包含有关显示器及其性能的参数)要通过hdmi
    接口的两个DDC(IIC总线)引脚实现.(实质是实现一个IIC设备驱动)

  • HDP:Hot PlugDetection,在HDMI的一对联接中,为热插拔的实现而设计的。简单地说,当发送端接入接受端时,接受端会回应HPD信号给发送端,进而发送端会启动DDC通道,而读取接受端EDID的信息,然后进行HDCP的交互,如果双方认证成功,则视频、音频正常工作,否则联接失败,不同系统会有不同的处理。

HDCP,HPD,DDC 这几个新名词清楚了,那就得想想它们作为HDMI的一个组件(这个词不清楚用的是否恰当)之间有什么样的联系呢?其实上面说的已经差不多了,我再简单总结下:
HDCP起到一个数字内容保护的作用,它的秘钥交换需要用到IIC总线,也就是HDMI的DDC通道。另外HDMI还需要从显示设备获得显示相关参数(EDID),比如分辨率等显示信息。这个信息也是通过IIC总线交互的,走的也是DDC通道。HPD就不用多说了,HDMI热插拔后的“工作”全靠它了。Linux驱动需要分别实现这几个组件的驱动,这几个组件的驱动相互配合共支撑实现了HDMI 驱动。下面就先把HDMI框架画出来。
在这里插入图片描述
这里还需要介绍一下CEC:可以简单理解 当您有很多HDMI设备通过HDMI线,切换器或者分配器连在一起的时候,如果所有的HDMI产品都支持CEC功能,那么可以利用其中一台的遥控器可以去控制其他的设备. 这就是CEC功能。210也提供了HDMI cec的驱动源码,并且生成了供给用户空间操作的设备文件(它是作为混杂设备被注册进内核),从上面的框图也可以看到,CEC驱动的实现不同于HDCP、HPD、DDC 等组件的驱动向内核空间提供了函数接口。CEC驱动中仅实现了file_operation操作方法,供给用户对设备文件操作时调用。并没有对内核空间暴露函数接口。
再简单说明下框架:在linux 3.0.8中HDMI作为TV_OUT的一部分,TV_OUT驱动注册时,HDMI作为TV_OUT的一个子系统被初始化。【当TV_OUT的探针函数(static int __devinit s5p_tv_probe(struct platform_device *pdev))被执行时,会调用HDMI相关初始化函数s5p_hdmi_probe(pdev,3, 4);】。并且同时会注册一个符合V4L2标准的设备,因此用户空间对HDMI设备(video14)的基本操作如设置分辨等操作符合V4L2标准操作(这个在后面还会根据源码深入分析)。而CEC HDCP DDC HPD作为HDMI的组件,他们的驱动实现即为HDMI驱动的实现提供函数接口(HDCP DDC HPD 这三个组件的驱动会互相暴露函数调用),也为用户空间提供了操作这个组件的方法(HPD CEC这两个组件的驱动向用户空间提供了操作方法)。
通过上面的框图可以看到,我们在用户空间可以看到的跟HDMI相关的设备文件只有三个,分别是CEC HPD video14 这三个设备文件,根据驱动中实现的方法应用程序可以通过这三个设备文件分别是实现HDMI CEC功能操作、读取热插拔HDMI设备状态、这三个设备文件是如何生成的,他们提供了哪些操作方法呢?

Logo

更多推荐