在ThinkPad T23上使用Slackware Linux

--让T23支持FrameBuffer

Author: Cowyn Li

什么是FrameBuffer

转载自<http://blog.csdn.net/ryman/archive/2006/10/25/1351005.aspx>。

FrameBuffer是出现在2.2.xx内核当中的一种驱动程序接口。这种接口将显示设备抽象为帧缓冲区。 用户可以将它看成是显示内存的一个映像,将其映射到进程地址空间之后,就可以直接进行读写操作, 而写操作可以立即反应在屏幕上。该驱动程序的设备文件一般是/dev/fb0、/dev/fb1等等。比如,假设 现在的显示模式是1024x768-8位色,则可以通过如下的命令清空屏幕:

  $ dd if=/dev/zero of=/dev/fb0 bs=1024 count=768
        

在应用程序中,一般通过将FrameBuffer设备映射到进程地址空间的方式使用,比如下面的程序就打开 /dev/fb0设备,并通过mmap系统调用进行地址映射,随后用memset 将屏幕清空(这里假设显示模式是 1024x768-8 位色模式,线性内存模式):

  int fb;
  unsigned char* fb_mem;
  fb = open ("/dev/fb0", O_RDWR);
  fb_mem = mmap (NULL, 1024*768, PROT_READ|PROT_WRITE,MAP_SHARED,fb,0);
  memset (fb_mem, 0, 1024*768);
        

FrameBuffer设备还提供了若干ioctl命令,通过这些命令,可以获得显示设备的一些固定信息(比如 显示内存大小)、与显示模式相关的可变信息(比如分辨率、象素结构、每扫描线的字节宽度),以及 伪彩色模式下的调色板信息等等。

通过FrameBuffer设备,还可以获得当前内核所支持的加速显示卡的类型(通过固定信息得到),这种 类型通常是和特定显示芯片相关的。比如目前最新的内核(2.4.9)中,就包含有对S3、Matrox、nVidia、 3Dfx等等流行显示芯片的加速支持。在获得了加速芯片类型之后,应用程序就可以将PCI设备的内存 I/O(memio)映射到进程的地址空间。这些memio一般是用来控制显示卡的寄存器,通过对这些寄存器的 操作,应用程序就可以控制特定显卡的加速功能。PCI设备可以将自己的控制寄存器映射到物理内存空 间,而后,对这些控制寄存器的访问,给变成了对物理内存的访问。因此,这些寄存器又被称为"memio"。 一旦被映射到物理内存,Linux的普通进程就可以通过mmap将这些内存I/O映射到进程地址空间,这样就 可以直接访问这些寄存器了。当然,因为不同的显示芯片具有不同的加速能力,对memio的使用和定义也 各自不同,这时,就需要针对加速芯片的不同类型来编写实现不同的加速功能。比如大多数芯片都提供 了对矩形填充的硬件加速支持,但不同的芯片实现方式不同,这时,就需要针对不同的芯片类型编写不同 的用来完成填充矩形的函数。说到这里,读者可能已经意识到FrameBuffer只是一个提供显示内存和显示 芯片寄存器从物理内存映射到进程地址空间中的设备。所以,对于应用程序而言,如果希望在 FrameBuffer之上进行图形编程,还需要完成其他许多工作。举个例子来讲,FrameBuffer就像一张画布, 使用什么样子的画笔,如何画画,还需要你自己动手完成。

设置

如果你需要在console下操作,如果你需要做自己的bootsplash,等等,则继续吧。首先需要让内核支持 framebuffer,以下是我在T23的内核里有关framebuffer的选项设置:

  Code maturity level options --->
    [*] Prompt for development and/or incomplete code/drivers
  Processor type and features --->
    [*] MTRR (Memory Type Range Register) support
  Device Drivers --->
    Block devices --->
      <*>Loopback device support
      <*>RAM disk support
      (4096) Default RAM disk size
      [*] Initial RAM disk (initrd) support
    Graphics support --->
      [*] Support for frame buffer devices
      [*] VESA VGA graphics support
    Console display driver support --->
      --- VGA text console
      <*>Video mode selection support
      <*>Framebuffer Console support
        

如果你喜欢看到小企鹅图标,则在如下选项里选择。

  Device Drivers --->
    Logo configuration --->
        

所有选择完毕后,进行一般的内核编译操作。完成文件的复制之后,修改bootloader的配置文件,正常 添加新编译的image,并加入以下内容:

lilo:

  vga=830
  append="video=vesa:ywrap,mtrr"
            

grub:

  kernel参数加上video=vesa:ywrap,mtrr vga=830
            

关于vga参数的选择,我的LCD分辨率是1400×1050,vga选择了830,网上有人说用828,有人说用 834,不过我都试了,grub都不认,如果你也有这种分辨率的LCD,自己试试吧。如果你的分辨率是其他 的,参见下表:

      | 640x480 800x600 1024x768 1280x1024
  ----+--------------------------------------
  256 |  0x301   0x303   0x305     0x307
  32k |  0x310   0x313   0x316     0x319
  64k |  0x311   0x314   0x317     0x31A
  16M |  0x312   0x315   0x318     0x31B
        

BTW:如果你觉得konsole字体不是那么完美,可以用setconsolefont fontname命令更改,这将修改 /etc/rc.d/rc.font文件,确保rc.font文件有x属性。在/usr/share/kbd/consolefonts/ 目录下有很多字体供选择,我觉得sd不错:)

OK了,如果用lilo的别忘了执行一次lilo命令,然后reboot看看效果吧:)


Valid XHTML | ©2010 dOtImes.cOm, All rights reserved. | Creative Commons | Powered by Slackware, Nginx. Posted and Maintained by Cowyn Li
Last Update: Monday, 2008-11-17, 16:10, GMT+0800.