Linux驱动开发 (framebuffer驱动)

1.什么是framebuffer

frambuffer就是linux内核驱动申请的一片内存空间,cpu内部有个lcd控制器,它有个单独的dma用来将frambuffer中的数据拷贝到lcd的sram中去 拷贝到lcd的sram中的数据就会显示在lcd上,LCD驱动和framebuffer驱动没有必然的联系。

framebuffer帧缓冲(简称fb)是linux内核中虚拟出的一个设备。

framebuffer向应用层提供一个统一标准接口的显示设备。

从驱动来看,fb是一个典型的字符设备,而且创建了一个类/sys/class/graphics。

2.帧缓冲设备驱动的结构

在这里插入图片描述

3.framebuffer的使用步骤

-> 打开设备文件 /dev/fb0。
-> 获取当前设备信息 #include
-> mmap做映射。
->填充framebuffer。

framebuffer应用编程实践:

#include 
#include 
#include 
#include 
#include 
#include 
#include 

// 宏定义
#define FBDEVICE	"/dev/fb0"
#define WIDTH		1024	
#define HEIGHT		600

#define WHITE		0xffffffff			// test ok
#define BLACK		0x00000000
#define RED			0xffff0000
#define GREEN		0xff00ff00			// test ok
#define BLUE		0xff0000ff			
#define GREENP		0x0000ff00			// 一样,说明前2个ff透明位不起作用

// 函数声明
void draw_back(unsigned int width, unsigned int height, unsigned int color);
void draw_line(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);
	if (fd < 0)
	{
		perror("open");
		return -1;
	}
	printf("open %s success.\n", FBDEVICE);
	
	// 第2步:获取设备的硬件信息
	ret = ioctl(fd, FBIOGET_FSCREENINFO, &finfo);
	if (ret < 0)
	{
		perror("ioctl");
		return -1;
	}
	printf("smem_start = 0x%x, smem_len = %u.\n", finfo.smem_start, finfo.smem_len);
	
	ret = ioctl(fd, FBIOGET_VSCREENINFO, &vinfo);
	if (ret < 0)
	{
		perror("ioctl");
		return -1;
	}
	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);
	draw_line(RED);
	

	close(fd);
	
	return 0;
}


//刷背景函数
void draw_back(unsigned int width, unsigned int height, unsigned int color)
{
	unsigned int x, y;
	
	for (y=0; y

4.framebuffer驱动框架总览

Linux驱动开发 (framebuffer驱动)_第1张图片

5.内核实现fbmen_init()函数:路径drivers/video/fbmem.c

负责创建graphics类、注册FB的字符设备驱动、register_framebuffer()函数提供接口给具体framebuffer驱动编写着来注册fb设备。 

在这里插入图片描述

在这里插入图片描述 

在这里插入图片描述

fbmem_init层的register_chrdev注册函数的参数struct file_operations fb_fops:

在这里插入图片描述

Linux驱动开发 (framebuffer驱动)_第2张图片 

 6.驱动层framebuffer驱动分析:

s3cfb.c驱动主体:drivers/video/samsung

在这里插入图片描述

 s3c_device_fb:

在这里插入图片描述

你可能感兴趣的:(Linux驱动)