如下以 OV5647 为例
假设 OV5647AB 和 OV5647BC 是两个不同模组厂的模组。
1:在kd_imgsensor.h 內定义不同的Sensor_ID。
#define OV5647AB_SENSOR_ID 0x5647
#define OV5647BC_SENSOR_ID 0x5648
2:ProjectConfig.mk 中加入 OV5647AB 和 OV5647BC 的sensor 注册。
可以参考如下部分。
CUSTOM_HAL_IMGSENSOR=ov5647AC_raw ov5647BC_raw
CUSTOM_HAL_MAIN_IMGSENSOR=ov5647AC_raw
CUSTOM_HAL_MAIN_BACKUP_IMGSENSOR=ov5647BC_raw
CUSTOM_KERNEL_IMGSENSOR=ov5647AC_raw ov5647BC_raw ov7690_yuv
CUSTOM_KERNEL_MAIN_BACKUP_IMGSENSOR=ov5647BC_raw
CUSTOM_KERNEL_MAIN_IMGSENSOR=ov5647AC_raw
3:Driver 部分的修改
mediatek\custom\common\kernel\imgsensor 这个目录下将之前的 OV5647 分别命名为OV5647AB 和 OV5647BC。Driver 里面的函数也做同步修改。
4:在 mediatek\custom\common\kernel\imgsensor 目录下的 ov5647AC_Sensor .c 和ov5647BC_Sensor.c 中的 OV5647GetSensorID_BC 这个函数中做如下修改。
*sensorID=((OV5647BC_read_cmos_sensor(0x300A) << 8) | OV5647BC_read_cmos_sensor(0x300B));
sensorID +=1;
在这个函数中再加入判读模组信息的判断。
加入 AC 模组的 MID 也就是模组厂的标志位 的读取可以参考如下说明。具体的地址寄存器可以参考对应的sensor DataSheet 。模组厂的MID可以请模组厂帮忙提供。
static UINT32 OV5647AC_OTP_combination_read(void)
{
kal_int8 mid = 0x00;
OV5647AC_write_cmos_sensor (0x3D21, 0x01);
Sleep(50); // 50ms
mid = OV5647AC_read_cmos_sensor (0x3D05);
mid &= 0x7F;
printk("*********************************************MID = %d\n",mid);
OV5647AC_write_cmos_sensor (0x3D21, 0x00);
if (2 == mid)
{
return TRUE;
}
else
{
return FALSE;
}
}
然后在OV5647GetSensorID_AC 这个函数中加入如下部分。关键是如果sensor MID 不对的话此时需要将 sensorID 设置为0xFFFFFFFF 。
if (!OV5647AC_OTP_combination_read())
{
*sensorID = 0xFFFFFFFF;
SENSORDB("OV5647ACOpen, MID != 0 \n");
return ERROR_SENSOR_CONNECT_FAIL;
}
OV5647GetSensorID_BC 也做类似的修改。
5:最后一步判断是否真正的区分了对应模组的参数。
将 mediatek\custom\common\hal\imgsensor\ov5647AC_raw 或者
mediatek\custom\common\hal\imgsensor\ov5647BC_raw 文件中的
camera_isp_regs_ov5647AC_mt65XX.c 中的 CCM 部分修改成
CCM:{
{set:{//00
0x01000000, 0x00000000, 0x01000000, 0x00000000, 0x01000000,
}},
{set:{//01
0x01000000, 0x00000000, 0x01000000, 0x00000000, 0x01000000,
}},
{set:{//02
0x01000000, 0x00000000, 0x01000000, 0x00000000, 0x01000000,
}}
},
重新build 。确认两颗模组的色彩表现是否不同。如果一个色彩比较暗淡,则修改OK。