小弟今天经过痛苦的摸索终于解决了ATI驱动的安装问题,感谢ATI的新驱动和rage3d.org上面各位大虾的补丁,终于可以玩tux racer了,虽然不好玩(个人观点).不敢独享,特将过程写再者里,以防菜鸟在遇到同样的困难:
1.下载 ATI最新的驱动程序,http://www.ati.com/support/driver.html 选择你需要的驱动版本,我这里针对的是xorg 6.8,kernel 2.6.10的驱动,要确认你的内核和x的版本,运行 http://www2.ati.com/drivers/linux/Check.sh 和 uname -a
2.下载这个补丁,来自www.rage3d.org
3.安装rpm包 rpm -Uh --force 下载的软件包的名字.rpm 主意看这里出现的错误信息.
4.打补丁 如果是FC系列的话,cd /lib/modules/fglrx/, patch -p0 < 下载的补丁的路径和文件名 注意看是不是有两行输出表示patch 成功了.进入下一步.不行检查路径.
5.cd /lib/modules/fglrx/build_mod 运行 sh make.sh 注意出错的话请不要继续 cd .. sh make_install.sh
6.备份原来的 xorg.conf(非常重要的一步,别怪我没警告你) cp /etc/X11/xorg.conf /随便你放在哪里
7.fglrxconfig 配置显卡,随便选择吧, 也可以参考我的, 基本上都可以回车,只是注意显示器的刷新率,好好想想,最好别超过85
8.别忙着重新启动,肯定不行,生成的配置文件在 /etc/X11 下面,叫做 XF86Config-4,这是给XFree86用的,我现在用的是xorg.6.8,对应的配置文件是xorg.conf,你刚才备份吧,所以运行 cd /etc/X11 cp XF86Config-4 xorg.conf
9.还有一个地方,个人感觉很变态,重起之后,x起不来,进入字符界面下面,x的log指出鼠标和键盘出错, 没办法,修改xorg.conf,这个文件是分Section的 Section "InputDevice" 中间一堆什么注释阿,乱七八糟的 后面有一行 EndSection 表示这一个Section结束了 这样的 "InputDevice" Section有两个,一个是描述鼠标的一个是描述键盘的, 把新的xorg.conf里的这两段都用旧的替换(我们备份的文件xorg.conf里面有同样的"InputDevice"Section
10.重新启动的时候到了.顺利进入图形界面,恭喜你成功了,请跳到 13步继续,我得跟不幸的人先说几句.
11,如果黑屏闪动,出现错误提示,不要慌张,先看看错误信息,给自己到杯水,把这个信息抄下来找我.我可没说一定有办法解决.
12.显恢复了再说,把之前备份的文件复制回去, cp /你放的哪了/xorg.conf /etc/X11/
13. 运行两个重要的命令,确认我们的3d好用了, 运行 flgrxinfor 看输出是不是 [root@robin X11]# fglrxinfo display: :0.0 screen: 0 OpenGL vendor string: ATI Technologies Inc. OpenGL renderer string: RADEON 9550 Generic OpenGL version string: 1.3.4769 (X4.3.0-8.8.25) 类似的. [root@robin X11]# dmesg | grep agp Linux agpgart interface v0.100 (c) Dave Jones agpgart: Detected NVIDIA nForce2 chipset agpgart: Maximum main memory to use for agp memory: 203M agpgart: AGP aperture is 128M @ 0xd0000000 agpgart: Found an AGP 3.0 compliant device at 0000:00:00.0. agpgart: Putting AGP V3 device at 0000:00:00.0 into 8x mode agpgart: Putting AGP V3 device at 0000:02:00.0 into 8x mode 看看你的3d和AGP开好了没有. 如果AGP有错误,请接着修改你的xorg.conf文件,找到一行写着
Option "UseInternalAGPGART" "yes"
改成 Option "UseInternalAGPGART" "no"
再重起看看,有些帖子建议使用init 3,或者telinit 3,这个经过测试,有些系统没办法正确运行这个命令,所以重新启动更加方便快捷.
附: fglrx8.08-2.6.10.patch --- agpgart_be.c 2005-01-06 9:05:02.000000000 +0100 +++ agpgart_be.c 2005-01-06 9:19:16.000000000 +0100
@@ -255,6 +255,12 @@ } #endif
+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,10) +#define firegl_pci_find_class(class,from) pci_get_class(class,from) +#else +#define firegl_pci_find_class(class,from) pci_find_class(class,from) +#endif + int agp_backend_acquire(void) { if (agp_bridge.type == NOT_SUPPORTED) { @@ -718,7 +724,7 @@ * AGP devices and collect their data. */
- while ((device = pci_find_class(PCI_CLASS_DISPLAY_VGA << 8, + while ((device = firegl_pci_find_class(PCI_CLASS_DISPLAY_VGA << 8, device)) != NULL) { pci_read_config_dword(device, 0x04, &scratch);
@@ -794,6 +800,13 @@ command &= ~0x00000001; } } + +#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,10) + // the reference count has been increased in agp_backend_initialize. + if (device) + pci_dev_put(device); +#endif + /* * PASS2: Figure out the 4X/2X/1X setting and enable the * target (our motherboard chipset). @@ -839,8 +852,9 @@ * command registers. */
- while ((device = pci_find_class(PCI_CLASS_DISPLAY_VGA << 8, + while ((device = firegl_pci_find_class(PCI_CLASS_DISPLAY_VGA << 8, device)) != NULL) { + pci_read_config_dword(device, 0x04, &scratch);
if (!(scratch & 0x00100000)) @@ -871,6 +885,12 @@ } }
+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,10) + // the reference count has been increased in agp_backend_initialize. + if (device) + pci_dev_put(device); +#endif + return 0; /* success */ }
@@ -5119,8 +5139,9 @@ * AGP devices and collect their data. */
- while ((device = pci_find_class(PCI_CLASS_DISPLAY_VGA << 8, + while ((device = firegl_pci_find_class(PCI_CLASS_DISPLAY_VGA << 8, device)) != NULL) { + pci_read_config_dword(device, 0x04, &scratch);
if (!(scratch & 0x00100000)) @@ -5187,6 +5208,13 @@ command &= ~0x00000001; } } + +#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,10) + // the reference count has been increased in agp_backend_initialize. + if (device) + pci_dev_put(device); +#endif + /* * PASS2: Figure out the 4X/2X/1X setting and enable the * target (our motherboard chipset). @@ -5217,8 +5245,9 @@ * command registers. */
- while ((device = pci_find_class(PCI_CLASS_DISPLAY_VGA << 8, + while ((device = firegl_pci_find_class(PCI_CLASS_DISPLAY_VGA << 8, device)) != NULL) { + pci_read_config_dword(device, 0x04, &scratch);
if (!(scratch & 0x00100000)) @@ -5249,6 +5278,12 @@ } }
+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,10) + // the reference count has been increased in agp_backend_initialize. + if (device) + pci_dev_put(device); +#endif + return(0); /* success */ }
@@ -6494,10 +6529,10 @@ // locate host bridge device #ifdef __x86_64__ do { - dev = pci_find_class(PCI_CLASS_BRIDGE_HOST << 8, dev); + dev = firegl_pci_find_class(PCI_CLASS_BRIDGE_HOST << 8, dev); } while((dev) && !agp_check_supported_device(dev)); #else - if ((dev = pci_find_class(PCI_CLASS_BRIDGE_HOST << 8, NULL)) == NULL) + if ((dev = firegl_pci_find_class(PCI_CLASS_BRIDGE_HOST << 8, NULL)) == NULL) return -ENODEV; #endif
@@ -7040,8 +7075,12 @@ &agp_bridge.mode); return hp_zx1_setup(dev); } - dev = pci_find_class(PCI_CLASS_BRIDGE_HOST << 8, dev); + dev = firegl_pci_find_class(PCI_CLASS_BRIDGE_HOST << 8, dev); } while (dev); + +#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,10) + if(dev) pci_dev_put(dev); +#endif return -ENODEV; } #endif /* __ia64__ */ @@ -7462,6 +7501,11 @@ agp_bridge.free_gatt_table(); vfree(agp_bridge.key_list);
|