FrameBuffer配置
2016年05月11日

概述

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没有生效.如果找不到/sys/bus/platform/drivers/uvesafb/uvesafb.0/vbe_modes这个文件,说明你很可能在配置内核时没有配置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, 视频画面成功出来了。

相关链接

gentoo wiki fbsplash http://wiki.gentoo.org/wiki/Fbsplash
给gentoo装上启动画面 http://cache.baiducontent.com/c?m=9f65cb4a8c8507ed4fece763104c8c38524380146380cd452189c6559366594b5a65e1a672754c428e986b6075ee0b02b9b16c6f23467df7cdc7dd1d81fdcf75388856753242d50048&p=c462c20585cc43f008e2947f065c83&newp=9766c54ad6c24afb03afc7710f4dcb231610db2151d3da142b8fd1&user=baidu&fm=sc&query=gentoo+splash&qid=&p1=1