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

Posted chocolate2018

tags:

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

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

6.4.5 EPDC(电泳显示控制器接口)
6.4.5.1介绍
电泳显示控制器(EPDC)是一种直接驱动有源矩阵EPD控制器,设计用于驱动支持多种TFT背板的E Ink EPD面板。EPDC帧缓冲驱动程序充当标准的Linux帧缓冲设备。该驱动程序支持一组自定义API扩展,可从用户空间(通过IOCTL)或另一个内核模块(通过直接函数调用),以便向用户提供对EPD特定功能的访问。EPDC驱动程序从任何特定的E Ink®面板类型中抽象出来,提供了与一系列E Ink面板类型和规格一起工作的灵活性。
EPDC驱动支持以下特性:
•EPDC驱动作为可加载或内置模块。
•RGB565, RGB24, RGB32和Y8帧缓冲格式。
•全面和部分EPD屏幕更新。
•多达256个面板特定波形模式。
•为给定的更新自动优化波形选择。
•通过等待特定的更新请求完成进行同步。
•从备用(覆盖)缓冲区的屏幕更新。
•自动碰撞处理。
•64个同步更新区域。
像素反转在Y8帧缓冲格式。
•90,180,270度hw加速帧缓冲旋转。
•平移(仅y方向)。
•通过Linux fb_deferred_io机制自动更新全屏幕和部分屏幕。
•三种EPDC驱动程序显示更新方案:快照、队列、队列和合并。
•通过一次性指定的API调用或每次更新设置环境温度。
•用户控制完成所有更新和关闭EPDC之间的延迟。
6.4.5.2 EPDC帧缓冲驱动简介
帧缓冲装置提供图形硬件的抽象。它表示帧缓冲视频硬件,并允许应用软件通过定义良好的接口访问图形硬件,从软件中抽象出如何管理底层硬件寄存器。EPDC驱动程序支持这个模型,但有一个关键的注意事项:帧缓冲区的内容不会自动更新到E Ink显示。相反,需要一个自定义API函数调用来触发对E Ink显示的更新。这个过程的细节在EPDC帧缓冲驱动扩展中有解释。
帧缓冲驱动程序是通过在内核配置中的图形参数下选择帧缓冲选项启用的。
为了补充帧缓冲区驱动程序,内核构建器可能还包括对字体和启动标志的支持。帧缓冲设备依赖虚拟终端(VT)控制台从串行模式切换到图形模式。通过位于/dev目录下的特殊设备节点访问设备,如/dev/fb*。fb0通常是主帧缓冲区。
帧缓冲设备是一种内存设备,如/dev/mem,具有与内存设备类似的功能。用户可以读它、写它、查找它中的某个位置和mmap()它(主要用途)。不同的是,出现在特殊文件中的内存不是整个内存,而是一些视频硬件的帧缓冲区。
EPDC帧缓冲驱动程序(i.m mx 6DualLite上的drivers/video/fbdev/mxc/mxc_epdc_fb.c或i.m mx 7Dual上的generation-II EPDC上的drivers/video/fbdev/mxc/mxc_epdc_v2_fb.c)与通用的Linux帧缓冲驱动程序(drivers/video/fbmem.c)密切交互。
有关帧缓冲设备的更多详细信息,请参阅Linux内核文档/fb/framebuffer.txt。
6.4.5.3 EPDC帧缓冲驱动扩展
E Ink显示技术与EPDC相结合,有几个特点使其有别于标准的基于lcd的帧缓冲设备。这些差异引入了对帧缓冲接口进行API扩展的需求。EPDC异步刷新E Ink显示,并支持部分屏幕更新。因此,EPDC要求用户通知帧缓冲区内容已被修改,哪些区域需要更新。EPDC更新E Ink显示器的另一个独特特征是屏幕更新延迟很长(在300-980毫秒之间),这就需要一种机制来允许用户等待给定的屏幕更新完成。
帧缓冲设备的自定义API扩展既可以从用户空间应用程序访问,也可以从内核空间访问。标准设备IOCTL接口提供了对用户空间应用程序的自定义API的访问。IOCTL扩展以及相关的数据结构和定义可以在include/linux/mxcfb_epdc.h中找到这些IOCTL可以在编程接口部分软件操作中找到。
对于对自定义API扩展的内核模式访问,应该绕过IOCTL接口,以便直接访问底层函数。
6.4.5.4 EPDC面板配置
EPDC驱动程序设计用于灵活支持具有各种面板分辨率、定时参数和波形模式的E Ink面板。EPDC驱动程序通过使用EPDC面板模式结构imx_epdc_fb_mode保持面板不可知,该结构可以在include/linux/mxcfb_epdc.h中找到。

struct imx_epdc_fb_mode 
struct fb_videomode *vmode;
int vscan_holdoff;
int sdoed_width;
int sdoed_delay;
int sdoez_width;
int sdoez_delay;
int gdclk_hp_offs;
int gdsp_offs;
int gdoe_offs;
int gdclk_offs;
int num_ce;
;

imx_epdc_fb_mode结构由fb_videomode结构引用和一组EPD定时参数组成。fb_videomode结构定义面板分辨率和基本定时参数(像素时钟频率、hsync和vsync余量),imx_epdc_fb_mode中的附加定时参数定义epd特定的时序参数,例如源极和栅极驱动器时序。关于如何配置E Ink面板定时参数,请参见《i.m. mx 6DualLite Applications Processor Reference Manual (IMX6DLRM)》或《i.m. mx 7Dual Applications Processor Reference Manual (IMX7DRM)》中的EPDC编程模型章节。
除了EPDC面板模式数据外,还可以将函数传递给EPDC驱动,以定义在启用或禁用EPDC驱动时如何处理EPDC引脚。为了节省电力,这些功能应该禁用EPDC引脚。
6.4.5.5启动命令行参数说明
EPDC驱动程序的附加配置是通过引导命令行参数提供的。命令行选项的格式为
epdc video=mxcepdcfb:[panel_name],bpp=16
EPDC驱动程序解析这些选项并尝试将panel_name与imx_epdc_fb_mode面板模式结构中指定的视频模式名称相匹配。如果没有找到匹配,则EPDC驱动程序使用平台数据中提供的第一个面板模式。该命令行中的bpp设置为帧缓冲区设置初始的每像素位。设置为32或24时选择RGB888像素格式,设置为16时选择RGB565像素格式,设置为8时选择8位灰度(Y8)格式。
6.4.5.6 EPDC波形加载
EPDC驱动需要波形文件才能正常工作。此波形文件包含生成驱动E Ink面板更新的波形所需的波形信息。在执行第一次更新之前,将波形文件数据的指针编程到EPDC中。
选择波形文件有两个选项:

  1. 选择此BSP版本中包含的一个默认波形文件。
  2. 使用特定于正在使用的E Ink面板的新波形文件。
    波形文件由EPDC驱动通过Linux固件接口加载。
    6.4.5.7使用默认波形文件
    使用E Ink面板和EPDC驱动程序开始使用的最快、最简单的方法是使用Linux BSP中提供的默认波形文件之一。这应该能够更新到几个不同类型的E Ink面板,而不需要面板特定的波形文件。缺点是不应该期望最佳的质量。通常,使用非面板特定的波形文件面板会导致更多的重影伪影和整体较差的颜色质量。
    BSP中包含的以下默认波形文件位于/lib/firmware/imx/epdc中:
    •epdc_E60_V110.fw - 6.0英寸V110 E Ink面板的默认波形。
    •epdc_E60_V220.fw - 6.0英寸V220 E Ink面板的默认波形(支持动画模式更新)。
    •epdc_E97_V110.fw - 9.7英寸V110 E Ink面板的默认波形。
    •epdc_E060SCM.fw - 6.0 英寸Pearl E Ink面板的默认波形(支持动画模式更新)。
    •epdc_ED060XH2C1.fw - 6.0英寸E Ink面板的默认波形(默认不支持Reagl/ d)。关于Reagl/ d支持,请联系NXP支持。)
    EPDC驱动程序尝试加载名为“epdc_[panel_name]”的波形文件。其中,panel_name为“fb_videomode name”字段中指定的字符串。这个panel_name信息应该通过上一章中描述的内核命令行参数提供给EPDC驱动程序。例如,加载epdc_E060SCM。fw默认的Pearl面板固件文件,设置EPDC内核命令行参数如下:
video=mxcepdcfb:E060SCM,bpp=16

6.4.5.8使用自定义波形文件
为确保最佳的E Ink显示质量,使用特定的E Ink面板波形文件。原始波形文件类型(.wbf)需要转换为EPDC可以理解和读取的格式。该转换脚本不包括在BSP中。因此,请联系NXP获取此转换脚本。
在原始波形文件上运行波形转换脚本之后,应该重命名转换后的波形文件,以便EPDC驱动程序能够找到它并加载它。驱动程序将搜索一个名为“epdc_[panel_name].fw”的波形文件。
在rootfs的/lib/firmware/imx/epdc目录下,panel_name指的是fb_videomode name字段中指定的字符串。例如,如果面板命名为“E60_ABCD”,那么转换的波形文件应该命名为epdc_E60_ABCD.fw。
6.4.5.9 EPDC面板初始化
在加载framebuffer驱动程序模块时,framebuffer驱动程序通常不会执行任何硬件初始化步骤(有关例外情况,请参阅下面的说明)。相反,必须进行后续的用户模式调用,请求驱动程序为特定的EPD面板初始化自身。要初始化EPDC硬件和E Ink面板,必须调用FBIOPUT_VSCREENINFO ioctl,使用fb_var_screeninfo参数的xres和yres字段来匹配支持的E Ink面板类型的X和Y分辨率。
为了保证EPDC驱动能够收到初始化请求,fb_var_screeninfo参数的activate字段应该设置为FB_ACTIVATE_FORCE。
6.4.5.10灰度帧缓冲区选择
EPDC framebuffer驱动程序支持对framebuffer使用8位灰度(Y8)和8位倒置灰度(Y8倒置)像素格式(除了更常见的RGB565像素格式)。为了将framebuffer格式配置为8位灰度,应用程序将调用FBIOPUT_VSCREENINFO framebuffer ioctl。这个ioctl接受fb_var_screeninfo指针作为参数。此参数指定framebuffer的属性,并允许应用程序请求更改framebuffer格式。fb_var_screeninfo参数有两个关键成员,必须设置它们才能请求更改为8位灰度格式:bits_per_pixel和grayscale。bits_per_pixel必须设置为8,灰度必须设置为两个有效的灰度格式值之一:GRAYSCALE_8BIT或grayscale_8bit_倒置。
下面的代码片段演示了更改framebuffer以使用Y8像素格式的请求:

fb_screen_info screen_info;
screen_info.bits_per_pixel = 8;
screen_info.grayscale = GRAYSCALE_8BIT;
retval = ioctl(fd_fb0, FBIOPUT_VSCREENINFO, &screen_info);

6.4.5.11软件操作
EPDC帧缓冲区可以从用户空间和内核空间访问。一组函数描述了EPDC帧缓冲区驱动扩展。有两种模式可以使用IOCTL接口访问用户空间和直接使用函数访问内核空间。接下来将描述每个IOCTL和函数组合。
MXCFB_SET_WAVEFORM_MODES / mxc_epdc_fb_set_waveform_modes ()
描述:
定义通用波形模式的映射。
参数:
mxcfb_waveform_modes *modes
指向包含普通波形模式的波形模式值的结构的指针。为了自动波形模式选择能够正常工作,必须配置这些值。
MXCFB_SET_TEMPERATURE / mxc_epdc_fb_set_temperature
描述:
设置EPDC驱动程序在后续面板更新中使用的温度。
参数:
int32_t temperature
温度值,以摄氏度为单位。注意,在使用MXCFB_SEND_UPDATE ioctl时,可以通过将温度值参数设置为TEMP_USE_AMBIENT以外的任何参数来覆盖此温度设置。
MXCFB_SET_AUTO_UPDATE_MODE / mxc_epdc_fb_set_auto_update
描述:
选择自动和区域更新模式。
参数:
__u32 mode
在区域更新模式下,更新必须通过MXCFB_SEND_UPDATE IOCTL提交。
在自动模式下,驱动程序通过检测帧缓冲内存区域中被修改的页面自动生成更新。
MXCFB_SET_UPDATE_SCHEME / mxc_epdc_fb_set_upd_scheme
描述:
选择指定驱动程序内更新流程的方案。
参数:
__u32 mode
选择下列更新方案:
UPDATE_SCHEME_SNAPSHOT—在Snapshot更新方案中,立即处理framebuffer的内容并将其存储在驱动程序内部的内存缓冲区中。当对MXCFB_SEND_UPDATE的调用完成时,framebuffer区域是空闲的,可以在不影响上次更新完整性的情况下进行修改。如果更新帧提交由于其他未决更新而延迟,当更新最终提交到EPDC硬件时,将显示原始的缓冲区内容。
如果更新导致冲突,则在冲突清除后将重新提交原始的更新内容。
UPDATE_SCHEME_QUEUE—队列更新方案使用一个工作队列来异步处理所有更新的处理和提交。当通过MXCFB_SEND_UPDATE提交更新时,更新被添加到队列中,然后在EPDC硬件资源可用时按顺序处理。因此,处理和更新的帧缓冲区内容不能保证反映更新发送到驱动程序时帧缓冲区中的内容。
UPDATE_SCHEME_QUEUE_AND_MERGE—队列和合并方案使用队列方案中的队列概念,但添加了合并步骤。这意味着,在工作队列中处理更新之前,首先将其与其他挂起的更新进行比较。如果任何更新与当前更新的模式和标志匹配,并且与当前更新中的更新区域重叠,则该更新将与当前更新合并。尝试合并所有挂起的更新后,将处理并提交最终合并的更新。
MXCFB_SEND_UPDATE / mxc_epdc_fb_send_update
描述:
请求帧缓冲区的一个区域更新到显示。
参数:
mxcfb_update_data * upd_data
指向一个结构的指针,该结构为当前更新定义了帧缓冲区、波形模式和碰撞模式的区域。该结构还包括一个flags字段,可以从以下更新选项中选择:
EPDC_FLAG_ENABLE_INVERSION—启用更新区域中所有像素的反转。
EPDC_FLAG_FORCE_MONOCHROME -启用更新区域中所有像素的完全黑白分隔。
EPDC_FLAG_USE_ALT_BUFFER—启用从备用(非framebuffer)内存缓冲区更新。
如果启用,最后的upd_data参数包含备用内存缓冲区的详细配置信息。
MXCFB_WAIT_FOR_UPDATE_COMPLETE / mxc_epdc_fb_wait_update_complete
描述:
阻塞并等待上一个更新请求完成。
参数:
mxfb_update_marker_data marker_data
用于标识特定更新的update_marker值(在MXCFB_SEND_UPDATE IOCTL调用中作为参数传递)
应该在此重用以等待更新完成。如果更新是碰撞测试更新,则collision_test变量将返回指示是否发生碰撞的结果。
MXCFB_SET_PWRDOWN_DELAY / mxc_epdc_fb_set_pwrdown_delay
描述:
设置驱动完成所有更新和驱动应该关闭EPDC和E Ink显示电源之间的延迟。
参数:
int32_t delay
输入延迟值,单位为毫秒。要完全禁用EPDC下电,请使用FB_POWERDOWN_DISABLE(定义如下)。
MXCFB_GET_PWRDOWN_DELAY / mxc_epdc_fb_get_pwrdown_delay
描述:
检索驱动程序当前的断电延迟值。
参数:
int32_t delay
输出延迟值,单位为毫秒。
6.4.5.12结构和定义

#define GRAYSCALE_8BIT 0x1
#define GRAYSCALE_8BIT_INVERTED 0x2
#define AUTO_UPDATE_MODE_REGION_MODE 0
#define AUTO_UPDATE_MODE_AUTOMATIC_MODE 1
#define UPDATE_SCHEME_SNAPSHOT 0
#define UPDATE_SCHEME_QUEUE 1
#define UPDATE_SCHEME_QUEUE_AND_MERGE 2
#define UPDATE_MODE_PARTIAL 0x0
#define UPDATE_MODE_FULL 0x1
#define WAVEFORM_MODE_AUTO 257
#define TEMP_USE_AMBIENT 0x1000
#define EPDC_FLAG_ENABLE_INVERSION 0x01
#define EPDC_FLAG_FORCE_MONOCHROME 0x02
#define EPDC_FLAG_USE_ALT_BUFFER 0x100
#define EPDC_FLAG_TEST_COLLISION 0x200
#define FB_POWERDOWN_DISABLE -1
struct mxcfb_rect 
__u32 left; /* Starting X coordinate for update region */
__u32 top; /* Starting Y coordinate for update region */
__u32 width; /* Width of update region */
__u32 height; /* Height of update region */
;
struct mxcfb_waveform_modes 
int mode_init; /* INIT waveform mode */
int mode_du; /* DU waveform mode */
int mode_gc4; /* GC4 waveform mode */
int mode_gc8; /* GC8 waveform mode */
int mode_gc16; /* GC16 waveform mode */
int mode_gc32; /* GC32 waveform mode */
;
struct mxcfb_alt_buffer_data 
__u32 phys_addr; /* physical address of alternate image buffer */
__u32 width; /* width of entire buffer */
__u32 height; /* height of entire buffer */
struct mxcfb_rect alt_update_region; /* region within buffer to update */
;
struct mxcfb_update_data 
struct mxcfb_rect update_region; /* Rectangular update region bounds */
__u32 waveform_mode; /* Waveform mode for update */
__u32 update_mode; /* Update mode selection (partial/full) */
__u32 update_marker; /* Marker used when waiting for completion */
int temp; /* Temperature in Celsius */
uint flags; /* Select options for the current update */
struct mxcfb_alt_buffer_data alt_buffer_data; /* Alternate buffer data */
;
struct mxcfb_update_marker_data  __u32 update_marker; __u32 collision_test; ;

6.4.5.13源代码结构
下表列出了与EPDC驱动程序关联的源文件和用于编程访问的头文件。


6.4.5.14菜单配置选项
EPDC模块提供以下Linux内核配置选项:
• CONFIG_FB_MXC_EINK_PANEL -支持电泳显示控制器。在menuconfig中,选择Device Drivers > Graphics Support > E-Ink Panel Framebuffer
• CONFIG_FB_MXC_EINK_V2_PANEL -支持v2电泳显示控制器。在menuconfig中,此选项Device Drivers > Graphics support > E-Ink Panel Framebuffer based on EPDC V2
•CONFIG_FB -包括帧缓冲支持,默认启用。在menuconfig中选择Device Drivers > Graphics support >buffer devices
•CONFIG_MXC_PXP_V2 -支持PxP, EPDC驱动程序需要处理(颜色空间转换,旋转,自动波形选择)帧缓冲区更新区域。在菜单中选择Device Drivers > DMA Engine support > MXC PxP support
•CONFIG_MXC_PXP_V3 -支持下一级PxP,二代EPDC驱动程序需要它来处理帧缓冲区更新区域。在菜单中选择设备Device Drivers > DMA Engine support > MXC PxP V3 support
6.4.6 HDMI (hd Multimedia Interface)和DP (Display Port)概述
6.4.6.1介绍
高清多媒体接口(HDMI)和显示端口(DP)提供高清视频。HDMI模块在一些i.MX芯片上支持,包括片内解决方案或外部解决方案。显示端口DP提供了一个嵌入式显示端口(eDP)发射器,包括HDMI传输(TX)控制器和PHY。
以下是遵从性版本。
•HDMI 1.4和2.0
•DVI 1.0
•DP 1.3
•eDP 1.4
•HDCP 1.4/2.2
每个SoC HDMI解决方案在单独的章节中介绍。i.MX上的显示端口使用相同的IP块,但有不同的规格。
下表列出了支持HDMI和显示端口的SOC及其支持版本。


HDMI音频数据源来自S/PDIF TX。
6.4.6.2软件操作
HDMI驱动程序根据其两个主要用途分为子组件:向HDMI接收器提供视频和音频。
视频显示驱动组件和音频驱动组件需要一个额外的核心驱动组件来管理通用的HDMI资源,包括HDMI寄存器、时钟和IRQ。
6.4.6.3核心
片上HDMI i.MX解决方案支持一个核心驱动程序,该驱动程序管理必须在HDMI音频和视频驱动程序之间共享的资源。HDMI音频和视频驱动程序依赖于HDMI核心驱动程序,并且在音频和视频之前应该总是加载和初始化HDMI核心驱动程序。核心驱动具有以下功能:
•映射HDMI寄存器区域,并提供读写HDMI寄存器的api。
•执行一次性初始化关键HDMI寄存器。
•初始化HDMI IRQ,并提供启用和禁用IRQ的共享api。
•提供一种在音频和视频驱动程序之间共享信息的方法(例如,HDMI像素时钟)。
•当空白/非空白,插入/插入事件发生时,提供HDMI视频和HDMI音频之间的同步方法。HDMI线处于拔插状态或HDMI处于空白状态时,HDMI音频无法启动。每次HDMI音频开始播放时,HDMI音频驱动程序应该将其PCM注册到核心驱动程序,并在播放结束时注销PCM。一旦HDMI视频空白或线缆插拔事件发生,核心驱动将暂停HDMI音频DMA控制器,如果其PCM已注册。当HDMI未插卡或线缆插入事件发生时,核心驱动首先检查线缆是否处于插卡状态,视频状态是否为非空白状态,PCM是否注册。如果上面列出的项目都是yes,核心驱动程序将重启HDMI音频DMA。
6.4.6.4显示设备注册和初始化
在操作系统引导流程中,通过MXC display driver系统将HDMI显示设备连接到i.MX Frame Buffer驱动程序,软件活动的顺序如下:

  1. 在HDMI视频驱动初始化过程中,调用mxc_disdrv_register()将HDMI模块注册为显示设备,并将mxc_hdmi_disp_init()函数设置为显示设备的init回调。
  2. 当i.MX帧缓冲区驱动程序初始化时,调用mxc_disdrv_init()。这将导致对所有注册的显示设备的init调用。
    3.执行mxc_hdmi_disp_init()回调函数。HDMI驱动从i.MX帧缓冲驱动接收一个包含帧缓冲信息(fbi)的结构。HDMI驱动程序注册自己来接收FB驱动程序事件的通知。最后,HDMI驱动通过配置HDMI接收热插拔中断来完成初始化。
    6.4.6.5热插拔处理及视频模式切换
    一旦i.MX帧缓冲驱动程序和HDMI之间的连接通过MXC显示驱动程序接口建立起来,HDMI视频驱动程序就会等待热插拔中断,这表明一个有效的HDMI接收器设备已经连接,并准备好接收HDMI视频数据。HDMI和i.MX帧缓冲驱动程序之间的后续通信是通过Linux帧缓冲api进行的。下面的列表展示了识别HDMI接收器设备并配置ELCDIF FB驱动程序以驱动视频输出的软件流程:
  3. HDMI视频驱动程序接收热插拔中断并从HDMI接收器设备读取EDID,从检索到的EDID信息构造一个视频模式列表。使用来自Linux内核命令行的视频模式字符串(用于初始连接)或最新的视频模式(用于以后的HDMI线缆连接),HDMI驱动程序从模式列表中选择最接近的视频模式。
  4. HDMI视频驱动程序调用fb_set_var()来更改i.MX帧缓冲区驱动程序中的视频模式。i.MX帧缓冲区驱动程序为新模式完成它的重新配置。
    3.作为调用fb_set_var()的结果,帧缓冲区通知被发送回HDMI驱动程序,表明发生了FB_EVENT_MODE_CHANGE。HDMI驱动程序为新的视频模式配置HDMI硬件。
  5. 最后,HDMI模块能够向HDMI接收器设备生成输出。
    i.MX帧缓冲驱动程序将与特定于每个SoC的显示界面对齐,如每个SoC HDMI章节所述。
    6.4.6.6音频
    由于HDMI Tx音频驱动程序使用ALSA SoC框架,它被分解成几个文件,如每个HDMI章节的源代码结构部分所列。大部分代码都在平台DMA驱动程序(sound/soc/imx/imx-hdmi- DMA .c)和编解码器驱动程序(sound/soc/codecs/mxc_hdmi.c)中。机器驱动程序(sound/soc/imx/imx-hdmi.c)分配soc音频设备并将所有soc组件链接到一起。DAI驱动程序(sound/soc/imx/imx-hdmi- DAI .c)是soc的要求。它主要用于获取平台数据。
    HDMI CODEC驱动程序完成了HDMI音频采样器的大部分初始化工作。注意,HDMI Tx块只实现AHB DMA音频,而不实现其他音频接口(SSI, S/PDIF等)。HDMI CODEC驱动程序的另一个主要功能是建立一个需要进入音频流的IEC头信息结构。由于该结构连接到ALSA层,因此可以使用’ iecset '实用程序在用户空间中访问IEC设置。
    平台DMA驱动程序处理HDMI Tx块DMA引擎。注意,HDMI音频使用HDMI块DMA和SDMA。SDMA用于实现多缓冲区机制。由于HDMI Tx块不会自动将IEC音频头信息合并到音频流中,因此平台DMA驱动程序使用HDMI_DMA_copy()进行合并(没有内存映射使用)或hdmi_dma_map_copy()(用于内存映射模式使用)函数,然后将缓冲区发送出去。注意,由于IEC音频头添加操作,用户空间应用程序可能无法获得足够的CPU周期来及时将数据送入HDMI音频驱动程序,特别是当系统负载很高时。在这种情况下,会听到一些火花噪音。
    在不同的音频框架(ALSA LIB或PULSE audio)中,可能会打印关于此噪声的不同日志。例如,在ALSA LIB中,像“underrung!!”至少* ms is lost”被打印出来。
    HDMI音频播放依赖于HDMI像素时钟。因此,在HDMI空白和拔线状态下,HDMI音频要么停止,要么无法播放。参见software_operation_core中的详细信息。
    注意,因为HDMI音频驱动程序需要添加IEC头,所以驱动程序需要知道已经写入HDMI音频驱动程序的数据量。如果应用程序不能破译写入的数据量,例如ALSA LIB中的DMIX插件,HDMI音频驱动程序就不能正常工作。不会有任何声音。
    HDMI音频支持以下功能:
    •回放采样率
  • 32k, 44.1k, 48k, 88.2k, 96k, 176.4 4k, 192k
  • HDMI接收器能力
    •播放通道:
  • 2,4,6,8
  • HDMI接收器能力
    •播放音频格式:
    ——SNDRV_PCM_FMTBIT_S16_LE
    6.4.6.7 i.MX 8显示端口
    6.4.6.7.1介绍
    高清多媒体接口(HDMI)驱动程序支持i.MX 8QuadMax和iMX 8MQuad上的片上Cadence HDTX IP模块,提供使用单根电缆传输未压缩视频、音频和数据的能力。HDMI驱动分为三个子组件:与DPU/DCSS DRM驱动集成的视频显示设备驱动、与ALSA/SoC子系统集成的音频驱动和管理HDMI驱动共享软硬件资源的核心API驱动。
    HDTX IP支持以下特性:
    •符合HDMI 2.0规范。
    •支持高达600 Mhz像素CLK。
    •支持所有视频格式,包括双真空,立体声,和所有色度选项(RGB, YCbCr444/422,和YCbCr420)。
    •支持这些音频格式:PCM, HBR, DST,单位音频,多流和3D音频。
    •支持所有信息帧。
    •APB接口用于控制和读取状态信息。
    •嵌入式cpu执行所有协议特定的任务,简化SoC集成:
    —HDCP 1.4/2.2
    -音频返回通道(ARC)
    HD Display TX Controller支持一种或多种协议,如HDMI、DisplayPort或eDP。每个协议都需要不同的固件二进制文件。下图描述了这一点。

    HD Display控制器集成了一个运行嵌入式固件(FW)的CPP (uCPU)。固件管理HD Display链路并提供侧带通道通信。固件不涉及数据路径(视频、音频或信息帧)。
    主机处理器通过apb接口与HD Display控制器连接。主机处理器以以下一种或多种方法管理HD显示控制器:
    •为调试目的直接访问HW寄存器。
    •直接访问I-MEM和D-MEM(在引导期间)用于FW下载。
    •在操作模式下直接访问指定HW模块的HW寄存器(不受FW控制的模块)。
    •在操作模式下间接访问指定HW模块的HW寄存器,通过命令接口与FW通信(使用GENERAL_WRITE_REGISTER和GENERAL_READ_REGISTER命令)。
    •通过命令接口,通过邮箱与不同的FW模块通信。
    6.4.6.7.2软件操作
    HDMI驱动程序根据其两个主要用途分为子组件:提供HDP DRM驱动程序和Core API驱动程序。
    HDP DRM驱动需要配置HDMI FW的Core API驱动组件。
    6.4.6.7.3源代码结构
    HDMI驱动程序有三个软件组件:MHDP DRM桥和核心API驱动程序、MHDP i.m mx 8平台驱动程序和HDMI音频驱动程序。

    6.4.6.7.4菜单配置选项
    有三个主要的Linux内核配置选项,用于在Linux OS映像中选择和包含HDMI驱动程序功能。
    CONFIG_DRM_CDNS_MHDP选项提供了对MHDP DRM桥和核心API驱动程序的支持,可以在menuconfig中的以下菜单位置进行选择:
    Device Drivers > Graphics support >Display Interface Bridges > Cadence MHDP COMMON API driver
    CONFIG_DRM_IMX_CDNS_MHDP选项提供了对i.m mx 8 HDMI/DP视频驱动程序的支持,可以在以下菜单位置的menuconfig中选择:
Device Drivers > Graphics support > NXP i.MX MX8 DRM HDMI/DP

CONFIG_SND_SOC_IMX_CDNHDMI选项通过ALSA/SoC子系统提供了对HDMI音频的支持,可以在以下位置的menuconfig中找到:

Device Drivers > Sound card support > Advanced Linux Sound Architecture > ALSA for SoC audio support > SoC Audio support for CDN - HDMI

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

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