static int ioctl_send_command(struct v4l2_int_device *s, struct v4l2_send_command_control *vc) {
int ret = -1;
int retval1,retval2;
u8 loca_val=0;
ret = ov5640_set_idle_mode();
if (0 != ret)
pr_err("error %d setting idle moden", ret);
ov5640_config_auto_focus();
switch (vc->id) {
case 101: //step to near
pr_debug("Stepping to near objectn");
retval1=ov5640_write_reg(REG_CMD_TAG, 0x01);
retval2=ov5640_write_reg(REG_CMD_MAIN, 0x05);
if(retval1 == 0 && retval2 == 0)
ret = 0;
break;
case 102: //step to far
pr_debug("Stepping to far objectn");
retval1=ov5640_write_reg(REG_CMD_TAG, 0x02);
retval2=ov5640_write_reg(REG_CMD_MAIN, 0x05);
if(retval1 == 0 && retval2 == 0)
ret = 0;
break;
case 103: //step to furthest
pr_debug("Stepping to furthest objectn");
retval1=ov5640_write_reg(REG_CMD_TAG, 0x03);
retval2=ov5640_write_reg(REG_CMD_MAIN, 0x05);
if(retval1 == 0 && retval2 == 0)
ret = 0;
break;
case 104: //step to nearest
pr_debug("Stepping to nearest objectn");
retval1=ov5640_write_reg(REG_CMD_TAG, 0x04);
retval2=ov5640_write_reg(REG_CMD_MAIN, 0x05);
if(retval1 == 0 && retval2 == 0)
ret = 0;
break;
case 105: //step to specified position
pr_debug("Stepping to position: %dn", vc->value0);
if(vc->value0 < 0 || vc->value0 > 255)
return ret;
loca_val = vc->value0;
retval1=ov5640_write_reg(REG_CMD_TAG, 0x10);
retval2=ov5640_write_reg(REG_CMD_PARA0, loca_val);
ret=ov5640_write_reg(REG_CMD_MAIN, 0x05);
if(retval1 != 0 && retval2 != 0 && ret != 0)
ret = -1;
break;
default:
break;
}