首页 理论教育 Linux驱动程序实例:DMA传输机制

Linux驱动程序实例:DMA传输机制

时间:2023-10-19 理论教育 版权反馈
【摘要】:S3C6410X使用DMA向屏幕传输视频数据。S3C6410X Framebuffer驱动的平台设备定义如下:这里的两个DMA参数很重要。dma_mask与coherent_dma_mask均表示设备能寻址的范围。其中coherent_dma_mask用于申请一致性DMA缓冲区。表9-7 S3C6410X的窗口缓冲地址与大小寄存器(续)这些寄存器的宏定义如下:/*Video buffer addresses*/#define VIDW_BUF_START #define VIDW_BUF_START_S #define VIDW_BUF_START1 #define VIDW_BUF_END #define VIDW_BUF_END1 #define VIDW_BUF_SIZE s3c_fb_data_64xx结构记录了这些参数信息:s3c_fb_set_par函数将DMA地址写入相应的寄存器:

Linux驱动程序实例:DMA传输机制

S3C6410X使用DMA向屏幕传输视频数据。S3C6410X显卡内存分配函数如下:

978-7-111-56706-6-Chapter09-39.jpg

978-7-111-56706-6-Chapter09-40.jpg

Framebuffer驱动中分配DMA内存通常使用dma_alloc_writecombine函数,而不是dma_alloc_coherent函数。两个函数的区别在于dma_alloc_coherent函数会禁止cache与写缓冲;而dma_alloc_writecombin函数只禁止cache但启用写缓冲。void*dma_alloc_writecombine(struct device*dev,size_t size,dma_addr_t*dma_addr,gfp_t gfp);

dma_alloc_writecombine函数返回显存虚拟地址,其dma_addr参数返回分配的显存物理地址。

S3C6410X Framebuffer驱动的平台设备定义如下:

978-7-111-56706-6-Chapter09-41.jpg

978-7-111-56706-6-Chapter09-42.jpg

这里的两个DMA参数很重要。dma_mask与coherent_dma_mask均表示设备能寻址的范围。其中coherent_dma_mask用于申请一致性DMA缓冲区。dma_alloc_writecombine函数需要根据coherent_dma_mask参数分配内存。dma_alloc_writecombine函数会调用dma_alloc_attrs函数:

978-7-111-56706-6-Chapter09-43.jpg

ARM体系的DMA操作结构为arm_dma_ops:

978-7-111-56706-6-Chapter09-44.jpg

arm_dma_alloc函数调用__dma_alloc函数,__dma_alloc函数中会用到DMA mask参数:

978-7-111-56706-6-Chapter09-45.jpg

DMA地址必须填充到S3C6410X的LCD控制器的地址寄存器中。S3C6410X的窗口缓冲地址与大小寄存器见表9-7。

9-7 S3C6410X的窗口缓冲地址与大小寄存器

978-7-111-56706-6-Chapter09-46.jpg(www.xing528.com)

(续)

978-7-111-56706-6-Chapter09-47.jpg

这些寄存器的宏定义如下:

/*Video buffer addresses*/

#define VIDW_BUF_START(_buff) (0xA0+((_buff)*8))

#define VIDW_BUF_START_S(_buff) (0x40A0+((_buff)*8))

#define VIDW_BUF_START1(_buff) (0xA4+((_buff)*8))

#define VIDW_BUF_END(_buff) (0xD0+((_buff)*8))

#define VIDW_BUF_END1(_buff) (0xD4+((_buff)*8))

#define VIDW_BUF_SIZE(_buff) (0x100+((_buff)*4))

s3c_fb_data_64xx结构记录了这些参数信息:

978-7-111-56706-6-Chapter09-48.jpg

978-7-111-56706-6-Chapter09-49.jpg

s3c_fb_set_par函数将DMA地址写入相应的寄存器:

978-7-111-56706-6-Chapter09-50.jpg

免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。

我要反馈