A20 CSI Driver增加设定曝光功能

转载自:http://blog.sina.com.cn/s/blog_602f87700101gz06.html

在使用全志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);
// 此时,得到曝光模式。曝光模式分以下几种:

//设置曝光模式为手动模式
  ctrl.id =V4L2_CID_EXPOSURE_AUTO; 
  ctrl.value = V4L2_EXPOSURE_MANUAL;  //手动曝光模式
  ret = ioctl(Handle, VIDIOC_S_CTRL,&ctrl); 
  if (ret < 0) 
  { printf("Get exposure auto Typefailed\n"); 
  returnV4L2_UTILS_SET_EXPSURE_AUTO_TYPE_ERR; 
  }
 例2:在设置为手动模式后,再得到和设置曝光等级
int ret; 
  struct v4l2_controlctrl; 
  ctrl.id = V4L2_CID_EXPOSURE;  //得到曝光档次,A20接受从 -4到4 共9个档次
  ret = ioctl(Handle, VIDIOC_G_CTRL,&ctrl); 
  if (ret < 0) 
  { printf("Get exposure failed (%d)\n",ret); 
  returnV4L2_UTILS_GET_EXPSURE_ERR; 
 
 
printf("\nGet Exposure :[%d]\n",ctrl.value);
//设置曝光档次
ctrl.id = V4L2_CID_EXPOSURE; 
  ctrl.value = -4; 
  ret = ioctl(Handle, VIDIOC_S_CTRL,&ctrl); 
  if (ret < 0) { printf("Set exposurefailed (%d)\n", ret); 
  return V4L2_UTILS_SET_EXPSURE_ERR;} 

例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 档次下。

A20 <wbr>CSI <wbr>Driver增加设定曝光功能


这幅是4档次下,LED的移动:
A20 <wbr>CSI <wbr>Driver增加设定曝光功能


Sam一位同事非常敏锐地指出,这个设置应该不是曝光,虽然设置为-4时,颜色比较黑,但从拖尾的长度来看,其实应该不是曝光值变化了。

Sam对此也认同,看到全志Driver同事在这块的处理是:
写入对应值到0x0301Register.  在查询格科微datasheet后看到:此处Register 为:TargetLevel of ACL.

 再看ACL,其实是Auto Luminance Control.所以,它并不是一个曝光等次。而是一个亮度,增益的一个平衡值。


再看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;
}

测试后一切正常。拖尾得问题也解决了。


呵呵,和之前一样,如果有人认识全志 驱动组同事,请告知对方修改。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值