/*---------------- Camera Sensor Configuration Macro Begin ------------------------*/
#define CONFIG_SENSOR_0 RK29_CAM_SENSOR_OV5642 /* back camera sensor */
#define CONFIG_SENSOR_IIC_ADDR_0 0x78
-#define CONFIG_SENSOR_IIC_ADAPTER_ID_0 1
-#define CONFIG_SENSOR_CIF_INDEX_0 0
+#define CONFIG_SENSOR_IIC_ADAPTER_ID_0 4
+#define CONFIG_SENSOR_CIF_INDEX_0 1
#define CONFIG_SENSOR_ORIENTATION_0 90
#define CONFIG_SENSOR_POWER_PIN_0 INVALID_GPIO
#define CONFIG_SENSOR_RESET_PIN_0 INVALID_GPIO
-#define CONFIG_SENSOR_POWERDN_PIN_0 INVALID_GPIO
+#define CONFIG_SENSOR_POWERDN_PIN_0 RK30_PIN1_PD6
#define CONFIG_SENSOR_FALSH_PIN_0 INVALID_GPIO
#define CONFIG_SENSOR_POWERACTIVE_LEVEL_0 RK29_CAM_POWERACTIVE_L
#define CONFIG_SENSOR_RESETACTIVE_LEVEL_0 RK29_CAM_RESETACTIVE_L
#define CONFIG_SENSOR_1 RK29_CAM_SENSOR_OV2659 /* front camera sensor */
#define CONFIG_SENSOR_IIC_ADDR_1 0x60
-#define CONFIG_SENSOR_IIC_ADAPTER_ID_1 1
-#define CONFIG_SENSOR_CIF_INDEX_1 1
+#define CONFIG_SENSOR_IIC_ADAPTER_ID_1 3
+#define CONFIG_SENSOR_CIF_INDEX_1 0
#define CONFIG_SENSOR_ORIENTATION_1 270
#define CONFIG_SENSOR_POWER_PIN_1 INVALID_GPIO
#define CONFIG_SENSOR_RESET_PIN_1 INVALID_GPIO
-#define CONFIG_SENSOR_POWERDN_PIN_1 INVALID_GPIO
+#define CONFIG_SENSOR_POWERDN_PIN_1 RK30_PIN1_PB7
#define CONFIG_SENSOR_FALSH_PIN_1 INVALID_GPIO
#define CONFIG_SENSOR_POWERACTIVE_LEVEL_1 RK29_CAM_POWERACTIVE_L
#define CONFIG_SENSOR_RESETACTIVE_LEVEL_1 RK29_CAM_RESETACTIVE_L
#define CONFIG_SENSOR_SVGA_FPS_FIXED_1 15000
#define CONFIG_SENSOR_720P_FPS_FIXED_1 30000
-#define CONFIG_USE_CIF_0 1
-#define CONFIG_USE_CIF_1 1
#endif //#ifdef CONFIG_VIDEO_RK29
/*---------------- Camera Sensor Configuration Macro End------------------------*/
#include "../../../drivers/media/video/rk30_camera.c"
/*---------------- Camera Sensor Macro Define End ---------*/
-//RK30,use ion to allocate mem , set it as 0
-#define PMEM_CAM_SIZE 0//PMEM_CAM_NECESSARY
-#ifdef CONFIG_VIDEO_RK29_WORK_IPP
-#define MEM_CAMIPP_SIZE_CIF_0 PMEM_CAMIPP_NECESSARY_CIF_0
-#define MEM_CAMIPP_SIZE_CIF_1 PMEM_CAMIPP_NECESSARY_CIF_0
-#else
-#define MEM_CAMIPP_SIZE_CIF_0 0
-#define MEM_CAMIPP_SIZE_CIF_1 0
-
-#endif
+#define PMEM_CAM_SIZE PMEM_CAM_NECESSARY
/*****************************************************************************************
* camera devices
* author: ddl@rock-chips.com
.sensor_flash_cb = NULL,
#endif
};
+
+#if CONFIG_SENSOR_IIC_ADDR_0
static struct reginfo_t rk_init_data_sensor_reg_0[] =
{
{0x0000, 0x00,0,0}
static struct reginfo_t rk_init_data_sensor_winseqreg_0[] ={
{0x0000, 0x00,0,0}
};
-static rk_sensor_user_init_data_s rk_init_data_sensor_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 = rk_init_data_sensor_reg_0,
- .rk_sensor_init_winseq = NULL,//rk_init_data_sensor_winseqreg_0,
- .rk_sensor_winseq_size = sizeof(rk_init_data_sensor_winseqreg_0) / sizeof(struct reginfo_t),
-
+#endif
+
+#if CONFIG_SENSOR_IIC_ADDR_1
+static struct reginfo_t rk_init_data_sensor_reg_1[] =
+{
+ {0x0000, 0x00,0,0}
+};
+static struct reginfo_t rk_init_data_sensor_winseqreg_1[] =
+{
+ {0x0000, 0x00,0,0}
};
-static rk_sensor_user_init_data_s* rk_init_data_sensor_0_p = NULL;
-static rk_sensor_user_init_data_s* rk_init_data_sensor_1_p = NULL;
+#endif
+static rk_sensor_user_init_data_s rk_init_data_sensor[RK_CAM_NUM] =
+{
+ {
+ .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 = sizeof(rk_init_data_sensor_winseqreg_0) / sizeof(struct reginfo_t),
+ },{
+ .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 = sizeof(rk_init_data_sensor_winseqreg_1) / sizeof(struct reginfo_t),
+ }
+
+ };
#include "../../../drivers/media/video/rk30_camera.c"
#endif /* CONFIG_VIDEO_RK29 */
#endif\r
#else\r
#ifdef CONFIG_ARCH_RK30\r
- #error "Camera driver memory configuration is alloc from pmem, but ARCH_RK30 isn't support"\r
+// #error "Camera driver memory configuration is alloc from pmem, but ARCH_RK30 isn't support"\r
#endif \r
#endif\r
\r
} else {\r
is_init = true;\r
}\r
- printk("PMEM_CAM_NECESSARY:0x%x PMEM_CAMIPP_NECESSARY:0x%x"\r
- "PMEM_CAM_NECESSARY_CIF_1:0x%x PMEM_CAMIPP_NECESSARY_CIF_1:0x%x"\r
- "PMEM_CAM_NECESSARY_CIF_0:0x%x PMEM_CAMIPP_NECESSARY_CIF_0:0x%x",\r
- PMEM_CAM_NECESSARY,PMEM_CAMIPP_NECESSARY,PMEM_CAM_NECESSARY_CIF_1,PMEM_CAMIPP_NECESSARY_CIF_1,\r
- PMEM_CAM_NECESSARY_CIF_0,PMEM_CAMIPP_NECESSARY_CIF_0);\r
+ \r
if (sensor_ioctl_cb.sensor_power_cb == NULL)\r
sensor_ioctl_cb.sensor_power_cb = sensor_power_default_cb;\r
if (sensor_ioctl_cb.sensor_reset_cb == NULL)\r
return rk_sensor_ioctrl(dev,Cam_PowerDown,on);\r
}\r
\r
-#ifdef PMEM_CAM_BASE\r
+#ifdef PMEM_CAM_NECESSARY\r
static struct android_pmem_platform_data android_pmem_cam_pdata = {\r
.name = "pmem_cam",\r
.start = PMEM_CAM_BASE,\r
depends on VIDEO_RK29
default VIDEO_RKCIF_WORK_SIMUL_OFF
---help---
- where camera memory which is used for preview/raw/jpeg in android camera hal is alloced
+ CIFs work simultaneity
config VIDEO_RKCIF_WORK_SIMUL_ON
bool "Two cif controller can work sumultaneity"
#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>
static int debug;
module_param(debug, int, S_IRUGO|S_IWUSR);
#define SENSOR_MIN_HEIGHT 600
#define SENSOR_MAX_WIDTH 1600
#define SENSOR_MAX_HEIGHT 1200
-#define SENSOR_INIT_WIDTH 800 /* Sensor pixel size for sensor_init_data array */
-#define SENSOR_INIT_HEIGHT 600
-#define SENSOR_INIT_WINSEQADR sensor_svga
-#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
sensor_power_end:
return ret;
}
+static s32 sensor_init_width = 800;
+static s32 sensor_init_height = 600;
+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 = sensor_init_data;
+static struct reginfo* sensor_init_winseq_p = sensor_svga;
+static struct reginfo* sensor_init_winseq_board = NULL;
static int sensor_init(struct v4l2_subdev *sd, u32 val)
{
struct i2c_client *client = v4l2_get_subdevdata(sd);
const struct v4l2_queryctrl *qctrl;
const struct sensor_datafmt *fmt;
char value;
- int ret,pid = 0;
-
+ int ret,pid = 0,i = 0,j=0;
+ //if val ==1,mean that sensor need to be reinit
+ struct rk29camera_platform_data* tmp_plat_data =(struct rk29camera_platform_data*)val;
+ sensor_init_data_p = sensor_init_data;
+ sensor_init_winseq_p = sensor_svga;
+ sensor_init_width = 800;
+ sensor_init_height = 600;
+ // return 0;
+ 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());
return -ENODEV;
if (sensor_ioctrl(icd, Sensor_PowerDown, 0) < 0) {
+ SENSOR_TR("power down %s failed\n",SENSOR_NAME_STRING());
ret = -ENODEV;
goto sensor_video_probe_err;
}
{
sensor->sensor_io_request = (struct rk29camera_platform_data*)arg;
if (sensor->sensor_io_request != NULL) {
- sensor->sensor_gpio_res = NULL;
- for (i=0; i<RK29_CAM_SUPPORT_NUMS;i++) {
- if (sensor->sensor_io_request->gpio_res[i].dev_name &&
- (strcmp(sensor->sensor_io_request->gpio_res[i].dev_name, dev_name(icd->pdev)) == 0)) {
- sensor->sensor_gpio_res = (struct rk29camera_gpio_res*)&sensor->sensor_io_request->gpio_res[i];
- }
- }
- if (sensor->sensor_gpio_res == NULL) {
- SENSOR_TR("%s %s obtain gpio resource failed when RK29_CAM_SUBDEV_IOREQUEST \n",SENSOR_NAME_STRING(),__FUNCTION__);
- ret = -EINVAL;
- goto sensor_ioctl_end;
- }
- } else {
- SENSOR_TR("%s %s RK29_CAM_SUBDEV_IOREQUEST fail\n",SENSOR_NAME_STRING(),__FUNCTION__);
- ret = -EINVAL;
- goto sensor_ioctl_end;
- }
+ 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
#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 "ov5642.h"
static int debug;
#define SENSOR_MIN_HEIGHT 144
#define SENSOR_MAX_WIDTH 2592
#define SENSOR_MAX_HEIGHT 1944
-#define SENSOR_INIT_WIDTH 800 /* Sensor pixel size for sensor_init_data array */
-#define SENSOR_INIT_HEIGHT 600
-#define SENSOR_INIT_WINSEQADR sensor_svga
-#define SENSOR_INIT_PIXFMT V4L2_MBUS_FMT_UYVY8_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 = 800;
+static s32 sensor_init_height = 600;
+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 = v4l2_get_subdevdata(sd);
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_svga;
+ sensor_init_width = 800;
+ sensor_init_height = 600;
+ if (tmp_plat_data != NULL) {
+ 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 && (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());
goto sensor_INIT_ERR;
break;
}
case RK29_CAM_SUBDEV_IOREQUEST:
- {
- sensor->sensor_io_request = (struct rk29camera_platform_data*)arg;
+ {
+ sensor->sensor_io_request = (struct rk29camera_platform_data*)arg;
+
if (sensor->sensor_io_request != NULL) {
- sensor->sensor_gpio_res = NULL;
- for (i=0; i<RK29_CAM_SUPPORT_NUMS;i++) {
- if (sensor->sensor_io_request->gpio_res[i].dev_name &&
- (strcmp(sensor->sensor_io_request->gpio_res[i].dev_name, dev_name(icd->pdev)) == 0)) {
- sensor->sensor_gpio_res = (struct rk29camera_gpio_res*)&sensor->sensor_io_request->gpio_res[i];
- }
- }
- if (sensor->sensor_gpio_res == NULL) {
- SENSOR_TR("%s %s obtain gpio resource failed when RK29_CAM_SUBDEV_IOREQUEST \n",SENSOR_NAME_STRING(),__FUNCTION__);
- ret = -EINVAL;
- goto sensor_ioctl_end;
- }
- } else {
- SENSOR_TR("%s %s RK29_CAM_SUBDEV_IOREQUEST fail\n",SENSOR_NAME_STRING(),__FUNCTION__);
- ret = -EINVAL;
- goto sensor_ioctl_end;
- }
+ 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 */
#include <mach/iomux.h>\r
#include <media/soc_camera.h>\r
#include <linux/android_pmem.h>\r
-\r
+#include <mach/rk30_camera.h>\r
#ifndef PMEM_CAM_SIZE\r
#include "../../../arch/arm/plat-rk/rk_camera.c"\r
#else\r
}\r
return 0;\r
}\r
-\r
+#define PMEM_CAM_BASE 0 //just for compile ,no meaning\r
#include "../../../arch/arm/plat-rk/rk_camera.c"\r
\r
\r
rk_camera_platform_data.meminfo_cif1.start =board_mem_reserve_add("camera_ipp_mem_1",PMEM_CAMIPP_NECESSARY_CIF_1);\r
rk_camera_platform_data.meminfo_cif1.size= PMEM_CAMIPP_NECESSARY_CIF_1;\r
#endif\r
-#endif\r
+ #endif\r
+ #if PMEM_CAM_NECESSARY\r
+ android_pmem_cam_pdata.start = board_mem_reserve_add((char*)(android_pmem_cam_pdata.name),PMEM_CAM_NECESSARY);\r
+ android_pmem_cam_pdata.size= PMEM_CAM_NECESSARY;\r
+ #endif\r
+\r
}\r
static int rk_register_camera_devices(void)\r
{\r
platform_device_register(&rk_camera_platform_data.register_dev[i].device_info);\r
}\r
}\r
+ #if PMEM_CAM_NECESSARY\r
+ platform_device_register(&android_pmem_cam_device);\r
+ #endif\r
+ \r
return 0;\r
}\r
\r
#include <linux/platform_device.h>
#include <linux/mutex.h>
#include <linux/videodev2.h>
-#include <plat/rk_camera.h>
#include <mach/iomux.h>
#include <media/v4l2-common.h>
#include <media/v4l2-dev.h>
#include <media/soc_mediabus.h>
#include <mach/io.h>
#include <plat/ipp.h>
-
+#include <mach/rk30_camera.h>
static int debug;
module_param(debug, int, S_IRUGO|S_IWUSR);
#define MIN(x,y) ((x<y) ? x: y)
#define MAX(x,y) ((x>y) ? x: y)
-#define RK_SENSOR_24MHZ 24 /* MHz */
+#define RK_SENSOR_24MHZ 24*1000*1000 /* MHz */
#define RK_SENSOR_48MHZ 48
#define write_cif_reg(base,addr, val) __raw_writel(val, addr+(base))
struct soc_camera_device *icd;
//************must modify start************/
- struct clk *aclk_ddr_lcdc;
- struct clk *aclk_disp_matrix;
-
- struct clk *hclk_cpu_display;
- struct clk *vip_slave;
-
- struct clk *vip_out;
- struct clk *vip_input;
- struct clk *vip_bus;
-
- struct clk *hclk_disp_matrix;
- struct clk *vip_matrix;
-
- struct clk *pd_display;
+ struct clk *aclk_cif;
+ struct clk *hclk_cif;
+ struct clk *cif_clk_in;
+ struct clk *cif_clk_out;
//************must modify end************/
void __iomem *base;
int frame_inval; /* ddl@rock-chips.com : The first frames is invalidate */
}
static int rk_camera_activate(struct rk_camera_dev *pcdev, struct soc_camera_device *icd)
{
- unsigned long sensor_bus_flags = SOCAM_MCLK_24MHZ;
- struct clk *parent;
-
- RKCAMERA_TR("%s..%d.. \n",__FUNCTION__,__LINE__);
- #if 0
- if (!pcdev->aclk_ddr_lcdc || !pcdev->aclk_disp_matrix || !pcdev->hclk_cpu_display ||
- !pcdev->vip_slave || !pcdev->vip_out || !pcdev->vip_input || !pcdev->vip_bus || !pcdev->pd_display ||
- IS_ERR(pcdev->aclk_ddr_lcdc) || IS_ERR(pcdev->aclk_disp_matrix) || IS_ERR(pcdev->hclk_cpu_display) || IS_ERR(pcdev->pd_display) ||
- IS_ERR(pcdev->vip_slave) || IS_ERR(pcdev->vip_out) || IS_ERR(pcdev->vip_input) || IS_ERR(pcdev->vip_bus)) {
-
- RKCAMERA_TR(KERN_ERR "failed to get vip_clk(axi) source\n");
- goto RK_CAMERA_ACTIVE_ERR;
- }
- RKCAMERA_TR("%s..%d.. \n",__FUNCTION__,__LINE__);
- if (!pcdev->hclk_disp_matrix || !pcdev->vip_matrix ||
- IS_ERR(pcdev->hclk_disp_matrix) || IS_ERR(pcdev->vip_matrix)) {
-
- RKCAMERA_TR(KERN_ERR "failed to get vip_clk(ahb) source\n");
+ int err = 0;
+ if(!pcdev->aclk_cif || !pcdev->hclk_cif || !pcdev->cif_clk_in || !pcdev->cif_clk_out){
+ RKCAMERA_TR(KERN_ERR "failed to get cif clock source\n");
+ err = -ENOENT;
goto RK_CAMERA_ACTIVE_ERR;
- }
- clk_enable(pcdev->pd_display);
-
- clk_enable(pcdev->aclk_ddr_lcdc);
- clk_enable(pcdev->aclk_disp_matrix);
-
- clk_enable(pcdev->hclk_cpu_display);
- clk_enable(pcdev->vip_slave);
- RK29CAMERA_TR("%s..%d.. \n",__FUNCTION__,__LINE__);
+ }
+ clk_enable(pcdev->aclk_cif);
- clk_enable(pcdev->vip_input);
- clk_enable(pcdev->vip_bus);
+ clk_enable(pcdev->hclk_cif);
+ clk_enable(pcdev->cif_clk_in);
//if (icd->ops->query_bus_param) /* ddl@rock-chips.com : Query Sensor's xclk */
//sensor_bus_flags = icd->ops->query_bus_param(icd);
- if (sensor_bus_flags & SOCAM_MCLK_48MHZ) {
- parent = clk_get(NULL, "clk48m");
- if (!parent || IS_ERR(parent))
- goto RK_CAMERA_ACTIVE_ERR;
- } else if (sensor_bus_flags & SOCAM_MCLK_27MHZ) {
- parent = clk_get(NULL, "extclk");
- if (!parent || IS_ERR(parent))
- goto RK_CAMERA_ACTIVE_ERR;
- } else {
- parent = clk_get(NULL, "xin24m");
- if (!parent || IS_ERR(parent))
- goto RK_CAMERA_ACTIVE_ERR;
- }
- clk_set_parent(pcdev->vip_out, parent);
-
- clk_enable(pcdev->vip_out);
- // rk30_mux_api_set(GPIO1B4_VIPCLKOUT_NAME, GPIO1L_VIP_CLKOUT);
- ndelay(10);
+ clk_enable(pcdev->cif_clk_out);
+ clk_set_rate(pcdev->cif_clk_out,RK_SENSOR_24MHZ);
ndelay(10);
-// write_vip_reg(pcdev->base,RK29_VIP_RESET, 0x76543210); /* ddl@rock-chips.com : vip software reset */
-// udelay(10);
-#endif
write_cif_reg(pcdev->base,CIF_CIF_CTRL,AXI_BURST_16|MODE_ONEFRAME|DISABLE_CAPTURE); /* ddl@rock-chips.com : vip ahb burst 16 */
write_cif_reg(pcdev->base,CIF_CIF_INTEN, 0x01); //capture complete interrupt enable
RKCAMERA_TR("%s..%d.. CIF_CIF_CTRL = 0x%x\n",__FUNCTION__,__LINE__,read_cif_reg(pcdev->base, CIF_CIF_CTRL));
static void rk_camera_deactivate(struct rk_camera_dev *pcdev)
{
//pcdev->active = NULL;
-#if 0
- write_cif_reg(pcdev->base,CIF_CIF_CTRL, 0);
- read_cif_reg(pcdev->base,CIF_CIF_INTSTAT); //clear vip interrupte single
-
-// rk29_mux_api_set(GPIO1B4_VIPCLKOUT_NAME, GPIO1L_GPIO1B4);
- clk_disable(pcdev->vip_out);
+ clk_disable(pcdev->aclk_cif);
- clk_disable(pcdev->vip_input);
- clk_disable(pcdev->vip_bus);
-
-
- clk_disable(pcdev->hclk_cpu_display);
- clk_disable(pcdev->vip_slave);
-
- clk_disable(pcdev->aclk_ddr_lcdc);
- clk_disable(pcdev->aclk_disp_matrix);
-
- clk_disable(pcdev->pd_display);
- #endif
+ clk_disable(pcdev->hclk_cif);
+ clk_disable(pcdev->cif_clk_in);
+ clk_disable(pcdev->cif_clk_out);
return;
}
if (CAM_IPPWORK_IS_EN()) {
BUG_ON(pcdev->vipmem_phybase == 0);
}
- pix->width = mf.width;
- pix->height = mf.height;
+ pix->width = usr_w;
+ pix->height = usr_h;
pix->field = mf.field;
pix->colorspace = mf.colorspace;
icd->current_fmt = xlate;
struct rk_camera_dev *pcdev = camera_work->pcdev;
//dump regs
{
- RKCAMERA_TR("CIF_CIF_CTRL = 0x%x\n",read_cif_reg(pcdev->base,CIF_CIF_CTRL));
- RKCAMERA_TR("CIF_CIF_INTEN = 0x%x\n",read_cif_reg(pcdev->base,CIF_CIF_INTEN));
- RKCAMERA_TR("CIF_CIF_INTSTAT = 0x%x\n",read_cif_reg(pcdev->base,CIF_CIF_INTSTAT));
- RKCAMERA_TR("CIF_CIF_FOR = 0x%x\n",read_cif_reg(pcdev->base,CIF_CIF_FOR));
- RKCAMERA_TR("CIF_CIF_CROP = 0x%x\n",read_cif_reg(pcdev->base,CIF_CIF_CROP));
- RKCAMERA_TR("CIF_CIF_SET_SIZE = 0x%x\n",read_cif_reg(pcdev->base,CIF_CIF_SET_SIZE));
- RKCAMERA_TR("CIF_CIF_SCL_CTRL = 0x%x\n",read_cif_reg(pcdev->base,CIF_CIF_SCL_CTRL));
- RKCAMERA_TR("CRU_PCLK_REG30 = 0X%x\n",read_cru_reg(CRU_PCLK_REG30));
- RKCAMERA_TR("CIF_CIF_LAST_LINE = 0X%x\n",read_cif_reg(pcdev->base,CIF_CIF_LAST_LINE));
+ RKCAMERA_DG("CIF_CIF_CTRL = 0x%x\n",read_cif_reg(pcdev->base,CIF_CIF_CTRL));
+ RKCAMERA_DG("CIF_CIF_INTEN = 0x%x\n",read_cif_reg(pcdev->base,CIF_CIF_INTEN));
+ RKCAMERA_DG("CIF_CIF_INTSTAT = 0x%x\n",read_cif_reg(pcdev->base,CIF_CIF_INTSTAT));
+ RKCAMERA_DG("CIF_CIF_FOR = 0x%x\n",read_cif_reg(pcdev->base,CIF_CIF_FOR));
+ RKCAMERA_DG("CIF_CIF_CROP = 0x%x\n",read_cif_reg(pcdev->base,CIF_CIF_CROP));
+ RKCAMERA_DG("CIF_CIF_SET_SIZE = 0x%x\n",read_cif_reg(pcdev->base,CIF_CIF_SET_SIZE));
+ RKCAMERA_DG("CIF_CIF_SCL_CTRL = 0x%x\n",read_cif_reg(pcdev->base,CIF_CIF_SCL_CTRL));
+ RKCAMERA_DG("CRU_PCLK_REG30 = 0X%x\n",read_cru_reg(CRU_PCLK_REG30));
+ RKCAMERA_DG("CIF_CIF_LAST_LINE = 0X%x\n",read_cif_reg(pcdev->base,CIF_CIF_LAST_LINE));
- RKCAMERA_TR("CIF_CIF_LAST_PIX = 0X%x\n",read_cif_reg(pcdev->base,CIF_CIF_LAST_PIX));
- RKCAMERA_TR("CIF_CIF_VIR_LINE_WIDTH = 0X%x\n",read_cif_reg(pcdev->base,CIF_CIF_VIR_LINE_WIDTH));
- RKCAMERA_TR("CIF_CIF_LINE_NUM_ADDR = 0X%x\n",read_cif_reg(pcdev->base,CIF_CIF_LINE_NUM_ADDR));
- RKCAMERA_TR("CIF_CIF_FRM0_ADDR_Y = 0X%x\n",read_cif_reg(pcdev->base,CIF_CIF_FRM0_ADDR_Y));
- RKCAMERA_TR("CIF_CIF_FRM0_ADDR_UV = 0X%x\n",read_cif_reg(pcdev->base,CIF_CIF_FRM0_ADDR_UV));
- RKCAMERA_TR("CIF_CIF_FRAME_STATUS = 0X%x\n",read_cif_reg(pcdev->base,CIF_CIF_FRAME_STATUS));
+ RKCAMERA_DG("CIF_CIF_LAST_PIX = 0X%x\n",read_cif_reg(pcdev->base,CIF_CIF_LAST_PIX));
+ RKCAMERA_DG("CIF_CIF_VIR_LINE_WIDTH = 0X%x\n",read_cif_reg(pcdev->base,CIF_CIF_VIR_LINE_WIDTH));
+ RKCAMERA_DG("CIF_CIF_LINE_NUM_ADDR = 0X%x\n",read_cif_reg(pcdev->base,CIF_CIF_LINE_NUM_ADDR));
+ RKCAMERA_DG("CIF_CIF_FRM0_ADDR_Y = 0X%x\n",read_cif_reg(pcdev->base,CIF_CIF_FRM0_ADDR_Y));
+ RKCAMERA_DG("CIF_CIF_FRM0_ADDR_UV = 0X%x\n",read_cif_reg(pcdev->base,CIF_CIF_FRM0_ADDR_UV));
+ RKCAMERA_DG("CIF_CIF_FRAME_STATUS = 0X%x\n",read_cif_reg(pcdev->base,CIF_CIF_FRAME_STATUS));
}
write_cif_reg(pcdev->base,CIF_CIF_CTRL, (read_cif_reg(pcdev->base,CIF_CIF_CTRL)&(~ENABLE_CAPTURE)));
goto exit_alloc;
}
-
- /*config output clk*/ // must modify start
- #if 0
- pcdev->aclk_ddr_lcdc = clk_get(&pdev->dev, "aclk_ddr_lcdc");
- pcdev->aclk_disp_matrix = clk_get(&pdev->dev, "aclk_disp_matrix");
-
- pcdev->hclk_cpu_display = clk_get(&pdev->dev, "hclk_cpu_display");
- pcdev->vip_slave = clk_get(&pdev->dev, "vip_slave");
- pcdev->vip_out = clk_get(&pdev->dev,"vip_out");
- pcdev->vip_input = clk_get(&pdev->dev,"vip_input");
- pcdev->vip_bus = clk_get(&pdev->dev, "vip_bus");
-
- pcdev->hclk_disp_matrix = clk_get(&pdev->dev,"hclk_disp_matrix");
- pcdev->vip_matrix = clk_get(&pdev->dev,"vip_matrix");
-
- pcdev->pd_display = clk_get(&pdev->dev,"pd_display");
-
pcdev->zoominfo.zoom_rate = 100;
-
- if (!pcdev->aclk_ddr_lcdc || !pcdev->aclk_disp_matrix || !pcdev->hclk_cpu_display ||
- !pcdev->vip_slave || !pcdev->vip_out || !pcdev->vip_input || !pcdev->vip_bus || !pcdev->pd_display ||
- IS_ERR(pcdev->aclk_ddr_lcdc) || IS_ERR(pcdev->aclk_disp_matrix) || IS_ERR(pcdev->hclk_cpu_display) || IS_ERR(pcdev->pd_display) ||
- IS_ERR(pcdev->vip_slave) || IS_ERR(pcdev->vip_out) || IS_ERR(pcdev->vip_input) || IS_ERR(pcdev->vip_bus)) {
-//must modify end
- RKCAMERA_TR(KERN_ERR "failed to get vip_clk(axi) source\n");
- err = -ENOENT;
- goto exit_reqmem_vip;
- }
-
- if (!pcdev->hclk_disp_matrix || !pcdev->vip_matrix ||
- IS_ERR(pcdev->hclk_disp_matrix) || IS_ERR(pcdev->vip_matrix)) {
-
- RKCAMERA_TR(KERN_ERR "failed to get vip_clk(ahb) source\n");
+ pcdev->hostid = pdev->id;
+ /*config output clk*/ // must modify start
+ if(IS_CIF0()){
+ // printk("it is cif 0!!!!!!!1\n");
+ pcdev->aclk_cif = clk_get(NULL, "aclk_cif0");
+ pcdev->hclk_cif = clk_get(NULL, "hclk_cif0");
+ pcdev->cif_clk_in = clk_get(NULL, "cif0_in");
+ pcdev->cif_clk_out = clk_get(NULL, "cif0_out");
+ rk30_mux_api_set(GPIO1B3_CIF0CLKOUT_NAME, GPIO1B_CIF0_CLKOUT);
+ }
+ else{
+ // printk("it is cif 1!!!!!!!1\n");
+ pcdev->aclk_cif = clk_get(NULL, "aclk_cif1");
+ pcdev->hclk_cif = clk_get(NULL, "hclk_cif1");
+ pcdev->cif_clk_in = clk_get(NULL, "cif1_in");
+ pcdev->cif_clk_out = clk_get(NULL, "cif1_out");
+ rk30_mux_api_set(GPIO1D7_CIF1CLKOUT_NAME,GPIO1D_CIF1_CLKOUT);
+ rk30_mux_api_set(GPIO1D2_CIF1CLKIN_NAME,GPIO1D_CIF1_CLKIN);
+ rk30_mux_api_set(GPIO1D1_CIF1HREF_MIIMDCLK_NAME,GPIO1D_CIF1_HREF);
+ rk30_mux_api_set(GPIO1D0_CIF1VSYNC_MIIMD_NAME,GPIO1D_CIF1_VSYNC);
+ rk30_mux_api_set(GPIO1C0_CIF1DATA2_RMIICLKOUT_RMIICLKIN_NAME,GPIO1C_CIF1_DATA2);
+ rk30_mux_api_set(GPIO1C2_CIF1DATA4_RMIITXD1_NAME,GPIO1C_CIF1_DATA4);
+ }
+ if(!pcdev->aclk_cif || !pcdev->hclk_cif || !pcdev->cif_clk_in || !pcdev->cif_clk_out){
+ RKCAMERA_TR(KERN_ERR "failed to get cif clock source\n");
err = -ENOENT;
goto exit_reqmem_vip;
- }
-#endif
+ }
dev_set_drvdata(&pdev->dev, pcdev);
pcdev->res = res;
pcdev->pdata = pdev->dev.platform_data; /* ddl@rock-chips.com : Request IO in init function */
- pcdev->hostid = pdev->id;
if (pcdev->pdata && pcdev->pdata->io_init) {
pcdev->pdata->io_init();
release_mem_region(res->start, res->end - res->start + 1);
exit_reqmem_vip:
- if (pcdev->aclk_ddr_lcdc) {
- clk_put(pcdev->aclk_ddr_lcdc);
- pcdev->aclk_ddr_lcdc = NULL;
- }
- if (pcdev->aclk_disp_matrix) {
- clk_put(pcdev->aclk_disp_matrix);
- pcdev->aclk_disp_matrix = NULL;
- }
- if (pcdev->hclk_cpu_display) {
- clk_put(pcdev->hclk_cpu_display);
- pcdev->hclk_cpu_display = NULL;
- }
- if (pcdev->vip_slave) {
- clk_put(pcdev->vip_slave);
- pcdev->vip_slave = NULL;
- }
- if (pcdev->vip_out) {
- clk_put(pcdev->vip_out);
- pcdev->vip_out = NULL;
- }
- if (pcdev->vip_input) {
- clk_put(pcdev->vip_input);
- pcdev->vip_input = NULL;
- }
- if (pcdev->vip_bus) {
- clk_put(pcdev->vip_bus);
- pcdev->vip_bus = NULL;
- }
- if (pcdev->hclk_disp_matrix) {
- clk_put(pcdev->hclk_disp_matrix);
- pcdev->hclk_disp_matrix = NULL;
- }
- if (pcdev->vip_matrix) {
- clk_put(pcdev->vip_matrix);
- pcdev->vip_matrix = NULL;
- }
+ if(pcdev->aclk_cif)
+ pcdev->aclk_cif = NULL;
+ if(pcdev->hclk_cif)
+ pcdev->hclk_cif = NULL;
+ if(pcdev->cif_clk_in)
+ pcdev->cif_clk_in = NULL;
+ if(pcdev->cif_clk_out)
+ pcdev->cif_clk_out = NULL;
+
kfree(pcdev);
exit_alloc:
// rk_camdev_info_ptr = NULL;
res = pcdev->res;
release_mem_region(res->start, res->end - res->start + 1);
if (pcdev->pdata && pcdev->pdata->io_deinit) { /* ddl@rock-chips.com : Free IO in deinit function */
- pcdev->pdata->io_deinit(pcdev->hostid);
+ pcdev->pdata->io_deinit(0);
+ pcdev->pdata->io_deinit(1);
}
kfree(pcdev);