class="hide-preCode-box">
  1. 实例化MIPI DSI控制器对象

完成驱动入口注册之后,下一步就是以核心层MipiDsiCntlr对象的初始化为核心,包括驱动适配者自定义结构体(传递参数和数据),实例化MipiDsiCntlr成员MipiDsiCntlrMethod(让用户可以通过接口来调用驱动底层函数),实现HdfDriverEntry成员函数(Bind、Init、Release)。

从驱动的角度看,自定义结构体是参数和数据的载体,一般来说,config文件中的数值也会用来初始化结构体成员,但本例的MIPI DSI无器件属性文件,故基本成员结构与MipiDsiCntlr无太大差异。

        typedef struct {
            unsigned int devno;                // 设备号
            short laneId[LANE_MAX_NUM];        // Lane号
            OutPutModeTag outputMode;          // 输出模式选择:刷新模式,命令行模式或视频流模式
            VideoModeTag videoMode;            // 显示设备的同步模式
            OutputFormatTag outputFormat;      // 输出DSI图像数据格式:RGB或YUV
            SyncInfoTag syncInfo;              // 时序相关的设置
            unsigned int phyDataRate;          // 数据速率,单位Mbps
            unsigned int pixelClk;             // 时钟,单位KHz
        } ComboDevCfgTag;

        struct MipiDsiCntlr {
            struct IDeviceIoService service;
            struct HdfDeviceObject *device;
            unsigned int devNo;                // 设备号
            struct MipiCfg cfg;
            struct MipiDsiCntlrMethod *ops;
            struct OsalMutex  lock;
            void *priv;
        };
        c
 class="hljs-button signin active" data-title="登录复制" data-report-click="{"spm":"1001.2101.3001.4334"}"> class="hide-preCode-box">
        static struct MipiDsiCntlrMethod g_method = {
            .setCntlrCfg = Hi35xxSetCntlrCfg,
            .setCmd = Hi35xxSetCmd,
            .getCmd = Hi35xxGetCmd,
            .toHs = Hi35xxToHs,
            .toLp = Hi35xxToLp,
        };
        c
 class="hljs-button signin active" data-title="登录复制" data-report-click="{"spm":"1001.2101.3001.4334"}">

入参:
HdfDeviceObject是整个驱动对外暴露的接口参数,具备HCS配置文件的信息。

返回值:
HDF_STATUS相关状态 (表3为部分展示,如需使用其他状态,可参考//drivers/hdf_core/interfaces/inner_api/utils/hdf_base.h中HDF_STATUS的定义)。

表 3 HDF_STATUS相关状态说明

class="table-box">
状态(值)问题描述
HDF_ERR_INVALID_OBJECT控制器对象非法
HDF_ERR_MALLOC_FAIL内存分配失败
HDF_ERR_IOI/O 错误
HDF_SUCCESS初始化成功
HDF_FAILURE初始化失败

函数说明:

MipiDsiCntlrMethod的实例化对象的挂载,调用MipiDsiRegisterCntlr,以及其他驱动适配者自定义初始化操作。

        static int32_t Hi35xxMipiTxInit(struct HdfDeviceObject *device)
        {
            int32_t ret;
            g_mipiTx.priv = NULL;                            // g_mipiTx是定义的全局变量
                                                             // static struct MipiDsiCntlr g_mipiTx {
                                                             //     .devNo=0
                                                             // };
            g_mipiTx.ops = &g_method;                        // MipiDsiCntlrMethod的实例化对象的挂载
            ret = MipiDsiRegisterCntlr(&g_mipiTx, device);   // 【必要】调用核心层函数和g_mipiTx初始化核心层全局变量
            ......
            return MipiTxDrvInit(0);                         // 【必要】驱动适配者对设备的初始化,形式不限
        }

        // mipi_dsi_core.c核心层
        int32_t MipiDsiRegisterCntlr(struct MipiDsiCntlr *cntlr, struct HdfDeviceObject *device)
        {
            ......
            // 定义的全局变量:static struct MipiDsiHandle g_mipiDsihandle[MAX_CNTLR_CNT];
            if (g_mipiDsihandle[cntlr->devNo].cntlr == NULL) {
                (void)OsalMutexInit(&g_mipiDsihandle[cntlr->devNo].lock);
                (void)OsalMutexInit(&(cntlr->lock));

                g_mipiDsihandle[cntlr->devNo].cntlr = cntlr; // 初始化MipiDsiHandle成员
                g_mipiDsihandle[cntlr->devNo].priv = NULL;
                cntlr->device = device;                      // 使HdfDeviceObject与MipiDsiHandle可以相互转化的前提
                device->service = &(cntlr->service);         // 使HdfDeviceObject与MipiDsiHandle可以相互转化的前提
                cntlr->priv = NULL;
                ......
                return HDF_SUCCESS;
            }
            ......
            return HDF_FAILURE;
        }
        c
 class="hljs-button signin active" data-title="登录复制" data-report-click="{"spm":"1001.2101.3001.4334"}"> class="hide-preCode-box">

返回值:
无。

函数说明:

该函数需要在驱动入口结构体中赋值给Release接口,当HDF框架调用Init函数初始化驱动失败时,可以调用Release释放驱动资源,该函数中需包含释放内存和删除控制器等操作。

说明:
所有强制转换获取相应对象的操作前提是在Init函数中具备对应赋值的操作。

        static void Hi35xxMipiTxRelease(struct HdfDeviceObject *device)
        {
            struct MipiDsiCntlr *cntlr = NULL;
            ......
            cntlr = MipiDsiCntlrFromDevice(device); // 这里有HdfDeviceObject到MipiDsiCntlr的强制转化
                                                    // return (device == NULL) ? NULL : (struct MipiDsiCntlr *)device->service;
            ......
            MipiTxDrvExit();                        // 【必要】对设备所占资源的释放
            MipiDsiUnregisterCntlr(&g_mipiTx);      // 空函数
            g_mipiTx.priv = NULL;
            HDF_LOGI("%s: unload mipi_tx driver 1212!", __func__);
        }
        c
 class="hljs-button signin active" data-title="登录复制" data-report-click="{"spm":"1001.2101.3001.4334"}">
  1. 驱动调试

【可选】针对新增驱动程序,建议验证驱动基本功能,例如挂载后的信息反馈。

data-report-view="{"mod":"1585297308_001","spm":"1001.2101.3001.6548","dest":"https://blog.csdn.net/maniuT/article/details/141028803","extend1":"pc","ab":"new"}">> id="blogExtensionBox" style="width:400px;margin:auto;margin-top:12px" class="blog-extension-box"> class="blog_extension blog_extension_type2" id="blog_extension"> class="extension_official" data-report-click="{"spm":"1001.2101.3001.6471"}" data-report-view="{"spm":"1001.2101.3001.6471"}"> class="blog_extension_card_left"> class="blog_extension_card_cont"> 鸿蒙开发学习资料领取!!! class="blog_extension_card_cont_r"> 微信名片
注:本文转载自blog.csdn.net的沧海一笑-dj的文章"https://blog.csdn.net/dengjin20104042056/article/details/99412991"。版权归原作者所有,此博客不拥有其著作权,亦不承担相应法律责任。如有侵权,请联系我们删除。
复制链接

评论记录:

未查询到任何数据!