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

Posted chocolate2018

tags:

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

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

7.6 PDM麦克风接口(MICFIL)
7.6.1简介
PDM是一种流行的将音频从麦克风传送到处理器的方式,在一些应用中,如移动电话。
然而,当前的数字音频系统使用多位音频信号(也称为多位PCM)来表示信号。为此,通常在DSP或软件上实现一组FIR、CIC或/和半带滤波器。该模块实现所需的数字接口,以可配置的输出采样率从PDM麦克风比特流提供16位音频信号。
7.6.2框图
下图显示了PDM麦克风接口块的高级视图。

7.6.3硬件概述
该模块的实现基于数字信号处理技术在硬件上的应用。PDM麦克风接口的设计以栅极节约和最小功耗为目标。它实现了一组滤波器,将音频带中的1位PDM位流转换为16位PCM信号。
为了避免通带混叠频率,整体滤波器的阻带衰减为80 dB,通带纹波小于0.2dB。
整个模块实现了多通道模式。所有通道都具有相同的配置,但每个输入通道可以独立地打开/关闭。
PDM麦克风接口模块由以下部分组成:
•每对PDM麦克风的输入接口
•按通道抽取滤波器
•通道FIFO
•时间生成单元
•与DMA、中断和SoC共享接口
•一个或多个硬件语音活动检测器(HWVAD)。
抽取滤波器实现了音频波段(默认情况下20Hz-22.5KHz @48KHz输出采样率)的低通滤波器,具有可配置的抽取率。它是使用一个CIC,一个半频带,一个FIR和一个直流消除滤波器的排列来实现的。
时间生成器单元向麦克风生成PDM时钟。该时钟对于所有的PDM麦克风都是相同的,并且对于所有的麦克风都是激活的,即不可能只对一个麦克风关闭PDM时钟。它还为所有的滤波器块生成定时信号和控制。过滤器中的抽取也由这个块控制。它激活每个块和通道,并向FIR FSM和半波段FSM提供启动信号。
最后,每个抽取过滤器的输出都存储在FIFO缓冲区中。每个FIFO都映射到DATACHn寄存器中。如果在所有启用的通道的每个FIFO中,存储的数据数量超过配置的水位,则可以生成中断或DMA请求。
7.6.4软件概述
PDM麦克风驱动程序设计在ALSA片上系统(ASoC)层下。PDM麦克风的ASoC驱动程序提供了一个捕获设备来捕获PDM麦克风的输出。捕获的音频格式是8通道32位宽线性PCM音频数据@ 48kHz或44.1kHz的速率。
7.6.4.1用户界面
通过使用amixer -c 工具从用户空间访问PDM麦克风接口。控件列在下表中。


7.6.4.2源代码结构
下表列出了驱动程序的源文件。

第八章 安全
8.1密码加速与保证模块(CAAM)
8.1.1 CAAM设备驱动程序简介
本节讨论Linux内核中支持CAAM(密码加速和保证模块)的内核驱动程序组件的实现细节。
CAAM的基本驱动程序包可以分为两个不同的级别:
•配置和作业执行级别
•API接口级别
配置和作业执行级别包括:
•一个控制和配置模块,它映射主寄存器页并写入全局或系统所需的配置信息。
•一个模块,通过作业环为作业提供信息,并报告状态。
API接口级别包括:
•与Scrtterlist Crypto API的接口,支持异步单次身份验证加密操作和通用块密码-caamalg。
•散点列表加密API接口,支持异步哈希-caamhash。
•支持使用随机数生成器-caamrng的hwrng API接口。
8.1.2配置和任务执行级别
本节分为两部分:
•控制/配置驱动
•工作环驱动器
8.1.3控制/配置驱动程序
控制和配置驱动程序负责初始化和设置主注册页面,初始化早期的特性初始化,提供有限的调试和监视功能,并通常确保所有其他依赖的驱动程序子系统能够连接到正确配置的设备。
一步一步地,它在启动时执行以下操作:
•为该级别分配一个私有存储块。
•将虚拟地址映射到完整的CAAM注册页面。
•为SNVS注册页面映射虚拟地址。
•为安全内存映射一个虚拟(缓存一致)地址。
•注册安全违规中断。
•为平台选择正确的DMA地址大小,并设置DMA地址掩码以匹配。
•识别其他相关的中断连接。
•初始化所有作业环实例。
•如果系统配置包括一个DPAA队列接口,该接口已经启用了frame-pop。
说明i.MX 6配置中不包含此逻辑。
•如果实例包含TRNG,它的振荡器/熵配置被设置,然后“kickstarted”。
•配置信息被发送到系统控制台,以指示驱动程序是激活的,以及它已经承担了什么配置。
•如果CONFIG_DEBUG_FS在内核配置中被选中,那么将添加条目以使debugfs视图成为性能监视器中有用的寄存器。可以在debugfs根条目的caam/ctl目录下访问寄存器视图。
8.1.4作业环驱动
Job Ring驱动程序负责向高级驱动程序提供作业执行服务。它负责输入和输出环的整体管理,以及驱动输出环的中断服务。

一个驱动程序调用可用于更高的层,用于将作业排队到一个环执行:
int caam_jr_enqueue(struct device *dev, u32 *desc, void (*cbk)(struct device *dev, u32 *desc, u32 status, void *areq), void *areq);
参数:
dev指向与作业环相关联的结构设备的指针。在当前配置中,控制器的私有数据块中存在一个或多个结构设备项,每个环对应一个。
desc指向要执行的CAAM作业描述符的指针。驱动程序将在执行之前映射描述符,并在完成时取消映射它。然而,由于驱动程序无法合理地了解描述符引用的数据,因此调用程序负责在提交之前映射/刷新任何数据,并在请求完成后取消映射/使数据失效。
cbk指向一个回调函数的指针,该函数将在作业完成处理后被调用。
areq指向与此请求关联的元数据或上下文数据的指针。通常,这可以包含被引用的数据映射信息,请求后处理(通过回调)可以用来在完成后清理或释放资源。
回调函数参数:
dev指向与作业环相关联的结构设备的指针。
desc指向提交执行的原始描述符的指针。
status从执行请求的CAAM DECO接收到的完成状态。仅当发生错误时为非零。
描述每个错误的字符串在error.c中枚举。
areq传递给原始请求的元数据/上下文指针。
返回:
•零 成功提交作业
•-EBUSY如果输入环已满
•-EIO,如果驱动程序无法映射作业描述符

8.1.5 API接口级别

CAAM模块通过Scatterlist Crypto API为常见的对称块密码和单通认证加密服务提供连接。此表按通用名称、驱动程序名称和用途列出所有已安装的认证加密算法。注意,某些平台,如i.MX 6,包含低功率的MDHA加速器,它不能支持SHA384或SHA512。

此表按通用名称、驱动程序名称和用途列出所有已安装的对称密钥分组密码算法。

通过API使用这些服务的示例是内核的crypto子系统中的通用一致性/性能测试模块,称为tcrypt,可在内核源代码树crypto/tcrypt.c中看到。
caamhash模块通过Scatterlist Crypto API为常见的异步散列提供了连接。
此表按公共名称、驱动程序名称和用途列出所有已安装的异步散列。注意,某些平台,如i.MX 6,包含低功率的MDHA加速器,它不能支持SHA384或SHA512。

通过API使用这些服务的示例是内核的crypto子系统中的通用一致性/性能测试模块,称为tcrypt,可在内核源代码树crypto/tcrypt.c中看到。
caamrng模块安装了一种机制,使用CAAM的随机数生成器将随机数据提供给一对可以通过/dev/random访问的缓冲区。
/dev/random通常用于提供内核自己的熵池,它可以在内部使用,作为其他随机数据“设备”的熵源。
有关该服务支持的更多信息,请参见sourceforge.net/projects/gkernel/files/rng tools中提供的rng-tools。
8.1.6驱动配置
驱动程序的配置由以下内核配置参数控制(可以在Cryptographic API -> Hardware Crypto Devices下找到):

CRYPTO_DEV_FSL_CAAM
启用构建基本控制器驱动程序和作业环后端。
CRYPTO_DEV_FSL_CAAM_RINGSIZE
选择作业环的大小(例如,条目的最大数量)。它可以在2-9的范围内以2的幂进行选择,允许选择从4到512条目的环深度。
默认选择为9,导致循环深度为512作业项。
CRYPTO_DEV_FSL_CAAM_INTC
允许使用硬件的中断合并功能,这可以减少系统在高利用率期间引起的中断开销。禁用此功能将迫使每个作业完成时出现一个中断,这简化了操作,但增加了开销。
CRYPTO_DEV_FSL_CAAM_INTC_COUNT_THLD
如果启用了合并,则选择在引发中断之前允许排队的作业完成数。这在1到255的范围内是可选择的。选择1有效地削弱了合并特性。任何大于作业环大小的选择都会导致在触发中断之前中断超时的情况。
默认选择是255。

CRYPTO_DEV_FSL_CAAM_INTC_TIME_THLD
如果启用了合并,则在合并超时之前选择总线时钟的计数(除以64),如果未达到计数阈值,则在时间周期结束时引发中断。取值范围为1 ~ 65535之间的整数。
默认选择是2048。
CRYPTO_DEV_FSL_CAAM_CRYPTO_API
启用Scatterlist Crypto API支持异步块密码和通过API使用CAAM硬件进行加速的单次身份验证加密操作。
CRYPTO_DEV_FSL_CAAM_AHASH_API
启用Scatterlist Crypto API支持,通过使用CAAM硬件进行加速的API实现异步散列。
CRYPTO_DEV_FSL_CAAM_RNG_API
启用通过hwrng API使用CAAM随机数生成器。这可以用来生成随机数据,为内核伪随机数生成器提供熵池。
CRYPTO_DEV_FSL_CAAM_RNG_TEST
启用捕获测试,以确保CAAM RNG驱动程序正在运行并缓冲随机数据。

8.1.7局限性
•驱动程序的组件目前不作为模块构建和运行。这可能会在未来的版本中得到纠正。
•控制器和作业环后端之间存在相互依赖性,因此它们必须运行在同一个系统分区中。驱动程序的未来版本可能会将作业环后端分离为一个独立的模块,该模块可以在自己的系统分区中独立运行(并支持独立的API和SM实例)。
•完整的CAAM注册页面由控制器驱动程序映射,并计算所选子系统的派生指针,并传递到更高层的驱动组件。与分区无关的配置必须映射自己的子系统指针。
•该驱动程序的上游变体只支持Power架构。这个Arm架构特定的端口目前还没有上流,尽管某些部分可能会在某个时候上流。
•在未来的版本中,TRNG kickstart可能需要移动到引导加载程序中,这样RNG可以更早地使用。
•Job Ring驱动程序有一个注册和注销功能,这是目前不需要的(可能会在未来的版本中重写,以提供向更高层的关闭通知。)
•完整的CAAM功能与DSM中的Mega/Fast mix off功能独占。如果CAAM是启用的,Mega/Fast mix off特性需要被禁用,并且用户应该"echo enabled > /sys/bus/platform/devices/2100000.aips-bus/ 2100000.caam/2101000.jr0/power/wakeup"在内核启动后,然后Mega/Fast混合将在DSM中保持电源。
8.1.8现有实现概述的局限性
本章描述了一个用于提供对CAAM安全内存访问的Keystore管理接口的原型。
安全存储器提供了一个受控制和访问保护的区域,在该区域中,可以在运行系统中存储和处理关键系统安全参数,而无需暴露总线级别的明确机密。秘密可以导入安全存储器和从安全存储器导出,但不能以明文形式从安全存储器中导出。相反,秘密可以以覆盖的形式从安全内存中导出,使用外部不可见的密钥。
这个驱动程序及其内核级API公开了一个基本接口,以允许内核级服务访问安全内存功能。它被分成两部分:
•Keystore初始化和维护接口
•密钥库访问接口
初始化和维护服务的存在是为了初始化和定义密钥存储接口的实例。同样,访问接口允许内核级服务使用API来管理安全参数。
8.1.9初始化Keystore管理接口
安装一组指向实现到密钥存储子系统的底层物理接口的函数的指针。

在当前版本中,一个默认的(和隐藏的)函数套件实现了这个接口。这个API的未来实现可能会提供一个替代接口的安装。如果出现这种情况,可以提供此调用的替代方法。
void sm_init_keystore(struct device *dev);
参数:
Dev指向为管理安全内存子系统的资源而建立的结构设备。

8.1.10检测可用的安全内存存储单元

返回此驱动程序的本地实例可以访问的可用单元(“页”)的数量。打算用作资源探测。
u32 sm_detect_keystore_units(struct device *dev);
参数:
指向一个为管理安全内存子系统的资源而建立的结构设备。
返回:可使用的检测单元数,从0到n - 1可用于后续调用所有其他API函数。

8.1.11在检测单元中建立Keystore

在检测到的单元中建立一个分配表,可用于存储密钥(或其他秘密)。该单元将被分成一系列固定大小的槽,每一个槽都在分配表中标明可用。每个槽的大小是构建时可选择的参数。
在调用sm_establish_keystore()之前,不会发生对密钥库访问接口的调用。
sm_establish_keystore()应该在调用sm_detect_keystore_units()之后。
int sm_establish_keystore(struct device *dev, u32 unit);
参数:
dev指向一个为管理安全内存子系统的资源而建立的结构设备。
unit通过调用sm_detect_keystore_units()检测到的单元之一。
返回:
•成功返回为零
•-EINVAL如果密钥存储子系统未初始化
•ENOSPC,如果没有内存可用于分配表和相关上下文数据。

8.1.12释放密钥库

释放此密钥存储单元使用的所有资源。不能对密钥库访问接口进行进一步调用。
void sm_release_keystore(struct device *dev, u32 unit);
参数:
dev指向一个为管理安全内存子系统的资源而建立的结构设备。
Unit 通过调用sm_detect_keystore_units()检测到的单元之一。
8.1.13从Keystore中分配槽位
从密钥存储库分配一个插槽,以便由密钥存储库访问接口在所有其他后续操作中使用。
int sm_keystore_slot_alloc(struct device *dev, u32 unit, u32 size, u32*slot);
参数:
dev指向一个为管理安全内存子系统的资源而建立的结构设备。
unit通过调用sm_detect_keystore_units()检测到的单元之一。
size在分配的插槽中存储的数据的期望大小。
slot指向变量的指针,用于接收分配的槽号(一旦已知)。
返回:
•成功完成为零。
•- ekeyreject如果请求的大小超过所选的插槽大小。

8.1.14加载数据到Keystore槽位

将数据加载到已分配的密钥存储槽中,以便在其上执行其他操作(例如封装)。
Int sm_keystore_slot_load(struct device *dev, u32 unit, u32 slot, constu8 *key_data, u32 key_length);

参数:
dev指向一个为管理安全内存子系统的资源而建立的结构设备。
unit通过调用sm_detect_keystore_units()检测到的单元之一。
key_length写入槽位的信息长度(以字节为单位)。
key_data要加载的数据缓冲区的指针。必须是一个连续的缓冲区。
返回:
•成功完成为零。
•-EFBIG如果请求的大小超过了插槽可以容纳的大小。

8.1.15 Demo镜像更新

将写入密钥存储槽的数据封装为安全内存Blob。
int sm_keystore_slot_encapsulate(struct device *dev, u32 unit, u32 inlot, u32 outslot, u16 secretlen, u8 *keymod, u16 keymodlen);
参数:
dev指向一个为管理安全内存子系统的资源而建立的结构设备。
unit通过调用sm_detect_keystore_units()检测到的单元之一。
inslot保存输入秘密的槽位,由sm_keystore_slot_load()加载到该槽位。注意,包含这个秘密的槽应该尽快被覆盖或释放,因为此时它包含明文。
outslot分配的插槽将封装的输出保存为安全内存Blob。
secretlen被封装的秘密的长度,不包括任何blob存储开销(blob key, MAC等)。
keymod用于封装的密钥修饰器组件。密钥修饰符允许在封装过程中使用额外的密钥。解封装也需要同样的修饰剂。
Keymodlen密钥修饰符的长度(以字节为单位)。
返回:
•零成功
•发生故障时的CAAM作业状态

8.1.16解封装密钥库中的数据

将密钥存储库中的数据解封装到黑密钥Blob中,以便在其他加密操作中使用。黑键blob允许一个键被“覆盖”在主内存中使用,而不将其暴露为明文。
int sm_keystore_slot_decapsulate(struct device *dev, u32 unit, u32 inslot, u32 outslot, u16 secretlen, u8 *keymod, u16 keymodlen);
参数:
dev指向一个为管理安全内存子系统的资源而建立的结构设备。
unit通过调用sm_detect_keystore_units()检测到的单元之一。
inslot保存输入数据的槽位,由sm_keystore_slot_encapsulate()的先前调用处理,并包含一个安全内存Blob。
outslot已分配的槽位,以黑键Blob的形式保存解封装的输出数据。
secretlen要解封装的秘密的长度,没有任何blob存储开销。
keymod封装时指定的修改密钥组件。
keymodlen键修饰符的长度(以字节为单位)。
返回:
•零成功
•发生故障时的CAAM作业状态

8.1.17从Keystore槽位读取数据

将数据从密钥存储槽提取回用户缓冲区。通常在一些其他操作(例如,解封装)发生后使用。
int sm_keystore_slot_read(struct device *dev, u32 unit, u32 slot, u32 key_length, u8 *key_data);
参数:
dev指向一个为管理安全内存子系统的资源而建立的结构设备。
unit通过调用sm_detect_keystore_units()检测到的单元之一。
slot用于读取的指定槽位。
key_length从槽位读取的信息长度(以字节为单位)。
key_data用于保存提取数据的缓冲区指针。必须是一个连续的缓冲区。
返回:
•成功完成为零。
•-EFBIG如果请求的大小超过了插槽可以容纳的大小。

8.1.18将槽位释放回密钥库

将密钥存储槽释放回可用池。存储中的信息在释放发生之前被清除。
int sm_keystore_slot_dealloc(struct device *dev, u32 unit, u32 slot);
参数:
dev指向一个为管理安全内存子系统的资源而建立的结构设备。
unit通过调用sm_detect_keystore_units()检测到的单元之一。
slot已分配的需要释放回存储的槽位号。
返回:
•成功完成为零。
•-EINVAL如果指定了未分配的槽位。

安全内存驱动程序/ Keystore API的配置依赖于以下内核配置参数:

CRYPTO_DEV_FSL_CAAM_SM

在内核构建中打开安全内存驱动程序。

CRYPTO_DEV_FSL_CAAM_SM_SLOTSIZE

配置安全内存“插槽”的大小。
每个安全内存单元是一个内部内存块,其大小取决于实现。这个块可以被细分为许多逻辑“槽”,其大小可以根据该值选择。需要将这些槽的大小设置为一个值,该值可以容纳所需的最大秘密大小,再加上blob参数的开销(blob key和MAC,通常不超过48字节)。
这些值可以选择为2的幂,限制在32到512字节的范围内。默认值为7,大小为128字节。

CRYPTO_DEV_FSL_CAAM_SM_TEST

启用捕获测试/示例模块的操作,该模块显示如何使用API,同时验证其功能。测试模块按照以下流程工作:
•创建一些已知的清晰键(3个大小)。
•分配安全内存插槽。
•将这些密钥插入安全内存插槽并封装。
•解将这些按键解封为黑色按键。
•使用黑键加密DES、AES128和AES256明文。因为这使用了对称密码,所以相同密钥的加密/解密结果是等价的。
•用等价的明确密钥解密加密的缓冲区。
•将解密结果与原始密文进行比较。如果它们匹配,测试报告对每个测试的关键用例都是OK的。
控制台的正常输出报告如下:

platform caam_sm.0: caam_sm_test: 8-byte key test match OK platform
caam_sm.0: caam_sm_test: 16-byte key test match OK platform 
caam_sm.0: caam_sm_test: 32-byte key test match OK

•安全内存驱动程序目前还没有作为内核模块实现。
•目前的实现仅限于内核模式操作。
•目前可能有一个实例。将来,当作业环可以在不同的系统分区中独立运行时,应该考虑使用多实例安全内存驱动程序。
•所有的存储请求都被限制在单个槽位的存储大小(这是构建时可配置的长度)。允许一个秘密跨越多个槽是可能的,只要这些槽可以连续地分配。
•槽大小在所有页面/分区上是固定的。
•封装/解封装接口可以指定认证;底层接口不请求它。
封装/解封装接口返回一个作业状态;这个状态应该从errno.h转换为一个有意义的错误
8.1.19 CAAM/SNVS -安全违规处理接口概述
本章描述了SNVS安全违规驱动组件和控制接口的原型。它提供了一种安装、管理和执行应用程序定义的处理程序的方法,这些处理程序用于处理安全违反事件,作为对系统中发生的事件的响应。
SNVS允许对运行系统中许多可能的攻击载体进行持续监视。如果感知到这些附加向量之一的出现(例如,检测到安全违规),则SNVS可以,同时擦除关键安全参数并过渡到故障状态。生成一个中断,指示违规已经发生。这个中断可以调度一个应用程序定义的例程,在违规的情况下执行清理操作,这样就可能发生安全服务的有序关闭。
因此,此接口的目的是允许系统级服务为这些类型的事件安装处理程序。这允许系统设计人员使用针对其系统特定需求编写的简单函数调用来选择如何响应特定的安全违反原因。
8.1.20操作
对于现有平台,SNVS中可能存在6种安全违规中断原因。这些违规原因中有5个通常是连线使用的,这些原因被定义为:
•SECVIO_CAUE_CAAM_VIOLATION-在CAAM/SNVS内部检测到违规
•SECVIO_CAUSE JTAG_ALARM-检测到JTAG活动
•SECVIO_CAUSE_WATCHDOG-看门狗过期
•SECVIO_CAUE_EXTERNAL_BOOT-外部引导加载活动
•SECVIO_CAUE_TAMPER_DETECT-已触发篡改检测逻辑
这些原因中的每一个都可以通过此驱动程序提供的API与应用程序定义的处理程序相关联。如果未指定处理程序,则将调用默认处理程序。此处理程序仅用于识别系统控制台的中断原因。
8.1.21配置界面
以下接口可用于从驱动程序的调度表中定义或删除应用程序定义的冲突处理程序。
8.1.22安装处理器

int caam_secvio_install_handler(struct device *dev, enum secvio_cause cause, void (*handler)(struct device *dev, u32 cause, void *ext), u8 *cause_description, void *ext);
参数:
dev snvs所属设备。
从上面列举的原因列表中找出中断源原因。
应用程序定义的处理程序,与dev、源原因和本地定义的处理程序参数cause_description指向一个字符串,以覆盖默认的原因名称,这可以用作错误消息等的替代方法。如果为NULL,则使用默认的描述字符串。Ext指针指向处理程序所需的任何额外数据。
返回:
•零成功。
•-EINVAL如果参数无效或不可用。

8.1.23移除已安装的驱动程序

int caam_secvio_remove_handler(struct device *dev, enum secvio_cause cause);
参数:
dev snvs所属设备。
cause中断源原因。
返回:
•零成功。
•-EINVAL如果参数无效或不可用。

8.1.24驱动配置CAAM/SNVS
CRYPTO_DEV_FSL_CAAM_SECVIO
启用将Security违例驱动程序和配置接口包含为构建配置的一部分。驱动程序不能以当前形式作为模块构建。
8.2显示内容完整性检查器(DCIC)
8.2.1介绍
DCIC的目标是验证发送到显示器的安全关键信息是否被损坏。
DCIC具有以下特点:
•像素时钟高达148.5 MHz
•可配置的显示接口控制信号的极性
•24位像素数据总线
•多达16个可配置位置和大小的矩形ROI
•每个ROI的独立CRC32签名计算
•外部控制器不匹配指示信号
8.2.2源代码结构

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

Device Drivers -> Graphics support -> MXC DCIC

8.2.4 DTS配置

dcic_id = ; /* DCIC device index 0-dcic1, i-dcic2 */ 
dcic_mux = "dcic-lcdif1"; /* DCIC input select */


8.2.5 ioctl函数
DCIC驱动程序支持以下ioctl:
•DCIC_IOC_CONFIG_DCIC:配置DCIC输入CLK、VSYNC、HSYNC和数据信号极性。
•DCIC_IOC_CONFIG_ROI:配置ROI块大小和引用签名。
•DCIC_IOC_GET_RESULT:获取ROI计算签名的结果。
8.2.6结构

struct roi_params 
 unsigned int roi_n; /* ROI index */
 unsigned int ref_sig; /* Reference CRC32 */
 unsigned int start_y; /* start vertical lines of ROI */
 unsigned int start_x; /* start horizon lines of ROI */
 unsigned int end_y; /* end vertical lines of ROI */
 unsigned int end_x; /* end horizon lines of ROI */
 char freeze; /* state of ROI */
;

8.2.7 DCIC CRC计算函数
在这个单元测试中有四个函数来计算参考签名:

crc32_calc_18of24bit() /* CRC calculate 18 bit of 24 */
crc32_calc_24bit() /* CRC calculate 24 */
crc32_calc_24of16bit() /* CRC calculate 24 bit of 16 */
crc32_calc_18of16bit() /* CRC calculate 18 bit of 16 */

DCIC根据显示总线宽度计算CRC,但是显示总线宽度并不总是与每像素字节(bpp)对齐,上面的四个函数可以涵盖不同的显示总线宽度和bpps。

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

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