二. framebuffer内部结构
Framebuffer对应的源文件在linux/drivers/video/目录下。总的抽象设备文件为fbcon.c,在这个目录下还有与各种显卡驱动相关的源文件。FrameBuffer设备驱动基于如下文件:
1) linux/include/linux/fb.h定义一些变量结构和宏。
2) linux/drivers/video/fbmem.c实现设备入口和初始化。
3)xxxfb.c: 自己添加的设备驱动文件,如struct fb_info;实现入口点函数: xxxfb_init; xxxfb_setup;
1.首先是fb.h。framebuffer设备很大程度上依靠了下面数据结构。
1).Struct fb_var_screeninfo描述图形卡的特性的。通常是被用户设置的。
2).Struct fb_fix_screeninfo定义了图形卡的硬件特性,是不能改变的。
3).Struct fb_cmap描述设备无关的颜色映射信息。可以通过FBIOGETCMAP和FBIOPUTCMAP 对应的ioctl操作设定或获取颜色映射信息.
4).Struct fb_info定义了当前图形卡framebuffer设备状态,一个图形卡可能有两个framebuffer,在这种情况下,就需要两个fb_info结构。这个结构是唯一在内核空间可见的。在这个结构中有一个fb_ops指针,指向驱动设备工作所需的函数集。
5).struct fb_ops用户应用可以使用ioctl()系统调用来操作设备,这个结构就是用以支持ioctl()的这些操作的。(注: fb_ops结构与file_operations 结构不同,fb_ops是底层操作的抽象,而file_operations是提供给上层系统调用的接口,可以直接调用.)ioctl()系统调用在文件fbmem.c中实现,通过观察可以发现ioctl()命令与fb_ops’s 中函数的关系:
FBIOGET_VSCREENINFO fb_get_var
FBIOPUT_VSCREENINFO fb_set_var
FBIOGET_FSCREENINFO fb_get_fix
FBIOPUTCMAP fb_set_cmap
FBIOGETCMAP fb_get_cmap
FBIOPAN_DISPLAY fb_pan_display
如果我们定义了fb_XXX_XXX 方法,用户程序就可以使用FBIOXXXX宏的ioctl()操作来操作硬件。
2.其次是fbmem.c。fbmem.c 处于Framebuffer设备驱动技术的中心位置.它为上层应用程序提供系统调用也为下一层的特定硬件驱动提供接口;那些底层硬件驱动需要用到这儿的接口来向系统内核注册它们自己. fbmem.c 为所有支持FrameBuffer的设备驱动提供了通用的接口.
1) 全局变量
struct fb_info *registered_fb[FB_MAX];
int num_registered_fb;
这两变量记录了所有fb_info 结构的实例,fb_info 结构描述显卡的当前状态,所有设备对应的fb_info 结构都保存在这个数组中,当一个FrameBuffer设备驱动向系统注册自己时,其对应的fb_info 结构就会添加到这个结构中,同时num_registered_fb 为自动加1.
2)fbmem.c 实现了如下函数.
register_framebuffer(struct fb_info *fb_info);
unregister_framebuffer(struct fb_info *fb_info);
这两个是提供给下层FrameBuffer设备驱动的接口,设备驱动通过这两函数向系统注册或注销自己。几乎底层设备驱动所要做的所有事情就是填充fb_info结构然后向系统注册或注销它。
3.xxxfb.c。自己添加的设备驱动文件,如以下等内容。
static struct fb_ops xxxfb_ops = {
owner: THIS_MODULE,
fb_open: xxxfb_open, /* only if you need it to do something */
fb_release: xxxfb_release, /* only if you need it to do something */
fb_get_fix: fbgen_get_fix,
fb_get_var: fbgen_get_var,
fb_set_var: fbgen_set_var,
fb_get_cmap: fbgen_get_cmap,
fb_set_cmap: fbgen_set_cmap,
fb_pan_display: fbgen_pan_display,
fb_ioctl: xxxfb_ioctl, /* optional */
};
三framebuffer驱动。
1.首先需要添加下面的代码到fbmem.c
static struct {
const char *name;
int (*init)(void);
int (*setup)(char*);
} fb_drivers[] __initdata = {
#ifdef CONFIG_FB_YOURCARD //红色为添加部分
{ "driver_name", xxxfb_init, xxxfb_setup },
#endif
2.其次在xxxfb.c 中根据自己的需要重新分配显存大小。例如:
#define VIDEOMEMSIZE (1*1024*1024) /* 1 MB */
再次根据自己的硬件设备修改相应的var 信息。主要修改
xxxfb_set_var(struct fb_var_screeninfo *var, int con, struct fb_info *info)
下面是函数fb_set_var()的执行步骤:
1)检测是否必须设定模式
2)设定模式
3)设定颜色映射
4) 根据以前的设定重新设置LCD控制器的各寄存器。
四.配置添加驱动
1.make menuconfig时,首先进入Character devices,选中里面的Virtualterminal.如果希望控制台在液晶上输出,则选中Support for console on virtual terminal。
2.退到上一层界面我们就可以看到Console device 的选项,进入后将光标落在Framebuffer Support 上,按回车键进入,在里面选择自己所需要的framebuffer设备即可。
3.在Advanced low level 中可以配置bpp packed pixel support,然后选中Selectcompiled-in fonts 即可。
等操作系统运行以后就会在/dev下面看到fb 这个设备。它的major应该是29,第一个设备的minor应该是0。
五.其它
编译内核时,选择framebuffer模式,启动时屏幕上有一企鹅图片,不知这是如何造成的这个图片可以去掉或改动吗?
答:可以将drivers/video/fbcon.c: fbcon_setup()中if (logo) { } 代码去掉。