camera: support query framerate and support detect framerate, version update to v0.1.5
authorddl <ddl@rock-chips.com>
Fri, 2 Dec 2011 09:34:39 +0000 (17:34 +0800)
committerddl <ddl@rock-chips.com>
Fri, 2 Dec 2011 09:35:07 +0000 (17:35 +0800)
arch/arm/mach-rk29/board-rk29-ddr3sdk.c
arch/arm/mach-rk29/board-rk29-phonesdk.c
arch/arm/mach-rk29/include/mach/rk29_camera.h
drivers/media/video/rk29_camera.c
drivers/media/video/rk29_camera_oneframe.c

index a1ee2b087fba6102923269dcb0b0e1cd57b3403f..43b9faebed037eed5599aa3e2da6fd180aeed2f3 100755 (executable)
 #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"
index 60ee21631e41eb40404052285335fae0d5bd18cc..247b2985610d134fae51ecd537e0700b959693fe 100755 (executable)
 #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"
index 855e2396fee47220346a0659ca98ac8dcfb2fd09..8f7b6f8688dbd538eca7fabf77a3190c4bbc1248 100755 (executable)
@@ -22,6 +22,8 @@
 #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
 
@@ -160,7 +162,7 @@ struct rk29camera_gpio_res {
        unsigned int gpio_flash;
     unsigned int gpio_flag;
        unsigned int gpio_init;
-    unsigned int orientation;
+    
     const char *dev_name;
 };
 
@@ -169,12 +171,18 @@ struct rk29camera_mem_res {
        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 {
index 160dad9947b6c25fa850d39e0bc5ee866426007d..1c957a71687deb131717ff6714e6010fa94f0255 100755 (executable)
@@ -96,8 +96,7 @@ static struct rk29camera_platform_data rk29_camera_platform_data = {
             .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
@@ -106,7 +105,6 @@ static struct rk29camera_platform_data rk29_camera_platform_data = {
             .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
@@ -115,8 +113,17 @@ static struct rk29camera_platform_data rk29_camera_platform_data = {
            .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
@@ -1216,7 +1223,7 @@ static int sensor_flash_default_cb (struct rk29camera_gpio_res *res, int on)
 \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
@@ -1322,7 +1329,149 @@ static int rk29_sensor_io_init(void)
 \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
index 14eddd0af8f71679f1f440875531ffc4146e31bb..cabaa4c3c0b3dfaefe914942f96468f4633850a6 100755 (executable)
@@ -137,13 +137,18 @@ module_param(debug, int, S_IRUGO|S_IWUSR);
 //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 |\
@@ -1532,10 +1537,10 @@ static int rk29_camera_querycap(struct soc_camera_host *ici,
     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;
@@ -1749,35 +1754,80 @@ int rk29_camera_enum_frameintervals(struct soc_camera_device *icd, struct v4l2_f
     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;