转载自:http://blog.sina.com.cn/s/blog_602f87700101gz06.html
在使用全志A20 时,需要设置曝光。设置曝光值的通常流程是:
在使用全志A20 时,需要设置曝光。设置曝光值的通常流程是:
1. 首先将曝光模式修改为手动曝光。
2. 设置曝光档次或者具体的曝光值。
例1:得到曝光模式,设置为手动曝光模式
int ret;
struct v4l2_control ctrl;
//得到曝光模式
ctrl.id = V4L2_CID_EXPOSURE_AUTO;
ret = ioctl(Handle, VIDIOC_G_CTRL, &ctrl);
if (ret < 0)
{
printf("Get exposure auto Type failed\n");
return V4L2_UTILS_GET_EXPSURE_AUTO_TYPE_ERR;
}
printf("\nGet Exposure Auto Type:[%d]\n", ctrl.value);
// 此时,得到曝光模式。曝光模式分以下几种:
//设置曝光模式为手动模式
int ret;
//设置曝光档次
ctrl.id = V4L2_CID_EXPOSURE;
例3:在设置为手动模式后,再得到和设置曝光绝对值:
int ret;
struct v4l2_control ctrl;
ctrl.id = V4L2_CID_EXPOSURE_ABSOLUTE;
ret = ioctl(handle, VIDIOC_G_CTRL, &ctrl);
if (ret < 0)
{
printf("Set exposure failed (%d)\n", ret);
//return V4L2_UTILS_SET_EXPSURE_ERR;
}
printf("\nGet ABS EXP Success:[%d]\n", ctrl.value);
sleep(1);
//设置曝光绝对值
ctrl.id = V4L2_CID_EXPOSURE_ABSOLUTE;
ctrl.value = 5;
ret = ioctl(handle, VIDIOC_S_CTRL, &ctrl);
if (ret < 0)
{
printf("Set exposure failed (%d)\n", ret);
//return V4L2_UTILS_SET_EXPSURE_ERR;
}
在A20 平台上,对CSI camera driver上,只支持:
1.得到和设置曝光模式。V4L2_CID_EXPOSURE_AUTO
2.得到和设置曝光档次。V4L2_CID_EXPOSURE
但并不支持设置曝光绝对值:
V4L2_CID_EXPOSURE_ABSOLUTE
Sam对这个也算满意。于是设置为曝光档次为 -4.但非常意外的是:在不同曝光档次下,其LED灯运动拖尾竟然完全一致。如图。
这幅是LED等运动拍照图,-4 档次下。
这幅是4档次下,LED的移动:
Sam一位同事非常敏锐地指出,这个设置应该不是曝光,虽然设置为-4时,颜色比较黑,但从拖尾的长度来看,其实应该不是曝光值变化了。
Sam对此也认同,看到全志Driver同事在这块的处理是:
写入对应值到0x0301Register.
在查询格科微datasheet后看到:此处Register 为:TargetLevel of ACL.
再看Datasheet,0x304/0x305. 是设置Electrical shutter的。这其实才是设置绝对曝光的关键。
于是,Sam在gt2005.c中,添加了得到和设置绝对值曝光的ioctl.
// sam add it for setting abs exp
static int
sensor_s_absexp(structv4l2_subdev * sd, int value)
{
int ret;
printk("<1>SamInfo: Enter sensor_s_absexp() ");
sensor_ev_absexp_regs[0].value[0] = (unsigned char) (value>> 8);
sensor_ev_absexp_regs[1].value[0] = (unsigned char)(value& 0xFF);
ret = sensor_write_array(sd, sensor_ev_absexp_regs,ARRAY_SIZE(sensor_ev_absexp_regs));
if (ret < 0) {
csi_dev_err("sensor_write_array err atsensor_s_absexp!\n");
printk("<1>SamInfo: sensor_write_array err atsensor_s_absexp\n");
return ret;
}
mdelay(10);
return 0;
}
// sam add it for get ABS Exp
static int sensor_g_absexp(struct v4l2_subdev *sd, __s32*value)
{
int ret;
struct sensor_info *info = to_state(sd);
struct regval_list regs;
printk("<1>SamInfo: Enter sensor_g_absexp()");
regs.reg_num[0] = 0x03;
regs.reg_num[1] = 0x04;
ret = sensor_read(sd, regs.reg_num, regs.value);
if (ret < 0) {
csi_dev_err("sensor_read err at sensor_g_absexp!\n");
printk("<1>SamInfo: sensor_read err atsensor_g_absexp");
return ret;
}
*value = regs.value[0] << 8;
regs.reg_num[0] = 0x03;
regs.reg_num[1] = 0x05;
ret = sensor_read(sd, regs.reg_num, regs.value);
if (ret < 0) {
csi_dev_err("sensor_read err at sensor_g_absexp!\n");
printk("<1>SamInfo: sensor_read err atsensor_g_absexp");
return ret;
}
*value = *value | regs.value[0];
return 0;
}
测试后一切正常。拖尾得问题也解决了。
呵呵,和之前一样,如果有人认识全志 驱动组同事,请告知对方修改。