Linux确实是非常优秀的操作系统,不管安装在哪种硬件平台上都能让人玩得得心应手。所以抱回MSI 的Wind U100之后的头等要务就是装上Gentoo Linux,折腾许久终于让它们结合为一体,可以无线上网、可以挂载BT、电驴。但一段时间后却明显地感觉到不爽。一方面U100使用1024x600的分辨率,一方面Gentoo的945GME驱动不支持这个分辨率,使得U100只能在800x600的分辨率下显示控制台,结果所有的字符都被拉宽了一点,看上去很别扭。平时不直接在小本上写程序,也就没怎么想去解决它,这几天休假没事做,花了半个晚上来折腾这个本本,终于搞定。现在看着使用正常分辨率的控制台,眼睛那叫一个爽,赶紧把解决的过程和方法记录下来以备参考。
问题的根源在于LCD显示屏工作在非标准分辨率上,不被显卡驱动支持。如果能让驱动支持非标准分辨率,那么问题将迎刃而解。用Google翻了翻半个地球,发现有个叫“915resolution”的软件提供让驱动支持非标准分辨率的办法,原理是动态地修改显卡芯片的Video BIOS。为达到这个效果,还需要将uvesafb编译进内核。Uvesafb是Linux使用的新一代FrameBuffer驱动,和v86d配合工作。另外,还得用fbset实用程序强制FrameBuffer设备使用1024x600的分辨率。也就是说,要解决分辨率不匹配问题,得安装下列软件:
1. uvesafb:产生、驱动和管理FrameBuffer虚拟设备,如fb0;
2. v86d:提供运行x86指令的仿真环境;
3. 915resolution:动态修改Video BIOS以支持非标准分辨率;
4. fbset:在用户态下强制fb0设备使用非标准分辨率。
安装过程非常简单:
1.
配置内核,在“Device Drivers”大项中勾选“Connector - unified userspace <-> kernelspace linker
”项目,将其编译进内核;
2.
同样在“Device Drivers => Graphics support => Support for frame buffer devices
”项目中,勾选“Userspace VESA VGA graphics support
”项目,将uvesafb驱动编译成内核模块;
3. 勾选“Intel 830M/845G/852GM/855GM/865G/915G/945G support”,将945GME驱动编译进内核;
4. 编译内核;
5.
使用emerge安装v86d
(依赖于klibc包);
6.
重新配置内核,在“General Setup”大项中勾选“Initial RAM filesystem and RAM disk (initramfs/initrd) support
”,使用
/usr/share/v86d/initramfs
做为 Initramfs
源文件(CONFIG_INITRAMFS_SOURCE="/usr/share/v86d/initramfs"
);
7. 重新编译内核,安装到/boot启动区;
8. 访问www.geocities.com/stomljen/,下载0.5.3版的915resolution;
9. 下载chezphil.org/tmp/915r_945GME.patch,为915resolution打上945GME的补丁;
10. 编译、安装915resolution;
11. 使用emerge安装fbset;
12. 在/etc下配置一个fb.modes文件:
# cat /etc/fb.modes
mode "1024x600-60"
geometry 1024 600 1024 600 8
timings 20461 144 40 18 1 104 3
endmode
至此四个软件都安装完毕,下面进行调试和测试。先查看915resolution能找到的分辨率模式:
# 915resolution -l
Intel 800/900 Series VBIOS Hack : version 0.5.3
Chipset: 945GME
BIOS: TYPE 1
Mode Table Offset: $C0000 + $269
Mode Table Entries: 36
Mode 30 : 640x480, 8 bits/pixel
Mode 32 : 800x600, 8 bits/pixel
Mode 34 : 1024x768, 8 bits/pixel
Mode 38 : 1280x1024, 8 bits/pixel
Mode 3a : 1600x1200, 8 bits/pixel
Mode 3c : 1920x1440, 8 bits/pixel
Mode 41 : 640x480, 16 bits/pixel
Mode 43 : 800x600, 16 bits/pixel
Mode 45 : 1024x600, 16 bits/pixel
Mode 49 : 1280x1024, 16 bits/pixel
Mode 4b : 1600x1200, 16 bits/pixel
Mode 4d : 1920x1440, 16 bits/pixel
Mode 50 : 640x480, 32 bits/pixel
Mode 52 : 800x600, 32 bits/pixel
Mode 54 : 1024x600, 32 bits/pixel
Mode 58 : 1280x1024, 32 bits/pixel
Mode 5a : 1600x1200, 32 bits/pixel
Mode 5c : 1920x1440, 32 bits/pixel
通过动态地替换不使用的模式(如34号模式),可以实现强制使用非标准模式的目的:
# 915resolution 34 1024 600 8
四个参数分别是模式编号、列数、行数和颜色深度(8位)。设定好模式之后,装载uvesafb:
# modprobe uvesafb
这时候可能会突然黑屏,这是正常的,继续执行下面的指令:
# fbset 1024x600-60
看到效果了吗?正常而华丽的1024x600的控制台出来了,这下眼睛是不是舒服多了?打开vi,一个美现新世界呐。
虽然使用这个方案很好,但有三点比较烦人:由于915resolution是动态修改Video BIOS,这意味着每次重启系统都不会自动使用1024x600的分辨率,而且按下Atl+Fn功能键切换控制台时其它控制台也不会自动使用这个分辨率。不过这不算个问题,因为只要简单地写一个切换脚本并将它放到init脚本中就一切OK。最后,使用uvesafb似乎不会自动进入屏保状态,这个就留待下次解决吧。