Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
OpenHarmony
Docs
提交
ef3c9f1a
D
Docs
项目概览
OpenHarmony
/
Docs
1 年多 前同步成功
通知
159
Star
292
Fork
28
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
0
列表
看板
标记
里程碑
合并请求
0
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
D
Docs
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
0
Issue
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
Pages
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
提交
Issue看板
提交
ef3c9f1a
编写于
12月 16, 2021
作者:
O
openharmony_ci
提交者:
Gitee
12月 16, 2021
浏览文件
操作
浏览文件
下载
差异文件
!902 Platform driven document supplement
Merge pull request !902 from 尹树清/master
上级
221e2b3a
7c45b3a2
变更
13
展开全部
隐藏空白更改
内联
并排
Showing
13 changed file
with
3141 addition
and
509 deletion
+3141
-509
zh-cn/device-dev/apis/driver/adc_if.h
zh-cn/device-dev/apis/driver/adc_if.h
+85
-0
zh-cn/device-dev/apis/driver/hdmi_if.h
zh-cn/device-dev/apis/driver/hdmi_if.h
+785
-0
zh-cn/device-dev/apis/driver/i3c_if.h
zh-cn/device-dev/apis/driver/i3c_if.h
+236
-0
zh-cn/device-dev/apis/driver/mipi_csi_if.h
zh-cn/device-dev/apis/driver/mipi_csi_if.h
+537
-0
zh-cn/device-dev/driver/Readme-CN.md
zh-cn/device-dev/driver/Readme-CN.md
+2
-0
zh-cn/device-dev/driver/driver-platform-mipicsi-des.md
zh-cn/device-dev/driver/driver-platform-mipicsi-des.md
+777
-0
zh-cn/device-dev/driver/driver-platform-mipicsi-develop.md
zh-cn/device-dev/driver/driver-platform-mipicsi-develop.md
+312
-0
zh-cn/device-dev/driver/driver-platform-mipidsi-des.md
zh-cn/device-dev/driver/driver-platform-mipidsi-des.md
+13
-13
zh-cn/device-dev/driver/driver-platform-pwm-des.md
zh-cn/device-dev/driver/driver-platform-pwm-des.md
+394
-496
zh-cn/device-dev/driver/figures/CSI发送-接收接口.png
zh-cn/device-dev/driver/figures/CSI发送-接收接口.png
+0
-0
zh-cn/device-dev/driver/figures/CSI无服务模式结构图.png
zh-cn/device-dev/driver/figures/CSI无服务模式结构图.png
+0
-0
zh-cn/device-dev/driver/figures/MIPI-CSI使用流程图.png
zh-cn/device-dev/driver/figures/MIPI-CSI使用流程图.png
+0
-0
zh-cn/device-dev/driver/figures/PWM设备使用流程图.png
zh-cn/device-dev/driver/figures/PWM设备使用流程图.png
+0
-0
未找到文件。
zh-cn/device-dev/apis/driver/adc_if.h
0 → 100755
浏览文件 @
ef3c9f1a
/*
* 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 */
zh-cn/device-dev/apis/driver/hdmi_if.h
0 → 100755
浏览文件 @
ef3c9f1a
此差异已折叠。
点击以展开。
zh-cn/device-dev/apis/driver/i3c_if.h
0 → 100755
浏览文件 @
ef3c9f1a
/*
* 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 */
/** @} */
zh-cn/device-dev/apis/driver/mipi_csi_if.h
0 → 100755
浏览文件 @
ef3c9f1a
/*
* 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 */
zh-cn/device-dev/driver/Readme-CN.md
浏览文件 @
ef3c9f1a
...
...
@@ -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
)
...
...
zh-cn/device-dev/driver/driver-platform-mipicsi-des.md
0 → 100755
浏览文件 @
ef3c9f1a
此差异已折叠。
点击以展开。
zh-cn/device-dev/driver/driver-platform-mipicsi-develop.md
0 → 100755
浏览文件 @
ef3c9f1a
# 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__
);
}
```
zh-cn/device-dev/driver/driver-platform-mipidsi-des.md
浏览文件 @
ef3c9f1a
...
...
@@ -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_h
andle, &cfg);
ret = MipiDsiSetCfg(
mipiDsiH
andle, &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_h
andle, &cfg);
ret = MipiDsiGetCfg(
mipiDsiH
andle, &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_h
andle);
ret = MipiDsiRx(
g_h
andle, cmdRead, sizeof(readVal), &readVal);
MipiDsiSetHsMode(
g_h
andle);
MipiDsiSetLpMode(
mipiDsiH
andle);
ret = MipiDsiRx(
mipiDsiH
andle, cmdRead, sizeof(readVal), &readVal);
MipiDsiSetHsMode(
mipiDsiH
andle);
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
h
andle = NULL;
DevHandle
mipiDsiH
andle = NULL;
/* 设备通道编号 */
chnId = 0;
/* 获取操作句柄 */
h
andle = MipiDsiOpen(chnId);
if (
h
andle == NULL) {
mipiDsiH
andle = MipiDsiOpen(chnId);
if (
mipiDsiH
andle == 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_h
andle, &cfg);
ret = MipiDsiSetCfg(
mipiDsiH
andle, &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_h
andle);
ret = MipiDsiRx(
g_h
andle, cmdRead, sizeof(readVal), &readVal);
MipiDsiSetHsMode(
g_h
andle);
MipiDsiSetLpMode(
mipiDsiH
andle);
ret = MipiDsiRx(
mipiDsiH
andle, cmdRead, sizeof(readVal), &readVal);
MipiDsiSetHsMode(
mipiDsiH
andle);
if (ret != HDF_SUCCESS) {
HDF_LOGE("%s: MipiDsiRx fail! ret=%d\n", __func__, ret);
HdfFree(cmdRead->payload);
...
...
zh-cn/device-dev/driver/driver-platform-pwm-des.md
浏览文件 @
ef3c9f1a
此差异已折叠。
点击以展开。
zh-cn/device-dev/driver/figures/CSI发送-接收接口.png
0 → 100755
浏览文件 @
ef3c9f1a
22.7 KB
zh-cn/device-dev/driver/figures/CSI无服务模式结构图.png
0 → 100755
浏览文件 @
ef3c9f1a
39.3 KB
zh-cn/device-dev/driver/figures/MIPI-CSI使用流程图.png
0 → 100755
浏览文件 @
ef3c9f1a
12.8 KB
zh-cn/device-dev/driver/figures/PWM设备使用流程图.png
0 → 100755
浏览文件 @
ef3c9f1a
9.1 KB
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录