功能描述
- 编写应用程序来操控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应用编程流程&关键代码
-
打开
/dev/fbX
设备文件 -
使用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; //高,行数 -
将屏幕的显示缓冲区映射到用户空间(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的方式效率较低。
-
读写屏幕的显示缓冲区,进行绘图或图片显示等操作
- 即给对应位置的screeBase[i]赋对应颜色的值。
-
完成显示后,取消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图像组成:
- 文件头,14 Bytes,包含BMP文件的格式、大小、位图数据偏移量等信息;
- 信息头,40~56 Bytes,包含位图信息头大小、图像尺寸、图像大小、位平面数、压缩方式、颜色索引等信息;
- 信息头中,图像的高度用4个字节表示。该值除了描述图像的高度外,还描述位图的方向。如果高度大于0,说明是倒向的位图,如果高度小于0,说明是正向的位图。一般情况下,都是大于0,即位图是倒向的。正向(左)和倒向(右)的区别见下图。
- 调色板,由颜色索引数决定;
- 位图数据,由图像尺寸决定,包含具体的图像数据。
- 对于24位位图,3个字节数据表示一个像素点的颜色;16位2个;32位4个。

- 一般常见的图像都是16位(RGB565)或24位(RGB888)为主,这样的图像为真彩色图像,是不需要调色板的,信息头后面紧跟的就是位图数据了。对于16色位图、256色位图,就要用到调色板了。
附录
声明:
本文采用
BY-NC-SA
协议进行授权,如无注明均为原创,转载请注明转自
SigmaPoet
本文地址: [正点原子I.MX6U ALPHA V2.2开发板]——FrameBuffer编程实践
本文地址: [正点原子I.MX6U ALPHA V2.2开发板]——FrameBuffer编程实践