/* 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); }
/* 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 }