S3C6410X使用DMA向屏幕传输视频数据。S3C6410X显卡内存分配函数如下:
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驱动的平台设备定义如下:
这里的两个DMA参数很重要。dma_mask与coherent_dma_mask均表示设备能寻址的范围。其中coherent_dma_mask用于申请一致性DMA缓冲区。dma_alloc_writecombine函数需要根据coherent_dma_mask参数分配内存。dma_alloc_writecombine函数会调用dma_alloc_attrs函数:
ARM体系的DMA操作结构为arm_dma_ops:
arm_dma_alloc函数调用__dma_alloc函数,__dma_alloc函数中会用到DMA mask参数:
DMA地址必须填充到S3C6410X的LCD控制器的地址寄存器中。S3C6410X的窗口缓冲地址与大小寄存器见表9-7。
表9-7 S3C6410X的窗口缓冲地址与大小寄存器
(www.xing528.com)
(续)
这些寄存器的宏定义如下:
/*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结构记录了这些参数信息:
s3c_fb_set_par函数将DMA地址写入相应的寄存器:
免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。