From 83c22a8e6549c349d1c0ee6ae85eafeb6c93283a Mon Sep 17 00:00:00 2001 From: root Date: Thu, 12 Apr 2012 17:07:14 +0800 Subject: [PATCH] camera rk30 : fix erro array define of fps , optimize the define of sensor init data. --- arch/arm/mach-rk30/board-rk30-sdk.c | 185 +++++++++++++++++---- arch/arm/plat-rk/include/plat/rk_camera.h | 1 + arch/arm/plat-rk/rk_camera.c | 47 +++--- drivers/media/video/ov2655.c | 74 +++++---- drivers/media/video/ov2659.c | 73 ++++---- drivers/media/video/ov5642.c | 89 +++++----- drivers/media/video/rk30_camera_oneframe.c | 9 +- 7 files changed, 324 insertions(+), 154 deletions(-) mode change 100644 => 100755 drivers/media/video/ov2659.c mode change 100644 => 100755 drivers/media/video/ov5642.c diff --git a/arch/arm/mach-rk30/board-rk30-sdk.c b/arch/arm/mach-rk30/board-rk30-sdk.c index 56046b13ad29..b976131e96aa 100755 --- a/arch/arm/mach-rk30/board-rk30-sdk.c +++ b/arch/arm/mach-rk30/board-rk30-sdk.c @@ -282,57 +282,186 @@ static struct reginfo_t rk_init_data_sensor_winseqreg_1[] = {0x0000, 0x00,0,0} }; #endif +#if CONFIG_SENSOR_IIC_ADDR_01 +static struct reginfo_t rk_init_data_sensor_reg_01[] = +{ + {0x0000, 0x00,0,0} +}; +static struct reginfo_t rk_init_data_sensor_winseqreg_01[] = +{ + {0x0000, 0x00,0,0} +}; +#endif +#if CONFIG_SENSOR_IIC_ADDR_02 +static struct reginfo_t rk_init_data_sensor_reg_02[] = +{ + {0x0000, 0x00,0,0} +}; +static struct reginfo_t rk_init_data_sensor_winseqreg_02[] = +{ + {0x0000, 0x00,0,0} +}; +#endif +#if CONFIG_SENSOR_IIC_ADDR_11 +static struct reginfo_t rk_init_data_sensor_reg_11[] = +{ + {0x0000, 0x00,0,0} +}; +static struct reginfo_t rk_init_data_sensor_winseqreg_11[] = +{ + {0x0000, 0x00,0,0} +}; +#endif +#if CONFIG_SENSOR_IIC_ADDR_12 +static struct reginfo_t rk_init_data_sensor_reg_12[] = +{ + {0x0000, 0x00,0,0} +}; +static struct reginfo_t rk_init_data_sensor_winseqreg_12[] = +{ + {0x0000, 0x00,0,0} +}; +#endif static rk_sensor_user_init_data_s rk_init_data_sensor[RK_CAM_NUM] = { + #if CONFIG_SENSOR_IIC_ADDR_0 { .rk_sensor_init_width = INVALID_VALUE, .rk_sensor_init_height = INVALID_VALUE, .rk_sensor_init_bus_param = INVALID_VALUE, .rk_sensor_init_pixelcode = INVALID_VALUE, - .rk_sensor_init_data = NULL,//rk_init_data_sensor_reg_0, - .rk_sensor_init_winseq = NULL,//rk_init_data_sensor_winseqreg_0, - .rk_sensor_winseq_size = 0,//sizeof(rk_init_data_sensor_winseqreg_0) / sizeof(struct reginfo_t), - },{ - .rk_sensor_init_width = INVALID_VALUE, + .rk_sensor_init_data = rk_init_data_sensor_reg_0, + .rk_sensor_init_winseq = rk_init_data_sensor_winseqreg_0, + .rk_sensor_winseq_size = sizeof(rk_init_data_sensor_winseqreg_0) / sizeof(struct reginfo_t), + .rk_sensor_init_data_size = sizeof(rk_init_data_sensor_reg_0) / sizeof(struct reginfo_t), + }, + #else + { + .rk_sensor_init_width = INVALID_VALUE, .rk_sensor_init_height = INVALID_VALUE, .rk_sensor_init_bus_param = INVALID_VALUE, .rk_sensor_init_pixelcode = INVALID_VALUE, - .rk_sensor_init_data = NULL,//rk_init_data_sensor_reg_1, - .rk_sensor_init_winseq = NULL,//rk_init_data_sensor_winseqreg_1, - .rk_sensor_winseq_size = 0,//sizeof(rk_init_data_sensor_winseqreg_1) / sizeof(struct reginfo_t), - },{ - .rk_sensor_init_width = INVALID_VALUE, + .rk_sensor_init_data = NULL, + .rk_sensor_init_winseq = NULL, + .rk_sensor_winseq_size = 0, + .rk_sensor_init_data_size = 0, + }, + #endif + #if CONFIG_SENSOR_IIC_ADDR_1 + { + .rk_sensor_init_width = INVALID_VALUE, .rk_sensor_init_height = INVALID_VALUE, .rk_sensor_init_bus_param = INVALID_VALUE, .rk_sensor_init_pixelcode = INVALID_VALUE, - .rk_sensor_init_data = NULL,//rk_init_data_sensor_reg_1, - .rk_sensor_init_winseq = NULL,//rk_init_data_sensor_winseqreg_1, - .rk_sensor_winseq_size = 0,//sizeof(rk_init_data_sensor_winseqreg_1) / sizeof(struct reginfo_t), - },{ - .rk_sensor_init_width = INVALID_VALUE, + .rk_sensor_init_data = rk_init_data_sensor_reg_1, + .rk_sensor_init_winseq = rk_init_data_sensor_winseqreg_1, + .rk_sensor_winseq_size = sizeof(rk_init_data_sensor_winseqreg_1) / sizeof(struct reginfo_t), + .rk_sensor_init_data_size = sizeof(rk_init_data_sensor_reg_1) / sizeof(struct reginfo_t), + }, + #else + { + .rk_sensor_init_width = INVALID_VALUE, .rk_sensor_init_height = INVALID_VALUE, .rk_sensor_init_bus_param = INVALID_VALUE, .rk_sensor_init_pixelcode = INVALID_VALUE, - .rk_sensor_init_data = NULL,//rk_init_data_sensor_reg_1, - .rk_sensor_init_winseq = NULL,//rk_init_data_sensor_winseqreg_1, - .rk_sensor_winseq_size = 0,//sizeof(rk_init_data_sensor_winseqreg_1) / sizeof(struct reginfo_t), - },{ - .rk_sensor_init_width = INVALID_VALUE, + .rk_sensor_init_data = NULL, + .rk_sensor_init_winseq = NULL, + .rk_sensor_winseq_size = 0, + .rk_sensor_init_data_size = 0, + }, + #endif + #if CONFIG_SENSOR_IIC_ADDR_01 + { + .rk_sensor_init_width = INVALID_VALUE, .rk_sensor_init_height = INVALID_VALUE, .rk_sensor_init_bus_param = INVALID_VALUE, .rk_sensor_init_pixelcode = INVALID_VALUE, - .rk_sensor_init_data = NULL,//rk_init_data_sensor_reg_1, - .rk_sensor_init_winseq = NULL,//rk_init_data_sensor_winseqreg_1, - .rk_sensor_winseq_size = 0,//sizeof(rk_init_data_sensor_winseqreg_1) / sizeof(struct reginfo_t), - },{ - .rk_sensor_init_width = INVALID_VALUE, + .rk_sensor_init_data = rk_init_data_sensor_reg_01, + .rk_sensor_init_winseq = rk_init_data_sensor_winseqreg_01, + .rk_sensor_winseq_size = sizeof(rk_init_data_sensor_winseqreg_01) / sizeof(struct reginfo_t), + .rk_sensor_init_data_size = sizeof(rk_init_data_sensor_reg_01) / sizeof(struct reginfo_t), + }, + #else + { + .rk_sensor_init_width = INVALID_VALUE, + .rk_sensor_init_height = INVALID_VALUE, + .rk_sensor_init_bus_param = INVALID_VALUE, + .rk_sensor_init_pixelcode = INVALID_VALUE, + .rk_sensor_init_data = NULL, + .rk_sensor_init_winseq = NULL, + .rk_sensor_winseq_size = 0, + .rk_sensor_init_data_size = 0, + }, + #endif + #if CONFIG_SENSOR_IIC_ADDR_02 + { + .rk_sensor_init_width = INVALID_VALUE, + .rk_sensor_init_height = INVALID_VALUE, + .rk_sensor_init_bus_param = INVALID_VALUE, + .rk_sensor_init_pixelcode = INVALID_VALUE, + .rk_sensor_init_data = rk_init_data_sensor_reg_02, + .rk_sensor_init_winseq = rk_init_data_sensor_winseqreg_02, + .rk_sensor_winseq_size = sizeof(rk_init_data_sensor_winseqreg_02) / sizeof(struct reginfo_t), + .rk_sensor_init_data_size = sizeof(rk_init_data_sensor_reg_02) / sizeof(struct reginfo_t), + }, + #else + { + .rk_sensor_init_width = INVALID_VALUE, + .rk_sensor_init_height = INVALID_VALUE, + .rk_sensor_init_bus_param = INVALID_VALUE, + .rk_sensor_init_pixelcode = INVALID_VALUE, + .rk_sensor_init_data = NULL, + .rk_sensor_init_winseq = NULL, + .rk_sensor_winseq_size = 0, + .rk_sensor_init_data_size = 0, + }, + #endif + #if CONFIG_SENSOR_IIC_ADDR_11 + { + .rk_sensor_init_width = INVALID_VALUE, + .rk_sensor_init_height = INVALID_VALUE, + .rk_sensor_init_bus_param = INVALID_VALUE, + .rk_sensor_init_pixelcode = INVALID_VALUE, + .rk_sensor_init_data = rk_init_data_sensor_reg_11, + .rk_sensor_init_winseq = rk_init_data_sensor_winseqreg_11, + .rk_sensor_winseq_size = sizeof(rk_init_data_sensor_winseqreg_11) / sizeof(struct reginfo_t), + .rk_sensor_init_data_size = sizeof(rk_init_data_sensor_reg_11) / sizeof(struct reginfo_t), + }, + #else + { + .rk_sensor_init_width = INVALID_VALUE, + .rk_sensor_init_height = INVALID_VALUE, + .rk_sensor_init_bus_param = INVALID_VALUE, + .rk_sensor_init_pixelcode = INVALID_VALUE, + .rk_sensor_init_data = NULL, + .rk_sensor_init_winseq = NULL, + .rk_sensor_winseq_size = 0, + .rk_sensor_init_data_size = 0, + }, + #endif + #if CONFIG_SENSOR_IIC_ADDR_12 + { + .rk_sensor_init_width = INVALID_VALUE, + .rk_sensor_init_height = INVALID_VALUE, + .rk_sensor_init_bus_param = INVALID_VALUE, + .rk_sensor_init_pixelcode = INVALID_VALUE, + .rk_sensor_init_data = rk_init_data_sensor_reg_12, + .rk_sensor_init_winseq = rk_init_data_sensor_winseqreg_12, + .rk_sensor_winseq_size = sizeof(rk_init_data_sensor_winseqreg_12) / sizeof(struct reginfo_t), + .rk_sensor_init_data_size = sizeof(rk_init_data_sensor_reg_12) / sizeof(struct reginfo_t), + }, + #else + { + .rk_sensor_init_width = INVALID_VALUE, .rk_sensor_init_height = INVALID_VALUE, .rk_sensor_init_bus_param = INVALID_VALUE, .rk_sensor_init_pixelcode = INVALID_VALUE, - .rk_sensor_init_data = NULL,//rk_init_data_sensor_reg_1, - .rk_sensor_init_winseq = NULL,//rk_init_data_sensor_winseqreg_1, - .rk_sensor_winseq_size = 0,//sizeof(rk_init_data_sensor_winseqreg_1) / sizeof(struct reginfo_t), + .rk_sensor_init_data = NULL, + .rk_sensor_init_winseq = NULL, + .rk_sensor_winseq_size = 0, + .rk_sensor_init_data_size = 0, }, + #endif }; #include "../../../drivers/media/video/rk30_camera.c" diff --git a/arch/arm/plat-rk/include/plat/rk_camera.h b/arch/arm/plat-rk/include/plat/rk_camera.h index 8f8786e32b69..5ccc739179c3 100755 --- a/arch/arm/plat-rk/include/plat/rk_camera.h +++ b/arch/arm/plat-rk/include/plat/rk_camera.h @@ -199,6 +199,7 @@ typedef struct rk_sensor_user_init_data{ struct reginfo_t * rk_sensor_init_data; int rk_sensor_winseq_size; struct reginfo_t * rk_sensor_init_winseq; + int rk_sensor_init_data_size; }rk_sensor_user_init_data_s; typedef struct rk_camera_device_register_info { diff --git a/arch/arm/plat-rk/rk_camera.c b/arch/arm/plat-rk/rk_camera.c index 8bcd22c182c3..8fd46a810e09 100755 --- a/arch/arm/plat-rk/rk_camera.c +++ b/arch/arm/plat-rk/rk_camera.c @@ -824,8 +824,30 @@ static void rk29_sensor_fps_get(int idx, unsigned int *val, int w, int h) } break; } - #ifdef CONFIG_SENSOR_01 case 1: + { + if ((w==176) && (h==144)) { + *val = CONFIG_SENSOR_QCIF_FPS_FIXED_1; + #ifdef CONFIG_SENSOR_240X160_FPS_FIXED_1 + } else if ((w==240) && (h==160)) { + *val = CONFIG_SENSOR_240X160_FPS_FIXED_1; + #endif + } else if ((w==320) && (h==240)) { + *val = CONFIG_SENSOR_QVGA_FPS_FIXED_1; + } else if ((w==352) && (h==288)) { + *val = CONFIG_SENSOR_CIF_FPS_FIXED_1; + } else if ((w==640) && (h==480)) { + *val = CONFIG_SENSOR_VGA_FPS_FIXED_1; + } else if ((w==720) && (h==480)) { + *val = CONFIG_SENSOR_480P_FPS_FIXED_1; + } else if ((w==1280) && (h==720)) { + *val = CONFIG_SENSOR_720P_FPS_FIXED_1; + } + break; + } + + #ifdef CONFIG_SENSOR_01 + case 2: { if ((w==176) && (h==144)) { *val = CONFIG_SENSOR_QCIF_FPS_FIXED_01; @@ -848,7 +870,7 @@ static void rk29_sensor_fps_get(int idx, unsigned int *val, int w, int h) } #endif #ifdef CONFIG_SENSOR_02 - case 2: + case 3: { if ((w==176) && (h==144)) { *val = CONFIG_SENSOR_QCIF_FPS_FIXED_02; @@ -871,27 +893,6 @@ static void rk29_sensor_fps_get(int idx, unsigned int *val, int w, int h) } #endif - case 3: - { - if ((w==176) && (h==144)) { - *val = CONFIG_SENSOR_QCIF_FPS_FIXED_1; - #ifdef CONFIG_SENSOR_240X160_FPS_FIXED_1 - } else if ((w==240) && (h==160)) { - *val = CONFIG_SENSOR_240X160_FPS_FIXED_1; - #endif - } else if ((w==320) && (h==240)) { - *val = CONFIG_SENSOR_QVGA_FPS_FIXED_1; - } else if ((w==352) && (h==288)) { - *val = CONFIG_SENSOR_CIF_FPS_FIXED_1; - } else if ((w==640) && (h==480)) { - *val = CONFIG_SENSOR_VGA_FPS_FIXED_1; - } else if ((w==720) && (h==480)) { - *val = CONFIG_SENSOR_480P_FPS_FIXED_1; - } else if ((w==1280) && (h==720)) { - *val = CONFIG_SENSOR_720P_FPS_FIXED_1; - } - break; - } #ifdef CONFIG_SENSOR_11 case 4: { diff --git a/drivers/media/video/ov2655.c b/drivers/media/video/ov2655.c index fbdce216337e..cb059264591d 100755 --- a/drivers/media/video/ov2655.c +++ b/drivers/media/video/ov2655.c @@ -1699,7 +1699,7 @@ static enum v4l2_mbus_pixelcode sensor_init_pixelcode = V4L2_MBUS_FMT_YUYV8_2X8; static struct reginfo* sensor_init_data_p = sensor_init_data; static struct reginfo* sensor_init_winseq_p = sensor_vga; static struct reginfo* sensor_init_winseq_board = NULL; - +static struct reginfo* sensor_init_data_board = NULL; static int sensor_init(struct v4l2_subdev *sd, u32 val) { struct i2c_client *client = v4l2_get_subdevdata(sd); @@ -1728,41 +1728,53 @@ static int sensor_init(struct v4l2_subdev *sd, u32 val) if(tmp_plat_data &&(i < RK_CAM_NUM) && tmp_plat_data->sensor_init_data[i]){ //user has defined the init data //init reg - if(tmp_plat_data->sensor_init_data[i]->rk_sensor_init_data && (sizeof(struct reginfo) != sizeof(struct reginfo_t))){ - for(j = 0;j< sizeof(sensor_init_data)/sizeof(struct reginfo);j++) { - sensor_init_data[j].reg = tmp_plat_data->sensor_init_data[i]->rk_sensor_init_data[j].reg; - sensor_init_data[j].val = tmp_plat_data->sensor_init_data[i]->rk_sensor_init_data[j].val; - } - sensor_init_data_p = sensor_init_data; - } else if(tmp_plat_data->sensor_init_data[i]->rk_sensor_init_data) { - sensor_init_data_p = (struct reginfo*)(tmp_plat_data->sensor_init_data[i]->rk_sensor_init_data); - } + int tmp_init_data_size = tmp_plat_data->sensor_init_data[i]->rk_sensor_init_data_size; + if(tmp_init_data_size > 2){//init data is valid + if((sizeof(struct reginfo) != sizeof(struct reginfo_t))){ + if(sensor_init_data_board) { + vfree(sensor_init_data_board); + sensor_init_data_board = NULL; + } + sensor_init_data_board = (struct reginfo*)vmalloc(tmp_init_data_size); + if(!sensor_init_data_board) + SENSOR_TR("%s :vmalloc init data erro !",__FUNCTION__); + for(j = 0;j< tmp_init_data_size;j++) { + sensor_init_data_board[j].reg = tmp_plat_data->sensor_init_data[i]->rk_sensor_init_data[j].reg; + sensor_init_data_board[j].val = tmp_plat_data->sensor_init_data[i]->rk_sensor_init_data[j].val; + } + sensor_init_data_p = sensor_init_data_board; + } else{ + sensor_init_data_p = (struct reginfo*)(tmp_plat_data->sensor_init_data[i]->rk_sensor_init_data); + } + } //init winseq - if(tmp_plat_data->sensor_init_data[i]->rk_sensor_init_winseq && (sizeof(struct reginfo) != sizeof(struct reginfo_t))){ - int tmp_winseq_size = tmp_plat_data->sensor_init_data[i]->rk_sensor_winseq_size; - if(sensor_init_winseq_board) { - vfree(sensor_init_winseq_board); - sensor_init_winseq_board = NULL; - } - sensor_init_winseq_board = (struct reginfo*)vmalloc(tmp_winseq_size); - if(!sensor_init_winseq_board) - SENSOR_TR("%s :vmalloc erro !",__FUNCTION__); - for(j = 0;j< tmp_winseq_size;j++){ - sensor_init_winseq_board[j].reg = tmp_plat_data->sensor_init_data[i]->rk_sensor_init_winseq[j].reg; - sensor_init_winseq_board[j].val = tmp_plat_data->sensor_init_data[i]->rk_sensor_init_winseq[j].val; - } - sensor_init_winseq_p = sensor_init_winseq_board; - } else if(tmp_plat_data->sensor_init_data[i]->rk_sensor_init_winseq){ - sensor_init_winseq_p = (struct reginfo*)(tmp_plat_data->sensor_init_data[i]->rk_sensor_init_winseq); - } + int tmp_winseq_size = tmp_plat_data->sensor_init_data[i]->rk_sensor_winseq_size; + if(tmp_winseq_size > 2){ + if(sizeof(struct reginfo) != sizeof(struct reginfo_t)){ + if(sensor_init_winseq_board) { + vfree(sensor_init_winseq_board); + sensor_init_winseq_board = NULL; + } + sensor_init_winseq_board = (struct reginfo*)vmalloc(tmp_winseq_size); + if(!sensor_init_winseq_board) + SENSOR_TR("%s :vmalloc erro !",__FUNCTION__); + for(j = 0;j< tmp_winseq_size;j++){ + sensor_init_winseq_board[j].reg = tmp_plat_data->sensor_init_data[i]->rk_sensor_init_winseq[j].reg; + sensor_init_winseq_board[j].val = tmp_plat_data->sensor_init_data[i]->rk_sensor_init_winseq[j].val; + } + sensor_init_winseq_p = sensor_init_winseq_board; + } else{ + sensor_init_winseq_p = (struct reginfo*)(tmp_plat_data->sensor_init_data[i]->rk_sensor_init_winseq); + } + } //init width,height,bus,pixelcode - if(tmp_plat_data->sensor_init_data[i] && tmp_plat_data->sensor_init_data[i]->rk_sensor_init_width != INVALID_VALUE) + if(tmp_plat_data->sensor_init_data[i]->rk_sensor_init_width != INVALID_VALUE) sensor_init_width = tmp_plat_data->sensor_init_data[i]->rk_sensor_init_width; - if(tmp_plat_data->sensor_init_data[i] && tmp_plat_data->sensor_init_data[i]->rk_sensor_init_height != INVALID_VALUE) + if(tmp_plat_data->sensor_init_data[i]->rk_sensor_init_height != INVALID_VALUE) sensor_init_height = tmp_plat_data->sensor_init_data[i]->rk_sensor_init_height; - if(tmp_plat_data->sensor_init_data[i] && tmp_plat_data->sensor_init_data[i]->rk_sensor_init_bus_param != INVALID_VALUE) + if(tmp_plat_data->sensor_init_data[i]->rk_sensor_init_bus_param != INVALID_VALUE) sensor_init_busparam = tmp_plat_data->sensor_init_data[i]->rk_sensor_init_bus_param; - if(tmp_plat_data->sensor_init_data[i] && tmp_plat_data->sensor_init_data[i]->rk_sensor_init_pixelcode != INVALID_VALUE) + if(tmp_plat_data->sensor_init_data[i]->rk_sensor_init_pixelcode != INVALID_VALUE) sensor_init_pixelcode = tmp_plat_data->sensor_init_data[i]->rk_sensor_init_pixelcode; } SENSOR_DG("\n%s..%s.. \n",SENSOR_NAME_STRING(),__FUNCTION__); diff --git a/drivers/media/video/ov2659.c b/drivers/media/video/ov2659.c old mode 100644 new mode 100755 index d40b1c0b73bd..29dcb243d6ea --- a/drivers/media/video/ov2659.c +++ b/drivers/media/video/ov2659.c @@ -1505,6 +1505,7 @@ static enum v4l2_mbus_pixelcode sensor_init_pixelcode = V4L2_MBUS_FMT_YUYV8_2X8; static struct reginfo* sensor_init_data_p = sensor_init_data; static struct reginfo* sensor_init_winseq_p = sensor_svga; static struct reginfo* sensor_init_winseq_board = NULL; +static struct reginfo* sensor_init_data_board = NULL; static int sensor_init(struct v4l2_subdev *sd, u32 val) { struct i2c_client *client = v4l2_get_subdevdata(sd); @@ -1534,41 +1535,53 @@ static int sensor_init(struct v4l2_subdev *sd, u32 val) if(tmp_plat_data &&(i < RK_CAM_NUM) && tmp_plat_data->sensor_init_data[i]){ //user has defined the init data //init reg - if(tmp_plat_data->sensor_init_data[i]->rk_sensor_init_data && (sizeof(struct reginfo) != sizeof(struct reginfo_t))){ - for(j = 0;j< sizeof(sensor_init_data)/sizeof(struct reginfo);j++) { - sensor_init_data[j].reg = tmp_plat_data->sensor_init_data[i]->rk_sensor_init_data[j].reg; - sensor_init_data[j].val = tmp_plat_data->sensor_init_data[i]->rk_sensor_init_data[j].val; - } - sensor_init_data_p = sensor_init_data; - } else if(tmp_plat_data->sensor_init_data[i]->rk_sensor_init_data) { - sensor_init_data_p = (struct reginfo*)(tmp_plat_data->sensor_init_data[i]->rk_sensor_init_data); - } + int tmp_init_data_size = tmp_plat_data->sensor_init_data[i]->rk_sensor_init_data_size; + if(tmp_init_data_size > 2){//init data is valid + if((sizeof(struct reginfo) != sizeof(struct reginfo_t))){ + if(sensor_init_data_board) { + vfree(sensor_init_data_board); + sensor_init_data_board = NULL; + } + sensor_init_data_board = (struct reginfo*)vmalloc(tmp_init_data_size); + if(!sensor_init_data_board) + SENSOR_TR("%s :vmalloc init data erro !",__FUNCTION__); + for(j = 0;j< tmp_init_data_size;j++) { + sensor_init_data_board[j].reg = tmp_plat_data->sensor_init_data[i]->rk_sensor_init_data[j].reg; + sensor_init_data_board[j].val = tmp_plat_data->sensor_init_data[i]->rk_sensor_init_data[j].val; + } + sensor_init_data_p = sensor_init_data_board; + } else{ + sensor_init_data_p = (struct reginfo*)(tmp_plat_data->sensor_init_data[i]->rk_sensor_init_data); + } + } //init winseq - if(tmp_plat_data->sensor_init_data[i]->rk_sensor_init_winseq && (sizeof(struct reginfo) != sizeof(struct reginfo_t))){ - int tmp_winseq_size = tmp_plat_data->sensor_init_data[i]->rk_sensor_winseq_size; - if(sensor_init_winseq_board) { - vfree(sensor_init_winseq_board); - sensor_init_winseq_board = NULL; - } - sensor_init_winseq_board = (struct reginfo*)vmalloc(tmp_winseq_size); - if(!sensor_init_winseq_board) - SENSOR_TR("%s :vmalloc erro !",__FUNCTION__); - for(j = 0;j< tmp_winseq_size;j++){ - sensor_init_winseq_board[j].reg = tmp_plat_data->sensor_init_data[i]->rk_sensor_init_winseq[j].reg; - sensor_init_winseq_board[j].val = tmp_plat_data->sensor_init_data[i]->rk_sensor_init_winseq[j].val; - } - sensor_init_winseq_p = sensor_init_winseq_board; - } else if(tmp_plat_data->sensor_init_data[i]->rk_sensor_init_winseq){ - sensor_init_winseq_p = (struct reginfo*)(tmp_plat_data->sensor_init_data[i]->rk_sensor_init_winseq); - } + int tmp_winseq_size = tmp_plat_data->sensor_init_data[i]->rk_sensor_winseq_size; + if(tmp_winseq_size > 2){ + if(sizeof(struct reginfo) != sizeof(struct reginfo_t)){ + if(sensor_init_winseq_board) { + vfree(sensor_init_winseq_board); + sensor_init_winseq_board = NULL; + } + sensor_init_winseq_board = (struct reginfo*)vmalloc(tmp_winseq_size); + if(!sensor_init_winseq_board) + SENSOR_TR("%s :vmalloc erro !",__FUNCTION__); + for(j = 0;j< tmp_winseq_size;j++){ + sensor_init_winseq_board[j].reg = tmp_plat_data->sensor_init_data[i]->rk_sensor_init_winseq[j].reg; + sensor_init_winseq_board[j].val = tmp_plat_data->sensor_init_data[i]->rk_sensor_init_winseq[j].val; + } + sensor_init_winseq_p = sensor_init_winseq_board; + } else{ + sensor_init_winseq_p = (struct reginfo*)(tmp_plat_data->sensor_init_data[i]->rk_sensor_init_winseq); + } + } //init width,height,bus,pixelcode - if(tmp_plat_data->sensor_init_data[i] && tmp_plat_data->sensor_init_data[i]->rk_sensor_init_width != INVALID_VALUE) + if(tmp_plat_data->sensor_init_data[i]->rk_sensor_init_width != INVALID_VALUE) sensor_init_width = tmp_plat_data->sensor_init_data[i]->rk_sensor_init_width; - if(tmp_plat_data->sensor_init_data[i] && tmp_plat_data->sensor_init_data[i]->rk_sensor_init_height != INVALID_VALUE) + if(tmp_plat_data->sensor_init_data[i]->rk_sensor_init_height != INVALID_VALUE) sensor_init_height = tmp_plat_data->sensor_init_data[i]->rk_sensor_init_height; - if(tmp_plat_data->sensor_init_data[i] && tmp_plat_data->sensor_init_data[i]->rk_sensor_init_bus_param != INVALID_VALUE) + if(tmp_plat_data->sensor_init_data[i]->rk_sensor_init_bus_param != INVALID_VALUE) sensor_init_busparam = tmp_plat_data->sensor_init_data[i]->rk_sensor_init_bus_param; - if(tmp_plat_data->sensor_init_data[i] && tmp_plat_data->sensor_init_data[i]->rk_sensor_init_pixelcode != INVALID_VALUE) + if(tmp_plat_data->sensor_init_data[i]->rk_sensor_init_pixelcode != INVALID_VALUE) sensor_init_pixelcode = tmp_plat_data->sensor_init_data[i]->rk_sensor_init_pixelcode; } SENSOR_DG("\n%s..%s.. \n",SENSOR_NAME_STRING(),__FUNCTION__); diff --git a/drivers/media/video/ov5642.c b/drivers/media/video/ov5642.c old mode 100644 new mode 100755 index db0ac11875bd..35d0f6e1cb28 --- a/drivers/media/video/ov5642.c +++ b/drivers/media/video/ov5642.c @@ -4254,6 +4254,7 @@ static enum v4l2_mbus_pixelcode sensor_init_pixelcode = V4L2_MBUS_FMT_YUYV8_2X8; static struct reginfo* sensor_init_data_p = NULL; static struct reginfo* sensor_init_winseq_p = NULL; static struct reginfo* sensor_init_winseq_board = NULL; +static struct reginfo* sensor_init_data_board = NULL; static int sensor_init(struct v4l2_subdev *sd, u32 val) { struct i2c_client *client = v4l2_get_subdevdata(sd); @@ -4277,45 +4278,57 @@ static int sensor_init(struct v4l2_subdev *sd, u32 val) } } } - if(tmp_plat_data && (i < RK_CAM_NUM) && tmp_plat_data->sensor_init_data[i]) { - //user has defined the init data - //init reg - if(tmp_plat_data->sensor_init_data[i]->rk_sensor_init_data && (sizeof(struct reginfo) != sizeof(struct reginfo_t))){ - for(j = 0;j< sizeof(sensor_init_data)/sizeof(struct reginfo);j++){ - sensor_init_data[j].reg = tmp_plat_data->sensor_init_data[i]->rk_sensor_init_data[j].reg; - sensor_init_data[j].val = tmp_plat_data->sensor_init_data[i]->rk_sensor_init_data[j].val; - } - sensor_init_data_p = sensor_init_data; - } else if(tmp_plat_data->sensor_init_data[i]->rk_sensor_init_data) { - sensor_init_data_p = (struct reginfo*)(tmp_plat_data->sensor_init_data[i]->rk_sensor_init_data); - } - //init winseq - if(tmp_plat_data->sensor_init_data[i]->rk_sensor_init_winseq && (sizeof(struct reginfo) != sizeof(struct reginfo_t))){ - int tmp_winseq_size = tmp_plat_data->sensor_init_data[i]->rk_sensor_winseq_size; - if(sensor_init_winseq_board) { - vfree(sensor_init_winseq_board); - sensor_init_winseq_board = NULL; - } - sensor_init_winseq_board = (struct reginfo*)vmalloc(tmp_winseq_size); - if(!sensor_init_winseq_board) - SENSOR_TR("%s :vmalloc erro !",__FUNCTION__); - for(j = 0;j< tmp_winseq_size;j++) { - sensor_init_winseq_board[j].reg = tmp_plat_data->sensor_init_data[i]->rk_sensor_init_winseq[j].reg; - sensor_init_winseq_board[j].val = tmp_plat_data->sensor_init_data[i]->rk_sensor_init_winseq[j].val; + if(tmp_plat_data &&(i < RK_CAM_NUM) && tmp_plat_data->sensor_init_data[i]){ + //user has defined the init data + //init reg + int tmp_init_data_size = tmp_plat_data->sensor_init_data[i]->rk_sensor_init_data_size; + if(tmp_init_data_size > 2){//init data is valid + if((sizeof(struct reginfo) != sizeof(struct reginfo_t))){ + if(sensor_init_data_board) { + vfree(sensor_init_data_board); + sensor_init_data_board = NULL; + } + sensor_init_data_board = (struct reginfo*)vmalloc(tmp_init_data_size); + if(!sensor_init_data_board) + SENSOR_TR("%s :vmalloc init data erro !",__FUNCTION__); + for(j = 0;j< tmp_init_data_size;j++) { + sensor_init_data_board[j].reg = tmp_plat_data->sensor_init_data[i]->rk_sensor_init_data[j].reg; + sensor_init_data_board[j].val = tmp_plat_data->sensor_init_data[i]->rk_sensor_init_data[j].val; + } + sensor_init_data_p = sensor_init_data_board; + } else{ + sensor_init_data_p = (struct reginfo*)(tmp_plat_data->sensor_init_data[i]->rk_sensor_init_data); } - sensor_init_winseq_p = sensor_init_winseq_board; - } else if(tmp_plat_data->sensor_init_data[i]->rk_sensor_init_winseq) { - sensor_init_winseq_p = (struct reginfo*)(tmp_plat_data->sensor_init_data[i]->rk_sensor_init_winseq); - } - //init width,height,bus,pixelcode - if(tmp_plat_data->sensor_init_data[i] && tmp_plat_data->sensor_init_data[i]->rk_sensor_init_width != INVALID_VALUE) - sensor_init_width = tmp_plat_data->sensor_init_data[i]->rk_sensor_init_width; - if(tmp_plat_data->sensor_init_data[i] && tmp_plat_data->sensor_init_data[i]->rk_sensor_init_height != INVALID_VALUE) - sensor_init_height = tmp_plat_data->sensor_init_data[i]->rk_sensor_init_height; - if(tmp_plat_data->sensor_init_data[i] && tmp_plat_data->sensor_init_data[i]->rk_sensor_init_bus_param != INVALID_VALUE) - sensor_init_busparam = tmp_plat_data->sensor_init_data[i]->rk_sensor_init_bus_param; - if(tmp_plat_data->sensor_init_data[i] && tmp_plat_data->sensor_init_data[i]->rk_sensor_init_pixelcode != INVALID_VALUE) - sensor_init_pixelcode = tmp_plat_data->sensor_init_data[i]->rk_sensor_init_pixelcode; + } + //init winseq + int tmp_winseq_size = tmp_plat_data->sensor_init_data[i]->rk_sensor_winseq_size; + if(tmp_winseq_size > 2){ + if(sizeof(struct reginfo) != sizeof(struct reginfo_t)){ + if(sensor_init_winseq_board) { + vfree(sensor_init_winseq_board); + sensor_init_winseq_board = NULL; + } + sensor_init_winseq_board = (struct reginfo*)vmalloc(tmp_winseq_size); + if(!sensor_init_winseq_board) + SENSOR_TR("%s :vmalloc erro !",__FUNCTION__); + for(j = 0;j< tmp_winseq_size;j++){ + sensor_init_winseq_board[j].reg = tmp_plat_data->sensor_init_data[i]->rk_sensor_init_winseq[j].reg; + sensor_init_winseq_board[j].val = tmp_plat_data->sensor_init_data[i]->rk_sensor_init_winseq[j].val; + } + sensor_init_winseq_p = sensor_init_winseq_board; + } else{ + sensor_init_winseq_p = (struct reginfo*)(tmp_plat_data->sensor_init_data[i]->rk_sensor_init_winseq); + } + } + //init width,height,bus,pixelcode + if(tmp_plat_data->sensor_init_data[i]->rk_sensor_init_width != INVALID_VALUE) + sensor_init_width = tmp_plat_data->sensor_init_data[i]->rk_sensor_init_width; + if(tmp_plat_data->sensor_init_data[i]->rk_sensor_init_height != INVALID_VALUE) + sensor_init_height = tmp_plat_data->sensor_init_data[i]->rk_sensor_init_height; + if(tmp_plat_data->sensor_init_data[i]->rk_sensor_init_bus_param != INVALID_VALUE) + sensor_init_busparam = tmp_plat_data->sensor_init_data[i]->rk_sensor_init_bus_param; + if(tmp_plat_data->sensor_init_data[i]->rk_sensor_init_pixelcode != INVALID_VALUE) + sensor_init_pixelcode = tmp_plat_data->sensor_init_data[i]->rk_sensor_init_pixelcode; } SENSOR_DG("\n%s..%s.. \n",SENSOR_NAME_STRING(),__FUNCTION__); diff --git a/drivers/media/video/rk30_camera_oneframe.c b/drivers/media/video/rk30_camera_oneframe.c index 783afb308cfa..204f8b98bc87 100755 --- a/drivers/media/video/rk30_camera_oneframe.c +++ b/drivers/media/video/rk30_camera_oneframe.c @@ -382,9 +382,6 @@ static int rk_videobuf_setup(struct videobuf_queue *vq, unsigned int *count, pcdev->camera_work_count = *count; } } - //must be reinit,or will be somthing wrong in irq process. - pcdev->active = NULL; - INIT_LIST_HEAD(&pcdev->capture); RKCAMERA_DG("%s..%d.. videobuf size:%d, vipmem_buf size:%d, count:%d \n",__FUNCTION__,__LINE__, *size,pcdev->vipmem_size, *count); return 0; @@ -1811,7 +1808,11 @@ static int rk_camera_s_stream(struct soc_camera_device *icd, int enable) RKCAMERA_DG("STREAM_OFF cancel timer and flush work:0x%x \n", ret); } write_cif_reg(pcdev->base,CIF_CIF_CTRL, cif_ctrl_val); - + //must be reinit,or will be somthing wrong in irq process. + if(enable == false){ + pcdev->active = NULL; + INIT_LIST_HEAD(&pcdev->capture); + } RKCAMERA_DG("%s.. enable : 0x%x , CIF_CIF_CTRL = 0x%x\n", __FUNCTION__, enable,read_cif_reg(pcdev->base,CIF_CIF_CTRL)); return 0; } -- 2.34.1