提交 ef3c9f1a 编写于 作者: O openharmony_ci 提交者: Gitee

!902 Platform driven document supplement

Merge pull request !902 from 尹树清/master
/*
* Copyright (c) 2021 Huawei Device Co., Ltd.
*
* HDF is dual licensed: you can use it either under the terms of
* the GPL, or the BSD license, at your option.
* See the LICENSE file in the root of this repository for complete details.
*/
/**
* @addtogroup ADC
* @{
*
* @brief 定义用于模/数转换器驱动程序开发的标准ADC API。
* 此ADC模块抽象了不同系统平台的ADC功能,以提供稳定的API,用于模/数转换器驱动程序开发。您可以使用此模块获取/释放ADC设备句柄。
*
* @since 1.0
*/
/**
* @file adc_if.h
*
* @brief 声明标准ADC接口函数。
*
* @since 1.0
*/
#ifndef ADC_IF_H
#define ADC_IF_H
#include "hdf_platform.h"
#ifdef __cplusplus
#if __cplusplus
extern "C" {
#endif
#endif /* __cplusplus */
struct AdcIoMsg {
/** ADC设备号 */
uint32_t number;
/** ADC设备通道号 */
uint32_t channel;
};
/**
* @brief 获取ADC设备的句柄。
* 在访问ADC设备之前,必须调用此函数。
*
* @param number ADC设备ID。
*
* @return 如果操作成功,则返回指向ADC设备的DevHandle的指针;否则返回NULL。
*
* @since 1.0
*/
DevHandle AdcOpen(uint32_t number);
/**
* @brief 释放ADC设备的句柄。
* 如果不再需要访问ADC设备,则应调用此函数关闭其句柄,以便释放未使用的内存资源。
*
* @param handle 指向通过{@link AdcOpen}获得的ADC设备的设备句柄的指针。
*
* @since 1.0
*/
void AdcClose(DevHandle handle);
/**
* @brief 从ADC设备读取指定大小的数据。
*
* @param handle 指向通过{@link AdcOpen}获得的ADC设备的设备句柄的指针。
* @param channel ADC设备通道。
* @param val 指向存储读出数据指针。
*
* @return 如果操作成功,则返回0;否则返回负值。
* @since 1.0
*/
int32_t AdcRead(DevHandle handle, uint32_t channel, uint32_t *val);
#ifdef __cplusplus
#if __cplusplus
}
#endif
#endif /* __cplusplus */
#endif /* ADC_IF_H */
此差异已折叠。
/*
* Copyright (c) 2021 Huawei Device Co., Ltd.
*
* HDF is dual licensed: you can use it either under the terms of
* the GPL, or the BSD license, at your option.
* See the LICENSE file in the root of this repository for complete details.
*/
/**
* @addtogroup I3C
* @{
*
* @brief 提供改进的Improved Inter-Integrated Circuit (I3C)接口。
* 该模块允许驱动程序在I3C控制器上执行操作,以访问I3C总线上的设备。
* 包括创建和销毁I3C控制器句柄以及读取和写入数据。
*
* @since 1.0
*/
/**
* @file i3c_if.h
*
* @brief 声明标准I3C接口函数。
*
* @since 1.0
*/
#ifndef I3C_IF_H
#define I3C_IF_H
#include "hdf_platform.h"
#include "i3c_ccc.h"
#ifdef __cplusplus
#if __cplusplus
extern "C" {
#endif
#endif /* __cplusplus */
enum TransMode {
/** I2C传输模式 */
I2C_MODE = 0,
/** I3C传输模式 */
I3C_MODE,
/** CCC(通用命令代码)模式 */
CCC_CMD_MODE,
};
enum I3cBusMode {
/** 单数据速率模式 */
I3C_BUS_SDR_MODE = 0,
/** 高数据速率模式 */
I3C_BUS_HDR_MODE,
};
/**
* @brief 定义I3C控制器的配置。
*
* @since 1.0
*/
struct I3cConfig {
/** I3C总线模式 */
enum I3cBusMode busMode;
/** 当前主设备,当控制器是主设备时,其为NULL */
struct I3cDevice *curMaster;
};
/**
* @brief 定义I3C传输、I2C传输或发送CCC(通用命令代码)期间使用的I3C传输消息。
*
* @attention 此结构不限制len指定的数据传输长度,允许的最大长度由特定控制器确定。
* 设备地址addr表示原始设备地址,不需要包含读/写标志位。
* @since 1.0
*/
struct I3cMsg {
/** 目标设备的地址 */
uint16_t addr;
/** 用于存储传输数据的缓冲区地址 */
uint8_t *buf;
/** 传输数据的长度 */
uint16_t len;
/**
* 传输模式标志 | 说明
* ------------| -----------------------
* I2C_FLAG_READ | 读标志
* I2C_FLAG_READ_NO_ACK | 无确认读取标志
* I2C_FLAG_IGNORE_NO_ACK | 忽略无确认标志
* I2C_FLAG_NO_START | 无启动条件标志
* I2C_FLAG_STOP | 停止条件标志
*/
uint16_t flags;
/** 传输模式选择,默认为I2C_MODE */
enum TransMode mode;
/** CCC(通用命令代码)结构,用于CCC_CMD_MODE传输模式 */
struct I3cCccCmd *ccc;
/** I3C错误代码,由驱动程序更新 */
uint16_t err;
};
/**
* @brief 定义I3C IBI(带内中断)的数据。
*
* @attention 生成IBI时,IBI函数中的有效载荷和buf可获得IBI数据。
*
* @since 1.0
*/
struct I3cIbiData {
/** 有效载荷数据长度。IBI有效负载数据的长度。当IBI已生成,读取时请勿修改。 */
uint32_t payload;
/** 数据缓冲区。有效负载数据的指针。 */
uint8_t *buf;
};
enum I3cFlag {
/** 读标志。值1表示读取操作,0表示写入操作。 */
I3C_FLAG_READ = (0x1 << 0),
/** 无ACK读标志。值1表示在读取过程中没有发送ACK信号。 */
I3C_FLAG_READ_NO_ACK = (0x1 << 11),
/** 忽略ACK标志。值1表示忽略非ACK信号。 */
I3C_FLAG_IGNORE_NO_ACK = (0x1 << 12),
/** 无启动条件标志。值1表示消息没有启动条件转移。 */
I3C_FLAG_NO_START = (0x1 << 14),
/** 停止条件标志。值1表示当前传输以停止条件结束。 */
I3C_FLAG_STOP = (0x1 << 15),
};
/**
* @brief IBI(带内中断)回调函数。
* 使用{@link I3cRequestIbi}将其连接到I3C设备。
*
* @param handle 指向通过{@link I3cOpen}获得的I3C控制器句柄的指针。
* @param addr 重新设置IBI(带内中断)的设备地址。
* @param data IBI的数据结构。
*
* @return 如果操作成功,则返回0;否则返回负值。
* @since 1.0
*/
typedef int32_t (*I3cIbiFunc)(DevHandle handle, uint16_t addr, struct I3cIbiData data);
/**
* @brief 获取I3C控制器的句柄。
* 在访问I3C总线之前,必须调用此函数。
*
* @param number I3C控制器ID。
*
* @return 如果操作成功,则返回指向I3C控制器的DevHandle的指针;否则返回NULL。
*
* @since 1.0
*/
DevHandle I3cOpen(int16_t number);
/**
* @brief 释放I3C控制器的句柄。
* 如果不再需要访问I3C控制器,则应调用此函数关闭其句柄,以便释放未使用的内存资源。
*
* @param handle 指向通过{@link I3cOpen}获得的I3C控制器句柄的指针。
*
* @since 1.0
*/
void I3cClose(DevHandle handle);
/**
* @brief 启动到I3C设备或兼容的I2C设备的传输,或者向支持的I3C设备发送CCC(通用命令代码)。
*
* @param handle 指向通过{@link I3cOpen}获得的I3C控制器句柄的指针。
* @param msg 指向I3C传输消息结构数组的指针。
* @param count 消息结构数组的长度。
* @param mode 传输模式。
*
* @return 如果操作成功,返回传输的消息结构数;
* @see I3cMsg
* @attention 此结构不限制len指定的数据传输长度。 特定的 I3C 控制器决定了允许的最大长度。 设备地址addr表示原始设备地址,不需要包含读/写标志位。
*
* @since 1.0
*/
int32_t I3cTransfer(DevHandle handle, struct I3cMsg *msg, int16_t count, enum TransMode mode);
/**
* @brief 重新设置受支持的I3C设备的IBI(带内中断)。
*
* @param handle 指向通过{@link I3cOpen}获得的I3C控制器句柄的指针。
* @param addr 重新设置IBI(带内中断)的设备地址。
* @param func IBI回调函数。
* @param payload 有效负载数据的长度,以字节为单位。
*
* @return 如果操作成功,则返回0;否则返回负值。
*
* @since 1.0
*/
int32_t I3cRequestIbi(DevHandle handle, uint16_t addr, I3cIbiFunc func, uint32_t payload);
/**
* @brief 释放{@link I3cRequestIbi}重新设置的IBI(带内中断)。
*
* @param handle 指向通过{@link I3cOpen}获得的I3C控制器句柄的指针。
* @param addr 要释放IBI的设备的地址。
*
* @return 如果操作成功,则返回0;否则返回负值。
*
* @since 1.0
*/
int32_t I3cFreeIbi(DevHandle handle, uint16_t addr);
/**
* @brief 设置I3C控制器的配置。
*
* @param handle 指向通过{@link I3cOpen}获得的I3C控制器句柄的指针。
* @param config 要设置的配置结构的指针。
*
* @return 如果操作成功,则返回0;否则返回负值。
*
* @since 1.0
*/
int32_t I3cSetConfig(DevHandle handle, struct I3cConfig *config);
/**
* @brief 获取I3C控制器的配置。
*
* @param handle 指向通过{@link I3cOpen}获得的I3C控制器句柄的指针。
* @param config 用于存储配置的结构体。
*
* @return 如果操作成功,则返回0;否则返回负值。
*
* @since 1.0
*/
int32_t I3cGetConfig(DevHandle handle, struct I3cConfig *config);
#ifdef __cplusplus
#if __cplusplus
}
#endif
#endif /* __cplusplus */
#endif /* I3C_IF_H */
/** @} */
/*
* Copyright (c) 2021 Huawei Device Co., Ltd.
*
* HDF is dual licensed: you can use it either under the terms of
* the GPL, or the BSD license, at your option.
* See the LICENSE file in the root of this repository for complete details.
*/
/**
* @addtogroup MIPI CSI
* @{
*
* @brief 定义用于外设接收端驱动程序开发的标准MIPI CSI API。
* 此MIPI CSI模块抽象了不同系统平台的MIPI CSI功能,以提供稳定的API。
* 用于外设接收端驱动程序开发。您可以使用此模块获取/释放MIPI CSI设备句柄。
*
* @since 1.0
*/
/**
* @file mipi_csi_if.h
*
* @brief 声明用于显示驱动程序开发的标准MIPI CSI API。
*
*
*
* @since 1.0
*/
#ifndef MIPI_CSI_IF_H
#define MIPI_CSI_IF_H
#include "hdf_platform.h"
#ifdef __cplusplus
#if __cplusplus
extern "C" {
#endif
#endif /* __cplusplus */
/**
* @brief MIPI RX的MIPI设备支持的最大通道数。
*
* @since 1.0
*/
#define MIPI_LANE_NUM 4
/**
* @brief Mipi Rx的LVDS设备支持的最大通道数。
*
* @since 1.0
*/
#define LVDS_LANE_NUM 4
/**
* @brief 定义支持的最大虚拟通道数。
*
* @since 1.0
*/
#define WDR_VC_NUM 4
/**
* @brief 为LVDS的每个虚拟通道定义同步代码的数量。
*
* @since 1.0
*/
#define SYNC_CODE_NUM 4
/**
* @brief 最多3组扩展数据类型。
*
* @since 1.0
*/
#define MAX_EXT_DATA_TYPE_NUM 3
/**
* @brief Mipi-Rx的通道分布。
*
* @since 1.0
*/
typedef enum {
LANE_DIVIDE_MODE_0 = 0,
LANE_DIVIDE_MODE_1 = 1,
LANE_DIVIDE_MODE_BUTT
} LaneDivideMode;
/**
* @brief MIPI接收输入接口类型。
*
* @since 1.0
*/
typedef enum {
/** mipi */
INPUT_MODE_MIPI = 0x0,
/** SUB_LVDS */
INPUT_MODE_SUBLVDS = 0x1,
/** LVDS */
INPUT_MODE_LVDS = 0x2,
/* HISPI */
INPUT_MODE_HISPI = 0x3,
/** CMOS */
INPUT_MODE_CMOS = 0x4,
/** BT601 */
INPUT_MODE_BT601 = 0x5,
/** BT656 */
INPUT_MODE_BT656 = 0x6,
/** BT1120 */
INPUT_MODE_BT1120 = 0x7,
/** MIPI Bypass */
INPUT_MODE_BYPASS = 0x8,
INPUT_MODE_BUTT
} InputMode;
/**
* @brief MIPI接收速率。
*
* @since 1.0
*/
typedef enum {
/** output 1 pixel per clock */
MIPI_DATA_RATE_X1 = 0,
/** output 2 pixel per clock */
MIPI_DATA_RATE_X2 = 1,
MIPI_DATA_RATE_BUTT
} MipiDataRate;
/**
* @brief Mipi图像区域。
*
* @since 1.0
*/
typedef struct {
int x;
int y;
unsigned int width;
unsigned int height;
} ImgRect;
/**
* @brief 传输的数据类型。
*
* @since 1.0
*/
typedef enum {
DATA_TYPE_RAW_8BIT = 0,
DATA_TYPE_RAW_10BIT,
DATA_TYPE_RAW_12BIT,
DATA_TYPE_RAW_14BIT,
DATA_TYPE_RAW_16BIT,
DATA_TYPE_YUV420_8BIT_NORMAL,
DATA_TYPE_YUV420_8BIT_LEGACY,
DATA_TYPE_YUV422_8BIT,
/** YUV422 8位转换用户定义16位原始数据 */
DATA_TYPE_YUV422_PACKED,
DATA_TYPE_BUTT
} DataType;
/**
* @brief 定义YUV和原始数据格式以及位深度。
*
* @since 1.0
*/
typedef struct {
uint8_t devno;
unsigned int num;
unsigned int extDataBitWidth[MAX_EXT_DATA_TYPE_NUM];
unsigned int extDataType[MAX_EXT_DATA_TYPE_NUM];
} ExtDataType;
/**
* @brief MIPI D-PHY WDR模式定义。
*
* @since 1.0
*/
typedef enum {
HI_MIPI_WDR_MODE_NONE = 0x0,
/** Virtual Channel */
HI_MIPI_WDR_MODE_VC = 0x1,
/** Data Type */
HI_MIPI_WDR_MODE_DT = 0x2,
/** DOL Mode */
HI_MIPI_WDR_MODE_DOL = 0x3,
HI_MIPI_WDR_MODE_BUTT
} MipiWdrMode;
/**
* @brief Mipi设备属性。
*
* @since 1.0
*/
typedef struct {
/** 数据类型:8/10/12/14/16位 */
DataType inputDataType;
/** MIPI WDR模式定义 */
MipiWdrMode wdrMode;
/** 通道id: -1 - 禁用 */
short laneId[MIPI_LANE_NUM];
union {
/** 由HI_MIPI_WDR_MODE_DT使用 */
short dataType[WDR_VC_NUM];
};
} MipiDevAttr;
/**
* @brief LVDS WDR模式定义。
*
* @since 1.0
*/
typedef enum {
HI_WDR_MODE_NONE = 0x0,
HI_WDR_MODE_2F = 0x1,
HI_WDR_MODE_3F = 0x2,
HI_WDR_MODE_4F = 0x3,
HI_WDR_MODE_DOL_2F = 0x4,
HI_WDR_MODE_DOL_3F = 0x5,
HI_WDR_MODE_DOL_4F = 0x6,
HI_WDR_MODE_BUTT
} WdrMode;
/**
* @brief LVDS同步模式。
*
* @since 1.0
*/
typedef enum {
/** 传感器SOL、EOL、SOF、EOF */
LVDS_SYNC_MODE_SOF = 0,
/** SAV, EAV */
LVDS_SYNC_MODE_SAV,
LVDS_SYNC_MODE_BUTT
} LvdsSyncMode;
/**
* @brief LVDS 列同步类型。
*
* @since 1.0
*/
typedef enum {
LVDS_VSYNC_NORMAL = 0x00,
LVDS_VSYNC_SHARE = 0x01,
LVDS_VSYNC_HCONNECT = 0x02,
LVDS_VSYNC_BUTT
} LvdsVsyncType;
/**
* @brief LVDS-Vsync列同步参数。
*
* @since 1.0
*/
typedef struct {
LvdsVsyncType syncType;
/* 当 sync_type 为 LVDS_VSYNC_HCONNECT 时,需要配置 hblank1 和 hblank2,表示 Hconnect 的消隐区长度 */
unsigned short hblank1;
unsigned short hblank2;
} LvdsVsyncAttr;
/**
* @brief 帧ID类型。
*
* @since 1.0
*/
typedef enum {
LVDS_FID_NONE = 0x00,
/** SAV 4th中的帧标识id */
LVDS_FID_IN_SAV = 0x01,
/** 第一个数据中的帧标识id */
LVDS_FID_IN_DATA = 0x02,
LVDS_FID_BUTT
} LvdsFidType;
/**
* @brief 帧ID配置信息。
*
* @since 1.0
*/
typedef struct {
LvdsFidType fidType;
/** 索尼DOL有帧信息线,在DOL H连接模式下,
应将此标志配置为false以禁用输出帧信息行。 */
unsigned char outputFil;
} LvdsFidAttr;
/**
* @brief 位大小端模式。
*
* @since 1.0
*/
typedef enum {
LVDS_ENDIAN_LITTLE = 0x0,
LVDS_ENDIAN_BIG = 0x1,
LVDS_ENDIAN_BUTT
} LvdsBitEndian;
/**
* @brief LVDS/SUBSLVDS/HiSPi设备属性。
*
* @since 1.0
*/
typedef struct {
/** 数据类型:8/10/12/14位 */
DataType inputDataType;
/** 波分复用模式 */
WdrMode wdrMode;
/** 同步模式:SOF,SAV */
LvdsSyncMode syncMode;
/** 正常、共享、连接 */
LvdsVsyncAttr vsyncAttr;
/** 帧识别码 */
LvdsFidAttr fidAttr;
/** 数据端:小/大 */
LvdsBitEndian dataEndian;
/** 同步代码endian:小/大 */
LvdsBitEndian syncCodeEndian;
/** 通道id: -1 - 禁用 */
short laneId[LVDS_LANE_NUM];
/** 每个vc有4个参数,syncCode[i]:
同步模式是SYNC_MODE_SOF:SOF、EOF、SOL、EOL
同步模式是SYNC_MODE_SAV:无效SAV、无效eav、有效SAV、有效eav */
unsigned short syncCode[LVDS_LANE_NUM][WDR_VC_NUM][SYNC_CODE_NUM];
} LvdsDevAttr;
/**
* @brief 组合设备的属性。
* 组合设备属性,由于 MIPI Rx 能够对接 CSI-2、LVDS、HiSPi 等时序,所以将 MIPI Rx 称为组合设备。
*
* @since 1.0
*/
typedef struct {
/** 设备号 */
uint8_t devno;
/** 输入模式:MIPI/LVDS/SUBSLVDS/HISPI/DC */
InputMode inputMode;
MipiDataRate dataRate;
/** MIPI Rx设备裁剪区域(与原始传感器输入图像大小相对应) */
ImgRect imgRect;
union {
MipiDevAttr mipiAttr;
LvdsDevAttr lvdsAttr;
};
} ComboDevAttr;
/**
* @brief 共模电压模式。
*
* @since 1.0
*/
typedef enum {
PHY_CMV_GE1200MV = 0x00,
PHY_CMV_LT1200MV = 0x01,
PHY_CMV_BUTT
} PhyCmvMode;
/**
* @brief 获取具有指定通道ID的MIPI CSI设备句柄。
*
* @param id 表示 MIPI CSI通道id。
*
* @return 如果操作成功,则返回MIPI CSI设备句柄;否则返回NULL。
*
* @since 1.0
*/
DevHandle MipiCsiOpen(uint8_t id);
/**
* @brief 释放MIPI CSI设备句柄。
*
* @param handle 通过{@link MipiCsiOpen}获得的MIPI CSI设备句柄。
*
* @since 1.0
*/
void MipiCsiClose(DevHandle handle);
/**
* @brief 将Mipi、CMOS或LVDS摄像机的参数设置到控制器。
* 参数包括工作模式、图像面积、图像深度、数据速率和物理通道。
*
* @param handle 通过{@link MipiCsiOpen}获得的MIPI CSI设备句柄。
* @param pAttr 指向属性的指针。
*
* @return 如果操作成功,则返回0;否则返回负值。
*
* @since 1.0
*/
int32_t MipiCsiSetComboDevAttr(DevHandle handle, ComboDevAttr *pAttr);
/**
* @brief 设置共模电压模式。
*
* @param handle 通过{@link MipiCsiOpen}获得的MIPI CSI设备句柄。
* @param devno 总共有2个设备编号,指向0或1。
* @param cmvMode 共模电压模式参数。
*
* @return 如果操作成功,则返回0;否则返回负值。
*
* @since 1.0
*/
int32_t MipiCsiSetPhyCmvmode(DevHandle handle, uint8_t devno, PhyCmvMode cmvMode);
/**
* @brief 复位传感器。
*
* @param handle 通过{@link MipiCsiOpen}获得的MIPI CSI设备句柄。
* @param snsResetSource 传感器的复位信号线号在软件中称为传感器的复位源。
* sns是传感器的缩写。
*
* @return 如果操作成功,则返回0;否则返回负值。
*
* @since 1.0
*/
int32_t MipiCsiResetSensor(DevHandle handle, uint8_t snsResetSource);
/**
* @brief 撤销复位传感器。
*
* @param handle 通过{@link MipiCsiOpen}获得的MIPI CSI设备句柄。
* @param snsResetSource 传感器的复位信号线号在软件中称为传感器的复位源。
* sns是传感器的缩写。
*
* @return 如果操作成功,则返回0;否则返回负值。
*
* @since 1.0
*/
int32_t MipiCsiUnresetSensor(DevHandle handle, uint8_t snsResetSource);
/**
* @brief 复位 MIPI RX。
* 不同的s32WorkingViNum有不同的enSnsType。
*
* @param handle 通过{@link MipiCsiOpen}获得的MIPI CSI设备句柄。
* @param comboDev MIPI Rx或者SLVS 设备类型。
*
* @return 如果操作成功,则返回0;否则返回负值。
*
* @since 1.0
*/
int32_t MipiCsiResetRx(DevHandle handle, uint8_t comboDev);
/**
* @brief 未设置的MIPI RX.
*
* @param handle 通过{@link MipiCsiOpen}获得的MIPI CSI设备句柄。
* @param comboDev MIPI Rx或者SLVS 设备类型。
*
* @return 如果操作成功,则返回0;否则返回负值。
*
* @since 1.0
*/
int32_t MipiCsiUnresetRx(DevHandle handle, uint8_t comboDev);
/**
* @brief 设置Mipi Rx的通道分布。
* 根据硬件连接形式选择具体模式。
*
* @param handle 通过{@link MipiCsiOpen}获得的MIPI CSI设备句柄。
* @param laneDivideMode 通道划分模式参数。
*
* @since 1.0
*/
int32_t MipiCsiSetHsMode(DevHandle handle, LaneDivideMode laneDivideMode);
/**
* @brief 使能mipi的时钟。
* 根据上层函数电泳传递的enSnsType参数决定是用 MIPI 还是LVDS。
*
* @param handle 通过{@link MipiCsiOpen}获得的MIPI CSI设备句柄。
* @param comboDev MIPI接收或LVDS设备类型。
*
* @return 如果操作成功,则返回0;否则返回负值。
*
* @since 1.0
*/
int32_t MipiCsiEnableClock(DevHandle handle, uint8_t comboDev);
/**
* @brief 关闭Mipi的时钟。
*
* @param handle 通过{@link MipiCsiOpen}获得的MIPI CSI设备句柄。
* @param comboDev MIPI接收或LVDS设备类型。
*
* @return 如果操作成功,则返回0;否则返回负值。
*
* @since 1.0
*/
int32_t MipiCsiDisableClock(DevHandle handle, uint8_t comboDev);
/**
* @brief 启用Mipi上的传感器时钟。
*
* @param handle 通过{@link MipiCsiOpen}获得的MIPI CSI设备句柄。
* @param snsClkSource 传感器的时钟信号线号,在软件中称为传感器的时钟源。
* sns是传感器的缩写。
*
* @return 如果操作成功,则返回0;否则返回负值。
*
* @since 1.0
*/
int32_t MipiCsiEnableSensorClock(DevHandle handle, uint8_t snsClkSource);
/**
* @brief 关闭传感器时钟。
*
* @param handle 通过{@link MipiCsiOpen}获得的MIPI CSI设备句柄。
* @param snsClkSource 传感器的时钟信号线号,在软件中称为传感器的时钟源。
* sns是传感器的缩写。
*
* @return 如果操作成功,则返回0;否则返回负值。
*
* @since 1.0
*/
int32_t MipiCsiDisableSensorClock(DevHandle handle, uint8_t snsClkSource);
/**
* @brief 设置YUV和原始数据格式以及位深度。
*
* @param handle 通过{@link MipiCsiOpen}获得的MIPI CSI设备句柄。
* @param dataType 指向图像数据格式的指针。
*
* @return 如果操作成功,则返回0;否则返回负值。
*
* @since 1.0
*/
int32_t MipiCsiSetExtDataType(DevHandle handle, ExtDataType* dataType);
#ifdef __cplusplus
#if __cplusplus
}
#endif
#endif /* __cplusplus */
#endif /* MIPI_CSI_IF_H */
......@@ -19,6 +19,7 @@
- [SPI](driver-platform-spi-develop.md)
- [UART](driver-platform-uart-develop.md)
- [WatchDog](driver-platform-watchdog-develop.md)
- [MIPI_CSI](driver-platform-mipicsi-develop.md)
- [平台驱动使用](driver-platform.md)
- [GPIO](driver-platform-gpio-des.md)
- [I2C](driver-platform-i2c-des.md)
......@@ -29,6 +30,7 @@
- [WATCHDOG](driver-platform-watchdog-des.md)
- [MIPI DSI](driver-platform-mipidsi-des.md)
- [PWM](driver-platform-pwm-des.md)
- [MIPI_CSI](driver-platform-mipicsi-des.md)
- [外设驱动使用](driver-peripherals.md)
- [LCD](driver-peripherals-lcd-des.md)
- [TOUCHSCREEN](driver-peripherals-touch-des.md)
......
此差异已折叠。
# MIPI-CSI<a name="title_MIPI_CSIDevelop"></a>
- [概述](#section1_MIPI_CSIDevelop)
- [开发步骤](#section2_MIPI_CSIDevelop)
- [开发实例](#section3_MIPI_CSIDevelop)
## 概述 <a name="section1_MIPI_CSIDevelop"></a>
CSI(Camera Serial Interface)是由MIPI联盟下Camera工作组指定的接口标准。在HDF框架中,MIPI-CSI的接口适配模式采用无服务模式,用于不需要在用户态提供API的设备类型,或者没有用户态和内核区分的OS系统,MIPI-CSI的接口关联方式是DevHandle直接指向设备对象内核态地址(DevHandle是一个void类型指针)。
图 1 无服务模式结构图
![image1](figures/CSI无服务模式结构图.png)
## 开发步骤 <a name="section2_MIPI_CSIDevelop"></a>
MIPI-CSI模块适配的三个环节是配置属性文件、实例化驱动入、以及实例化核心层接口函数。
1. **实例化驱动入口:**
- 实例化HdfDriverEntry结构体成员。
- 调用HDF_INIT将HdfDriverEntry实例化对象注册到HDF框架中。
2. **配置属性文件:**
- 在device_info.hcs文件中添加deviceNode描述。
- 【可选】添加mipicsi_config.hcs器件属性文件。
3. **实例化MIPICSI控制器对象:**
- 初始化MipiCsiCntlr成员。
- 实例化MipiCsiCntlr成员MipiCsiCntlrMethod,其定义和成员**说明**见下
4. **驱动调试:**
- 【可选】针对新增驱动程序,建议验证驱动基本功能,例如挂载后的信息反馈,数据传输的成功与否等。
> ![](W:\doc\docs\zh-cn\device-dev\public_sys-resources\icon-note.gif) **说明:**
>
> MipiCsiCntlrMethod定义
>
> ```c
> struct MipiCsiCntlrMethod {
> int32_t (*setComboDevAttr)(struct MipiCsiCntlr *cntlr, ComboDevAttr *pAttr);
> int32_t (*setPhyCmvmode)(struct MipiCsiCntlr *cntlr, uint8_t devno, PhyCmvMode cmvMode);
> int32_t (*setExtDataType)(struct MipiCsiCntlr *cntlr, ExtDataType* dataType);
> int32_t (*setHsMode)(struct MipiCsiCntlr *cntlr, LaneDivideMode laneDivideMode);
> int32_t (*enableClock)(struct MipiCsiCntlr *cntlr, uint8_t comboDev);
> int32_t (*disableClock)(struct MipiCsiCntlr *cntlr, uint8_t comboDev);
> int32_t (*resetRx)(struct MipiCsiCntlr *cntlr, uint8_t comboDev);
> int32_t (*unresetRx)(struct MipiCsiCntlr *cntlr, uint8_t comboDev);
> int32_t (*enableSensorClock)(struct MipiCsiCntlr *cntlr, uint8_t snsClkSource);
> int32_t (*disableSensorClock)(struct MipiCsiCntlr *cntlr, uint8_t snsClkSource);
> int32_t (*resetSensor)(struct MipiCsiCntlr *cntlr, uint8_t snsResetSource);
> int32_t (*unresetSensor)(struct MipiCsiCntlr *cntlr, uint8_t snsResetSource);
> };
> ```
>
> 表1 MipiCsiCntlrMethod成员的回调函数功能说明
>
> | 成员函数 | 入参 | 出参 | 返回状态 | 功能 |
> | ------------------ | ------------------------------------------------------------ | ---- | ------------------ | -------------------------- |
> | setComboDevAttr | **cntlr**: 结构体指针,MipiCsi控制器 ;<br>**pAttr**: 结构体指针,MIPI-CSI相应配置结构体指针 | 无 | HDF_STATUS相关状态 | 写入MIPI-CSI配置 |
> | setPhyCmvmode | **cntlr**: 结构体指针,MipiCsi控制器 ;<br>**devno**: uint8_t,设备编号;<br>**cmvMode**: 枚举类型,共模电压模式参数 | 无 | HDF_STATUS相关状态 | 设置共模电压模式 |
> | setExtDataType | **cntlr**: 结构体指针,MipiCsi控制器 ;<br>**dataType**: 结构体指针,定义YUV和原始数据格式以及位深度 | 无 | HDF_STATUS相关状态 | 设置YUV和RAW数据格式和位深 |
> | setHsMode | **cntlr**: 结构体指针,MipiCsi控制器 ;<br>**laneDivideMode**: 枚举类型,lane模式参数 | 无 | HDF_STATUS相关状态 | 设置MIPI RX的 Lane分布 |
> | enableClock | **cntlr**: 结构体指针,MipiCsi控制器 ;<br>**comboDev**: uint8_t,通路序号 | 无 | HDF_STATUS相关状态 | 使能mipi的时钟 |
> | disableClock | **cntlr**: 结构体指针,MipiCsi控制器 ;<br/>**comboDev**: uint8_t,通路序号 | 无 | HDF_STATUS相关状态 | 关闭mipi的时钟 |
> | resetRx | **cntlr**: 结构体指针,MipiCsi控制器 ;<br/>**comboDev**: uint8_t,通路序号 | 无 | HDF_STATUS相关状态 | 复位MIPI RX |
> | unresetRx | **cntlr**: 结构体指针,MipiCsi控制器 ;<br/>**comboDev**: uint8_t,通路序号 | 无 | HDF_STATUS相关状态 | 撤销复位MIPI RX |
> | enableSensorClock | **cntlr**: 结构体指针,MipiCsi控制器 ;<br/>**snsClkSource**: uint8_t,传感器的时钟信号线号 | 无 | HDF_STATUS相关状态 | 使能mipi上的sensor时钟 |
> | disableSensorClock | **cntlr**: 结构体指针,MipiCsi控制器 ;<br/>**snsClkSource**: uint8_t,传感器的时钟信号线号 | 无 | HDF_STATUS相关状态 | 关闭mipi上的sensor时钟 |
> | resetSensor | **cntlr**: 结构体指针,MipiCsi控制器 ;<br/>**snsClkSource**: uint8_t,传感器的时钟信号线号 | 无 | HDF_STATUS相关状态 | 复位sensor |
> | unresetSensor | **cntlr**: 结构体指针,MipiCsi控制器 ;<br/>**snsClkSource**: uint8_t,传感器的时钟信号线号 | 无 | HDF_STATUS相关状态 | 撤销复位sensor |
## 开发实例 <a name="section3_MIPI_CSIDevelop"></a>
下方将以mipi_rx_hi35xx.c为示例,展示需要厂商提供哪些内容来完整实现设备功能。
1. 一般来说,驱动开发首先需要在 busxx_config.hcs 中配置器件属性,并在device_info.hcs文件中添加deviceNode描述。器件属性值与核心层MipiCsiCntlr 成员的默认值或限制范围有密切关系,deviceNode信息与驱动入口注册相关。
**本例中MIPI控制器自身属性在源文件文件中,如有厂商需要,则在device_info文件的deviceNode增加deviceMatchAttr信息,相应增加mipicsi_config.hcs文件**
- device_info.hcs 配置参考
```c
root {
device_info {
match_attr = "hdf_manager";
platform :: host {
hostName = "platform_host";
priority = 50;
device_mipi_csi:: device {
device0 :: deviceNode {
policy = 0;
priority = 160;
permission = 0644;
moduleName = "HDF_MIPI_RX"; //【必要】用于指定驱动名称,需要与期望的驱动Entry中的moduleName一致;
serviceName = "HDF_MIPI_RX"; //【必要且唯一】驱动对外发布服务的名称
}
}
}
}
}
```
2. 完成器件属性文件的配置之后,下一步请实例化驱动入口,驱动入口必须为HdfDriverEntry(在 hdf_device_desc.h 中定义)类型的全局变量,且moduleName要和device_info.hcs中保持一致。HdfDriverEntry结构体的函数指针成员会被厂商操作函数填充,HDF框架会将所有加载的驱动的HdfDriverEntry对象首地址汇总,形成一个类似数组,方便调用。
一般在加载驱动时HDF框架会先调用Bind函数,再调用Init函数加载该驱动。当Init调用异常时,HDF框架会调用Release释放驱动资源并退出。
- MIPI-CSI驱动入口参考
```c
struct HdfDriverEntry g_mipiCsiDriverEntry = {
.moduleVersion = 1,
.Init = Hi35xxMipiCsiInit, //见Init参考
.Release = Hi35xxMipiCsiRelease, //见Release参考
.moduleName = "HDF_MIPI_RX", //【必要】需要与device_info.hcs 中保持一致。
};
HDF_INIT(g_mipiCsiDriverEntry); //调用HDF_INIT将驱动入口注册到HDF框架中
```
3. 完成驱动入口注册之后,最后一步就是以核心层MipiCsiCntlr对象的初始化为核心,实现HdfDriverEntry成员函数(Bind,Init,Release)。MipiCsiCntlr对象的初始化包括厂商自定义结构体(用于传递参数和数据)和实例化MipiCsiCntlr成员MipiCsiCntlrMethod(让用户可以通过接口来调用驱动底层函数)。
- 自定义结构体参考
> 从驱动的角度看,自定义结构体是参数和数据的载体,一般来说,config文件中的数值也会用来初始化结构体成员,本例的mipicsi器件属性在源文件中,故基本成员结构与MipiCsiCntlr无太大差异。
```c
typedef struct {
/** 数据类型:8/10/12/14/16位 */
DataType inputDataType;
/** MIPI波分复用模式 */
MipiWdrMode wdrMode;
/** laneId: -1 - 禁用 */
short laneId[MIPI_LANE_NUM];
union {
/** 用于 HI_MIPI_WDR_MODE_DT */
short dataType[WDR_VC_NUM];
};
} MipiDevAttr;
typedef struct {
/** 设备号 */
uint8_t devno;
/** 输入模式: MIPI/LVDS/SUBLVDS/HISPI/DC */
InputMode inputMode;
MipiDataRate dataRate;
/** MIPI Rx设备裁剪区域(与原始传感器输入图像大小相对应) */
ImgRect imgRect;
union {
MipiDevAttr mipiAttr;
LvdsDevAttr lvdsAttr;
};
} ComboDevAttr;
//MipiCsiCntlr是核心层控制器结构体,其中的成员在Init函数中会被赋值
struct MipiCsiCntlr {
/** 当驱动程序绑定到HDF框架时,将发送此控制器提供的服务 */
struct IDeviceIoService service;
/** 当驱动程序绑定到HDF框架时,将传入设备端指针 */
struct HdfDeviceObject *device;
/** 设备号 */
unsigned int devNo;
/** 控制器提供的所有接口 */
struct MipiCsiCntlrMethod *ops;
/** 对于控制器调试的所有接口,如果未实现驱动程序,则需要null */
struct MipiCsiCntlrDebugMethod *debugs;
/** 控制器上下文参数变量 */
MipiDevCtx ctx;
/** 访问控制器上下文参数变量时锁定 */
OsalSpinlock ctxLock;
/** 操作控制器时锁定方法 */
struct OsalMutex lock;
/** 匿名数据指针,用于存储csi设备结构 */
void *priv;
};
```
- **【重要】** MipiCsiCntlr成员回调函数结构体MipiCsiCntlrMethod的实例化,其他成员在Init函数中初始化。
```c
static struct MipiCsiCntlrMethod g_method = {
.setComboDevAttr = Hi35xxSetComboDevAttr,
.setPhyCmvmode = Hi35xxSetPhyCmvmode,
.setExtDataType = Hi35xxSetExtDataType,
.setHsMode = Hi35xxSetHsMode,
.enableClock = Hi35xxEnableClock,
.disableClock = Hi35xxDisableClock,
.resetRx = Hi35xxResetRx,
.unresetRx = Hi35xxUnresetRx,
.enableSensorClock = Hi35xxEnableSensorClock,
.disableSensorClock = Hi35xxDisableSensorClock,
.resetSensor = Hi35xxResetSensor,
.unresetSensor = Hi35xxUnresetSensor
};
```
- **Init函数参考**
> **入参:**
> HdfDeviceObject 是整个驱动对外暴露的接口参数,具备 HCS 配置文件的信息
>
> **返回值:**
> HDF_STATUS相关状态 (下表为部分展示,如需使用其他状态,可见//drivers/framework/include/utils/hdf_base.h中HDF_STATUS 定义)
>
> | 状态(值) | 问题描述 |
> | :--------------------- | :----------: |
> | HDF_ERR_INVALID_OBJECT | 无效对象 |
> | HDF_ERR_MALLOC_FAIL | 内存分配失败 |
> | HDF_ERR_INVALID_PARAM | 无效参数 |
> | HDF_ERR_IO | I/O 错误 |
> | HDF_SUCCESS | 执行成功 |
> | HDF_FAILURE | 执行失败 |
>
> **函数说明:**
> MipiCsiCntlrMethod的实例化对象的挂载,调用MipiCsiRegisterCntlr,以及其他厂商自定义初始化操作。
```c
static int32_t Hi35xxMipiCsiInit(struct HdfDeviceObject *device)
{
int32_t ret;
HDF_LOGI("%s: enter!", __func__);
g_mipiCsi.priv = NULL; //g_mipiTx是定义的全局变量
//static struct MipiCsiCntlr g_mipiCsi = {
//.devNo = 0
//};
g_mipiCsi.ops = &g_method; //MipiCsiCntlrMethod的实例化对象的挂载
#ifdef CONFIG_HI_PROC_SHOW_SUPPORT
g_mipiCsi.debugs = &g_debugMethod;
#endif
ret = MipiCsiRegisterCntlr(&g_mipiCsi, device); //【必要】调用核心层函数和g_mipiTx初始化核心层全局变量
if (ret != HDF_SUCCESS) {
HDF_LOGE("%s: [MipiCsiRegisterCntlr] failed!", __func__);
return ret;
}
ret = MipiRxDrvInit(); //【必要】厂商对设备的初始化,形式不限
if (ret != HDF_SUCCESS) {
HDF_LOGE("%s: [MipiRxDrvInit] failed.", __func__);
return ret;
}
#ifdef MIPICSI_VFS_SUPPORT
ret = MipiCsiDevModuleInit(g_mipiCsi.devNo);
if (ret != HDF_SUCCESS) {
HDF_LOGE("%s: [MipiCsiDevModuleInit] failed!", __func__);
return ret;
}
#endif
OsalSpinInit(&g_mipiCsi.ctxLock);
HDF_LOGI("%s: load mipi csi driver success!", __func__);
return ret;
}
//mipi_dsi_core.c核心层
int32_t MipiCsiRegisterCntlr(struct MipiCsiCntlr *cntlr, struct HdfDeviceObject *device)
{
...
//定义的全局变量:static struct MipiCsiHandle g_mipiCsihandle[MAX_CNTLR_CNT];
if (g_mipiCsihandle[cntlr->devNo].cntlr == NULL) {
(void)OsalMutexInit(&g_mipiCsihandle[cntlr->devNo].lock);
(void)OsalMutexInit(&(cntlr->lock));
g_mipiCsihandle[cntlr->devNo].cntlr = cntlr; //初始化MipiCsiHandle成员
g_mipiCsihandle[cntlr->devNo].priv = NULL;
cntlr->device = device; //使HdfDeviceObject与MipiCsiHandle可以相互转化的前提
device->service = &(cntlr->service); //使HdfDeviceObject与MipiCsiHandle可以相互转化的前提
cntlr->priv = NULL;
HDF_LOGI("%s: success.", __func__);
return HDF_SUCCESS;
}
HDF_LOGE("%s: cntlr already exists.", __func__);
return HDF_FAILURE;
}
```
- **Release函数参考**
> **入参:**
> HdfDeviceObject 是整个驱动对外暴露的接口参数,具备 HCS 配置文件的信息。
>
> **返回值:**
> 无
>
> **函数说明:**
> 该函数需要在驱动入口结构体中赋值给Release接口,当HDF框架调用Init函数初始化驱动失败时,可以调用Release释放驱动资源,该函数中需包含释放内存和删除控制器等操作。所有强制转换获取相应对象的操作**前提**是在Init函数中具备对应赋值的操作。
```c
static void Hi35xxMipiCsiRelease(struct HdfDeviceObject *device)
{
struct MipiCsiCntlr *cntlr = NULL;
...
cntlr = MipiCsiCntlrFromDevice(device); //这里有HdfDeviceObject到MipiCsiCntlr的强制转化
//return (device == NULL) ? NULL : (struct MipiCsiCntlr *)device->service;
...
OsalSpinDestroy(&cntlr->ctxLock);
#ifdef MIPICSI_VFS_SUPPORT
MipiCsiDevModuleExit(cntlr->devNo);
#endif
MipiRxDrvExit(); //【必要】对厂商设备所占资源的释放
MipiCsiUnregisterCntlr(&g_mipiCsi); //空函数
g_mipiCsi.priv = NULL;
HDF_LOGI("%s: unload mipi csi driver success!", __func__);
}
```
......@@ -96,7 +96,7 @@
使用MIPI-DSI的一般流程如[图2](#fig129103491241)所示。
**图 2** MIPI-DSI使用流程图<a name="fig129103491241"></a>
![](figures/MIPI-DSI使用流程图.png "MIPI-DSI使用流程图")
![](figures/MIPI-DSI使用流程图.png)
### 获取MIPI-DSI操作句柄<a name="section5126155683811"></a>
......@@ -213,7 +213,7 @@ cfg.timingInfo.vsaLines = 76;
cfg.timingInfo.vfpLines = 120;
cfg.timingInfo.xResPixels = 1342;
/* 写入配置数据 */
ret = MipiDsiSetCfg(g_handle, &cfg);
ret = MipiDsiSetCfg(mipiDsiHandle, &cfg);
if (ret != 0) {
HDF_LOGE("%s: SetMipiCfg fail! ret=%d\n", __func__, ret);
return -1;
......@@ -265,7 +265,7 @@ int32\_t MipiDsiGetCfg\(DevHandle handle, struct MipiCfg \*cfg\);
int32_t ret;
struct MipiCfg cfg;
memset(&cfg, 0, sizeof(struct MipiCfg));
ret = MipiDsiGetCfg(g_handle, &cfg);
ret = MipiDsiGetCfg(mipiDsiHandle, &cfg);
if (ret != HDF_SUCCESS) {
HDF_LOGE("%s: GetMipiCfg fail!\n", __func__);
return HDF_FAILURE;
......@@ -409,9 +409,9 @@ if (cmdRead->payload == NULL) {
return HDF_FAILURE;
}
*(cmdRead->payload) = DDIC_REG_STATUS;
MipiDsiSetLpMode(g_handle);
ret = MipiDsiRx(g_handle, cmdRead, sizeof(readVal), &readVal);
MipiDsiSetHsMode(g_handle);
MipiDsiSetLpMode(mipiDsiHandle);
ret = MipiDsiRx(mipiDsiHandle, cmdRead, sizeof(readVal), &readVal);
MipiDsiSetHsMode(mipiDsiHandle);
if (ret != HDF_SUCCESS) {
HDF_LOGE("%s: MipiDsiRx fail! ret=%d\n", __func__, ret);
HdfFree(cmdRead->payload);
......@@ -463,13 +463,13 @@ void PalMipiDsiTestSample(void)
{
uint8_t chnId;
int32_t ret;
DevHandle handle = NULL;
DevHandle mipiDsiHandle = NULL;
/* 设备通道编号 */
chnId = 0;
/* 获取操作句柄 */
handle = MipiDsiOpen(chnId);
if (handle == NULL) {
mipiDsiHandle = MipiDsiOpen(chnId);
if (mipiDsiHandle == NULL) {
HDF_LOGE("MipiDsiOpen: failed!\n");
return;
}
......@@ -490,7 +490,7 @@ void PalMipiDsiTestSample(void)
cfg.timingInfo.vfpLines = 120;
cfg.timingInfo.xResPixels = 1342;
/* 写入配置数据 */
ret = MipiDsiSetCfg(g_handle, &cfg);
ret = MipiDsiSetCfg(mipiDsiHandle, &cfg);
if (ret != 0) {
HDF_LOGE("%s: SetMipiCfg fail! ret=%d\n", __func__, ret);
return;
......@@ -533,9 +533,9 @@ void PalMipiDsiTestSample(void)
return;
}
*(cmdRead->payload) = DDIC_REG_STATUS;
MipiDsiSetLpMode(g_handle);
ret = MipiDsiRx(g_handle, cmdRead, sizeof(readVal), &readVal);
MipiDsiSetHsMode(g_handle);
MipiDsiSetLpMode(mipiDsiHandle);
ret = MipiDsiRx(mipiDsiHandle, cmdRead, sizeof(readVal), &readVal);
MipiDsiSetHsMode(mipiDsiHandle);
if (ret != HDF_SUCCESS) {
HDF_LOGE("%s: MipiDsiRx fail! ret=%d\n", __func__, ret);
HdfFree(cmdRead->payload);
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册