Frame buffer

Linux的LCD驱动通常是以Framebuffer的方式工作的,不管是何种LCD控制器,其驱动结构和使用接口都是一样的,比如说一个字符设备接口"/dev/fb0"。

标准内核中就有LCD驱动的例子,可以参考内核源代码的drivers/video/*下的代码,那些就是Framebuffer的显示驱动,每种显卡或者LCD控制器都会有自己的一个C文件,比如说你自己的你可以叫做mylcd_fb.c,所有特定的设备都会用到其中的一个叫做fbmem.c的文件。

fbmem.c提供register_framebuffer()等接口,就是说你的LCD控制器要通过此注册接口向内核注册一个29号主设备号的字符设备如"/dev/fb0"(如果dev_fs文件系统的话则是"/dev/fb/0")。

GUI程序对LCD的操作是通过内存映射mmap()的机制来往LCD屏上写东西的,所以fbmem.c中也提供好了mmap接口实现,也就是说我们在用户空间用GUI程序如X11或者QT/Embedded等直接打开/dev/fb0得到一个文件描述符如fb_desc,然后用addr = mmap(NULL, ..., fb_desc, ...);将LCD的内存空间映射到用户空间。

至于硬件的LCD控制器的初始化看看芯片手册吧:-)

Frame buffer 设备驱动的特殊之处

对Frame Buffer驱动几个不明白的地方:

首先,对于drivers/video/下的fbmem.c文件,在它里面虽然提供了register_framebuffer()等接口,这个函数中只有一个参数: *fb_info,这与我们看到的一般驱动不一样,一般的驱动利用register_chrdev()函数注册设备,在register_chrdev()中包括三个参数:主设备号,设备名和一个对设备操作的结构.

第二,fbmem.c文件中提供的是一些函数的原形,它不是一个标准的模块形式(标准的模块一般为init_module和cleanup_module两部分),如果我要把它变成一个可动态加载的模块,应该怎么做?

第三,你所说的"每种显卡或者LCD控制器都会有自己的一个C文件,比如说你自己的你可以叫做mylcd_fb.c",这里提到的mylcd_fb.c文件是指什么,是不是你在后门提到的"硬件的LCD控制器的初始化"文件,也就是说,把硬件的LCD控制器的初始化写到mylcd_fb.c文件中?

第四,如果我把硬件LCD控制器的初始化写成一个文件,比如:init.c;而且也已经把fbmem.c文件修改成为一个可动态加载的模块(包含有init_module和cleanup_module两部分),那么把这两个文件放在一起并编译成一个module,这样是不是一个完整的lcd驱动?

Frame buffer与console

把对console的支持内嵌到fb的驱动中,或许有其自己的道理,我没有看出来。不过既然要提供这种支持,我们的驱动程序就要添枝加叶了。

在准fb设备设备驱动中是没有对console支持的。只有在非标准的fb驱动,也就是基于skeletonfb.c架构的程序,需要提供这部分代码。下面从各个方面介绍framebuffer对console的支持。

Frame buffer与console

Framebuffer作为显卡在内核中的注册设备,为了满足应用需要,通常还要为console操作提供专用操作函数。Console是系统提供的一种特殊的文本输出终端,如图所示。常用的console已经不再是从前的单色显示,而是16色或者更多颜色显示。根据文本的代表的不同属性,显示不同的颜色。

console和fb的高层理解

当我们在fb中引入console后,就相当于把一张白纸变成了一个日记本。本来对于fb来说只有颜色和位置的关系,引入console后,首先就是console的描述。

每个console相当于日记本的一页,不同的console可以切换。Console因为是要显示文本,又和字体联系到一起。Console的管理是十分复杂的,远远超过了framebuffer本身。在RH9中,我们可以自己体验一下console和fb的协调问题。

使用Init3多用户模式登陆,这里是没有X server支持的。所有的输入输出都是基于console的。Framebuffer就相当于你的显示器。通过ALT+CTRL+F*,我们可以切换到不同的console,而每个console的设置都可以很独立的完成。每隔console会在自己的数据区记录历史命令,在不同的console可以登陆不同的用户到系统。但是,因为只有一个屏幕,所以当前可视的console只有一个。Frame buffer驱动程序要能够根据ALT+CTRL+F*切换命令去完成console的切换显示。

这样大家应该明白frame buffer和console的关系了吧。后续我们会具体讲述fb对console的支持。但是对console本身不会设计太多,具体参考tty或console的设计。当完成了fb对console的支持,frame buffer device driver设计就完了:)