应用程序操作LCD源码分析
Posted 正在起飞的蜗牛
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了应用程序操作LCD源码分析相关的知识,希望对你有一定的参考价值。
1、LCD设备节点文件介绍
帧缓冲设备对应的设备文件为/dev/fb*,linux最多支持32个帧缓冲设备,分别为/dev/fb0到/dev/fb31,而/dev/fb是当前默认的帧缓冲设备,通常指向/dev/fb0;
2、操作LCD的逻辑流程分析
(1)使用open函数打开LCD设备的设备节点文件;
(2)调用ioctl函数获取LCD设备的信息;
(3)调用mmap函数,映射帧缓冲区到用户空间;
(4)将要显示的内容写入到帧缓冲区;
3、应用操作LCD设备的源码
#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <linux/fb.h>
#include <sys/ioctl.h>
#include <sys/mman.h>
// 设备节点
#define FBDEVICE "/dev/fb0"
//屏幕的实际分辨率
#define WIDTH 1024
#define HEIGHT 600
#define WHITE 0xffffffff // test ok
// 设置屏幕背景色
void draw_back(unsigned int width, unsigned int height, unsigned int color);
// 全局变量
unsigned int *pfb = NULL;
int main(void)
int fd = -1, ret = -1;
struct fb_fix_screeninfo finfo = 0;
struct fb_var_screeninfo vinfo = 0;
// 第1步:打开设备
fd = open(FBDEVICE, O_RDWR);
// 第2步:获取设备的硬件信息
ret = ioctl(fd, FBIOGET_FSCREENINFO, &finfo);
printf("smem_start = 0x%x, smem_len = %u.\\n", finfo.smem_start, finfo.smem_len);
ret = ioctl(fd, FBIOGET_VSCREENINFO, &vinfo);
printf("xres = %u, yres = %u.\\n", vinfo.xres, vinfo.yres);
printf("xres_virtual = %u, yres_virtual = %u.\\n", vinfo.xres_virtual, vinfo.yres_virtual);
printf("bpp = %u.\\n", vinfo.bits_per_pixel);
// 第3步:进行mmap
unsigned long len = vinfo.xres_virtual * vinfo.yres_virtual * vinfo.bits_per_pixel / 8;
printf("len = %ld\\n", len);
pfb = mmap(NULL, len, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
if (NULL == pfb)
perror("mmap");
return -1;
printf("pfb = %p.\\n", pfb);
//往帧缓冲区写数据
draw_back(WIDTH, HEIGHT, WHITE);
close(fd);
return 0;
void draw_back(unsigned int width, unsigned int height, unsigned int color)
unsigned int x, y;
for (y=0; y<height; y++)
for (x=0; x<width; x++)
*(pfb + y * WIDTH + x) = color;
ioctl函数中的命令在linux/fb.h文件中定义,支持多个命令,想了解更多命令的去查询这个文件;
以上是关于应用程序操作LCD源码分析的主要内容,如果未能解决你的问题,请参考以下文章