《整理MTK平台的Camera底层驱动流程》

Data: 2016-04-12 星期二

说明:以下说明均是在android 5.1 ,mt6580平台为例。由于笔记是很久之前写的,到现在已经记不起当初的很多细节。以至于不能很好的总结出来,在这里只能说一声抱歉了。

一、 Camera 模块驱动、设备与总线结构:
         一般在 Linux 设备驱动模型中,我们只需要关心总线、设备、驱动这三个实体。总线会充当红娘对加载于其上的设备与驱动进行配对,对于 Camera 模块也不例外,下面从总线、设备、驱动的角度来分析 Camera 模块驱动的注册、匹配与加载过程。

a)驱动注册

        在(alps\kernel-3.10\drivers\misc\mediatek\imgsensor\src\mt6580\Kd_sensorlist.c)CAMERA_HW_i2C_init 这个函数里通过Platform_driver_register(&g_stCAMERA_HW_Driver)把 Camera 模块驱动注册 到 Platform 总线上。而 g_stCAMERA_HW_Driver 是对结构体Platform_driver 这个结构体的填充。

 

b)设备注册

    我们在mt_devs.c这个文件里找不到名为"image_sensor"的平台设备注册,于是我们找到了 mt6580.dtsi 这个文件。

它是在这里完成设备注册的,即是他们是以 .of_match_table 来匹配成功的。

c)总线的匹配

    既然是驱动Platform_device 那对应的设备必然是挂载Platform 总线上的Platform_device,Platform 总线是 Linux系统提供的一种机制,

不同于 I2C、I2S 等总线,它 是一种虚拟的总线。Linux 系统为 Platform 总线定义了一个 bus_type 的实例 Platform_bus_type:

(Kernel-3.10\drivers\base\platform.c)

 

 Platform 总线通过 platform_match 这个成员函数来确定 platform_device 与 platform_driver 如何进行匹配:

 

 

 二、 Camera 驱动工作流程:(以下这个图来源于网络,非原创!)

从上图可以清晰的了解到 Camera 的一个工作流程主要分为这么七步:

    1.打开 Camera Power LDO,让 Camera 有能量保证。

    2.打开 IIC,设置 PDN 引脚,使 Camera 退出出 Standby 模式,按照要求让 Reset 脚做一个复位动作。

    3.读一下 sensor 的版本 ID,这样可以让你确认是否连接上你想要的 sensor。

    4.对 Sensor 进行初始化下载最基本的参数让 Sensor 工作起来,可能包括软复位。

    5.下载 preview 的参数,为预览动作准备。

    6.下载 Capture 的参数,为拍照动作准备。

    7.设置 PDN 引脚,使 Sensor 进入 Standby 模式,或者关掉 LDO 等动作,退出 Camera。

        我们都知道,Linux 内核是通过模块的机制来加载设备驱动的,那么接下来我们就从设备模块加载的角度来看下Camera 工作流程的驱动代码是如何工作的。

在-alps\kernel-3.10\drivers\misc\mediatek\imgsensor\src\mt6580\kd_sensorlist.c 中可以看到:

        module_init(CAMERA_HW_i2C_init);

        module_exit(CAMERA_HW_i2C_exit);在这里 Linux 内核加载和卸载 Camera 模块。

       

        a),我们先来看看Camera的上电部分

            首先,在上面的基础上走到了执行 :

            static struct platform_driver g_stCAMERA_HW_Driver = {

                    .probe      = CAMERA_HW_probe,

接着我们就跟下去:

 I2c的注册和匹配我们就先不跟了,我们直接跟到它的 probe 函数: .probe = CAMERA_HW_i2c_probe,

那我们直接跟 RegisterCAMERA_HWCharDrv() 这个函数:

        在 RegisterCAMERA_HWCharDrv()中, cdev_init(g_pCAMERA_HW_CharDrv, &g_stCAMERA_HW_fops);

    对设备进行初始化,并将 g_stCAMERA_HW_fops 这个文件操作函数作为上层对 Camera 设备操作的接口留给上层进行调用:

其中成员函数 open()只是初始化一个原子变量留给系统调用。ioctl()才是整个 Camera驱动的入口: 

 

CAMERA_HW_Ioctl()是上层文件操作系统操作底层硬件的方法,它先对 Camera 需要的Buffer 做一个初始化,

     然后建立对 Cameraopen、getinfo 等操作的接口:

 我们跟进 1 里的 adopt_CAMERA_HW_Open() 函数:

 

那么,这个 g_pSensorFunc 指针是从那里来的呢?

 

于是又去找 kd_MultiSensorFunc

 

跟到 kd_MultiSensorOpen 函数:

 

 再看看这个函数里边是什么:

 

再跟到 kdCISModulePowerOn 这个函数,看明白了吧,这个就是我们要找的东西了,它在 kd_camera_hw.c 这个文件里。 

 


 

 

 

 

  • 1
    点赞
  • 33
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
mtk平台lcd驱动框架详解可以从Mtkfb.c文件开始解释。在该文件中,我们可以看到定义了一个名为mtkfb_driver的结构体变量,该变量是一个platform_driver结构体类型,其中包含了一些成员函数的指针,如probe、remove、suspend、resume和shutdown等。这些函数是用来处理MTK平台上的LCD显示相关的操作。例如,当系统探测到MTK平台上的LCD设备时,probe函数会被调用来初始化LCD驱动;当系统要移除LCD设备时,remove函数会被调用来卸载LCD驱动。 除了上述的成员函数指针外,mtkfb_driver结构体变量还包含了一些其他成员,如name、pm和bus等。其中,name成员指定了驱动的名称,pm成员用于指定与电源管理相关的操作函数,而bus成员则指定了驱动所属的总线类型。 需要注意的是,以上只是mtk平台上lcd驱动的框架概述,具体实现细节可能因不同的平台而有所不同。此外,本文可能存在错误或不够深入,请参考相关资料以获取更详细的信息。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* *3* [MTK平台LCD驱动框架详解(一)](https://blog.csdn.net/xuan_h/article/details/38519975)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 100%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值