LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
查看: 2436|回复: 8

置顶的文章(2.6内核编译)U盘部分是否有问题

[复制链接]
发表于 2004-11-15 20:41:51 | 显示全部楼层 |阅读模式
首先感谢这篇文章的作者snoopyxp,按照他的文章编译都能通过.

但是,我发现usb驱动没有正确加载.

为使用U盘,需要加载uhci-hcd,但是文章中没有提及.文章中提到修改文件 /etc/rc.sysinit,加载模块hid.而实际上在2.6.9内核中已经没有模块叫做hid,同样的功能的模块是叫做usbhid.即使加载usbhid也不能使U盘能用,我试过,需要把 /etc/rc.sysinit 中的hid改为uhci-hcd,这样U盘就可以使用了.

上面是我的体会,我的知识水平有限,如果有不妥当之处,欢迎各位指正.我还有其他问题要向各位请教.
发表于 2004-11-15 21:01:52 | 显示全部楼层
8. 支持USB设备

linux-2.6.x的USB驱动模块的名字已经改变了, 所以由此引起的问题多多......, 对应于USB-2.0的host控制器的内核模块名字仍然是ehci-hcd, 对应USB-1.1的host控制器的内核模块名字已经从usb-ohci改为ochi-hcd, 对应于通用USB host控制器的内核模块名字已经从usb-uhci该为uhci-hcd.

然而不幸的是, 在安装module-init-tools程序包时生成的/etc/modprobe.conf配置文件却仍然使用usb-ohci这个名字. 例如:

alias usb-controller usb-ohci
alias usb-controller1 ehci-hcd

因此, 要把它改为:

alias usb-controller ohci-hcd
alias usb-controller1 ehci-hcd

如果不做这样的修改, 那么使用USB-1.1 host控制器的机器在启动内核的时候将着不到相应的驱动模块.

支持USB键盘的模块名字也从keybdev变为usbkbd, 支持USB鼠标的模块名字也从mousedev改为usbmouse. 因此, 我们必需修改启动脚本/etc/rc.sysinit文件. 同时为了兼容原有的2.4.x系统, 我们在脚本的一开始定义两个变量:

#
# ----- KERNEL 2.6.x support ------
# This is for compatibility between kernel-2.4.x and kernel-2.6.x
#
UNAME=`uname -r`
KERNELVER=${UNAME:0:3}
if [ "$KERNELVER" = "2.6" ]; then
#
# This is kernel-2.6.x
#
KSYMS=/proc/kallsyms
KEYBDEV_NAME=usbkbd
MOUSEDEV_NAME=usbmouse
else
#
# This is kernel-2.4.x
#
KSYMS=/proc/ksyms
KEYBDEV_NAME=keybdev
MOUSEDEV_NAME=mousedev
fi

然后, 把/etc/rc.sysinit脚本文件中出现keybdev和mousedev的地方都改为$KEYBDEV_NAME和$MOUSEDEV_NAME. 把脚本文件/etc/rc.sysinit中的needusbstorage部分从:

needusbstorage=
if [ $usb = "1" ]; then
needusbstorage=`LC_ALL=C grep -e "^I.*Cls=08" /proc/bus/usb/devices 2>/dev/null`
LC_ALL=C grep 'hid' /proc/bus/usb/drivers || action $"Initializing USB HID interface: " modprobe hid 2> /dev/null

action $"Initializing USB keyboard: " modprobe $KEYBDEV_NAME 2> /dev/null
action $"Initializing USB mouse: " modprobe $MOUSEDEV_NAME 2> /dev/null
fi

改为:

needusbstorage=
if [ $usb = "1" ]; then
if [ "$KERNELVER" = "2.6" ]; then
needusbstorage=`LC_ALL=C grep -e "^I.*Cls=08" /sys/bus/usb/devices 2>/dev/null`
LC_ALL=C grep 'hid' /sys/bus/usb/drivers || action $"Initializing USB HID interface: " modprobe hid 2> /dev/null
else
needusbstorage=`LC_ALL=C grep -e "^I.*Cls=08" /proc/bus/usb/devices 2>/dev/null`
LC_ALL=C grep 'hid' /proc/bus/usb/drivers || action $"Initializing USB HID interface: " modprobe hid 2> /dev/null
fi
action $"Initializing USB keyboard: " modprobe $KEYBDEV_NAME 2> /dev/null
action $"Initializing USB mouse: " modprobe $MOUSEDEV_NAME 2> /dev/null
fi

好了, 到此为止, 我们应该可以重新启动机器了, 赶快去体验最新的kernel-2.6.4吧:-)


这篇帖子不是我写的,我只是转载而已,没什么功劳,呵呵。
你说的hid应改为uhci-hcd不太正确,事实上hid提供的是usb 输入设备如键盘和鼠标的支持(原文档这个地方也有错误,在2.6内核中这个模块应该是usbhid,这点你是对的)。起usb盘存储设备支持的模块有三个ohci-hcd,ehci-hcd,uhci-hcd 根据usb版本及控制芯片的异同选用不同的模块。所以,文档中起u盘驱动作用的实际是:
alias usb-controller ohci-hcd
alias usb-controller1 ehci-hcd

按你那种改法u盘能用,但若还有usb键盘或鼠标就不work了。
谢谢你指出文档中的错误。
 楼主| 发表于 2004-11-16 10:41:07 | 显示全部楼层
再请教一下,要系统同时加载 这些模块应该怎么办?

只有在/etc/rc.d/rc.sysinit中出现的模块才会自动加载,而 /etc/modprobe.conf只是解决了倚赖关系。(我的理解对吗)

那么,我需要usbhid,uhci-hcd等模块都在启动时被加载,只在 /etc/modprobe.conf中列出两句alias好象不行,我试过,有什么好办法吗。

请教snoopyxp。
发表于 2004-11-16 11:42:20 | 显示全部楼层
if ! strstr "$cmdline" nousb ; then
  if ! LC_ALL=C grep -q "usb" /proc/devices 2>/dev/null ; then
    aliases=`/sbin/modprobe -c | awk '/^alias usb-controller/ { print $3 }'`
    if [ -n "$aliases" -a "$aliases" != "off" ]; then
      modprobe usbcore
      for alias in $aliases ; do
        [ "$alias" = "off" ] && continue
        action $"Initializing USB controller ($alias): " modprobe $alias
      done
      [ $? -eq 0 -a -n "$aliases" ] && usb=1
    fi
  fi
  if LC_ALL=C grep -q "usb" /proc/devices 2>/dev/null ; then
    usb=1
  fi
fi

从以上摘自rc.sysinit的脚本片断可以看出,只要你在modprobe.conf中定义了正确的usb-controller模块,是会自动加载的。
你可以试试在/etc/modprobe.conf中加入:
alias usb-controller uhci-hcd
 楼主| 发表于 2004-11-17 11:13:12 | 显示全部楼层
if ! LC_ALL=C grep -q "usb" /proc/devices 2>/dev/null ; then
aliases=`/sbin/modprobe -c | awk '/^alias usb-controller/ { print $3 }'`

snoopyxp能否请您帮我解释一下,这句话的含义,我的脚本中去掉这句话(和下面对应的fi),才能执行。
发表于 2004-11-17 11:37:47 | 显示全部楼层
这句话的意思是如果未在/proc/devices中检测到usb设备(即usb设备还未驱动),则定义变量aliases, 其中命令/sbin/modprobe -c 会生成模块别名和真正模块名的对应关系,模块搜寻路径,依赖关系等信息,通过管道搜寻对应模块别名为usb-controller的真正模块名。
如对应于alias usb-controller uhci-hcd这条记录,/sbin/modprobe -c | awk '/^alias usb-controller/ { print $3 }' 会生成uhci-hcd,即alias变量得到了系统中usb控制器的真正模块名.
你需要去掉if段才能执行可能是因为你修改过rc.sysinit导致usb驱动在这之前已经加载了,所以不需要再加载一次。
 楼主| 发表于 2004-11-17 12:17:42 | 显示全部楼层
多谢指点!
 楼主| 发表于 2004-11-17 12:29:29 | 显示全部楼层
还有最后一个问题,我的ADSL在2.6内核情况下不能联网(阿尔卡特speedtouch),但在起2.4内核时还是好的。

在起2.6内核后 adsl-start 之后等大约1分钟之内不能回到shell,其间硬盘灯闪了一会儿,等回到shell后用ifconfig看没有出现ppp0

编译时ppp,pppoe两个选项都选为模块了。再请版主和其它高手指点迷津。
发表于 2004-11-17 13:23:38 | 显示全部楼层
你看一下系统的日志文件,看看在激活ppp0的过程中出了什么错。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表