- framebuffer是LCD的一种驱动程序
- 在 Linux 系统中通过 Framebuffer 驱动程序来控制 LCD。Frame 是帧的意思,buffer 是缓冲的意思,这意味着 Framebuffer 就是一块内存,里面保存着一帧图像。
- 驱动程序中,会在内存中分配一个framebuffer;framebuffer中会保存有LCD屏幕上每一个像素点的颜色值(32bit、16bit等)
记住:framebuffer是驱动程序分配的,mmap只是将其映射到用户空间
- framebuffer中每一块数据都是和LCD的像素一一对应的,对应用程序来说只要把数据放入framebuffer里即可
- 谁来把framebuffer中的数据来LCD屏幕上显示出来呢?
- 由LCD控制器来做
- 驱动程序设置好LCD控制器后,它就会自动的、周而复始的去framebuffer里把第n个像素的值取出在LCD屏幕上显示,从头取到尾、周而复始
- 当应用程序想要修改某个像素的颜色值时,首先要知道屏幕的分辨率是多少,并且要知道每个像素用多少位来表示(bpp:bits per pixel)
- 某像素在framebuffer中的偏移地址(字节):(yxres + x)bpp/8
- 一个像素的颜色是怎么表示出来的
16bpp是,从24/32bpp的RGB中每种颜色取高5/6/5位组合成16bit
framebuffer编程
- 打开设备节点
- 获取LCD相关参数
- 映射 Framebuffer
要映射一块内存,需要知道它的地址──这由驱动程序来设置,需要知道它的大小──这由应用程序决定。
MAP_SHARED 表示该区域是共享的,APP 写入数据时,会直达驱动程序
- 描点函数
能够在 LCD 上描绘指定像素后,就可以写字、画图,描点函数是基础。
void lcd_put_pixel(int x, int y, unsigned int color)
{
unsigned char *pen_8 = fb_base+y*line_width+x*pixel_width;
unsigned short *pen_16;
unsigned int *pen_32;
unsigned int red, green, blue;
pen_16 = (unsigned short *)pen_8;
pen_32 = (unsigned int *)pen_8;
switch (var.bits_per_pixel)
{
case 8:
{
*pen_8 = color;
break;
}
case 16:
{
/* 565 */
red = (color >> 16) & 0xff;
green = (color >> 8) & 0xff;
blue = (color >> 0) & 0xff;
color = ((red >> 3) << 11) | ((green >> 2) << 5) | (blue >> 3);
*pen_16 = color;
break;
}
case 32:
{
*pen_32 = color;
break;
}
default:
{
printf("can't surport %dbpp\n", var.bits_per_pixel);
break;
}
}
}