功能描述

  • 编写应用程序来操控FrameBuffer设备,如LCD屏幕。

实践要点——基础知识

FrameBuffer

  • FrameBuffer是帧缓冲的意思,意味着FrameBuffer是一块内存,里面保存着一帧图像。

  • 在Linux系统中,显示设备被称为FrameBuffer设备,对应的设备文件为/dev/fbX,Linux下可支持多个FrameBuffer设备,最多可达32个。

  • 譬如有一个LCD的显示缓冲区的大小为1152000个字节,可以执行下面这条命令将LCD清屏(填充为黑色)。

    dd if=/dev/zero of/dev/fb0 bs=1024 count=1125

LCD应用编程流程&关键代码

  1. 打开/dev/fbX设备文件

  2. 使用ioctl()函数获取当前显示设备的参数信息,如分辨率、像素格式等,根据屏幕参数计算显示缓冲区大小

    struct fb_fix_screeninfo fbFInfo;                //LCD屏幕对应的两个关键的结构体数据,定义在中
    struct fb_var_screeninfo fbVInfo;
    
    fd = open("/dev/fb0", O_RDWR);
    
    ioctl(fd, FBIOGET_VSCREENINFO, &fbVInfo);
    ioctl(fd, FBIOGET_FSCREENINFO, &fbFInfo);
    
    screenSize = fbFInfo.line_length * fbVInfo.yres;//显示缓冲区大小等于一行字节数 * 行数
    width = fbVInfo.xres;                            //宽,列数
    height = fbFInfo.yres;                           //高,行数
  3. 将屏幕的显示缓冲区映射到用户空间(mmap)

    screenBase = mmap(NULL, screenSize, PROT_WRITE, MAP_SHARED, fd, 0);
    if((void*)screenBase == MAP_FAILED) {
       perror("mmap error");
       close(fd);
       exit(-1);
    }
    • 使用普通IO的方式(譬如直接read\write)也是可以的,但是当数据量比较大的时候,普通IO的方式效率较低。
  4. 读写屏幕的显示缓冲区,进行绘图或图片显示等操作

    • 即给对应位置的screeBase[i]赋对应颜色的值。
  5. 完成显示后,取消munmap取消映射,关闭设备文件

    munmap(screenBase, screenSize);
    close(fd);

像素格式

printf("像素格式: R<%d %d> G<%d %d> B<%d %d>\n", fbVInfo.red.offset, fbVInfo.red.length \
                                                fbVInfo.green.offset, fbVInfo.green.length \
                                                fbVInfo.blue.offset, fbVInfo.blue.length);
  • 上述代码一个示例输出如下:

    像素格式:R<11 5> G<5 6> B<0 5>

    分别表示RGB三种颜色分量的偏移量和长度。从输出可知,16bit颜色值中高5位表示R颜色通道,中间6位表示G颜色通道,低5位表示B颜色通道,所以这是一个RGB565格式的显示设备。

  • 显示格式可以通过修改设备树进行修改,或者通过ioctl修改。通过ioctl设置LCD的可变参数,使用是FBIOPUT_VSCREENINFO宏。

实践要点——显示BMP图片

BMP图像介绍

  • BMP(全称Bitmap)是Windows操作系统中的标准图像文件格式,采用位图映射存储格式,除了图像深度可选外(1bit、4bit、8bit、16bit、32bit),对图像数据没有任何压缩。因此,BMP图像文件所占用的空间很大,但是没有失真。
  • 典型的BMP图像组成:
    1. 文件头,14 Bytes,包含BMP文件的格式、大小、位图数据偏移量等信息;
    2. 信息头,40~56 Bytes,包含位图信息头大小、图像尺寸、图像大小、位平面数、压缩方式、颜色索引等信息;
      • 信息头中,图像的高度用4个字节表示。该值除了描述图像的高度外,还描述位图的方向。如果高度大于0,说明是倒向的位图,如果高度小于0,说明是正向的位图。一般情况下,都是大于0,即位图是倒向的。正向(左)和倒向(右)的区别见下图。
    3. 调色板,由颜色索引数决定;
    4. 位图数据,由图像尺寸决定,包含具体的图像数据。
      • 对于24位位图,3个字节数据表示一个像素点的颜色;16位2个;32位4个。
  • 一般常见的图像都是16位(RGB565)或24位(RGB888)为主,这样的图像为真彩色图像,是不需要调色板的,信息头后面紧跟的就是位图数据了。对于16色位图、256色位图,就要用到调色板了。

附录

说点什么
请文明发言!
支持Markdown语法
好耶,沙发还空着ヾ(≧▽≦*)o
Loading...