Android S5PV210 fimc驱动分析 - fimc_regs.c

2019-07-12 23:30发布


分类: Android 嵌入式Linux Samsung S5PV210 1031人阅读 评论(2) 收藏 举报 camstructcoutputinterfaceimage fimc_regs.c是fimc框架操作camera 硬件的接口,fimc框架把所有硬件相关的操作都放在这个文件中 [html] view plaincopy
  1. 100 int fimc_hwset_camera_source(struct fimc_control *ctrl)  
  2. 101 {  
  3. 102     struct s3c_platform_camera *cam = ctrl->cam;  
  4. 103     u32 cfg = 0;  
  5. 104   
  6. 105     /* for now, we support only ITU601 8 bit mode */  
  7. 106     cfg |= S3C_CISRCFMT_ITU601_8BIT;  
  8. 107     cfg |= cam->order422;  
  9. 108   
  10. 109     if (cam->type == CAM_TYPE_ITU)  
  11. 110         cfg |= cam->fmt;  
  12. 111   
  13. 112     cfg |= S3C_CISRCFMT_SOURCEHSIZE(cam->width);  
  14. 113     cfg |= S3C_CISRCFMT_SOURCEVSIZE(cam->height);  
  15. 114   
  16. 115     writel(cfg, ctrl->regs + S3C_CISRCFMT);  
  17. 116   
  18. 117     return 0;  
  19. 118 }  
S3C_CISRCFMT: Camera Source Format,FIMC1 FIMC2 FIMC3各对应一个 106 设置external 摄像头支持的模式,一般来讲 AD转换芯片都是支持BT656 107 cam->order422,这里的cam代表的就是一个外部摄像头,cam->order422是在arch/arm/mach-s5pv210/mach-xxx.c中定义的,标识了external camera 像素的Y C R分量的排列方式,对于BT656来是,选择CAM_ORDER422_8BIT_YCBYCR,CAM_ORDER422_8BIT_YCRYCB, CAM_ORDER422_8BIT_CBYCRY, CAM_ORDER422_8BIT_CRYCBY之一,具体选择哪一个,要根据sensor datasheet中BT656输出 Y U V分量的顺序决定。
109 因为cam->fmt也是设置 ITU模式的,所以和106行代码是冗余的,不知作者为什么这样写 112 ~ 113 设置source水平和垂直像素数目,source可以是 camera或者FIFO input

[html] view plaincopy
  1. 159 int fimc_hwset_output_area_size(struct fimc_control *ctrl, u32 size)  
  2. 160 {  
  3. 161     u32 cfg = 0;  
  4. 162   
  5. 163     cfg = S3C_CITAREA_TARGET_AREA(size);  
  6. 164   
  7. 165     writel(cfg, ctrl->regs + S3C_CITAREA);  
  8. 166   
  9. 167     return 0;  
  10. 168 }  
CITAREA: output DMA target area register 设置output DMA的target大小,这个值并不是buffer空间的大小,而是输出图像的H_size * V_size

[html] view plaincopy
  1. 170 void fimc_wait_disable_capture(struct fimc_control *ctrl)  
  2. 171 {  
  3. 172     unsigned long timeo = jiffies + 20; /* timeout of 100 ms */  
  4. 173     u32 cfg;  
  5. 174   
  6. 175     if (!ctrl || !ctrl->cap ||  
  7. 176             ctrl->cap->fmt.colorspace == V4L2_COLORSPACE_JPEG)  
  8. 177         return;  
  9. 178   
  10. 179     while (time_before(jiffies, timeo)) {  
  11. 180         cfg = readl(ctrl->regs + S3C_CISTATUS);  
  12. 181   
  13. 182         if (0 == (cfg & S3C_CISTATUS_IMGCPTEN))  
  14. 183             break;  
  15. 184   
  16. 185         msleep(10);  
  17. 186     }  
  18. 187   
  19. 188     dev_dbg(ctrl->dev, "IMGCPTEN: Wait time = %d ms ",  
  20. 189             jiffies_to_msecs(jiffies - timeo + 20));  
  21. 190   
  22. 191     return;  
  23. 192 }  
在disable capture后,可以调用这个函数,来保证disable capture操作完成 S3C_CISTATUS_IMGCPTEN 标识是否image capture enable的状态
[html] view plaincopy
  1. 194 int fimc_hwset_image_effect(struct fimc_control *ctrl)  
  2. 195 {  
  3. 196     u32 cfg = 0;  
  4. 197   
  5. 198     if (ctrl->fe.ie_on) {  
  6. 199         if (ctrl->fe.ie_after_sc)  
  7. 200             cfg |= S3C_CIIMGEFF_IE_SC_AFTER;  
  8. 201   
  9. 202         cfg |= S3C_CIIMGEFF_FIN(ctrl->fe.fin);  
  10. 203   
  11. 204         if (ctrl->fe.fin == FIMC_EFFECT_FIN_ARBITRARY_CBCR)  
  12. 205             cfg |= S3C_CIIMGEFF_PAT_CB(ctrl->fe.pat_cb) |  
  13. 206                 S3C_CIIMGEFF_PAT_CR(ctrl->fe.pat_cr);  
  14. 207   
  15. 208         cfg |= S3C_CIIMGEFF_IE_ENABLE;  
  16. 209     }  
  17. 210   
  18. 211     writel(cfg, ctrl->regs + S3C_CIIMGEFF);  
  19. 212   
  20. 213     return 0;  
  21. 214 }  

FIMC控制器支持图片特效处理,因此fimc的V4L2 s_ctl接口提供了特效控制 CIIMGEFF寄存器控制图片的特效,具体的特效说明,参看s5pv210 datasheet
[html] view plaincopy
  1.  267 int fimc_hwset_reset(struct fimc_control *ctrl)  
  2.  268 {  
  3.  269     u32 cfg = 0;  
  4.  270   
  5.  271     cfg = readl(ctrl->regs + S3C_CISRCFMT);  
  6.  272     cfg |= S3C_CISRCFMT_ITU601_8BIT;  
  7.  273     writel(cfg, ctrl->regs + S3C_CISRCFMT);  
  8.  274   
  9.  275     /* s/w reset */  
  10.  276     cfg = readl(ctrl->regs + S3C_CIGCTRL);  
  11.  277     cfg |= (S3C_CIGCTRL_SWRST);  
  12.  278     writel(cfg, ctrl->regs + S3C_CIGCTRL);  
  13.  279     mdelay(1);  
  14.  280   
  15.  281     cfg = readl(ctrl->regs + S3C_CIGCTRL);  
  16.  282     cfg &= ~S3C_CIGCTRL_SWRST;  
  17.  283     writel(cfg, ctrl->regs + S3C_CIGCTRL);  
  18.  284   
  19.  285     /* in case of ITU656, CISRCFMT[31] should be 0 */  
  20.  286     if ((ctrl->cap != NULL) && (ctrl->cam->fmt == ITU_656_YCBCR422_8BIT)) {  
  21.  287         cfg = readl(ctrl->regs + S3C_CISRCFMT);  
  22.  288         cfg &= ~S3C_CISRCFMT_ITU601_8BIT;  
  23.  289         writel(cfg, ctrl->regs + S3C_CISRCFMT);  
  24.  290     }  
  25.  291   
  26.  292     fimc_reset_cfg(ctrl);  
  27.  293