/* update registers:
 *	PREVIEW path:
 *		CIPRSCPRERATIO
 *		CIPRSCPREDST
 *		CIPRSCCTRL
 *	CODEC path:
 *		CICOSCPRERATIO
 *		CICOSCPREDST
 *		CICOSCCTRL
 */
static void __inline__ update_target_zoom_regs(struct s3c2440camif_dev * pdev)
{
	u32 preHratio, preVratio;
	u32 Hshift, Vshift;
	u32 shfactor;
	u32 preDstWidth, preDstHeight;
	u32 Hscale, Vscale;
	u32 mainHratio, mainVratio;

	u32 ciprscpreratio;
	u32 ciprscpredst;
	u32 ciprscctrl;


		/* CIPRSCPRERATIO. */
		calc_prescaler_ratio_shift(pdev->wndHsize, pdev->preTargetHsize,
									&preHratio, &Hshift);
		calc_prescaler_ratio_shift(pdev->wndVsize, pdev->preTargetVsize,
									&preVratio, &Vshift);

		shfactor = 10 - (Hshift + Vshift);

		ciprscpreratio = (shfactor<<28)		// shift factor for preview pre-scaler
						 |(preHratio<<16)	// horizontal ratio of preview pre-scaler
						 |(preVratio<<0);	// vertical ratio of preview pre-scaler
		iowrite32(ciprscpreratio, S3C244X_CIPRSCPRERATIO);

		/* CIPRSCPREDST. */
		preDstWidth = pdev->wndHsize / preHratio;
		preDstHeight = pdev->wndVsize / preVratio;
		ciprscpredst = (preDstWidth<<16)	// destination width for preview pre-scaler
					   |(preDstHeight<<0);	// destination height for preview pre-scaler
		iowrite32(ciprscpredst, S3C244X_CIPRSCPREDST);

		/* CIPRSCCTRL. */
		Hscale = (pdev->wndHsize >= pdev->preTargetHsize)?0:1;
		Vscale = (pdev->wndVsize >= pdev->preTargetVsize)?0:1;
		mainHratio = (pdev->wndHsize<<8)/(pdev->preTargetHsize<<Hshift);
		mainVratio = (pdev->wndVsize<<8)/(pdev->preTargetVsize<<Vshift);
		ciprscctrl = ioread32(S3C244X_CIPRSCCTRL);
		ciprscctrl &= (1<<30)|(1<<15);	// keep preview image format (RGB565 or RGB24), and preview scaler start state.
		ciprscctrl |= (1<<31)	// this bit should be always 1.
					  |(Hscale<<29)		// ???, horizontal scale up/down.
					  |(Vscale<<28)		// ???, vertical scale up/down.
					  |(mainHratio<<16)	// horizontal scale ratio for preview main-scaler
					  |(mainVratio<<0);	// vertical scale ratio for preview main-scaler
		iowrite32(ciprscctrl, S3C244X_CIPRSCCTRL);
}
Beispiel #2
0
/* update registers:
 *	PREVIEW path:
 *		CIPRSCPRERATIO
 *		CIPRSCPREDST
 *		CIPRSCCTRL
 *	CODEC path:
 *		CICOSCPRERATIO
 *		CICOSCPREDST
 *		CICOSCCTRL
 */
static void __inline__ update_target_zoom_regs(s3c2440camif_dev * pdev)
{
    u32 preHratio, preVratio;
    u32 coHratio, coVratio;
    u32 Hshift, Vshift;
    u32 shfactor;
    
    u32 preDstWidth, preDstHeight;
    u32 coDstWidth, coDstHeight;
    u32 Hscale, Vscale;
    u32 mainHratio, mainVratio;

    u32 ciprscpreratio;
    u32 ciprscpredst;
    u32 ciprscctrl;

    u32 cicoscpreratio;
    u32 cicoscpredst;
    u32 cicoscctrl;


    #if 0
    /* CIPRSCPRERATIO. */
    calc_prescaler_ratio_shift(pdev->wndHsize, pdev->preTargetHsize,
                  &preHratio, &Hshift);
                  
    calc_prescaler_ratio_shift(pdev->wndVsize, pdev->preTargetVsize,
                  &preVratio, &Vshift);

    shfactor = 10 - (Hshift + Vshift);

    ciprscpreratio = (shfactor<<28)   // shift factor for preview pre-scaler
             |(preHratio<<16) // horizontal ratio of preview pre-scaler
             |(preVratio<<0); // vertical ratio of preview pre-scaler
             
    iowrite32(ciprscpreratio, S3C244X_CIPRSCPRERATIO);
    
		/* CIPRSCPREDST. */
		preDstWidth = pdev->wndHsize / preHratio;
		preDstHeight = pdev->wndVsize / preVratio;
		ciprscpredst = (preDstWidth<<16)	// destination width for preview pre-scaler
					   |(preDstHeight<<0);	// destination height for preview pre-scaler
		iowrite32(ciprscpredst, S3C244X_CIPRSCPREDST);

		/* CIPRSCCTRL. */
		Hscale = (pdev->wndHsize >= pdev->preTargetHsize)?0:1;
		Vscale = (pdev->wndVsize >= pdev->preTargetVsize)?0:1;
		mainHratio = (pdev->wndHsize<<8)/(pdev->preTargetHsize<<Hshift);
		mainVratio = (pdev->wndVsize<<8)/(pdev->preTargetVsize<<Vshift);
		ciprscctrl = ioread32(S3C244X_CIPRSCCTRL);
		ciprscctrl &= (1<<30)|(1<<15);	// keep preview image format (RGB565 or RGB24), and preview scaler start state.
		ciprscctrl |= (1<<31)	// this bit should be always 1.
					  |(Hscale<<29)		// ???, horizontal scale up/down.
					  |(Vscale<<28)		// ???, vertical scale up/down.
					  |(mainHratio<<16)	// horizontal scale ratio for preview main-scaler
					  |(mainVratio<<0);	// vertical scale ratio for preview main-scaler
            
		iowrite32(ciprscctrl, S3C244X_CIPRSCCTRL);
   #else 
	 
	  pdev->bypass_mode=(pdev->v2f.fmt.pix.width==pdev->sensor.width && pdev->v2f.fmt.pix.height==pdev->sensor.width );
    /* CIPRSCPRERATIO. */
    calc_prescaler_ratio_shift(pdev->wndHsize, pdev->v2f.fmt.pix.width,
                                &coHratio, &Hshift);
                  
    calc_prescaler_ratio_shift(pdev->wndVsize, pdev->v2f.fmt.pix.height,
                                &coVratio, &Vshift);

    shfactor = 10 - (Hshift + Vshift);

    ciprscpreratio = (shfactor<<28)   // shift factor for codec pre-scaler
                    |(coHratio<<16) // horizontal ratio of codec pre-scaler
                    |(coVratio<<0); // vertical ratio of codec pre-scaler
             
    iowrite32(ciprscpreratio, S3C244X_CICOSCPRERATIO);
    
    /* CIPRSCPREDST. */
    coDstWidth =  pdev->wndHsize / coHratio;
    coDstHeight = pdev->wndVsize / coVratio;
    
    cicoscpredst = (coDstWidth<<16)  // destination width for codec pre-scaler
                  |(coDstHeight<<0);  // destination height for codec pre-scaler
                  
    iowrite32(cicoscpredst, S3C244X_CICOSCPREDST  );

    /* CIPRSCCTRL. */
    Hscale = (pdev->wndHsize > pdev->v2f.fmt.pix.width)?0:1;
    Vscale = (pdev->wndVsize > pdev->v2f.fmt.pix.height)?0:1;
    
    mainHratio = (pdev->wndHsize<<8)/(pdev->v2f.fmt.pix.width<<Hshift);
    mainVratio = (pdev->wndVsize<<8)/(pdev->v2f.fmt.pix.height<<Vshift);
    
    //printk(KERN_ALERT"mainHratio=%d mainVratio=%d :\n",mainHratio,mainVratio);
    
    cicoscctrl = ioread32(S3C244X_CICOSCCTRL);
    cicoscctrl &= (1<<31)|(1<<15);  // keep bypass mode and start /stop.
    
    cicoscctrl |= ((pdev->bypass_mode?1:0)<<31) //bypass
            |(Hscale<<29)   // ???, horizontal scale up/down.
            |(Vscale<<30)   // ???, vertical scale up/down.
            |(mainHratio<<16) // horizontal scale ratio for codec main-scaler
            |(mainVratio<<0); // vertical scale ratio for codec main-scaler
            
    iowrite32(cicoscctrl, S3C244X_CICOSCCTRL);
    
    //printk(KERN_ALERT"update zoom:\n");
    //s3c2440camif_reg_dump();
   #endif
}