之前获取LCD屏幕参数信息时了解到,LCD屏是 FrameBuffer 设备,操作 FrameBuffer 设备 其实就是在读写 /dev/fb0 文件。除此之外,LCD屏上包含多个像素点,绘制点、线、矩形框本质是在修改这些像素点的颜色。

目录
1、定义 lcd_color 结构体
为了后续方便传递颜色,这里定义一个 lcd_color 结构体,结构体声明如下。
struct lcd_color
{
u_int8_t red;
u_int8_t green;
u_int8_t blue;
};
我们要如何将颜色传递给LCD屏呢?根据我们之前获取到的屏幕信息,LCD屏颜色格式是RGB565。我们改变像素点颜色,实际上就是传递一个值。
这个值低5位表示蓝色,中间6位表示绿色,高5位表示红色,因此,我们拿到R、G、B对应的数值后需要将他们按下面的方式拼接。

#define RGB565(color) (color->blue & 0x05) | \
((color->green & 0x06) << 5) | \
((color->red & 0x05) << 11)
2、获取LCD设备参数信息
这里就不再赘述,请参考:获取LCD屏幕参数信息
struct fb_fix_screeninfo fb_fix; // 固定参数信息
struct fb_var_screeninfo fb_var; // 可变参数信息
int fd = open("/dev/fb0", O_RDWR);
if (fd < 0)
{
perror("open fb failed");
exit(-1);
}
ioctl(fd, FBIOGET_FSCREENINFO, &fb_fix); // 获取固定参数信息
ioctl(fd, FBIOGET_VSCREENINFO, &fb_var); // 获取可变参数信息
3、mmap 建立显存映射
(1) 为什么要建立显存映射?
建立显存映射的目的是提升IO效率。实际上使用read/write操作显存也是可以的,然而数据量较大的时候,普通IO的方式效率较低。一般显示的图像是动态变化的,图像数据需要不断被更新,这种情况下的数据量较大,建议采用存储映射IO方式。
mmap 函数的详细使用可以参考:mmap函数详解
(2) 代码实现
值得一提的是,虽然最开始画的LCD示意图是一个矩形,但是在内存

该文介绍了在Linux系统中操作LCD屏幕的基本步骤,包括定义颜色结构体lcd_color,获取LCD设备参数,使用mmap建立显存映射以提高IO效率,以及定义绘制点、线和矩形的函数。通过这些函数,可以对LCD屏幕进行像素级别的颜色设置和图形绘制。
最低0.47元/天 解锁文章
2466





