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