MTK平台CAMERA驱动框架解析

本文详细解析了MTK平台的CAMERA驱动框架,包括kernel层的imagesensor和ispdriver,以及HAL层的imageio、drv和featureio。在开机和打开应用时,camera的初始化和操作流程。此外,还介绍了配置文件和驱动代码的关键部分,如kd_sensorlist.c中的注册过程和ioctl函数在通信中的作用。
摘要由CSDN通过智能技术生成

 一,Camera架构及流程简析

整个框架分为三个部分:hal部分逻辑调用kernel层的通用驱动 sensorlist.c 和 具体IC的驱动 xxxx_mipi_raw.c。kernel 起来后不会直接去访问硬件sensor,而是会注册相关的驱动,之后Android系统起来后会启动相关的服务如 :camera_service,在camera服务中会直接去访问hal,kernel驱动,进而操作camera。

-Kernel部分主要有两块:一块是imagesensor驱动,负责具体型号的sensor的id检测,上电,以及在preview,capture,初始化,3A等等功能设定时的寄存器配置。另一块是ispdriver,通过DMA将sensor数据流上传。

-HAL层这边主要分3块:一块是imageio,主要是数据buffer上传的pipe。一块是drv,包含imgsensor和isp的hal层控制。最后是featureio,包含各种3A等性能配置。

流程图:

                                    

主要发生在两个时间点:开机过程中camera的动作以及打开应用时camera的动作。

-开机时:camera完成了sensor框架的初始化,id检测,以及上下电操作。

-打开应用时:camera会有上电,完成寄存器的初始配置,向上层传送基本参数及配置信息,以及preview和capture模式循环。

二,配置相关文件

(下面的文件如不知道路径,请在代码中查找)

1,系统配置文件---ProjectConfig.mk

          

2,Sensor ID 和一些枚举类型的定义---kd_imgsensor.h,kd_imgsensor_define.h

定义sensor id和sensor name

此处填写正确的sensor ID

#define OV5648MIPI_SENSOR_ID                    0x5648

此处填写的字符串包含 sensor的 part no 格式(YUV or RAW)

#define SENSOR_DRVNAME_OV5648_MIPI_RAW          "ov5648_mipi_raw"

3,kd_sensorlist.hsensorlist.cpp

声明初始化函数

UINT32 OV5648MIPI_RAW_SensorInit(PSENSOR_FUNCTION_STRUCT *pfFunc);

kdSensorList[] :

#if defined(OV5648_MIPI_RAW)    //与xxxxxSensor.c中的函数名对应,即驱动文件夹名大写
{OV5648MIPI_SENSOR_ID, SENSOR_DRVNAME_OV5648_MIPI_RAW, OV5648MIPI_RAW_SensorInit},
#endif

SensorList[] :

#if defined(OV5648_MIPI_RAW)
YUV_INFO(OV5648MIPI_SENSOR_ID,SENSOR_DRVNAME_OV5648_MIPI_RAW, NULL),
#endif

sensor 在kdSensorList[] 中的顺序必须和SensorList[]中的顺序保持一致 ,通常按照resolution从大到小的顺序依次排列下来。

4,hal层--camera_info_ov5648mipiraw.h

#define SENSOR_ID                           OV5648MIPI_SENSOR_ID
#define SENSOR_DRVNAME             SENSOR_DRVNAME_OV5648_MIPI_RAW   //为kd_imgsensor.h中定义的宏

5,AF定义---lenslist.cpp

MSDK_LENS_INIT_FUNCTION_STRUCT LensList_main[MAX_NUM_OF_SUPPORT_LENS] =
{
   #if defined(AD5820AF)
   {OV5648MIPI_SENSOR_ID, AD5820AF_LENS_ID, "AD5820AF", pAD5820AF_getDefaultData},
   #endif
}

{ YOUR SENSOR ID(在kd_imgsensor.h里面定义的一致),LENS ID(不用改变),“lens名称”(不需要改),Lens Para(不需要改)}

三,驱动代码分析

(有点长,是按照代码的调用逻辑排版的,所以会有点乱,边看边阅读代码会比较好理解)

1,kernel-3.18\drivers\misc\mediatek\imgsensor\src\mt6580\kd_sensorlist.c

在驱动装载函数 CAMERA_HW_i2C_init 中注册了 platform driver

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,
#ifdef CONFIG_OF		//与设备树的形式进行匹配
		   .of_match_table = CAMERA_HW_of_ids,
#endif
		   }
};

if (platform_driver_register(&g_stCAMERA_HW_Driver)) {	// 注册platform总线的driver
		PK_ERR("failed to register CAMERA_HW driver\n");
		return -ENODEV;
}

与设备树里的 platform device 匹配成功后调用 CAMERA_HW_probe 方法注册 i2c driver

struct i2c_driver CAMERA_HW_i2c_driver = {
	.probe = CAMERA_HW_i2c_probe,	
	.remove = CAMERA_HW_i2c_remove,
	.driver = {
		   .name = CAMERA_HW_DRVNAME1,
		   .owner = THIS_MODULE,

#ifdef CONFIG_OF
		   .of_match_table = CAMERA_HW_i2c_of_ids,
#endif
		   },
	.id_table = CAMERA_HW_i2c_id,
};

static int CAMERA_HW_probe(struct platform_device *pdev)
{
#if !defined(CONFIG_MTK_LEGACY)
	mtkcam_gpio_init(pdev);
    mtkcam_pin_mux_init(pdev);
#endif

	return i2c_add_driver(&CAMERA_HW_i2c_driver);    //注册 i2c driver
}

I2c匹配成功之后调用 CAMERA_HW_i2c_probe 方法

static int CAMERA_HW_i2c_probe(struct i2c_client *client, const struct i2c_device_id *id)
{
	int i4RetValue = 0;

	PK_DBG("[CAMERA_HW] Attach I2C\n");

	/* get sensor i2c client */
	spin_lock(&kdsensor_drv_lock);
	g_pstI2Cclient = client;	//这里是获得我们的clientdevice,并且以platform方式进行注册
	/* set I2C clock rate */
	g_pstI2Cclient->timing = 100;	/* 100k */
	g_pstI2Cclient->ext_flag &= ~I2C_POLLING_FLAG;	/* No I2C polling busy waiting */

	spin_unlock(&kdsensor_drv_lock);

	/* Register char driver */
	i4RetValue = RegisterCAMERA
一、 手机CAMERA的物理结构: ........................................................................................ - 4 - 二、 CAMERA的成像原理: ................................................................................................. - 4 - 三、 CAMERA常见的数据输出格式:.................................................................................. - 5 - 四、 阅读CAMERA的规格书(以TRULY模组OV5647_RAW为例): ........................... - 6 - 五、 CAMERA的硬件原理图及引脚 ..................................................................................... - 7 - 1、 电源部分:.................................................................................................................... - 7 - 2、 SENSOR INPUT部分: ................................................................................................... - 7 - 3、 SENSOR OUTPUT部分: ............................................................................................... - 7 - 4、 I2C部分:SCL,I2C时钟信号线和SDA,I2C数据信号线。 .................................. - 7 - 六、 MTK平台CAMERA驱动架构: .................................................................................. - 8 - 七、 MTK平台CAMERA相关代码文件(以下代码均为MTK6575平台): .................... - 9 - 1、 CAMERASENSOR驱动相关文件 .................................................................................... - 9 - 2、 SENSOR ID 和一些枚举类型的定义 ............................................................................. - 9 - 3、 SENSOR供电 .................................................................................................................. - 9 - 4、 KERNEL SPACE的SENSORLIST,IMGSENSOR模块注册 ............................................... - 9 - 5、 USER SPACE的SENSORLIST,向用户空间提供支持的SENSORLIST ......................... - 10 - 6、 SENSOR 效果调整的接口 ............................................................................................ - 10 - 八、 CAMERA模块驱动、设备与总线结构: ..................................................................... - 11 - A) 驱动的注册: .................................................................................................................. - 11 - B) 设备的注册: .................................................................................................................. - 11 - C) 总线的匹配: .................................................................................................................. - 12 - 九、 CAMERA驱动工作流程: ............................................................................................- 13 - 十、 CAMERA驱动添加、调试流程:.......
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值