MTK平台Camera驱动
基于MTK平台Camera驱动简介
软件开发部:John.Wang
Camera的硬件架构
ARM Image signal
CMOS Sensor
processor& resizer
Memory
Image encode
LCD
软件开发部:John.Wang
Camera模块硬件在手机上的基本
架构有三种
(一)Baseband控制LCD+Sensor.
Baseband控制LCD,在Camera模式下Backend IC控制
LCD进行各种操作。
Camera模块硬件在手机上的基本
架构有三种
(二)Baseband控制LCD+Backend IC,Backend IC控制Sensor。
Camera模块硬件在手机上的基本
架构有三种
(三)Baseband控制Backend IC,并且在非Camera模式下Baseband控制LCD,在Camera模式下Backend IC控制LCD进行各种操作。
Camera 接口信号sensor MTK camera
VCAMA, VCAMD
CMDAT0~7CMVREF
CMHREF
CMMCLK
CMPCLK
CMPDN
CMRST
SCLK
SDA
Camera 接口信号
signal description
CMVREF CMOS sensor vertical reference signal input CMHREF CMOS sensor horizontal reference signal input SCLK IIC interface clock signal
SDA IIC interface data signal
CMMCLK CMOS sensor master clock output CMPCLK CMOS sensor pixel clock intput
CMPDN CMOS sensor power down control CMRST CMOS sensor reset signal output
VCAMA Camera module analog power
VCAMD Camera module digital power
CMDAT0~7Camera data bus
IIC时序控制
Camera interface时序控制
Camera程序架构
软件开发部:John.Wang
Camera程序架构
MMI task
Camera APP:控制应用程序逻辑,Camera的状态机,
包括了preview,capture,exit等各种状态控制。
MDI:应用程序接口层,直接操作Camera feature
GDI:处理Multi-layer,实现OSD
Media task
调用Camera驱动程序的接口层
Camera Drive:控制Camera IC,Sensor以及LCD硬件
LCD interface
控制LCM
软件开发部:John.Wang
一:平台camera结构体定义:
1:抽象出的对于sensor 操作的功能函数接口:
typedef struct
{
kal_int8 (* sensor_init)(void);
void (* get_sensor_id)(kal_uint8 *sensor_write_id, kal_uint8 *sensor_read_id);
void (* get_sensor_size)(kal_uint16 *sensor_width, kal_uint16 *sensor_height);
void (* get_sensor_period) (kal_uint16 *pixel_number, kal_uint16 *line_number);
void (* sensor_preview_setting)(image_sensor_exposure_window_struct*image_window,
image_sensor_config_struct*sensor_config_data);
void (* sensor_capture_setting)(image_sensor_exposure_window_struct*image_window,
image_sensor_config_struct*sensor_config_data);
void (* write_sensor_reg)(kal_uint32 cmd, kal_uint32 para);
kal_uint32 (* read_sensor_reg)(kal_uint32 cmd);
void (* set_sensor_eshutter)(kal_uint16 eshutter);
void (* set_camera_night_mode) (kal_bool enable);
void (* sensor_power_off) (void);
kal_uint16 (* set_sensor_gain) (kal_uint16 gain);
void (* set_flashlight) (kal_bool enable);
MM_ERROR_CODE_ENUM (* sensor_feature_control) (IMAGE_SENSOR_FEATURE_ENUM feature_id, void* p_feature_para_input,void* p_feature_para_output, kal_uint16 feature_para_output_length); #if (defined(YUV_SENSOR_SUPPORT)||defined(__ATV_SUPPORT__))
kal_uint32 (* yuv_sensor_setting)(kal_uint32 cmd, kal_uint32 para);
#endif
} image_sensor_func_struct;
二:以sensorOV7670取例说明代码:
1:kal_int8 OV7670_init(void)
主要包括:
(1)上电:cis_module_power_on(KAL_TRUE);
(2)时序,数据格式,时钟设置:
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;
(3)配置SCCB:
OV7670_Config_HW_SCCB();
(4)复位sensor:
OV7670_write_cmos_sensor(0x12,0x80);
(5)读取sensor ID:
OV7670_sensor_id=(OV7670_read_cmos_sensor(0x0A)<<8)|OV7670_read_cmos_senso r(0x0B);
(6)初始化sensor:
OV7670_init_setting();
软件开发部:John.Wang
二:以sensorOV7670取例说明代码:
2:void OV7670_get_size(kal_uint16 *sensor_width, kal_uint16 *sensor_height)
{
*sensor_width=OV7670_IMAGE_SENSOR_VGA_WIDTH;
/* pixel numbers actually used in one frame */
*sensor_height=OV7670_IMAGE_SENSOR_VGA_HEIGHT;/* line numbers actually used in one frame */
}
给出sensor的pixel的数据
3:void OV7670_get_period(kal_uint16 *pixel_number, kal_uint16 *line_number)
{
*pixel_number=OV7670_VGA_PERIOD_PIXEL_NUMS;/* pixel numbers in one period of HSYNC */
*line_number=OV7670_VGA_PERIOD_LINE_NUMS;/* line numbers in one period of VSYNC */
}/* get_OV7670_period */
给出sensor的pixel的周期
软件开发部:John.Wang
二:以sensorOV7670取例说明代码:
4:void OV7670_preview(image_sensor_exposure_window_struct*image_window, image_sensor_config_struct*sensor_config_data)
主要包括: (1) set grab window:
image_window->grab_start_x= OV7670_IMAGE_SENSOR_VGA_INSERTED_PIXELS; image_window->grab_start_y= OV7670_IMAGE_SENSOR_VGA_INSERTED_LINES; image_window->exposure_window_width=OV7670_IMAGE_SENSOR_VGA_WIDTH -2; image_window->exposure_window_height= OV7670_IMAGE_SENSOR_VGA_HEIGHT; (2)Set frame_rate:
sensor_config_data->sensor_frame_rate= 300;
(3)Set image_mirror:
switch (sensor_config_data->image_mirror)
(4)Set image encode mode:
OV7670_MPEG4_encode_mode = KAL_TRUE;
(5) enable AE, AWB:
OV7670_ae_awb_enable(OV7670_CTRL_BY_SENSOR_DRV, KAL_TRUE);
软件开发部:John.Wang
二:以sensorOV7670取例说明代码:
5:void OV7670_capture(image_sensor_exposure_window_struct*image_window, image_sensor_config_struct*sensor_config_data)
(1)使能快门: shutter=sensor_config_data->capture_shutter;
(2)Set grab windoe and timing:
SET_TG_OUTPUT_CLK_DIVIDER(3);SET_CMOS_RISING_EDGE(0);
SET_CMOS_FALLING_EDGE(2);ENABLE_CAMERA_PIXEL_CLKIN_ENABLE;
SET_TG_PIXEL_CLK_DIVIDER(3);SET_CMOS_DATA_LATCH(2);
image_window->grab_start_x=OV7670_IMAGE_SENSOR_VGA_INSERTED_PIXELS; image_window->grab_start_y=OV7670_IMAGE_SENSOR_VGA_INSERTED_LINES; image_window->exposure_window_width=OV7670_IMAGE_SENSOR_VGA_WIDTH -2; image_window->exposure_window_height=OV7670_IMAGE_SENSOR_VGA_HEIGHT -7;
(3)写快门设置参数:void OV7670_write_shutter(kal_uint16 shutter)
包括:frame_rate,exposure_lines参数等。
软件开发部:John.Wang
二:以sensorOV7670取例说明代码:
6:通过SCCB读写操作sensor的两个函数:
(1)void OV7670_write_reg(kal_uint32 addr, kal_uint32 para)
(2)kal_uint32 OV7670_read_reg(kal_uint32 addr)
7:闪光灯控制函数:
void OV7670_set_flashlight(kal_bool enable)
8:设置sensor 的效果
kal_uint32 OV7670_yuv_sensor_setting(kal_uint32 cmd, kal_uint32 para)
包括:case CAM_PARAM_CONTRAST:ret= OV7670_set_param_contrast(para);break;
case CAM_PARAM_BRIGHTNESS:ret= OV7670_set_param_brightness(para);break;
case CAM_PARAM_HUE:ret= OV7670_set_param_hue(para);break;
case CAM_PARAM_GAMMA:ret= OV7670_set_param_gamma(para);break;
case CAM_PARAM_WB:ret= OV7670_set_param_wb(para);break;
case CAM_PARAM_EXPOSURE:ret= OV7670_set_param_exposure(para);break;
case CAM_PARAM_EFFECT:ret= OV7670_set_param_effect(para);break;
case CAM_PARAM_BANDING:ret= OV7670_set_param_banding(para);break;
case CAM_PARAM_SATURATION:ret= OV7670_set_param_saturation(para);break;
case CAM_PARAM_NIGHT_MODE:ret= OV7670_set_param_nightmode(para);break;
二:以sensorOV7670取例说明代码:
9:添加sensor 的image_sensor_func_struct的地方:
void OV7670_image_sensor_func_config(void)
{
image_sensor_func= &image_sensor_func_OV7670;
}/* cam_module_func_config() */
软件开发部:John.Wang