diff --git a/zh-cn/device-dev/apis/driver/adc_if.h b/zh-cn/device-dev/apis/driver/adc_if.h new file mode 100755 index 0000000000000000000000000000000000000000..a14cdc5d87fe9a719fde50f7d90b49616c9b8f07 --- /dev/null +++ b/zh-cn/device-dev/apis/driver/adc_if.h @@ -0,0 +1,85 @@ +/* + * 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 */ diff --git a/zh-cn/device-dev/apis/driver/hdmi_if.h b/zh-cn/device-dev/apis/driver/hdmi_if.h new file mode 100755 index 0000000000000000000000000000000000000000..3e3b4bd1a713f6dc5bd608a3851a50b876f347a2 --- /dev/null +++ b/zh-cn/device-dev/apis/driver/hdmi_if.h @@ -0,0 +1,785 @@ +/* + * 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 HDMI + * @{ + * + * @brief 声明基本高清多媒体接口(HDMI)功能的标准API。 + * 您可以使用此模块访问HDMI,并使驱动程序能够操作HDMI接收器设备。 + * 这些功能包括在HDMI上启动和停止传输,设置一些属性,并读取接收器设备的EDID数据。 + * + * @since 1.0 + */ + +/** + * @file hdmi_if.h + * + * @brief 声明标准HDMI接口函数。 + * + * @since 1.0 + */ + +#ifndef HDMI_IF_H +#define HDMI_IF_H + +#include "hdf_platform.h" + +#ifdef __cplusplus +#if __cplusplus +extern "C" { +#endif +#endif /* __cplusplus */ + +/** + * @brief HDMI接收器设备的EDID的最大长度为512字节。 + * + * @since 1.0 + */ +#define HDMI_EDID_MAX_LEN 512 + +/** + * @brief 色深 + * 详见HDMI协议1.4第6.2.4节。 + * + * @since 1.0 + */ +enum HdmiDeepColor { + HDMI_DEEP_COLOR_24BITS = 0, + HDMI_DEEP_COLOR_30BITS = 1, + HDMI_DEEP_COLOR_36BITS = 2, + HDMI_DEEP_COLOR_48BITS = 3, + HDMI_DEEP_COLOR_OFF = 0xff, + HDMI_DEEP_COLOR_BUTT, +}; + +/** + * @brief 视频位深度。 + * 详见HDMI协议1.4第6.6节。 + * + * @since 1.0 + */ +enum HdmiVideoBitDepth { + HDMI_VIDEO_BIT_DEPTH_8 = 0, + HDMI_VIDEO_BIT_DEPTH_10 = 1, + HDMI_VIDEO_BIT_DEPTH_12 = 2, + HDMI_VIDEO_BIT_DEPTH_16 = 3, + HDMI_VIDEO_BIT_DEPTH_OFF, +}; + +/** + * @brief 色彩空间。 + * 详见HDMI协议1.4第6节。 + * + * @since 1.0 + */ +enum HdmiColorSpace { + HDMI_COLOR_SPACE_RGB = 0, + HDMI_COLOR_SPACE_YCBCR422 = 1, + HDMI_COLOR_SPACE_YCBCR444 = 2, + HDMI_COLOR_SPACE_YCBCR420 = 3, + HDMI_COLOR_SPACE_BUTT, +}; + +/** + * @brief 比色法。 + * 详见HDMI协议1.4第6.7节和HDMI协议2.0第7.2节。 + * + * @since 1.0 + */ +enum HdmiColorimetry { + HDMI_COLORIMETRY_NO_DATA = 0, + HDMI_COLORIMETRY_ITU601 = 1, + HDMI_COLORIMETRY_ITU709 = 2, + HDMI_COLORIMETRY_EXTENDED = 3, +}; + +/** + * @brief 扩展比色法。 + * 详见HDMI协议1.4第6.7节和HDMI协议2.0第7.2节。 + * + * @since 1.0 + */ +enum HdmiExtendedColorimetry { + HDMI_EXTENDED_COLORIMETRY_XV_YCC_601 = 0, + HDMI_EXTENDED_COLORIMETRY_XV_YCC_709 = 1, + HDMI_EXTENDED_COLORIMETRY_S_YCC_601 = 2, + HDMI_EXTENDED_COLORIMETRY_OPYCC_601 = 3, + HDMI_EXTENDED_COLORIMETRY_OPRGB = 4, + HDMI_EXTENDED_COLORIMETRY_BT2020_CONST_LUM = 5, + HDMI_EXTENDED_COLORIMETRY_BT2020 = 6, + HDMI_EXTENDED_COLORIMETRY_ADDITIONAL = 7, + HDMI_EXTENDED_COLORIMETRY_BUTT, +}; + +/** + * @brief 量化范围。 + * 详见HDMI协议1.4第6.6节和HDMI协议2.0第7.3节。 + * + * @since 1.0 + */ +enum HdmiQuantizationRange { + HDMI_QUANTIZATION_RANGE_DEFAULT = 0, + HDMI_QUANTIZATION_RANGE_LIMITED = 1, + HDMI_QUANTIZATION_RANGE_FULL = 2, + HDMI_QUANTIZATION_RANGE_BUTT, +}; + +/** + * @brief YCC量化范围。 + * 详见HDMI协议1.4第6.6节和HDMI协议2.0第7.3节。 + * + * @since 1.0 + */ +enum HdmiYccQuantizationRange { + HDMI_YCC_QUANTIZATION_RANGE_LIMITED = 0, + HDMI_YCC_QUANTIZATION_RANGE_FULL = 1, + HDMI_YCC_QUANTIZATION_RANGE_BUTT, +}; + +/** + * @brief 视频三维结构。 + * 详见HDMI协议1.4第8.2.3节。 + * + * @since 1.0 + */ +enum HdmiVideo3dStructure { + HDMI_VS_VIDEO_3D_FRAME_PACKING = 0, + HDMI_VS_VIDEO_3D_FIELD_ALTERNATIVE = 1, + HDMI_VS_VIDEO_3D_LINE_ALTERNATIVE = 2, + HDMI_VS_VIDEO_3D_SIDE_BY_SIDE_FULL = 3, + HDMI_VS_VIDEO_3D_L_DEPTH = 4, + HDMI_VS_VIDEO_3D_L_DEPTH_GFX_GFX_DEPTH = 5, + HDMI_VS_VIDEO_3D_TOP_AND_BOTTOM = 6, + HDMI_VS_VIDEO_3D_SIDE_BY_SIDE_HALF = 8, + HDMI_VS_VIDEO_3D_BUTT, +}; + +/** + * @brief 影像时序。 + * 详见HDMI协议1.4第8.2.3节。 + * + * @since 1.0 + */ +enum HdmiVideoTiming { + HDMI_VIDEO_TIMING_NONE = 0, + HDMI_VIDEO_TIMING_640X480P60 = 1, + HDMI_VIDEO_TIMING_720X480P60 = 2, + HDMI_VIDEO_TIMING_720X480P120 = 3, + HDMI_VIDEO_TIMING_720X480P240 = 4, + HDMI_VIDEO_TIMING_720X576P50 = 5, + HDMI_VIDEO_TIMING_720X576P100 = 6, + HDMI_VIDEO_TIMING_720X576P200 = 7, + HDMI_VIDEO_TIMING_1280X720P24 = 8, + HDMI_VIDEO_TIMING_1280X720P25 = 9, + HDMI_VIDEO_TIMING_1280X720P30 = 10, + HDMI_VIDEO_TIMING_1280X720P48 = 11, + HDMI_VIDEO_TIMING_1280X720P50 = 12, + HDMI_VIDEO_TIMING_1280X720P60 = 13, + HDMI_VIDEO_TIMING_1280X720P100 = 14, + HDMI_VIDEO_TIMING_1280X720P120 = 15, + HDMI_VIDEO_TIMING_1440X240P60 = 16, + HDMI_VIDEO_TIMING_1440X288P50 = 17, + HDMI_VIDEO_TIMING_1440X480I60 = 18, + HDMI_VIDEO_TIMING_1440X480P60 = 19, + HDMI_VIDEO_TIMING_1440X480I120 = 20, + HDMI_VIDEO_TIMING_1440X480I240 = 21, + HDMI_VIDEO_TIMING_1440X576I50 = 22, + HDMI_VIDEO_TIMING_1440X576P50 = 23, + HDMI_VIDEO_TIMING_1440X576I60 = 24, + HDMI_VIDEO_TIMING_1440X576I100 = 25, + HDMI_VIDEO_TIMING_1440X576I200 = 26, + HDMI_VIDEO_TIMING_2880X288P50 = 27, + HDMI_VIDEO_TIMING_2880X480I60 = 28, + HDMI_VIDEO_TIMING_2880X480P60 = 29, + HDMI_VIDEO_TIMING_2880X240I60 = 30, + HDMI_VIDEO_TIMING_2880X576I50 = 31, + HDMI_VIDEO_TIMING_2880X576P50 = 32, + HDMI_VIDEO_TIMING_1680X720P24 = 33, + HDMI_VIDEO_TIMING_1680X720P25 = 34, + HDMI_VIDEO_TIMING_1680X720P30 = 35, + HDMI_VIDEO_TIMING_1680X720P48 = 36, + HDMI_VIDEO_TIMING_1680X720P50 = 37, + HDMI_VIDEO_TIMING_1680X720P60 = 38, + HDMI_VIDEO_TIMING_1680X720P100 = 39, + HDMI_VIDEO_TIMING_1680X720P120 = 40, + HDMI_VIDEO_TIMING_2560X1080P24 = 41, + HDMI_VIDEO_TIMING_2560X1080P25 = 42, + HDMI_VIDEO_TIMING_2560X1080P30 = 43, + HDMI_VIDEO_TIMING_2560X1080P48 = 44, + HDMI_VIDEO_TIMING_2560X1080P50 = 45, + HDMI_VIDEO_TIMING_2560X1080P60 = 46, + HDMI_VIDEO_TIMING_2560X1080P100 = 47, + HDMI_VIDEO_TIMING_2560X1080P120 = 48, + HDMI_VIDEO_TIMING_1920X1080I60 = 49, + HDMI_VIDEO_TIMING_1920X1080P60 = 50, + HDMI_VIDEO_TIMING_1920X1080I50 = 51, + HDMI_VIDEO_TIMING_1920X1080P50 = 52, + HDMI_VIDEO_TIMING_1920X1080P24 = 53, + HDMI_VIDEO_TIMING_1920X1080P25 = 54, + HDMI_VIDEO_TIMING_1920X1080P30 = 55, + HDMI_VIDEO_TIMING_1920X1080P48 = 56, + HDMI_VIDEO_TIMING_1920X1080I100 = 57, + HDMI_VIDEO_TIMING_1920X1080I120 = 58, + HDMI_VIDEO_TIMING_1920X1080P120 = 59, + HDMI_VIDEO_TIMING_1920X1080P100 = 60, + HDMI_VIDEO_TIMING_3840X2160P24 = 61, + HDMI_VIDEO_TIMING_3840X2160P25 = 62, + HDMI_VIDEO_TIMING_3840X2160P30 = 63, + HDMI_VIDEO_TIMING_3840X2160P48 = 64, + HDMI_VIDEO_TIMING_3840X2160P50 = 65, + HDMI_VIDEO_TIMING_3840X2160P60 = 66, + HDMI_VIDEO_TIMING_3840X2160P100 = 67, + HDMI_VIDEO_TIMING_3840X2160P120 = 68, + HDMI_VIDEO_TIMING_4096X2160P24 = 69, + HDMI_VIDEO_TIMING_4096X2160P25 = 70, + HDMI_VIDEO_TIMING_4096X2160P30 = 71, + HDMI_VIDEO_TIMING_4096X2160P48 = 72, + HDMI_VIDEO_TIMING_4096X2160P50 = 73, + HDMI_VIDEO_TIMING_4096X2160P60 = 74, + HDMI_VIDEO_TIMING_4096X2160P100 = 75, + HDMI_VIDEO_TIMING_4096X2160P120 = 76, + HDMI_VIDEO_TIMING_5120X2160P24 = 77, + HDMI_VIDEO_TIMING_5120X2160P25 = 78, + HDMI_VIDEO_TIMING_5120X2160P30 = 79, + HDMI_VIDEO_TIMING_5120X2160P48 = 80, + HDMI_VIDEO_TIMING_5120X2160P50 = 81, + HDMI_VIDEO_TIMING_5120X2160P60 = 82, + HDMI_VIDEO_TIMING_5120X2160P100 = 83, + HDMI_VIDEO_TIMING_5120X2160P120 = 84, + HDMI_VIDEO_TIMING_7680X4320P24 = 85, + HDMI_VIDEO_TIMING_7680X4320P25 = 86, + HDMI_VIDEO_TIMING_7680X4320P30 = 87, + HDMI_VIDEO_TIMING_7680X4320P48 = 88, + HDMI_VIDEO_TIMING_7680X4320P50 = 89, + HDMI_VIDEO_TIMING_7680X4320P60 = 90, + HDMI_VIDEO_TIMING_7680X4320P100 = 91, + HDMI_VIDEO_TIMING_7680X4320P120 = 92, + HDMI_VIDEO_TIMING_10240X4320P24 = 93, + HDMI_VIDEO_TIMING_10240X4320P25 = 94, + HDMI_VIDEO_TIMING_10240X4320P30 = 95, + HDMI_VIDEO_TIMING_10240X4320P48 = 96, + HDMI_VIDEO_TIMING_10240X4320P50 = 97, + HDMI_VIDEO_TIMING_10240X4320P60 = 98, + HDMI_VIDEO_TIMING_10240X4320P100 = 99, + HDMI_VIDEO_TIMING_10240X4320P120 = 100, + HDMI_VIDEO_TIMING_VESA_DEFINE = 101, + HDMI_VIDEO_TIMING_VESA_800X600_60 = 102, + HDMI_VIDEO_TIMING_VESA_848X480_60 = 103, + HDMI_VIDEO_TIMING_VESA_1024X768_60 = 104, + HDMI_VIDEO_TIMING_VESA_1280X720_60 = 105, + HDMI_VIDEO_TIMING_VESA_1280X768_60 = 106, + HDMI_VIDEO_TIMING_VESA_1280X768_60_RB = 107, + HDMI_VIDEO_TIMING_VESA_1280X800_60 = 108, + HDMI_VIDEO_TIMING_VESA_1280X800_60_RB = 109, + HDMI_VIDEO_TIMING_VESA_1280X960_60 = 110, + HDMI_VIDEO_TIMING_VESA_1280X1024_60 = 111, + HDMI_VIDEO_TIMING_VESA_1360X768_60 = 112, + HDMI_VIDEO_TIMING_VESA_1366X768_60 = 113, + HDMI_VIDEO_TIMING_VESA_1400X1050_60 = 114, + HDMI_VIDEO_TIMING_VESA_1440X900_60 = 115, + HDMI_VIDEO_TIMING_VESA_1440X900_60_RB = 116, + HDMI_VIDEO_TIMING_VESA_1440X1050_60 = 117, + HDMI_VIDEO_TIMING_VESA_1440X1050_60_RB = 118, + HDMI_VIDEO_TIMING_VESA_1600X900_60_RB = 119, + HDMI_VIDEO_TIMING_VESA_1600X1200_60 = 120, + HDMI_VIDEO_TIMING_VESA_1680X1050_60 = 113, + HDMI_VIDEO_TIMING_VESA_1680X1050_60_RB = 114, + HDMI_VIDEO_TIMING_VESA_1792X1344_60 = 115, + HDMI_VIDEO_TIMING_VESA_1856X1392_60 = 116, + HDMI_VIDEO_TIMING_VESA_1920X1080_60 = 117, + HDMI_VIDEO_TIMING_VESA_1920X1200_60 = 118, + HDMI_VIDEO_TIMING_VESA_1920X1200_60_RB = 119, + HDMI_VIDEO_TIMING_VESA_1920X1440_60 = 120, + HDMI_VIDEO_TIMING_VESA_2048X1152_60 = 121, + HDMI_VIDEO_TIMING_VESA_2560X1440_60_RB = 122, + HDMI_VIDEO_TIMING_VESA_2560X1600_60 = 123, + HDMI_VIDEO_TIMING_VESA_2560X1600_60_RB = 124, + HDMI_VIDEO_TIMING_USER_DEFINE = 125, + HDMI_VIDEO_TIMING_USER_1920X2160_30 = 126, + HDMI_VIDEO_TIMING_USER_2560X1440_30 = 127, + HDMI_VIDEO_TIMING_USER_2560X1440_60 = 128, + HDMI_VIDEO_TIMING_USER_1280X720_60 = 129, + HDMI_VIDEO_TIMING_USER_1366X768_60 = 130, + HDMI_VIDEO_TIMING_USER_1600X900_60_RB = 131, + HDMI_VIDEO_TIMING_USER_1920X1080_60 = 132, + HDMI_VIDEO_TIMING_USER_2048X1152_60 = 133, + HDMI_VIDEO_TIMING_BUTT, +}; + +/** + * @brief 图片的纵横比。 + * 详见HDMI协议1.4第8.2.1节。 + * + * @since 1.0 + */ +enum HdmiPictureAspectRatio { + HDMI_PICTURE_ASPECT_NO_DATA = 0, + HDMI_PICTURE_ASPECT_4_3 = 1, + HDMI_PICTURE_ASPECT_16_9 = 2, + HDMI_PICTURE_ASPECT_64_27 = 3, + HDMI_PICTURE_ASPECT_256_135 = 4, + HDMI_PICTURE_ASPECT_BUTT = 5, +}; + +/** + * @brief 活动格式的长宽比。 + * 详见HDMI协议1.4第8.2.1节。 + * + * @since 1.0 + */ +enum HdmiActiveFormatAspectRatio { + HDMI_ACTIVE_FORMAT_ASPECT_16_9_TOP = 2, + HDMI_ACTIVE_FORMAT_ASPECT_14_9_TOP = 3, + HDMI_ACTIVE_FORMAT_ASPECT_16_9_CENTER = 4, + HDMI_ACTIVE_FORMAT_ASPECT_PICTURE = 8, + HDMI_ACTIVE_FORMAT_ASPECT_4_3 = 9, + HDMI_ACTIVE_FORMAT_ASPECT_16_9 = 10, + HDMI_ACTIVE_FORMAT_ASPECT_14_9 = 11, + HDMI_ACTIVE_FORMAT_ASPECT_4_3_SP_14_9 = 13, + HDMI_ACTIVE_FORMAT_ASPECT_16_9_SP_14_9 = 14, + HDMI_ACTIVE_FORMAT_ASPECT_16_9_SP_4_3 = 15, + HDMI_ACTIVE_FORMAT_ASPECT_BUTT, +}; + +/** + * @brief NUP(非均匀图片缩放)。 + * 详见HDMI协议1.4第8.2.1节。 + * + * @since 1.0 + */ +enum HdmiNups { + HDMI_NUPS_UNKNOWN = 0, /* 没有已知的非均匀缩放 */ + HDMI_NUPS_HORIZONTAL = 1, /* 图片已水平缩放 */ + HDMI_NUPS_VERTICAL = 2, /* 图片已垂直缩放 */ + HDMI_NUPS_BOTH = 3, /* 图片已水平和垂直缩放 */ +}; + +/** + * @brief 定义视频属性结构。 + * + * @since 1.0 + */ +struct HdmiVideoAttr { + uint32_t tmdsClock; /* 单位:千赫 */ + uint32_t pixelClock; /* 单位:千赫 */ + uint32_t pixelRepeat; + enum HdmiColorSpace colorSpace; + enum HdmiColorimetry colorimetry; + enum HdmiExtendedColorimetry extColorimetry; + enum HdmiQuantizationRange quantization; + enum HdmiYccQuantizationRange yccQuantization; + enum HdmiDeepColor deepColor; + enum HdmiVideo3dStructure _3dStruct; + enum HdmiVideoTiming timing; + enum HdmiPictureAspectRatio aspect; + enum HdmiActiveFormatAspectRatio activeAspect; + enum HdmiNups nups; + bool xvycc; +}; + +/** + * @brief 音频编码类型。 + * 详见HDMI协议1.4第7节。 + * + * @since 1.0 + */ +enum HdmiAudioCodingType { + HDMI_AUDIO_CODING_TYPE_STREAM = 0, + HDMI_AUDIO_CODING_TYPE_LPCM = 1, + HDMI_AUDIO_CODING_TYPE_AC3 = 2, + HDMI_AUDIO_CODING_TYPE_MPEG1 = 3, + HDMI_AUDIO_CODING_TYPE_MP3 = 4, + HDMI_AUDIO_CODING_TYPE_MPEG2 = 5, + HDMI_AUDIO_CODING_TYPE_AAC_LC = 6, + HDMI_AUDIO_CODING_TYPE_DTS = 7, + HDMI_AUDIO_CODING_TYPE_ATRAC = 8, + HDMI_AUDIO_CODING_TYPE_OBA = 9, + HDMI_AUDIO_CODING_TYPE_EAC3 = 10, + HDMI_AUDIO_CODING_TYPE_DTS_HD = 11, + HDMI_AUDIO_CODING_TYPE_MLP = 12, + HDMI_AUDIO_CODING_TYPE_DST = 13, + HDMI_AUDIO_CODING_TYPE_WMA_PRO = 14, + HDMI_AUDIO_CODING_TYPE_CXT = 15, +}; + +/** + * @brief 音频接口类型。 + * + * @since 1.0 + */ +enum HdmiAudioInterfaceType { + HDMI_AUDIO_IF_TYPE_I2S = 0, /* I2S总线 */ + HDMI_AUDIO_IF_TYPE_SPDIF = 1, /* 索尼/飞利浦数字接口 */ + HDMI_AUDIO_IF_TYPE_OTHER, +}; + +/** + * @brief 音频位深度。 + * 详见HDMI协议1.4第7节。 + * + * @since 1.0 + */ +enum HdmiAudioBitDepth { + HDMI_ADIO_BIT_DEPTH_UNKNOWN, + HDMI_ADIO_BIT_DEPTH_8 = 8, + HDMI_ADIO_BIT_DEPTH_16 = 16, + HDMI_ADIO_BIT_DEPTH_18 = 18, + HDMI_ADIO_BIT_DEPTH_20 = 20, + HDMI_ADIO_BIT_DEPTH_24 = 24, + HDMI_ADIO_BIT_DEPTH_32 = 32, + HDMI_ADIO_BIT_DEPTH_BUTT, +}; + +/** + * @brief 用于音频的采样率。 + * 详见HDMI协议1.4第7.3节。 + * + * @since 1.0 + */ +enum HdmiSampleRate { + HDMI_SAMPLE_RATE_UNKNOWN, + HDMI_SAMPLE_RATE_8K = 8000, + HDMI_SAMPLE_RATE_11K = 11025, + HDMI_SAMPLE_RATE_12K = 12000, + HDMI_SAMPLE_RATE_16K = 16000, + HDMI_SAMPLE_RATE_22K = 22050, + HDMI_SAMPLE_RATE_24K = 24000, + HDMI_SAMPLE_RATE_32K = 32000, + HDMI_SAMPLE_RATE_44K = 44100, + HDMI_SAMPLE_RATE_48K = 48000, + HDMI_SAMPLE_RATE_88K = 88200, + HDMI_SAMPLE_RATE_96K = 96000, + HDMI_SAMPLE_RATE_176K = 176400, + HDMI_SAMPLE_RATE_192K = 192000, + HDMI_SAMPLE_RATE_768K = 768000, + HDMI_SAMPLE_RATE_BUTT, +}; + +/** + * @brief 音频格式通道。 + * 详见HDMI协议1.4第7节。 + * + * @since 1.0 + */ +enum HdmiAudioFormatChannel { + HDMI_AUDIO_FORMAT_CHANNEL_2 = 2, + HDMI_AUDIO_FORMAT_CHANNEL_3, + HDMI_AUDIO_FORMAT_CHANNEL_4, + HDMI_AUDIO_FORMAT_CHANNEL_5, + HDMI_AUDIO_FORMAT_CHANNEL_6, + HDMI_AUDIO_FORMAT_CHANNEL_7, + HDMI_AUDIO_FORMAT_CHANNEL_8, + HDMI_AUDIO_FORMAT_CHANNEL_BUTT, +}; + +/** + * @brief 定义音频属性结构。 + * + * @since 1.0 + */ +struct HdmiAudioAttr { + enum HdmiAudioCodingType codingType; + enum HdmiAudioInterfaceType ifType; + enum HdmiAudioBitDepth bitDepth; + enum HdmiSampleRate sampleRate; + bool downSample; + enum HdmiAudioFormatChannel channels; +}; + +/** + * @brief 电光传递函数(EOTF)。 + * 详见CTA-861-G第6.9节。 + * + * @since 1.0 + */ +enum HdmiEotfType { + HDMI_EOTF_SDR_LUMIN = 0, /* 传统gamma-SDR亮度范围 */ + HDMI_EOTF_HDR_LUMIN = 1, /* 传统gamma-HDR亮度范围 */ + HDMI_EOTF_SMPTE_ST_2048 = 2, /* SMPTE ST 2048 */ + HDMI_EOTF_HLG = 3, /* 基于ITU-R BT.2100-0的混合对数伽马(HLG) */ + HDMI_EOTF_BUTT, +}; + +/** + * @brief hdr色度计。 + * 详见HDMI协议2.1。 + * + * @since 1.0 + */ +enum HdmiHdrColormetry { + HDMI_HDR_COLORIMETRY_NONE, + HDMI_HDR_COLORIMETRY_ITU_601, + HDMI_HDR_COLORIMETRY_ITU_709, + HDMI_HDR_COLORIMETRY_EXTENDED, + HDMI_HDR_EXTENDED_COLORIMETRY_XV_YCC_601, + HDMI_HDR_EXTENDED_COLORIMETRY_XV_YCC_709, + HDMI_HDR_EXTENDED_COLORIMETRY_S_YCC_601, + HDMI_HDR_EXTENDED_COLORIMETRY_ADOBE_YCC_601, + HDMI_HDR_EXTENDED_COLORIMETRY_ADOBE_RGB, + HDMI_HDR_EXTENDED_COLORIMETRY_2020_CONST_LUMINOUS, /* BT2020 c_ycc */ + HDMI_HDR_EXTENDED_COLORIMETRY_2020_NON_CONST_LUMINOUW +}; + +/** + * @brief hdr模式。 + * 详见HDMI协议2.1。 + * + * @since 1.0 + */ +enum HdmiHdrMode { + HDMI_HDR_MODE_DISABLE, /* HDR和杜比模式禁用 */ + HDMI_HDR_MODE_DOLBY_NORMAL, /* 杜比正常(ycbcr422-12位)模式启用 */ + HDMI_HDR_MODE_DOLBY_TUNNELING, /* 杜比隧道(RGB-8bit)模式启用 */ + HDMI_HDR_MODE_CEA_861_3, /* HDR标准模式启用(根据) */ + HDMI_HDR_MODE_CEA_861_3_AUTHEN, /* HDR授权模式 */ + HDMI_HDR_MODE_BUTT +}; + +/** + * @brief hdr用户模式。 + * 详见HDMI协议2.1。 + * + * @since 1.0 + */ +enum HdmiHdrUserMode { + HDMI_HDR_USERMODE_SDR, + HDMI_HDR_USERMODE_HDR10, + HDMI_HDR_USERMODE_DOLBY, + HDMI_HDR_USERMODE_BUTT +}; + +/** + * @brief 静态元数据类型。 + * 详见CTA-861-G第6.9节。 + * + * @since 1.0 + */ +enum HdmiStaticMetadataType { + HDMI_DRM_STATIC_METADATA_TYPE_1 = 0, /* 静态元数据类型1 */ + HDMI_DRM_STATIC_METADATA_BUTT, +}; + +/** + * @brief 静态元数据描述符1st。 + * 详见CTA-861-G第6.9节。 + * + * @since 1.0 + */ +struct HdmiStaticMetadataDescriptor1st { + uint16_t displayPrimaries0X; /* display_primaries_x[0], in units of 0.00002 */ + uint16_t displayPrimaries0Y; /* display_primaries_y[0], in units of 0.00002 */ + uint16_t displayPrimaries1X; /* display_primaries_x[1], in units of 0.00002 */ + uint16_t displayPrimaries1Y; /* display_primaries_y[1], in units of 0.00002 */ + uint16_t displayPrimaries2X; /* display_primaries_x[2], in units of 0.00002 */ + uint16_t displayPrimaries2Y; /* display_primaries_y[2], in units of 0.00002 */ + uint16_t whitePointX; /* white_point_x, in units of 0.00002 */ + uint16_t whitePointY; /* white_point_y, in units of 0.00002 */ + uint16_t maxDisplayMasteringLuminance; /* max_display_mastering_luminance, in units of 1 cd/m^2 */ + uint16_t minDisplayMasteringLuminance; /* min_display_mastering_luminance, in units of 0.0001 cd/m^2 */ + uint16_t maxContentLightLevel; /* Maximum Content Light Level, in units of 1 cd/m^2 */ + uint16_t maxFrameAverageLightLevel; /* Maximum Frame-average Light Level, in units of 1 cd/m^2 */ +}; + +/** + * @brief 定义静态元数据描述符。 + * 详见CTA-861-G第6.9节。 + * + * @since 1.0 + */ +union HdmiStaticMetadataDescriptor { + struct HdmiStaticMetadataDescriptor1st type1; +}; + +/** + * @brief 定义hdr属性结构。 + * + * @since 1.0 + */ +struct HdmiHdrAttr { + enum HdmiHdrMode mode; + enum HdmiHdrUserMode userMode; + /* 当模式为HDMI_HDR_mode_CEA_861_3时,以下成员有效 */ + enum HdmiEotfType eotfType; + enum HdmiStaticMetadataType metadataType; + union HdmiStaticMetadataDescriptor descriptor; + enum HdmiHdrColormetry colorimetry; +}; + +/** + * @brief 定义hdmi HPD(热插拔检测)回调信息。 + * + * @since 1.0 + */ +struct HdmiHpdCallbackInfo { + void *data; + void (*callbackFunc)(void *data, bool hdp); +}; + +/** + * @brief 打开具有指定总线号的HDMI控制器。 + * 在使用HDMI接口之前,您可以获取HDMI控制器的设备句柄。 + * 通过调用HdmiOpen,此函数与HdmiClose成对使用。 + * + * @param busNum 总线号。 + * + * @return 如果操作成功,则返回HDMI控制器的设备句柄DevHandle;否则返回NULL。 + * + * @since 1.0 + */ +DevHandle HdmiOpen(uint16_t busNum); + +/** + * @brief 启动HDMI传输。 + * 此函数与HdmiStop成对使用。 + * + * @param handle 指向HDMI控制器的设备句柄的指针。 + * + * @return 如果操作成功,则返回0;如果操作失败,则返回负值。 + * + * @since 1.0 + */ +int32_t HdmiStart(DevHandle handle); + +/** + * @brief 停止HDMI传输。 + * 此函数与HdmiStart成对使用。 + * + * @param handle 指向HDMI控制器的设备句柄的指针。 + * + * @return 如果操作成功,则返回0;如果操作失败,则返回负值。 + * + * @since 1.0 + */ +int32_t HdmiStop(DevHandle handle); + +/** + * @brief HDMI声音图像消隐设置。 + * 首先将显示设备置于黑屏静音状态,等待HDMI输出设备开关。接着发送清除AVMute信号,启动显示设备。通过此设置,切换过程中的花屏现象将会被屏蔽掉。 + * + * @param handle 指向HDMI控制器的设备句柄的指针。 + * @param enable 是否启用avmute。 + * + * @return 如果操作成功,则返回0;如果操作失败,则返回负值。 + * + * @since 1.0 + */ +int32_t HdmiAvmuteSet(DevHandle handle, bool enable); + +/** + * @brief 设置色深。 + * + * @param handle 指向HDMI控制器的设备句柄的指针。 + * @param color 要设置的色深,请参见HdmiDeepColor。 + * + * @return 如果操作成功,则返回0;如果操作失败,则返回负值。 + * + * @since 1.0 + */ +int32_t HdmiDeepColorSet(DevHandle handle, enum HdmiDeepColor color); + +/** + * @brief 获取色深。 + * + * @param handle 指向HDMI控制器的设备句柄的指针。 + * @param color 指向要获取的色深的指针,请参见HdmiDeepColor。 + * + * @return 如果操作成功,则返回0;如果操作失败,则返回负值。 + * + * @since 1.0 + */ +int32_t HdmiDeepColorGet(DevHandle handle, enum HdmiDeepColor *color); + +/** + * @brief 设置视频属性。 + * + * @param handle 指向HDMI控制器的设备句柄的指针。 + * @param attr 指向要设置的视频属性的指针,请参见HdmiVideoAttr。 + * + * @return 如果操作成功,则返回0;如果操作失败,则返回负值。 + * + * @since 1.0 + */ +int32_t HdmiSetVideoAttribute(DevHandle handle, struct HdmiVideoAttr *attr); + +/** + * @brief 设置音频属性。 + * + * @param handle 指向HDMI控制器的设备句柄的指针。 + * @param attr 指向要设置的音频属性的指针,请参见HdmiAudioAttr。 + * + * @return 如果操作成功,则返回0;如果操作失败,则返回负值。 + * + * @since 1.0 + */ +int32_t HdmiSetAudioAttribute(DevHandle handle, struct HdmiAudioAttr *attr); + +/** + * @brief 设置HDR属性。 + * + * @param handle 指向HDMI控制器的设备句柄的指针。 + * @param attr 指向要设置的hdr属性的指针,请参见HdmiHdrAttr。 + * + * @return 如果操作成功,则返回0;如果操作失败,则返回负值。 + * + * @since 1.0 + */ +int32_t HdmiSetHdrAttribute(DevHandle handle, struct HdmiHdrAttr *attr); + +/** + * @brief HDMI读取接收器设备的原始EDID数据。 + * + * @param handle 指向HDMI控制器的设备句柄的指针。 + * @param buffer 指向要读取的数据的指针。 + * @param len 要读取的数据的长度。 + * + * @return 如果操作成功,返回读取数据的长度;如果操作失败,则返回负值或0。 + * + * @since 1.0 + */ +int32_t HdmiReadSinkEdid(DevHandle handle, uint8_t *buffer, uint32_t len); + +/** + * @brief 注册HPD(热插拔检测)回调函数。 + * + * @param handle 指向HDMI控制器的设备句柄的指针。 + * @param callback 指向回调信息的指针。 + * + * @return 如果操作成功,则返回0;如果操作失败,则返回负值。 + * + * @since 1.0 + */ +int32_t HdmiRegisterHpdCallbackFunc(DevHandle handle, struct HdmiHpdCallbackInfo *callback); + +/** + * @brief HDMI注销HPD(热插拔检测)回调函数。 + * + * @param handle 指向HDMI控制器的设备句柄的指针。 + * + * @return 如果操作成功,则返回0;如果操作失败,则返回负值。 + * @since 1.0 + */ +int32_t HdmiUnregisterHpdCallbackFunc(DevHandle handle); + +/** + * @brief 关闭HDMI控制器。 + * 使用HDMI接口后,可以通过调用HdmiClose关闭HDMI控制器。此函数与HdmiOpen成对使用。 + * + * @param handle 指向HDMI控制器的设备句柄的指针。 + * + * @since 1.0 + */ +void HdmiClose(DevHandle handle); + +#ifdef __cplusplus +#if __cplusplus +} +#endif +#endif /* __cplusplus */ + +#endif /* HDMI_IF_H */ diff --git a/zh-cn/device-dev/apis/driver/i3c_if.h b/zh-cn/device-dev/apis/driver/i3c_if.h new file mode 100755 index 0000000000000000000000000000000000000000..6130b13920b99e23029d31516e6e7edcb6dea1e9 --- /dev/null +++ b/zh-cn/device-dev/apis/driver/i3c_if.h @@ -0,0 +1,236 @@ +/* + * 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 */ +/** @} */ diff --git a/zh-cn/device-dev/apis/driver/mipi_csi_if.h b/zh-cn/device-dev/apis/driver/mipi_csi_if.h new file mode 100755 index 0000000000000000000000000000000000000000..e5f169e0aa18863b3e0d1bf667b14b4997481486 --- /dev/null +++ b/zh-cn/device-dev/apis/driver/mipi_csi_if.h @@ -0,0 +1,537 @@ +/* + * 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 */ diff --git a/zh-cn/device-dev/driver/Readme-CN.md b/zh-cn/device-dev/driver/Readme-CN.md index 17116f4e45cb37b89953e10d828a63f229c8c7a1..07b7835b944af5b4f48e54d5f100d69d9bad6f5b 100755 --- a/zh-cn/device-dev/driver/Readme-CN.md +++ b/zh-cn/device-dev/driver/Readme-CN.md @@ -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) diff --git a/zh-cn/device-dev/driver/driver-platform-mipicsi-des.md b/zh-cn/device-dev/driver/driver-platform-mipicsi-des.md new file mode 100755 index 0000000000000000000000000000000000000000..4c5903b4d6c6a9f8b0e5af09f0e0b98355905e08 --- /dev/null +++ b/zh-cn/device-dev/driver/driver-platform-mipicsi-des.md @@ -0,0 +1,777 @@ +# MIPI CSI + +- [概述](#section1_MIPI_CSIDes) + - [ComboDevAttr结构体](#section1.1_MIPI_CSIDes) + - [ExtDataType结构体](#section1.2_MIPI_CSIDes) + - [接口说明](#section1.3_MIPI_CSIDes) + +- [使用指导](#section2_MIPI_CSIDes) + - [使用流程](#section2.1_MIPI_CSIDes) + - [获取MIPI-CSI控制器操作句柄](#section2.2_MIPI_CSIDes) + - [MIPI-CSI相应配置](#section2.3_MIPI_CSIDes) + - [复位/撤销复位sensor](#section2.4_MIPI_CSIDes) + - [复位/撤销复位MIPI RX](#section2.5_MIPI_CSIDes) + - [使能/关闭MIPI的时钟](#section2.6_MIPI_CSIDes) + - [使能/关闭MIPI上的sensor时钟](#section2.7_MIPI_CSIDes) + - [释放MIPI-CSI控制器操作句柄](#section2.8_MIPI_CSIDes) +- [使用实例](#section3_MIPI_CSIDes) + +## 概述 + +- CSI(Camera Serial Interface)是由MIPI联盟下Camera工作组指定的接口标准。CSI-2是MIPI CSI第二版,主要由应用层、协议层、物理层组成,最大支持4通道数据传输、单线传输速度高达1Gb/s。 + +- 物理层支持HS(High Speed)和LP(Low Power)两种工作模式。HS模式下采用低压差分信号,功耗较大,但数据传输速率可以很高(数据速率为80M~1Gbps);LP模式下采用单端信号,数据速率很低(<10Mbps),但是相应的功耗也很低。两种模式的结合保证了MIPI总线在需要传输大量数据(如图像)时可以高速传输,而在不需要传输大数据量时又能够减少功耗。 + +- 图1显示了简化的CSI接口。D-PHY采用1对源同步的差分时钟和1~4对差分数据线来进行数据传输。数据传输采用DDR方式,即在时钟的上下边沿都有数据传输。 + + **图 1** CSI发送、接收接口 + ![](figures/CSI发送-接收接口.png) + +### ComboDevAttr结构体 + +**表** **1** ComboDevAttr结构体介绍 + + + +| 名称 | 描述 | +| --------- | ----------------------------------------------------- | +| devno | 设备号 | +| inputMode | 输入模式:MIPI/LVDS/SUBSLVDS/HISPI/DC | +| dataRate | Mipi Rx,SLVS输入速率 | +| imgRect | MIPI Rx设备裁剪区域(与原始传感器输入图像大小相对应) | +| MIPIAttr | Mipi设备属性 | +| lvdsAttr | LVDS/SubLVDS/HiSPi设备属性 | + +### ExtDataType结构体 + +**表** **2** ExtDataType结构体介绍 + + + +| 名称 | 描述 | +| --------------- | ------------------------------- | +| devno | 设备号 | +| num | sensor号 | +| extDataBitWidth | 图片的位深 | +| extDataType | 定义YUV和原始数据格式以及位深度 | + +### 接口说明 + +**表 3** MIPI-CSI API接口功能介绍 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
功能分类接口名描述
获取/释放MIPI-CSI控制器操作句柄MipiCsiOpen获取MIPI-CSI控制器操作句柄
MipiCsiClose释放MIPI-CSI控制器操作句柄
MIPI-CSI相应配置MipiCsiSetComboDevAttr设置MIPI,CMOS 或者 + LVDS相机的参数给控制器,参数包括工作模式,图像区域,图像深度,数据速率和物理通道等
MipiCsiSetExtDataType(可选)设置YUV和RAW数据格式和位深
MipiCsiSetHsMode设置MIPI RX的 Lane + 分布。根据硬件连接的形式选择具体的mode
MipiCsiSetPhyCmvmode设置共模电压模式
复位/撤销复位 sensorMipiCsiResetSensor复位 sensor
MipiCsiUnresetSensor撤销复位 sensor
复位/撤销复位 MIPI RXMipiCsiResetRx复位 MIPI + RX。不同的s32WorkingViNum有不同的enSnsType
MipiCsiUnresetRx撤销复位 MIPI RX
使能/关闭MIPI的时钟MipiCsiEnableClock使能MIPI的时钟。根据上层函数电泳传递的enSnsType参数决定是用 + MIPI 还是LVDS
MipiCsiDisableClock关闭MIPI设备的时钟
使能/禁用MIPI上的sensor时钟MipiCsiEnableSensorClock使能MIPI上的sensor时钟
MipiCsiDisableSensorClock关闭 sensor 的时钟
+ + + + +## 使用指导 + +### 使用流程 + +使用MIPI-CSI的一般流程如[图2](#fig99821771782)所示。 + +**图 2** MIPI-CSI使用流程图 + + +![](figures/MIPI-CSI使用流程图.png) + +### 获取MIPI-CSI控制器操作句柄 + +在进行MIPI-CSI进行通信前,首先要调用MipiCsiOpen获取控制器操作句柄,该函数会返回指定通道ID的控制器操作句柄。 + +```c +DevHandle MipiCsiOpen(uint8_t id); +``` + +**表 4** MipiCsiOpen的参数和返回值描述 + + + +| 参数 | 参数描述 | +| ---------- | ----------------------------------------------- | +| id | MIPI CSI通道ID | +| **返回值** | **返回值描述** | +| NULL | 获取失败 | +| 设备句柄 | 获取到指令通道的控制器操作句柄,类型为DevHandle | + +假设系统中的MIPI-CSI通道为0,获取该通道控制器操作句柄的示例如下: + +```c +DevHandle MipiCsiHandle = NULL; /* 设备句柄 */ +id = 0; /* MiPi-Csi通道ID */ + +/* 获取控制器操作句柄 */ +MipiCsiHandle = MipiCsiOpen(id); +if (MipiCsiHandle == NULL) { + HDF_LOGE("MipiCsiOpen: failed\n"); + return; +} +``` + +### MIPI-CSI相应配置 + +- 写入MIPI-CSI配置 + +```c +int32_t MipiCsiSetComboDevAttr(DevHandle handle, ComboDevAttr *pAttr); +``` + +**表 5** MipiCsiSetComboDevAttr的参数和返回值描述 + + + +| 参数 | 参数描述 | +| ---------- | -------------------------- | +| handle | 控制器操作句柄 | +| pAttr | MIPI-CSI相应配置结构体指针 | +| **返回值** | **返回值描述** | +| 0 | 设置成功 | +| 负数 | 设置失败 | + +```c +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 != 0) { + HDF_LOGE("%s: MipiCsiSetComboDevAttr fail! ret=%d\n", __func__, ret); + return -1; +} +``` + +- 设置YUV和RAW数据格式和位深 + +```c +int32_t MipiCsiSetExtDataType(DevHandle handle, ExtDataType* dataType); +``` + +**表 6** MipiCsiSetExtDataType的参数和返回值描述 + + + +| 参数 | 参数描述 | +| ---------- | ------------------------------- | +| handle | 控制器操作句柄 | +| dataType | 定义YUV和原始数据格式以及位深度 | +| **返回值** | **返回值描述** | +| 0 | 设置成功 | +| 负数 | 设置失败 | + +```c +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 != 0) { + HDF_LOGE("%s: MipiCsiSetExtDataType fail! ret=%d\n", __func__, ret); + return -1; +} +``` + +- 设置MIPI RX的 Lane分布 + +```c +int32_t MipiCsiSetHsMode(DevHandle handle, LaneDivideMode laneDivideMode); +``` + +**表 7** MipiCsiSetHsMode的参数和返回值描述 + + + +| 参数 | 参数描述 | +| -------------- | -------------- | +| handle | 控制器操作句柄 | +| laneDivideMode | lane模式参数 | +| **返回值** | **返回值描述** | +| 0 | 设置成功 | +| 负数 | 设置失败 | + +```c +int32_t ret; +enum LaneDivideMode mode; + +/* lane模式参数为0 */ +mode = LANE_DIVIDE_MODE_0; +/* 设置MIPI RX的 Lane分布 */ +ret = MipiCsiSetHsMode(MipiCsiHandle, mode); +if (ret != 0) { + HDF_LOGE("%s: MipiCsiSetHsMode fail! ret=%d\n", __func__, ret); + return -1; +} +``` + +- 设置共模电压模式 + +```c +int32_t MipiCsiSetPhyCmvmode(DevHandle handle, uint8_t devno, PhyCmvMode cmvMode); +``` + +**表 8** MipiCsiSetPhyCmvmode的参数和返回值描述 + + + +| 参数 | 参数描述 | +| ---------- | ---------------- | +| handle | 控制器操作句柄 | +| cmvMode | 共模电压模式参数 | +| devno | 设备编号 | +| **返回值** | **返回值描述** | +| 0 | 设置成功 | +| 负数 | 设置失败 | + +```c +int32_t ret; +enum PhyCmvMode mode; +uint8_t devno; + +/* 共模电压模式参数为0 */ +mode = PHY_CMV_GE1200MV; +/* 设备编号为0 */ +devno = 0; +/* 设置共模电压模式 */ +ret = MipiCsiSetPhyCmvmode(MipiCsiHandle, devno, mode); +if (ret != 0) { + HDF_LOGE("%s: MipiCsiSetPhyCmvmode fail! ret=%d\n", __func__, ret); + return -1; +} +``` + +### 复位/撤销复位sensor + +- 复位sensor + +```c +int32_t MipiCsiResetSensor(DevHandle handle, uint8_t snsResetSource); +``` + +**表 9** MipiCsiResetSensor的参数和返回值描述 + + + +| 参数 | 参数描述 | +| -------------- | ------------------------------------------------ | +| handle | 控制器操作句柄 | +| snsResetSource | 传感器的复位信号线号,在软件中称为传感器的复位源 | +| **返回值** | **返回值描述** | +| 0 | 复位成功 | +| 负数 | 复位失败 | + +```c +int32_t ret; +uint8_t snsResetSource; + +/* 传感器复位信号线号为0 */ +snsResetSource = 0; +/* 复位sensor */ +ret = MipiCsiResetSensor(MipiCsiHandle, snsResetSource); +if (ret != 0) { + HDF_LOGE("%s: MipiCsiResetSensor fail! ret=%d\n", __func__, ret); + return -1; +} +``` + +- 撤销复位sensor + +```c +int32_t MipiCsiUnresetSensor(DevHandle handle, uint8_t snsResetSource); +``` + +**表 10** MipiCsiUnresetSensor的参数和返回值描述 + + + +| 参数 | 参数描述 | +| -------------- | ------------------------------------------------ | +| handle | 控制器操作句柄 | +| snsResetSource | 传感器的复位信号线号,在软件中称为传感器的复位源 | +| **返回值** | **返回值描述** | +| 0 | 撤销复位成功 | +| 负数 | 撤销复位失败 | + +```c +int32_t ret; +uint8_t snsResetSource; + +/* 传感器撤销复位信号线号为0 */ +snsResetSource = 0; +/* 撤销复位sensor */ +ret = MipiCsiUnresetSensor(MipiCsiHandle, snsResetSource); +if (ret != 0) { + HDF_LOGE("%s: MipiCsiUnresetSensor fail! ret=%d\n", __func__, ret); + return -1; +} +``` + +### 复位/撤销复位MIPI RX + +- 复位MIPI RX + +```c +int32_t MipiCsiResetRx(DevHandle handle, uint8_t comboDev); +``` + +**表 11** MipiCsiResetRx的参数和返回值描述 + + + +| 参数 | 参数描述 | +| ---------- | --------------------- | +| handle | 控制器操作句柄 | +| comboDev | MIPI RX或LVDS通路序号 | +| **返回值** | **返回值描述** | +| 0 | 复位成功 | +| 负数 | 复位失败 | + +```c +int32_t ret; +uint8_t comboDev; + +/* 通路序号为0 */ +comboDev = 0; +/* 复位MIPI RX */ +ret = MipiCsiResetRx(MipiCsiHandle, comboDev); +if (ret != 0) { + HDF_LOGE("%s: MipiCsiResetRx fail! ret=%d\n", __func__, ret); + return -1; +} +``` + +- 撤销复位MIPI RX + +```c +int32_t MipiCsiUnresetRx(DevHandle handle, uint8_t comboDev); +``` + +**表 12** MipiCsiUnresetRx的参数和返回值描述 + + + +| 参数 | 参数描述 | +| ---------- | --------------------- | +| handle | 控制器操作句柄 | +| comboDev | MIPI RX或LVDS通路序号 | +| **返回值** | **返回值描述** | +| 0 | 撤销复位成功 | +| 负数 | 撤销复位失败 | + +```c +int32_t ret; +uint8_t comboDev; + +/* 通路序号为0 */ +comboDev = 0; +/* 撤销复位MIPI RX */ +ret = MipiCsiUnresetRx(MipiCsiHandle, comboDev); +if (ret != 0) { + HDF_LOGE("%s: MipiCsiUnresetRx fail! ret=%d\n", __func__, ret); + return -1; +} +``` + +### 使能/关闭MIPI的时钟 + +- 使能MIPI的时钟 + +```c +int32_t MipiCsiEnableClock(DevHandle handle, uint8_t comboDev); +``` + +**表 13** MipiCsiEnableClock的参数和返回值描述 + + + +| 参数 | 参数描述 | +| ---------- | -------------- | +| handle | 控制器操作句柄 | +| comboDev | 通路序号 | +| **返回值** | **返回值描述** | +| 0 | 使能成功 | +| 负数 | 使能失败 | + +```c +int32_t ret; +uint8_t comboDev; + +/* 通路序号为0 */ +comboDev = 0; +/* 使能MIPI的时钟 */ +ret = MipiCsiEnableClock(MipiCsiHandle, comboDev); +if (ret != 0) { + HDF_LOGE("%s: MipiCsiEnableClock fail! ret=%d\n", __func__, ret); + return -1; +} +``` + +- 关闭MIPI的时钟 + +```c +int32_t MipiCsiDisableClock(DevHandle handle, uint8_t comboDev); +``` + +**表 14** MipiCsiDisableClock的参数和返回值描述 + + + +| 参数 | 参数描述 | +| ---------- | -------------- | +| handle | 控制器操作句柄 | +| comboDev | 通路序号 | +| **返回值** | **返回值描述** | +| 0 | 关闭成功 | +| 负数 | 关闭失败 | + +```c +int32_t ret; +uint8_t comboDev; + +/* 通路序号为0 */ +comboDev = 0; +/* 关闭MIPI的时钟 */ +ret = MipiCsiDisableClock(MipiCsiHandle, comboDev); +if (ret != 0) { + HDF_LOGE("%s: MipiCsiDisableClock fail! ret=%d\n", __func__, ret); + return -1; +} +``` + +### 使能/关闭MIPI上的sensor时钟 + +- 使能MIPI上的sensor时钟 + +```c +int32_t MipiCsiEnableSensorClock(DevHandle handle, uint8_t snsClkSource); +``` + +**表 15** MipiCsiEnableSensorClock的参数和返回值描述 + + + +| 参数 | 参数描述 | +| ------------ | ------------------------------------------------ | +| handle | 控制器操作句柄 | +| snsClkSource | 传感器的时钟信号线号,在软件中称为传感器的时钟源 | +| **返回值** | **返回值描述** | +| 0 | 使能成功 | +| 负数 | 使能失败 | + +```c +int32_t ret; +uint8_t snsClkSource; + +/* 传感器的时钟信号线号为0 */ +snsClkSource = 0; +/* 使能MIPI上的sensor时钟 */ +ret = MipiCsiEnableSensorClock(MipiCsiHandle, snsClkSource); +if (ret != 0) { + HDF_LOGE("%s: MipiCsiEnableSensorClock fail! ret=%d\n", __func__, ret); + return -1; +} +``` + +- 关闭MIPI上的sensor时钟 + +```c +int32_t MipiCsiDisableSensorClock(DevHandle handle, uint8_t snsClkSource); +``` + +**表 16** MipiCsiDisableSensorClock的参数和返回值描述 + + + +| 参数 | 参数描述 | +| ------------ | ------------------------------------------------ | +| handle | 控制器操作句柄 | +| snsClkSource | 传感器的时钟信号线号,在软件中称为传感器的时钟源 | +| **返回值** | **返回值描述** | +| 0 | 关闭成功 | +| 负数 | 关闭失败 | + +```c +int32_t ret; +uint8_t snsClkSource; + +/* 传感器的时钟信号线号为0 */ +snsClkSource = 0; +/* 关闭MIPI上的sensor时钟 */ +ret = MipiCsiDisableSensorClock(MipiCsiHandle, snsClkSource); +if (ret != 0) { + HDF_LOGE("%s: MipiCsiDisableSensorClock fail! ret=%d\n", __func__, ret); + return -1; +} +``` + +### 释放MIPI-CSI控制器操作句柄 + +MIPI-CSI使用完成之后,需要释放控制器操作句柄,释放句柄的函数如下所示: + +```c +void MipiCsiClose(DevHandle handle); +``` + +该函数会释放掉由MipiCsiOpen申请的资源。 + +**表 17** MipiCsiClose的参数和返回值描述 + + + + + + + + + + + +

参数

+

参数描述

+

handle

+

MIPI-CSI控制器操作句柄

+
+ +```c +MipiCsiClose(MIPIHandle); /* 释放掉MIPI-CSI控制器操作句柄 */ +``` + +## 使用实例 + +MIPI-CSI完整的使用示例如下所示: + +```c +#include "hdf.h" +#include "MIPI_csi_if.h" + +void PalMipiCsiTestSample(void) +{ + uint8_t id; + int32_t ret; + uint8_t comboDev; + uint8_t snsClkSource; + uint8_t devno; + enum LaneDivideMode mode; + enum PhyCmvMode mode; + struct ComboDevAttr attr; + struct ExtDataType dataType; + DevHandle MipiCsiHandle = NULL; + + /* 控制器ID号 */ + id = 0; + /* 获取控制器操作句柄 */ + MipiCsiHandle = MipiCsiOpen(id); + if (MipiCsiHandle == NULL) { + HDF_LOGE("MipiCsiOpen: failed!\n"); + return; + } + + /* lane模式参数为0 */ + mode = LANE_DIVIDE_MODE_0; + /* 设置MIPI RX的 Lane分布 */ + ret = MipiCsiSetHsMode(MipiCsiHandle, mode); + if (ret != 0) { + HDF_LOGE("%s: MipiCsiSetHsMode fail! ret=%d\n", __func__, ret); + return; + } + + /* 通路序号为0 */ + comboDev = 0; + /* 使能MIPI的时钟 */ + ret = MipiCsiEnableClock(MipiCsiHandle, comboDev); + if (ret != 0) { + HDF_LOGE("%s: MipiCsiEnableClock fail! ret=%d\n", __func__, ret); + return; + } + + /* 复位MIPI RX */ + ret = MipiCsiResetRx(MipiCsiHandle, comboDev); + if (ret != 0) { + HDF_LOGE("%s: MipiCsiResetRx fail! ret=%d\n", __func__, ret); + return; + } + + /* 传感器的时钟信号线号为0 */ + snsClkSource = 0; + /* 使能MIPI上的sensor时钟 */ + ret = MipiCsiEnableSensorClock(MipiCsiHandle, snsClkSource); + if (ret != 0) { + HDF_LOGE("%s: MipiCsiEnableSensorClock fail! ret=%d\n", __func__, ret); + return; + } + + /* 复位sensor */ + ret = MipiCsiResetSensor(MipiCsiHandle, snsResetSource); + if (ret != 0) { + HDF_LOGE("%s: MipiCsiResetSensor fail! ret=%d\n", __func__, ret); + return; + } + + /* 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: 图像传感器高度尺寸 */ + /* 写入配置数据 */ + ret = MipiCsiSetComboDevAttr(MipiCsiHandle, &attr); + if (ret != 0) { + HDF_LOGE("%s: MipiCsiSetComboDevAttr fail! ret=%d\n", __func__, ret); + return; + } + + /* 共模电压模式参数为0 */ + mode = PHY_CMV_GE1200MV; + /* 设备编号为0 */ + devno = 0; + /* 设置共模电压模式 */ + ret = MipiCsiSetPhyCmvmode(MipiCsiHandle, devno, mode); + if (ret != 0) { + HDF_LOGE("%s: MipiCsiSetPhyCmvmode fail! ret=%d\n", __func__, ret); + return; + } + + /* 通路序号为0 */ + comboDev = 0; + /* 撤销复位MIPI RX */ + ret = MipiCsiUnresetRx(MipiCsiHandle, comboDev); + if (ret != 0) { + HDF_LOGE("%s: MipiCsiUnresetRx fail! ret=%d\n", __func__, ret); + return; + } + + /* 关闭MIPI的时钟 */ + ret = MipiCsiDisableClock(MipiCsiHandle, comboDev); + if (ret != 0) { + HDF_LOGE("%s: MipiCsiDisableClock fail! ret=%d\n", __func__, ret); + return; + } + + /* 传感器撤销复位信号线号为0 */ + snsResetSource = 0; + /* 撤销复位sensor */ + ret = MipiCsiUnresetSensor(MipiCsiHandle, snsResetSource); + if (ret != 0) { + HDF_LOGE("%s: MipiCsiUnresetSensor fail! ret=%d\n", __func__, ret); + return; + } + + /* 关闭MIPI上的sensor时钟 */ + ret = MipiCsiDisableSensorClock(MipiCsiHandle, snsClkSource); + if (ret != 0) { + HDF_LOGE("%s: MipiCsiDisableSensorClock fail! ret=%d\n", __func__, ret); + return; + } + + /* 释放MIPI DSI设备句柄 */ + MipiCsiClose(MipiCsiHandle); +} +``` + diff --git a/zh-cn/device-dev/driver/driver-platform-mipicsi-develop.md b/zh-cn/device-dev/driver/driver-platform-mipicsi-develop.md new file mode 100755 index 0000000000000000000000000000000000000000..2ce904f2f90c1c3944117b23a5fb3c18e0ade00d --- /dev/null +++ b/zh-cn/device-dev/driver/driver-platform-mipicsi-develop.md @@ -0,0 +1,312 @@ +# MIPI-CSI + +- [概述](#section1_MIPI_CSIDevelop) +- [开发步骤](#section2_MIPI_CSIDevelop) +- [开发实例](#section3_MIPI_CSIDevelop) + +## 概述 + +CSI(Camera Serial Interface)是由MIPI联盟下Camera工作组指定的接口标准。在HDF框架中,MIPI-CSI的接口适配模式采用无服务模式,用于不需要在用户态提供API的设备类型,或者没有用户态和内核区分的OS系统,MIPI-CSI的接口关联方式是DevHandle直接指向设备对象内核态地址(DevHandle是一个void类型指针)。 + +图 1 无服务模式结构图 +![image1](figures/CSI无服务模式结构图.png) + +## 开发步骤 + +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控制器 ;
**pAttr**: 结构体指针,MIPI-CSI相应配置结构体指针 | 无 | HDF_STATUS相关状态 | 写入MIPI-CSI配置 | +> | setPhyCmvmode | **cntlr**: 结构体指针,MipiCsi控制器 ;
**devno**: uint8_t,设备编号;
**cmvMode**: 枚举类型,共模电压模式参数 | 无 | HDF_STATUS相关状态 | 设置共模电压模式 | +> | setExtDataType | **cntlr**: 结构体指针,MipiCsi控制器 ;
**dataType**: 结构体指针,定义YUV和原始数据格式以及位深度 | 无 | HDF_STATUS相关状态 | 设置YUV和RAW数据格式和位深 | +> | setHsMode | **cntlr**: 结构体指针,MipiCsi控制器 ;
**laneDivideMode**: 枚举类型,lane模式参数 | 无 | HDF_STATUS相关状态 | 设置MIPI RX的 Lane分布 | +> | enableClock | **cntlr**: 结构体指针,MipiCsi控制器 ;
**comboDev**: uint8_t,通路序号 | 无 | HDF_STATUS相关状态 | 使能mipi的时钟 | +> | disableClock | **cntlr**: 结构体指针,MipiCsi控制器 ;
**comboDev**: uint8_t,通路序号 | 无 | HDF_STATUS相关状态 | 关闭mipi的时钟 | +> | resetRx | **cntlr**: 结构体指针,MipiCsi控制器 ;
**comboDev**: uint8_t,通路序号 | 无 | HDF_STATUS相关状态 | 复位MIPI RX | +> | unresetRx | **cntlr**: 结构体指针,MipiCsi控制器 ;
**comboDev**: uint8_t,通路序号 | 无 | HDF_STATUS相关状态 | 撤销复位MIPI RX | +> | enableSensorClock | **cntlr**: 结构体指针,MipiCsi控制器 ;
**snsClkSource**: uint8_t,传感器的时钟信号线号 | 无 | HDF_STATUS相关状态 | 使能mipi上的sensor时钟 | +> | disableSensorClock | **cntlr**: 结构体指针,MipiCsi控制器 ;
**snsClkSource**: uint8_t,传感器的时钟信号线号 | 无 | HDF_STATUS相关状态 | 关闭mipi上的sensor时钟 | +> | resetSensor | **cntlr**: 结构体指针,MipiCsi控制器 ;
**snsClkSource**: uint8_t,传感器的时钟信号线号 | 无 | HDF_STATUS相关状态 | 复位sensor | +> | unresetSensor | **cntlr**: 结构体指针,MipiCsi控制器 ;
**snsClkSource**: uint8_t,传感器的时钟信号线号 | 无 | HDF_STATUS相关状态 | 撤销复位sensor | + +## 开发实例 + +下方将以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__); + } + ``` + diff --git a/zh-cn/device-dev/driver/driver-platform-mipidsi-des.md b/zh-cn/device-dev/driver/driver-platform-mipidsi-des.md index 3e8de1b4db84629edeaffe83ff0a3f02ab05ea89..6be428a3027b44ad6c0a109f18057975a9f0960d 100644 --- a/zh-cn/device-dev/driver/driver-platform-mipidsi-des.md +++ b/zh-cn/device-dev/driver/driver-platform-mipidsi-des.md @@ -96,7 +96,7 @@ 使用MIPI-DSI的一般流程如[图2](#fig129103491241)所示。 **图 2** MIPI-DSI使用流程图 -![](figures/MIPI-DSI使用流程图.png "MIPI-DSI使用流程图") +![](figures/MIPI-DSI使用流程图.png) ### 获取MIPI-DSI操作句柄 @@ -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); diff --git a/zh-cn/device-dev/driver/driver-platform-pwm-des.md b/zh-cn/device-dev/driver/driver-platform-pwm-des.md index 80d67a89dc0e6f067a30829dc8fd953d8cef2042..b6679b4739f3c256f3c2a1d7f2097300813cac18 100644 --- a/zh-cn/device-dev/driver/driver-platform-pwm-des.md +++ b/zh-cn/device-dev/driver/driver-platform-pwm-des.md @@ -1,579 +1,477 @@ -# PWM - -- [概述](#section1043395117296) -- [接口说明](#section3939192652418) -- [使用指导](#section435718267334) - - [使用流程](#section113655616347) - - [获取PWM设备句柄](#section17816586359) - - [设置PWM周期](#section920214812397) - - [设置PWM占空比](#section519712820405) - - [设置PWM极性](#section12383334115) - - [使能PWM](#section382684811414) - - [禁用PWM](#section16545114404218) - - [获取PWM设备配置信息](#section117101243144311) - - [设置PWM设备配置信息](#section13834163604414) - - [释放PWM设备句柄](#section12987111511450) - -- [使用实例](#section138636719469) - -## 概述 - -PWM是脉冲宽度调制(Pulse Width Modulation)的缩写,是一种对模拟信号电平进行数字编码并将其转换为脉冲的技术。常用于马达控制、背光亮度调节等。 - -PWM接口定义了操作PWM设备的通用方法集合,包括: - -- PWM设备句柄获取和释放。 -- PWM周期、占空比、极性的设置。 -- PWM使能和关闭。 -- PWM配置信息的获取和设置 - -## 接口说明 - -**表 1** PWM驱动API接口功能介绍 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

功能分类

-

接口名

-

描述

-

PWM设备句柄获取和释放

-

PwmOpen

-

获取PWM设备句柄

-

PwmClose

-

释放PWM设备句柄

-

PWM周期、占空比、极性的设置

-

PwmSetPeriod

-

设置PWM周期

-

PwmSetDuty

-

设置PWM占空比

-

PwmSetPolarity

-

设置PWM极性

-

PWM使能和关闭

-

PwmEnable

-

使能PWM

-

PwmDisable

-

禁用PWM

-

PWM配置信息的获取和设置

-

-

PwmSetConfig

-

设置PWM设备配置信息

-

PwmGetConfig

-

获取PWM设备配置信息

-
- ->![](../public_sys-resources/icon-note.gif) **说明:** ->本文涉及的所有接口,仅限内核态使用,不支持在用户态使用。 - -## 使用指导 - -### 使用流程 - -使用PWM的一般流程如[图1](#fig23885455594)所示。 - -**图 1** PWM使用流程图 - - -![](figures/zh-cn_image_0000001206372673.png) - -### 获取PWM设备句柄 +# PWM + +- [概述](#section1_PWM_des) + - [PwmConfig结构体](#section1.1_PWM_des) +- [接口说明](#section2_PWM_des) +- [使用指导](#section3_PWM_des) + - [使用流程](#section3.1_PWM_des) + - [获取PWM设备句柄](#section3.2_PWM_des) + - [销毁PWM设备句柄](#section3.3_PWM_des) + - [使能](#section3.4_PWM_des) + - [禁用](#section3.5_PWM_des) + - [设置PWM设备周期](#section3.6_PWM_des) + - [设置PWM设备占空时间](#section3.7_PWM_des) + - [设置PWM设备极性](#section3.8_PWM_des) + - [设置PWM设备参数](#section3.9_PWM_des) + - [获取PWM设备参数](#section3.10_PWM_des) + +- [使用实例](#section3_PWM_des) + +## 概述 + +- PWM是脉冲宽度调制(Pulse Width Modulation)的缩写,是一种对模拟信号电平进行数字编码,转换为脉冲的一种技术。常用于马达控制、背光亮度调节等。 + +- PWM接口定义了操作PWM设备的通用方法集合,包括: + - PWM设备句柄获取和销毁。 + - PWM周期、占空比、极性的设置。 + - PWM使能和关闭。 + - PWM配置信息的获取和设置 + +### PwmConfig结构体 + +**表1** PwmConfig结构体介绍 + + + +| 名称 | 描述 | +| -------- | ------------------------------------------------------------ | +| duty | 占空时间,以纳秒为单位 | +| period | PWM周期,以纳秒为单位 | +| number | 要生成的方波数。正值表示将生成指定数量的方波,0表示方波将不断产生 | +| polarity | 极性:正极性/反极性 | +| status | 状态:启用状态/禁用状态 | + +## 接口说明 + +**表2** PWM设备API接口功能介绍 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
功能分类接口名描述
PWM句柄操作PwmOpen获取PWM设备驱动句柄
PwmClose释放PWM设备驱动句柄
使能/禁用PWMPwmEnable使能PWM
PwmDisable禁用PWM
PWM配置操作PwmSetPeriod设置PWM周期
PwmSetDuty设置PWM占空时间
PwmSetPolarity设置PWM极性
设置/获取PWM配置信息PwmSetConfig设置PWM设备参数
PwmGetConfig获取PWM设备参数
+ + + +>![](W:\doc\docs\zh-cn\device-dev\public_sys-resources\icon-note.gif) **说明:** +>PWM当前仅限内核态使用,不支持在用户态使用。 + +## 使用指导 + +### 使用流程 + +在操作系统启动过程中,驱动管理模块根据配置文件加载PWM驱动,PWM驱动会检测PWM器件并初始化驱动。 + +使用PWM设备的一般流程如[图1](#fig1_PWM_des)所示。 + +**图 1** PWM设备使用流程图 + + +![](figures/PWM设备使用流程图.png) + +### 获取PWM设备句柄 在操作PWM设备时,首先要调用PwmOpen获取PWM设备句柄,该函数会返回指定设备号的PWM设备句柄。 -DevHandle PwmOpen\(uint32\_t num\); - -**表 2** PwmOpen参数和返回值描述 - - - - - - - - - - - - - - - - - - -

参数

-

参数描述

-

num

-

PWM设备号

-

返回值

-

返回值描述

-

NULL

-

获取PWM设备句柄失败

-

设备句柄

-

对应的PWM设备句柄

-
- -假设系统中的PWM设备号为0,获取该PWM设备句柄的示例如下: - +```c +DevHandle PwmOpen(uint32_t num); ``` + +**表3** PwmOpen参数和返回值描述 + + + +| 参数 | 参数描述 | +| ---------- | ----------------------- | +| void | NA | +| num | PWM设备编号 | +| **返回值** | **返回值描述** | +| handle | 获取成功返回PWM设备句柄 | +| NULL | 获取失败 | + + +```c uint32_t num = 0; /* PWM设备号 */ -DevHandle pwm = NULL; /* PWM设备句柄 / +DevHandle handle = NULL; /* 获取PWM设备句柄 */ -pwm = PwmOpen(num); -if (pwm == NULL) { - HDF_LOGE("PwmOpen: pwm%d failed", num); - return; +handle = PwmOpen(num); +if (handle == NULL) { + /* 错误处理 */ } ``` -### 设置PWM周期 - -int32\_t PwmSetPeriod\(DevHandle handle, uint32\_t period\); - -**表 3** PwmSetPeriod参数和返回值描述 - - - - - - - - - - - - - - - - - - - - - -

参数

-

参数描述

-

handle

-

PWM设备句柄

-

period

-

周期,单位纳秒

-

返回值

-

返回值描述

-

0

-

设置周期成功

-

负数

-

设置周期失败

-
+### 销毁PWM设备句柄 + +关闭PWM设备,系统释放对应的资源。 +```c +void PwmClose(DevHandle handle); ``` -int32_t ret; -uint32_t period = 1000; /* 周期1000纳秒 */ -ret = PwmSetPeriod(pwm, period); /* 设置PWM周期 */ -if (ret != 0) { - HDF_LOGE("PwmSetPeriod: failed, ret %d", ret); -} + +**表4** PwmClose参数描述 + + + +| 参数 | 参数描述 | +| ------ | ----------- | +| handle | PWM设备句柄 | + + +```c +/* 销毁PWM设备句柄 */ +PwmClose(handle); ``` -### 设置PWM占空比 - -int32\_t PwmSetDuty\(DevHandle handle, uint32\_t duty\); - -**表 4** PwmSetDuty参数和返回值描述 - - - - - - - - - - - - - - - - - - - - - -

参数

-

参数描述

-

handle

-

PWM设备句柄

-

duty

-

占空比,单位纳秒

-

返回值

-

返回值描述

-

0

-

设置占空比成功

-

负数

-

设置占空比失败

-
+### 使能 + +启用PWM设备。 +```c +int32_t PwmEnable(DevHandle handle); ``` + +**表5** PwmEnable参数描述 + + + +| 参数 | 参数描述 | +| ---------- | -------------- | +| handle | PWM设备句柄 | +| **返回值** | **返回值描述** | +| 0 | 使能成功 | +| 负数 | 使能失败 | + +```c int32_t ret; -uint32_t duty = 500; /* 占空比500纳秒 */ -ret = PwmSetDuty(pwm, duty); /* 设置PWM占空比 */ + +/*启用PWM设备*/ +ret = PwmEnable(handle); if (ret != 0) { - HDF_LOGE("PwmSetDuty: failed, ret %d", ret); + /*错误处理*/ } ``` -### 设置PWM极性 - -int32\_t PwmSetPolarity\(DevHandle handle, uint8\_t polarity\); - -**表 5** PwmSetPolarity参数和返回值描述 - - - - - - - - - - - - - - - - - - - - - -

参数

-

参数描述

-

handle

-

PWM设备句柄

-

polarity

-

极性,PWM_NORMAL_POLARITY为正常极性,PWM_INVERTED_POLARITY为反转极性。

-

返回值

-

返回值描述

-

0

-

设置极性成功

-

负数

-

设置极性失败

-
+### 禁用 +禁用PWM设备。 + +```c +int32_t PwmDisable(DevHandle handle); ``` + +**表6** PwmDisable参数描述 + + + +| 参数 | 参数描述 | +| ---------- | -------------- | +| handle | PWM设备句柄 | +| **返回值** | **返回值描述** | +| 0 | 禁用成功 | +| 负数 | 禁用失败 | + +```c int32_t ret; -uint8_t polarity = PWM_INVERTED_POLARITY; /* 反转极性 */ -ret = PwmSetPolarity(pwm, polarity); /* 设置PWM反转极性 */ + +/*禁用PWM设备*/ +ret = PwmDisable(handle); if (ret != 0) { - HDF_LOGE("PwmSetPolarity: failed, ret %d", ret); + /*错误处理*/ } ``` -### 使能PWM - -int32\_t PwmEnable\(DevHandle handle\); - -**表 6** PwmEnable参数和返回值描述 - - - - - - - - - - - - - - - - - - -

参数

-

参数描述

-

handle

-

PWM设备句柄

-

返回值

-

返回值描述

-

0

-

使能PWM成功

-

负数

-

使能PWM失败

-
+### 设置PWM设备周期 +设置PWM设备周期。 + +```c +int32_t PwmSetPeriod(DevHandle handle, uint32_t period); ``` + +**表7** PwmSetPeriod参数描述 + + + +| 参数 | 参数描述 | +| ---------- | ------------------------ | +| handle | PWM设备句柄 | +| period | 要设置的周期,单位为纳秒 | +| **返回值** | **返回值描述** | +| 0 | 设置成功 | +| 负数 | 设置失败 | + +```c int32_t ret; -ret = PwmEnable(pwm); /* 使能PWM */ + +/*设置周期为50000000纳秒*/ +ret = PwmSetPeriod(handle, 50000000); if (ret != 0) { - HDF_LOGE("PwmEnable: failed, ret %d", ret); + /*错误处理*/ } ``` +### 设置PWM设备占空时间 -### 禁用PWM - -int32\_t PwmDisable\(DevHandle handle\); - -**表 7** PwmDisable参数和返回值描述 - - - - - - - - - - - - - - - - - - -

参数

-

参数描述

-

handle

-

PWM设备句柄

-

返回值

-

返回值描述

-

0

-

关闭PWM成功

-

负数

-

关闭PWM失败

-
+设置PWM设备占空时间。 +```c +int32_t PwmSetDuty(DevHandle handle, uint32_t duty); ``` + +**表8** PwmSetDuty参数描述 + + + +| 参数 | 参数描述 | +| ---------- | ---------------------------- | +| handle | PWM设备句柄 | +| duty | 要设置的占空时间,单位为纳秒 | +| **返回值** | **返回值描述** | +| 0 | 设置成功 | +| 负数 | 设置失败 | + +```c int32_t ret; -ret = PwmDisable(pwm); /* 禁用PWM */ + +/*设置占空时间为25000000纳秒*/ +ret = PwmSetDuty(handle, 25000000); if (ret != 0) { - HDF_LOGE("PwmDisable: failed, ret %d", ret); + /*错误处理*/ } ``` +### 设置PWM设备极性 -### 获取PWM设备配置信息 - -int32\_t PwmGetConfig\(DevHandle handle, struct PwmConfig \*config\); - -**表 8** PwmGetConfig参数和返回值描述 - - - - - - - - - - - - - - - - - - - - - -

参数

-

参数描述

-

handle

-

PWM设备句柄

-

config

-

PWM设备配置信息

-

返回值

-

返回值描述

-

0

-

获取配置成功

-

负数

-

获取配置失败

-
+设置PWM设备极性。 +```c +int32_t PwmSetPolarity(DevHandle handle, uint8_t polarity); ``` + +**表9** PwmSetPolarity参数描述 + + + +| 参数 | 参数描述 | +| ---------- | ------------------- | +| handle | PWM设备句柄 | +| polarity | 要设置的极性,正/反 | +| **返回值** | **返回值描述** | +| 0 | 设置成功 | +| 负数 | 设置失败 | + +```c int32_t ret; -struct PwmConfig config= {0}; /* PWM配置信息 */ -ret = PwmGetConfig(pwm, &config); /* 获取PWM设备配置信息 */ + +/*设置极性为反*/ +ret = PwmSetPolarity(handle, PWM_INVERTED_POLARITY); if (ret != 0) { - HDF_LOGE("PwmGetConfig: failed, ret %d", ret); + /*错误处理*/ } ``` -### 设置PWM设备配置信息 - -int32\_t PwmSetConfig\(DevHandle handle, struct PwmConfig \*config\); - -**表 9** PwmSetConfig参数和返回值描述 - - - - - - - - - - - - - - - - - - - - - -

参数

-

参数描述

-

handle

-

PWM设备句柄

-

config

-

PWM设备配置信息

-

返回值

-

返回值描述

-

0

-

设置配置成功

-

负数

-

设置配置失败

-
+### 设置PWM设备参数 + +设置PWM设备参数。 + +```c +int32_t PwmSetConfig(DevHandle handle, struct PwmConfig *config); ``` + +**表10** PwmSetConfig参数描述 + + + +| 参数 | 参数描述 | +| ---------- | -------------- | +| handle | PWM设备句柄 | +| *config | 参数指针 | +| **返回值** | **返回值描述** | +| 0 | 设置成功 | +| 负数 | 设置失败 | + +```c int32_t ret; -struct PwmConfig config= {0}; /* PWM配置信息 */ -config.duty = 500; /* 占空比500纳秒 */ -config.period = 1000; /* 周期1000纳秒 */ -config.number = 0; /* 一直输出方波 */ -config.polarity = PWM_NORMAL_POLARITY; /* 正常极性 */ -ret = PwmSetConfig(pwm, &config); /* 设置PWM设备配置信息 */ +struct PwmConfig pcfg; +pcfg.duty = 25000000; /*占空时间为25000000纳秒*/ +pcfg.period = 50000000; /*周期为50000000纳秒*/ +pcfg.number = 0; /*不断产生方波*/ +pcfg.polarity = PWM_INVERTED_POLARITY; /*极性为反*/ +pcfg.status = PWM_ENABLE_STATUS; /*运行状态为启用*/ + +/*设置PWM设备参数*/ +ret = PwmSetConfig(handle, &pcfg); if (ret != 0) { - HDF_LOGE("PwmSetConfig: failed, ret %d\n", ret); + /*错误处理*/ } ``` -### 释放PWM设备句柄 +### 获取PWM设备参数 -void PwmClose\(DevHandle handle\); +获取PWM设备参数。 -该函数会释放掉由PwmClose申请的资源。 +```c +int32_t PwmGetConfig(DevHandle handle, struct PwmConfig *config); +``` -**表 10** PwmClose参数描述 +**表11** PwmGetConfig参数描述 - - - - - - - - -

参数

-

参数描述

-

handle

-

PWM设备句柄

-
+ -``` -PwmClose(pwm); /* 释放PWM设备句柄 */ +| 参数 | 参数描述 | +| ---------- | -------------- | +| handle | PWM设备句柄 | +| *config | 参数指针 | +| **返回值** | **返回值描述** | +| 0 | 获取成功 | +| 负数 | 获取失败 | + +```c +int32_t ret; +struct PwmConfig pcfg; + +/*获取PWM设备参数*/ +ret = PwmGetConfig(handle, &pcfg); +if (ret != 0) { + /*错误处理*/ +} ``` -## 使用实例 +## 使用实例 -PWM设备完整的使用示例如下所示,首先获取PWM设备句柄,然后设置PWM设备配置信息,使能PWM,最后释放PWM设备句柄。 +PWM设备完整的使用示例如下所示,首先获取PWM设备句柄,然后设置设备周期、占空时间、极性,获取设备参数。使能,设置设备参数,禁用,最后销毁PWM设备句柄。 ``` -#include "hdf_log.h" -#include "osal_time.h" -#include "pwm_if.h" - void PwmTestSample(void) { int32_t ret; - struct PwmConfig config; /* PWM配置信息 */ - DevHandle pwm = NULL; /* PWM设备句柄 */ - - pwm = PwmOpen(0); /* 获取PWM设备句柄 */ - if (pwm == NULL) { - HDF_LOGE("PwmOpen: pwm0 failed"); + uint32_t num; + DevHandle handle = NULL; + + struct PwmConfig pcfg; + pcfg.duty = 20000000; /*占空时间为20000000纳秒*/ + pcfg.period = 40000000; /*周期为40000000纳秒*/ + pcfg.number = 100; /*生成100个方波*/ + pcfg.polarity = PWM_NORMAL_POLARITY; /*极性为正*/ + pcfg.status = PWM_ENABLE_STATUS; /*运行状态为启用*/ + + /* PWM设备编号,要填写实际平台上的编号 */ + num = 1; + + /* 获取PWM设备句柄 */ + handle = PwmOpen(num); + if (handle == NULL) { + HDF_LOGE("PwmOpen: failed!\n"); return; } - /* 获取PWM设备配置信息 */ - ret = PwmGetConfig(pwm, &config); + + /*设置周期为50000000纳秒*/ + ret = PwmSetPeriod(handle, 50000000); + if (ret != 0) { + HDF_LOGE("PwmSetPeriod: failed, ret %d\n", ret); + goto _ERR; + } + + /*设置占空时间为25000000纳秒*/ + ret = PwmSetDuty(handle, 25000000); + if (ret != 0) { + HDF_LOGE("PwmSetDuty: failed, ret %d\n", ret); + goto _ERR; + } + + /*设置极性为反*/ + ret = PwmSetPolarity(handle, PWM_INVERTED_POLARITY); + if (ret != 0) { + HDF_LOGE("PwmSetPolarity: failed, ret %d\n", ret); + goto _ERR; + } + + /*获取PWM设备参数*/ + ret = PwmGetConfig(handle, &pcfg); if (ret != 0) { HDF_LOGE("PwmGetConfig: failed, ret %d\n", ret); - goto err; + goto _ERR; } - config.duty = 500; /* 占空比500纳秒 */ - config.period = 1000; /* 周期1000纳秒 */ - /* 设置PWM设备配置信息 */ - ret = PwmSetConfig(pwm, &config); + + /*启用PWM设备*/ + ret = PwmEnable(handle); if (ret != 0) { - HDF_LOGE("PwmSetConfig: failed, ret %d\n", ret); - goto err; + HDF_LOGE("PwmEnable: failed, ret %d\n", ret); + goto _ERR; } - /* 使能PWM */ - ret = PwmEnable(pwm); + + /*设置PWM设备参数*/ + ret = PwmSetConfig(handle, &pcfg); if (ret != 0) { - HDF_LOGE("PwmEnable: failed, ret %d\n", ret); - goto err; + HDF_LOGE("PwmSetConfig: failed, ret %d\n", ret); + goto _ERR; } - /* 睡眠10秒 */ - OsalSleep(10); - /* 禁用PWM */ - ret = PwmDisable(pwm); + + /*禁用PWM设备*/ + ret = PwmDisable(handle); if (ret != 0) { HDF_LOGE("PwmDisable: failed, ret %d\n", ret); - goto err; + goto _ERR; } -err: - /* 释放PWM设备句柄 */ - PwmClose(pwm); + +_ERR: + /* 销毁PWM设备句柄 */ + PwmClose(handle); } ``` - diff --git "a/zh-cn/device-dev/driver/figures/CSI\345\217\221\351\200\201-\346\216\245\346\224\266\346\216\245\345\217\243.png" "b/zh-cn/device-dev/driver/figures/CSI\345\217\221\351\200\201-\346\216\245\346\224\266\346\216\245\345\217\243.png" new file mode 100755 index 0000000000000000000000000000000000000000..1407bc0ced6942501039f8fe041efc722882fbaa Binary files /dev/null and "b/zh-cn/device-dev/driver/figures/CSI\345\217\221\351\200\201-\346\216\245\346\224\266\346\216\245\345\217\243.png" differ diff --git "a/zh-cn/device-dev/driver/figures/CSI\346\227\240\346\234\215\345\212\241\346\250\241\345\274\217\347\273\223\346\236\204\345\233\276.png" "b/zh-cn/device-dev/driver/figures/CSI\346\227\240\346\234\215\345\212\241\346\250\241\345\274\217\347\273\223\346\236\204\345\233\276.png" new file mode 100755 index 0000000000000000000000000000000000000000..833ff6cc89e49ed4210dd68a502e4b304ac1c273 Binary files /dev/null and "b/zh-cn/device-dev/driver/figures/CSI\346\227\240\346\234\215\345\212\241\346\250\241\345\274\217\347\273\223\346\236\204\345\233\276.png" differ diff --git "a/zh-cn/device-dev/driver/figures/MIPI-CSI\344\275\277\347\224\250\346\265\201\347\250\213\345\233\276.png" "b/zh-cn/device-dev/driver/figures/MIPI-CSI\344\275\277\347\224\250\346\265\201\347\250\213\345\233\276.png" new file mode 100755 index 0000000000000000000000000000000000000000..1e5945dde90c375947137d8b5e9161018c0700f9 Binary files /dev/null and "b/zh-cn/device-dev/driver/figures/MIPI-CSI\344\275\277\347\224\250\346\265\201\347\250\213\345\233\276.png" differ diff --git "a/zh-cn/device-dev/driver/figures/PWM\350\256\276\345\244\207\344\275\277\347\224\250\346\265\201\347\250\213\345\233\276.png" "b/zh-cn/device-dev/driver/figures/PWM\350\256\276\345\244\207\344\275\277\347\224\250\346\265\201\347\250\213\345\233\276.png" new file mode 100755 index 0000000000000000000000000000000000000000..339d44368a15f4e58d7711c69f136bccdbc9d6db Binary files /dev/null and "b/zh-cn/device-dev/driver/figures/PWM\350\256\276\345\244\207\344\275\277\347\224\250\346\265\201\347\250\213\345\233\276.png" differ