最近一段时间都在用A31评估几颗5M的摄像头,包括ov5640、MT9P001、ov2710。A31下移植不同的摄像头驱动的好处在于,驱动结构规范化,采用video_device下的suddev的架构方式来处理sensor。A31下的移植主要关注几个配置文件+对硬件驱动的初始化配置即可。调试的目的是先跑起来后优化。
以下面的COMS为列,我们需要主要摄像头的以下几个电压值:
典型5M摄像头的芯片电压配置
摄像头型号 I2C地址 | AVDD | DVDD | IODD | Reset | PWDN |
三星S5k4ec 0x5a | 2.8V | 1.5V | 2.8V | ||
MT9P001 | 2.8V | 1.8V | 2.8V | 2.8V | 2.8V |
OV5640 0x78 | 2.8V | 1.5V | 2.8V | 2.8V | 2.8V |
OV2710 | 3.3V | 1.5V | 1.8V | 1.5V |
对于配置文件需要关注sys_config.fex与init.sun6i.rc文件。以及对应的驱动文件。
1. 对于sys_config.fex,从硬件上要关注的是摄像头的输出、core电压。
输出数据fmt指的是Raw Bayer data还是YUV data.这个决定了配置sys_config.fex是使用A31的ISP还是Sensor自带了ISP。比如:
vip_dev0_mname = "ov2710" vip_dev0_twi_id = 0 vip_dev0_twi_addr = 0x6c vip_dev0_isp_used = 1 vip_dev0_fmt = 1 vip_dev0_stby_mode = 0 vip_dev0_vflip = 0 vip_dev0_hflip = 1 vip_dev0_iovdd = "axp22_dldo3" vip_dev0_iovdd_vol = 2800000 vip_dev0_avdd = "axp22_ldoio0" vip_dev0_avdd_vol = 2800000 vip_dev0_dvdd = "axp22_eldo1" vip_dev0_dvdd_vol = 1800000 vip_dev0_afvdd = "" vip_dev0_afvdd_vol = 2800000
还有一个是camera_list_para,主要用于驱动加载时的自检测使用,说明当前对应的摄像头是要被自检测的:
[camera_list_para] camera_list_para_used = 1 ov7670 = 0 gc0308 = 0 gt2005 = 0 hi704 = 0 sp0838 = 0 mt9p001 = 0 mt9m113 = 0 gc2035 = 0 ov2655 = 0 hi253 = 0 gc0307 = 0 mt9d112 = 0 ov5640 = 0 ov5647 = 0 gc2015 = 0 ov2643 = 0 gc0329 = 0 gc0309 = 0 tvp5150 = 0 s5k4ec = 0 ov5650_mv9335 = 0 siv121d = 0 ov2710 = 1
2、
完成了基础的配置文件后(主要给A31的VFE使用),剩余驱动文件
这里包括sensor的驱动和cam_detect的驱动(添加对应的detect源码,更新camera_list)
__camera_list_t camera_list[MAX_CAMERA_LIST_ITEM] = { CAMERA_LIST_ITEM_INIT(ov7670, 1, 1, 0x42, 1, 0, 0, 1, 1, 0), CAMERA_LIST_ITEM_INIT(gc2035, 1, 1, 0x78, 1, 0, 0, 1, 1, 0), CAMERA_LIST_ITEM_INIT(gc0308, 1, 1, 0x42, 1, 0, 0, 1, 1, 0), CAMERA_LIST_ITEM_INIT(gt2005, 2, 1, 0x78, 0, 1, 0, 1, 1, 0), CAMERA_LIST_ITEM_INIT(hi704, 1, 1, 0x60, 1, 0, 0, 1, 1, 0), CAMERA_LIST_ITEM_INIT(sp0838, 1, 1, 0x30, 1, 0, 0, 1, 1, 0), CAMERA_LIST_ITEM_INIT(mt9m112, 1, 2, 0xba, 1, 0, 0, 1, 1, 0), CAMERA_LIST_ITEM_INIT(mt9m113, 2, 2, 0x78, 1, 0, 0, 1, 1, 0), CAMERA_LIST_ITEM_INIT(ov2655, 2, 1, 0x60, 1, 0, 0, 1, 1, 0), CAMERA_LIST_ITEM_INIT(hi253, 1, 1, 0x40, 1, 0, 0, 1, 1, 0), CAMERA_LIST_ITEM_INIT(gc0307, 1, 1, 0x42, 1, 0, 0, 1, 1, 0), ......... };
3.修改init.sun6i.rc,添加insmod 加载ko驱动文件:
#add mt9p001/ov2710 camera insmod /system/vendor/modules/mt9p001.ko insmod /system/vendor/modules/ov5640.ko insmod /system/vendor/modules/ov2710.ko insmod /system/vendor/modules/s5k4ec.ko insmod /system/vendor/modules/vfe_v4l2.ko
4.考虑摄像头是内置VCM还是外控VCM
一般sensor有ISP的话,支持3A就一般会是集成了内置vcm.直接由sensor来控制vcm.
而外控是指的处理器经过3A后,负责都sensor的VCM进行控制,而这些sensor不带ISP。
基本上对sensor的移植就是对以上内容的修改、配置、编码就是这些内容。