camera(v0.4.1d): sync pingpong mode
authorddl <ddl@rock-chips.com>
Wed, 16 Jan 2013 08:28:16 +0000 (16:28 +0800)
committerddl <ddl@rock-chips.com>
Wed, 16 Jan 2013 08:28:41 +0000 (16:28 +0800)
drivers/media/video/rk30_camera_pingpong.c

index 36bb8c05d0be409b5ab1862ea74d78869d464317..d23f2307723fabc0a12defc44b21f6a051ccb160 100755 (executable)
@@ -276,8 +276,20 @@ module_param(debug, int, S_IRUGO|S_IWUSR);
 *         1. support rk3066b;
 *v0.4.15:
 *         1. cif work on pingping mode;
+*v0.x.17: 
+*         1. support 8Mega picture;
+*v0.x.19:
+*         1. invalidate the limit which scale is invalidat when scale ratio > 2;
+*v0.x.1b: 1. fix oops bug  when using arm to do scale_crop if preview buffer is not allocated correctly 
+          2. rk_camera_set_fmt will called twice, optimize the procedure. at the first time call ,just to do the sensor init.
+
+*v0.x.1c:
+*         1. fix query resolution error;
+*v0.x.1d: 
+*         1. add mv9335+ov5650 driver;
+*         2. fix 2928 digitzoom erro(arm crop scale) of selected zone;
 */
-#define RK_CAM_VERSION_CODE KERNEL_VERSION(0, 4, 0x15)
+#define RK_CAM_VERSION_CODE KERNEL_VERSION(0, 4, 0x1d)
 
 /* limit to rk29 hardware capabilities */
 #define RK_CAM_BUS_PARAM   (SOCAM_MASTER |\
@@ -535,6 +547,7 @@ static int rk_videobuf_setup(struct videobuf_queue *vq, unsigned int *count,
                                RKCAMERA_TR("\n %s vbinfo kmalloc fail\n", __FUNCTION__);
                                BUG();
                        }
+            memset(pcdev->vbinfo,0,sizeof(struct rk29_camera_vbinfo)*(*count));
                        pcdev->vbinfo_count = *count;
         }
 #endif        
@@ -574,8 +587,8 @@ static int rk_videobuf_prepare(struct videobuf_queue *vq, struct videobuf_buffer
     int ret;
     int bytes_per_line = soc_mbus_bytes_per_line(icd->user_width,
                                                icd->current_fmt->host_fmt);
-       if (bytes_per_line < 0)
-               return bytes_per_line;
+       if ((bytes_per_line < 0) || (vb->boff == 0))
+               return -EINVAL;
 
     buf = container_of(vb, struct rk_camera_buffer, vb);
 
@@ -1052,8 +1065,8 @@ static int rk_camera_scale_crop_arm(struct work_struct *work)
     cropW = pcdev->zoominfo.a.c.width;
     cropH = pcdev->zoominfo.a.c.height;
        
-    psY = psY + (srcW-cropW);
-    psUV = psUV + (srcW-cropW); 
+    psY = psY + (srcW-cropW)/2;
+    psUV = psUV + (srcW-cropW)/2
     
     vb_info = pcdev->vbinfo+vb->i; 
     dst_phy = vb_info->phy_addr;
@@ -1200,7 +1213,7 @@ static irqreturn_t rk_camera_irq(int irq, void *data)
 
     
     if(pcdev->stop_cif == true) {
-        RKCAMERA_TR("%s(%d): cif has stopped by app,needn't to deal this irq\n",__FUNCTION__,__LINE__);
+        //RKCAMERA_TR("%s(%d): cif has stopped by app,needn't to deal this irq\n",__FUNCTION__,__LINE__);
        write_cif_reg(pcdev->base,CIF_CIF_INTSTAT,0xFFFFFFFF);  /* clear vip interrupte single  */
         return IRQ_HANDLED;
     }
@@ -1858,7 +1871,6 @@ static void rk_camera_setup_format(struct soc_camera_device *icd, __u32 host_pix
        cif_crop = (rect->left+ (rect->top<<16));
        cif_fs  = ((rect->width ) + (rect->height<<16));
     
-       RKCAMERA_TR("%s..%d.. \n",__FUNCTION__,__LINE__);
 
        write_cif_reg(pcdev->base,CIF_CIF_CROP, cif_crop);
        write_cif_reg(pcdev->base,CIF_CIF_SET_SIZE, cif_fs);
@@ -2018,7 +2030,7 @@ static int rk_camera_set_fmt(struct soc_camera_device *icd,
 
        usr_w = pix->width;
        usr_h = pix->height;
-    RKCAMERA_TR("%s enter width:%d  height:%d\n",__FUNCTION__,usr_w,usr_h);
+    RKCAMERA_DG("%s enter width:%d  height:%d\n",__FUNCTION__,usr_w,usr_h);
     xlate = soc_camera_xlate_by_fourcc(icd, pix->pixelformat);
     if (!xlate) {
         dev_err(dev, "Format %x not found\n", pix->pixelformat);
@@ -2030,6 +2042,7 @@ static int rk_camera_set_fmt(struct soc_camera_device *icd,
     if (pcdev->icd_init == 0) {
         v4l2_subdev_call(sd,core, init, 0); 
         pcdev->icd_init = 1;
+        return 0;
     }
     stream_on = read_cif_reg(pcdev->base,CIF_CIF_CTRL);
     if (stream_on & ENABLE_CAPTURE)
@@ -2189,6 +2202,8 @@ static bool rk_camera_fmt_capturechk(struct v4l2_format *f)
                ret = true;
        } else if ((f->fmt.pix.width == 2592) && (f->fmt.pix.height == 1944)) {
                ret = true;
+       } else if ((f->fmt.pix.width == 3264) && (f->fmt.pix.height == 2448)) {
+               ret = true;
        }
 
        if (ret == true)
@@ -2212,8 +2227,7 @@ static int rk_camera_try_fmt(struct soc_camera_device *icd,
     
        usr_w = pix->width;
        usr_h = pix->height;
-       RKCAMERA_DG("%s enter width:%d  height:%d\n",__FUNCTION__,usr_w,usr_h);
-
+    
     xlate = soc_camera_xlate_by_fourcc(icd, pixfmt);
     if (!xlate) {
         dev_err(icd->dev.parent, "Format (%c%c%c%c) not found\n", pixfmt & 0xFF, (pixfmt >> 8) & 0xFF,
@@ -2239,16 +2253,31 @@ static int rk_camera_try_fmt(struct soc_camera_device *icd,
                return pix->bytesperline;
 
     /* limit to sensor capabilities */
+    memset(&mf,0x00,sizeof(struct v4l2_mbus_framefmt));
        mf.width        = pix->width;
        mf.height       = pix->height;
        mf.field        = pix->field;
        mf.colorspace   = pix->colorspace;
        mf.code         = xlate->code;
+    /* ddl@rock-chips.com : It is query max resolution only. */
+    if ((usr_w == 10000) && (usr_h == 10000)) {
+        mf.reserved[6] = 0xfefe5a5a;
+    }
 
        ret = v4l2_subdev_call(sd, video, try_mbus_fmt, &mf);
        if (ret < 0)
                goto RK_CAMERA_TRY_FMT_END;
-    RKCAMERA_DG("%s mf.width:%d  mf.height:%d\n",__FUNCTION__,mf.width,mf.height);
+    
+       //query resolution.
+       if((usr_w == 10000) && (usr_h == 10000)) {
+               pix->width = mf.width;
+        pix->height = mf.height;
+        RKCAMERA_DG("%s: Sensor resolution : %dx%d\n",__FUNCTION__,mf.width,mf.height);
+               goto RK_CAMERA_TRY_FMT_END;
+       } else {
+        RKCAMERA_DG("%s: user demand: %dx%d  sensor output: %dx%d \n",__FUNCTION__,usr_w,usr_h,mf.width,mf.height);
+       }
+    
        #ifdef CONFIG_VIDEO_RK29_WORK_IPP       
        if ((mf.width != usr_w) || (mf.height != usr_h)) {
         bytes_per_line_host = soc_mbus_bytes_per_line(mf.width,icd->current_fmt->host_fmt); 
@@ -2266,14 +2295,16 @@ static int rk_camera_try_fmt(struct soc_camera_device *icd,
             pix->width = mf.width;
             pix->height = mf.height;            
                }
-        
+        /* ddl@rock-chips.com: Invalidate these code, because sensor need interpolate */
+        #if 0     
         if ((mf.width < usr_w) || (mf.height < usr_h)) {
             if (((usr_w>>1) > mf.width) || ((usr_h>>1) > mf.height)) {
                 RKCAMERA_TR("The aspect ratio(%dx%d/%dx%d) is bigger than 2 !\n",mf.width,mf.height,usr_w,usr_h);
                 pix->width = mf.width;
                 pix->height = mf.height;
             }
-        }        
+        }    
+        #endif
        }
        #else
        //need to change according to crop and scale capablicity