OpenHarmony(鸿蒙南向)——平台驱动指南【MIPI CSI】

往期知识点记录:

  • 鸿蒙(HarmonyOS)应用层开发(北向)知识点汇总
  • 鸿蒙(OpenHarmony)南向开发保姆级知识点汇总~
  • 持续更新中……

概述

功能简介

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
dataRateMipi Rx,SLVS输入速率
imgRectMIPI Rx设备裁剪区域(与原始传感器输入图像大小相对应)
MIPIAttrMipi设备属性
lvdsAttrLVDS/SubLVDS/HiSPi设备属性

表 2 ExtDataType结构体介绍

名称描述
devno设备号
numSensor号
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相机的参数给控制器,参数包括工作模式,图像区域,图像深度,数据速率和物理通道等
int32_t MipiCsiSetExtDataType(DevHandle handle, ExtDataType *dataType)设置YUV和RAW数据格式和位深(可选)
int32_t MipiCsiSetHsMode(DevHandle handle, LaneDivideMode laneDivideMode)设置MIPI RX的Lane分布。根据硬件连接的形式选择具体的mode
int32_t MipiCsiSetPhyCmvmode(DevHandle handle, uint8_t devno, PhyCmvMode cmvMode)设置共模电压模式
int32_t MipiCsiResetSensor(DevHandle handle, uint8_t snsResetSource)复位Sensor
int32_t MipiCsiUnresetSensor(DevHandle handle, uint8_t snsResetSource)撤销复位Sensor
int32_t MipiCsiResetRx(DevHandle handle, uint8_t comboDev)复位MIPI RX。不同的s32WorkingViNum有不同的enSnsType
int32_t MipiCsiUnresetRx(DevHandle handle, uint8_t comboDev)撤销复位MIPI RX
int32_t MipiCsiEnableClock(DevHandle handle, uint8_t comboDev)使能MIPI的时钟。根据上层函数电泳传递的enSnsType参数决定是用MIPI还是LVDS
int32_t MipiCsiDisableClock(DevHandle handle, uint8_t comboDev)关闭MIPI设备的时钟
int32_t MipiCsiEnableSensorClock(DevHandle handle, uint8_t snsClkSource)使能MIPI上的Sensor时钟
int32_t MipiCsiDisableSensorClock(DevHandle handle, uint8_t snsClkSource)关闭Sensor的时钟

开发步骤

使用流程

使用MIPI CSI的一般流程如图3所示。

图 3 MIPI CSI使用流程图

获取MIPI CSI控制器操作句柄

在进行MIPI CSI进行通信前,首先要调用MipiCsiOpen获取控制器操作句柄,该函数会返回指定通道ID的控制器操作句柄。

DevHandle MipiCsiOpen(uint8_t id);

表 4 MipiCsiOpen的参数和返回值描述

参数参数描述
iduint8_t类型,MIPI CSI通道ID
返回值返回值描述
NULL获取失败
设备句柄获取到指令通道的控制器操作句柄,类型为DevHandle

假设系统中的MIPI CSI通道为0,获取该通道控制器操作句柄的示例如下:

DevHandle MipiCsiHandle = NULL;  // 设备句柄
id = 0;                          // MIPI CSI通道ID// 获取控制器操作句柄 
MipiCsiHandle = MipiCsiOpen(id);
if (MipiCsiHandle == NULL) {HDF_LOGE("MipiCsiOpen: mipi csi open fail.\n");return NULL;
}
进行MIPI CSI相应配置
  • 写入MIPI CSI配置
    int32_t MipiCsiSetComboDevAttr(DevHandle handle, ComboDevAttr *pAttr);

表 5 MipiCsiSetComboDevAttr的参数和返回值描述

参数参数描述
handleDevHandle类型,控制器操作句柄
pAttr结构体指针,MIPI CSI相应配置
返回值返回值描述
HDF_SUCCESS设置成功
负数设置失败
    int32_t ret;struct ComboDevAttr attr;// 当前配置如下 (void)memset_s(&attr, sizeof(ComboDevAttr), 0, sizeof(ComboDevAttr));attr.devno = 0;                    // 设备0 attr.inputMode = INPUT_MODE_MIPI;  // 输入模式为MIPI attr.dataRate = MIPI_DATA_RATE_X1; // 每时钟输出1像素 attr.imgRect.x = 0;                // 0: 图像传感器左上位置 attr.imgRect.y = 0;                // 0: 图像传感器右上位置 attr.imgRect.width = 2592;         // 2592: 图像传感器宽度大小 attr.imgRect.height = 1944;        // 1944: 图像传感器高度尺寸 // 写入配置数据 ret = MipiCsiSetComboDevAttr(MipiCsiHandle, &attr);if (ret != HDF_SUCCESS) {HDF_LOGE("MipiCsiSetComboDevAttr: mipi csi set combo dev attr fail, ret=%d\n", ret);return ret;}
  • 设置YUV和RAW数据格式和位深
    int32_t MipiCsiSetExtDataType(DevHandle handle, ExtDataType* dataType);

表 6 MipiCsiSetExtDataType的参数和返回值描述

参数参数描述
handleDevHandle类型,控制器操作句柄
dataType结构体指针,定义YUV和原始数据格式以及位深度
返回值返回值描述
HDF_SUCCESS设置成功
负数设置失败
    int32_t ret;struct ExtDataType dataType;// 配置YUV和RAW数据格式和位深参数 dataType.devno = 0;               // 设备0 dataType.num = 0;                 // Sensor 0 dataType.extDataBitWidth[0] = 12; // 位深数组元素0 dataType.extDataBitWidth[1] = 12; // 位深数组元素1 dataType.extDataBitWidth[2] = 12; // 位深数组元素2 dataType.extDataType[0] = 0x39;   // 定义YUV和原始数据格式以及位深度元素0 dataType.extDataType[1] = 0x39;   // 定义YUV和原始数据格式以及位深度元素1 dataType.extDataType[2] = 0x39;   // 定义YUV和原始数据格式以及位深度元素2 // 设置YUV和RAW数据格式和位深 ret = MipiCsiSetExtDataType(MipiCsiHandle, &dataType);if (ret != HDF_SUCCESS) {HDF_LOGE("MipiCsiSetExtDataType: mipi csi set ext data type fail, ret=%d\n", ret);return ret;}
  • 设置MIPI RX的Lane分布
    int32_t MipiCsiSetHsMode(DevHandle handle, LaneDivideMode laneDivideMode);
<textarea id="copy1723385635370" style="color: inherit; font: inherit; position: absolute; top: -9999px; left: -9999px; z-index: -9999;"></textarea>

表 7 MipiCsiSetHsMode的参数和返回值描述

参数参数描述
handleDevHandle类型,控制器操作句柄
laneDivideMode结构体类型,Lane模式参数
返回值返回值描述
HDF_SUCCESS设置成功
负数设置失败
    int32_t ret;enum LaneDivideMode mode;// Lane模式参数为0 mode = LANE_DIVIDE_MODE_0;// 设置MIPI RX的 Lane分布 ret = MipiCsiSetHsMode(MipiCsiHandle, mode);if (ret != HDF_SUCCESS) {HDF_LOGE("MipiCsiSetHsMode: mipi csi set hs mode fail, ret=%d\n", ret);return ret;}
  • 设置共模电压模式
    int32_t MipiCsiSetPhyCmvmode(DevHandle handle, uint8_t devno, PhyCmvMode cmvMode);

表 8 MipiCsiSetPhyCmvmode的参数和返回值描述

参数参数描述
handleDevHandle类型,控制器操作句柄
cmvMode结构体类型,共模电压模式参数
devnouint8_t类型,设备编号
返回值返回值描述
HDF_SUCCESS设置成功
负数设置失败
    int32_t ret;enum PhyCmvMode mode;uint8_t devno;// 共模电压模式参数为0 mode = PHY_CMV_GE1200MV;// 设备编号为0 devno = 0;// 设置共模电压模式 ret = MipiCsiSetPhyCmvmode(MipiCsiHandle, devno, mode);if (ret != HDF_SUCCESS) {HDF_LOGE("MipiCsiSetPhyCmvmode: mipi csi set phy cmv mode fail, ret=%d\n", ret);return ret;}
复位/撤销复位Sensor
  • 复位Sensor
    int32_t MipiCsiResetSensor(DevHandle handle, uint8_t snsResetSource);

表 9 MipiCsiResetSensor的参数和返回值描述

  • 表 9 MipiCsiResetSensor的参数和返回值描述
参数参数描述
handleDevHandle类型,控制器操作句柄
snsResetSourceuint8_t类型,传感器的复位信号线号,在软件中称为传感器的复位源
返回值返回值描述
HDF_SUCCESS复位成功
负数复位失败
    int32_t ret;uint8_t snsResetSource;// 传感器复位信号线号为0 snsResetSource = 0;// 复位Sensor ret = MipiCsiResetSensor(MipiCsiHandle, snsResetSource);if (ret != HDF_SUCCESS) {HDF_LOGE("MipiCsiResetSensor: mipi csi reset sensor fail, ret=%d\n", ret);return ret;}
  • 撤销复位Sensor
    int32_t MipiCsiUnresetSensor(DevHandle handle, uint8_t snsResetSource);

表 10 MipiCsiUnresetSensor的参数和返回值描述

参数参数描述
handleDevHandle类型,控制器操作句柄
snsResetSourceuint8_t类型,传感器的复位信号线号,在软件中称为传感器的复位源
返回值返回值描述
HDF_SUCCESS撤销复位成功
负数撤销复位失败
    int32_t ret;uint8_t snsResetSource;// 传感器撤销复位信号线号为0 snsResetSource = 0;// 撤销复位Sensor ret = MipiCsiUnresetSensor(MipiCsiHandle, snsResetSource);if (ret != HDF_SUCCESS) {HDF_LOGE("MipiCsiUnresetSensor: mipi csi unreset sensor fail, ret=%d\n", ret);return ret;}
复位/撤销复位MIPI RX
  • 复位MIPI RX
    int32_t MipiCsiResetRx(DevHandle handle, uint8_t comboDev);

表 11 MipiCsiResetRx的参数和返回值描述

参数参数描述
handleDevHandle类型,控制器操作句柄
comboDevuint8_t类型,MIPI RX或LVDS通路序号
返回值返回值描述
HDF_SUCCESS复位成功
负数复位失败
    int32_t ret;uint8_t comboDev;// 通路序号为0 comboDev = 0;// 复位MIPI RX ret = MipiCsiResetRx(MipiCsiHandle, comboDev);if (ret != HDF_SUCCESS) {HDF_LOGE("MipiCsiResetRx: mipi csi reset rx fail, ret=%d\n", ret);return ret;}
  • 撤销复位MIPI RX
    int32_t MipiCsiUnresetRx(DevHandle handle, uint8_t comboDev);

表 12 MipiCsiUnresetRx的参数和返回值描述

参数参数描述
handleDevHandle类型,控制器操作句柄
comboDevuint8_t类型,MIPI RX或LVDS通路序号
返回值返回值描述
HDF_SUCCESS撤销复位成功
负数撤销复位失败
    int32_t ret;uint8_t comboDev;// 通路序号为0 comboDev = 0;// 撤销复位MIPI RX ret = MipiCsiUnresetRx(MipiCsiHandle, comboDev);if (ret != HDF_SUCCESS) {HDF_LOGE("MipiCsiUnresetRx: mipi csi unreset rx fail, ret=%d\n", ret);return ret;}
使能/关闭MIPI的时钟
  • 使能MIPI的时钟
    int32_t MipiCsiEnableClock(DevHandle handle, uint8_t comboDev);

表 13 MipiCsiEnableClock的参数和返回值描述

参数参数描述
handleDevHandle类型,控制器操作句柄
comboDevuint8_t类型,通路序号
返回值返回值描述
HDF_SUCCESS使能成功
负数使能失败
    int32_t ret;uint8_t comboDev;// 通路序号为0 comboDev = 0;// 使能MIPI的时钟 ret = MipiCsiEnableClock(MipiCsiHandle, comboDev);if (ret != HDF_SUCCESS) {HDF_LOGE("MipiCsiEnableClock: mipi csi enable clock fail, ret=%d\n", ret);return ret;}
  • 关闭MIPI的时钟
    int32_t MipiCsiDisableClock(DevHandle handle, uint8_t comboDev);

表 14 MipiCsiDisableClock的参数和返回值描述

参数参数描述
handleDevHandle类型,控制器操作句柄
comboDevuint8_t类型,通路序号
返回值返回值描述
HDF_SUCCESS关闭成功
负数关闭失败
    int32_t ret;uint8_t comboDev;// 通路序号为0 comboDev = 0;// 关闭MIPI的时钟 ret = MipiCsiDisableClock(MipiCsiHandle, comboDev);if (ret != HDF_SUCCESS) {HDF_LOGE("MipiCsiDisableClock: mipi csi disable clock fail, ret=%d\n", ret);return ret;}
使能/关闭MIPI上的Sensor时钟
  • 使能MIPI上的Sensor时钟
    int32_t MipiCsiEnableSensorClock(DevHandle handle, uint8_t snsClkSource);

表 15 MipiCsiEnableSensorClock的参数和返回值描述

参数参数描述
handleDevHandle类型,控制器操作句柄
snsClkSourceuint8_t类型,传感器的时钟信号线号,在软件中称为传感器的时钟源
返回值返回值描述
HDF_SUCCESS使能成功
负数使能失败
    int32_t ret;uint8_t snsClkSource;// 传感器的时钟信号线号为0 snsClkSource = 0;// 使能MIPI上的Sensor时钟 ret = MipiCsiEnableSensorClock(MipiCsiHandle, snsClkSource);if (ret != HDF_SUCCESS) {HDF_LOGE("MipiCsiEnableSensorClock: mipi csi enable sensor clock fail, ret=%d\n", ret);return ret;}
  • 关闭MIPI上的Sensor时钟
    int32_t MipiCsiDisableSensorClock(DevHandle handle, uint8_t snsClkSource);

表 16 MipiCsiDisableSensorClock的参数和返回值描述

参数参数描述
handleDevHandle类型,控制器操作句柄
snsClkSourceuint8_t类型,传感器的时钟信号线号,在软件中称为传感器的时钟源
返回值返回值描述
HDF_SUCCESS关闭成功
负数关闭失败
    int32_t ret;uint8_t snsClkSource;// 传感器的时钟信号线号为0 snsClkSource = 0;// 关闭MIPI上的Sensor时钟 ret = MipiCsiDisableSensorClock(MipiCsiHandle, snsClkSource);if (ret != HDF_SUCCESS) {HDF_LOGE("MipiCsiDisableSensorClock: mipi csi disable sensor clock fail, ret=%d\n", ret);return ret;}
释放MIPI CSI控制器操作句柄

MIPI CSI使用完成之后,需要释放控制器操作句柄,释放句柄的函数如下所示:

void MipiCsiClose(DevHandle handle);

该函数会释放掉由MipiCsiOpen申请的资源。

表 17 MipiCsiClose的参数和返回值描述

参数参数描述
handleDevHandle类型,MIPI CSI控制器操作句柄
MipiCsiClose(MIPIHandle); // 释放掉MIPI CSI控制器操作句柄 

使用实例

本例拟对Hi3516DV300开发板上MIPI CSI设备进行操作。

MIPI CSI完整的使用示例如下所示:

#include "hdf_log.h"
#include "mipi_csi_if.h"
#include "securec.h"enum InterfaceType {INTERFACE_MIPI = 0,INTERFACE_LVDS,INTERFACE_CMOS,INTERFACE_BUTT
};static void InitMipiDevAttr(MipiDevAttr *mipiAttr)
{MipiDevAttr attr;if (mipiAttr == NULL) {return;}HDF_LOGI("InitMipiDevAttr: enter.");(void)memset_s(&attr, sizeof(MipiDevAttr), 0, sizeof(MipiDevAttr));attr.inputDataType = DATA_TYPE_RAW_12BIT;attr.wdrMode = HI_MIPI_WDR_MODE_NONE;// laneId: -1 - disableattr.laneId[0] = 0;          // 0 -- laneId 0 attr.laneId[1] = 1;          // 1 -- laneId 1 attr.laneId[2] = 2;          // 2 -- laneId 2 attr.laneId[3] = 3;          // 3 -- laneId 3 // Used by the HI_MIPI_WDR_MODE_DT, This is not fully tested!if (attr.wdrMode == HI_MIPI_WDR_MODE_DT) {attr.dataType[0] = 0x39; // 0x39 -- data type reserved attr.dataType[1] = 0x39; // 0x39 -- data type reserved attr.dataType[2] = 0x39; // 0x39 -- data type reserved attr.dataType[3] = 0x39; // 0x39 -- data type reserved }*mipiAttr = attr;
}static int MipiGetIntputModeType(InputMode inputMode)
{switch (inputMode) {case INPUT_MODE_SUBLVDS:case INPUT_MODE_LVDS:case INPUT_MODE_HISPI:return INTERFACE_LVDS;case INPUT_MODE_MIPI:return INTERFACE_MIPI;case INPUT_MODE_CMOS:case INPUT_MODE_BT1120:case INPUT_MODE_BT656:case INPUT_MODE_BYPASS:return INTERFACE_CMOS;default:break;}return INTERFACE_BUTT;
}static void InitLvdsDevAttr(LvdsDevAttr *lvdsAttr)
{int i;int j;int k;LvdsDevAttr attr;if (lvdsAttr == NULL) {return;}(void)memset_s(&attr, sizeof(LvdsDevAttr), 0, sizeof(LvdsDevAttr));attr.inputDataType = DATA_TYPE_RAW_12BIT;attr.wdrMode = HI_WDR_MODE_NONE;// LVDS synchronization mode. LVDS_SYNC_MODE_SOF, LVDS_SYNC_MODE_SAVattr.syncMode = LVDS_SYNC_MODE_SOF;// LVDS Vsync type. LVDS_VSYNC_NORMAL, LVDS_VSYNC_SHARE, LVDS_VSYNC_HCONNECTattr.vsyncAttr.syncType = LVDS_VSYNC_NORMAL;// hconnect vsync blanking len, valid when the syncType is LVDS_VSYNC_HCONNECT// This is not fully tested!if (attr.vsyncAttr.syncType == LVDS_VSYNC_HCONNECT) {attr.vsyncAttr.hblank1 = 0;attr.vsyncAttr.hblank2 = 0;}// frame identification code: LVDS_FID_NONE, LVDS_FID_IN_SAV, LVDS_FID_IN_DATAattr.fidAttr.fidType = LVDS_FID_NONE;// Sony DOL has the Frame Information Line, in DOL H-Connection mode, should// configure this flag as false to disable output the Frame Information Line.// This is not fully tested!attr.fidAttr.outputFil = 'm';// LVDS bit size end mode: LVDS_ENDIAN_LITTLE, LVDS_ENDIAN_BIGattr.dataEndian = LVDS_ENDIAN_LITTLE;// sync code endian: little/big, LVDS_ENDIAN_LITTLE, LVDS_ENDIAN_BIGattr.syncCodeEndian = LVDS_ENDIAN_LITTLE;// laneId: -1 - disableattr.laneId[0] = 0; // 0 -- laneId 0 attr.laneId[1] = 1; // 1 -- laneId 1 attr.laneId[2] = 2; // 2 -- laneId 2 attr.laneId[3] = 3; // 3 -- laneId 3 /* each vc has 4 params, syncCode[i]:syncMode is SYNC_MODE_SOF: SOF, EOF, SOL, EOLsyncMode is SYNC_MODE_SAV: invalid sav, invalid eav, valid sav, valid eav This is not fully tested! */for (i = 0; i < LVDS_LANE_NUM; i++) {for (j = 0; j < WDR_VC_NUM; j++) {for (k = 0; k < SYNC_CODE_NUM; k++) {attr.syncCode[i][j][k] = 0; // 0 -- frame0 sof }}}*lvdsAttr = attr;
}static int32_t PalMipiCsiTestSample(void)
{uint8_t id;int32_t ret;uint8_t comboDev;uint8_t snsClkSource;uint8_t snsResetSource;uint8_t devno;LaneDivideMode laneMode;PhyCmvMode CmvMode;ComboDevAttr attr;DevHandle MipiCsiHandle = NULL;enum InterfaceType interType;// 控制器ID号 id = 0; // 获取控制器操作句柄 MipiCsiHandle = MipiCsiOpen(id);if (MipiCsiHandle == NULL) {HDF_LOGE("PalMipiCsiTestSample: mipi csi open fail!\n");return HDF_FAILURE;}// Lane模式参数为0 laneMode = LANE_DIVIDE_MODE_0;// 设置MIPI RX的Lane分布 ret = MipiCsiSetHsMode(MipiCsiHandle, laneMode);if (ret != HDF_SUCCESS && ret != HDF_ERR_NOT_SUPPORT) {HDF_LOGE("PalMipiCsiTestSample: mipi csi set hs mode fail, ret=%d\n", ret);return ret;}// 通路序号为0 comboDev = 0;// 使能MIPI的时钟 ret = MipiCsiEnableClock(MipiCsiHandle, comboDev);if (ret != HDF_SUCCESS && ret != HDF_ERR_NOT_SUPPORT) {HDF_LOGE("PalMipiCsiTestSample: mipi csi enable clock fail, ret=%d\n", ret);return ret;}// 复位MIPI RX ret = MipiCsiResetRx(MipiCsiHandle, comboDev);if (ret != HDF_SUCCESS && ret != HDF_ERR_NOT_SUPPORT) {HDF_LOGE("PalMipiCsiTestSample: mipi csi reset rx fail, ret=%d\n", ret);return ret;}// 传感器的时钟信号线号为0 snsClkSource = 0;// 使能MIPI上的Sensor时钟 ret = MipiCsiEnableSensorClock(MipiCsiHandle, snsClkSource);if (ret != HDF_SUCCESS && ret != HDF_ERR_NOT_SUPPORT) {HDF_LOGE("PalMipiCsiTestSample: mipi csi enable sensor clock fail, ret=%d\n", ret);return ret;}snsResetSource = 0;// 复位Sensor ret = MipiCsiResetSensor(MipiCsiHandle, snsResetSource);if (ret != HDF_SUCCESS && ret != HDF_ERR_NOT_SUPPORT) {HDF_LOGE("PalMipiCsiTestSample: mipi csi reset sensor fail, ret=%d\n", ret);return ret;}// MIPI参数配置如下 (void)memset_s(&attr, sizeof(ComboDevAttr), 0, sizeof(ComboDevAttr));attr.devno = 0;                    // 设备0 attr.inputMode = INPUT_MODE_MIPI;  // 输入模式为MIPI attr.dataRate = MIPI_DATA_RATE_X1; // 每时钟输出1像素 attr.imgRect.x = 0;                // 0: 图像传感器左上位置 attr.imgRect.y = 0;                // 0: 图像传感器右上位置 attr.imgRect.width = 2592;         // 2592: 图像传感器宽度大小 attr.imgRect.height = 1944;        // 1944: 图像传感器高度尺寸 interType = MipiGetIntputModeType(attr.inputMode);if (interType == INTERFACE_MIPI) {HDF_LOGI("PalMipiCsiTestSample: call[InitMipiDevAttr].");InitMipiDevAttr(&attr.mipiAttr);} else if (interType == INTERFACE_LVDS) {HDF_LOGI("PalMipiCsiTestSample: call[InitLvdsDevAttr].");InitLvdsDevAttr(&attr.lvdsAttr);} else {HDF_LOGE("PalMipiCsiTestSample: interType = %d is error!", attr.inputMode);}// 写入配置数据 ret = MipiCsiSetComboDevAttr(MipiCsiHandle, &attr);if (ret != HDF_SUCCESS && ret != HDF_ERR_NOT_SUPPORT) {HDF_LOGE("PalMipiCsiTestSample: mipi csi set combo devAttr fail, ret=%d\n", ret);return ret;}// 共模电压模式参数为0 CmvMode = PHY_CMV_GE1200MV;// 设备编号为0 devno = 0;// 设置共模电压模式 ret = MipiCsiSetPhyCmvmode(MipiCsiHandle, devno, CmvMode);if (ret != HDF_SUCCESS && ret != HDF_ERR_NOT_SUPPORT) {HDF_LOGE("PalMipiCsiTestSample: mipi csi set phy cmv mode fail, ret=%d\n", ret);return ret;}// 通路序号为0 comboDev = 0;// 撤销复位MIPI RX ret = MipiCsiUnresetRx(MipiCsiHandle, comboDev);if (ret != HDF_SUCCESS && ret != HDF_ERR_NOT_SUPPORT) {HDF_LOGE("PalMipiCsiTestSample: mipi csi unreset rx fail, ret=%d\n", ret);return ret;}// 关闭MIPI的时钟 ret = MipiCsiDisableClock(MipiCsiHandle, comboDev);if (ret != HDF_SUCCESS && ret != HDF_ERR_NOT_SUPPORT) {HDF_LOGE("PalMipiCsiTestSample: mipi csi disable clock fail, ret=%d\n", ret);return ret;}// 传感器撤销复位信号线号为0 snsResetSource = 0;// 撤销复位Sensor ret = MipiCsiUnresetSensor(MipiCsiHandle, snsResetSource);if (ret != HDF_SUCCESS && ret != HDF_ERR_NOT_SUPPORT) {HDF_LOGE("PalMipiCsiTestSample: mipi csi unreset sensor fail, ret=%d\n", ret);return ret;}// 关闭MIPI上的Sensor时钟 ret = MipiCsiDisableSensorClock(MipiCsiHandle, snsClkSource);if (ret != HDF_SUCCESS && ret != HDF_ERR_NOT_SUPPORT) {HDF_LOGE("PalMipiCsiTestSample: mipi csi disable sensor clock fail, ret=%d\n", ret);return ret;}HDF_LOGI("PalMipiCsiTestSample: function tests end.");// 释放MIPI DSI设备句柄 MipiCsiClose(MipiCsiHandle);return ret;
}

最后

经常有很多小伙伴抱怨说:不知道学习鸿蒙开发哪些技术?不知道需要重点掌握哪些鸿蒙应用开发知识点?

为了能够帮助到大家能够有规划的学习,这里特别整理了一套纯血版鸿蒙(HarmonyOS Next)全栈开发技术的学习路线,包含了鸿蒙开发必掌握的核心知识要点,内容有(ArkTS、ArkUI开发组件、Stage模型、多端部署、分布式应用开发、WebGL、元服务、OpenHarmony多媒体技术、Napi组件、OpenHarmony内核、OpenHarmony驱动开发、系统定制移植等等)鸿蒙(HarmonyOS NEXT)技术知识点。

在这里插入图片描述

《鸿蒙 (Harmony OS)开发学习手册》(共计892页):https://gitcode.com/HarmonyOS_MN/733GH/overview

如何快速入门?

1.基本概念
2.构建第一个ArkTS应用
3.……

鸿蒙开发面试真题(含参考答案):

在这里插入图片描述

《OpenHarmony源码解析》:

  • 搭建开发环境
  • Windows 开发环境的搭建
  • Ubuntu 开发环境搭建
  • Linux 与 Windows 之间的文件共享
  • ……
  • 系统架构分析
  • 构建子系统
  • 启动流程
  • 子系统
  • 分布式任务调度子系统
  • 分布式通信子系统
  • 驱动子系统
  • ……

图片

OpenHarmony 设备开发学习手册:https://gitcode.com/HarmonyOS_MN/733GH/overview

图片
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.xdnf.cn/news/1547006.html

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

数字人形象自定义制作:readyplayer

网址&#xff1a; https://readyplayer.me/ 支持上传照片和拍照&#xff0c;会自动识别变成卡通风格 其他选项是配置选项&#xff1a;穿着、样貌等 上面弄好后右上角点击next&#xff0c;创建的模型可以下载3d glb文件 glb文件在线打开&#xff1a; https://gltf-viewer.d…

SpinalHDL之语义(Semantic)(一)

本文作为SpinalHDL学习笔记第六十九篇,介绍SpinalHDL的赋值(Assignments)。 目录: 1.赋值(Assignments) 2.位宽检查(Width checking) 3.组合逻辑环路(Combinatorial loops) ⼀、赋值(Assignments) SpinalHDL中有多个赋值运算: //因为硬件的并发性, `a`的值⼀直是1 val a…

CrossOver24支持的游戏有那些

CrossOver刚刚更新了24版本&#xff0c;支持《地平线零之曙光》、《以撒的结合&#xff1a;重生》等游戏。一起来看看它有哪些更新吧&#xff01; 一、功能优化 - 更新 Wine 至最新的稳定版 Wine 9.0&#xff0c;引入了 7000多个更新和针对各种软件游戏的优化。 - 更新 Wine M…

Azure Kinect 人体跟踪关节

Azure Kinect 人体跟踪关节 azure kinect dk 提取人体骨骼 要在Azure Kinect DK上提取人体骨骼&#xff0c;你需要使用Azure Kinect SDK和OpenPose库。以下是一个简化的代码示例&#xff0c;展示如何集成这两个库来提取骨骼关键点&#xff1a; 首先&#xff0c;确保你已经安装…

【YashanDB知识库】decode函数中的子查询被不必要地多次执行

本文内容转自YashanDB官网&#xff0c;具体内容请见https://www.yashandb.com/newsinfo/7441387.html?templateId1718516 问题现象 客户向yashandb下发的SQL语句执行时间超过6分钟仍未出结果 问题的风险及影响 SQL语句性能慢&#xff0c;影响客户业务 问题影响的版本 所…

蜂窝物联网全网通sim卡切网技术方案软硬件实现教程(设备根据基站信号质量自动切网)

01 物联网系统中为什么要使用三合一卡 三合一卡为用户解决了单一运营商网络无法全覆盖的缺陷&#xff0c;避免再次采购的经济成本以及时间成本和因没有信号设备停止工作造成的损失&#xff0c;保证仅需一次采购并提高设备工作效率和入网活跃度。例如下面地区的设备&#xff0…

RPA自动化流程机器人有哪些优势?

在数字化快速推进的大背景下&#xff0c;人工智能正在以前所未有的速度改变着生活和生产方式&#xff0c;而RPA自动化流程机器人作为其中一种最重要的革命性的技术&#xff0c;已经成为企业数字化中不可或缺的重要力量&#xff0c;让员工加速从“重复性工作”中摆脱出来。 金智…

【芋道源码】gitee很火的开源项目pig——后台管理快速开发框架使用笔记(微服务版之本地开发环境篇)

后台管理快速开发框架使用笔记&#xff08;微服务版之本地开发环境篇&#xff09; 后台管理快速开发框架使用笔记&#xff08;微服务版之本地开发环境篇&#xff09; 后台管理快速开发框架使用笔记&#xff08;微服务版之本地开发环境篇&#xff09;前言一、如何获取项目&#…

推荐十款主流的采购管理系统,为企业选型提供参考!

大家都明白采购对制造型企业的重要性&#xff0c;但是在面对市场上琳琅满目的采购管理系统企业却不知道该如何选择&#xff0c;不要担心。 本篇文章将对市面上知名的采购管理系统进行综合测评&#xff0c;深入剖析这些平台的特点与优势。看完这篇内容&#xff0c;你将对不同采…

前台项目启动/打包报错 Error: error:0308010C:digital envelope routines::unsupported

在package.json中修改启动/打包语句 如图&#xff0c;我这里是打包时候报错&#xff0c;就在build里前面加上 set NODE_OPTIONS--openssl-legacy-provider && 再次打包&#xff0c;成功。

【OpenAI o1思维链CoT必看论文】谷歌“思维链提示“让AI更懂人类推理

原创 超 超的闲思世界 AI的推理能力正迎来一场重大突破。谷歌大脑团队最新开发的"思维链提示"方法&#xff0c;让大型语言模型在复杂推理任务上展现出惊人的进步。这项创新技术无需对模型进行额外训练&#xff0c;却能显著提升AI的推理能力&#xff0c;让机器的思…

微电网与大电网主动同步控制

前言 大电网正常运行时&#xff0c;微电网通过大电网得到正常的电压频率参数支撑&#xff0c;大电网故障时&#xff0c;微电网的电压和频率支撑需要通过分布式电源提供&#xff0c;从而保持自身独立运行。分布式电源提供的电压信息会因为自身的下垂特性随本地负荷的改变不断变…

vue 中获取数值但是只获取到了 Promise 属性,获取不到其中的值

左边的请求能获取到数据&#xff0c;右边的不行&#xff1f; 改成这样即可

【雅特力AT32】IIC使用指南_附读写EEPROM案例

目录 1.12C接口简介 2.12C接口通信 2.1主机通信流程 2.1.1 主机通信初始化 1>主机时钟初始化 2>主机通信初始化 3>主机 10 bits 寻址的特殊时序初始化 2.1.2 主机通信初始化软件接口 2.1.3 主机发送流程 2.1.4 主机发送流程软件接口 2.1.5 主机接收流程 2.1.6 主机接收…

leetcode 1361. 验证二叉树

二叉树上有 n 个节点&#xff0c;按从 0 到 n - 1 编号&#xff0c;其中节点 i 的两个子节点分别是 leftChild[i] 和 rightChild[i]。 只有 所有 节点能够形成且 只 形成 一颗 有效的二叉树时&#xff0c;返回 true&#xff1b;否则返回 false。 如果节点 i 没有左子节点&#…

【Ubuntu】Ubuntu安装编译C/C++环境简易版教程

环境 操作系统&#xff1a;ubuntu-22.04.4-desktop-amd64.iso 安装 第一步:更新软件包列表&#xff0c;检查可用的软件包更新 sudo apt update在这一步&#xff0c;我们可以确保系统中的软件包列表是最新的&#xff0c;以便后续的软件包管理操作。 第二步&#xff1a;安装…

​​XrayGLM原理与部署

接上一篇&#xff1a;VisualGLM-6B——原理与部署-CSDN博客 XrayGLM技术背景与原理 XrayGLM 是一种基于 VisualGLM-6B 微调开发的多模态医学影像诊断模型&#xff0c;专门用于处理医学影像&#xff08;如 X 光胸片&#xff09;的自动诊断和报告生成任务。该模型旨在为中文医学…

归并排序,外排序,计数排序(非比较排序)

归并排序&#xff1a;&#xff08;MERGE-SORT&#xff09;是建立在归并操作上的一种有效的排序算法,该算法是采用分治法&#xff08;Divide and Conquer&#xff09;的一个非常典型的应用。将已有序的子序列合并&#xff0c;得到完全有序的序列&#xff1b;即先使每个子序列有序…

智能软件开启精准品牌控价

在当今竞争激烈的商业世界中&#xff0c;品牌的价值如同璀璨的明珠&#xff0c;需要精心呵护。而价格管控&#xff0c;则是守护这颗明珠的关键防线。 当面对众多的产品和 SKU 时&#xff0c;传统的人力监测已显得力不从心。此时&#xff0c;力维网络自主开发的数据监测系统如同…

Redis 篇-深入了解在 Linux 的 Redis 网络模型结构及其流程(阻塞 IO、非阻塞 IO、IO 多路复用、异步 IO、信号驱动 IO)

&#x1f525;博客主页&#xff1a; 【小扳_-CSDN博客】 ❤感谢大家点赞&#x1f44d;收藏⭐评论✍ 文章目录 1.0 用户空间与内核空间概述 2.0 Redis 网络模型 2.1 Redis 网络模型 - 阻塞 IO 2.2 Redis 网络模型 - 非阻塞 IO 2.3 Redis 网络模型 - IO 多路复用 2.3.1 IO 多路复…