最近一段时间都在用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。比如:
01.
vip_dev0_mname =
"ov2710"
02.
vip_dev0_twi_id =
0
03.
vip_dev0_twi_addr =
0x6c
04.
vip_dev0_isp_used =
1
05.
vip_dev0_fmt =
1
06.
vip_dev0_stby_mode =
0
07.
vip_dev0_vflip =
0
08.
vip_dev0_hflip =
1
09.
vip_dev0_iovdd =
"axp22_dldo3"
10.
vip_dev0_iovdd_vol =
2800000
11.
vip_dev0_avdd =
"axp22_ldoio0"
12.
vip_dev0_avdd_vol =
2800000
13.
vip_dev0_dvdd =
"axp22_eldo1"
14.
vip_dev0_dvdd_vol =
1800000
15.
vip_dev0_afvdd =
""
16.
vip_dev0_afvdd_vol =
2800000
还有一个是camera_list_para,主要用于驱动加载时的自检测使用,说明当前对应的摄像头是要被自检测的:
01.
[camera_list_para]
02.
camera_list_para_used =
1
03.
ov7670 =
0
04.
gc0308 =
0
05.
gt2005 =
0
06.
hi704 =
0
07.
sp0838 =
0
08.
mt9p001 =
0
09.
mt9m113 =
0
10.
gc2035 =
0
11.
ov2655 =
0
12.
hi253 =
0
13.
gc0307 =
0
14.
mt9d112 =
0
15.
ov5640 =
0
16.
ov5647 =
0
17.
gc2015 =
0
18.
ov2643 =
0
19.
gc0329 =
0
20.
gc0309 =
0
21.
tvp5150 =
0
22.
s5k4ec =
0
23.
ov5650_mv9335 =
0
24.
siv121d =
0
25.
ov2710 =
1
2、
完成了基础的配置文件后(主要给A31的VFE使用),剩余驱动文件
这里包括sensor的驱动和cam_detect的驱动(添加对应的detect源码,更新camera_list)
01.
__camera_list_t camera_list[MAX_CAMERA_LIST_ITEM] = {
02.
CAMERA_LIST_ITEM_INIT(ov7670,
1
,
1
,
0x42
,
1
,
0
,
0
,
1
,
1
,
0
),
03.
CAMERA_LIST_ITEM_INIT(gc2035,
1
,
1
,
0x78
,
1
,
0
,
0
,
1
,
1
,
0
),
04.
CAMERA_LIST_ITEM_INIT(gc0308,
1
,
1
,
0x42
,
1
,
0
,
0
,
1
,
1
,
0
),
05.
CAMERA_LIST_ITEM_INIT(gt2005,
2
,
1
,
0x78
,
0
,
1
,
0
,
1
,
1
,
0
),
06.
CAMERA_LIST_ITEM_INIT(hi704,
1
,
1
,
0x60
,
1
,
0
,
0
,
1
,
1
,
0
),
07.
CAMERA_LIST_ITEM_INIT(sp0838,
1
,
1
,
0x30
,
1
,
0
,
0
,
1
,
1
,
0
),
08.
CAMERA_LIST_ITEM_INIT(mt9m112,
1
,
2
,
0xba
,
1
,
0
,
0
,
1
,
1
,
0
),
09.
CAMERA_LIST_ITEM_INIT(mt9m113,
2
,
2
,
0x78
,
1
,
0
,
0
,
1
,
1
,
0
),
10.
CAMERA_LIST_ITEM_INIT(ov2655,
2
,
1
,
0x60
,
1
,
0
,
0
,
1
,
1
,
0
),
11.
CAMERA_LIST_ITEM_INIT(hi253,
1
,
1
,
0x40
,
1
,
0
,
0
,
1
,
1
,
0
),
12.
CAMERA_LIST_ITEM_INIT(gc0307,
1
,
1
,
0x42
,
1
,
0
,
0
,
1
,
1
,
0
),
13.
.........
14.
};
3.修改init.sun6i.rc,添加insmod 加载ko驱动文件:
1.
#add mt9p001/ov2710 camera
2.
insmod /system/vendor/modules/mt9p001.ko
3.
insmod /system/vendor/modules/ov5640.ko
4.
insmod /system/vendor/modules/ov2710.ko
5.
insmod /system/vendor/modules/s5k4ec.ko
6.
insmod /system/vendor/modules/vfe_v4l2.ko
4.考虑摄像头是内置VCM还是外控VCM
一般sensor有ISP的话,支持3A就一般会是集成了内置vcm.直接由sensor来控制vcm.
而外控是指的处理器经过3A后,负责都sensor的VCM进行控制,而这些sensor不带ISP。
基本上对sensor的移植就是对以上内容的修改、配置、编码就是这些内容。