• framebuffer是LCD的一种驱动程序
  • 在 Linux 系统中通过 Framebuffer 驱动程序来控制 LCD。Frame 是帧的意思,buffer 是缓冲的意思,这意味着 Framebuffer 就是一块内存,里面保存着一帧图像。

image.png

  • 驱动程序中,会在内存中分配一个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

image.png
image.png

  • 一个像素的颜色是怎么表示出来的

image.png
image.png
16bpp是,从24/32bpp的RGB中每种颜色取高5/6/5位组合成16bit


framebuffer编程

  1. 打开设备节点

image.png

  1. 获取LCD相关参数

image.png
image.png

  1. 映射 Framebuffer

    要映射一块内存,需要知道它的地址──这由驱动程序来设置,需要知道它的大小──这由应用程序决定。

image.png
MAP_SHARED 表示该区域是共享的,APP 写入数据时,会直达驱动程序

  1. 描点函数

能够在 LCD 上描绘指定像素后,就可以写字、画图,描点函数是基础。

  1. void lcd_put_pixel(int x, int y, unsigned int color)
  2. {
  3. unsigned char *pen_8 = fb_base+y*line_width+x*pixel_width;
  4. unsigned short *pen_16;
  5. unsigned int *pen_32;
  6. unsigned int red, green, blue;
  7. pen_16 = (unsigned short *)pen_8;
  8. pen_32 = (unsigned int *)pen_8;
  9. switch (var.bits_per_pixel)
  10. {
  11. case 8:
  12. {
  13. *pen_8 = color;
  14. break;
  15. }
  16. case 16:
  17. {
  18. /* 565 */
  19. red = (color >> 16) & 0xff;
  20. green = (color >> 8) & 0xff;
  21. blue = (color >> 0) & 0xff;
  22. color = ((red >> 3) << 11) | ((green >> 2) << 5) | (blue >> 3);
  23. *pen_16 = color;
  24. break;
  25. }
  26. case 32:
  27. {
  28. *pen_32 = color;
  29. break;
  30. }
  31. default:
  32. {
  33. printf("can't surport %dbpp\n", var.bits_per_pixel);
  34. break;
  35. }
  36. }
  37. }