原文参考
近来刚接手项目的camera驱动,除了查看平台文档和sensor的到规格书,也在网上查看了高手们到经验。本人对camera还是比较陌生的,奈何公司无人过问,只好按部就班的来吧!
和大部分驱动的调试相差无几,还是在前人的工作基础上进行的。项目采用高通7627平台,sensor采用ov7675。
驱动移植
1.内核驱动移植
sensor信息记录在android\kernel\arch\arm\mach-msm\board-msm7x27.c文件中,board file中要更改的信息如下:
(1)为sensor添加相应的i2c驱动,加到i2c_devices[]数组中,这里是使用i2c总线的设备数组。机器启动时会注册相应设备。
static struct i2c_board_info i2c_devices[] = {
#ifdef CONFIG_MT9D112
{
I2C_BOARD_INFO("mt9d112", 0x60 >> 1),//这是7bit形式,采用硬件I2C,把真实的读或写地址右移一位即可
},
#endif
......}
(2)msm_camera_sensor_info包含了设备启动信息。添加一个新的sensor驱动,就必须填写这样的一个结构体,包括sensor所使用的GPIO口。结构体中的sensor name将被用作driver id。
static struct msm_camera_sensor_info msm_camera_sensor_mt9d112_data = {
.sensor_name = "mt9d112", //将被用作driver id
.sensor_reset = 1, //sensor reset GPIO
.sensor_pwd = 20, //电源开关
.vcm_pwd = 0, //用作自动对焦。0表示不使用。
.vcm_enable = 0,
.pdata = &msm_camera_device_data,
.flash_data = &flash_mt9d112
};
另外还要把sensor注册成platform_device。
(3)修改i2c地址。gpio表修改,使用8线输入。修改camera_on_gpio_table[]和camera_off_gpio_table[]两个数组。由于平台采用的是双核架构,在功能上有所区分,个别GPIO需要在modem那边配置成app这边控制。
(4)创建自己的驱动文件。使用YUV sensor则查看android\kernel\drivers\media\video\msm\mt9d112.c,若使用bayer sensor则查看android\kernel\drivers\media\video\msm\mt9t013.c。这里不作详细说明。
(5)完成上述工作后,修改Kconfig和Makefile文件。
2.用户空间驱动
(1)用户空间驱动主要在vendor目录下,把自己的sensor加到sensors[]中,以便启动自己的senor。
static sensor_proc_start_t sensors[] = {
SENSORS_PROCCESS_START(mt9d112),
......};
(2)修改sensor相关参数:例如sensor类型,sensor输出格式,输出图像大小等等。\android\vendor\qcom-proprietary\mm-camera\targets\tgtcommon\sensor\mt9d112\mt9d112.c,这些参数必须得到正确的修改,否则sensor将启动不了。
(3)mt9d112_process_start函数中为VFE具体配置一些参数。
(4)mt9d112_video_config函数做了一些IO configuration调研,和内核mt9d112_set_sensor_mode是相关联的。通过IOCTL调用,相应的寄存器值会通过i2c总线写入sensor。
写入sensor寄存器的值(mt9d112_set_sensor_mode)必须和vfe_camif配置的值(mt9d112_video_config)相匹配,如果使用YUVsensor,需将每行像素值定义为预览模式下 的两倍。
其他重要的部分还包括HAL层的配置vendor/qcom/android-open/libcamera2\QualcommCameraHardware.cpp,
android\packages\apps\Camera\res\layout\camera.xml。