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

相关主题
相关文档
最新文档