Camera 模块驱动的注册、匹配与加载过程

一、 Camera 模块驱动的注册、匹配与加载过程

1.注册驱动

通过 Platform_driver_register(&g_stCAMERA_HW_Driver)把 Camera 模块驱动注册到Platform 总线上。

Platform_driver 这个结构体包含 Probe()、Remove()等函数来完成驱动的填充。

image-20240226211910889

2. 设备的注册

对 platform_device 的定义通常在 BSP 的板级文件

image-20240226215131063

image-20240226215155881

3.总线匹配

既 然 是 驱 动 Platform_device 那 对 应 的 设 备 必 然 是 挂 载 Platform 总 线 上 的Platform_device,Platform 总线是 Linux 系统提供的一种机制,不同于 I2C、I2S 等总线,它 是一种虚拟的总线。

Linux 系统为 Platform 总线定义了一个 bus_type 的实例 Platform_bus_type:(Kernel\drivers\base\platform.c)

image-20240226215605222

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

image-20240226215652466

二、 Camera 驱动工作流程

image-20240226221052683

从上图可以清晰的了解到 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\mediatek\custom\common\kernel\imgsensor\src\kd_sensorlist.c 中可以看到:

module_init(CAMERA_HW_i2C_init);
module_exit(CAMERA_HW_i2C_exit);

在这里 Linux 内核加载和卸载 Camera 模块。

static struct platform_driver g_stCAMERA_HW_Driver = {
    .probe = CAMERA_HW_probe,
    .remove = CAMERA_HW_remove,
    .suspend = CAMERA_HW_suspend,
    .resume = CAMERA_HW_resume,
    .driver = {
    .name = "image_sensor",
    .owner = THIS_MODULE,
}
};

Camera 模块初始化开始向总线注册驱动,在 Platform_driver 的成员函数.probe()中,通过 i2c_add_driver(&CAMERA_HW_i2c_driver)向 I2C 申请,而 CAMERA_HW_i2c_driver 这个结构体里填充的是将 Camera 作为一个字符设备在 I2C 上进行注册:

image-20240226222830162

在 RegisterCAMERA_HWCharDrv()中cdev_init(g_pCAMERA_HW_CharDrv, &g_stCAMERA_HW_fops);对设备进行初始化,并将
g_stCAMERA_HW_fops 这个文件操作函数作为上层对 Camera 设备操作的接口留给上层进行调用:

image-20240226223035213

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

image-20240226223109267

CAMERA_HW_Ioctl()是上层文件操作系统操作底层硬件的方法,它先对 Camera 需要的Buffer 做一个初始化,然后建立对 Cameraopen、getinfo 等操作的接口:

三、Camera 驱动添加、调试流程

1、 修改系统配置文件 ProjectConfig.mk

-alps\mediatek\config$project$\ProjectConfig.mk

image-20240226223559943

2、检查、配置供电文件:

-alps\mediatek\custom$project$\Kernel\Camera\Camera\kd_camera_hw.c
Camera 供电流程(以3M 前摄MT9V114+5M 后摄OV5647 为例):

3、添加Camera 驱动(以ov5647 为例):

  • 版权声明: 本博客所有文章除特别声明外,著作权归作者所有。转载请注明出处!
  • Copyrights © 2022-2024 lk
  • 访问人数: | 浏览次数:

请我喝杯咖啡吧~

支付宝
微信