一.framebuffer概述
Framebuffer在Linux中是作为设备来实现的,它是对图形硬件的一种抽象,代表着显卡中的帧缓冲区(Framebuffer)。通过Framebuffer设备,上层软件可以通过一个良好定义的软件接口访问图形硬件,而不需要关心底层图形硬件是如何工作的,比如,上层软件不用关心应该如何读写显卡寄存器,也不需要知道显卡中的帧缓冲区从什么地址开始,所有这些工作都由Framebuffer去处理,上层软件只需要集中精力在自己要做的事情上就是了。
Framebuffer的优点在于它是一种低级的通用设备,而且能够跨平台工作,比如Framebuffer既可以工作在x86平台上,也能工作在PPC平台上,甚至也能工作在m68k和SPARC等平台上,在很多嵌入式设备上Framebuffer也能正常工作。诸如Minigui之类的GUI软件包也倾向于采用Framebuffer作为硬件抽象层(HAL)。
从用户的角度来看,Framebuffer设备与其它设备并没有什么不同。Framebuffer设备位于/dev下,通常设备名为fb*,这里*的取值从0到31。对于常见的计算机系统而言,32个Framebuffer设备已经绰绰有余了(至少作者还没有看到过有32个监视器的计算机)。最常用到的Framebuffer设备是/dev/fb0。通常,使用Framebuffer的程序通过环境变量FRAMEBUFFER来取得要使用的Framebuffer设备,环境变量FRAMEBUFFER通常被设置为”/dev/fb0”。
从程序员的角度来看,Framebuffer设备其实就是一个文件而已,可以像对待普通文件那样读写Framebuffer设备文件,可以通过mmap()将其映射到内存中,也可以通过ioctl()读取或者设置其参数,等等。最常见的用法是将Framebuffer设备通过mmap()映射到内存中,这样可以大大提高IO效率。
二.开启framebuffer
1) $ sudo gedit /etc/initramfs-tools/modules加入如下两行内容
fbcon
vesafb
2) $ sudo gedit /etc/modprobe.d/blacklist-framebuffer.conf
将里面的vesafb这两行给注释掉。
3) $ sudo update-initramfs -u 更新initramwfs文件。
4) 重启系统
三.设定默认分辨率和颜色位数
1) $ sudo gedit /etc/default/grub
2) 在GRUB_CMDLINE_LINUX_DEFAULT = “quiet splash” 后面增加vga参数。
比如: GRUB_CMDLINE_LINUX_DEFAULT = “quiet splash vga=788” (其实这里可以不设置,根据环境运行的需要,通过fbset工具设置分辨率和色深)
vga参数和分辨率的对照表为640x480 800x600 1024x768 1280x1024
8bit 769 771 773 775
15bit 784 787 790 793
16bit 785 788 791 794
24bit 786 789 792 795
3)$ sudo grub-mkconfig
4)$ sudo update-grub
5)重启系统
四. 其他设置
开机后,fb0设备可能默认为不可访问。输入命令 $ chmod 775 /dev/fb0 可以打开fb0设备。
fbset是用来设置framebuffer的工具,包括设置分辨率,色深等信息。
$ sudo apt-get install fbset
安装好之后,运行 $ fbset 显示如下信息
mode "1366x768"
geometry 1366 768 1366 768 32
timings 0 0 0 0 0 0 0
accel true
rgba 8/16,8/8,8/0,0/0
endmode
则表示framebuffer可以运行。
通过 $ fbset --help 查看fbset的设置参数。
例如:设置分辨率和色深 $ fbset -xres 800 -yres 600 -depth 16
五. 参考文档
http://coffeee.iteye.com/blog/1285180
http://tldp.org/HOWTO/Framebuffer-HOWTO/