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

Posted chocolate2018

tags:

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

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

6.6视频模数转换器(VADC)
6.6.1介绍
视频模数转换器(VADC)由模拟视频前端(AFE)和数字视频解码器组成。AFE接受来自设备(如模拟相机)的NTSC或PAL输入。
这两个部分在VADC驱动中配置。视频解码器输出yuv444格式的数据。
视频ADC具有以下特点:
•内部电压和电流参考发生器
•10位分辨率(9.5位ENOB在66.5 Msps)
•4个模拟输入,所有输入可用于CVBS
•可编程抗混叠滤波器,增益,夹紧
该视频解码器具有以下特点:
•NTSC / PAL解码器
•直接数据路径(无需复杂重采样)
•自动标准检测
•二维自适应梳状滤波器
•数据路径/时钟架构包含VCR信号的时基校正器
•Luma通带平坦到> 6 MHz
6.6.2软件操作
VADC驱动程序位于Linux V4L2体系结构下,它实现V4L2捕获接口。应用程序不能直接使用相机驱动程序。相反,应用程序使用V4L2捕获驱动程序打开和关闭相机进行图像捕获。
V4L2捕获支持以下操作:
•捕获流模式
支持以下图片格式:
•YUV444
支持以下图片大小:
•PAL
•NTSC
6.6.3源代码结构
下表显示了在drivers/media/platform/mxc/capture中可用的VADC驱动程序源文件。

6.6.4菜单配置选项
在菜单配置中启用以下模块:

Device Drivers > Multimedia devices > Video capture adapters > MXC Video For Linux Camera > MXC VADC support

6.6.5 DTS配置
VADC模拟输入可选择[0-3]。CSI1或CSI2可用于捕获VADC数据。它们可以在DTS文件中配置。
例如:

vadc_in = ; /* VADC input select */ 
csi_id = ; /* CSI select */

选择vin1和CSI2的VADC输入用于捕获VADC数据。
6.7 VPU (Video Processing Unit)
6.7.1介绍
VPU硬件执行所有的编解码计算和大部分的位流解析/包。因此,该软件利用较少的控制和努力实现一个复杂和高效的多媒体编解码器系统。
i.MX 6和i.MX 8 SoC支持不同的vpu。不同的vpu如下表所示。

6.7.2软件操作
VPU软件可以分为两个部分:内核驱动程序和用户空间库以及用户空间应用程序。内核驱动程序负责系统控制和预留资源(内存/IRQ)。它为用户空间中的应用层提供IOCTL接口,作为访问系统资源的路径。用户空间中的应用程序调用相关的ioctl和编解码器库函数来实现复杂的编解码器系统。
VPU内核驱动包含以下功能:
•模块初始化,用设备特定的结构初始化模块
•设备初始化,初始化VPU时钟和硬件,并请求IRQ
•中断服务程序,它支持一帧已经完成的事件
•文件操作例程,为用户空间提供以下接口:
•文件打开
•文件发布
•文件IOCTL为内存分配和释放提供接口
•用于用户空间中寄存器和内存访问的内存映射
VPU用户空间驱动具有以下功能:
•编解码器库
•初始化编解码器系统
•设置编解码系统配置
•通过命令控制编解码系统
•报告编解码器状态和结果
•系统I/O操作
•请求并释放内存
•映射和取消映射内存/寄存器到用户空间
•设备管理
用于简单验证的用户空间应用程序:
•读取视频原始数据
•YUV文件转储
•配置编解码器行为的通用选项
下图显示了H.264示例中的一个简单工作流。


VPU模块只有一个用户空间编程接口。应用层用户无法直接访问内核驱动接口。VPU库为用户访问内核驱动接口。
有一个统一的界面来包装所有不同的视频格式。以下是相关的API:

CODEC_STATE decoder_decode_xxx(CODEC_PROTOTYPE * arg,STREAM_BUFFER * buf, OMX_U32 * consumed,FRAME * frame);
CODEC_STATE decoder_getinfo_xxx(CODEC_PROTOTYPE * arg,STREAM_INFO * pkg);
CODEC_STATE decoder_setppargs_xxx(CODEC_PROTOTYPE * codec,PP_ARGS * args);
CODEC_STATE decoder_setframebuffer_xxx(CODEC_PROTOTYPE * arg, BUFFER *buff,OMX_U32 available_buffers);
CODEC_STATE decoder_pictureconsumed_xxx(CODEC_PROTOTYPE * arg, BUFFER *buff);
CODEC_STATE decoder_getframe_mpeg4(CODEC_PROTOTYPE * arg, FRAME * frame,OMX_BOOL eos);
FRAME_BUFFER_INFO decoder_getframebufferinfo_xxx(CODEC_PROTOTYPE * arg);
CODEC_STATE decoder_endofstream_xxx(CODEC_PROTOTYPE * arg)
OMX_S32 decoder_scanframe_xxx(CODEC_PROTOTYPE * arg, STREAM_BUFFER * buf,OMX_U32 * first, OMX_U32 * last);
CODEC_STATE decoder_abort_xxx(CODEC_PROTOTYPE * arg);
CODEC_STATE decoder_abortafter_xxx(CODEC_PROTOTYPE * arg);
CODEC_STATE decoder_setnoreorder_xxx(CODEC_PROTOTYPE * arg, OMX_BOOL no_reorder);
static void decoder_destroy_xxx(CODEC_PROTOTYPE * arg)

6.7.3源代码结构
下表列出了可用的内核空间源文件drivers/mxc/vpu。

下表列出了i.MX 6中可用的用户空间库源文件
imx-vpu-(version)/vpu目录:

下表列出了以下目录下的固件文件:
firmware-imx-(version)/lib/firmware/vpu/ directory

6.7.4菜单配置选项
在菜单配置中为VPU驱动启用以下模块:

对于带VPU的i.MX 6,请选择Device Drivers > MXC support drivers > Support for MXC VPU (Video Processing Unit)
对于i.MX 8M,选择“Device Drivers > MXC support Drivers > MXC HANTRO (Video Processing Unit) support”
对于i.MX 8QuadMax和i.MX 8QuadXPlus,请选择“Device Drivers > MXC support Drivers > support For MXC VPU (Video Processing Unit) DECODER MXC和VPU (Video Processing Unit) WINDSOR ENCODER support”

6.8 JPEG编码器和解码器
6.8.1介绍
JPEG编码器由JPEG- e - x核心和JPEG编码器包装(JPGENCWRP)组成。类似地,JPEG解码器由一个JPEG解码器核心(JPEG- d - x)及其相应的包装器组成。
JPEG核心符合行业标准基线和扩展ISO/IEC 10918-1 JPEG,在i.MX 8DualXPlus应用程序处理器参考手册(IMX8DQXPRM)中记录了一些限制。
JPEG编码器包装器(JPGENCWRP)用于与Cast JPEG编码器核心一起工作。它有配置模式和编码模式。
•在配置模式下,它可以从系统内存中获取配置位流,并将其提供给编码器。
•在编码模式下,可通过AXI总线接口获取图像像素数据,并馈给Encoder Core进行编码。
类似地,JPEG解码器包装器为Cast JPEG解码器核心提供接口。
JPEG包装器通过编码描述符通过上下文切换支持多种图像编码。有四个比特流槽。每一个都可以通过链式描述符独立启用。
JPEG编码器和解码器支持8K (0x2000)像素的最大水平分辨率。水平分辨率需要是8的整数倍。垂直分辨率也是如此。对于YUV422和YUV420,分辨率必须是16的倍数。
图像大小可达64K x 64K。
6.8.2 JPEG编码器和解码器驱动程序概述
驱动程序依赖于V4L2框架。
JPEG编码器和解码器驱动程序实现了V4L2框架公开的ioctl的一个子集,即以下v4l2_ioctl_ops:

• VIDIOC_QUERYCAP
• VIDIOC_ENUM_FMT_VID_CAP
• VIDIOC_ENUM_FMT_VID_OUT
• VIDIOC_TRY_FMT_VID_CAP
• VIDIOC_TRY_FMT_VID_OUT
• VIDIOC_S_FMT_VID_CAP
• VIDIOC_S_FMT_VID_OUT
• VIDIOC_G_FMT_VID_CAP
• VIDIOC_G_FMT_VID_OUT
• VIDIOC_QBUF
• VIDIOC_DQBUF
• VIDIOC_CREATE_BUFS
• VIDIOC_PREPARE_BUF
• VIDIOC_REQBUFS
• VIDIOC_QUERYBUF
• VIDIOC_STREAMON
• VIDIOC_STREAMOFF

用户应用程序可以通过支持的V4L2 ioctl与驱动程序交互。
JPEG驱动程序通过内存映射支持流I/O。当使用VIDIOC_QUERYCAP时,该功能通过V4L2_CAP_STREAMING标志公开。流是一种I/O方法,其中应用程序和驱动程序之间只交换指向缓冲区的指针,而不复制数据本身。内存映射主要用于将设备内存中的缓冲区映射到应用程序的地址空间。
JPEG驱动程序通过单平面API支持缓冲区内存映射。
有关流I/O的更多信息,请参见流I/O(内存映射)。
6.8.3 JPEG编码器/解码器驱动程序的限制
硬件即JPEG包装器,通过上下文切换支持多图像编码。驱动程序不使用上下文切换,并且只使用了四个可用插槽中的一个。硬件支持半/全比特流缓冲区,并返回位流缓冲区管理特性,但驱动程序不使用它们。
硬件支持的格式有:YUV444、YUV420、YUV422、RGB、ARGB、Gray。
驱动程序支持以下格式:YUV444、YUV420(与NV12相同)、YUV422(与YUYV或YUY2相同)、RGB(有一定限制)、Gray。不支持ARGB格式。
驱动程序支持通过gstreamer进行JPEG图像编码和解码,但它还不支持MJPEG视频。
硬件有译码图像分辨率大于64x64的限制。
硬件有一个限制,即解码后的图像至少应该有一个默认的霍夫曼表(DHT标记部分应该出现在jpeg输入流中)。

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

基于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