camera: Improve test framerate method and version update to v0.x.6
authorddl <ddl@rock-chips.com>
Wed, 1 Feb 2012 08:36:41 +0000 (16:36 +0800)
committerddl <ddl@rock-chips.com>
Wed, 1 Feb 2012 08:37:17 +0000 (16:37 +0800)
arch/arm/mach-rk29/board-rk29-ddr3sdk.c
arch/arm/mach-rk29/board-rk29-k97.c
drivers/media/video/rk29_camera.c
drivers/media/video/rk29_camera_oneframe.c

index 7ac18e91acc590257edee825cb3dd86bd82d0d26..1efc7f82f460fe4a0e7e21af18b9ff5cf8439fed 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_480P_FPS_FIXED_0      15
-#define CONFIG_SENSOR_SVGA_FPS_FIXED_0      15
-#define CONFIG_SENSOR_720P_FPS_FIXED_0      30
+#define CONFIG_SENSOR_QCIF_FPS_FIXED_0      15000
+#define CONFIG_SENSOR_QVGA_FPS_FIXED_0      15000
+#define CONFIG_SENSOR_CIF_FPS_FIXED_0       15000
+#define CONFIG_SENSOR_VGA_FPS_FIXED_0       15000
+#define CONFIG_SENSOR_480P_FPS_FIXED_0      15000
+#define CONFIG_SENSOR_SVGA_FPS_FIXED_0      15000
+#define CONFIG_SENSOR_720P_FPS_FIXED_0      30000
 
 #define CONFIG_SENSOR_1 RK29_CAM_SENSOR_OV2659                      /* front camera sensor */
 #define CONFIG_SENSOR_IIC_ADDR_1           0x60
 #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_480P_FPS_FIXED_1      15
-#define CONFIG_SENSOR_SVGA_FPS_FIXED_1      15
-#define CONFIG_SENSOR_720P_FPS_FIXED_1      30
+#define CONFIG_SENSOR_QCIF_FPS_FIXED_1      15000
+#define CONFIG_SENSOR_QVGA_FPS_FIXED_1      15000
+#define CONFIG_SENSOR_CIF_FPS_FIXED_1       15000
+#define CONFIG_SENSOR_VGA_FPS_FIXED_1       15000
+#define CONFIG_SENSOR_480P_FPS_FIXED_1      15000
+#define CONFIG_SENSOR_SVGA_FPS_FIXED_1      15000
+#define CONFIG_SENSOR_720P_FPS_FIXED_1      30000
 
 #endif  //#ifdef CONFIG_VIDEO_RK29
 /*---------------- Camera Sensor Configuration Macro End------------------------*/
index a2a6aee5b00e4c8a3bf05e35073435459be07317..6e9f58684b649d2fab4b623d6c681ca0653f3dd3 100755 (executable)
 #define CONFIG_SENSOR_FLASHACTIVE_LEVEL_0 RK29_CAM_FLASHACTIVE_L
 #endif
 
-#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_480P_FPS_FIXED_0      0
-#define CONFIG_SENSOR_SVGA_FPS_FIXED_0      15
-#define CONFIG_SENSOR_720P_FPS_FIXED_0      0
+#define CONFIG_SENSOR_QCIF_FPS_FIXED_0      12504
+#define CONFIG_SENSOR_QVGA_FPS_FIXED_0      12504
+#define CONFIG_SENSOR_CIF_FPS_FIXED_0       12504
+#define CONFIG_SENSOR_VGA_FPS_FIXED_0       12504
+#define CONFIG_SENSOR_480P_FPS_FIXED_0      12504
+#define CONFIG_SENSOR_SVGA_FPS_FIXED_0      12504
+#define CONFIG_SENSOR_720P_FPS_FIXED_0      6256
 #ifdef CONFIG_SOC_CAMERA_OV9665
 #define CONFIG_SENSOR_1 RK29_CAM_SENSOR_OV9665                      /* front camera sensor */
 #define CONFIG_SENSOR_IIC_ADDR_1            0x60
 #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_480P_FPS_FIXED_1      0
-#define CONFIG_SENSOR_SVGA_FPS_FIXED_1      15
-#define CONFIG_SENSOR_720P_FPS_FIXED_1      0
+#define CONFIG_SENSOR_QCIF_FPS_FIXED_1      12504
+#define CONFIG_SENSOR_QVGA_FPS_FIXED_1      12504
+#define CONFIG_SENSOR_CIF_FPS_FIXED_1       12504
+#define CONFIG_SENSOR_VGA_FPS_FIXED_1       12504
+#define CONFIG_SENSOR_480P_FPS_FIXED_1      12504
+#define CONFIG_SENSOR_SVGA_FPS_FIXED_1      12504
+#define CONFIG_SENSOR_720P_FPS_FIXED_1      6256
 #endif  //#ifdef CONFIG_VIDEO_RK29
 /*---------------- Camera Sensor Configuration Macro End------------------------*/
 #include "../../../drivers/media/video/rk29_camera.c"
index 83678fd25809deddfdfd44ee84f13023c79b3a50..e8c4898f4f94a216846597881488c83658f3c051 100755 (executable)
@@ -1341,7 +1341,7 @@ static int rk29_sensor_io_init(void)
             \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].discrete.numerator= 1000;\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
@@ -1352,7 +1352,7 @@ static int rk29_sensor_io_init(void)
 \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].discrete.numerator= 1000;\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
@@ -1363,7 +1363,7 @@ static int rk29_sensor_io_init(void)
 \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].discrete.numerator= 1000;\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
@@ -1374,7 +1374,7 @@ static int rk29_sensor_io_init(void)
 \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].discrete.numerator= 1000;\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
@@ -1385,7 +1385,7 @@ static int rk29_sensor_io_init(void)
 \r
             #if CONFIG_SENSOR_480P_FPS_FIXED_0\r
             rk29_camera_platform_data.info[i].fival[j].discrete.denominator = CONFIG_SENSOR_480P_FPS_FIXED_0;\r
-            rk29_camera_platform_data.info[i].fival[j].discrete.numerator= 1;\r
+            rk29_camera_platform_data.info[i].fival[j].discrete.numerator= 1000;\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 = 720;\r
@@ -1396,7 +1396,7 @@ static int rk29_sensor_io_init(void)
 \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].discrete.numerator= 1000;\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
@@ -1407,7 +1407,7 @@ static int rk29_sensor_io_init(void)
 \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].discrete.numerator= 1000;\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
@@ -1419,7 +1419,7 @@ static int rk29_sensor_io_init(void)
         } 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].discrete.numerator= 1000;\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
@@ -1430,7 +1430,7 @@ static int rk29_sensor_io_init(void)
 \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].discrete.numerator= 1000;\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
@@ -1441,7 +1441,7 @@ static int rk29_sensor_io_init(void)
 \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].discrete.numerator= 1000;\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
@@ -1452,7 +1452,7 @@ static int rk29_sensor_io_init(void)
 \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].discrete.numerator= 1000;\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
@@ -1463,7 +1463,7 @@ static int rk29_sensor_io_init(void)
 \r
             #if CONFIG_SENSOR_480P_FPS_FIXED_1\r
             rk29_camera_platform_data.info[i].fival[j].discrete.denominator = CONFIG_SENSOR_480P_FPS_FIXED_1;\r
-            rk29_camera_platform_data.info[i].fival[j].discrete.numerator= 1;\r
+            rk29_camera_platform_data.info[i].fival[j].discrete.numerator= 1000;\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 = 720;\r
@@ -1474,7 +1474,7 @@ static int rk29_sensor_io_init(void)
 \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].discrete.numerator= 1000;\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
@@ -1485,7 +1485,7 @@ static int rk29_sensor_io_init(void)
 \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].discrete.numerator= 1000;\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
index cabaa4c3c0b3dfaefe914942f96468f4633850a6..53232ef559e1d6babf8098deb8a8deedaf71377f 100755 (executable)
@@ -147,8 +147,9 @@ module_param(debug, int, S_IRUGO|S_IWUSR);
 *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;
+*v0.x.6 : this driver improve test framerate method;
 */
-#define RK29_CAM_VERSION_CODE KERNEL_VERSION(0, 1, 5)
+#define RK29_CAM_VERSION_CODE KERNEL_VERSION(0, 1, 6)
 
 /* limit to rk29 hardware capabilities */
 #define RK29_CAM_BUS_PARAM   (SOCAM_MASTER |\
@@ -169,6 +170,7 @@ module_param(debug, int, S_IRUGO|S_IWUSR);
 #define RK29_CAM_H_MAX        2764
 #define RK29_CAM_FRAME_INVAL_INIT 3
 #define RK29_CAM_FRAME_INVAL_DC 3          /* ddl@rock-chips.com :  */
+#define RK29_CAM_FRAME_MEASURE  5
 
 #define RK29_CAM_AXI   0
 #define RK29_CAM_AHB   1
@@ -251,12 +253,15 @@ struct rk29_camera_dev
     int frame_inval;           /* ddl@rock-chips.com : The first frames is invalidate  */
     unsigned int irq;
        unsigned int fps;
+    unsigned long frame_interval;
        unsigned int pixfmt;
        unsigned int vipmem_phybase;
        unsigned int vipmem_size;
        unsigned int vipmem_bsize;
        int host_width;
        int host_height;
+    int icd_width;
+    int icd_height;
 
     struct rk29camera_platform_data *pdata;
     struct resource            *res;
@@ -600,15 +605,20 @@ static irqreturn_t rk29_camera_irq(int irq, void *data)
     struct rk29_camera_dev *pcdev = data;
     struct videobuf_buffer *vb;
        struct rk29_camera_work *wk;
+    static struct timeval first_tv;
+    struct timeval tv;
 
     read_vip_reg(RK29_VIP_INT_STS);    /* clear vip interrupte single  */
     /* ddl@rock-chps.com : Current VIP is run in One Frame Mode, Frame 1 is validate */
     if (read_vip_reg(RK29_VIP_FB_SR) & 0x01) {
+        if (!pcdev->fps) {
+            do_gettimeofday(&first_tv);            
+        }
                pcdev->fps++;
                if (!pcdev->active)
                        goto RK29_CAMERA_IRQ_END;
 
-        if (pcdev->frame_inval>0) {
+        if (pcdev->frame_inval>0) {            
             pcdev->frame_inval--;
             rk29_videobuf_capture(pcdev->active);
             goto RK29_CAMERA_IRQ_END;
@@ -617,6 +627,12 @@ static irqreturn_t rk29_camera_irq(int irq, void *data)
             pcdev->frame_inval = 0;
         }
 
+        if(pcdev->fps == RK29_CAM_FRAME_MEASURE) {
+            do_gettimeofday(&tv);            
+            pcdev->frame_interval = ((tv.tv_sec*1000000 + tv.tv_usec) - (first_tv.tv_sec*1000000 + first_tv.tv_usec))
+                                    /(RK29_CAM_FRAME_MEASURE-1);
+        }
+
         vb = pcdev->active;
                /* ddl@rock-chips.com : this vb may be deleted from queue */
                if ((vb->state == VIDEOBUF_QUEUED) || (vb->state == VIDEOBUF_ACTIVE)) {
@@ -1252,7 +1268,7 @@ static int rk29_camera_set_fmt(struct soc_camera_device *icd,
     struct v4l2_pix_format *pix = &f->fmt.pix;
     struct v4l2_mbus_framefmt mf;
     struct v4l2_rect rect;
-    int ret,usr_w,usr_h;
+    int ret,usr_w,usr_h,icd_width,icd_height;
     int stream_on = 0;
 
        usr_w = pix->width;
@@ -1286,7 +1302,9 @@ static int rk29_camera_set_fmt(struct soc_camera_device *icd,
 
        if (mf.code != xlate->code)
                return -EINVAL;
-
+    
+    icd_width = mf.width;
+    icd_height = mf.height;
        #ifdef CONFIG_VIDEO_RK29_WORK_IPP
        if ((mf.width != usr_w) || (mf.height != usr_h)) {
         if (unlikely((mf.width <16) || (mf.width > 8190) || (mf.height < 16) || (mf.height > 8190))) {
@@ -1345,6 +1363,8 @@ static int rk29_camera_set_fmt(struct soc_camera_device *icd,
                if (CAM_IPPWORK_IS_EN()) {
                        BUG_ON(pcdev->vipmem_phybase == 0);
                }
+        pcdev->icd_width = icd_width;
+        pcdev->icd_height = icd_height;
 
         pix->width = mf.width;
        pix->height = mf.height;
@@ -1681,22 +1701,17 @@ static enum hrtimer_restart rk29_camera_fps_func(struct hrtimer *timer)
                 && (fival_nxt->fival.height == rk29_camdev_info_ptr->icd->user_height)
                 && (fival_nxt->fival.width == rk29_camdev_info_ptr->icd->user_width))
                 || (fival_nxt->fival.discrete.denominator == 0)) {
-
-                if (fival_nxt->fival.discrete.denominator == 0) {
-                    fival_nxt->fival.index = 0;
-                    fival_nxt->fival.width = rk29_camdev_info_ptr->icd->user_width;
-                    fival_nxt->fival.height= rk29_camdev_info_ptr->icd->user_height;
-                    fival_nxt->fival.pixel_format = rk29_camdev_info_ptr->pixfmt;
-                    fival_nxt->fival.discrete.denominator = rk29_camdev_info_ptr->fps+2;
-                    fival_nxt->fival.discrete.numerator = 1;
-                    fival_nxt->fival.type = V4L2_FRMIVAL_TYPE_DISCRETE;
-                } else {                
-                    if (abs(rk29_camdev_info_ptr->fps + 2 - fival_nxt->fival.discrete.numerator) > 2) {
-                        fival_nxt->fival.discrete.denominator = rk29_camdev_info_ptr->fps+2;
-                        fival_nxt->fival.discrete.numerator = 1;
-                        fival_nxt->fival.type = V4L2_FRMIVAL_TYPE_DISCRETE;
-                    }
-                }
+                
+                fival_nxt->fival.index = 0;
+                fival_nxt->fival.width = rk29_camdev_info_ptr->icd->user_width;
+                fival_nxt->fival.height= rk29_camdev_info_ptr->icd->user_height;
+                fival_nxt->fival.pixel_format = rk29_camdev_info_ptr->pixfmt;
+                fival_nxt->fival.discrete.denominator = rk29_camdev_info_ptr->frame_interval;                
+                fival_nxt->fival.reserved[1] = (rk29_camdev_info_ptr->icd_width<<16)
+                                                    |(rk29_camdev_info_ptr->icd_height);
+                fival_nxt->fival.discrete.numerator = 1000000;
+                fival_nxt->fival.type = V4L2_FRMIVAL_TYPE_DISCRETE;
+                
                 rec_flag = 1;
                 fival_rec = fival_nxt;
             }
@@ -1712,8 +1727,12 @@ static enum hrtimer_restart rk29_camera_fps_func(struct hrtimer *timer)
                 fival_pre->nxt->fival.height= rk29_camdev_info_ptr->icd->user_height;
                 fival_pre->nxt->fival.pixel_format = rk29_camdev_info_ptr->pixfmt;
 
-                fival_pre->nxt->fival.discrete.denominator = rk29_camdev_info_ptr->fps+2;
-                fival_pre->nxt->fival.discrete.numerator = 1;
+                fival_pre->nxt->fival.discrete.denominator = rk29_camdev_info_ptr->frame_interval;
+                
+                fival_pre->nxt->fival.reserved[1] = (rk29_camdev_info_ptr->icd_width<<16)
+                                                    |(rk29_camdev_info_ptr->icd_height);
+                
+                fival_pre->nxt->fival.discrete.numerator = 1000000;
                 fival_pre->nxt->fival.type = V4L2_FRMIVAL_TYPE_DISCRETE;
                 rec_flag = 1;
                 fival_rec = fival_pre->nxt;
@@ -1731,7 +1750,7 @@ static int rk29_camera_s_stream(struct soc_camera_device *icd, int enable)
        int ret;
 
        WARN_ON(pcdev->icd != icd);
-
+    pcdev->frame_interval = 0;
        vip_ctrl_val = read_vip_reg(RK29_VIP_CTRL);
        if (enable) {
                pcdev->fps = 0;