概述
framebuffer是出现在 2.2.xx 内核当中的一种驱动程序接口.Linux是工作在保护模式下,所以用户态进程是无法象DOS那样使用显卡BIOS里提供的中断调用来实现直接写屏,Linux抽象出FrameBuffer这个设备来供用户态进程实现直接写屏.
而vesa/uvesa则是framebuffer的驱动程序(gentoo-sources >= 2.6.23以上,内核包含uvesafb驱动),关于这部分的介绍可以参考 Gentoo 的文档:配置引导程序 doc介绍说uvesa似乎更高级,所以采用后者
splash、zhcon、mplayer在console播放都依赖framebuffer.
配置安装
添加FB支持和驱动
编辑内核配置 make menuconfig
Device Drivers ->
Graphics support --->
<*> Support for frame buffer devices --->
<*> Userspace VESA VGA graphics support
[*] VESA VGA graphics support //这一项似乎可以不用选择,gentoo wiki里提示需要勾选
*** Frame buffer hardware drivers ***
Console display driver support --->
-*- VGA text console
[*] Enable Scrollback Buffer in System RAM
(64) Scrollback Buffer Size (in KB)
<*> Framebuffer Console support
-*- Map the console to the primary display device
[ ] Framebuffer Console Rotation
[*] Support for the Framebuffer Console Decorations
[ ] Select compiled-in fonts
Input Device Support --->
<*> Event Interface 有关framebuffer主题的按键支持 默认已开启 不用修改
体现在文件上如下:
CONFIG_CONNECTOR=y
CONFIG_FB_UVESA=y
CONFIG_FRAMEBUFFER_CONSOLE=y
CONFIG_FB_CON_DECOR=y
编译内核
编译内核 make && modeuls_install
重新编译klibc
重新编译klibc,由于klibc同样需要uvesafb驱动,所以需要重新编译.
安装v86d
安装v86d
emerge -av v86d
v86d依赖klibc,如果未安装过klibc会自动检查依赖一起安装,如果klibc已经安装在系统上,由于klibc也依赖uvesafb,所以先重新编译klibc再安装v86d(v86d主要负责在用户空间执行操作).
启用initramfs
继续编辑内核配置 make menuconfig
General setup --->
[*] Initial RAM filesystem and RAM disk (initramfs/initrd) support
(/usr/share/v86d/initramfs) Initramfs source file(s)
再次编译安装新内核
make && make modules_install
make install
修改grub引导
vim /boot/grub/grub.conf
kernel /boot/kernel root=/dev/sdax video=uvesafb:1024x768-32,mtrr:3,ywrap quiet
重启后,不出意外的话,framebuffer就启用了,能够看到字体什么的都变成分辨率设定的大小了。
系统支持的分辨率可以利用hwinfo命令查询 hwinfo --framebuffer
.没有的可以emerge -av hwinfo
另外要注意的是,uvesafb分辨率的问题,uvesafb驱动支持的分辨率都列在以下文件:
/sys/bus/platform/drivers/uvesafb/uvesafb.0/vbe_modes
请不要在grub.conf中设置uvesafb不支持的分辨率,否则你会感觉uvesafb没有生效.
如果找不到这个文件,说明你很可能在配置内核时没有配置Initramfs source file(s),请重新配置并编译安装。
fbcondecor和splash
fbcondecor,即FrameBuffer Console Decoration,用于美化使用FrameBuffer的Console.简单地说,uvesafb提供了Console的容器,而fbcondecor负责装饰。
splash是利用framebuffer对console进行图形支持的工具,及由splash可以为系统添加图形化启动画面和console美化。
splashutils似乎可以支持鼠标,但是我这里编译总是失败。
配置安装
echo media-gfx/splashutils fbcondecor >> /etc/portage/package.use
emerge -av splashutils
安装主题包
emerge -av media-gfx/splash-themes-gentoo
emerge -av media-gfx/bootsplash-themes
这个看需要,第二个包包含很多主题,主题包保存在 /etc/splash/目录,下面子目录每个目录表示一个主题.
可能需要添加很多例外配置
vim /etc/portage/package.use
media-libs/freetype static-libs
media-libs/libpng static-libs
media-libs/lcms static-libs
virtual/jpeg static-libs
media-libs/libjpeg static-libs
media-libs/libjpeg-turbo static-libs
media-libs/libmng static-libs
sys-libs/zlib static-libs
app-arch/bzip2 static-libs
console 测试
splash_manager -c set --theme=package_name --tty=1
package_name 区分大小写,只包含主题名称即可
启动测试
splash_manager -c demo -t package_name -m s --steps=100
package_name 同上,steps可以适当减少.
这些命令不要在x窗体上运行
其他命令可以 splash_manager --help
或者 查看 gentoo wiki [[http://wiki.gentoo.org/wiki/Fbsplash|关于fbsplash]]
更新启动配置
vim /boot/grub/grub.conf
set root=....
kernel /kernel-x.xx.xx-gentoo root=/dev/sdxx ro rootfstype=xxxx video=uvesafb:1024x768-32 splash=silent,fadein,theme=GoGentooGo quiet console=tty1
video参数是对分辨率的设置,这个前边framebuffer的时候介绍过
splash参数是对主题的设置
silent使用进度条代替日志输出
fadein淡入屏幕
theme主题名称
console参数指定开/关机的动画输出到终端屏幕,如果未设置则无法显示动画
添加系统服务 openrc
rc-update add fbcondecor boot
如果不把fbcondecor添加到系统启动当中,系统启动后console不会应用选择的主题
相关信息
截图命令:fbgrab filename
此命令似乎在编译玩framebuffer就有了
看图命令:fbv filename
需要安装,注意根据需要添加jpeg gif png USE.
echo media-gfx/fbv jpeg gif png >> /etc/portage/package.use
接下去是搞mplayer。看了很多文章,貌似都说mplayer天生就支持输出到framebuffer中,但是我的mplayer在刚装好时mplayer -vo help
了一下,并没有发现任何framebuffer相关的设备。强行写mplayer -vo /dev/fb0
或者 mplayer -vo fbdev
或者 mplayer -vo fbdev2
都是没用的,直接报告 “video: no video”。我估计着是编译问题。因为我的mplayer是emerge来的,很可能由于USE标记后少了功能
经过一番查找后,终于确定,USE里需要加上 fbcon. 编辑/etc/make.conf
,加上了fbcon这个标记,然后emerge --info
了一下,发现果然,VIDEO_CARDS那里出现了我所要的fbdev等几个东西。果断重新编译了mplayer,再使用mplayer -vo fbdev2 /path/of/video_file
, 视频画面成功出来了。