FrameBuffer驱动学习
Framebuffer翻译过来是帧缓冲,是Linux系统为显示设备提供的一个接口,它将显示缓冲区抽象,屏蔽图像硬件的底层差异,允许上层应用程序在图形模式下直接对显示缓冲区进行读写操作。用户不必关心物理显示缓冲区的具体位置及存放方式,这些都由帧缓冲设备驱动本身来完成。对于帧缓冲设备而言,只要在显示缓冲区中与显示点对应的区域写入颜色值,对应的颜色会自动在屏幕上显示。
帧缓冲设备是标准的字符设备,主设备号为29,对应于/dev/fb(/dev/fb1,/dev/fb2…)设备文件。
注:代码版本2.6.35.6
帧缓冲数据结构
fb_info结构体
fb.h [include\linux]
|
fb_info是Linux为帧缓冲设备定义的驱动层接口。它不仅包含了设备的设置参数,状态以及操作函数。每个帧缓冲设备都与一个fb_info结构相对应。
其中node成员域标示了特定的FrameBuffer,实际上也就是一个FrameBuffer设备的次设备号。fb_var_screeninfo结构体成员记录用户可修改的显示控制器参数,包括屏幕分辨率和每个像素点的比特数。fb_fix_screeninfo中记录用户不能修改的显示控制器的参数,如屏幕缓冲区的物理地址,长度。
fb_ops结构体
fb.h [include\linux]
|
它是提供给底层设备驱动的一个接口。通常我们编写字符驱动的时候,要填写一个file_operations结构体,并使用register_chrdev()注册之,以告诉Linux如何操控驱动。当我们编写一个FrameBuffer的时候,就要依照Linux FrameBuffer编程的套路,填写fb_ops结构体。这个fb_ops也就相当于通常的file_operations结构体。
fb_var_screeninfo结构体
|
fb_var_screeninfo结构体成员记录用户可修改的显示控制器参数,包括屏幕分辨率和每个像素点的比特数。fb_var_screeninfo中的xres定义屏幕一行有多少个点, yres定义屏幕一列有多少个点, bits_per_pixel定义每个点用多少个字节表示。
fb_fix_screeninfo结构体
|
fb_fix_screeninfo中记录用户不能修改的显示控制器的参数,如屏幕缓冲区的物理地址,长度。当对帧缓冲设备进行映射操作的时候,就是从fb_fix_screeninfo中取得缓冲区物理地址的。上述数据成员都需要在驱动程序中初始化和设置。
其他的结构体都可以在fb.h [include\linux]中找到。
注册与注销帧缓冲设备
定义在fb.h [include\linux]
|
实现在fbmem.c [drivers\video]
代码略。