- | -- | -- | -
---|---|---|
- | -- | -- | -
- | -- | -- | -
- | -- | -|
- | -- | -- | -
- | -- | -- | -
- | -- | -- | -
---|---|---|
- | -- | -- | -
- | -- | -|
- | -- | -|
- | -- | -|
- | -- | -- | -
- | -- | -|
- | -- | -
- | -- | -
---|---|
- | -- | -
- | -- | -
- | -- | -
- | -- | -
- | -- | -
---|---|
- | -- | -
- | -- | -
- | -- | -
- | -- | -
- | -- | -- | -
---|---|---|
- | -- | -- | -
- | -- | -|
- | -- | -- | -
- | -- | -|
- | -- | -- | -
- | -- | -|
- | -- | -
- | -- | -- | -
---|---|---|
- | -- | -- | -
- | -- | -- | -
- | -- | -- | -
- | -- | -- | -
- | -- | -- | -
- | -- | -- | -- | -- | -
---|---|---|---|---|
- | -- | -- | -- | -- | -
- | -- | -- | -- | -- | -
- | -- | -- | -- | -- | -
- | -- | -
---|---|
- | -- | -
- | -- | -
- | -- | -
- | -- | -
- | -- | -
---|---|
- | -- | -
- | -- | -
- | -- | -
- | -- | -
- | -- | -
- | -- | -
- | -- | -
---|---|
- | -- | -
- | -- | -
- | -- | -
- | -- | -
- | -- | -
- | -- | -
| **status**:HDMI硬件状态 ; | 无 | 获取HDMI当前硬件状态 | - | controllerReset | **cntlr**: 结构体指针,核心层HDMI控制器; | 无 | 无 | HDMI控制器复位 | - | hotPlugStateGet | **cntlr**: 结构体指针,核心层HDMI控制器; | 无 | bool: HDMI热插拔状态 | 获取HDMI热插拔状态 | - | hotPlugInterruptStateGet | **cntlr**: 结构体指针,核心层HDMI控制器; | 无 | bool: HDMI热插拔中断状态 | 获取HDMI热插拔中断状态 | - | lowPowerSet | **cntlr**: 结构体指针,核心层HDMI控制器;
**enable**: bool,使能/去使能 | 无 | 无 | 使能/去使能低功耗 | - | tmdsModeSet | **cntlr**: 结构体指针,核心层HDMI控制器;
**mode**:TMDS模式 | 无 | 无 | 设置TMDS模式 | - |tmdsConfigSet|**cntlr**: 结构体指针,核心层HDMI控制器;
**mode**: TMDS参数|无|HDF_STATUS相关状态|配置TMDS参数| - |infoFrameEnable|**cntlr**: 结构体指针,核心层HDMI控制器;
**infoFrameType**: packet类型
**enable**: bool,使能/去使能|无|无|使能/去使能infoFrame| - |infoFrameSend|**cntlr**: 结构体指针,核心层HDMI控制器;
**infoFrameType**: packet类型
**data**: infoFrame数据
**len**:数据长度|无|HDF_STATUS相关状态|发送inforFrame| - |cecMsgSend|**cntlr**: 结构体指针,核心层HDMI控制器;
**msg**: CEC消息|无|HDF_STATUS相关状态|发送CEC消息| - |audioPathEnable|**cntlr**: 结构体指针,核心层HDMI控制器;
**enable**: bool,使能/去使能|无|无|使能/去使能audio通路| - |audioPathSet|**cntlr**: 结构体指针,核心层HDMI控制器;
**config**: 配置信息|无|无|设置audio通路配置信息| - |phyOutputEnable|**cntlr**: 结构体指针,核心层HDMI控制器;
**enable**: bool,使能/去使能|无|无|使能/去使能物理层输出状态| - |phyOutputSet|**cntlr**: 结构体指针,核心层HDMI控制器;
**cfg**: 配置信息|无|无|设置物理层配置信息| - |blackDataSet|**cntlr**: 结构体指针,核心层HDMI控制器;
**enable**: bool,使能/去使能|无|无|黑屏设置| - |videoMuteEnable|**cntlr**: 结构体指针,核心层HDMI控制器;
**enable**: bool,使能/去使能|无|无|使能/去使能video静音| - |videoPathSet|**cntlr**: 结构体指针,核心层HDMI控制器;
**attr**: 配置信息|无|无|设置viedo通路配置信息| - |audioMuteEnable|**cntlr**: 结构体指针,核心层HDMI控制器;
**enable**: bool,使能/去使能|无|无|使能/去使能audio静音| - |avmuteSet|**cntlr**: 结构体指针,核心层HDMI控制器;
**enable**: bool,使能/去使能|无|无|使能/去使能声音图像消隐| - |ddcTransfer|**cntlr**: 结构体指针,核心层HDMI控制器;
**ddcCfg**:DDC配置参数|**ddcCfg**:DDC配置参数|HDF_STATUS相关状态|DDC读写数据| - |scdcSourceScrambleGet|**cntlr**: 结构体指针,核心层HDMI控制器;|无|bool,加扰状态|获取source端的加扰状态| - |scdcSourceScrambleSet|**cntlr**: 结构体指针,核心层HDMI控制器;
**enable**: bool,使能/去使能|无|HDF_STATUS相关状态|使能/去使能source端的加扰| - |frlEnable|**cntlr**: 结构体指针,核心层HDMI控制器;
**enable**: bool,使能/去使能|无|HDF_STATUS相关状态|使能/去使能FRL| - |audioNctsSet|**cntlr**: 结构体指针,核心层HDMI控制器;
**cfg**:N/CTS配 置参数|无|HDF_STATUS相关状态|设置audio的N/CTS信息| - |frlTrainingConfigSet|**cntlr**: 结构体指针,核心层HDMI控制器;
**cfg**:FRL Traning配置参数|无|无|设置FRL Traning配置信息| - |frlTrainingStart|**cntlr**: 结构体指针,核心层HDMI控制器;|无|无|开始FRL Traning流程| - |frlGetTriningRslt|**cntlr**: 结构体指针,核心层HDMI控制器;|**rslt**:FRL Traning结果|无|获取FRL Traning结果| - |hdcpRegInit|**cntlr**: 结构体指针,核心层HDMI控制器;|无|无|初始化HDCP流程相关的寄存器| - |hdcpGenerateAksvAndAn|**cntlr**: 结构体指针,核心层HDMI控制器;|无|HDF_STATUS相关状态|HDCP流程中生成aksv和an| - |hdcpOptReg|**cntlr**: 结构体指针,核心层HDMI控制器;
**type**: 操作类型
**data**: 寄存器数据
**len**: 数据长度|**data**: 寄存器数据|HDF_STATUS相关状态|HDCP流程中的相关寄存器读写操作| - |hdrTimerSet|**cntlr**: 结构体指针,核心层HDMI控制器;
**config**: timer配置信息|无|无|设置HDR相关的timer配置信息| - -## 开发实例 - -1. 驱动开发首先需要实例化驱动入口,驱动入口必须为HdfDriverEntry(在 hdf_device_desc.h 中定义)类型的全局变量,且moduleName要和device_info.hcs中保持一致。HDF框架会将所有加载的驱动的HdfDriverEntry对象首地址汇总,形成一个类似数组的段地址空间,方便上层调用。 - - 一般在加载驱动时HDF会先调用Bind函数,再调用Init函数加载该驱动。当Init调用异常时,HDF框架会调用Release释放驱动资源并退出。 - - HDMI驱动入口参考: - - ```c - struct HdfDriverEntry g_hdmiDriverEntry = { - .moduleVersion = 1, - .Bind = HdmiAdapterBind, - .Init = HdmiAdapterInit, - .Release = HdmiAdapterRelease, - .moduleName = "adapter_hdmi_driver",//【必要】与HCS里面的名字匹配 - }; - HDF_INIT(g_hdmiDriverEntry); //调用HDF_INIT将驱动入口注册到HDF框架中 - ``` - -2. 完成驱动入口注册之后,下一步请在device_info.hcs文件中添加deviceNode信息,并在hdmi_config.hcs中配置器件属性。deviceNode信息与驱动入口注册相关,器件属性值对于厂商驱动的实现以及核心层HdmiCntlr相关成员的默认值或限制范围有密切关系。 - - 从第一个节点开始配置具体HDMI控制器信息,此节点并不表示某一路HDMI控制器,而是代表一个资源性质设备,用于描述一类HDMI控制器的信息。本例只有一个HDMI控制器,如有多个控制器,则需要在device_info文件增加deviceNode信息,以及在hdmi_config文件中增加对应的器件属性。 - - - device_info.hcs 配置参考 - - ```c - root { - platform :: host { - device_hdmi :: device { - device0 :: deviceNode { - policy = 2; // 等于2,需要发布服务 - priority = 20; // 驱动启动优先级 - permission = 0644; // 驱动创建设备节点权限 - serviceName = "HDF_PLATFORM_HDMI_0"; //【必要】驱动对外发布服务的名称,必须唯一 - moduleName = "hdmi_driver"; //【必要】用于指定驱动名称,需要与期望的驱动Entry中的moduleName一致; - deviceMatchAttr = "adapter_hdmi_driver"; //【必要】用于配置控制器私有数据,要与hdmi_config.hcs中对应控制器保持一致 - } // 具体的控制器信息在 hdmi_config.hcs 中 - } - } - } - ``` - - - hdmi_config.hcs 配置参考 - - ```c - root { - platform { - hdmi_config { - template hdmi_controller { // 模板公共参数,继承该模板的节点如果使用模板中的默认值,则节点字段可以缺省 - match_attr = ""; //【必要】需要和device_info.hcs中的deviceMatchAttr值一致 - index = 0; //【必要】hdmi控制器编号 - regBasePhy = 0x10100000; //【必要】寄存器物理基地址 - regSize = 0xd1; //【必要】寄存器位宽 - irqNum = 100; //【必要】中断号 - maxTmdsClock = 300; - videoTiming = 10; - quantization = 1; - colorSpace = 0; - colorimetry = 0; - audioIfType = 0; - audioBitDepth = 1; - audioSampleRate = 2; - audioChannels = 1; - hdrColorimetry = 4; - hdrUserMode = 1; - cap = 0xd001e045; - } - controller_0x10100000 :: hdmi_controller { - match_attr = "adapter_hdmi_driver"; - index = 0; - regBasePhy = 0x10100000; - irqNum = 100; - maxTmdsClock = 400; - defTmdsClock = 300; - maxFrlRate = 600; - videoTiming = 10; - quantization = 1; - colorSpace = 0; - colorimetry = 0; - audioIfType = 0; - audioSampleRate = 2; - audioChannels = 1; - hdrColorimetry = 4; - hdrUserMode = 1; - cap = 0xd001e045; - } - } - } - } - ``` - -3. 最后一步,完成驱动入口注册之后,要以核心层HdmiCntlr对象的初始化为核心,包括厂商自定义结构体(传递参数和数据),实例化HdmiCntlr成员HdmiCntlrOps(让用户可以通过接口来调用驱动底层函数),实现HdfDriverEntry成员函数(Bind,Init,Release)。 - - - 自定义结构体参考 - - >  **说明:** - > 从驱动角度看,自定义结构体是参数和数据的载体。HDF会读取hdmi_config.hcs文件中的数值并通过DeviceResourceIface来初始化结构体成员,且其中一些重要数值(例如设备号、总线号等)也会被传递给核心层HdmiCntlr对象。 - - ```c - struct HdmiAdapterHost { - struct HdmiCntlr *cntlr; //【必要】是核心层控制对象,具体描述如下 - volatile unsigned char *regBase;//【必要】寄存器基地址 - uint32_t regBasePhy; //【必要】寄存器物理基地址 - uint32_t regSize; //【必要】寄存器位宽 - uint32_t irqNum; //【必要】中断号 - }; - - /* HdmiCntlr是核心层控制器结构体,其中的成员在Init函数中被赋值 */ - struct HdmiCntlr { - struct IDeviceIoService service; - struct HdfDeviceObject *hdfDevObj; - struct PlatformDevice device; - struct OsalMutex mutex; - struct PlatformQueue *msgQueue; - struct HdmiCntlrCap cap; - struct HdmiAttr attr; - struct HdmiCntlrOps *ops; - uint32_t deviceIndex; - uint32_t state; // 控制器状态 - enum HdmiTmdsModeType tmdsMode; - struct HdmiDevice *hdmi; - struct HdmiInfoframe infoframe; - struct HdmiScdc *scdc; - struct HdmiDdc ddc; - struct HdmiFrl *frl; - struct HdmiHdcp *hdcp; - struct HdmiCec *cec; - struct HdmiEvent event; - struct HdmiHdr *hdr; - void *priv; - }; - ``` - - - **【重要】** HdmiCntlr成员回调函数结构体HdmiCntlrOps的实例化 - - ```c - static struct HdmiCntlrOps g_hdmiAdapterHostOps = { - .hardWareInit = HdmiAdapterHardWareInit, - .hardWareStatusGet = HdmiAdapterHardWareStatusGet, - .controllerReset = HdmiAdapterControllerReset, - .hotPlugStateGet = HdmiAdapterHotPlugStateGet, - .hotPlugInterruptStateGet = HdmiAdapterHotPlugInterruptStateGet, - .lowPowerSet = HdmiAdapterLowPowerSet, - .tmdsModeSet = HdmiAdapterTmdsModeSet, - .tmdsConfigSet = HdmiAdapterTmdsConfigSet, - .infoframeEnable = HdmiAdapterInfoframeEnable, - .infoframeSend = HdmiAdapterInfoframeSend, - .infoframeDataSet = HdmiAdapterInfoframeDataSet, - .cecMsgSend = HdmiAdapterCecMsgSend, - .audioPathEnable = HdmiAdapterAudioPathEnable, - .audioPathSet = HdmiAdapterAudioPathSet, - .phyOutputEnable = HdmiAdapterPhyOutputEnable, - .phyOutputSet = HdmiAdapterPhyOutputSet, - .blackDataSet = HdmiAdapterBlackDataSet, - .videoMuteEnable = HdmiAdapterVideoMuteEnable, - .videoPathSet = HdmiAdapterVideoPathSet, - .audioMuteEnable = HdmiAdapterAudioMuteEnable, - .avmuteSet = HdmiAdapterAvmuteSet, - .ddcTransfer = HdmiAdapterDdcTransfer, - .scdcSourceScrambleGet = HdmiAdapterScdcSourceScrambleGet, - .scdcSourceScrambleSet = HdmiAdapterScdcSourceScrambleSet, - .frlSet = HdmiAdapterFrlSet, - .frlEnable = HdmiAdapterFrlEnable, - .audioNctsSet = HdmiAdapterAudioNctsSet, - .frlTrainingConfigSet = HdmiAdapterFrlTrainingConfigSet, - .frlTrainingStart = HdmiAdapterFrlTrainingStart, - .frlGetTriningRslt = HdmiAdapterFrlGetTriningRslt, - .hdcpRegInit = HdmiAdapterHdcpRegInit, - .hdcpGenerateAksvAndAn = HdmiAdapterHdcpGenerateAksvAndAn, - .hdcpOptReg = HdmiAdapterHdcpOptReg, - .hdrTimerSet = HdmiAdapterHdrTimerSet, - }; - ``` - - - **Bind函数参考** - - > **入参:** - > HdfDeviceObject 是整个驱动对外呈现的接口参数,具备 HCS 配置文件的信息 - > - > **返回值:** - > HDF_STATUS相关状态 (下表为部分展示,如需使用其他状态,可见//drivers/framework/include/utils/hdf_base.h中HDF_STATUS 定义) - - |状态(值)|状态描述| - |:-|:-| - |HDF_ERR_INVALID_OBJECT|控制器对象非法| - |HDF_ERR_INVALID_PARAM |参数非法| - |HDF_ERR_MALLOC_FAIL |内存分配失败| - |HDF_ERR_IO |I/O 错误| - |HDF_SUCCESS |传输成功| - |HDF_FAILURE |传输失败| - - > **函数说明:** - > 初始化自定义结构体对象HdmiAdapterHost,初始化HdmiCntlr成员,调用核心层HdmiCntlrAdd函数。 - > - > HdmiCntlr,HdmiAdapterHost,HdfDeviceObject之间互相赋值,方便其他函数可以相互转化。 - - ```c - static int32_t HdmiAdapterBind(struct HdfDeviceObject *obj) - { - struct HdmiCntlr *cntlr = NULL; - struct HimciAdapterHost *host = NULL; - int32_t ret; - cntlr = (struct HdmiCntlr *)OsalMemCalloc(sizeof(struct HdmiCntlr)); - if (cntlr == NULL) { - HDF_LOGE("%s: malloc cntlr failed!", __func__); - return HDF_ERR_MALLOC_FAIL; - } - host = (struct HimciAdapterHost *)OsalMemCalloc(sizeof(struct HimciAdapterHost)); - if (host == NULL) { - HDF_LOGE("%s: malloc host failed!", __func__); - return HDF_ERR_MALLOC_FAIL; - } - cntlr->priv = (void *)host; //【必要】将host存放至cntlr的私有数据 - cntlr->ops = &g_hdmiHostOps; //【必要】HdmiCntlrOps的实例化对象的挂载 - cntlr->hdfDevObj = obj; //【必要】使HdfDeviceObject与HdmiCntlr可以相互转化的前提 - obj->service = &cntlr->service; //【必要】使HdfDeviceObject与HdmiCntlr可以相互转化的前提 - ret = HdmiAdapterCntlrParse(cntlr, obj); //【必要】 初始化 cntlr. 失败则 goto __ERR; - ... - ret = HdmiAdapterHostParse(host, obj); //【必要】 初始化 host对象的相关属性,失败则 goto __ERR; - ... - ret = HdmiAdapterHostInit(host, cntlr); //厂商自定义的初始化,失败则 goto __ERR; - ... - ret = HdmiCntlrAdd(cntlr); //调用核心层函数 失败则 goto __ERR; - ... - HDF_LOGD("HdmiAdapterBind: success."); - return HDF_SUCCESS; - __ERR: - HdmiAdapterDeleteHost(host); - HDF_LOGD("HdmiAdapterBind: fail, err = %d.", ret); - return ret; - } - ``` - - - **init函数参考** - - >**入参:** - >HdfDeviceObject 是整个驱动对外暴露的接口参数,具备 HCS 配置文件的信息 - > - >**返回值:** - >HDF_STATUS相关状态 - > - >函数说明: - > - >实现HdmiAdapterInit函数。 - - ```c - static int32_t HdmiAdapterInit(struct HdfDeviceObject *obj) - { - return HDF_SUCCESS; - } - ``` - - - **Release 函数参考** - - > **入参:** - > HdfDeviceObject 是整个驱动对外暴露的接口参数,具备 HCS 配置文件的信息 - > - > **返回值:** - > 无 - > - > **函数说明:** - > 释放内存和删除控制器,该函数需要在驱动入口结构体中赋值给 Release 接口, 当HDF框架调用Init函数初始化驱动失败时,可以调用 Release 释放驱动资源。 - - ```c - static void HdmiAdapterRelease(struct HdfDeviceObject *obj) - { - struct HdmiCntlr *cntlr = NULL; - ... - cntlr = (struct HdmiCntlr *)obj->service;//这里有HdfDeviceObject到HdmiCntlr的强制转化,通过service成员,赋值见Bind函数 - ... - HimciDeleteHost((struct HimciAdapterHost *)cntlr->priv);//厂商自定义的内存释放函数,这里有HdmiCntlr到HimciAdapterHost的强制转化 - } - ``` - > 所有强制转换获取相应对象的操作**前提**是在Init函数中具备对应赋值的操作。 diff --git "a/website/docs/01.OpenHarmony/05.\345\255\220\347\263\273\347\273\237\345\274\200\345\217\221/02.\351\251\261\345\212\250/02.\345\271\263\345\217\260\351\251\261\345\212\250\345\274\200\345\217\221/04.I2C.md" "b/website/docs/01.OpenHarmony/05.\345\255\220\347\263\273\347\273\237\345\274\200\345\217\221/02.\351\251\261\345\212\250/02.\345\271\263\345\217\260\351\251\261\345\212\250\345\274\200\345\217\221/04.I2C.md" deleted file mode 100644 index 909a68137ca0aa42cf7431a32fad438f988a8f3b..0000000000000000000000000000000000000000 --- "a/website/docs/01.OpenHarmony/05.\345\255\220\347\263\273\347\273\237\345\274\200\345\217\221/02.\351\251\261\345\212\250/02.\345\271\263\345\217\260\351\251\261\345\212\250\345\274\200\345\217\221/04.I2C.md" +++ /dev/null @@ -1,414 +0,0 @@ ---- -title: I2C -permalink: /pages/0105020204 -navbar: true -sidebar: true -prev: true -next: true -search: true -article: true -comment: false -editLink: false -date: 2022-02-14 21:31:23 ---- -# I2C - -- [概述](#section2040078630114257) -- [接口说明](#section752964871810) -- [开发步骤](#section1085786591114257) -- [开发实例](#section1773332551114257) - -## 概述 - -I2C(Inter Integrated Circuit)总线是由Philips公司开发的一种简单、双向二线制同步串行总线,在HDF框架中,I2C模块接口适配模式采用统一服务模式,这需要一个设备服务来作为I2C模块的管理器,统一处理外部访问,这会在配置文件中有所体现。统一服务模式适合于同类型设备对象较多的情况,如I2C可能同时具备十几个控制器,采用独立服务模式需要配置更多的设备节点,且服务会占据内存资源。 - -**图 1** I2C统一服务模式结构图 - - -## 接口说明 - -I2cMethod和I2cLockMethod定义: - -``` -struct I2cMethod { -int32_t (*transfer)(struct I2cCntlr *cntlr, struct I2cMsg *msgs, int16_t count); -}; -struct I2cLockMethod {//锁机制操作结构体 - int32_t (*lock)(struct I2cCntlr *cntlr);//加锁 - void (*unlock)(struct I2cCntlr *cntlr); //解锁 -}; -``` - -**表 1** I2cMethod结构体成员的回调函数功能说明 - - -
- | -- | -- | -- | -- | -
---|---|---|---|---|
- | -- | -- | -- | -- | -
- | -- | -
---|---|
- | -- | -
- | -- | -
- | -- | -
- | -- | -
- | -- | -
---|---|
- | -- | -
- | -- | -
- | -- | -
- | -- | -
- | -- | -
- | -- | -
**ccc**:传入的通用命令代码结构体指针;|**ccc**:传出的通用命令代码结构体指针;|HDF_STATUS相关状态|发送CCC(Common command Code,即通用命令代码)| - |Transfer |**cntlr**: 结构体指针,核心层I3C控制器;
**msgs**:结构体指针,用户消息 ;
**count**:int16_t,消息数量|**msgs**:结构体指针,用户消息 ;|HDF_STATUS相关状态|使用I3C模式传递用户消息| - |i2cTransfer |**cntlr**: 结构体指针,核心层I3C控制器;
**msgs**:结构体指针,用户消息 ;
**count**:int16_t,消息数量|**msgs**:结构体指针,用户消息 ;|HDF_STATUS相关状态|使用I2C模式传递用户消息| - |setConfig|**cntlr**: 结构体指针,核心层I3C控制器;
**config**: 控制器配置参数|无|HDF_STATUS相关状态|设置I3C控制器配置参数| - |getConfig|**cntlr**: 结构体指针,核心层I3C控制器;|**config**: 控制器配置参数|HDF_STATUS相关状态|获取I3C控制器配置参数| - |requestIbi|**device**: 结构体指针,核心层I3C设备;|无|HDF_STATUS相关状态|为I3C设备请求IBI(In-Bind Interrupt,即带内中断)| - |freeIbi|**device**: 结构体指针,核心层I3C设备;|无|HDF_STATUS相关状态|释放IBI| - -## 开发实例 - -1. 驱动开发首先需要实例化驱动入口,驱动入口必须为HdfDriverEntry(在 hdf_device_desc.h 中定义)类型的全局变量,且moduleName要和device_info.hcs中保持一致。HDF框架会将所有加载的驱动的HdfDriverEntry对象首地址汇总,形成一个类似数组的段地址空间,方便上层调用。 - - 一般在加载驱动时HDF会先调用Bind函数,再调用Init函数加载该驱动。当Init调用异常时,HDF框架会调用Release释放驱动资源并退出。 - - I3C驱动入口参考: - - > I3C模块这种类型的控制器会出现很多个控制器挂接的情况,因而在HDF框架中首先会为这类型的控制器创建一个管理器对象,并同时对外发布一个管理器服务来统一处理外部访问。这样,用户需要打开某个控制器时,会先获取到管理器服务,然后管理器服务根据用户指定参数查找到指定控制器。 - > - > I3C管理器服务的驱动由核心层实现,**厂商不需要关注这部分内容的实现,但在实现Init函数的时候需要调用核心层的I3cCntlrAdd函数,它会实现相应功能。** - - ```c - static struct HdfDriverEntry g_virtualI3cDriverEntry = { - .moduleVersion = 1, - .Init = VirtualI3cInit, - .Release = VirtualI3cRelease, - .moduleName = "virtual_i3c_driver",//【必要且与 HCS 里面的名字匹配】 - }; - HDF_INIT(g_virtualI3cDriverEntry); //调用HDF_INIT将驱动入口注册到HDF框架中 - - /* 核心层i3c_core.c管理器服务的驱动入口 */ - struct HdfDriverEntry g_i3cManagerEntry = { - .moduleVersion = 1, - .Init = I3cManagerInit, - .Release = I3cManagerRelease, - .moduleName = "HDF_PLATFORM_I3C_MANAGER",//这与device_info文件中device0对应 - }; - HDF_INIT(g_i3cManagerEntry); - ``` - -2. 完成驱动入口注册之后,下一步请在device_info.hcs文件中添加deviceNode信息,并在i3c_config.hcs中配置器件属性。deviceNode信息与驱动入口注册相关,器件属性值对于厂商驱动的实现以及核心层I3cCntlr相关成员的默认值或限制范围有密切关系。 - - **统一服务模式**的特点是device_info文件中第一个设备节点必须为I3C管理器,其各项参数必须如下设置: - - |成员名|值| - |-|-| - |moduleName |HDF_PLATFORM_I3C_MANAGER| - |serviceName|无(预留)| - |policy|0| - |cntlrMatchAttr| 无(预留)| - - 从第二个节点开始配置具体I3C控制器信息,此节点并不表示某一路I3C控制器,而是代表一个资源性质设备,用于描述一类I3C控制器的信息。本例只有一个I3C控制器,如有多个控制器,则需要在device_info文件增加deviceNode信息,以及在i3c_config文件中增加对应的器件属性。 - - - device_info.hcs 配置参考 - - ```c - root { - device_i3c :: device { - device0 :: deviceNode { - policy = 0; - priority = 52; - permission = 0644; - serviceName = "HDF_PLATFORM_I3C_MANAGER"; - moduleName = "HDF_PLATFORM_I3C_MANAGER"; - } - } - i3c_virtual :: deviceNode { - policy = 0; // 等于0,不需要发布服务 - priority = 56; // 驱动启动优先级 - permission = 0644; // 驱动创建设备节点权限 - moduleName = "virtual_i3c_driver"; //【必要】用于指定驱动名称,需要与期望的驱动Entry中的moduleName一致; - serviceName = "VIRTUAL_I3C_DRIVER"; //【必要】驱动对外发布服务的名称,必须唯一 - deviceMatchAttr = "virtual_i3c"; //【必要】用于配置控制器私有数据,要与i3c_config.hcs中对应控制器保持一致 - } // 具体的控制器信息在 i3c_config.hcs 中 - } - ``` - - - i3c_config.hcs 配置参考 - - ```c - root { - platform { - i3c_config { - match_attr = "virtual_i3c"; //【必要】需要和device_info.hcs中的deviceMatchAttr值一致 - template i3c_controller { // 模板公共参数,继承该模板的节点如果使用模板中的默认值,则节点字段可以缺省 - busId = 0; //【必要】i3c总线号 - busMode = 0x0; // 总线模式,0x0:纯净; 0x1:混合高速; 0x2:混合受限; 0x3: 混合低速; - regBasePhy = 0x120b0000; //【必要】物理基地址 - regSize = 0xd1; //【必要】寄存器位宽 - IrqNum = 20; //【必要】中断号 - i3cMaxRate = 12900000; //【可选】i3c模式最大时钟速率 - i3cRate = 12500000; //【可选】i3c模式时钟速率 - i2cFmRate = 1000000; //【可选】i2c FM模式时钟速率 - i2cFmPlusRate = 400000; //【可选】i2c FM+模式时钟速率 - } - controller_0 :: i3c_controller { - busId = 18; - IrqNum = 20; - } - } - } - } - ``` - -3. 配置属性文件完成后,要以核心层I3cCntlr对象的初始化为核心,包括厂商自定义结构体(传递参数和数据),实例化I3cCntlr成员I3cMethod(让用户可以通过接口来调用驱动底层函数)。 - - 此步骤需要通过实现HdfDriverEntry成员函数(Bind,Init,Release)来完成。 - - - 自定义结构体参考 - - > 从驱动的角度看,自定义结构体是参数和数据的载体,而且i3c_config.hcs文件中的数值会被HDF读入通过DeviceResourceIface来初始化结构体成员,其中一些重要数值也会传递给核心层I3cCntlr对象,例如设备号、总线号等。 - - ```c - struct VirtualI3cCntlr { - struct I3cCntlr cntlr; //【必要】是核心层控制对象,具体描述见下面 - volatile unsigned char *regBase;//【必要】寄存器基地址 - uint32_t regBasePhy; //【必要】寄存器物理基地址 - uint32_t regSize; //【必要】寄存器位宽 - uint16_t busId; //【必要】设备号 - uint16_t busMode; - uint16_t IrqNum; - uint32_t i3cMaxRate; - uint32_t i3cRate; - uint32_t i2cFmRate; - uint32_t i2cFmPlusRate; - }; - - /* I3cCntlr是核心层控制器结构体,其中的成员在Init函数中被赋值 */ - struct I3cCntlr { - OsalSpinlock lock; - void *owner; - int16_t busId; - struct I3cConfig config; - uint16_t addrSlot[(I3C_ADDR_MAX + 1) / ADDRS_PER_UINT16]; - struct I3cIbiInfo *ibiSlot[I3C_IBI_MAX]; - const struct I3cMethod *ops; - const struct I3cLockMethod *lockOps; - void *priv; - }; - ``` - - > **【重要】** I3cCntlr成员回调函数结构体I3cMethod的实例化,I3cLockMethod回调函数结构体本例未实现,若要实例化,可参考I2C驱动开发,其他成员在Init函数中初始化 - - - - **init函数参考** - - > **入参:** - > HdfDeviceObject 是整个驱动对外暴露的接口参数,具备 HCS 配置文件的信息 - > - > **返回值:** - > HDF_STATUS相关状态 (下表为部分展示,如需使用其他状态,可见//drivers/framework/include/utils/hdf_base.h中HDF_STATUS 定义) - - |状态(值)|问题描述| - |:-|:-:| - |HDF_ERR_INVALID_OBJECT|控制器对象非法| - |HDF_ERR_INVALID_PARAM |参数非法| - |HDF_ERR_MALLOC_FAIL |内存分配失败| - |HDF_ERR_IO |I/O 错误| - |HDF_SUCCESS |传输成功| - |HDF_FAILURE |传输失败| - - > **函数说明:** - > 初始化自定义结构体对象,初始化I3cCntlr成员,调用核心层I3cCntlrAdd函数。 - - ```c - static int32_t VirtualI3cParseAndInit(struct HdfDeviceObject *device, const struct DeviceResourceNode *node) - { - int32_t ret; - struct VirtualI3cCntlr *virtual = NULL; //【必要】自定义结构体对象 - (void)device; - - virtual = (struct VirtualI3cCntlr *)OsalMemCalloc(sizeof(*virtual)); //【必要】内存分配 - if (virtual == NULL) { - HDF_LOGE("%s: Malloc virtual fail!", __func__); - return HDF_ERR_MALLOC_FAIL; - } - - ret = VirtualI3cReadDrs(virtual, node); //【必要】将i3c_config文件的默认值填充到结构体中 - if (ret != HDF_SUCCESS) { - HDF_LOGE("%s: Read drs fail! ret:%d", __func__, ret); - goto __ERR__; - } - ... - virtual->regBase = OsalIoRemap(virtual->regBasePhy, virtual->regSize);//【必要】地址映射 - ret = OsalRegisterIrq(hi35xx->softIrqNum, OSAL_IRQF_TRIGGER_NONE, I3cIbiHandle, "I3C", virtual); //【必要】注册中断程序 - if (ret != HDF_SUCCESS) { - HDF_LOGE("%s: register irq failed!", __func__); - return ret; - } - ... - VirtualI3cCntlrInit(virtual); //【必要】I3C设备的初始化 - virtual->cntlr.priv = (void *)node; //【必要】存储设备属性 - virtual->cntlr.busId = virtual->busId; //【必要】初始化I3cCntlr成员 - virtual->cntlr.ops = &g_method; //【必要】I3cMethod的实例化对象的挂载 - (void)OsalSpinInit(&virtual->spin); - ret = I3cCntlrAdd(&virtual->cntlr); //【必要且重要】调用此函数将控制器添加至核心,返回成功信号后驱动才完全接入平台核心层 - if (ret != HDF_SUCCESS) { - HDF_LOGE("%s: add i3c controller failed! ret = %d", __func__, ret); - (void)OsalSpinDestroy(&virtual->spin); - goto __ERR__; - } - - return HDF_SUCCESS; - __ERR__: //若控制器添加失败,需要执行去初始化相关函数 - if (virtual != NULL) { - OsalMemFree(virtual); - virtual = NULL; - } - - return ret; - } - - static int32_t VirtualI3cInit(struct HdfDeviceObject *device) - { - int32_t ret; - const struct DeviceResourceNode *childNode = NULL; - - if (device == NULL || device->property == NULL) { - HDF_LOGE("%s: device or property is NULL", __func__); - return HDF_ERR_INVALID_OBJECT; - } - - DEV_RES_NODE_FOR_EACH_CHILD_NODE(device->property, childNode) { - ret = VirtualI3cParseAndInit(device, childNode); - if (ret != HDF_SUCCESS) { - break; - } - } - - return ret; - } - ``` - - - **Release 函数参考** - - > **入参:** - > HdfDeviceObject 是整个驱动对外暴露的接口参数,具备 HCS 配置文件的信息 。 - > - > **返回值:** - > 无。 - > - > **函数说明:** - > 释放内存和删除控制器,该函数需要在驱动入口结构体中赋值给 Release 接口, 当HDF框架调用Init函数初始化驱动失败时,可以调用 Release 释放驱动资源。所有强制转换获取相应对象的操作**前提**是在Init函数中具备对应赋值的操作。 - - ```c - static void VirtualI3cRemoveByNode(const struct DeviceResourceNode *node) - { - int32_t ret; - int16_t busId; - struct I3cCntlr *cntlr = NULL; - struct VirtualI3cCntlr *virtual = NULL; - struct DeviceResourceIface *drsOps = NULL; - - drsOps = DeviceResourceGetIfaceInstance(HDF_CONFIG_SOURCE); - if (drsOps == NULL || drsOps->GetUint32 == NULL) { - HDF_LOGE("%s: invalid drs ops fail!", __func__); - return; - } - - ret = drsOps->GetUint16(node, "busId", (uint16_t *)&busId, 0); - if (ret != HDF_SUCCESS) { - HDF_LOGE("%s: read busId fail!", __func__); - return; - } - ... - /* 可以调用I3cCntlrGet函数通过设备的cntlrNum获取I3cCntlr对象, 以及调用I3cCntlrRemove函数来释放I3cCntlr对象的内容 */ - cntlr = I3cCntlrGet(busId); - if (cntlr != NULL && cntlr->priv == node) { - I3cCntlrPut(cntlr); - I3cCntlrRemove(cntlr); //【必要】主要是从管理器驱动那边移除I3cCntlr对象 - virtual = (struct VirtualI3cCntlr *)cntlr;//【必要】通过强制转换获取自定义的对象并进行release操作 - (void)OsalSpinDestroy(&virtual->spin); - OsalMemFree(virtual); - } - return; - } - - static void VirtualI3cRelease(struct HdfDeviceObject *device) - { - const struct DeviceResourceNode *childNode = NULL; - - HDF_LOGI("%s: enter", __func__); - - if (device == NULL || device->property == NULL) { - HDF_LOGE("%s: device or property is NULL", __func__); - return; - } - ... - //遍历、解析i3c_config.hcs中的所有配置节点,并分别进行release操作 - DEV_RES_NODE_FOR_EACH_CHILD_NODE(device->property, childNode) { - VirtualI3cRemoveByNode(childNode); //函数定义如上 - } - } - ``` - -4. 最后一步,实现中断处理程序,在中断处理程序中通过判断中断产生的地址,实现热接入、IBI等操作。 - - ```c - static int32_t VirtualI3cReservedAddrWorker(struct VirtualI3cCntlr *virtual, uint16_t addr) - { - (void)virtual; - switch (addr) { - case I3C_HOT_JOIN_ADDR: - VirtualI3cHotJoin(virtual); - break; - case I3C_RESERVED_ADDR_7H3E: - case I3C_RESERVED_ADDR_7H5E: - case I3C_RESERVED_ADDR_7H6E: - case I3C_RESERVED_ADDR_7H76: - case I3C_RESERVED_ADDR_7H7A: - case I3C_RESERVED_ADDR_7H7C: - case I3C_RESERVED_ADDR_7H7F: - /* 广播地址单比特错误的所有情形 */ - HDF_LOGW("%s: broadcast Address single bit error!", __func__); - break; - default: - HDF_LOGD("%s: Reserved address which is not supported!", __func__); - break; - } - - return HDF_SUCCESS; - } - ``` - - ```c - static int32_t I3cIbiHandle(uint32_t irq, void *data) - { - struct VirtualI3cCntlr *virtual = NULL; - struct I3cDevice *device = NULL; - uint16_t ibiAddr; - char *testStr = "Hello I3C!"; - - (void)irq; - if (data == NULL) { - HDF_LOGW("%s: data is NULL!", __func__); - return HDF_ERR_INVALID_PARAM; - } - virtual = (struct VirtualI3cCntlr *)data; - /* 【必要】获取产生中断的地址,使用CHECK_RESERVED_ADDR宏判断该地址是否为I3C保留地址 */ - ibiAddr = VirtualI3cGetIbiAddr(); - if (CHECK_RESERVED_ADDR(ibiAddr) == I3C_ADDR_RESERVED) { - HDF_LOGD("%s: Calling VirtualI3cResAddrWorker...", __func__); - return VirtualI3cReservedAddrWorker(virtual, ibiAddr); - } else { - HDF_LOGD("%s: Calling I3cCntlrIbiCallback...", __func__); - device = GetDeviceByAddr(&virtual->cntlr, ibiAddr); - if (device == NULL) { - HDF_LOGE("func:%s device is NULL!",__func__); - return HDF_ERR_MALLOC_FAIL; - } - if (device->ibi->payload > VIRTUAL_I3C_TEST_STR_LEN) { - /* 将字符串"Hello I3C!"放入IBI缓冲区内 */ - *device->ibi->data = *testStr; - } - /* 根据产生IBI的I3C设备调用IBI回调函数 */ - return I3cCntlrIbiCallback(device); - } - - return HDF_SUCCESS; - } - ``` \ No newline at end of file diff --git "a/website/docs/01.OpenHarmony/05.\345\255\220\347\263\273\347\273\237\345\274\200\345\217\221/02.\351\251\261\345\212\250/02.\345\271\263\345\217\260\351\251\261\345\212\250\345\274\200\345\217\221/06.MIPI-CSI.md" "b/website/docs/01.OpenHarmony/05.\345\255\220\347\263\273\347\273\237\345\274\200\345\217\221/02.\351\251\261\345\212\250/02.\345\271\263\345\217\260\351\251\261\345\212\250\345\274\200\345\217\221/06.MIPI-CSI.md" deleted file mode 100644 index 8192ebc8df998b04d15229b0ca482b75077a470f..0000000000000000000000000000000000000000 --- "a/website/docs/01.OpenHarmony/05.\345\255\220\347\263\273\347\273\237\345\274\200\345\217\221/02.\351\251\261\345\212\250/02.\345\271\263\345\217\260\351\251\261\345\212\250\345\274\200\345\217\221/06.MIPI-CSI.md" +++ /dev/null @@ -1,327 +0,0 @@ ---- -title: MIPI-CSI -permalink: /pages/0105020206 -navbar: true -sidebar: true -prev: true -next: true -search: true -article: true -comment: false -editLink: false -date: 2022-02-14 21:31:23 ---- -# MIPI-CSI - -- [概述](#section1_MIPI_CSIDevelop) -- [接口说明](#section2_MIPI_CSIDevelop) -- [开发步骤](#section3_MIPI_CSIDevelop) -- [开发实例](#section4_MIPI_CSIDevelop) - -## 概述 - -CSI(Camera Serial Interface)是由MIPI(Mobile Industry Processor Interface )联盟下Camera工作组指定的接口标准。在HDF框架中,MIPI-CSI的接口适配模式采用无服务模式,用于不需要在用户态提供API的设备类型,或者没有用户态和内核区分的OS系统,MIPI-CSI的接口关联方式是DevHandle直接指向设备对象内核态地址(DevHandle是一个void类型指针)。 - -图 1 无服务模式结构图 - - -## 接口说明 - -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-CSI模块适配的三个环节是配置属性文件、实例化驱动入、以及实例化核心层接口函数。 - -1. **实例化驱动入口:** - - 实例化HdfDriverEntry结构体成员。 - - 调用HDF_INIT将HdfDriverEntry实例化对象注册到HDF框架中。 - -2. **配置属性文件:** - - - 在device_info.hcs文件中添加deviceNode描述。 - - 【可选】添加mipicsi_config.hcs器件属性文件。 - -3. **实例化MIPICSI控制器对象:** - - 初始化MipiCsiCntlr成员。 - - 实例化MipiCsiCntlr成员MipiCsiCntlrMethod。 - > **说明:** - >实例化MipiCsiCntlr成员MipiCsiCntlrMethod,其定义和成员说明见[接口说明](#section2_MIPI_CSIDevelop)。 - -4. **驱动调试:** - - 【可选】针对新增驱动程序,建议验证驱动基本功能,例如挂载后的信息反馈,数据传输的成功与否等。 - - -## 开发实例 - -下方将以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/website/docs/01.OpenHarmony/05.\345\255\220\347\263\273\347\273\237\345\274\200\345\217\221/02.\351\251\261\345\212\250/02.\345\271\263\345\217\260\351\251\261\345\212\250\345\274\200\345\217\221/07.MIPI-DSI.md" "b/website/docs/01.OpenHarmony/05.\345\255\220\347\263\273\347\273\237\345\274\200\345\217\221/02.\351\251\261\345\212\250/02.\345\271\263\345\217\260\351\251\261\345\212\250\345\274\200\345\217\221/07.MIPI-DSI.md" deleted file mode 100644 index 36c6912741da96295a431a8a973a1e20620ddee9..0000000000000000000000000000000000000000 --- "a/website/docs/01.OpenHarmony/05.\345\255\220\347\263\273\347\273\237\345\274\200\345\217\221/02.\351\251\261\345\212\250/02.\345\271\263\345\217\260\351\251\261\345\212\250\345\274\200\345\217\221/07.MIPI-DSI.md" +++ /dev/null @@ -1,352 +0,0 @@ ---- -title: MIPI-DSI -permalink: /pages/0105020207 -navbar: true -sidebar: true -prev: true -next: true -search: true -article: true -comment: false -editLink: false -date: 2022-02-14 21:31:23 ---- -# MIPI-DSI - -- [概述](#section1266787503161538) -- [接口说明](#section752964871810) -- [开发步骤](#section545182932161538) -- [开发实例](#section1167576616161538) - -## 概述 - -DSI(Display Serial Interface)是由移动行业处理器接口联盟(Mobile Industry Processor Interface \(MIPI\) Alliance)制定的规范。在HDF框架中,MIPI-DSI的接口适配模式采用无服务模式,用于不需要在用户态提供API的设备类型,或者没有用户态和内核区分的OS系统,其关联方式是DevHandle直接指向设备对象内核态地址(DevHandle是一个void类型指针)。 - -**图 1** DSI无服务模式结构图 - - -## 接口说明 - -MipiDsiCntlrMethod定义: - -``` -struct MipiDsiCntlrMethod { // 核心层结构体的成员函数 - int32_t (*setCntlrCfg)(struct MipiDsiCntlr *cntlr); - int32_t (*setCmd)(struct MipiDsiCntlr *cntlr, struct DsiCmdDesc *cmd); - int32_t (*getCmd)(struct MipiDsiCntlr *cntlr, struct DsiCmdDesc *cmd, uint32_t readLen, uint8_t *out); - void (*toHs)(struct MipiDsiCntlr *cntlr); - void (*toLp)(struct MipiDsiCntlr *cntlr); - void (*enterUlps)(struct MipiDsiCntlr *cntlr);//【可选】进入超低功耗模式 - void (*exitUlps)(struct MipiDsiCntlr *cntlr); //【可选】退出超低功耗模式 - int32_t (*powerControl)(struct MipiDsiCntlr *cntlr, uint8_t enable);//【可选】使能/去使能功耗控制 - int32_t (*attach)(struct MipiDsiCntlr *cntlr);//【可选】将一个DSI设备连接上host -}; -``` - -**表 1** MipiDsiCntlrMethod成员的回调函数功能说明 - - -
- | -- | -- | -- | -- | -
---|---|---|---|---|
- | -- | -- | -- | -- | -
- | -- | -- | -- | -- | -
- | -- | -- | -- | -- | -
- | -- | -- | -- | -- | -
- | -- | -- | -- | -- | -
- | -- | -
---|---|
- | -- | -
- | -- | -
- | -- | -
- | -- | -
- | -- | -
- | -- | -
- | -- | -- | -- | -
---|---|---|---|
- | -- | -- | -- | -
- | -- | -- | -- | -
- | -- | -- | -- | -
- | -- | -- | -- | -
- | -- | -- | -- | -
- | -- | -- | -- | -
- | -- | -- | -- | -
- | -- | -- | -- | -
- | -- | -- | -- | -
- | -- | -- | -- | -
- | -- | -- | -- | -
- | -- | -- | -- | -
- | -- | -- | -- | -
- | -- | -- | -- | -
- | -- | -- | -- | -
- | -- | -
---|---|
- | -- | -
- | -- | -
- | -- | -
- | -- | -
- | -- | -
- | -- | -
- | -- | -- | -- | -
---|---|---|---|
- | -- - | -- | -- | -
- | -- | -- | -- | -
- | -- | -- | -- | -
- | -- | -
---|---|
- | -- | -
- | -- | -
- | -- | -
- | -- | -
- | -- | -
- | -- | -
- | -- | -
---|---|
- | -- | -
- | -- | -
- | -- | -
- | -- | -
- | -- | -
- | -- | -
- | -- | -
---|---|
- | -- | -
- | -- | -
- | -- | -
- | -- | -
- | -- | -
- | -- | -
- | -- | -- | -- | -
---|---|---|---|
- | -- | -- | -- | -
- | -- | -- | -- | -
- | -- | -- | -- | -
- | -- | -- | -- | -
- | -- | -- | -- | -
- | -- | -
---|---|
- | -- | -
- | -- | -
- | -- | -
- | -- | -
- | -- | -
- | -- | -
- | -- | -
---|---|
- | -- | -
- | -- | -
- | -- | -
- | -- | -
- | -- | -
- | -- | -
- | -- | -- | -- | -- | -
---|---|---|---|---|
- | -- | -- | -- | -- | -
- | -- | -- | -- | -- | -
- | -- | -- | -- | -- | -
- | -- | -- | -- | -- | -
- | -- | -- | -- | -- | -
- | -- | -- | -- | -- | -
- | -- | -
---|---|
- | -- | -
- | -- | -
- | -- | -
- | -- | -
- | -- | -
功能分类 - |
-接口名 - |
-描述 - |
-
---|---|---|
ADC设备管理接口 - |
-AdcOpen - |
-打开ADC设备 - | -
AdcClose - |
-关闭ADC设备 - |
-|
ADC读取转换结果接口 - |
-AdcRead - |
-读取AD转换结果值 - |
-
参数 - |
-参数描述 - |
-
---|---|
number - |
-ADC设备号 - |
-
返回值 - |
-返回值描述 - |
-
NULL - |
-打开ADC设备失败 - |
-
设备句柄 - |
-打开的ADC设备句柄 - |
-
参数 - |
-参数描述 - |
-
---|---|
handle - |
-ADC设备句柄 - |
-
channel - |
-ADC设备通道号 - |
-
val - |
-AD转换结果 - |
-
返回值 - |
-返回值描述 - |
-
0 - |
-读取成功 - |
-
负数 - |
-读取失败 - |
-
参数 - |
-参数描述 - |
-
---|---|
handle - |
-ADC设备句柄 - |
-
返回值 - |
-返回值描述 - |
-
无 - |
-无 - |
-
- | -- | -- | -
---|---|---|
- | -- | -- | -
- | -- | -|
- | -- | -- | -
- | -- | -|
- | -- | -- | -
- | -- | -|
- | -- | -|
- | -- | -
- | -- | -
- | -- | -
- | -- | -
- | -- | -
- | -- | -
- | -- | -
- | -- | -
- | -- | -
- | -- | -
- | -- | -
- | -- | -
- | -- | -
- | -- | -
- | -- | -
- | -- | -
- | -- | -
- | -- | -
- | -- | -
- | -- | -
- | -- | -
- | -- | -
- | -- | -
- | -- | -
- | -- | -
- | -- | -
- | -- | -
- | -- | -
- | -- | -
- | -- | -
- | -- | -
- | -- | -
- | -- | -
- | -- | -
- | -- | -
- | -- | -
- | -- | -
- | -- | -
- | -- | -
- | -- | -
- | -- | -
- | -- | -
功能分类 - |
-接口名 - |
-描述 - |
-
---|---|---|
HDMI控制器管理接口 - |
-HdmiOpen - |
-打开HDMI控制器 - | -
HdmiClose - |
-关闭HDMI控制器 - |
-|
启动/停止HDMI传输接口 - |
-HdmiStart - |
-启动HDMI传输 - | -
HdmiStop - |
-停止HDMI传输 - |
-|
HDMI控制器设置接口 - |
-HdmiAvmuteSet - |
-HDMI声音图像消隐设置 - | -
HdmiDeepColorSet - |
-设置色彩深度 - |
-|
HdmiDeepColorGet - |
-获取色彩深度 - |
-|
HdmiSetVideoAttribute - |
-设置视频属性 - |
-|
HdmiSetAudioAttribute - |
-设置音频属性 - |
-|
HdmiSetHdrAttribute - |
-设置HDR属性 - |
-|
EDID获取接口 - |
-HdmiReadSinkEdid - |
-HDMI读取Sink端原始EDID数据 - | -
HDMI热插拔相关接口 - |
-HdmiRegisterHpdCallbackFunc - |
-注册HDMI热插拔检测回调函数 - | -
HdmiUnregisterHpdCallbackFunc - |
-注销HDMI热插拔检测回调函数 - |
-
参数 - |
-参数描述 - |
-
---|---|
number - |
-HDMI控制器号 - |
-
返回值 - |
-返回值描述 - |
-
NULL - |
-打开HDMI控制器失败 - |
-
控制器句柄 - |
-打开的HDMI控制器句柄 - |
-
参数 - |
-参数描述 - |
-
---|---|
handle - |
-HDMI控制器句柄 - |
-
callback - |
-热插拔回调函数信息 - |
-
返回值 - |
-返回值描述 - |
-
0 - |
-注册成功 - |
-
负数 - |
-注册失败 - |
-
参数 - |
-参数描述 - |
-
---|---|
handle - |
-HDMI控制器句柄 - |
-
buffer - |
-数据缓冲区 - |
-
len - |
-数据长度 - |
-
返回值 - |
-返回值描述 - |
-
正整数 - |
-成功读取的原始EDID数据 - |
-
负数或0 - |
-读取失败 - |
-
参数 - |
-参数描述 - |
-
---|---|
handle - |
-HDMI控制器句柄 - |
-
attr - |
-音频属性 - |
-
返回值 - |
-返回值描述 - |
-
0 - |
-设置成功 - |
-
负数 - |
-设置失败 - |
-
参数 - |
-参数描述 - |
-
---|---|
handle - |
-HDMI控制器句柄 - |
-
attr - |
-视频属性 - |
-
返回值 - |
-返回值描述 - |
-
0 - |
-设置成功 - |
-
负数 - |
-设置失败 - |
-
参数 - |
-参数描述 - |
-
---|---|
handle - |
-HDMI控制器句柄 - |
-
attr - |
-HDR属性 - |
-
返回值 - |
-返回值描述 - |
-
0 - |
-设置成功 - |
-
负数 - |
-设置失败 - |
-
参数 - |
-参数描述 - |
-
---|---|
handle - |
-HDMI控制器句柄 - |
-
enable - |
-使能/去使能avmute - |
-
返回值 - |
-返回值描述 - |
-
0 - |
-设置成功 - |
-
负数 - |
-设置失败 - |
-
参数 - |
-参数描述 - |
-
---|---|
handle - |
-HDMI控制器句柄 - |
-
color - |
-色彩深度 - |
-
返回值 - |
-返回值描述 - |
-
0 - |
-设置成功 - |
-
负数 - |
-设置失败 - |
-
参数 - |
-参数描述 - |
-
---|---|
handle - |
-HDMI控制器句柄 - |
-
color - |
-色彩深度 - |
-
返回值 - |
-返回值描述 - |
-
0 - |
-获取成功 - |
-
负数 - |
-获取失败 - |
-
参数 - |
-参数描述 - |
-
---|---|
handle - |
-HDMI控制器句柄 - |
-
返回值 - |
-返回值描述 - |
-
0 - |
-启动成功 - |
-
负数 - |
-启动失败 - |
-
参数 - |
-参数描述 - |
-
---|---|
handle - |
-HDMI控制器句柄 - |
-
返回值 - |
-返回值描述 - |
-
0 - |
-停止成功 - |
-
负数 - |
-停止失败 - |
-
参数 - |
-参数描述 - |
-
---|---|
handle - |
-HDMI控制器句柄 - |
-
返回值 - |
-返回值描述 - |
-
0 - |
-注销成功 - |
-
负数 - |
-注销失败 - |
-
参数 - |
-参数描述 - |
-
---|---|
handle - |
-HDMI控制器句柄 - |
-
- | -- | -- | -
---|---|---|
- | -- | -- | -
- | -- | -|
- | -- | -- | -
- | -- | -
---|---|
- | -- | -
- | -- | -
- | -- | -
- | -- | -
- | -- | -
---|---|
- | -- | -
- | -- | -
- | -- | -
- | -- | -
- | -- | -
- | -- | -
- | -- | -
---|---|
- | -- | -
功能分类 - |
-接口名 - |
-描述 - |
-
---|---|---|
I3C控制器管理接口 - |
-I3cOpen - |
-打开I3C控制器 - | -
I3cClose - |
-关闭I3C控制器 - |
-|
I3c消息传输接口 - |
-I3cTransfer - |
-自定义传输 - |
-
I3C控制器配置接口 - |
-I3cSetConfig - |
-配置I3C控制器 - | -
I3cGetConfig - |
-获取I3C控制器配置 - |
-|
I3C带内中断接口 - |
-I3cRequestIbi - |
-请求带内中断 - | -
I3cFreeIbi - |
-释放带内中断 - |
-
参数 - |
-参数描述 - |
-
---|---|
number - |
-I3C控制器号 - |
-
返回值 - |
-返回值描述 - |
-
NULL - |
-打开I3C控制器失败 - |
-
控制器句柄 - |
-打开的I3C控制器句柄 - |
-
参数 - |
-参数描述 - |
-
---|---|
handle - |
-I3C控制器句柄 - |
-
msgs - |
-待传输数据的消息结构体数组 - |
-
count - |
-消息数组长度 - |
-
mode - |
-传输模式,0:I2C模式;1:I3C模式;2:发送CCC(Common Command Code) - |
-
返回值 - |
-返回值描述 - |
-
正整数 - |
-成功传输的消息结构体数目 - |
-
负数 - |
-执行失败 - |
-
参数 - |
-参数描述 - |
-
---|---|
handle - |
-I3C控制器句柄 - |
-
config - |
-I3C控制器配置 - |
-
返回值 - |
-返回值描述 - |
-
0 - |
-获取成功 - |
-
负数 - |
-获取失败 - |
-
参数 - |
-参数描述 - |
-
---|---|
handle - |
-I3C控制器句柄 - |
-
config - |
-I3C控制器配置 - |
-
返回值 - |
-返回值描述 - |
-
0 - |
-配置成功 - |
-
负数 - |
-配置失败 - |
-
参数 - |
-参数描述 - |
-
---|---|
handle - |
-I3C控制器设备句柄 - |
-
addr - |
-I3C设备地址 - |
-
func - |
-IBI回调函数 - |
-
payload - |
-IBI有效载荷 - |
-
返回值 - |
-返回值描述 - |
-
0 - |
-请求成功 - |
-
负数 - |
-请求失败 - |
-
参数 - |
-参数描述 - |
-
---|---|
handle - |
-I3C控制器设备句柄 - |
-
addr - |
-I3C设备地址 - |
-
返回值 - |
-返回值描述 - |
-
0 - |
-释放成功 - |
-
负数 - |
-释放失败 - |
-
参数 - |
-参数描述 - |
-
---|---|
handle - |
-I3C控制器设备句柄 - |
-
功能分类 | -接口名 | -描述 | -
获取/释放MIPI-CSI控制器操作句柄 | -MipiCsiOpen | -获取MIPI-CSI控制器操作句柄 | -
MipiCsiClose | -释放MIPI-CSI控制器操作句柄 | -|
MIPI-CSI相应配置 | -MipiCsiSetComboDevAttr | -设置MIPI,CMOS或者LVDS相机的参数给控制器,参数包括工作模式,图像区域,图像深度,数据速率和物理通道等 | -
MipiCsiSetExtDataType(可选) | -设置YUV和RAW数据格式和位深 | -|
MipiCsiSetHsMode | -设置MIPI RX的Lane分布。根据硬件连接的形式选择具体的mode | -|
MipiCsiSetPhyCmvmode | -设置共模电压模式 | -|
复位/撤销复位Sensor | -MipiCsiResetSensor | -复位Sensor | -
MipiCsiUnresetSensor | -撤销复位Sensor | -|
复位/撤销复位MIPI RX | -MipiCsiResetRx | -复位MIPI RX。不同的s32WorkingViNum有不同的enSnsType | -
MipiCsiUnresetRx | -撤销复位MIPI RX | -|
使能/关闭MIPI的时钟 | -MipiCsiEnableClock | -使能MIPI的时钟。根据上层函数电泳传递的enSnsType参数决定是用MIPI还是LVDS | -
MipiCsiDisableClock | -关闭MIPI设备的时钟 | -|
使能/禁用MIPI上的Sensor时钟 | -MipiCsiEnableSensorClock | -使能MIPI上的Sensor时钟 | -
MipiCsiDisableSensorClock | -关闭Sensor的时钟 | -
- | -- | -
---|---|
- | -- | -
- | -- | -- | -
---|---|---|
- | -- | -- | -
- | -- | -|
- | -- | -- | -
- | -- | -|
- | -- | -- | -
- | -- | -|
- | -- | -- | -
- | -- | -
- | -- | -
---|---|
- | -- | -
- | -- | -
- | -- | -
- | -- | -
- | -- | -
---|---|
- | -- | -
- | -- | -
- | -- | -
- | -- | -
- | -- | -
- | -- | -
---|---|
- | -- | -
- | -- | -
- | -- | -
- | -- | -
- | -- | -
- | -- | -
---|---|
- | -- | -
- | -- | -
- | -- | -
- | -- | -
- | -- | -
- | -- | -
---|---|
- | -- | -
- | -- | -
- | -- | -
- | -- | -
- | -- | -
- | -- | -
- | -- | -
- | -- | -
---|---|
- | -- | -
功能分类 | -接口名 | -描述 | -
PWM句柄操作 | -PwmOpen | -获取PWM设备驱动句柄 | -
PwmClose | -释放PWM设备驱动句柄 | -|
使能/禁用PWM | -PwmEnable | -使能PWM | -
PwmDisable | -禁用PWM | -|
PWM配置操作 | -PwmSetPeriod | -设置PWM周期 | -
PwmSetDuty | -设置PWM占空时间 | -|
PwmSetPolarity | -设置PWM极性 | -|
设置/获取PWM配置信息 | -PwmSetConfig | -设置PWM设备参数 | -
PwmGetConfig | -获取PWM设备参数 | -
- | -- | -- | -
---|---|---|
- | -- | -- | -
- | -- | -|
- | -- | -- | -
- | -- | -|
- | -- | -- | -
- | -- | -|
- | -- | -|
- | -- | -|
- | -- | -- | -
- | -- | -|
- | -- | -|
- | -- | -- | -
- | -- | -
- | -- | -
- | -- | -
- | -- | -
- | -- | -
- | -- | -
- | -- | -
- | -- | -
- | -- | -
---|---|
- | -- | -
- | -- | -
- | -- | -
- | -- | -
- | -- | -
- | -- | -
- | -- | -
- | -- | -
- | -- | -
- | -- | -
- | -- | -
- | -- | -
- | -- | -
- | -- | -
- | -- | -
- | -- | -
- | -- | -
- | -- | -
- | -- | -
- | -- | -
- | -- | -
- | -- | -
- | -- | -
- | -- | -
- | -- | -
- | -- | -
- | -- | -
- | -- | -
- | -- | -
- | -- | -
- | -- | -
- | -- | -
- | -- | -
- | -- | -
- | -- | -
- | -- | -
- | -- | -
- | -- | -
- | -- | -
- | -- | -
- | -- | -
- | -- | -
- | -- | -
- | -- | -
- | -- | -
- | -- | -
- | -- | -
- | -- | -
- | -- | -
- | -- | -
- | -- | -
- | -- | -
- | -- | -
- | -- | -
- | -- | -
- | -- | -
- | -- | -
- | -- | -
- | -- | -
- | -- | -
- | -- | -
- | -- | -
- | -- | -
- | -- | -
- | -- | -
- | -- | -
- | -- | -
- | -- | -
- | -- | -
- | -- | -
- | -- | -- | -
---|---|---|
- | -- | -- | -
- | -- | -|
- | -- | -- | -
- | -- | -|
- | -- | -|
- | -- | -|
- | -- | -|
- | -- | -|
- | -- | -- | -
- | -- | -- | -
- | -- | -|
- | -- | -- | -
- | -- | -- | -
- | -- | -|
- | -- | -- | -
- | -- | -|
- | -- | -- | -
- | -- | -
- | -- | -
---|---|
- | -- | -
- | -- | -
- | -- | -
- | -- | -
- | -- | -
- | -- | -
---|---|
- | -- | -
- | -- | -
---|---|
- | -- | -
- | -- | -
- | -- | -
- | -- | -
- | -- | -
---|---|
- | -- | -
- | -- | -
- | -- | -
- | -- | -
- | -- | -
- | -- | -
---|---|
- | -- | -
- | -- | -
- | -- | -
- | -- | -
- | -- | -
- | -- | -
- | -- | -
- | -- | -
---|---|
- | -- | -
- | -- | -
- | -- | -
- | -- | -
- | -- | -
- | -- | -
- | -- | -
- | -- | -
---|---|
- | -- | -
- | -- | -
- | -- | -
- | -- | -
- | -- | -
- | -- | -
- | -- | -
- | -- | -
- | -- | -
---|---|
- | -- | -
- | -- | -
- | -- | -
- | -- | -
- | -- | -
- | -- | -
- | -- | -
- | -- | -
- | -- | -
---|---|
- | -- | -
- | -- | -
- | -- | -
- | -- | -
- | -- | -
- | -- | -
- | -- | -
- | -- | -
---|---|
- | -- | -
- | -- | -
- | -- | -
- | -- | -
- | -- | -
- | -- | -
- | -- | -
- | -- | -
---|---|
- | -- | -
- | -- | -
- | -- | -
- | -- | -
- | -- | -
---|---|
- | -- | -
- | -- | -
- | -- | -
- | -- | -
- | -- | -
---|---|
- | -- | -
- | -- | -
---|---|
- | -- | -
- | -- | -- | -
---|---|---|
- | -- | -- | -
- | -- | -|
- | -- | -- | -
- | -- | -|
- | -- | -|
- - | -- | -- | -
- | -- | -
- | -- | -
- | -- | -
- | -- | -
- | -- | -
- | -- | -
- | -- | -
- | -- | -
- | -- | -
- | -- | -
- | -- | -
- | -- | -
- | -- | -
- | -- | -
- | -- | -
- | -- | -
- | -- | -
- | -- | -
- | -- | -
- | -- | -
- | -- | -
- | -- | -
- | -- | -
- | -- | -
- | -- | -
- | -- | -
- | -- | -
- | -- | -
- | -- | -
- | -- | -
- | -- | -
- | -- | -
- | -- | -
- | -- | -
- | -- | -
- | -- | -
- | -- | -
- | -- | -
- | -- | -
- | -- | -
- | -- | -
- | -- | -- | -
---|---|---|
- - | -- | -- | -
- | -- | -|
- - | -- | -- | -
- | -- | -|
- | -- | -- | -
- | -- | -|
- - | -- | -- | -
- | -- | -|
- | -- | -- | -
- | -- | -
---|---|
- | -- | -
- | -- | -
- | -- | -
- | -- | -
- | -- | -
---|---|
- | -- | -
- | -- | -
- | -- | -
- | -- | -
- | -- | -
- | -- | -
---|---|
- | -- | -
- | -- | -
- | -- | -
- | -- | -
- | -- | -
- | -- | -
---|---|
- | -- | -
- | -- | -
- | -- | -
- | -- | -
- | -- | -
- | -- | -
---|---|
- | -- | -
- | -- | -
- | -- | -
- | -- | -
- | -- | -
- | -- | -
---|---|
- | -- | -
- | -- | -
- | -- | -
- | -- | -
- | -- | -
- | -- | -
---|---|
- | -- | -
- | -- | -
- | -- | -
- | -- | -
- | -- | -
- | -- | -
- | -- | -
---|---|
- | -- | -
- | -- | -
- | -- | -
- | -- | -
- | -- | -
- | -- | -
- | -- | -
---|---|
- | -- | -
- | -- | -- | -
---|---|---|
- | -- | -- | -
- | -- | -|
- | -- | -- | -
- | -- | -|
- | -- | -- | -
- | -- | -|
- | -- | -- | -
- | -- | -- | -
- | -- | -
---|---|
- | -- | -
- | -- | -
- | -- | -
- | -- | -
- | -- | -
---|---|
- | -- | -
- | -- | -
- | -- | -
- | -- | -
- | -- | -
- | -- | -
---|---|
- | -- | -
- | -- | -
- | -- | -
- | -- | -
- | -- | -
- | -- | -
---|---|
- | -- | -
- | -- | -
- | -- | -
- | -- | -
- | -- | -
- | -- | -
---|---|
- | -- | -
- | -- | -
- | -- | -
- | -- | -
- | -- | -
---|---|
- | -- | -
- | -- | -
- | -- | -
- | -- | -
- | -- | -
---|---|
- | -- | -
- | -- | -
- | -- | -
- | -- | -
- | -- | -
---|---|
- | -- | -
- | -- | -- | -
---|---|---|
- | -- | -- | -
- | -- | -|
- | -- | -|
int32_t SetBatch(int64_t samplingInterval, int64_t reportInterval) - |
-- | -|
- | -- | -|
- | -- | -|
- | -- | -
- | -- | -- | -
---|---|---|
- | -- | -- | -
- | -- | -|
int32_t (*setMacAddr)(struct NetDevice *netDev, void *addr); - |
-- | -|
- | -- | -|
- | -- | -|
- | -- | -
- | -- | -
---|---|
- | -- | -
- | -- | -- | -
---|---|---|
- | -- | -- | -
- | -- | -
---|---|
- | -- | -
- | -- | -
- | -- | -
- | -- | -
virtual void GetTargetView(const Point& point, UIView** last) - |
-- | -
- | -- | -
- | -- | -
- | -- | -
- | -- | -
- | -- | -
---|---|
- | -- | -
- | -- | -
- | -- | -
- | -- | -
- | -- | -
- | -- | -
- | -- | -
- | -- | -
---|---|
- | -- | -
- | -- | -
- | -- | -
- | -- | -
---|---|
- | -- | -
- | -- | -
- | -- | -
- | -- | -
- | -- | -
- | -- | -
- | -- | -
- | -- | -
- | -- | -
- | -- | -- | -
---|---|---|
- | -- | -- | -
- | -- | -- | -
- | -- | -- | -
- | -- | -- | -
- | -- | -- | -
- | -- | -- | -
- | -- | -- | -
- | -- | -- | -
- | -- | -- | -
- | -- | -- | -
- | -- | -- | -
- | -- | -- | -
- | -- | -- | -
- | -- | -- | -
- | -- | -- | -
- | -- | -- | -
- | -- | -- | -
---|---|---|
- | -- | -- | -
- | -- | -- | -
- | -- | -- | -
- | -- | -- | -
- | -- | -
---|---|
- | -- | -
- | -- | -
- | -- | -
int UtilsFileWrite(int fd, const char *buf, unsigned int len) - |
-- | -
- | -- | -
- | -- | -
- | -- | -
- | -- | -
- | -- | -
- | -- | -
---|---|
int UtilsGetValue(const char* key, char* value, unsigned int len) - |
-- | -
- | -- | -
- | -- | -
- | -- | -- | -
---|---|---|