LCD驱动

FrameBuffer

FrameBuffer又叫帧缓冲,是Linux为操作显示设备提供的-一个用户接口。用户应用程序可以通过FrameBuffer透明地访问不同类型的显示设备。从这个方面来说,FrameBuffer是硬件设备的显示缓存区的抽象。Linux抽象出FrameBuffer这个帧缓冲区可以供用户应用程序直接读写,通过更改FrameBuffer中的内容,就可以立刻显示在LCD显示屏上。
FrameBuffer是一一个标准的字符设备,主设备号是29,次设备号根据缓存区的数目而定。FrameBuffer 对应/dev/fb%d设备文件。根据显卡的多少,设备文件可能是/dev/fb0、/dev/fbl等。缓冲区设备也是-种普通的内存设备,可以直接对其进行读写。例如,对屏幕进行抓屏,可以使用下面的命令:

cp /dev/fb0 /home/liu/桌面/a.png

一一个系统上,可以有多个显示设备。例如一个系统上,又有一个独立的显卡,那么就有两个缓冲区设备文件/dev/fb1和/dev/fb2。应用程序利用/dev/fb0或者/dev/fbl来工作,向其中写入数据,就能够在屏幕上立刻看到显示的变化。

mmap将一个文件或者其它对象映射道用户的虚拟地址上。

void* mmap(void* start,size_t length,int prot,int flags,int fd,off_t offset);
int munmap(void* start,size_t length);

用户在使用FrameBuffer先对/dev/fb0进行映射,之后就可以直接对文件读写,

通过FrameBuffer,应用程序用mmap0把显存映射到应用程序虚拟地址空间。应用程序只需要将要显示的数据写入这个内存空间,然后LDC控制器会自动地将这个内存空间(显存)中的数据显示在LCD显示屏上。

LCD驱动_第1张图片

FrameBuffer的结构分析

重要结构体

struct fb_ cmap结构体:用来定义帧缓冲区设备的颜色表(colormap) 信息,可以通过ioctl(函数的FBIOGETCMAP和FBIOPUTCMAP命令设置colormap。
struct fb_ info 结构体:包含当前显示卡的状态信息,struct fb_ info 结构体只对内核可见。
struct fb_ ops 结构体:应用程序使用这些函数操作底层的LCD硬件,fb ops结构中定义的方法用于支持这些操作。这些操作需要驱动开发人员来实现。
struct fb_ fix_ screeninfo 结构体:定义了显卡信息,如framebuffer 内存的起始地址,地址长度等。
struct fb_ var_ screeninfo 结构体:描述了一种显卡显示模式的所有信息,如宽、高、颜色深度等,不同的显示模式对应不同的信息。
在FrameBuffer设备驱动程序中,这些结构体是互相关联,互相配合使用的。只有每一个结构体起到自己的作用,才能使整个FrameBuffer设备驱动程序正常工作。这几个结构体之间的关系如图15.2所示。

LCD驱动_第2张图片

一般来说, 应用程序通过内核对FrameBuffer的控制,主要有下面3种方式:
(1)读/写/dev/fb相当于读/写屏幕缓冲区。
(2)通过映射操作,可将屏幕缓冲区的物理地址映射到用户空间的一段虚拟地址中,之后用户就可以通过读写这段虚拟地址访问屏幕缓冲区,在屏幕上绘图。
(3)I/O控制对于帧缓冲设备,设备文件的ioctl()函数可读取/设置显示设备及屏幕的参数,如分辨率、显示颜色数、屏幕大小等。ioctl()函 数是由底层的驱动程序完成的。

编写FrameBuffer驱动的过程

LCD寄存器初始化,用kmalloc分配一片空间,注册fb设备

LCD驱动程序分析

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

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