打印

驱动程序如何除错

[复制链接]
1367|2
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
jxmzzr|  楼主 | 2012-2-25 10:53 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
. 小技巧及问题排除请先看看声卡驱动程序目录的 FAQ 档. 这一节仍然在增修中. 6.1 编译驱动程序 Linux 核心原始码目录树如果 ALSA 驱动程序无法成功编译, 出现像找不到 ``version.h'' 或其它引入档(header files)之类的错误, 这是指您没有安装核心的引入档. 先花点时间看看 Kernel-HOWTO, 将最新近的核心解开到 /usr/src 并且下 make config命令. 6.2 载入驱动程序 请检查以下各条: 声卡兼容性您是否百分之百的确定您的声卡有支持呢? 千万要记得检查. 有时一片叫 X123 的声卡并不全等于叫 X123b 的, 这样可能会浪费您的时间. 在另一方面, 即使是有支持的卡也可能会找您麻烦 - 为了安装一片 CS4237B 的卡, 耗了我两个小时来搞清楚, 结果发现说明文件里有. (原文是 On the other hand, even a supported card can give you troubles - it took me two hours to figure out the installation of a CS4237B which was, after all, just a fine example of RTFM. ) ``Device busy'' 或 ``unresolved symbols''您可能在 2.0.x 版核心中将声卡支持编进核心内, 或是已载入 OSS/Lite(核心的)驱动程序(可用cat /proc/modules来检查). 移除该驱动程序或重新编译核心(请看 Kernel-HOWTO 后动手). 在 2.0 版核心中的音效模块叫做 "sound.o", 不应该被启用. (虽然 ALSA 的驱动程序 "snd.o" 可以.) 如果您的核心是 2.2.x 版, 而没有将音效支持编译进去, ALSA 驱动程序也会无法作用. 我也知道这两种不同的状况令人困扰, 所以我在此再作一次解释. 如果您用的是 2.0.x版核心 ("uname -a"命令传回像 "Linux penguin 2.0.35 #6 Wed Sep 23 10:19:16 CEST 1998 i686 unknown") 那么您必须将音效驱动程序剔除掉. 如果您的核心是 2.2.x版核心, 那么您需要音效驱动程序. 2.2.x 版核心应该将音效驱动程序编译进核心, 但不加入任何声卡的支持. 因此您要选音效支持, 但也确定不要加入任何声卡驱动程序. 又见 Unresolved symbols另一个造成 "unresolved symbols" 信息的原因可能是新版核心配合旧版驱动程序. 请在重新编译核心之后别忘了也重新编译 ALSA 驱动程序. 如此才可以确定驱动程序能配上您的新核心. 检查 PnP 设定确定声卡起动(active)了吗? 请另外花点时间读读 PnP-HOWTO, 确认您已正确地致动(activate)了您的声卡. 参数有设对吗?检查, 再三检查您的声卡设定参数. 请小心: 534 不等于 543, 0x534 也不等于 534. 同时, 有些声卡要载入的模块不是您预期的那个. 休息一下, 喝杯啤酒或什么的, 然后再看看您 modprobe 的结果. 例如 Crystal 4232 应该插入的驱动程序是 snd-card-cs4232, 不是 "snd-cs4231". 而 SoundBlaster PCI64 应该载入的是 "snd-audiopci", 非 snd-es1370. (这些在文件中都有写, 而笔者在写这篇 HOWTO 时, 还曾花了一个晚上试著用 snd-cs4231 让它发出声音.) 6.3 驱动程序载入了... 可是没声音 解除静音ALSA 驱动程序可以运用多数声卡都有的 "静音" 能力. 如果您载入了音效驱动程序, 一切看起来都还正确, 就是没有声音的话, 那么您可能忘计把静音取消掉了. 要这么做您要用 "amixer" 或 "alsamixer", 两者都附在驱动程序中. 只要键入:
amixer -c 1 master 70:70 unmuteamixer -c 1 pcm 70:70 unmuteamixer -c 1 cd 70:70 unmute
对多数的应用程序应该都有效的. OSS/Linux 的兼容性如果这是您首次使用 ALSA 驱动程序, 而您以前使用过核心内建的那个的话, 您可能想要能和过去兼容的能力.(即使用 /dev/pcmX 设备之能力). 这时您需要载入 "OSS 兼容驱动程序". 执行 modprobe snd-pcm1-oss (详见关于载入本驱动程序那一节. ). 请疝N: snd-pcm1-oss 不能于 snd-pcm1. 对旧驱动程序的支持所需要的是 snd-pcm1-oss. 6.4 一般性建言 试著用 "insmod"用 "insmod" 取代 kerneld 总是有用的. 也许因此您就可以在萤幕上看到错误信息了. 读 INSTALL 档.在驱动程序目录中的 INSTALL 档可以发现很多信息. 如果您的驱动程序不起作用, 别忘了看看这个档, 也许会有额外的信息. 除错信息如果以上的方法还是没有用, 您可以重新编译驱动程序, 要求它将除错信息送进 /var/log/messages 档中, 做为最后手段. 下cd /usr/src/alsa-driver-...命令进入驱动程序目录, 然后输入:
./configure --with-debug=detect; make clean; make
移除驱动程序(如果它已经启动的话, 请看后面有提到的移除模块小技巧) 然后用您刚刚用的 "modprobe" 指令安插新编译的驱动程序. 看看 /var/log/messages 里有没有任何相关信息. 如果都没有用呢...如果您无法由信息中取得线索, 写封 Email 到 ALSA 使用者通信论坛, alsa-user@alsa-project.org. 别忘了加上以下信息:
  • 您的声卡的名称以及其使用的蕊片.
  • 如果您的声卡是 ISA PnP 的, 放入 isapnp.conf 中有关的部份.
  • 您的 conf.modules 档或是启动 ALSA 驱动程序的命令行.
  • 所有在 /var/log/messages 中应该和 ALSA 驱动程序有关的信息.
6.5 回报臭虫 如果您发现了一只臭虫, ALSA 驱动程序开发组希望能够得知(至少)以下信息:
  • 驱动程序及核心的版本: 'cat /proc/asound/version'
  • 声卡信息
    • 厂商所标识的声卡名称
    • 该卡上面的各个蕊片标识
    • 'cat /proc/asound/cards' 的执行结果
  • 所有在 /var/log/messages 中的相关信息
  • 问题的描述
6.6 小技巧: 听 CD 时... 如果您使用kmod/kerneld 以及 ALSA 驱动程序来听 CD, 那么 kmod/kerneld 可能不会像预期一般载入驱动程序. 这是由于命令列的 CD 放音程序只会叫 CDROM 开始播放, 而不会使用到任何设备, 让 kmod/kerneld 来载入驱动程序. 这个问题的解可能就只有使用 modprobe 了. 6.7 小技巧: 安装 MIDI 序列驱动动程序 通常, 序列设备的 IO 埠会由标准的序列设备驱动程序占有. 所以在您可以进行 "modprobe snd-serial" 以前, 必须让驱动程序释放掉该序列设备. 以下是所需程序.
setserial /dev/ttyS0 uart nonemodprobe snd-serial
(如果您的 MIDI 设备使用不一样的设备,将 /dev/ttyS0 换成相对应的 /dev/ttySx) 6.8 小技巧: 换新核心? 换新模块! 当您更新核心后, 您可能需要重新编译 ALSA 驱动程序. 如果它们还在原来的 /usr/src 目录下, 请别忘了在您进行 ./configure, make, make install 之前先下 make clean 命令. 喔! 还有个不太一样的核心版本编号 "2.2.0ac1", 会被 configure 命令档抱怨不是数字. 我想这个在新版的命令档中会解决, 不然您可能得改变原始码中的核心版本编号. 6.9 小技巧: KDE 及 ALSA 驱动程序 如果您使用了 KDE, 但却无法听到诸如开启视窗或改变使用的桌面等系统音效, 不过其它音效动作正常. 也就是您的 CD 播放, MP3 播放以及混音器都很正常, 那么可能只是因为欠缺 "kwmsound" 而已. 所以: 确定在您的启动命令档($KDEDIR/bin/startkde)中有 "kwmsound". 6.10 小技巧: 使用 ALSA 设备 如果您以前有利用过 Linux 的音效支持, 那么您的应用程序可能需要用到 /dev/pcm0, /dev/audio 及 /dev/mixer. 使用 OSS 兼容模块 snd-pcm1-oss 是不错的解决方法, 但如果使用真正的 ALSA 设备(在 /dev/snd/下)的话那更好. 6.11 小技巧: 移除所有模块 要一个一个的移除十几个模块实在不是个好办法. 很幸运的, 所有的模块名都是由 snd- 开始, 所以用一点小小的命令列规划, 您可以轻易的下以下的命令移除 ALSA 音效驱动程序:
cat /proc/modules|gawk '/^snd-/{print $1}|xargs -i rmmod {}
Juergen Kahrs 写道: "我有一个命令档可以连 soundcore, soundlow 以及 sound 都一并消去, 如果它们已载入且没在使用中的话. 这个命令档处理 /proc/modules 三次, 这样在完成后应该不会有太多模块留下来." 他的解法是:
awk '/^snd/||/^sound/&&($3==0){system("rmmod " $1)}' /proc/modules /proc/modules /proc/modules
请注意: 如果有一个模块依赖另一个模块的话, 您不可以只移除较上层的那个. 这意味著您可能有必要下第二道命令. (我从来没碰到过这种情况; 看起来您可以以依照在 /proc/modules 中的顺序移除 ALSA 模块.) Next Previous Contents
沙发
txcy| | 2012-2-25 10:59 | 只看该作者
LZ这编辑太乱了

使用特权

评论回复
板凳
拿起书本| | 2012-2-25 11:22 | 只看该作者
嘿嘿,诚恳接受,下次发贴要注意排版。这样大家看的或许舒服一点。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

460

主题

2188

帖子

12

粉丝