+ -
当前位置:首页 → 问答吧 → 编写framebuffer驱动程序,内存映射出错

编写framebuffer驱动程序,内存映射出错

时间:2008-07-20

来源:互联网

先前写好的字符设备驱动程序(char设备),由于图形系统方案变动,需要修改为framubuffer驱动。现在想法是在内核空间开一块内存区,通过mmap来映射到用户空间以在用户空间写入数据。内核在这个内存区间中读出数据来显示到屏中。
在申请这个内存空间并映射到用户空间时总不成功。先后试过几个方法都失败了:
1. 直接用全局数组:
int iSize = PAGE_ALIGN(VIDEOSIZE + PAGE_SIZE);
static unsigned char pVideomem[iSize];

info->fix.smem_start = ((unsigned int)pvideomemory) + PAGE_SIZE;
info->fix.smem_size = VIDEOSIZE;
info->screen_base = ??

2.用vmalloc申请内存
static unsigned char pVideomem = NULL;
if (!(pVideomem = vmalloc(iVideoSize)))
        return retval;

info->fix.smem_start = ((unsigned int)pvideomemory) + PAGE_SIZE;
info->fix.smem_size = VIDEOSIZE;

按以上方法申请的内存在用户程序用mmap映射时都失败。测试程序能得到LCD设备信息,但不能将数据写到framebuffer空间中,即程序出错。

按内核资料,info->screen_base应该设置为虚拟地址,而info->fix.smem_start则是物理地址。按上面的实现方法,并不需要具体的物理地址,因为数据只是完成空间映射,并不实际地写物理端口(实际写端口是从这个空间中取数据再进行写点操作)。则此时info->screen_base,info->fix.smem_start应该设置为什么值呢?

请各位高手支招,怎样地framebuffer中申请内存空间并设置info结构数据来实现framebuffer数据从用户空间映射到内核空间。谢谢。      

作者: clm705   发布时间: 2008-07-20