📄 image_sensor.c
字号:
/*****************************************************************************
* Copyright Statement:
* --------------------
* This software is protected by Copyright and the information contained
* herein is confidential. The software may not be copied and the information
* contained herein may not be used or disclosed except with the written
* permission of MediaTek Inc. (C) 2005
*
* BY OPENING THIS FILE, BUYER HEREBY UNEQUIVOCALLY ACKNOWLEDGES AND AGREES
* THAT THE SOFTWARE/FIRMWARE AND ITS DOCUMENTATIONS ("MEDIATEK SOFTWARE")
* RECEIVED FROM MEDIATEK AND/OR ITS REPRESENTATIVES ARE PROVIDED TO BUYER ON
* AN "AS-IS" BASIS ONLY. MEDIATEK EXPRESSLY DISCLAIMS ANY AND ALL WARRANTIES,
* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED WARRANTIES OF
* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR NONINFRINGEMENT.
* NEITHER DOES MEDIATEK PROVIDE ANY WARRANTY WHATSOEVER WITH RESPECT TO THE
* SOFTWARE OF ANY THIRD PARTY WHICH MAY BE USED BY, INCORPORATED IN, OR
* SUPPLIED WITH THE MEDIATEK SOFTWARE, AND BUYER AGREES TO LOOK ONLY TO SUCH
* THIRD PARTY FOR ANY WARRANTY CLAIM RELATING THERETO. MEDIATEK SHALL ALSO
* NOT BE RESPONSIBLE FOR ANY MEDIATEK SOFTWARE RELEASES MADE TO BUYER'S
* SPECIFICATION OR TO CONFORM TO A PARTICULAR STANDARD OR OPEN FORUM.
*
* BUYER'S SOLE AND EXCLUSIVE REMEDY AND MEDIATEK'S ENTIRE AND CUMULATIVE
* LIABILITY WITH RESPECT TO THE MEDIATEK SOFTWARE RELEASED HEREUNDER WILL BE,
* AT MEDIATEK'S OPTION, TO REVISE OR REPLACE THE MEDIATEK SOFTWARE AT ISSUE,
* OR REFUND ANY SOFTWARE LICENSE FEES OR SERVICE CHARGE PAID BY BUYER TO
* MEDIATEK FOR SUCH MEDIATEK SOFTWARE AT ISSUE.
*
* THE TRANSACTION CONTEMPLATED HEREUNDER SHALL BE CONSTRUED IN ACCORDANCE
* WITH THE LAWS OF THE STATE OF CALIFORNIA, USA, EXCLUDING ITS CONFLICT OF
* LAWS PRINCIPLES. ANY DISPUTES, CONTROVERSIES OR CLAIMS ARISING THEREOF AND
* RELATED THERETO SHALL BE SETTLED BY ARBITRATION IN SAN FRANCISCO, CA, UNDER
* THE RULES OF THE INTERNATIONAL CHAMBER OF COMMERCE (ICC).
*
*****************************************************************************/
/*****************************************************************************
*
* Filename:
* ---------
* image_sensor.c
*
* Project:
* --------
* Maui_sw
*
* Description:
* ------------
* Image sensor driver function
*
* Author:
* -------
* -------
*
*============================================================================
* HISTORY
* Below this line, this part is controlled by PVCS VM. DO NOT MODIFY!!
*------------------------------------------------------------------------------
*
*------------------------------------------------------------------------------
* Upper this line, this part is controlled by PVCS VM. DO NOT MODIFY!!
*============================================================================
****************************************************************************/
#include "drv_comm.h"
#include "IntrCtrl.h"
#include "reg_base.h"
#include "gpio_sw.h"
#include "sccb.h"
#include "isp_if.h"
#include "ov2640.h"
#include "camera_para.h"
#include "upll_ctrl.h"
#include "med_api.h"
#include "Gpio_config_custom.h"
#if defined(SENSOR_ROTATE_0)
kal_uint8 g_CCT_FirstGrabColor=BAYER_R;
#else
kal_uint8 g_CCT_FirstGrabColor=BAYER_Gb;
#endif
kal_uint8 Camera_name=0xff;
kal_uint16 MAX_EXPOSURE_LINES = 0;
kal_uint8 MIN_EXPOSURE_LINES=2;
#if defined(__DOUBLE_CAMERA__)
extern kal_uint16 gCamSwitch;
#endif
kal_uint8 Sensor_Write_ID = 0x60;
kal_uint8 Sensor_Read_ID = 0x61;
kal_uint8 jpeg_capture_flag=0;
#ifndef HW_SCCB
void SCCB_send_byte(kal_uint8 send_byte)
{
volatile signed char i;
volatile kal_uint32 j;
for (i=7;i>=0;i--)
{ /* data bit 7~0 */
if (send_byte & (1<<i))
{
SET_SCCB_DATA_HIGH;
}
else
{
SET_SCCB_DATA_LOW;
}
for(j=0;j<SENSOR_I2C_DELAY_OV2640;j++);
SET_SCCB_CLK_HIGH;
for(j=0;j<SENSOR_I2C_DELAY_OV2640;j++);
SET_SCCB_CLK_LOW;
for(j=0;j<SENSOR_I2C_DELAY_OV2640;j++);
}
/* don't care bit, 9th bit */
SET_SCCB_DATA_LOW;
SET_SCCB_DATA_INPUT;
SET_SCCB_CLK_HIGH;
for(j=0;j<SENSOR_I2C_DELAY_OV2640;j++);
SET_SCCB_CLK_LOW;
SET_SCCB_DATA_OUTPUT;
}
kal_uint8 SCCB_get_byte(void)
{
volatile signed char i;
volatile kal_uint32 j;
kal_uint8 get_byte=0;
SET_SCCB_DATA_INPUT;
for (i=7;i>=0;i--)
{ /* data bit 7~0 */
SET_SCCB_CLK_HIGH;
for(j=0;j<SENSOR_I2C_DELAY_OV2640;j++);
if (GET_SCCB_DATA_BIT)
get_byte |= (1<<i);
for(j=0;j<SENSOR_I2C_DELAY_OV2640;j++);
SET_SCCB_CLK_LOW;
for(j=0;j<SENSOR_I2C_DELAY_OV2640;j++);
}
/* don't care bit, 9th bit */
SET_SCCB_DATA_OUTPUT;
SET_SCCB_DATA_HIGH;
for(j=0;j<SENSOR_I2C_DELAY_OV2640;j++);
SET_SCCB_CLK_HIGH;
for(j=0;j<SENSOR_I2C_DELAY_OV2640;j++);
SET_SCCB_CLK_LOW;
return get_byte;
}
#endif
void write_cmos_sensor(kal_uint32 addr, kal_uint32 para)
{
volatile kal_uint32 j;
#ifdef HW_SCCB
SET_SCCB_DATA_LENGTH(3);
ENABLE_SCCB;
REG_SCCB_DATA = Sensor_Write_ID | SCCB_DATA_REG_ID_ADDRESS;
REG_SCCB_DATA = addr;
REG_SCCB_DATA = para;
while (SCCB_IS_WRITTING) {};
#else
I2C_START_TRANSMISSION(SENSOR_I2C_DELAY_OV2640);
for(j=0;j<SENSOR_I2C_DELAY_OV2640;j++);
SCCB_send_byte(Sensor_Write_ID);
for(j=0;j<SENSOR_I2C_DELAY_OV2640;j++);
SCCB_send_byte(addr);
for(j=0;j<SENSOR_I2C_DELAY_OV2640;j++);
SCCB_send_byte(para);
for(j=0;j<SENSOR_I2C_DELAY_OV2640;j++);
I2C_STOP_TRANSMISSION(SENSOR_I2C_DELAY_OV2640);
#endif /* HW_SCCB */
} /* write_cmos_sensor() */
kal_uint32 read_cmos_sensor(kal_uint32 addr)
{
volatile kal_uint32 j;
kal_uint8 get_byte=0;
#ifdef HW_SCCB
SET_SCCB_DATA_LENGTH(2);
ENABLE_SCCB;
REG_SCCB_DATA = Sensor_Write_ID | SCCB_DATA_REG_ID_ADDRESS;
REG_SCCB_DATA = addr;
while (SCCB_IS_WRITTING) {};
ENABLE_SCCB;
REG_SCCB_DATA = Sensor_Read_ID | SCCB_DATA_REG_ID_ADDRESS;
REG_SCCB_DATA=0;
while (SCCB_IS_READING) {};
get_byte = REG_SCCB_READ_DATA & 0xFF;
#else
I2C_START_TRANSMISSION(SENSOR_I2C_DELAY_OV2640);
for(j=0;j<SENSOR_I2C_DELAY_OV2640;j++);
SCCB_send_byte(Sensor_Write_ID);
for(j=0;j<SENSOR_I2C_DELAY_OV2640;j++);
SCCB_send_byte(addr);
for(j=0;j<SENSOR_I2C_DELAY_OV2640;j++);
I2C_STOP_TRANSMISSION(SENSOR_I2C_DELAY_OV2640);
for(j=0;j<SENSOR_I2C_DELAY_OV2640;j++);
I2C_START_TRANSMISSION(SENSOR_I2C_DELAY_OV2640);
for(j=0;j<SENSOR_I2C_DELAY_OV2640;j++);
SCCB_send_byte(Sensor_Read_ID);
for(j=0;j<SENSOR_I2C_DELAY_OV2640;j++);
get_byte=SCCB_get_byte();
for(j=0;j<SENSOR_I2C_DELAY_OV2640;j++);
I2C_STOP_TRANSMISSION(SENSOR_I2C_DELAY_OV2640);
#endif
return get_byte;
}
kal_uint8 ReadCmos_SensorId()
{
kal_uint16 i;
kal_uint16 sensor_id;
cis_module_power_on(KAL_TRUE); // Power On CIS Power
kal_sleep_task(2); // To wait for Stable Power
#if defined(__DOUBLE_CAMERA__)
if(gCamSwitch == 0)//use cam1
{
GPIO_WriteIO(1, GPIO_DBCMA_PWDN_1); //power down cam2 /*lisong modified 070518*/
kal_sleep_task(1); // To wait for Stable Power
GPIO_WriteIO(0, GPIO_DBCMA_PWDN_2); //power up cam1
kal_sleep_task(1); // To wait for Stable Power
}
else if(gCamSwitch == 1)
{
GPIO_WriteIO(0, GPIO_DBCMA_PWDN_1); //power down cam1 /*lisong modified 070518*/
kal_sleep_task(1); // To wait for Stable Power
GPIO_WriteIO(1, GPIO_DBCMA_PWDN_2); //power up cam2
kal_sleep_task(1); // To wait for Stable Power
}
#endif
RESET_CMOS_SENSOR_MODE2; // High - reset, Low - normal.
SET_CMOS_CLOCK_POLARITY_LOW;
SET_VSYNC_POLARITY_LOW;
SET_HSYNC_POLARITY_LOW;
ENABLE_CAMERA_INDATA_FORMAT;
SET_CAMERA_INPUT_TYPE(INPUT_YUV422);
ENABLE_CAMERA_TG_CLK_48M;
UPLL_Enable(UPLL_OWNER_ISP);
set_isp_driving_current(camera_para.SENSOR.reg[CMMCLK_CURRENT_INDEX_OV2640].para);
// Reset Sensor
write_cmos_sensor(0x12,0x80);
kal_sleep_task(2);
sensor_id=(read_cmos_sensor(0x0A)<<8)|read_cmos_sensor(0x0B);
// dump_printf("\r\nsensor_id=0x%x\r\n",sensor_id);
if(sensor_id == OV2640_SENSOR_ID)
{
Camera_name = SENSOR_OV2640;
return 1;
}
else
{
return 0;
}
}
void image_sensor_func_config(void)
{
ReadCmos_SensorId();
if(Camera_name == SENSOR_OV2640)
{
image_sensor_func_config_OV2640();
}
}
void camera_para_to_sensor(void)
{
if(Camera_name == SENSOR_OV2640)
camera_para_to_sensor_OV2640();
}
void sensor_to_camera_para(void)
{
if(Camera_name == SENSOR_OV2640)
sensor_to_camera_para_OV2640();
}
void get_sensor_group_count(kal_int32* sensor_count_ptr)
{
if(Camera_name == SENSOR_OV2640)
get_sensor_group_count_OV2640(sensor_count_ptr);
}
void get_sensor_group_info(kal_uint16 group_idx, kal_int8* group_name_ptr, kal_int32* item_count_ptr)
{
if(Camera_name == SENSOR_OV2640)
get_sensor_group_info_OV2640(group_idx, group_name_ptr, item_count_ptr);
}
void get_sensor_item_info(kal_uint16 group_idx,kal_uint16 item_idx, ENG_sensor_info* info_ptr)
{
if(Camera_name == SENSOR_OV2640)
get_sensor_item_info_OV2640(group_idx, item_idx, info_ptr);
}
kal_bool set_sensor_item_info(kal_uint16 group_idx, kal_uint16 item_idx, kal_int32 item_value)
{
kal_bool bFlag;
if(Camera_name == SENSOR_OV2640)
bFlag = set_sensor_item_info_OV2640(group_idx, item_idx, item_value);
return bFlag;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -