📄 camsensor_ov9650.c
字号:
camsensor_function_table_ptr->camsensor_set_frame_rate = camsensor_ov9650_set_frame_rate;
} /* camsensor_ov9650_register */
/*===========================================================================
FUNCTION CAMSENSOR_OV9650_SETUP_CAMCTRL_TBL
DESCRIPTION
Initialize sensor specific function pointers and static params in camctrl_tbl
DEPENDENCIES
None
RETURN VALUE
None
SIDE EFFECTS
None
===========================================================================*/
LOCAL void camsensor_ov9650_setup_camctrl_tbl(camctrl_tbl_type *camctrl_tbl_ptr)
{
/*lint -save -e715 -e818 remove after adopting to new architecture*/
}
/*lint -restore */
/*===========================================================================
FUNCTION OV9650_WRITE_REGISTER
DESCRIPTION
8-bit I2C write to an OV9650 camera sensor register.
DEPENDENCIES
None
RETURN VALUE
TRUE - Register write successful.
FALSE - Register write failed.
ARGUMENTS
reg - Written register's address.
data - Register's new value.
SIDE EFFECTS
None
===========================================================================*/
LOCAL boolean ov9650_write_register(uint8 reg, uint8 data)
{
uint8 trials_count;
boolean return_value;
camsensor_i2c_command.addr.reg = reg;
camsensor_i2c_command.buf_ptr = &data; /*lint !e789 Assignment Intentional*/
camsensor_i2c_command.len = 1;
return_value = FALSE;
for (trials_count = 0; trials_count < MAX_REGISTER_WRITE_TRIALS; ++trials_count)
{
if (i2c_write(&camsensor_i2c_command) == I2C_SUCCESS)
{
return_value = TRUE;
break;
}
} /* end of for loop. */
return return_value;
} /* end of ov9650_write_register. */
/*===========================================================================
FUNCTION OV9650_READ_REGISTER
DESCRIPTION
8-bit I2C read from an OV9650 camera sensor register.
DEPENDENCIES
None
RETURN VALUE
TRUE - Register read successful
FALSE - Register read failed
ARGUMETNS:
reg - Read register address.
data - Returned register value.
SIDE EFFECTS
None
===========================================================================*/
LOCAL boolean ov9650_read_register(uint8 reg, uint8 *data)
{
uint8 trials_count;
if (data == NULL)
{
return FALSE;
}
camsensor_i2c_command.addr.reg = reg;
camsensor_i2c_command.buf_ptr = data;
camsensor_i2c_command.len = 1;
for (trials_count = 0; trials_count < MAX_REGISTER_READ_TRIALS; ++trials_count)
{
if (i2c_read(&camsensor_i2c_command) == I2C_SUCCESS)
{
return TRUE;
}
} /* end of for loop. */
return FALSE;
} /* end of ov9650_read_register. */
/*===========================================================================
FUNCTION OV9650_WRITE_REGISTER_BIT_SECTION
DESCRIPTION
8-bit I2C write to a specific bit section of an OV9650 camera
sensor register.
DEPENDENCIES
None
RETURN VALUE
TRUE - Register write successful.
FALSE - Register write failed.
ARGUMENTS
reg - Written register's address.
data - Register's new value.
source_start_bit - The starting bit of the source data
dest_start_bit - The starting bit in the destination register.
bit_section_length - The bit section length.
SIDE EFFECTS
None
LIMITATIONS
Bit location range is from 0 to 7.
The sum of 'dest_start_bit' and 'bit_section_length' must less than
or equal to 8.
The sum of 'source_start_bit' and 'bit_section_length' must less than
or equal to 32.
===========================================================================*/
LOCAL boolean ov9650_write_register_bit_section(uint8 reg,
uint32 data,
uint8 source_start_bit,
uint8 dest_start_bit,
uint8 bit_section_length)
{
uint8 bit_section_data;
uint8 register_data;
uint32 bit_pattern;
uint32 one_bits;
if (dest_start_bit + bit_section_length > 8)
{
return FALSE;
}
if (source_start_bit + bit_section_length > 32)
{
return FALSE;
}
if (ov9650_read_register(reg, ®ister_data) == FALSE)
{
return FALSE;
}
one_bits = (uint32)0xFFFFFFFF;
bit_pattern = ( (one_bits << source_start_bit) &
(one_bits >> (31 - (source_start_bit + bit_section_length - 1))) );
/*lint -save -e734 Intended casting */
bit_section_data = (data & bit_pattern) >> source_start_bit;
/*lint -restore */
bit_pattern = ( (0xFF << dest_start_bit) &
(0xFF >> (7 - (dest_start_bit + bit_section_length - 1))) );
register_data &= ~bit_pattern;
register_data |= ((bit_section_data << dest_start_bit) & 255); /* Changed to resolve lint errors */
if (ov9650_write_register(reg, register_data) == FALSE)
{
return FALSE;
}
return TRUE;
} /* end of ov9650_write_register_bit_section. */
/*===========================================================================
FUNCTION OV9650_INITIALIZE_REGISTERS
DESCRIPTION
Initialize the OV9650 camera sensor registers to their
default values.
DEPENDENCIES
None
RETURN VALUE
TRUE - Initialization succeeded.
FALSE - Initialization failed.
ARGUMENTS:
NONE
SIDE EFFECTS
None
===========================================================================*/
LOCAL boolean ov9650_initialize_registers(void)
{
boolean rc;
rc = ov9650_write_register(GAIN_REG_ADDRESS, GAIN_REG_DEFAULT_VALUE);
RETURN_ON_FALSE(rc);
rc = ov9650_write_register(BLUE_GAIN_REG_ADDRESS, BLUE_GAIN_REG_DEFAULT_VALUE);
RETURN_ON_FALSE(rc);
rc = ov9650_write_register(RED_GAIN_REG_ADDRESS, RED_GAIN_REG_DEFAULT_VALUE);
RETURN_ON_FALSE(rc);
rc = ov9650_write_register(VREF_REG_ADDRESS, VREF_REG_DEFAULT_VALUE);
RETURN_ON_FALSE(rc);
rc = ov9650_write_register(VREF_REG_ADDRESS, VREF_REG_DEFAULT_VALUE);
RETURN_ON_FALSE(rc);
rc = ov9650_write_register(COM1_REG_ADDRESS, COM1_DEFAULT_VALUE);
RETURN_ON_FALSE(rc);
rc = ov9650_write_register(BAVE_REG_ADDRESS, BAVE_REG_DEFAULT_VALUE);
RETURN_ON_FALSE(rc);
rc = ov9650_write_register(GEAVE_REG_ADDRESS, GEAVE_REG_DEFAULT_VALUE);
RETURN_ON_FALSE(rc);
rc = ov9650_write_register(RAVE_REG_ADDRESS, RAVE_REG_DEFAULT_VALUE);
RETURN_ON_FALSE(rc);
rc = ov9650_write_register(COM2_REG_ADDRESS, COM2_REG_DEFAULT_VALUE);
RETURN_ON_FALSE(rc);
rc = ov9650_write_register(COM3_REG_ADDRESS, COM3_REG_DEFAULT_VALUE);
RETURN_ON_FALSE(rc);
rc = ov9650_write_register(COM4_REG_ADDRESS, COM4_REG_DEFAULT_VALUE);
RETURN_ON_FALSE(rc);
rc = ov9650_write_register(COM5_REG_ADDRESS, COM5_REG_DEFAULT_VALUE);
RETURN_ON_FALSE(rc);
rc = ov9650_write_register(COM6_REG_ADDRESS, COM6_REG_DEFAULT_VALUE);
RETURN_ON_FALSE(rc);
rc = ov9650_write_register(AECH_REG_ADDRESS, AECH_REG_DEFAULT_VALUE);
RETURN_ON_FALSE(rc);
rc = ov9650_write_register(CLKRC_REG_ADDRESS, CLKRC_REG_PRE_SCALAR_VALUE |
CLKRC_REG_DOUBLE_CLOCK_ENABLE);
RETURN_ON_FALSE(rc);
rc = ov9650_write_register(COM7_REG_ADDRESS, COM7_REG_RGB_OUTPUT_ENABLE |
COM7_REG_RAW_RGB_ENABLE);
RETURN_ON_FALSE(rc);
// !!! rc = ov9650_write_register(COM8_REG_ADDRESS, COM8_REG_DEFAULT_VALUE); !!!
// rc = ov9650_write_register(COM8_REG_ADDRESS, COM8_REG_NO_AGC_NO_AEC_NO_AWB);
rc = ov9650_write_register(COM8_REG_ADDRESS, 0x00);
RETURN_ON_FALSE(rc);
rc = ov9650_write_register(COM9_REG_ADDRESS, COM9_REG_VSYNC_DROP |
COM9_REG_ENABLE_DROP_FRAME);
RETURN_ON_FALSE(rc);
/*
* COM10 register configuration for our kestrel.
*
* rc = ov9650_write_register(COM10_REG_ADDRESS, COM10_REG_VSYNC_NEGATIVE |
* COM10_REG_PCLK_REVERSE);
*/
/*
* COM10 register configuration for LGE kestrel.
*/
rc = ov9650_write_register(COM10_REG_ADDRESS, COM10_REG_VSYNC_NEGATIVE);
RETURN_ON_FALSE(rc);
rc = ov9650_write_register(HSTART_REG_ADDRESS, HSTART_REG_DEFAULT_VALUE);
RETURN_ON_FALSE(rc);
rc = ov9650_write_register(HSTOP_REG_ADDRESS, HSTOP_REG_DEFAULT_VALUE);
RETURN_ON_FALSE(rc);
rc = ov9650_write_register(VSTRT_REG_ADDRESS, VSTRT_REG_DEFAULT_VALUE);
RETURN_ON_FALSE(rc);
rc = ov9650_write_register(VSTOP_REG_ADDRESS, VSTOP_REG_DEFAULT_VALUE);
RETURN_ON_FALSE(rc);
rc = ov9650_write_register(PSHFT_REG_ADDRESS, PSHFT_REG_DEFAULT_VALUE);
RETURN_ON_FALSE(rc);
rc = ov9650_write_register(MVFP_REG_ADDRESS, MVFP_REG_DEFAULT_VALUE);
RETURN_ON_FALSE(rc);
rc = ov9650_write_register(BOS_REG_ADDRESS, BOS_REG_DEFAULT_VALUE);
RETURN_ON_FALSE(rc);
rc = ov9650_write_register(GBOS_REG_ADDRESS, GBOS_REG_DEFAULT_VALUE);
RETURN_ON_FALSE(rc);
rc = ov9650_write_register(GROS_REG_ADDRESS, GROS_REG_DEFAULT_VALUE);
RETURN_ON_FALSE(rc);
rc = ov9650_write_register(ROS_REG_ADDRESS, ROS_REG_DEFAULT_VALUE);
RETURN_ON_FALSE(rc);
rc = ov9650_write_register(AEW_REG_ADDRESS, AEW_REG_DEFAULT_VALUE);
RETURN_ON_FALSE(rc);
rc = ov9650_write_register(AEB_REG_ADDRESS, AEB_REG_DEFAULT_VALUE);
RETURN_ON_FALSE(rc);
rc = ov9650_write_register(VPT_REG_ADDRESS, VPT_REG_DEFAULT_VALUE);
RETURN_ON_FALSE(rc);
rc = ov9650_write_register(BBIAS_REG_ADDRESS, BBIAS_REG_DEFAULT_VALUE);
RETURN_ON_FALSE(rc);
rc = ov9650_write_register(GbBIAS_REG_ADDRESS, GbBIAS_REG_DEFAULT_VALUE);
RETURN_ON_FALSE(rc);
rc = ov9650_write_register(Gr_COM_REG_ADDRESS, Gr_COM_REG_DEFAULT_VALUE);
RETURN_ON_FALSE(rc);
rc = ov9650_write_register(EXHCH_REG_ADDRESS, EXHCH_REG_DEFAULT_VALUE);
RETURN_ON_FALSE(rc);
rc = ov9650_write_register(EXHCL_REG_ADDRESS, EXHCL_REG_DEFAULT_VALUE);
RETURN_ON_FALSE(rc);
rc = ov9650_write_register(RBIAS_REG_ADDRESS, RBIAS_REG_DEFAULT_VALUE);
RETURN_ON_FALSE(rc);
rc = ov9650_write_register(ADVFL_REG_ADDRESS, ADVFL_REG_DEFAULT_VALUE);
RETURN_ON_FALSE(rc);
rc = ov9650_write_register(ADVFH_REG_ADDRESS, ADVFH_REG_DEFAULT_VALUE);
RETURN_ON_FALSE(rc);
rc = ov9650_write_register(YAVE_REG_ADDRESS, YAVE_REG_DEFAULT
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -