本文共 3407 字,大约阅读时间需要 11 分钟。
一: int s3c2410_dma_request(unsigned int channel,
s3c2410_dma_client的定义为: struct s3c2410_dma_client {
static struct s3c2410_dma_client s3c2410iis_dma_in = {
二: s3c2410_dma_config(dmach_t channel,int xferunit,int dcon)
s3c2410_dma_config(dmach_t channel,int xferunit,int dcon)根据xferunit以及dcon设置通道的控制寄存器DCONx xferunit为每次传输的数据大小:0:byte 1:half word 2:word
三:
int s3c2410_dma_set_buffdone_fn(dmach_t channel, s3c2410_dma_cbfn_t rtn)
设置相应的dma通道完成一次dma传输后的回调函数,也即是s3c2410_dma_enqueue完成后会调用的函数回调函数应具有一下格式: typedef void (*s3c2410_dma_cbfn_t)(struct s3c2410_dma_chan *,
四: int s3c2410_dma_setflags(dmach_t channel, unsigned int flags)
在1314驱动中, flags = S3C2410_DMAF_AUTOSTART;
五:
int s3c2410_dma_devconfig(int channel,
参数意义:
如果source为S3C2410_DMASRC_HW(外设), 配置它的S3C2410_DMA_DISRCC,S3C2410_DMA_DISRC,S3C2410_DMA_DIDSTC 如果source为S3C2410_DMASRC_MEM(内存),配置它的S3C2410_DMA_DISRCC,S3C2410_DMA_DIDST,S3C2410_DMA_DIDSTC 由此可见,地址方面,只配置涉及外设的地址以uda1341的驱动为例,这几个值为
六: void *dma_alloc_coherent(struct device *dev,size_t size,dma_addr_t *dma_handle,int flag)
利用此函数,申请dmabuf,建立一致性映射以uda1314的驱动为例,调应的实例为: dmabuf = dma_alloc_coherent(NULL, dmasize, &dmaphys, GFP_KERNEL);(在audio_setup_buf函数中) dmabuf为虚拟地址,dmaphys是总线地址,虚拟地址用来让驱动写buf用,dmaphys用来传给dma。 dma关心的是总线地址。关于总线地址与物理地址的区别,这里有很好的说明,感谢儒雅,现摘录如下: 1) 物理地址是与CPU相关的。在CPU的地址信号线上产生的就是物理地址。在程序指令中的虚拟地址经过段映射和页面映射后,就生成了物理地址,这个物理地址被放到CPU的地址线上。 2) 总线地址,顾名思义,是与总线相关的,就是总线的地址线或在地址周期上产生的信号。外设使用的是总线地址。 3) 物理地址与总线地址之间的关系由系统的设计决定的。在x86平台上,物理地址与PCI总线地址是相同的。在其他平台上,也许会有某种转换,通常是线性的转换。
比如:CPU需要访问物理地址是0xfa000的单元,那么在x86平台上,会产生一个PCI总线上对0xfa000地址的访问。这个单元或者是内存中,或者是某个卡上的存储单元,甚至可能这个地址上没有对应的存储器。而在另外一个平台上,或许在PCI总线上产生的访问是针对地址为0x1fa000的单元。上述函数是建立一致性映射。使用dma_map_single函数可以建立一致性映射: 2.当只有一个缓冲区要被传输的时候,使用dma_map_single函数来映射它 dma_addr_t dma_map_single(struct device *dev,void *buffer,size_t size, enum dma_da
七: int s3c2410_dma_enqueue(unsigned int channel, void *id,
发起一次dma传输
本文来自CSDN博客,转载请标明出处: