6.3显示控制器
6.3.1 DPU (Display Processing Unit)
6.3.1.1介绍
显示处理单元(DPU)旨在支持视频和图形处理功能,并与视频和静态显示传感器和显示器接口。DPU驱动程序提供内部内核级api来操作逻辑通道。一个逻辑通道代表一个完整的DPU处理流程。例如,一个完整的DPU处理流(逻辑通道)可能包括从内存读取YUV缓冲区并将其显示到外部接口。DPU API由一组用于所有通道的通用函数组成。它的功能是初始化通道、设置缓冲区、启用和禁用通道以及设置中断。
典型的逻辑通道包括:
•CSI直接存储
•内存到同步帧缓冲背景
•内存到同步帧缓冲器前台
高级驱动程序负责内存分配和提供用户级API。DPU接口可用于在V4L2框架中捕获和使用DRM显示框架进行显示。DPU接口,具有LVDS、MIPI-DSI、HDMI和并行显示接口。
DPU显示控制器支持32位显示合成引擎,包括:
•2个独立面板上显示输出流。
•两层组合
•使用区域CRC检测器,使用CRC匹配进行自动安全流死机加检测
DPU显示控制器支持2D合成引擎,提供效率、性能和安全。DPU 2D图形引擎的支持减轻了GPU的负担,所以它只支持3D GPU。覆盖本地视频和图形的视频效率使用最小的系统内存访问。强大的效率使得3D引擎对于窗口GUI来说是关闭的,如Android Hardware Composer。
DPU还支持以下认证方式。
•具有8个可叠加区域的CRC检测器,可屏蔽,具有从上到下的独占优先级
•CRC检查可在后处理管道的任何阶段后插入
•CRC故障可产生SW中断,或将帧发生器切换到安全流或恒定平面
DPU显示接口缓存支持以下功能。
•每个显示平面都有一个多行缓存
•每个平面包含8行像素
•支持RGB, YUV等格式
•支持视频和GPU平铺格式
•从内存中获取内容以提前填充缓存
•支持水平和垂直抓取
•不支持经纱抓取,需要绕过
6.3.1.2 DRM
显示处理单元(DPU)与支持视频显示的DRM驱动程序接口。
6.3.1.3源代码结构
DPU驱动分为DRM、bliting和主处理。常用功能在drivers/gpu/drm/imx/dpu 和drivers/gpu/imx/dpu-blit中提供,主驱动程序存在于drivers/gpu/imx/dpu中。下表列出了源文件。
6.3.1.4菜单配置选项
DPU模块提供了以下Linux内核配置选项。
Device Drivers -> i.MX DPU core support
6.3.2图像处理单元(IPU)
6.3.2.1介绍
图像处理单元(IPU)旨在支持视频和图形处理功能,并与视频和静止图像传感器和显示器接口。IPU驱动程序提供了一个内核级API来操作逻辑通道。一个逻辑通道代表一个完整的IPU处理流程。例如,一个完整的IPU处理流(逻辑通道)可能包括从内存中读取YUV缓冲区、执行后处理以及将RGB缓冲区写入内存。一个逻辑通道映射1到3个IDMA通道,映射0或1个IC任务。一个逻辑通道可以有一个输入、一个输出和一个辅助输入IDMA通道。IPU API由一组用于所有通道的通用函数组成。它的功能是初始化通道,设置缓冲区,启用和禁用通道,链接通道自动帧同步,设置中断。
IPU是一个显示控制器,支持通过framebuffer显示框架支持的如下显示接口。访问只能通过framebuffer fbdev应用程序框架公开。
•并行
•LVDS
•HDMI
•MIPI-DSI
典型的逻辑通道包括:
•CSI直接存储
•CSI到取景器预处理到内存
•内存到取景器预处理到内存
•内存到取景器旋转到内存
•内存的前场通道到视频去交错和取景器预处理到内存
•内存的当前场通道到视频去交错和取景器预处理到内存
•内存的下一个场通道到视频去交错和取景器预处理到内存
•CSI编码器预处理到内存
•内存到编码器预处理到内存
•内存到编码器旋转到内存
•内存到后处理旋转到内存
•内存同步帧缓冲背景
内存同步帧缓冲器前台
•内存同步帧缓冲器DC
•内存同步帧缓冲掩码
IPU API有一些额外的功能,这些功能不是所有通道都通用的,而是特定于一个IPU子模块的。各IPU子模块的功能类型如下:
•同步帧缓冲功能
•面板接口初始化
•设置前景位置
•设置本地/全局alpha和颜色键
•设置gamma
•CSI功能
•传感器接口初始化
•设置传感器时钟
•设置捕获大小
•使用PRE/PRG启用或禁用预取线性帧
•使用PRE/PRG启用或禁用分辨率平铺帧
较高级的驱动程序负责内存分配、通道链接和提供用户级API。
6.3.2.2硬件操作
IPU的详细硬件操作在《应用处理器参考手册》中进行了讨论。IPU的硬件组成如下图所示。
6.3.2.3软件操作
IPU驱动程序是Linux内核中一个自包含的驱动程序模块。
它包含一个自定义的内核级API,用于如下代码块:
•同步帧缓冲驱动
•显示接口(DI)
•显示处理器(DP)
•图像DMA控制器(IDMAC)
•CMOS传感器接口(CSI)
•图像转换器(IC)
•预取/解析引擎/垫片(PRE/PRG)
下图显示了不同图形/视频驱动程序与IPU之间的交互。
IPUv1的驱动程序被简单地命名为ipu。IPUv3的驱动程序名称中包含3或v3。IPU驱动程序细分如下:
•设备驱动——包括用于同步帧缓存的帧缓存驱动、用于显示的帧缓存驱动、用于IPU预处理的V4L2捕获驱动、用于IPU后处理的V4L2输出驱动以及为用户空间或V4L2驱动提供系统接口的IPU处理驱动。帧缓冲设备驱动可以在drivers/video/mxc中找到。V4L2设备驱动程序在drivers/media/platform/mxc中可用。
•MXC显示驱动是一个简单的框架来管理IPU和显示设备驱动(如LCD, LVDS, HDMI, MIPI等)之间的交互。
•低级库例程-接口到IPU硬件寄存器。它们从高级设备驱动程序中获取输入,并与IPU硬件进行通信。底层库可以在Linux内核的目录中找到。
6.3.2.4 IPU帧缓冲区驱动简介
帧缓冲设备为图形硬件提供了一个抽象。它表示帧缓冲视频硬件,并允许应用软件通过定义良好的接口访问图形硬件,因此软件不需要知道任何有关底层硬件寄存器的信息。
驱动程序是通过在内核配置中的图形参数下选择帧缓冲区选项来启用的。为了补充帧缓冲驱动程序,内核构建器还可以包括对字体和启动标志的支持。该设备依靠虚拟终端(VT)控制台从串行模式切换到图形模式。通过特殊的设备节点访问设备,位于/dev目录下,如/dev/ fba 。Fb0通常是主要的帧缓冲区。
除了物理内存分配和LCD面板配置外,通用的内核视频API还用于设置颜色、调色板配准、图像点阵和内存映射。IPU从帧缓冲存储器中读取原始像素数据,并将其发送给面板显示。
6.3.2.5 IPU帧缓冲硬件操作
帧缓冲区与IPU硬件驱动模块进行交互。
6.3.2.6 IPU帧缓冲软件操作
帧缓冲设备是一种内存设备,例如/dev/mem,它具有类似于内存设备的特性。用户可以读取它、写入它、查找到其中的某个位置,以及mmap()它(主要用途)。不同的是,出现在特殊文件中的内存不是整个内存,而是一些视频硬件的帧缓冲区。/dev/fb还与几个ioctl交互,允许用户查询和设置关于硬件的信息。颜色映射也是通过ioctl处理的。有关ioctl存在的更多信息以及它们使用的数据结构,请参见include/uapi/linux/fb.h。以下是一些ioctl函数:
•请求硬件的一般信息,如名称,屏幕内存的组织(平面,打包像素等),以及屏幕内存的地址和长度。
•请求和更改硬件的可变信息,如可见和虚拟几何、深度、彩色映射格式、时间等。如果该信息被更改,驱动程序建议值满足硬件功能(如果不可能,硬件返回EINVAL)。
•获取和设置部分颜色地图。通信是每像素16位(值为红色、绿色、蓝色、透明度),以支持所有现有的硬件。驱动程序完成所有的计算,将选项应用到硬件(四舍五入到更少的位,可能丢弃透明度值)。
硬件抽象使得应用程序的实现更加容易和可移植。应用程序中唯一必须构建的东西是屏幕组织(位面或大块像素等),因为它直接处理帧缓冲图像数据。
MXC帧缓冲区驱动程序(drivers/video/mxc/mxc_ipuv3_fb.c)与通用的Linux帧缓冲区驱动程序(drivers/video/fbdev/core/fbmem.c)密切交互。
6.3.2.7同步帧缓冲驱动
同步帧缓冲屏幕驱动程序为同步LCD面板或那些没有内存的面板实现了一个Linux标准的帧缓冲驱动程序API。同步帧缓冲屏幕驱动程序是最高层的内核视频驱动程序,它与内核和用户级应用程序交互。这是通过选择图形支持下的同步面板帧缓冲选项来启用的。
内核配置中的设备驱动程序。为了补充帧缓冲驱动程序,内核构建器还可以包括对字体和启动标志的支持。这依赖于VT控制台从串行模式切换到图形模式。
除了物理内存分配和LCD面板配置外,通用的内核视频API用于设置颜色、调色板配准、图像点阵和内存映射。IPU从帧缓冲存储器中读取原始像素数据,并将其发送给面板显示。
帧缓冲区驱动程序支持不同的面板作为内核配置选项。通过定义面板设置结构的新值,可以添加对新面板的支持。
帧缓冲区使用自定义API与IPU驱动交互,允许:
•面板接口设置初始化
•初始化用于LCD刷新的IPU通道设置
•修改帧缓冲地址以支持双缓冲
支持以下特性:
•可配置屏幕分辨率
•可配置的RGB 16, 24或32位每像素帧缓冲
•可配置面板接口信号时序和极性
•调色板/颜色转换管理
•电源管理
•LCD关机/开机
•启用/禁用PRE/PRG功能
用户应用程序利用通用的视频API(标准的Linux帧缓冲区驱动API)来执行帧缓冲区的功能。其中包括:
•获取屏幕信息,如分辨率或扫描长度
•使用mmap分配用户空间内存,用于执行直接比特操作
第二帧缓冲驱动程序支持第二个视频/图形平面。
6.3.2.8 IPU背光驱动
IPU驱动程序还控制背光。IPU背光驱动器实现了对面板的IPU PWM背光控制。它在/sys/class/backlight/pwm-backlight下导出一个sys控制文件。0/亮度到用户空间。默认背光强度值为128。
6.3.2.9 IPU设备驱动
IPU(处理)设备驱动提供了基于IPUv3中IC/IRT模块的图像处理功能:缩放/旋转/CSC/组合/去交错。
IPU设备驱动程序是基于任务的,用户只需要准备任务设置,等待任务,然后阻塞等待任务完成。驱动程序现在只支持阻塞方法,将来会添加非阻塞方法。任务结构如下:
#define IPU_TASK_ID_PP 2
#define IPU_TASK_ID_MAX 3
u8 task_id;
int timeout;
};
struct ipu_input {
u32 width;
u32 height;
u32 format;
struct ipu_crop crop;
dma_addr_t paddr;
struct ipu_deinterlace deinterlace;
dma_addr_t paddr_n; /*valid when deinterlace enable*/
};
struct ipu_overlay {
u32 width;
u32 height;
u32 format;
struct ipu_crop crop;
struct ipu_alpha alpha;
struct ipu_colorkey colorkey;
dma_addr_t paddr;
};
struct ipu_output {
u32 width;
u32 height;
u32 format;
u8 rotate;
struct ipu_crop crop;
dma_addr_t paddr;
};
要准备任务,用户只需要填写任务。输入任务。叠加(如果需要合并)和任务。输出参数,然后队列任务要么由int ipu_queue_task(struct ipu_task *task);如果来自内核级别(例如V4L2驱动程序),或者如果来自应用程序级别,则通过/dev/mxc_ipu下的IPU_QUEUE_TASK ioctl。。
6.3.2.10源代码结构
以下文件夹中提供了与IPU、Sensor、V4L2和Panel驱动程序关联的源文件。
• drivers/mxc/ipu3
• drivers/video/mxc
• drivers/video/fbdev/mxc
• drivers/video/backlight
有关IPU V4L2驱动程序文件的更多信息,请参阅“V4L2”一章
表59列出了与IPU和Panel驱动相关的头文件。
6.3.2.11菜单配置选项
IPU模块提供了以下Linux内核配置选项。
在菜单配置中启用以下模块:
•CONFIG_MXC_IPU_V3 -包括对图像处理单元的支持。在menuconfig中,这个选项在下面可用:
Device Drivers > MXC support drivers > Image Processing Unit Driver
默认情况下,该选项对所有体系结构都是Y。
如果ARCH_MXC为true,则将设置CONFIG_MXC_IPU_V3。
•CONFIG_MXC_IPU_V3_PRG -该功能支持IPUv3预取垫片引擎,以支持IPUv3和预取引擎(PRE)之间的双缓冲握手控制,监视显示刷新请求到内存的AXI接口,并修改请求地址来获取OCRAM中的双缓冲块行。
Device Drivers > MXC support drivers > i.MX IPUv3预取垫片引擎
该选项依赖于“CONFIG_MXC_IPU_V3”和“CONFIG_MXC_IPU_V3_PRE”。
•CONFIG_MXC_IPU_V3_PRE -启用对IPUv3预取引擎的支持,以提高系统内存性能。该引擎具有将平铺像素格式的帧缓冲区解析为线性的能力。
Device Drivers > MXC support drivers > i.MX IPUv3 prefetch engine
该选项取决于CONFIG_MXC_IPU_V3。启用此选项将选择CONFIG_MXC_IPU_V3_PRG。
• CONFIG_MXC_CAMERA_OV5640_MIPI - OV5640 mipi传感器驱动和用例驱动的选项。该选项依赖于VIDEO_MXC_CAPTURE选项。在menuconfig中,这个选项在下面可用:
Device Drivers > Multimedia support > V4L platform devices > MXC Video For Linux Video Capture > MXC Camera/V4L2
• CONFIG_MXC_CAMERA_OV5640 - OV5640传感器驱动和用例驱动的选项。该选项依赖于VIDEO_MXC_CAPTURE选项。在menuconfig中,这个选项在下面可用:
Device Drivers > Multimedia platform > V4L platform devices > MXC Video For Linux Video Capture > MXC Camera/V4L2 PRP Features support > OmniVision ov5640 camera support同一时间只能安装一个传感器。
• CONFIG_MXC_IPU_PRP_VF_SDC - IPU选项(这里>符号说明了HW块之间的数据流方向):
CSI > IC > MEM MEM > IC (PRP VF) > MEM
哑传感器的用例驱动程序或
CSI > IC(PRP VF) > MEM
智能传感器。在menuconfig中,这个选项在下面可用:
Multimedia devices > Video capture adapters > MXC Video For Linux Camera > MXC Camera/V4L2 PRP Features support > Pre-Processor VF SDC library
默认情况下,该选项为M。
• CONFIG_MXC_IPU_PRP_ENC - IPU的选项:
哑传感器用例驱动程序
CSI > IC > MEM MEM > IC (PRP ENC) > MEM
或者是智能传感器
CSI > IC(PRP ENC) > MEM.
在menuconfig中,这个选项在下面可用:
Device Drivers > Multimedia Devices > Video capture adapters > MXC Video For Linux Camera > MXC Camera/V4L2 PRP Features support > Pre-processor Encoder library
默认情况下,该选项全部设置为M。
• CONFIG_VIDEO_MXC_CAMERA -这是V4L2捕获驱动程序的配置选项。该选项依赖于以下表达式:
VIDEO_DEV && MXC_IPU && MXC_IPU_PRP_VF_SDC && MXC_IPU_PRP_ENC
在menuconfig中,这个选项在下面可用:
Device Drivers > Multimedia devices > Video capture adapters > MXC Video For Linux Camera
默认情况下,该选项为M。
• CONFIG_VIDEO_MXC_OUTPUT -这是V4L2输出驱动程序的配置选项。该选项依赖于VIDEO_DEV && MXC_IPU选项。在menuconfig中,这个选项在下面可用:
Device Drivers > Multimedia devices > Video capture adapters > MXC Video for Linux Video Output
默认情况下,该选项为Y。
• CONFIG_FB -这是在Linux内核中包含帧缓冲支持的配置选项。在menuconfig,此选项如下:
Device Drivers > Graphics support > Support for frame buffer devices
默认情况下,该选项对所有体系结构都是Y。
•CONFIG_FB_MXC -这是MXC帧缓冲驱动的配置选项。该选项依赖于CONFIG_FB选项。在menuconfig中,这个选项在下面可用:
Device Drivers > Graphics support > MXC Framebuffer support
默认情况下,该选项对所有体系结构都是Y。
•CONFIG_FB_MXC_SYNC_PANEL -这是选择同步面板帧缓冲区的配置选项。该选项依赖于CONFIG_FB_MXC选项。在menuconfig中,这个选项在下面可用:
Device Drivers > Graphics support > MXC Framebuffer support > Synchronous Panel Framebuffer
默认情况下,该选项对所有体系结构都是Y。
•CONFIG_FB_MXC_LDB -该配置选项选择i.m mx 6芯片上的LVDS模块。该选项依赖于CONFIG_FB_MXC_SYNC_PANEL和CONFIG_MXC_IPUV3 || FB_MXS选项。在menuconfig中,这个选项在下面可用:
Device Drivers > Graphics support > MXC Framebuffer support > Synchronous Panel Framebuffer > MXC LDB
•CONFIG_FB_MXC_SII9022 -该配置选项选择SII9022 HDMI芯片。该选项依赖于CONFIG_FB_MXC_SYNC_PANEL选项。在menuconfig中,这个选项在下面可用:
Device Drivers > Graphics support > MXC Framebuffer support > Synchronous Panel Framebuffer > Si Image SII9022 DVI/HDMI Interface Chip
6.3.3像素管道(PxP)
6.3.3.1介绍
PxP是与EPDC显示接口配合使用的显示控制器。Pixel Pipeline (PxP) DMA引擎驱动程序提供了一个独特的API,它被实现为一个dmaengine客户端,可以平滑不同硬件卸载引擎实现的细节。通常,PxP DMA-ENGINE驱动程序的用户包括EPDC驱动程序、V4L2输出驱动程序和PxP用户空间库。
PxP驱动程序使用PxP寄存器与硬件交互。详细的硬件操作请参见与SoC相关的《应用程序处理器参考手册》。
6.3.3.2软件操作
有不同版本的PxP IP。为了简化在i.MX 7Dual上使用的新版本PxP的维护,它有主要用于EPDC的新功能,如硬件碰撞检测、硬件中的E Ink Gen-II波形算法(REAGL/-D)处理和硬件抖动支持,有不同的驱动程序(drivers/dma/ PxP /pxp_dma_v3.c)。但是,每个版本都使用DMA引擎框架。
6.3.3.3关键数据结构
PxP DMA引擎驱动程序的实现取决于DMA引擎框架。DMA引擎框架中有三个重要的结构,由PxP驱动程序扩展:struct DMA_device、struct dm a_chan和struct d ma_async_tx_descriptor。PxP驱动程序实现了几个回调函数,当DMA从机(客户端)与DMA引擎交互时,DMA引擎框架(或DMA从站)会调用这些回调函数。
PxP驱动程序在结构体dma_device中实现以下回调函数:
device_alloc_chan_resources /* allocate resources and descriptors */
device_free_chan_resources /* release DMA channel's resources */
device_tx_status /* poll for transaction completion */
device_issue_pending /* push pending transactions to hardware */
and,
device_prep_slave_sg /* prepares a slave DMA operation */
device_terminate_all/* manipulate all pending operations on a channel, returns zero or error code *
前四个函数由DMA引擎框架使用,后两个由DMA从(DMA客户机)使用。值得注意的是,device_issue_pending用于触发PxP操作的开始。
PxP DMA驱动程序还在结构dma_async_tx_descriptor中实现接口tx_submit,该接口用于准备将由引擎执行的描述符。当在pxp_tx_submit中接收到任务时,它们不会被立即配置和执行。相反,它们被添加到任务队列中,并且允许函数调用立即返回。
6.3.3.4通道管理
虽然ePxP硬件中没有多个通道,但驱动程序中支持虚拟通道。这在多实例/客户端设计中提供了灵活性。在任何时候,用户都可以调用dma_request_channel()来获得一个空闲通道,然后用几个描述符配置这个通道。每个输入平面和输出平面都需要一个描述符。当PxP不再使用时,则应该通过调用dma_release_channel()来释放通道。通道管理的详细元素由驱动程序处理,并且对客户机是透明的。
6.3.3.5描述符管理
DMA Engine基于描述符处理任务。一个DMA通道通常与多个描述符相关联。
描述符是回收的资源,在卸载引擎驱动程序的控制下,在操作完成时被重用。扩展的TX描述符包(pxp_tx_desc)允许用户将PxP配置信息传递给驱动程序。这包括PxP执行处理任务所需的所有内容。
6.3.3.6完成通知
应用程序有两种方式接收PxP操作已完成的通知。
•调用dma_wait_for_async_tx()。这个调用导致CPU在轮询操作完成时旋转。
•指定一个完成回调。
建议采用后一种方法。在PxP操作完成后,可以检索PxP输出缓冲区数据。
有关DMA引擎框架的一般信息,请参阅Linux内核源代码树中的documentation /dmaengine.txt。
6.3.3.7局限性
驱动程序目前不支持传统使用的散列对象。驱动程序目前使用scatterlist参数对象来为一次传输提供输入和输出缓冲区(如果需要的话,还会使用覆盖缓冲区),而不是使用scatterlist参数对象来提供内存源和目标链。
•PxP驱动程序可能无法正确执行快速排队的一系列传输。建议等待每次传输完成后再提交新的传输。
6.3.3.8菜单配置选项
该模块提供了以下Linux内核配置选项:
For i.MX 7Dual select Device Drivers > DMA Engine support > [*] MXC PxP V3 support > [*] MXC PxP Client Device
For i.MX 6 select Device Drivers > DMA Engine support > [*] MXC PxP V2 support > [*] MXC PxP Client Device