
i.MX6-IPU子系统
文章平均质量分 86
针对恩智浦NXP(原飞思卡尔)i.MX6系列的IPU子系统部分进行源代码级分析.内核版本3.14.52.
yanbixing123
曾师从于:世界芯片设计前10某公司,传说中的世界500强某米,被美丽国实体清单拉黑的某AI巨头,嵌入式黄埔军校某台企;毕业于某非985,211的双一流学校;
Camera算法,HAL,Android MultiMedia Framework,StageFright,OpenMAX;
嵌入式uboot,linux驱动,Andorid底层,i.MX6 IPU专栏,GStreamer专栏^_^~
小富靠勤,大富靠命。技术是通向小富的一条现实可行的路径。祝大家顺利~~~
展开
-
IPU总结笔记
有关IPU的讲解,暂时先做了两次PPT,如果有想对IPU有一个大致的了解的话,可以参考一下,我将这两个PPT上传到优快云中了,下载不需要积分。IPU总结报告v1.0 : http://download.youkuaiyun.com/detail/yanbixing123/9611989IPU总结报告v2.0 : http://download.youkuaiyun.com/detail/yanb原创 2016-08-24 20:08:03 · 5068 阅读 · 15 评论 -
对ipu_init_channel的理解
对ipu_init_channel的理解2016-05-2617:11:40(一)对于每个channel,它的信息都保存在ipu_channel_params_t结构体联合中,在ipu_init_channel函数中,会根据传入的这个ipu_channel_params_t结构体联合中channel所对应的参数来初始化channel。对于每一个channel,首先要理解这个原创 2016-08-24 13:36:44 · 2128 阅读 · 0 评论 -
ov5640_mipi.c分析
在ov5640芯片手册中看到这样一句话:The OV5640 supports both a digital video parallel port and a serial MIPI port.所以ov5640既支持数字并口视频传输,同样支持mipi接口规范。摄像头插入到开发板上面的时候,如果有匹配的驱动程序,就会调用到probe函数,先从probe函数来分析。(原创 2016-08-24 13:04:22 · 24845 阅读 · 3 评论 -
dts文件分析---以ov5640为例,修改dts文件使ov5640使用第二个IPU
在ARMlinux中,每一个.dts文件都对应一个ARM的machine,这些文件都放在arch/arm/boot/dts文件夹中。同时,对于每一个SoC可能对应多个machine,这些dts文件中会包含许多共同的部分,所以就有了.dtsi文件。这个.dtsi文件类似C语言中的头文件,在其他的.dts文件中可以通过#include”xxxx.dtsi“来包含这些头文件。因为我们的开原创 2016-08-24 12:58:04 · 8505 阅读 · 1 评论 -
8.6 子模块分析之CM
(一)概述Control Module(CM)模块由以下几个部分构成:CM由Frame Synchronization Unit (FSU),Interrupt Generator (IG),General Configuration Registers (GCR),Clock and Reset Control Unit (CRCU)和Shadow Registe原创 2016-08-24 12:34:50 · 2278 阅读 · 0 评论 -
8.5 子模块分析之VDIC
(一)概述VDIC的全称是Video De-Interlacing or Combining Block,看名字就知道有两个含义:去隔行和合并。VDIC有两个操作模式:1)去隔行:将一个隔行视频流转换成逐行视频;2)合并:合并两个视频/图像位面和一个背景色。VDIC将隔行数据去隔行后产生逐行数据,用来适应显示逐行数据的设备。对于VDIC操作来说,有三个操作域是重要的:F(n原创 2016-08-24 12:16:24 · 1883 阅读 · 0 评论 -
8.4 子模块分析之IC
(1)概述IC包含三个处理模块:缩放(downsizing),主处理流程(main processing)和翻转(rotation)。这几个模块是通过外围寄存器控制的,所需的参数是ARM通过AHB总线写到Task Parameter Memory中的。这个Task Parameter Memory在后面介绍。先来看一个整体图:这几个模块如下所示:(2)Process原创 2016-08-24 11:15:50 · 1687 阅读 · 0 评论 -
8.3 子模块分析之SMFC
(1)概述Sensor Multifile Controller作为CSI模块和IDMAC之间的一个缓冲设备,每个SMFC可以支持两个CSI设备。每个CSI设备可以最多发送4帧图像到SMFC中,SMFC通过csi_id号来区分是哪个CSI发送的。每一帧图像通过SMFC映射到4个dmachannel其中的一个。每个dmachannel都是一个FIFO。(2)SMFC功能介绍原创 2016-08-24 11:10:42 · 2264 阅读 · 0 评论 -
8.2 子模块分析之CSI
(1)概述每个IPU有两个同样的CSI接口,下图是两个IPU的CSI模块示意图:每个CSI包括同步单元,逻辑接口,数据处理单元和sensor接口控制单元组成,如下所示:CSI被外围的通用寄存器控制,同时是双buffer模式,CSI的主要作用是从sensor中获取数据,根据IPU时钟同步数据和控制信号然后将处理过的数据发送到DATA_DEST寄存器里面的目的地,目的地可以为SMF原创 2016-08-24 10:57:48 · 7325 阅读 · 1 评论 -
8.1 子模块分析之IDMAC
先来看一个整体的图:主要看图中蓝色的箭头,它反映了IPU内部数据总线的连接关系。后面我们研究的DMA传输都需要物理连接的支撑。可以看出来,在IPU中最重要的模块就是这个CM- Control Module模块和IDMAC– Image DMA Control模块了。这个图中有几点不好理解:(1)IPU和ARM都挂载在AHB总线上面,ARM就是通过CM模块来控制使用IPU。原创 2016-08-24 10:39:44 · 2500 阅读 · 0 评论 -
7.2 ipu_device.c分析(二)---具体函数分析
1. deinterlace_3_field函数static bool deinterlace_3_field(struct ipu_task_entry *t) { return ((t->set.mode & VDI_MODE) && (t->input.deinterlace.motion != HIGH_MOTION)); } 2. tiled_filed_s原创 2016-08-24 10:37:19 · 3118 阅读 · 0 评论 -
7.1 ipu_device.c分析(一)---流程分析
在ipu_common.c文件的ipu_probe函数中,最后调用到register_ipu_device函数,这个函数在ipu_device.c中,所以从这个文件开始分析。这个文件中主要是两个内核线程的执行过程,根据FTF-CON-F0119.pdf中写的:(1)每个IPU有两个内核线程为了ICtask(PP&VF)(2)每一个内核线程通过将task添加到它的taskqueue原创 2016-08-24 08:50:27 · 4449 阅读 · 0 评论 -
6.2 ipu_csi_enc.c详细分析
这个文件和ipu_prp_enc.c以及ipu_fg_overlay_sdc.c和ipu_bg_overlay_sdc.c几个文件的操作都是相似的,这几个文件可以一起查看。找到他们之间的区别,1cam_data中使用的函数指针的不同;2ipu_init_channel_buffer中地址的不同和width等不同。在mxc_v4l2_capture.c中的mxc_v4l_open原创 2016-08-24 08:48:18 · 2564 阅读 · 0 评论 -
6.1 ipu_prp_enc.c详细分析
这个文件中讲解的是IPU中CSI_PRP_ENC_MEM和MEM_ROT_ENC_MEM这两个channel的执行过程,首先,CSI_PRP_ENC_MEM这个channel表示从CSI中获取到数据,然后将数据保存到内存中这个流程。而MEM_ROT_ENC_MEM这个channel是需要在CSI_PRP_ENC_MEMchannel基础之上,将数据从内存中取出来,进行翻转运算以后,再放到内存中原创 2016-08-23 21:14:03 · 2709 阅读 · 0 评论 -
5.0 本节分析所使用的应用程序源代码
本节分析所使用的应用程序的源代码/* * Copyright 2004-2013 Freescale Semiconductor, Inc. All rights reserved. *//* * The code contained herein is licensed under the GNU General Public * License. You may obtai原创 2016-08-23 21:08:38 · 1323 阅读 · 0 评论 -
5.2 应用程序和驱动程序中buffer的传输流程
摄像头采集的数据,是通过buffer的形式传到驱动程序中,然后驱动程序使能CSI设备来采集数据。之后将采集到的数据再次通过buffer的形式传递给应用程序中。这个过程中使用了VIDIOC_REQBUFS,VIDIOC_QUERYBUF,VIDIOC_QBUF,VIDIOC_STREAMON和VIDIOC_DQBUF这些ioctl调用。下面就来具体分析这个流程。1.内核中的数据结构原创 2016-08-23 20:48:03 · 6457 阅读 · 3 评论 -
5.1 mxc_v4l2_capture.c应用程序追踪分析
对于IPU在内核驱动中的执行过程,需要通过应用程序的函数调用来一步一步追踪,下面就根据mxc_v4l2_capture.c这个应用程序来分析。经过此轮分析,应该对IPU内部那些函数都有一个大致的认识。1.应用程序中的参数g_in_width= 352, g_in_height = 288, g_out_width = 352, g_out_height = 288,g_rota原创 2016-08-23 19:36:41 · 8731 阅读 · 1 评论 -
4.7 ipu_capture.c分析
在ipu_common.c文件中,会调用到这个文件很多底层的函数,来设置视频捕获设备中底层的一些操作寄存器。这个文件就直接从头至尾开始分析:1._ipu_csi_mclk_set函数int _ipu_csi_mclk_set(struct ipu_soc *ipu, uint32_t pixel_clk, uint32_t csi) { uint32_t temp; ui原创 2016-08-23 19:27:49 · 2371 阅读 · 0 评论 -
4.6 ipu_enable_channel函数详细分析
int32_t ipu_enable_channel(struct ipu_soc *ipu, ipu_channel_t channel) { uint32_t reg; uint32_t ipu_conf; uint32_t in_dma; uint32_t out_dma; uint32_t sec_dma; uint32_t thrd_dma; mutex_原创 2016-08-23 19:26:16 · 1665 阅读 · 0 评论 -
4.5 ipu_request_irq函数详细分析
ipu_request_irq函数int ipu_request_irq(struct ipu_soc *ipu, uint32_t irq, irqreturn_t(*handler) (int, void *), uint32_t irq_flags, const char *devname, void *dev_id) { uint32_t reg;原创 2016-08-23 19:19:58 · 1499 阅读 · 0 评论 -
4.4 ipu_param_mem.h头文件分析
1.下面这两个结构体是本文件的核心结构体。struct ipu_ch_param_word { uint32_t data[5]; uint32_t res[3]; }; struct ipu_ch_param { struct ipu_ch_param_word word[2]; };因为CPMEM是两个160位的word,所以每个word使用5个uint32_t类型原创 2016-08-23 18:33:10 · 1800 阅读 · 0 评论 -
4.3 ipu_init_channel_buffer函数的详细分析
ipu_init_channel_buffer函数int32_t ipu_init_channel_buffer(struct ipu_soc *ipu, ipu_channel_t channel, ipu_buffer_t type, uint32_t pixel_fmt, uint16_t width, uint16_t height, uint3原创 2016-08-23 17:33:15 · 2446 阅读 · 0 评论 -
4.2 ipu_init_channel函数的详细分析
在看这个函数之前,先对ipu内部的channel有所了解,先来看看ipu内部的flow的定义:对于每个flow,代表数据从摄像头采集到显示(或者保存在内存中)的过程中的一个分步骤,每个flow都对应一个或几个channel,而每个channel的数据流通过程中,是通过DMA传输的,所以每个channel里面又包含一个或几个dma_channel。在这不太好理解,看看手册中的介绍原创 2016-08-23 16:59:55 · 2504 阅读 · 0 评论 -
4.1 ipu_common.c分析---入口函数及probe函数分析
这个ipu_common.c函数提供ipu底层函数调用的一些关系和函数。(一)分析这个文件从init函数入口,发现有这个subsys_initcall,说明ipu是作为一个子系统注册到内核中的:int32_t __init ipu_gen_init(void) { int32_t ret; ret = platform_driver_register(&mxcipu_drive原创 2016-08-23 16:25:24 · 2347 阅读 · 1 评论 -
4.0 ipu_soc,ipu_channel_t ,ipu_channel_params_t结构体详解
1.ipu_soc结构体:struct ipu_soc { unsigned int id; //ipu的ID号 unsigned int devtype; //ipu的一些信息,包含cm,ic等模块的地址偏移值 bool online; //表示这个ipu是否正在使用中 /*clk*/ struct clk *ipu_clk; struct clk *di_clk[2];原创 2016-08-23 16:19:33 · 1642 阅读 · 0 评论 -
3.8 poll函数的详细分析
下面看看poll函数,个人感觉这个poll函数还是比较重要的:static unsigned int mxc_poll(struct file *file, struct poll_table_struct *wait) { struct video_device *dev = video_devdata(file); cam_data *cam = video_get_drvdat原创 2016-08-23 16:18:56 · 1066 阅读 · 0 评论 -
3.7 ioctl函数中case的详细分析
在分析应用程序的ioctl调用的时候,内核中将这些ioctl的调用信息打印出来,但是打印的是unsignedint类型的16进制值,这样,如果想要分析这些ioctl调用的话,就需要将这些ioctl调用的16进制值计算出来。每一个ioctl调用都有如下的形式:intioctl(int fd, int cmd, …);可以看出来,这个cmd是int类型的,它里面包含一定的信息,下面就来分析这个原创 2016-08-23 16:15:03 · 1295 阅读 · 0 评论 -
3.6 mxc_v4l_ioctl函数分析
下面分析mxc_v4l_ioctl函数:static long mxc_v4l_ioctl(struct file *file, unsigned int cmd, unsigned long arg) { pr_debug("In MVC:mxc_v4l_ioctl\n"); return video_usercopy(file, cmd, arg, mxc_v4l_do原创 2016-08-23 15:59:47 · 3598 阅读 · 1 评论 -
3.5 cam_data结构体详解
typedef struct _cam_data { struct video_device *video_dev; int device_type; /* semaphore guard against SMP multithreading */ struct semaphore busy_lock; //针对SMP的信号量 int open_count; //op原创 2016-08-23 15:58:36 · 2715 阅读 · 0 评论 -
3.4 mxc_v4l_open函数分析
下面就来分析这个mxc_v4l_open函数:static int mxc_v4l_open(struct file *file) { struct v4l2_ifparm ifparm; struct v4l2_format cam_fmt; ipu_csi_signal_cfg_t csi_param; struct video_device *dev = video_d原创 2016-08-23 15:49:12 · 2650 阅读 · 0 评论 -
3.3 应用程序中函数调用的底层执行流程
在3.1节分析的probe函数中,它的核心函数video_register_device的part3中(v4l2-core/v4l2-dev.c文件),通过vdev->cdev->ops= &v4l2_fops;将字符设备的结构体cdev的file_operations函数集指向了v4l2_fops,如下所示:static const struct file_operations v4l2原创 2016-08-23 15:47:05 · 1840 阅读 · 0 评论 -
3.2 vidioc_int_* 类函数的调用过程
在《2.master和slave的匹配过程》中我们分析了master设备和slave设备的匹配过程,但是在操作过程中,如果想要获取slave设备的一些信息,该如何获得呢?你也许会说,只需要定义一个函数,去slave设备文件中获取即可,但是,如果一个驱动会支持好几个slave设备,那么对于不同的slave设备,驱动中都需要为它们定义一个功能相似的函数。如果是多master对应多slave设备的情况下原创 2016-08-23 15:43:07 · 2253 阅读 · 2 评论 -
3.1 mxc_v4l2_capture.c分析---probe函数分析
mxc_v4l2_capture.c函数提供了应用程序中的一些接口函数,所以从分析它开始:(一)看一个驱动程序从它的入口函数开始:module_init(camera_init);static __init int camera_init(void) { u8 err = 0; pr_debug("In MVC:camera_init\n"); /* Register原创 2016-08-23 15:27:51 · 4508 阅读 · 0 评论 -
2. master和slave的匹配过程
(一)master的注册过程1.首先来看看master的注册过程,在mxc_v4l2_capture.c文件中,从module_init(camera_init)函数开始,在camera_init函数中通过err= platform_driver_register(&mxc_v4l2_driver)来将mxc_v4l2_driver这个驱动注册到platform平台上面,如果有匹配原创 2016-08-23 15:16:45 · 7174 阅读 · 1 评论 -
IPU概述
1. IPU概述(一)框架首先来看看imx6q整体系统框架图,看看IPU位于整个SOC系统中的位置:可以看出来,整个IPU挂接在AXI与AHB总线上面,通过总线,它可以与ARM,VPU,GPU和RAM等模块通信。另外,每个IPU有两个camera接口,如下所示:通过LDB控制到LVDS屏,直接控制LCD屏,并且可以通过HDMI或者MIPI来显示。原创 2016-08-23 14:57:55 · 32425 阅读 · 2 评论