18.5 Linux 帧缓冲设备显示缓冲区的申请与释放
在嵌入式系统中,一种常见的方式是直接在 RAM (随机存取存储器)空间中分配一段显示缓冲区,典型结构如图 18.4 所示。
图18.4 在 RAM 中分配显示缓冲区
分析:
在分配显示缓冲区时一定要考虑cache的一致性问题,因为系统往往会通过DMA方式搬移数据,合适的方式是使用 dma_alloc_writecombine()函数分配一段writecombining区域,对应的 writecombining区域由dma_free_writecombine()函数释放,如代码清单18.10 所示。
writecombining 意味着“写合并”,它允许写入的数据被合并,并临时保存在写合并缓冲区(WCB)中,直到进行一次 burst 传输而不再需要多次 single 传输。通过 dma_alloc_ writecombine()分配的显示缓冲区不会出现 cache 一致性问题。
代码清单 18.10 帧缓冲设备显示缓冲区的分配与释放
static int __init xxxfb_map_video_memory(struct xxxfb_info *fbi)
{
fbi->map_size = PAGE_ALIGN(fbi->fb->fix.smem_len + PAGE_SIZE);
fbi->map_cpu = dma_alloc_writecombine(fbi->dev, fbi->map_size,
&fbi->map_dma,GFP_KERNEL); /* 分配内存 */
fbi->map_size = fbi->fb->fix.smem_len; /* 显示缓冲区大小 */
if (fbi->map_cpu) {
memset(fbi->map_cpu, 0xf0, fbi->map_size);
fbi->screen_dma = fbi->map_dma;
fbi->fb->screen_base = fbi->map_cpu;
fbi->fb->fix.smem_start = fbi->screen_dma;
}
return fbi->map_cpu ? 0 : - ENOMEM;
}
static inline void xxxfb_unmap_video_memory(struct s3c2410fb_info *fbi)
{
/* 释放显示缓冲区 */
dma_free_writecombine(fbi->dev,fbi->map_size,fbi->map_cpu, fbi->map_dma);
}