第18章LCD设备驱动之Linux 帧缓冲设备显示缓冲区的申请与释放

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);
 }

猜你喜欢

转载自blog.csdn.net/xiezhi123456/article/details/80751567
今日推荐