花了三天时间,终于把主板集成声卡给装好了,不敢独享,给需要的朋友们。
解决的方法还是很简单,只不过中间走了很多的弯路,还进了一个死胡同。
Part I 有一些分析过程,其实也是很简单的。如果你只是想知道应该怎么做,可以直接跳到ParII
Part II 说明了修改步骤。
Part I
在实验室的时候,电脑的集成声卡很差,有爆音,还有杂声。所以就在TAOBAO上淘了一块aureal的au8820。这块声卡,很好找,Debian装好的时候,自带的ALSA就能找到。可是主板集成的声卡,死活也找不到。
我用lspci明明能看到这个device
#lspci
00:00.0 Host bridge: ATI Technologies Inc Unknown device 7910
00:01.0 PCI bridge: ATI Technologies Inc Unknown device 7912
00:07.0 PCI bridge: ATI Technologies Inc Unknown device 7917
00:12.0 IDE interface: ATI Technologies Inc SB600 Non-Raid-5 SATA
00:13.0 USB Controller: ATI Technologies Inc SB600 USB (OHCI0)
00:13.1 USB Controller: ATI Technologies Inc SB600 USB (OHCI1)
00:13.2 USB Controller: ATI Technologies Inc SB600 USB (OHCI2)
00:13.3 USB Controller: ATI Technologies Inc SB600 USB (OHCI3)
00:13.4 USB Controller: ATI Technologies Inc SB600 USB (OHCI4)
00:13.5 USB Controller: ATI Technologies Inc SB600 USB Controller (EHCI)
00:14.0 SMBus: ATI Technologies Inc SB600 SMBus (rev 13)
00:14.1 IDE interface: ATI Technologies Inc SB600 IDE
00:14.3 ISA bridge: ATI Technologies Inc SB600 PCI to LPC Bridge
00:14.4 PCI bridge: ATI Technologies Inc SB600 PCI to PCI Bridge
00:14.5 Multimedia audio controller: ATI Technologies Inc SB600 AC97 Audio
00:18.0 Host bridge: Advanced Micro Devices [AMD] K8 [Athlon64/Opteron] HyperTransport Technology Configuration
00:18.1 Host bridge: Advanced Micro Devices [AMD] K8 [Athlon64/Opteron] Address Map
00:18.2 Host bridge: Advanced Micro Devices [AMD] K8 [Athlon64/Opteron] DRAM Controller
00:18.3 Host bridge: Advanced Micro Devices [AMD] K8 [Athlon64/Opteron] Miscellaneous Control
01:05.0 VGA compatible controller: ATI Technologies Inc Unknown device 791e
02:00.0 Ethernet controller: Realtek Semiconductor Co., Ltd. RTL8101E PCI Express Fast Ethernet controller (rev 01)
03:06.0 Multimedia audio controller: Aureal Semiconductor Vortex 1 (rev 02)
我用alsaconf,可以找到au8820,可是找不到集成的声卡。所以,先看一下alsaconf的机制是什么样的。
所有加载的pci driver都会在/lib/modules/2.6.18-4-amd64/modules.pcimap这个文件中记录。(这里的2.6.18-4-amd64是和系统相关的)
如下:
more /lib/modules/2.6.18-4-amd64/modules.pcimap
# pci module vendor device subvendor subdevice class class_mask driver_data
BusLogic 0x0000104b 0x00001040 0xffffffff 0xffffffff 0x00000000 0x00000000 0x0
BusLogic 0x0000104b 0x00000140 0xffffffff 0xffffffff 0x00000000 0x00000000 0x0
BusLogic 0x0000104b 0x00008130 0xffffffff 0xffffffff 0x00000000 0x00000000 0x0
其中就包括了,这个driver能作用的device的vendor和device。
alsaconf就是根据这两个参数来找的。
可以看到,对于au8820在modules.pcimap里有一行
#cat /lib/modules/2.6.18-4-amd64/modules.pcimap | grep -i au
snd-au8820 0x000012eb 0x00000001 0xffffffff 0xffffffff 0x00000000 0x00000000 0x0
#lspci -nn|grep -i
可以看到
00:14.5 Multimedia audio controller [0401]: ATI Technologies Inc SB600 AC97 Audio [1002:4382]
03:06.0 Multimedia audio controller [0401]: Aureal Semiconductor Vortex 1 [12eb:0001] (rev 02)
vendor和device都是相同的。也就是说,这个device可以用snd-au8820这个driver来驱动
集成声卡的[1002:4382],在/lib/modules/2.6.18-4-amd64/modules.pcimap这个文件里找不到相应的driver.
这下好了,到[url]www.alsa-project.org/[url]下了最新了driver.
alsa-driver-1.0.14rc4.tar.bz2
解压后进目录
用grep -R 4382 *
还是找不到对这个device的支持。于是我想到,应该只要把这个device的加到某个驱动里,就可能用了。事实证明,这是对的,最后,我也是这样做的。
不过,就是这个时候,犯了一个大错,就多花了一天。:(
因为网上找到的SB600都说是用snd-hda-intel这个驱动。所以,改动了snd_hda_intel.c这个文件。
编译后加载上去。alsaconf真找到了。可是还是没有声音出来。又上网找了半天,都没有找到想要的结果。看来只能自己解决了。
.configure的时候加上--with-debug=detect
重新编译,加载。加载的时候显示出了一个错误:
no codec found
往回找,原来是读一个叫STATESTS的register的时候,读的数据是0x0。
加了几行代码,读出0x00~0xff的所有的register,并不是所有的都是0x00,看来读的过程还是没有问题,只是数据有问题。我也没有datasheet,也没有办法进一步调试了。
在下进了死胡同了,在网上东撞西撞的。无意中发现hda-intel是要SB600 AZALIA的驱动。而我的,是AC97。难道是开始就选错了?晕死了,重新来吧。(AZALIA是AC97的升级)
发现ATIIXP是用的AC97的CODEC。
修改atiixp.c后,编译,加载。果然成了。
Part II
下面的操作都要在root下完成
0.
这个修改是否支持你的主板?如果你是onda a69g,那一定可以用。
#lspci -nn
如果你的集成声卡也是[1002:4382],那么就可以用。
1.
上 www.alsa-project.org下载最新的driver,utilities
ftp://ftp.alsa-project.org/pub/drive....14rc4.tar.bz2
ftp://ftp.alsa-project.org/pub/utils....14rc4.tar.bz2
解压
#tar jxf alsa-driver-1.0.14rc4.tar.bz2
#tar jxf alsa-utils-1.0.14rc4.tar.bz2
2.装备utilities
#cd alsa-utils-1.0.14rc4
#./configure && make && make install
3.修改atiixp.c
#cd ../alsa-driver-1.0.14rc4
#vi alsa-kernel/pci/atiixp.c
在290行左右有一个结构
static struct pci_device_id snd_atiixp_ids[] = {
{ 0x1002, 0x4341, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0 }, /* SB200 */
{ 0x1002, 0x4361, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0 }, /* SB300 */
{ 0x1002, 0x4370, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0 }, /* SB400 */
{ 0, }
};
加一行,成如下
static struct pci_device_id snd_atiixp_ids[] = {
{ 0x1002, 0x4341, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0 }, /* SB200 */
{ 0x1002, 0x4361, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0 }, /* SB300 */
{ 0x1002, 0x4370, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0 }, /* SB400 */
{ 0x1002, 0x4382, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0 }, /* SB600 */
{ 0, }
};
保存退出(用:wq)
3.
编译,安装
#./configure && make && make install
4.
#modprobe snd-atiixp
5.
#alsaconf
6.
#alsamixer
调节声音(注意的是,声卡是静音的,要打开)
7.
#alsactl store
完成
编