基于linux5.15.5的IMX 参考手册 --- 13

Posted chocolate2018

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了基于linux5.15.5的IMX 参考手册 --- 13相关的知识,希望对你有一定的参考价值。

基于linux5.15.5的IMX 参考手册 — 13

6.4.6.8 i.mx 6片上高清多媒体接口(HDMI)
6.4.6.8.1介绍
高清多媒体接口(HDMI)驱动程序支持i.MX 6QuadPlus, 6Quad和6Dual SoC上的片上DesignWare HDMI硬件模块。该驱动程序提供了使用单根电缆传输未压缩的视频,音频和数据的能力。
HDMI驱动程序分为四个子组件:
•与Linux帧缓冲区API集成的视频显示设备驱动程序
•与ALSA/SoC子系统集成的音频驱动程序
•支持CEC
•管理HDMI驱动程序的共享软件和硬件资源的多功能设备(MFD)驱动程序。
HDMI驱动支持以下特性:
•与MXC显示设备框架集成(用于管理显示设备与IPU的连接)
•HDMI视频输出高达1080p60分辨率
•支持从HDMI接收器读取EDID信息
•热插拔检测
•支持CEC
•自动时钟管理,最大限度降低功耗
•支持系统挂起/恢复
•HDMI音频播放(2、4、6或8通道,16位,采样率32 khz至192-KHz)
•使用“iecset”实用程序通过ALSA公开的IEC音频头信息
HDMI模块接收来自IPU (Image Processing Unit)的视频数据、来自外部内存接口的音频数据和来自CPU的控制数据,如下图所示。输出数据通过三个过渡最小化差分信号(TMDS)通道传输到SoC外部的HDMI接收器设备。HDMI还携带一个VESA数据显示通道(DDC)。DDC是一个I2C接口,允许HDMI源查询扩展显示识别数据(EDID)的HDMI接收器。CEC通道在源设备和汇聚设备之间提供可选的高级控制功能。

HDMI的视频输入是可配置的,可以来自i.MX 6串行中的两个IPU模块中的任何一个,也可以来自IPU的两个显示接口(DI)端口中的任何一个,DI0或DI1。这个配置是通过IOMUX模块使用HDMI_MUX_CTRL注册字段来控制的。关于这种互连的说明,请参见下图。

6.4.6.8.2软件操作
HDMI驱动程序根据其两个主要用途分为子组件:向HDMI接收器提供视频和音频。
视频显示驱动组件和音频驱动组件需要一个额外的核心驱动组件来管理通用的HDMI资源,包括HDMI寄存器、时钟和IRQ。下图展示了各种HDMI子驱动程序之间的互连以及HDMI视频驱动程序与Linux帧缓冲区子系统之间的互连。

i.MX 6Dual/6Quad/6QuadPlus/6Solo/6DualLite支持许多不同类型的显示输出设备(例如LVDS、LCD、HDMI和MIPI显示器)连接到IPU模块并由IPU模块驱动。MXC显示驱动程序API提供了一个注册显示设备的系统,并配置它们应该如何连接到每个IPU DIs。HDMI驱动程序使用这个API将自己注册为显示设备,以便从IPU接收正确的视频输入。
6.4.6.8.3 CEC
HDMI CEC是一种协议,在用户的环境中提供所有各种音像产品之间的高级控制功能。HDMI CEC驱动程序实现了HDMI CEC低电平协议的软件部分。它包括逻辑地址的获取、CEC消息的收发、错误处理、消息的重传等。

6.4.6.8.4源代码结构
HDMI源代码包含在HDMI核心驱动、HDMI显示驱动和HDMI音频驱动中。

6.4.6.8.5菜单配置选项
有三个主要的Linux内核配置选项,用于在Linux OS映像中选择和包含HDMI驱动程序功能。
HDMI视频支持依赖于对同步面板帧缓冲的支持,也依赖于对IPUv3的支持。

CONFIG_FB_MXC_HDMI提供对HDMI视频驱动的支持,可以被选择Device Drivers > Graphics support > Support for frame buffer devices > MXC HDMI driver support CONFIG_SND_SOC_IMX_HDMI
CONFIG_SND_SOC_IMX_HDMI通过ALSA/SoC子系统提供对HDMI音频的支持,可以被选择
Device Drivers > Sound card support > Advanced Linux Sound Architecture > ALSA for SoC audio support > SoC Audio support for IMX - HDMI
选择前两个配置选项中的任何一个将导致MXC HDMI Core配置选项CONFIG_MFD_MXC_HDMI被选中。该选项可以通过Device Drivers > Multifunction device drivers > MXC HDMI Core选择
CONFIG_MXC_HDMI_CEC选项提供了对HDMI CEC驱动程序的支持,可以在“Device Drivers > MXC 
support drivers > MXC HDMI CEC (Consumer Electronic Control) support”中选择

6.4.6.9外部接口
6.4.6.9.1介绍
高清多媒体接口(HDMI)驱动程序支持外部SiI9022 HDMI硬件模块,提供传输未压缩的视频、音频和数据的能力,使用一根电缆。
HDMI驱动分为两个子组件:一个是集成了Linux帧缓冲区API的视频显示设备驱动程序,一个是将S/PDIF音频数据传输到SiI9022 HDMI硬件模块的S/PDIF音频驱动程序。
HDMI驱动程序仅用于演示应用,支持以下特性:
•HDMI视频输出支持1080p60和720p60分辨率。
•支持从HDMI接收器读取视频的EDID信息。
•热插拔检测
•HDMI音频播放(2通道,16/24位,44.1 KHz采样率)
i.MX 6 7ULP SoC支持外部HDMI。
输出数据通过三个过渡最小化差分信号(TMDS)通道传输到SoC外部的HDMI接收器设备。此外,HDMI携带一个VESA数据显示通道(DDC)。DDC是一个I2C接口,它允许HDMI源查询扩展显示识别数据(Extended Display Identification Data, EDID)的HDMI接收器。CEC信道在源设备和sink设备之间提供可选的高级控制功能。
6.4.6.9.2软件操作
HDMI驱动程序根据其两个主要用途分为子组件:向HDMI接收器提供视频和音频。
音频输出依赖于视频显示。
6.4.6.9.3源代码结构
HDMI驱动程序的源代码分为HDMI显示驱动程序和HDMI音频驱动程序。
HDMI显示驱动程序的源代码在drivers/video/fbdev/mxc中。HDMI音频驱动源在sound/soc/fsl中

6.4.6.9.4菜单配置选项
有两个主要的Linux内核配置选项用于在Linux OS映像中选择和包含HDMI驱动程序功能。
要启用HDMI支持,需要以下配置选项。
“CONFIG_FB_MXS_SII902X”选项支持Sii902x HDMI视频驱动程序,可选择Device Drivers > Support for frame buffer devices > Si Image SII9022 DVI/HDMI Interface Chip。
CONFIG_SND_SOC_IMX_SII902X选项提供了对HDMI音频驱动程序的支持,可以通过选择Device Drivers > Sound card support > ALSA for SoC audio support > ommon SoC Audio options for Freescale CPUs: > SoC Audio support for i.MX boards with sii902x
6.5 Linux 2视频版本(V4L2)

6.5.1介绍
Video for Linux Two (V4L2)驱动程序是V4L2框架的插件,它支持摄像头捕获和显示。
一些i.MX SoC基于相关的图像处理单元和捕获硬件支持V4L2。
有关V4L2的更多信息,请参阅Linux媒体子系统文档(Linux Media Subsystem Documentation)中的Linux Video For Linux 2的API规范。
V4L2 API支持摄像头和显示控制,但i.MX 8只支持V4L2捕获,而不支持使用DPU进行显示控制。i.MX 6和i.MX 7同时使用捕获和显示V4L2。
6.5.1.1 i.MX 8 DPU V4L2
i.MX 8上的Video for Linux Two(V4L2)驱动程序是V4L2框架的插件,仅通过显示处理单元(DPU)支持摄像机捕获。
V4L2 DPU相机驱动程序只支持基本捕获。V4l2捕获设备从摄像机或电视解码器接收传入的视频图像,并将图像捕获到内存中。V4L2驱动程序支持的特性如下:
•RGB 24位和YUV 4:2:2交错格式的捕获接口
•插入不同的传感器驱动器
•流(排队)输入缓冲区
•可编程输入和输出像素格式和大小
•RGB 16, 24, 32位,YUV 4:2:0,和4:2:2交错输入格式
在使用V4L2摄像机功能之前,必须运行命令modprobe mxc_v4l2_capture。
6.5.1.2 PxP V4L2
用于PxP的Video for Linux Two (V4L2)驱动程序仅用于显示输出。
6.5.1.3 i.MX 6带IPU V4L2
Video for Linux Two (V4L2)驱动程序是V4L2框架的插件,它支持摄像头和预处理功能,以及视频和后处理功能。V4L2相机驱动程序实现了对所有相机相关功能的支持。V4l2捕获设备接收来自摄像机或流媒体的传入视频图像,并对其进行操作。输出设备接收视频并对其进行操作,然后将其发送到显示器或类似的设备。
IPU V4L2驱动支持的特性如下:
•直接预览和输出到SDC前景覆盖平面(与LCD刷新同步)
•直接预览到图形帧缓冲区(不同步到LCD刷新)
•帧缓冲和叠加平面的颜色键合或alpha混合
•从IPU编码通道进行流(队列)捕获
•直接(原始拜耳)仍然捕获(依赖于传感器)
•可编程像素格式,大小,帧率预览和捕获
•可编程旋转和翻转使用自定义API
•RGB 16位,24位,32位预览格式
•原始拜耳(仍然只有,传感器依赖),RGB 16, 24, 32位,YUV 4:2:0和4:2:2平面,YUV 4:2:2交错,JPEG格式的捕获
•控制传感器属性,包括曝光、白平衡、亮度、对比度等
•插入不同的传感器驱动器
•链接后处理调整大小和CSC,旋转和显示IPU通道
•流(排队)输入缓冲区
•双层缓冲覆盖和中间(旋转)缓冲
•可配置的3+输入缓冲区缓冲
•可编程输入和输出像素格式和大小
•可编程缩放和帧速率

•RGB 16, 24, 32位,YUV 4:2:0和4:2:2平面,和YUV 4:2:2交错输入格式
•电视输出
命令modprobe mxc_v4l2_capture必须在V4L2函数之前运行。
6.5.1.4 IPU V4L2捕获设备
V4L2捕获设备包括两个接口:
•Capture接口使用IPU预处理ENC通道记录YCrCb视频流
•Overlay接口使用IPU设备驱动将预览视频显示到SDC前、后台面板。
可以在内核配置期间选择V4L2捕获支持。驱动程序包括两层。顶层是Linux驱动的通用视频,它包含链缓冲区管理、流API和其他ioctl接口。该设备的文件位于drivers/media/platform/mxc/capture/。
V4L2捕获设备驱动程序在mxc_v4l2_capture.c文件中。低层覆盖驱动程序位于ipu_fg_overlay_sgc.c、ipu_bg_overlay_sgc .c
这段代码(ipu_prp_ce .c)与IPU ENC硬件接口,ipu_still.c与IPU CSI硬件接口。传感器帧速率控制由vidoc_s_parm ioctl处理。在帧速率设置之前,传感器打开AE和AWB。帧率可能根据光传感器样本的不同而变化。特定相机的驱动程序可以在
drivers/media/platform/mxc/capture/
6.5.2 V4L2捕获设备
V4L2捕获设备包括两个接口:
•捕获接口使用i.MX处理引擎记录YCrCb视频流
•Overlay界面使用i.MX处理引擎将预览视频显示到SDC前台和后台面板。
驱动程序包括两层。顶层是Linux驱动的通用视频,它包含链缓冲区管理、流API和其他ioctl接口。低层是用于显示引擎的i.MX SoC实现,该显示引擎与V4l2 SoC章节中详细描述的SoC相关联。
6.5.2.1 V4L2捕获ioctl
目前支持内存映射流API。支持的V4L2 ioctl包括以下内容:

• VIDIOC_QUERYCAP
• VIDIOC_G_FMT
• VIDIOC_S_FMT
• VIDIOC_REQBUFS
• VIDIOC_QUERYBUF
• VIDIOC_QBUF
• VIDIOC_DQBUF
• VIDIOC_STREAMON
• VIDIOC_STREAMOFF
• VIDIOC_OVERLAY
• VIDIOC_G_FBUF
• VIDIOC_S_FBUF
• VIDIOC_G_CTRL
• VIDIOC_S_CTRL
• VIDIOC_CROPCAP
• VIDIOC_G_CROP
• VIDIOC_S_CROP
• VIDIOC_S_PARM
• VIDIOC_G_PARM
• VIDIOC_ENUMSTD
• VIDIOC_G_STD
• VIDIOC_S_STD
• VIDIOC_ENUMOUTPUT
• VIDIOC_G_OUTPUT
• VIDIOC_S_OUTPUT

V4L2控制代码已得到扩展,以提供对旋转的支持。ID为V4L2_CID_PRIVATE_BASE。支持值包括:
•0-Normal操作
•1-Vertical翻转
•2-Horizontal翻转
•3 - 180°旋转
•顺时针旋转4-90°
•顺时针旋转5-90°,垂直翻转
•顺时针旋转6-90°,水平翻转
•逆时针旋转7-90°
下图显示了V4L2 Capture API交互的框图。

6.5.2.2 V4L2捕获api的使用
本节描述一个V4L2捕获过程示例。应用程序完成以下步骤:
1.通过IOCTL VIDIOC_S_FMT设置捕获像素的格式和大小。
2.通过IOCTL VIDIOC_S_CTRL设置旋转使用的控制信息。
3.使用IOCTL VIDIOC_REQBUFS请求缓冲区。通用V4L2驱动程序创建一个缓冲区链(当前最大帧数为3)。
4.内存将缓冲区映射到其用户空间。
5.使用IOCTL命令VIDIOC_QBUF对缓冲区进行排队。
6.使用IOCTL VIDIOC_STREAMON启动流。此IOCTL启用i.MX处理引擎任务和IDMA通道。当一帧的处理完成时,驱动程序切换到排队等待下一帧的缓冲区。驱动程序还向信号灯发出信号,以指示缓冲区已就绪。
7.使用IOCTL VIDIOC_DQBUF从队列中取出缓冲区。此IOCTL会阻塞,直到ISR驱动器发出信号。
8.将缓冲区存储到YCrCb文件。
9.通过再次执行VIDIOC_QBUF来替换V4L2驱动程序队列中的缓冲器。
对于V4L2静止图像捕获过程,应用程序完成以下步骤:
1.通过执行IOCTL VIDIOC_S_FMT设置捕获像素的格式和大小。
2.使用YUV422读取一帧静止图像。
对于V4L2覆盖支持用例,应用程序完成以下步骤:
1.通过IOCTL VIDIOC_S_FMT设置覆盖窗口。
2.通过IOCTL VIDIOC_OVERLAY打开覆盖任务。
3.通过IOCTL VIDIOC_OVERLAY关闭覆盖任务。
6.5.3 V4L2输出设备
驱动程序为输出设备实现标准的V4L2 API。可以在内核配置期间选择V4L2输出设备支持。驱动程序可在drivers/media/platform/mxc/output/mxc_vout.c中获得。
6.5.3.1 V4L2输出ioctl
目前支持内存映射流API。支持的V4L2 ioctl包括以下内容:
• VIDIOC_QUERYCAP
• VIDIOC_REQBUFS
• VIDIOC_G_FMT
• VIDIOC_S_FMT
• VIDIOC_QUERYBUF
• VIDIOC_QBUF
• VIDIOC_DQBUF
• VIDIOC_STREAMON
• VIDIOC_STREAMOFF
• VIDIOC_G_CTRL
• VIDIOC_S_CTRL
• VIDIOC_CROPCAP
• VIDIOC_G_CROP
• VIDIOC_S_CROP
• VIDIOC_ENUM_FMT
V4L2控制代码已被扩展,以提供对去交错运动的支持。在这种情况下,ID是V4L2_CID_MXC_MOTION。支持的值包括:
•0-中等运动
•1-低运动
•2-高速运动
6.5.3.2 V4L2输出API的使用
本节描述了一个使用V4L2输出API的V4L2输出流程示例。应用程序完成以下步骤:
1.使用IOCTL VIDIOC_S_FMT设置输入像素格式和大小。
2.使用IOCTL VIDIOC_S_CTRL设置控制信息,用于用于旋转、去交错运动((如果需要)。
3.使用IOCTL VIDIOC_S_CROP设置输出信息。
4.使用IOCTL VIDIOC_REQBUFS请求缓冲区。公共V4L2驱动程序创建一个缓冲区链(尚未分配)。
5.内存将缓冲区映射到其用户空间。
6.执行IOCTL VIDIOC_QUERYBUF以查询缓冲区。
7.将需要后处理的数据传递到缓冲区。
8.使用IOCTL命令VIDIOC_QBUF对缓冲区进行排队。
9.执行IOCTL VIDIOC_DQBUF以使缓冲器出列。
10.通过执行IOCTL VIDIOC_STREAMON启动流。
11.通过执行IOCTL VIDIOC_STREAMOFF停止流。
6.5.4软件操作
6.5.4.1源代码结构
下表列出了与V4L2驱动程序关联的源文件和头文件。
这些文件位于drivers/media/platform/mxc中

V4L2相机的驱动程序可以在diver /media/platform/mxc/capture中找到。
V4L2输出驱动程序可以在Drivers /media/platform/mxc/output中找到
6.5.4.2菜单配置选项
内核配置选项如下所示。

Device Drivers > V4L platform devices > MXC Video For Linux Video Capture
Device Drivers > V4L platform devices > MXC Video For Linux Video Output

以上是关于基于linux5.15.5的IMX 参考手册 --- 13的主要内容,如果未能解决你的问题,请参考以下文章

基于linux5.15.5的IMX 参考手册 ---20

基于linux5.15.5的IMX 参考手册 --- 7

基于linux5.15.5的IMX 参考手册 --- 19

基于linux5.15.5的IMX 参考手册 ---21

基于linux5.15.5的IMX 参考手册 --- 6

基于linux5.15.5的IMX 参考手册 --- 14