#include <media/v4l2-common.h>
#include <media/v4l2-chip-ident.h>
#include <media/soc_camera.h>
-#include <mach/rk29_camera.h>
+#include <plat/rk_camera.h>
+#include <linux/vmalloc.h>
+#include <linux/vmalloc.h>
#include "ov3640.h"
static int debug;
#define SENSOR_MIN_HEIGHT 144
#define SENSOR_MAX_WIDTH 2048
#define SENSOR_MAX_HEIGHT 1536
-#define SENSOR_INIT_WIDTH 640 /* Sensor pixel size for sensor_init_data array */
-#define SENSOR_INIT_HEIGHT 480
-#define SENSOR_INIT_WINSEQADR sensor_init_data
-#define SENSOR_INIT_PIXFMT V4L2_MBUS_FMT_YUYV8_2X8
+#define SENSOR_INIT_WIDTH sensor_init_width /* Sensor pixel size for sensor_init_data array */
+#define SENSOR_INIT_HEIGHT sensor_init_height
+#define SENSOR_INIT_WINSEQADR sensor_init_winseq_p
+#define SENSOR_INIT_PIXFMT sensor_init_pixelcode
+#define SENSOR_BUS_PARAM sensor_init_busparam
#define CONFIG_SENSOR_WhiteBalance 1
#define CONFIG_SENSOR_Brightness 0
#define CONFIG_SENSOR_I2C_NOSCHED 0
#define CONFIG_SENSOR_I2C_RDWRCHK 0
-
-#define SENSOR_BUS_PARAM (SOCAM_MASTER | SOCAM_PCLK_SAMPLE_RISING |\
- SOCAM_HSYNC_ACTIVE_HIGH | SOCAM_VSYNC_ACTIVE_LOW |\
- SOCAM_DATA_ACTIVE_HIGH | SOCAM_DATAWIDTH_8 |SOCAM_MCLK_24MHZ)
-
#define COLOR_TEMPERATURE_CLOUDY_DN 6500
#define COLOR_TEMPERATURE_CLOUDY_UP 8000
#define COLOR_TEMPERATURE_CLEARDAY_DN 5000
sensor_power_end:
return ret;
}
+static s32 sensor_init_width = 640;
+static s32 sensor_init_height = 480;
+static unsigned long sensor_init_busparam = (SOCAM_MASTER | SOCAM_PCLK_SAMPLE_RISING|SOCAM_HSYNC_ACTIVE_HIGH | SOCAM_VSYNC_ACTIVE_LOW |SOCAM_DATA_ACTIVE_HIGH | SOCAM_DATAWIDTH_8 |SOCAM_MCLK_24MHZ);
+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 int sensor_init(struct v4l2_subdev *sd, u32 val)
{
struct i2c_client *client = sd->priv;
const struct v4l2_queryctrl *qctrl;
const struct sensor_datafmt *fmt;
char value;
- int ret,pid = 0;
-
+ int ret,pid = 0,i = 0,j=0;
+ struct rk29camera_platform_data* tmp_plat_data =(struct rk29camera_platform_data*)val;
+ sensor_init_data_p = sensor_init_data;
+ sensor_init_winseq_p = sensor_vga;
+ sensor_init_width = 640;
+ sensor_init_height = 480;
+ if (tmp_plat_data != NULL && (u32)tmp_plat_data != 1) {
+ for(i = 0;i < RK_CAM_NUM;i++){
+ if ((tmp_plat_data->sensor_init_data[i])&& tmp_plat_data->info[i].dev_name &&
+ (strcmp(tmp_plat_data->info[i].dev_name, dev_name(icd->pdev)) == 0))
+ break;
+ }
+ }
+ if(tmp_plat_data && ((u32)tmp_plat_data != 1) &&(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;
+ }
+ 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;
+ }
SENSOR_DG("\n%s..%s.. \n",SENSOR_NAME_STRING(),__FUNCTION__);
if (sensor_ioctrl(icd, Sensor_PowerDown, 0) < 0) {
goto sensor_INIT_ERR;
}
- ret = sensor_write_array(client, sensor_init_data);
+ ret = sensor_write_array(client, sensor_init_data_p);
if (ret != 0)
{
SENSOR_TR("error: %s initial failed\n",SENSOR_NAME_STRING());
}
case RK29_CAM_SUBDEV_IOREQUEST:
{
- sensor->sensor_io_request = (struct rk29camera_platform_data*)arg;
- if (sensor->sensor_io_request != NULL) {
- if (sensor->sensor_io_request->gpio_res[0].dev_name &&
- (strcmp(sensor->sensor_io_request->gpio_res[0].dev_name, dev_name(icd->pdev)) == 0)) {
- sensor->sensor_gpio_res = (struct rk29camera_gpio_res*)&sensor->sensor_io_request->gpio_res[0];
- } else if (sensor->sensor_io_request->gpio_res[1].dev_name &&
- (strcmp(sensor->sensor_io_request->gpio_res[1].dev_name, dev_name(icd->pdev)) == 0)) {
- sensor->sensor_gpio_res = (struct rk29camera_gpio_res*)&sensor->sensor_io_request->gpio_res[1];
- }
- } else {
- SENSOR_TR("%s %s RK29_CAM_SUBDEV_IOREQUEST fail\n",SENSOR_NAME_STRING(),__FUNCTION__);
- ret = -EINVAL;
- goto sensor_ioctl_end;
- }
+ sensor->sensor_io_request = (struct rk29camera_platform_data*)arg;
+ if (sensor->sensor_io_request != NULL) {
+ int j = 0;
+ for(j = 0;j < RK_CAM_NUM;j++){
+ if (sensor->sensor_io_request->gpio_res[j].dev_name &&
+ (strcmp(sensor->sensor_io_request->gpio_res[j].dev_name, dev_name(icd->pdev)) == 0)) {
+ sensor->sensor_gpio_res = (struct rk29camera_gpio_res*)&sensor->sensor_io_request->gpio_res[j];
+ break;
+ }
+ }
+ if(j == RK_CAM_NUM){
+ SENSOR_TR("%s %s RK_CAM_SUBDEV_IOREQUEST fail\n",SENSOR_NAME_STRING(),__FUNCTION__);
+ ret = -EINVAL;
+ goto sensor_ioctl_end;
+ }
+ }
/* ddl@rock-chips.com : if gpio_flash havn't been set in board-xxx.c, sensor driver must notify is not support flash control
for this project */
#if CONFIG_SENSOR_Flash