📄 image_sensor_ov7660.c
字号:
info_ptr->is_read_only=KAL_FALSE;
info_ptr->is_need_restart=KAL_TRUE;
info_ptr->min=2;
info_ptr->max=8;
break;
default:
ASSERT(0);
}
break;
case FRAME_RATE_LIMITATION:
switch (item_idx)
{
case 0:
sprintf((char *) (info_ptr->item_name_ptr), "Max Exposure Lines");
info_ptr->item_value=OV7660_MAX_EXPOSURE_LINES;
info_ptr->is_true_false=KAL_FALSE;
info_ptr->is_read_only=KAL_TRUE;
info_ptr->is_need_restart=KAL_FALSE;
info_ptr->min=0;
info_ptr->max=0;
break;
case 1:
sprintf((char *) (info_ptr->item_name_ptr), "Min Frame Rate");
info_ptr->item_value=OV7660_MIN_FRAME_RATE;
info_ptr->is_true_false=KAL_FALSE;
info_ptr->is_read_only=KAL_TRUE;
info_ptr->is_need_restart=KAL_FALSE;
info_ptr->min=0;
info_ptr->max=0;
break;
default:
ASSERT(0);
}
break;
case REGISTER_EDITOR:
switch (item_idx)
{
case 0:
sprintf((char *) (info_ptr->item_name_ptr), "REG Addr.");
info_ptr->item_value=0;
info_ptr->is_true_false=KAL_FALSE;
info_ptr->is_read_only=KAL_FALSE;
info_ptr->is_need_restart=KAL_FALSE;
info_ptr->min=0;
info_ptr->max=0xFF;
break;
case 1:
sprintf((char *) (info_ptr->item_name_ptr), "REG Value");
info_ptr->item_value=0;
info_ptr->is_true_false=KAL_FALSE;
info_ptr->is_read_only=KAL_FALSE;
info_ptr->is_need_restart=KAL_FALSE;
info_ptr->min=0;
info_ptr->max=0xFF;
break;
default:
ASSERT(0);
}
break;
default:
ASSERT(0);
#endif
}
}
kal_bool OV7660_set_sensor_item_info(kal_uint16 group_idx, kal_uint16 item_idx, kal_int32 item_value)
{
kal_uint8 temp_reg;
kal_uint16 temp_gain;
switch (group_idx)
{
#if (! defined(DRV_ISP_6238_SERIES))
case OV7660_AWB_GAIN:
switch (item_idx)
{
case 0:
camera_para.SENSOR.reg[OV7660_AWB_GAIN_R_INDEX].para = item_value;
OV7660_write_reg(camera_para.SENSOR.reg[OV7660_AWB_GAIN_R_INDEX].addr,item_value);
break;
case 1:
camera_para.SENSOR.reg[OV7660_AWB_GAIN_B_INDEX].para = item_value;
OV7660_write_reg(camera_para.SENSOR.reg[OV7660_AWB_GAIN_B_INDEX].addr,item_value);
break;
default:
ASSERT(0);
}
break;
case OV7660_PRE_GAIN:
switch (item_idx)
{
case 0:
temp_reg = OV7660_read_reg(camera_para.SENSOR.cct[OV7660_PRE_GAIN_R_INDEX].addr);
temp_reg &= ~0x30;
if(item_value>=1000 && item_value<=1125)
temp_reg |= 0x00;
else if(item_value>1125 && item_value<=1375)
temp_reg |= 0x10;
else if(item_value>1375 && item_value<=1625)
temp_reg |= 0x20;
else if(item_value>1625 && item_value<=1875)
temp_reg |= 0x30;
else
return KAL_FALSE;
camera_para.SENSOR.cct[OV7660_PRE_GAIN_R_INDEX].para = temp_reg;
OV7660_write_reg(camera_para.SENSOR.cct[OV7660_PRE_GAIN_R_INDEX].addr,temp_reg);
break;
case 1:
temp_reg = OV7660_read_reg(camera_para.SENSOR.cct[OV7660_PRE_GAIN_B_INDEX].addr);
temp_reg &= ~0xC0;
if(item_value>=1000 && item_value<=1125)
temp_reg |= 0x00;
else if(item_value>1125 && item_value<=1375)
temp_reg |= 0x40;
else if(item_value>1375 && item_value<=1625)
temp_reg |= 0x80;
else if(item_value>1625 && item_value<=1875)
temp_reg |= 0xC0;
else
return KAL_FALSE;
camera_para.SENSOR.cct[OV7660_PRE_GAIN_B_INDEX].para = temp_reg;
OV7660_write_reg(camera_para.SENSOR.cct[OV7660_PRE_GAIN_B_INDEX].addr,temp_reg);
break;
case 2:
temp_gain = (item_value*BASEGAIN)/1000;
if(temp_gain>=1*BASEGAIN && temp_gain<2*BASEGAIN)
{
ov7660_sensor_global_gain=temp_gain&(~0x3);
temp_reg=(ov7660_sensor_global_gain-1*BASEGAIN)/4;
}
else if(temp_gain>=2*BASEGAIN && temp_gain<4*BASEGAIN)
{
ov7660_sensor_global_gain=temp_gain&(~0x7);
temp_reg=0x10;
temp_reg|=(ov7660_sensor_global_gain-2*BASEGAIN)/8;
}
else if(temp_gain>=4*BASEGAIN && temp_gain<8*BASEGAIN)
{
ov7660_sensor_global_gain=temp_gain&(~0xF);
temp_reg=0x30;
temp_reg|=(ov7660_sensor_global_gain-4*BASEGAIN)/16;
}
else if(temp_gain>=8*BASEGAIN && temp_gain<16*BASEGAIN)
{
ov7660_sensor_global_gain=temp_gain&(~0x1F);
temp_reg=0x70;
temp_reg|=(ov7660_sensor_global_gain-8*BASEGAIN)/32;
}
else if(temp_gain>=16*BASEGAIN)
{
ov7660_sensor_global_gain=temp_gain&(~0x3F);
temp_reg=0xF0;
temp_reg|=(ov7660_sensor_global_gain-16*BASEGAIN)/64;
}
else
return KAL_FALSE;
camera_para.SENSOR.cct[OV7660_GLOBAL_GAIN_INDEX].para = temp_reg;
OV7660_write_reg(camera_para.SENSOR.cct[OV7660_GLOBAL_GAIN_INDEX].addr,temp_reg);
break;
default:
ASSERT(0);
}
break;
case OV7660_SENSOR_DBLC:
switch (item_idx)
{
case 0:
if(item_value==1)
{
temp_reg = OV7660_read_reg(camera_para.SENSOR.reg[OV7660_SENSOR_DBLC_INDEX].addr);
temp_reg |= 0x10;
camera_para.SENSOR.reg[OV7660_SENSOR_DBLC_INDEX].para = temp_reg;
OV7660_write_reg(camera_para.SENSOR.reg[OV7660_SENSOR_DBLC_INDEX].addr,temp_reg);
}
else
{
temp_reg = OV7660_read_reg(camera_para.SENSOR.reg[OV7660_SENSOR_DBLC_INDEX].addr);
temp_reg &= ~0x10;
camera_para.SENSOR.reg[OV7660_SENSOR_DBLC_INDEX].para = temp_reg;
OV7660_write_reg(camera_para.SENSOR.reg[OV7660_SENSOR_DBLC_INDEX].addr,temp_reg);
}
break;
default:
ASSERT(0);
}
break;
case OV7660_GAMMA_ENABLE:
switch (item_idx)
{
case 0:
temp_reg = OV7660_read_reg(camera_para.SENSOR.reg[OV7660_GAMMA_ENABLE_INDEX].addr);
temp_reg &= ~0xC0;
if(item_value==1)
{
temp_reg |= 0x80;
camera_para.SENSOR.reg[OV7660_GAMMA_ENABLE_INDEX].para = temp_reg;
}
else
{
temp_reg &= ~0x80;
camera_para.SENSOR.reg[OV7660_GAMMA_ENABLE_INDEX].para = temp_reg;
}
OV7660_write_reg(camera_para.SENSOR.reg[OV7660_GAMMA_ENABLE_INDEX].addr,temp_reg);
break;
default:
ASSERT(0);
}
break;
case OV7660_CMMCLK_CURRENT:
switch (item_idx)
{
case 0:
if(item_value==2)
{
camera_para.SENSOR.reg[OV7660_CMMCLK_CURRENT_INDEX].para = ISP_DRIVING_2MA;
set_isp_driving_current(ISP_DRIVING_2MA);
}
else if(item_value==3 || item_value==4)
{
camera_para.SENSOR.reg[OV7660_CMMCLK_CURRENT_INDEX].para = ISP_DRIVING_4MA;
set_isp_driving_current(ISP_DRIVING_4MA);
}
else if(item_value==5 || item_value==6)
{
camera_para.SENSOR.reg[OV7660_CMMCLK_CURRENT_INDEX].para = ISP_DRIVING_6MA;
set_isp_driving_current(ISP_DRIVING_6MA);
}
else
{
camera_para.SENSOR.reg[OV7660_CMMCLK_CURRENT_INDEX].para = ISP_DRIVING_8MA;
set_isp_driving_current(ISP_DRIVING_8MA);
}
break;
default:
ASSERT(0);
}
break;
case OV7660_FRAME_RATE_LIMITATION:
switch (item_idx)
{
ASSERT(0);
}
break;
case OV7660_REGISTER_EDITOR:
switch (item_idx)
{
case 0:
OV7660_FAC_SENSOR_REG=item_value;
break;
case 1:
OV7660_write_reg(OV7660_FAC_SENSOR_REG,item_value);
break;
default:
ASSERT(0);
}
break;
default:
ASSERT(0);
#else
case PRE_GAIN:
switch (item_idx)
{
case 0:
temp_reg = OV7660_read_reg(camera_para.SENSOR.cct[PRE_GAIN_R_INDEX].addr);
temp_reg &= ~0x30;
if(item_value>=1000 && item_value<=1125)
temp_reg |= 0x00;
else if(item_value>1125 && item_value<=1375)
temp_reg |= 0x10;
else if(item_value>1375 && item_value<=1625)
temp_reg |= 0x20;
else if(item_value>1625 && item_value<=1875)
temp_reg |= 0x30;
else
return KAL_FALSE;
camera_para.SENSOR.cct[PRE_GAIN_R_INDEX].para = temp_reg;
OV7660_write_reg(camera_para.SENSOR.cct[PRE_GAIN_R_INDEX].addr,temp_reg);
break;
case 1:
temp_reg = OV7660_read_reg(camera_para.SENSOR.cct[PRE_GAIN_B_INDEX].addr);
temp_reg &= ~0xC0;
if(item_value>=1000 && item_value<=1125)
temp_reg |= 0x00;
else if(item_value>1125 && item_value<=1375)
temp_reg |= 0x40;
else if(item_value>1375 && item_value<=1625)
temp_reg |= 0x80;
else if(item_value>1625 && item_value<=1875)
temp_reg |= 0xC0;
else
return KAL_FALSE;
camera_para.SENSOR.cct[PRE_GAIN_B_INDEX].para = temp_reg;
OV7660_write_reg(camera_para.SENSOR.cct[PRE_GAIN_B_INDEX].addr,temp_reg);
break;
case 2:
temp_gain = (item_value*BASEGAIN)/1000;
if(temp_gain>=1*BASEGAIN && temp_gain<2*BASEGAIN)
{
ov7660_sensor_global_gain=temp_gain&(~0x3);
temp_reg=(ov7660_sensor_global_gain-1*BASEGAIN)/4;
}
else if(temp_gain>=2*BASEGAIN && temp_gain<4*BASEGAIN)
{
ov7660_sensor_global_gain=temp_gain&(~0x7);
temp_reg=0x10;
temp_reg|=(ov7660_sensor_global_gain-2*BASEGAIN)/8;
}
else if(temp_gain>=4*BASEGAIN && temp_gain<8*BASEGAIN)
{
ov7660_sensor_global_gain=temp_gain&(~0xF);
temp_reg=0x30;
temp_reg|=(ov7660_sensor_global_gain-4*BASEGAIN)/16;
}
else if(temp_gain>=8*BASEGAIN && temp_gain<16*BASEGAIN)
{
ov7660_sensor_global_gain=temp_gain&(~0x1F);
temp_reg=0x70;
temp_reg|=(ov7660_sensor_global_gain-8*BASEGAIN)/32;
}
else if(temp_gain>=16*BASEGAIN)
{
ov7660_sensor_global_gain=temp_gain&(~0x3F);
temp_reg=0xF0;
temp_reg|=(ov7660_sensor_global_gain-16*BASEGAIN)/64;
}
else
return KAL_FALSE;
camera_para.SENSOR.cct[SENSOR_BASEGAIN].para = temp_reg;
OV7660_write_reg(camera_para.SENSOR.cct[SENSOR_BASEGAIN].addr,temp_reg);
break;
default:
ASSERT(0);
}
break;
case CMMCLK_CURRENT:
switch (item_idx)
{
case 0:
if(item_value==2)
{
camera_para.SENSOR.reg[CMMCLK_CURRENT_INDEX].para = ISP_DRIVING_2MA;
set_isp_driving_current(ISP_DRIVING_2MA);
}
else if(item_value==3 || item_value==4)
{
camera_para.SENSOR.reg[CMMCLK_CURRENT_INDEX].para = ISP_DRIVING_4MA;
set_isp_driving_current(ISP_DRIVING_4MA);
}
else if(item_value==5 || item_value==6)
{
camera_para.SENSOR.reg[CMMCLK_CURRENT_INDEX].para = ISP_DRIVING_6MA;
set_isp_driving_current(ISP_DRIVING_6MA);
}
else
{
camera_para.SENSOR.reg[CMMCLK_CURRENT_INDEX].para = ISP_DRIVING_8MA;
set_isp_driving_current(ISP_DRIVING_8MA);
}
break;
default:
ASSERT(0);
}
break;
case FRAME_RATE_LIMITATION:
switch (item_idx)
{
ASSERT(0);
}
break;
case REGISTER_EDITOR:
switch (item_idx)
{
case 0:
OV7660_FAC_SENSOR_REG=item_value;
break;
case 1:
OV7660_write_reg(OV7660_FAC_SENSOR_REG,item_value);
break;
default:
ASSERT(0);
}
break;
default:
ASSERT(0);
#endif
}
return KAL_TRUE;
}
void OV7660_get_sensor_prefix_name(kal_char* buf){
strcpy(buf, "OV7660");
}
void OV7660_cct_global_variable_init(void){
g_CCT_MainSensor=OV7660_g_CCT_MainSensor;
g_CCT_FirstGrabColor=OV7660_g_CCT_FirstGrabColor;
}
kal_uint16 OV7660_get_max_exposure_lines(void){
return OV7660_MAX_EXPOSURE_LINES;
}
void OV7660_set_max_exposure_lines(kal_uint32 shutter_lines){
OV7660_MAX_EXPOSURE_LINES = shutter_lines;
}
kal_uint16 OV7660_get_min_exposure_lines(void){
return OV7660_MIN_EXPOSURE_LINES;
}
#if (defined(DRV_ISP_6238_SERIES))
void OV7660_dispatch_camera_info(void) {
kal_mem_cpy(&dsc_support_info, &OV7660_dsc_support_info, sizeof(camcorder_info_struct));
}
#endif
kal_uint32 OV7660_get_valid_camera_type(void) {
#if(defined(OV7660_RAW_MAIN))
return IMAGE_SENSOR_MAIN;
#elif(defined(OV7660_RAW_SUB))
return IMAGE_SENSOR_SUB;
#elif(defined(OV7660_RAW_BAK1))
return IMAGE_SENSOR_BAK1;
#elif(defined(OV7660_RAW_SUB_BAK1))
return IMAGE_SENSOR_SUB_BAK1;
#endif
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -