分类: Android 嵌入式Linux Samsung
S5PV2102012-06-16 15:53 1031人阅读 收藏 举报
camstructcoutputinterfaceimage
fimc_regs.c是fimc框架操作camera 硬件的接口,fimc框架把所有硬件相关的操作都放在这个文件中
[html] view
plaincopy
-
100 int fimc_hwset_camera_source(struct fimc_control *ctrl)
-
101 {
-
102 struct s3c_platform_camera *cam = ctrl->cam;
-
103 u32 cfg = 0;
-
104
-
105 /* for now, we support only ITU601 8 bit mode */
-
106 cfg |= S3C_CISRCFMT_ITU601_8BIT;
-
107 cfg |= cam->order422;
-
108
-
109 if (cam->type == CAM_TYPE_ITU)
-
110 cfg |= cam->fmt;
-
111
-
112 cfg |= S3C_CISRCFMT_SOURCEHSIZE(cam->width);
-
113 cfg |= S3C_CISRCFMT_SOURCEVSIZE(cam->height);
-
114
-
115 writel(cfg, ctrl->regs + S3C_CISRCFMT);
-
116
-
117 return 0;
-
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
-
159 int fimc_hwset_output_area_size(struct fimc_control *ctrl, u32 size)
-
160 {
-
161 u32 cfg = 0;
-
162
-
163 cfg = S3C_CITAREA_TARGET_AREA(size);
-
164
-
165 writel(cfg, ctrl->regs + S3C_CITAREA);
-
166
-
167 return 0;
-
168 }
CITAREA: output DMA target area register
设置output DMA的target大小,这个值并不是buffer空间的大小,而是输出图像的H_size * V_size
[html] view
plaincopy
-
170 void fimc_wait_disable_capture(struct fimc_control *ctrl)
-
171 {
-
172 unsigned long timeo = jiffies + 20; /* timeout of 100 ms */
-
173 u32 cfg;
-
174
-
175 if (!ctrl || !ctrl->cap ||
-
176 ctrl->cap->fmt.colorspace == V4L2_COLORSPACE_JPEG)
-
177 return;
-
178
-
179 while (time_before(jiffies, timeo)) {
-
180 cfg = readl(ctrl->regs + S3C_CISTATUS);
-
181
-
182 if (0 == (cfg & S3C_CISTATUS_IMGCPTEN))
-
183 break;
-
184
-
185 msleep(10);
-
186 }
-
187
-
188 dev_dbg(ctrl->dev, "IMGCPTEN: Wait time = %d ms
",
-
189 jiffies_to_msecs(jiffies - timeo + 20));
-
190
-
191 return;
-
192 }
在disable capture后,可以调用这个函数,来保证disable capture操作完成
S3C_CISTATUS_IMGCPTEN 标识是否image capture enable的状态
[html] view
plaincopy
-
194 int fimc_hwset_image_effect(struct fimc_control *ctrl)
-
195 {
-
196 u32 cfg = 0;
-
197
-
198 if (ctrl->fe.ie_on) {
-
199 if (ctrl->fe.ie_after_sc)
-
200 cfg |= S3C_CIIMGEFF_IE_SC_AFTER;
-
201
-
202 cfg |= S3C_CIIMGEFF_FIN(ctrl->fe.fin);
-
203
-
204 if (ctrl->fe.fin == FIMC_EFFECT_FIN_ARBITRARY_CBCR)
-
205 cfg |= S3C_CIIMGEFF_PAT_CB(ctrl->fe.pat_cb) |
-
206 S3C_CIIMGEFF_PAT_CR(ctrl->fe.pat_cr);
-
207
-
208 cfg |= S3C_CIIMGEFF_IE_ENABLE;
-
209 }
-
210
-
211 writel(cfg, ctrl->regs + S3C_CIIMGEFF);
-
212
-
213 return 0;
-
214 }
FIMC控制器支持图片特效处理,因此fimc的V4L2 s_ctl接口提供了特效控制
CIIMGEFF寄存器控制图片的特效,具体的特效说明,参看s5pv210 datasheet
[html] view
plaincopy
-
267 int fimc_hwset_reset(struct fimc_control *ctrl)
-
268 {
-
269 u32 cfg = 0;
-
270
-
271 cfg = readl(ctrl->regs + S3C_CISRCFMT);
-
272 cfg |= S3C_CISRCFMT_ITU601_8BIT;
-
273 writel(cfg, ctrl->regs + S3C_CISRCFMT);
-
274
-
275 /* s/w reset */
-
276 cfg = readl(ctrl->regs + S3C_CIGCTRL);
-
277 cfg |= (S3C_CIGCTRL_SWRST);
-
278 writel(cfg, ctrl->regs + S3C_CIGCTRL);
-
279 mdelay(1);
-
280
-
281 cfg = readl(ctrl->regs + S3C_CIGCTRL);
-
282 cfg &= ~S3C_CIGCTRL_SWRST;
-
283 writel(cfg, ctrl->regs + S3C_CIGCTRL);
-
284
-
285 /* in case of ITU656, CISRCFMT[31] should be 0 */
-
286 if ((ctrl->cap != NULL) && (ctrl->cam->fmt == ITU_656_YCBCR422_8BIT)) {
-
287 cfg = readl(ctrl->regs + S3C_CISRCFMT);
-
288 cfg &= ~S3C_CISRCFMT_ITU601_8BIT;
-
289 writel(cfg, ctrl->regs + S3C_CISRCFMT);
-
290 }
-
291
-
292 fimc_reset_cfg(ctrl);
-
293
-