xilinx的VDMA驱动分析

        研究生期间由于导师研究的项目需要,对xilinx的IP核Video-DMA内核中驱动进行学习。(此处的为DMA 通道驱动,而非DMA engines)

首先,查看设备结构体:

struct xvip_dma {
	struct list_head list;
	struct video_device video;
	struct media_pad pad;

	struct xvip_composite_device *xdev;
	struct xvip_pipeline pipe;
	unsigned int port;

	struct mutex lock;
	struct v4l2_pix_format format;
	const struct xvip_video_format *fmtinfo;

	struct vb2_queue queue;
	void *alloc_ctx;
	unsigned int sequence;

	struct list_head queued_bufs;
	spinlock_t queued_lock;

	struct dma_chan *dma;
	unsigned int align;
	struct dma_interleaved_template xt;
	struct data_chunk sgl[1];
	int input;
	int vptype;
};

可以看到,VDMA设备被定义成了video_device。

注意,xilinx-dma并不是作为单独一个设备进行注册(它没有probe函数),它需要依附xvip_composite_device设备进行初始化,同时在设备树中设备中的一些参数是放在xvip_composite_device设备中的。查看xilinx-vipp.c文件中的probe函数,调用关系如下:

 xvip_composite_probe

           ->xvip_graph_init

                      ->xvip_graph_dma_init

                                      ->xvip_graph_dma_init_one

                                                     ->xvip_dma_init

至此,vipp和vdma挂上钩。

来分析xvip_dma_init函数:

int xvip_dma_init(struct xvip_composite_device *xdev, struct xvip_dma *dma,
		  enum v4l2_buf_type type, unsigned int port)
{

你可能感兴趣的:(linux驱动,linux,嵌入式)