应用程序操作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源码分析的主要内容,如果未能解决你的问题,请参考以下文章

Linux 帧缓冲子系统详解:LCD介绍framebuffer驱动框架LCD驱动源码分析

结合APP分析LCD驱动程序

15.linux-LCD层次分析(详解)

10. LCD驱动程序 ——框架分析

分析内核自带的LCD驱动程序\_基于IMX6ULL

Linux驱动分析之LCD驱动架构