#define CONFIG_SENSOR_POWERDNACTIVE_LEVEL_0 RK29_CAM_POWERDNACTIVE_H
#define CONFIG_SENSOR_FLASHACTIVE_LEVEL_0 RK29_CAM_FLASHACTIVE_L
+#define CONFIG_SENSOR_QCIF_FPS_FIXED_0 15
+#define CONFIG_SENSOR_QVGA_FPS_FIXED_0 15
+#define CONFIG_SENSOR_CIF_FPS_FIXED_0 15
+#define CONFIG_SENSOR_VGA_FPS_FIXED_0 15
+#define CONFIG_SENSOR_SVGA_FPS_FIXED_0 15
+#define CONFIG_SENSOR_720P_FPS_FIXED_0 30
+
#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_RESETACTIVE_LEVEL_1 RK29_CAM_RESETACTIVE_L
#define CONFIG_SENSOR_POWERDNACTIVE_LEVEL_1 RK29_CAM_POWERDNACTIVE_H
#define CONFIG_SENSOR_FLASHACTIVE_LEVEL_1 RK29_CAM_FLASHACTIVE_L
+
+#define CONFIG_SENSOR_QCIF_FPS_FIXED_1 15
+#define CONFIG_SENSOR_QVGA_FPS_FIXED_1 15
+#define CONFIG_SENSOR_CIF_FPS_FIXED_1 15
+#define CONFIG_SENSOR_VGA_FPS_FIXED_1 15
+#define CONFIG_SENSOR_SVGA_FPS_FIXED_1 15
+#define CONFIG_SENSOR_720P_FPS_FIXED_1 30
+
#endif //#ifdef CONFIG_VIDEO_RK29
/*---------------- Camera Sensor Configuration Macro End------------------------*/
#include "../../../drivers/media/video/rk29_camera.c"
#define CONFIG_SENSOR_POWERDNACTIVE_LEVEL_0 RK29_CAM_POWERDNACTIVE_H
#define CONFIG_SENSOR_FLASHACTIVE_LEVEL_0 RK29_CAM_FLASHACTIVE_L
+#define CONFIG_SENSOR_QCIF_FPS_FIXED_0 15
+#define CONFIG_SENSOR_QVGA_FPS_FIXED_0 15
+#define CONFIG_SENSOR_CIF_FPS_FIXED_0 15
+#define CONFIG_SENSOR_VGA_FPS_FIXED_0 15
+#define CONFIG_SENSOR_SVGA_FPS_FIXED_0 15
+#define CONFIG_SENSOR_720P_FPS_FIXED_0 30
+
#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_RESETACTIVE_LEVEL_1 RK29_CAM_RESETACTIVE_L
#define CONFIG_SENSOR_POWERDNACTIVE_LEVEL_1 RK29_CAM_POWERDNACTIVE_H
#define CONFIG_SENSOR_FLASHACTIVE_LEVEL_1 RK29_CAM_FLASHACTIVE_L
+
+#define CONFIG_SENSOR_QCIF_FPS_FIXED_1 15
+#define CONFIG_SENSOR_QVGA_FPS_FIXED_1 15
+#define CONFIG_SENSOR_CIF_FPS_FIXED_1 15
+#define CONFIG_SENSOR_VGA_FPS_FIXED_1 15
+#define CONFIG_SENSOR_SVGA_FPS_FIXED_1 15
+#define CONFIG_SENSOR_720P_FPS_FIXED_1 30
+
#endif //#ifdef CONFIG_VIDEO_RK29
/*---------------- Camera Sensor Configuration Macro End------------------------*/
#include "../../../drivers/media/video/rk29_camera.c"
#ifndef __ASM_ARCH_CAMERA_H_
#define __ASM_ARCH_CAMERA_H_
+#include <linux/videodev2.h>
+
#define RK29_CAM_DRV_NAME "rk29xx-camera"
#define RK29_CAM_PLATFORM_DEV_ID 33
unsigned int gpio_flash;
unsigned int gpio_flag;
unsigned int gpio_init;
- unsigned int orientation;
+
const char *dev_name;
};
unsigned int start;
unsigned int size;
};
+struct rk29camera_info {
+ const char *dev_name;
+ unsigned int orientation;
+ struct v4l2_frmivalenum fival[10];
+};
struct rk29camera_platform_data {
int (*io_init)(void);
int (*io_deinit)(int sensor);
int (*sensor_ioctrl)(struct device *dev,enum rk29camera_ioctrl_cmd cmd,int on);
struct rk29camera_gpio_res gpio_res[2];
struct rk29camera_mem_res meminfo;
+ struct rk29camera_info info[2];
};
struct rk29camera_platform_ioctl_cb {
.gpio_powerdown = CONFIG_SENSOR_POWERDN_PIN_0,\r
.gpio_flash = CONFIG_SENSOR_FALSH_PIN_0,\r
.gpio_flag = (CONFIG_SENSOR_POWERACTIVE_LEVEL_0|CONFIG_SENSOR_RESETACTIVE_LEVEL_0|CONFIG_SENSOR_POWERDNACTIVE_LEVEL_0|CONFIG_SENSOR_FLASHACTIVE_LEVEL_0),\r
- .gpio_init = 0,\r
- .orientation = CONFIG_SENSOR_ORIENTATION_0,\r
+ .gpio_init = 0, \r
.dev_name = SENSOR_DEVICE_NAME_0,\r
}, {\r
.gpio_reset = CONFIG_SENSOR_RESET_PIN_1,\r
.gpio_flash = CONFIG_SENSOR_FALSH_PIN_1,\r
.gpio_flag = (CONFIG_SENSOR_POWERACTIVE_LEVEL_1|CONFIG_SENSOR_RESETACTIVE_LEVEL_1|CONFIG_SENSOR_POWERDNACTIVE_LEVEL_1|CONFIG_SENSOR_FLASHACTIVE_LEVEL_1),\r
.gpio_init = 0,\r
- .orientation = CONFIG_SENSOR_ORIENTATION_1,\r
.dev_name = SENSOR_DEVICE_NAME_1,\r
}\r
},\r
.name = "camera_ipp_mem",\r
.start = MEM_CAMIPP_BASE,\r
.size = MEM_CAMIPP_SIZE,\r
- }\r
+ },\r
#endif\r
+ .info = {\r
+ {\r
+ .dev_name = SENSOR_DEVICE_NAME_0,\r
+ .orientation = CONFIG_SENSOR_ORIENTATION_0, \r
+ },{\r
+ .dev_name = SENSOR_DEVICE_NAME_1,\r
+ .orientation = CONFIG_SENSOR_ORIENTATION_1,\r
+ }\r
+ }\r
};\r
\r
static int rk29_sensor_iomux(int pin)\r
\r
static int rk29_sensor_io_init(void)\r
{\r
- int ret = 0, i;\r
+ int ret = 0, i,j;\r
unsigned int camera_reset = INVALID_GPIO, camera_power = INVALID_GPIO;\r
unsigned int camera_powerdown = INVALID_GPIO, camera_flash = INVALID_GPIO;\r
unsigned int camera_ioflag;\r
\r
dprintk("%s....flash pin(%d) init success(0x%x) \n",__FUNCTION__,camera_flash,((camera_ioflag&RK29_CAM_FLASHACTIVE_MASK)>>RK29_CAM_FLASHACTIVE_BITPOS));\r
\r
+ } \r
+\r
+ \r
+ for (j=0; j<10; j++) {\r
+ memset(&rk29_camera_platform_data.info[i].fival[j],0x00,sizeof(struct v4l2_frmivalenum));\r
}\r
+ j=0;\r
+ if (strstr(rk29_camera_platform_data.info[i].dev_name,"_back")) {\r
+ \r
+ #if CONFIG_SENSOR_QCIF_FPS_FIXED_0\r
+ rk29_camera_platform_data.info[i].fival[j].discrete.denominator = CONFIG_SENSOR_QCIF_FPS_FIXED_0;\r
+ rk29_camera_platform_data.info[i].fival[j].discrete.numerator= 1;\r
+ rk29_camera_platform_data.info[i].fival[j].index = 0;\r
+ rk29_camera_platform_data.info[i].fival[j].pixel_format = V4L2_PIX_FMT_NV12;\r
+ rk29_camera_platform_data.info[i].fival[j].width = 176;\r
+ rk29_camera_platform_data.info[i].fival[j].height = 144;\r
+ rk29_camera_platform_data.info[i].fival[j].type = V4L2_FRMIVAL_TYPE_DISCRETE;\r
+ j++;\r
+ #endif\r
+\r
+ #if CONFIG_SENSOR_QVGA_FPS_FIXED_0\r
+ rk29_camera_platform_data.info[i].fival[j].discrete.denominator = CONFIG_SENSOR_QVGA_FPS_FIXED_0;\r
+ rk29_camera_platform_data.info[i].fival[j].discrete.numerator= 1;\r
+ rk29_camera_platform_data.info[i].fival[j].index = 0;\r
+ rk29_camera_platform_data.info[i].fival[j].pixel_format = V4L2_PIX_FMT_NV12;\r
+ rk29_camera_platform_data.info[i].fival[j].width = 320;\r
+ rk29_camera_platform_data.info[i].fival[j].height = 240;\r
+ rk29_camera_platform_data.info[i].fival[j].type = V4L2_FRMIVAL_TYPE_DISCRETE;\r
+ j++;\r
+ #endif\r
+\r
+ #if CONFIG_SENSOR_CIF_FPS_FIXED_0\r
+ rk29_camera_platform_data.info[i].fival[j].discrete.denominator = CONFIG_SENSOR_CIF_FPS_FIXED_0;\r
+ rk29_camera_platform_data.info[i].fival[j].discrete.numerator= 1;\r
+ rk29_camera_platform_data.info[i].fival[j].index = 0;\r
+ rk29_camera_platform_data.info[i].fival[j].pixel_format = V4L2_PIX_FMT_NV12;\r
+ rk29_camera_platform_data.info[i].fival[j].width = 352;\r
+ rk29_camera_platform_data.info[i].fival[j].height = 288;\r
+ rk29_camera_platform_data.info[i].fival[j].type = V4L2_FRMIVAL_TYPE_DISCRETE;\r
+ j++;\r
+ #endif\r
+\r
+ #if CONFIG_SENSOR_VGA_FPS_FIXED_0\r
+ rk29_camera_platform_data.info[i].fival[j].discrete.denominator = CONFIG_SENSOR_VGA_FPS_FIXED_0;\r
+ rk29_camera_platform_data.info[i].fival[j].discrete.numerator= 1;\r
+ rk29_camera_platform_data.info[i].fival[j].index = 0;\r
+ rk29_camera_platform_data.info[i].fival[j].pixel_format = V4L2_PIX_FMT_NV12;\r
+ rk29_camera_platform_data.info[i].fival[j].width = 640;\r
+ rk29_camera_platform_data.info[i].fival[j].height = 480;\r
+ rk29_camera_platform_data.info[i].fival[j].type = V4L2_FRMIVAL_TYPE_DISCRETE;\r
+ j++;\r
+ #endif\r
+\r
+ #if CONFIG_SENSOR_SVGA_FPS_FIXED_0\r
+ rk29_camera_platform_data.info[i].fival[j].discrete.denominator = CONFIG_SENSOR_SVGA_FPS_FIXED_0;\r
+ rk29_camera_platform_data.info[i].fival[j].discrete.numerator= 1;\r
+ rk29_camera_platform_data.info[i].fival[j].index = 0;\r
+ rk29_camera_platform_data.info[i].fival[j].pixel_format = V4L2_PIX_FMT_NV12;\r
+ rk29_camera_platform_data.info[i].fival[j].width = 800;\r
+ rk29_camera_platform_data.info[i].fival[j].height = 600;\r
+ rk29_camera_platform_data.info[i].fival[j].type = V4L2_FRMIVAL_TYPE_DISCRETE;\r
+ j++;\r
+ #endif\r
+\r
+ #if CONFIG_SENSOR_720P_FPS_FIXED_0\r
+ rk29_camera_platform_data.info[i].fival[j].discrete.denominator = CONFIG_SENSOR_720P_FPS_FIXED_0;\r
+ rk29_camera_platform_data.info[i].fival[j].discrete.numerator= 1;\r
+ rk29_camera_platform_data.info[i].fival[j].index = 0;\r
+ rk29_camera_platform_data.info[i].fival[j].pixel_format = V4L2_PIX_FMT_NV12;\r
+ rk29_camera_platform_data.info[i].fival[j].width = 1280;\r
+ rk29_camera_platform_data.info[i].fival[j].height = 720;\r
+ rk29_camera_platform_data.info[i].fival[j].type = V4L2_FRMIVAL_TYPE_DISCRETE;\r
+ j++;\r
+ #endif\r
+\r
+ } else {\r
+ #if CONFIG_SENSOR_QCIF_FPS_FIXED_1\r
+ rk29_camera_platform_data.info[i].fival[j].discrete.denominator = CONFIG_SENSOR_QCIF_FPS_FIXED_1;\r
+ rk29_camera_platform_data.info[i].fival[j].discrete.numerator= 1;\r
+ rk29_camera_platform_data.info[i].fival[j].index = 0;\r
+ rk29_camera_platform_data.info[i].fival[j].pixel_format = V4L2_PIX_FMT_NV12;\r
+ rk29_camera_platform_data.info[i].fival[j].width = 176;\r
+ rk29_camera_platform_data.info[i].fival[j].height = 144;\r
+ rk29_camera_platform_data.info[i].fival[j].type = V4L2_FRMIVAL_TYPE_DISCRETE;\r
+ j++;\r
+ #endif\r
+\r
+ #if CONFIG_SENSOR_QVGA_FPS_FIXED_1\r
+ rk29_camera_platform_data.info[i].fival[j].discrete.denominator = CONFIG_SENSOR_QVGA_FPS_FIXED_1;\r
+ rk29_camera_platform_data.info[i].fival[j].discrete.numerator= 1;\r
+ rk29_camera_platform_data.info[i].fival[j].index = 0;\r
+ rk29_camera_platform_data.info[i].fival[j].pixel_format = V4L2_PIX_FMT_NV12;\r
+ rk29_camera_platform_data.info[i].fival[j].width = 320;\r
+ rk29_camera_platform_data.info[i].fival[j].height = 240;\r
+ rk29_camera_platform_data.info[i].fival[j].type = V4L2_FRMIVAL_TYPE_DISCRETE;\r
+ j++;\r
+ #endif\r
+\r
+ #if CONFIG_SENSOR_CIF_FPS_FIXED_1\r
+ rk29_camera_platform_data.info[i].fival[j].discrete.denominator = CONFIG_SENSOR_CIF_FPS_FIXED_1;\r
+ rk29_camera_platform_data.info[i].fival[j].discrete.numerator= 1;\r
+ rk29_camera_platform_data.info[i].fival[j].index = 0;\r
+ rk29_camera_platform_data.info[i].fival[j].pixel_format = V4L2_PIX_FMT_NV12;\r
+ rk29_camera_platform_data.info[i].fival[j].width = 352;\r
+ rk29_camera_platform_data.info[i].fival[j].height = 288;\r
+ rk29_camera_platform_data.info[i].fival[j].type = V4L2_FRMIVAL_TYPE_DISCRETE;\r
+ j++;\r
+ #endif\r
+\r
+ #if CONFIG_SENSOR_VGA_FPS_FIXED_1\r
+ rk29_camera_platform_data.info[i].fival[j].discrete.denominator = CONFIG_SENSOR_VGA_FPS_FIXED_1;\r
+ rk29_camera_platform_data.info[i].fival[j].discrete.numerator= 1;\r
+ rk29_camera_platform_data.info[i].fival[j].index = 0;\r
+ rk29_camera_platform_data.info[i].fival[j].pixel_format = V4L2_PIX_FMT_NV12;\r
+ rk29_camera_platform_data.info[i].fival[j].width = 640;\r
+ rk29_camera_platform_data.info[i].fival[j].height = 480;\r
+ rk29_camera_platform_data.info[i].fival[j].type = V4L2_FRMIVAL_TYPE_DISCRETE;\r
+ j++;\r
+ #endif\r
+\r
+ #if CONFIG_SENSOR_SVGA_FPS_FIXED_1\r
+ rk29_camera_platform_data.info[i].fival[j].discrete.denominator = CONFIG_SENSOR_SVGA_FPS_FIXED_1;\r
+ rk29_camera_platform_data.info[i].fival[j].discrete.numerator= 1;\r
+ rk29_camera_platform_data.info[i].fival[j].index = 0;\r
+ rk29_camera_platform_data.info[i].fival[j].pixel_format = V4L2_PIX_FMT_NV12;\r
+ rk29_camera_platform_data.info[i].fival[j].width = 800;\r
+ rk29_camera_platform_data.info[i].fival[j].height = 600;\r
+ rk29_camera_platform_data.info[i].fival[j].type = V4L2_FRMIVAL_TYPE_DISCRETE;\r
+ j++;\r
+ #endif\r
+\r
+ #if CONFIG_SENSOR_720P_FPS_FIXED_1\r
+ rk29_camera_platform_data.info[i].fival[j].discrete.denominator = CONFIG_SENSOR_720P_FPS_FIXED_1;\r
+ rk29_camera_platform_data.info[i].fival[j].discrete.numerator= 1;\r
+ rk29_camera_platform_data.info[i].fival[j].index = 0;\r
+ rk29_camera_platform_data.info[i].fival[j].pixel_format = V4L2_PIX_FMT_NV12;\r
+ rk29_camera_platform_data.info[i].fival[j].width = 1280;\r
+ rk29_camera_platform_data.info[i].fival[j].height = 720;\r
+ rk29_camera_platform_data.info[i].fival[j].type = V4L2_FRMIVAL_TYPE_DISCRETE;\r
+ j++;\r
+ #endif\r
+ }\r
+ \r
continue;\r
sensor_io_int_loop_end:\r
rk29_sensor_io_deinit(i);\r
//Configure Macro
/*
* Driver Version Note
-*v0.0.1 : this driver first support rk2918;
-*v0.0.2 : fix this driver support v4l2 format is V4L2_PIX_FMT_NV12 and V4L2_PIX_FMT_NV16,is not V4L2_PIX_FMT_YUV420
+*
+*v0.0.x : this driver is 2.6.32 kernel driver;
+*v0.1.x : this driver is 3.0.8 kernel driver;
+*
+*v0.x.1 : this driver first support rk2918;
+*v0.x.2 : fix this driver support v4l2 format is V4L2_PIX_FMT_NV12 and V4L2_PIX_FMT_NV16,is not V4L2_PIX_FMT_YUV420
* and V4L2_PIX_FMT_YUV422P;
-*v0.0.3 : this driver support VIDIOC_ENUM_FRAMEINTERVALS;
-*v0.0.4 : this driver support digital zoom;
+*v0.x.3 : this driver support VIDIOC_ENUM_FRAMEINTERVALS;
+*v0.x.4 : this driver support digital zoom;
+*v0.x.5 : this driver support test framerate and query framerate from board file configuration;
*/
-#define RK29_CAM_VERSION_CODE KERNEL_VERSION(0, 1, 3)
+#define RK29_CAM_VERSION_CODE KERNEL_VERSION(0, 1, 5)
/* limit to rk29 hardware capabilities */
#define RK29_CAM_BUS_PARAM (SOCAM_MASTER |\
char orientation[5];
strlcpy(cap->card, dev_name(pcdev->icd->pdev), sizeof(cap->card));
- if (strcmp(dev_name(pcdev->icd->pdev), pcdev->pdata->gpio_res[0].dev_name) == 0) {
- sprintf(orientation,"-%d",pcdev->pdata->gpio_res[0].orientation);
+ if (strcmp(dev_name(pcdev->icd->pdev), pcdev->pdata->info[0].dev_name) == 0) {
+ sprintf(orientation,"-%d",pcdev->pdata->info[0].orientation);
} else {
- sprintf(orientation,"-%d",pcdev->pdata->gpio_res[1].orientation);
+ sprintf(orientation,"-%d",pcdev->pdata->info[1].orientation);
}
strcat(cap->card,orientation);
cap->version = RK29_CAM_VERSION_CODE;
struct soc_camera_host *ici = to_soc_camera_host(icd->dev.parent);
struct rk29_camera_dev *pcdev = ici->priv;
struct rk29_camera_frmivalenum *fival_list = NULL;
- int i,ret = 0;
+ struct v4l2_frmivalenum *fival_head;
+ int i,ret = 0,index;
- for (i=0; i<2; i++) {
- if (pcdev->icd_frmival[i].icd == icd) {
- fival_list = pcdev->icd_frmival[i].fival_list;
+ index = fival->index & 0x00ffffff;
+ if ((fival->index & 0xff000000) == 0xff000000) { /* ddl@rock-chips.com: detect framerate */
+ for (i=0; i<2; i++) {
+ if (pcdev->icd_frmival[i].icd == icd) {
+ fival_list = pcdev->icd_frmival[i].fival_list;
+ }
+ }
+
+ if (fival_list != NULL) {
+ i = 0;
+ while (fival_list != NULL) {
+ if ((fival->pixel_format == fival_list->fival.pixel_format)
+ && (fival->height == fival_list->fival.height)
+ && (fival->width == fival_list->fival.width)) {
+ if (i == index)
+ break;
+ i++;
+ }
+ fival_list = fival_list->nxt;
+ }
+
+ if ((i==index) && (fival_list != NULL)) {
+ memcpy(fival, &fival_list->fival, sizeof(struct v4l2_frmivalenum));
+ } else {
+ ret = -EINVAL;
+ }
+ } else {
+ RK29CAMERA_TR("%s: fival_list is NULL\n",__FUNCTION__);
+ ret = -EINVAL;
+ }
+ } else {
+ if (strcmp(dev_name(pcdev->icd->pdev),pcdev->pdata->info[0].dev_name) == 0) {
+ fival_head = pcdev->pdata->info[0].fival;
+ } else {
+ fival_head = pcdev->pdata->info[1].fival;
}
- }
-
- if (fival_list != NULL) {
i = 0;
- while (fival_list != NULL) {
- if ((fival->pixel_format == fival_list->fival.pixel_format)
- && (fival->height == fival_list->fival.height)
- && (fival->width == fival_list->fival.width)) {
- if (i == fival->index)
+ while (fival_head->width && fival_head->height) {
+ if ((fival->pixel_format == fival_head->pixel_format)
+ && (fival->height == fival_head->height)
+ && (fival->width == fival_head->width)) {
+ if (i == index) {
break;
+ }
i++;
- }
- fival_list = fival_list->nxt;
+ }
+ fival_head++;
}
-
- if ((i==fival->index) && (fival_list != NULL)) {
- memcpy(fival, &fival_list->fival, sizeof(struct v4l2_frmivalenum));
+
+ if ((i == index) && (fival->height == fival_head->height) && (fival->width == fival_head->width)) {
+ memcpy(fival, fival_head, sizeof(struct v4l2_frmivalenum));
+ RK29CAMERA_DG("%s %dx%d@%c%c%c%c framerate : %d/%d\n", dev_name(&rk29_camdev_info_ptr->icd->dev),
+ fival->width, fival->height,
+ fival->pixel_format & 0xFF, (fival->pixel_format >> 8) & 0xFF,
+ (fival->pixel_format >> 16) & 0xFF, (fival->pixel_format >> 24),
+ fival->discrete.denominator,fival->discrete.numerator);
} else {
+ if (index == 0)
+ RK29CAMERA_TR("%s have not catch %d%d@%c%c%c%c index(%d) framerate\n",dev_name(&rk29_camdev_info_ptr->icd->dev),
+ fival->width,fival->height,
+ fival->pixel_format & 0xFF, (fival->pixel_format >> 8) & 0xFF,
+ (fival->pixel_format >> 16) & 0xFF, (fival->pixel_format >> 24),
+ index);
+ else
+ RK29CAMERA_DG("%s have not catch %d%d@%c%c%c%c index(%d) framerate\n",dev_name(&rk29_camdev_info_ptr->icd->dev),
+ fival->width,fival->height,
+ fival->pixel_format & 0xFF, (fival->pixel_format >> 8) & 0xFF,
+ (fival->pixel_format >> 16) & 0xFF, (fival->pixel_format >> 24),
+ index);
ret = -EINVAL;
}
- } else {
- RK29CAMERA_TR("%s: fival_list is NULL\n",__FUNCTION__);
- ret = -EINVAL;
}
return ret;