一、在lcd中的使用
对于lcd显存就是常说的famebuffer,它是由内核在内核空间分配的一片空间,那么在用户空间我们如何去对它进行读写
操作呢。常用的方法是通过read()、write()函数进行读写,那么有没有更便捷的方法呢?答案是肯定的,我们还可以通过
mmap()对它进行映射,这样在用户空间就能像操作内存一样操作它。是不是很方便。
int main(int argc, char **argv)
{
int fd_fb;
int screen_size;
unsigned char *fb_mem;
struct fb_var_screeninfo var;
struct fb_fix_screeninfo fix;
fd_fb = open("/dev/fb0", O_RDWR); //注意打开方式要与mmap第三个参数设置对应
if (fd_fb < 0)
{
printf("cat't open /dev/fb0\n");
return -1;
}
if (ioctl(fd_fb, FBIOGET_VSCREENINFO, &var))
{
printf("can not get screen var information\n");
return -1;
}
if (ioctl(fd_fb, FBIOGET_FSCREENINFO, &fix))
{
printf("can not get screen fix information\n");
return -1;
}
screen_size = var.xres * var.yres * var.bits_per_pixel / 8;
//将fd_fb对应的文件映射出来并将首地址给fb_mem
fb_mem = (unsigned char *)mmap(NULL, screen_size, PROT_READ | PROT_WRITE, MAP_SHARED, fd_fb, 0);
printf("fb_mem = %p\n", fb_mem);
if (fb_mem == (unsigned char *)-1)
{
printf("can not map the fd_fb\n");
return -1;
}
//像操作内存一样操作framebuffer
// memset(fb_mem, 0, screen_size); //clean the screen black
memset(fb_mem, 0xff, screen_size); //clean the screen white
close(fd_fb);
return 0;
}