⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 camsensor_ov9650.c

📁 OV9650 settings on Qualcomm
💻 C
📖 第 1 页 / 共 5 页
字号:
  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, &register_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 + -