OpenHarmony南向设备开发:子系统平台驱动使用-MIPI CSI

往期鸿蒙全套实战精彩文章必看内容:(文中附带鸿蒙全栈学习资料)


功能简介

CSI(Camera Serial Interface)是由MIPI联盟下Camera工作组指定的接口标准。CSI-2是MIPI CSI第二版,主要由应用层、协议层、物理层组成,最大支持4通道数据传输、单线传输速度高达1Gb/s。

物理层支持HS(High Speed)和LP(Low Speed)两种工作模式。HS模式下采用低压差分信号,功耗较大,但数据传输速率可以很高(数据速率为80M~1Gbps);LP模式下采用单端信号,数据速率很低(<10Mbps),但是相应的功耗也很低。两种模式的结合保证了MIPI总线在需要传输大量数据(如图像)时可以高速传输,而在不需要传输大数据量时又能够减少功耗。

图1显示了简化的CSI接口。D-PHY采用1对源同步的差分时钟和1~4对差分数据线来进行数据传输。数据传输采用DDR方式,即在时钟的上下边沿都有数据传输。

图 1 CSI发送、接收接口

MIPI CSI标准分为应用层、协议层与物理层,协议层又细分为像素字节转换层、低级协议层、Lane管理层。

  • 物理层(PHY Layer)

    PHY层指定了传输媒介,在电气层面从串行bit流中捕捉“0”与“1”,同时生成SoT与EoT等信号。

  • 协议层(Protocol Layer)

    协议层由三个子层组成,每个子层有不同的职责。CSI-2协议能够在host侧处理器上用一个单独的接口处理多条数据流。协议层规定了多条数据流该如何标记和交织起来,以便每条数据流能够被正确地恢复出来。

    • 像素字节转换层(Pixel/Byte Packing/Unpacking Layer)

      CSI-2规范支持多种不同像素格式的图像应用。在发送方中,本层在发送数据到Low Level Protocol层之前,将来自应用层的像素封包为字节数据。在接收方中,本层在发送数据到应用层之前,将来自Low Level Protocol层的字节数据解包为像素。8位的像素数据在本层中传输时保持不变。

    • 低级协议层(Low Level Protocol) LLP主要包含了在SoT和EoT事件之间的bit和byte级别的同步方法,以及和下一层传递数据的方法。LLP最小数据粒度是1个字节。LLP也包含了一个字节内的bit值解析,即Endian(大小端里的Endian的意思)的处理。

    • Lane管理层(Lane Management)

      CSI-2的Lane是可扩展的。具体的数据Lane的数量规范并没有给出限制,具体根据应用的带宽需求而定。发送侧分发(distributor功能)来自出口方向数据流的字节到1条或多条Lane上。接收侧则从一条或多条Lane中收集字节并合并(merge功能)到一个数据流上,复原出原始流的字节顺序。对于C-PHY物理层来说,本层专门分发字节对(16 bits)到数据Lane或从数据Lane中收集字节对。基于每Lane的扰码功能是可选特性。

      协议层的数据组织形式是包(packet)。接口的发送侧会增加包头(header)和错误校验(error-checking)信息到即将被LLP发送的数据上。接收侧在LLP将包头剥掉,包头会被接收器中对应的逻辑所解析。错误校验信息可以用来做入口数据的完整性检查。

  • 应用层(Application Layer)

    本层描述了更高层级的应用对于数据中的数据的处理,规范并不涵盖应用层。CSI-2规范只给出了像素值和字节的映射关系。

运作机制

MIPI CSI模块各分层的作用为:接口层提供打开设备、写入数据和关闭设备的接口。核心层主要提供绑定设备、初始化设备以及释放设备的能力。适配层实现其它具体的功能。

说明:
核心层可以调用接口层的函数,核心层通过钩子函数调用适配层函数,从而适配层可以间接的调用接口层函数,但是不可逆转接口层调用适配层函数。

图 2 CSI无服务模式结构图

约束与限制

由于使用无服务模式,MIPI_CSI接口暂不支持用户态使用。

使用指导

场景介绍

MIPI CSI主要用于连接摄像头组件。

接口说明

MIPI CSI模块提供的主要接口如表1所示,具体API详见//drivers/hdf_core/framework/include/platform/mipi_csi_if.h。

表 1 ComboDevAttr结构体介绍

名称 描述
devno 设备号
inputMode 输入模式:MIPI/LVDS/SUBSLVDS/HISPI/DC
dataRate Mipi Rx,SLVS输入速率
imgRect MIPI Rx设备裁剪区域(与原始传感器输入图像大小相对应)
MIPIAttr Mipi设备属性
lvdsAttr LVDS/SubLVDS/HiSPi设备属性

表 2 ExtDataType结构体介绍

名称 描述
devno 设备号
num Sensor号
extDataBitWidth 图片的位深
extDataType 定义YUV和原始数据格式以及位深度

表 3 MIPI CSI API接口功能介绍

接口名 接口描述
DevHandle MipiCsiOpen(uint8_t id) 获取MIPI_CSI控制器操作句柄
void MipiCsiClose(DevHandle handle) 释放MIPI_CSI控制器操作句柄
int32_t MipiCsiSetComboDevAttr(DevHandle handle, ComboDevAttr *pAttr) 设置MIPI,CMOS或者LVDS相机的参数给控制器,参数包括工作模式,图像区域,图像深度,数据速率和物理通道等
<think>好的,我现在需要解决用户提出的关于Rockchip MIPI CSI2设备实体类型未初始化的问题。用户提到异步注册子设备失败,这可能导致实体类型未被正确初始化。首先,我得回忆一下相关的知识,并结合提供的引用内容来分析可能的原因和解决方案。 根据用户提供的引用[1],里面提到了修改fiq-debugger节点的配置,特别是serial-id和UART引脚复用相关的设置。虽然这主要是关于调试器的配置,但可能涉及到系统启动时的外设初始化顺序。如果MIPI CSI2设备依赖某些UART或调试接口的初始化,配置不正确可能导致资源冲突或初始化顺序问题,进而影响子设备的注册。需要检查设备树中相关节点的配置是否正确,尤其是与MIPI CSI2相关的部分,确保没有冲突的引脚复用或资源分配。 引用[3]提到了v4l2_pipeline_pm_use和pipeline_pm_power函数,涉及媒体子设备的电源管理。这可能与子设备的异步注册失败有关。如果电源管理在设备初始化时未能正确供电或释放资源,可能导致子设备无法正确注册。需要检查驱动代码中关于电源管理的部分,确保在初始化过程中正确调用相关函数,特别是在异步注册时是否有适当的电源状态管理。 接下来,考虑Rockchip平台MIPI CSI2驱动的常见问题。实体类型未初始化通常意味着媒体控制器框架未能正确识别或注册该实体。可能的原因包括设备树配置错误、驱动代码中的实体注册失败、依赖的子设备未正确初始化或异步注册时的同步问题。 首先检查设备树中的MIPI CSI2节点是否正确配置,包括兼容性字符串、时钟、电源、数据线等参数。确保所有必要的属性都已设置,并且没有语法错误。例如,检查是否有正确的compatible属性,如"rockchip,rk3399-mipi-csi2",并确认相关时钟和复位信号的配置正确。 其次,驱动代码中需要正确注册媒体实体。在V4L2框架中,媒体实体的初始化通常在probe函数中完成。检查驱动是否调用了media_entity_pads_init等函数来初始化实体,并确保提供了正确的pad配置。如果异步注册子设备失败,可能需要检查子设备(如摄像头传感器)的驱动是否已正确加载,或者是否存在依赖关系导致初始化顺序问题。 异步注册失败可能涉及并发问题,比如子设备在父设备之前初始化,或者资源竞争。可以尝试调整模块加载顺序,或者在设备树中使用defer机制,确保父设备在子设备之前初始化。此外,检查dmesg日志中的错误信息,确认是否有关于资源申请失败、时钟无法获取或中断冲突的具体提示,这有助于定位问题根源。 此外,引用[2]提到的树莓派摄像头使用方法可能提供一些参考,比如摄像头与主控之间的接口配置,但Rockchip平台的具体实现可能有所不同。需要确保MIPI CSI2的物理连接和配置符合硬件规格,例如数据通道数量、时钟频率等是否正确设置。 最后,考虑内核版本和驱动兼容性。某些Rockchip的驱动可能在较新的内核版本中有更新或修复,检查是否有相关的补丁或更新,确保使用的内核版本与驱动兼容。如果问题依然存在,可能需要查阅Rockchip的官方文档或社区支持,寻找类似问题的解决方案。 综合以上分析,解决步骤可能包括检查设备树配置、验证驱动中的媒体实体初始化、调整初始化顺序或模块依赖,以及检查硬件配置和内核版本兼容性。需要逐步排查,从软件配置到硬件连接,确保每个环节都正确无误。</think>要解决Rockchip MIPI CSI2设备实体类型未初始化的问题,可按照以下步骤排查: --- ### **1. 检查设备树配置** - **验证MIPI CSI2节点**:确保设备树中`rockchip-mipi-csi2`节点的`compatible`属性正确,例如: ```dts mipi_csi2: mipi-csi2@ff960000 { compatible = "rockchip,rk3399-mipi-csi2"; reg = <0x0 0xff960000 0x0 0x10000>; clocks = <&cru SCLK_MIPICSI_OUT>; clock-names = "pclk"; resets = <&cru SRST_MIPICSI_P>; reset-names = "rst"; status = "okay"; }; ``` 需确认寄存器地址、时钟、复位信号与芯片手册一致[^1]。 - **排查引脚复用冲突**:若UART或调试接口复用了MIPI CSI2的引脚(如引用[1]中的`fiq-debugger`配置),需关闭冲突的复用功能,或调整引脚分配。 --- ### **2. 驱动初始化流程** - **媒体实体注册**:在驱动代码的`probe`函数中,需调用`media_entity_pads_init()`初始化实体,例如: ```c struct media_entity *entity = &csi2->subdev.entity; int ret = media_entity_pads_init(entity, NUM_PADS, pads); ``` 若未正确初始化,实体类型会显示为`MEDIA_ENT_T_UNKNOWN`。 - **异步注册依赖**:若子设备(如摄像头传感器)未就绪,可能导致异步注册失败。可在设备树中为传感器节点添加`status = "okay"`,或通过`MODULE_SOFTDEP`声明驱动依赖。 --- ### **3. 电源管理配置** - **检查V4L2 Pipeline电源管理**:引用[3]中的`v4l2_pipeline_pm_use()`函数负责电源状态管理。若子设备未正确供电,需在驱动中实现`pm_runtime`回调,确保初始化时电源已开启: ```c pm_runtime_enable(dev); pm_runtime_get_sync(dev); ``` --- ### **4. 调试与日志分析** - **查看内核日志**:通过`dmesg`查找以下关键错误: ```bash mipi-csi2: probe failed, error -110 # 超时(时钟/电源未就绪) media: failed to register entity: -517 # 依赖资源未加载(-EPROBE_DEFER) ``` - **启用调试选项**:编译内核时启用`CONFIG_MEDIA_CONTROLLER_DEBUG`和`CONFIG_VIDEO_ADV_DEBUG`,观察媒体实体注册流程。 --- ### **5. 硬件与兼容性** - **验证硬件连接**:检查MIPI CSI2与摄像头模组的物理连接(时钟线、数据线)。 - **内核版本适配**:某些Rockchip MIPI驱动需内核≥5.10,建议升级到官方推荐版本。 --- ### **相关解决方案** - **强制同步探测**:在设备树中为传感器节点添加`rockchip,camera-module-index = <0>;`,强制同步初始化[^2]。 - **更新V4L2框架补丁**:部分旧版本内核存在媒体控制器注册顺序问题,需应用Rockchip提供的补丁。 --- ### **相关问题** 1. 如何诊断Linux内核中的设备树配置错误? 2. V4L2媒体控制器框架的工作原理是什么? 3. Rockchip平台摄像头调试的常见工具有哪些?
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值