QQ登录

只需一步,快速开始

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 6056|回复: 14

Big news! 终于搞定了我的USB硬盘!

[复制链接]
发表于 2003-12-29 17:24:43 | 显示全部楼层 |阅读模式
今天把这几天以来一直困扰我的USB硬盘不能挂载的问题最终搞定了! 真是高兴,现与兄弟们分享如下:
  kernel 2.6包含的usb-storage在识别USB设备的时候,有个设备列表,列出了设备的制造商ID、产品ID、设备使用的协议ID等,可以在
/$(KERNEL-SRC)/drivers/usb/storage/unusual_devs.h以及usb.c
中发现这个列表,幸好我的USB硬盘在插入时系统还能给出一些信息,即从/proc/bus/usb/devices中得知,我的USB硬盘:
Vendor ID: 5e3
Product ID:  702
Interface Class:  08 (就是Mass Storage)
Interface Subclass:  06 (透明?)
Interface Protocol:  50 (Bulk Only)

我把这些信息组合起来,形成我自己这个设备的表项,尝试着添加在设备列表内:
UNUSUAL_DEV(  0x05e3, 0x0702, 0x0000, 0x0200,
                "Big LinkTone",
                "External Hard Disk",
                US_SC_SCSI, US_PR_BULK, NULL,
                US_FL_FIX_INQUIRY ),
重新编译usb-storage内核模块,接着在modules.usbmap文件中增加一个信息如上一致的行。hotplug原来已搞定,再插入我的USB硬盘,嘿!搞定了!终于听到了熟悉的电机翁鸣声,哈哈,高兴啊!!

估计很多兄弟和我遇到的问题相似,因为原来的列表并不全面,特别是国内的一些USB硬盘。

原问题详见:
http://www.linuxfans.org/nuke/modules.php?name=Forums&file=viewtopic&t=48871
发表于 2003-12-29 18:40:47 | 显示全部楼层
呵呵,恭喜恭喜!
回复

使用道具 举报

发表于 2003-12-29 22:05:33 | 显示全部楼层
多谢楼主,我的U盘用了你的方法也成功地驱动了。我曾经到官方网站上求助过,但他们只会用mount -t vfat /dev/sda1 /mnt/usb来敷衍了事,还是自己动手好啊!哪位朋友如果还没有驱动U盘但又找不到原因的可用上法试试,绝对可行。
此文章建议加精。
回复

使用道具 举报

发表于 2003-12-30 08:56:27 | 显示全部楼层
如果能再详细补充一下
UNUSUAL_DEV( 0x05e3, 0x0702, 0x0000, 0x0200,
"Big LinkTone",
"External Hard Disk",
US_SC_SCSI, US_PR_BULK, NULL,
US_FL_FIX_INQUIRY ),
这段信息是怎么凑成的就更好
回复

使用道具 举报

 楼主| 发表于 2003-12-30 09:29:27 | 显示全部楼层
[quote:bd3bbb5e2a="llc"]如果能再详细补充一下
UNUSUAL_DEV( 0x05e3, 0x0702, 0x0000, 0x0200,
"Big LinkTone",
"External Hard Disk",
US_SC_SCSI, US_PR_BULK, NULL,
US_FL_FIX_INQUIRY ),
这段信息是怎么凑成的就更好[/quote]

看了usb.c和unusual_devs.h这两个文件就知道啦,0x05e3是我的U盘Vendor ID,0x0702是我的U盘Product ID,0x0000和0x0200分别是bcdDeviceMin和bcdDeviceMax,我挑选的两个值,也许其他的值也可以,没有深究;"Big LinkTone", "External Hard Disk"这两个猜也猜出来了,前者是Vendor名,后者是产品类别,无关紧要,只不过是两个字符串。US_SC_SCSI, US_PR_BULK, US_FL_FIX_INQUIRY只不过是几个宏常数,US_SC_SCSI就是我的U盘的Interface Subclass(06),US_PR_BULK就是我的U盘的Interface Protocol(50),US_FL_FIX_INQUIRY就代表还要询问设备自己(更详细的都在文件中了)。

还有hotplug相关的modules.usbmap,后来又重试了一下,好像不用动。

光顾着高兴了,没说仔细 :-)
回复

使用道具 举报

 楼主| 发表于 2003-12-30 10:49:31 | 显示全部楼层
我上面的方法虽然能够解决问题,不过会在dmesg中打印一个警告信息:

usb-storage: This device (05e3,0702,0113 S 06 P 50) has unneeded SubClass and Protocol entries in unusual_devs.h
   Please send a copy of this message to <[email protected]>
scsi1 : SCSI emulation for USB Mass Storage devices
  Vendor: Big Link  Model: External Hard Di  Rev: 0113
  Type:   Direct-Access                      ANSI SCSI revision: 02

我又仔细看了看usb-storage源码,发现unusual_devs.h中原来的那行:
UNUSUAL_DEV(  0x05e3, 0x0702, 0x0000, 0x0001,
                "EagleTec",
                "External Hard Disk",
                US_SC_DEVICE, US_PR_DEVICE, NULL,
                US_FL_FIX_INQUIRY ),
和我的设备基本一致,但bcdDeviceMax(就是0x0001)太小,而我的报出来是0113,所以我就把他改为0200,把我加的那段(就是上面帖子说的)注释掉,然后重新编译usb-storage内核模块,然后认出来的就是:
scsi2 : SCSI emulation for USB Mass Storage devices
  Vendor: EagleTec  Model: External Hard Di  Rev: 0113
  Type:   Direct-Access                      ANSI SCSI revision: 02

好啦,彻底解决了!
回复

使用道具 举报

发表于 2003-12-31 05:55:59 | 显示全部楼层
good DIY!
回复

使用道具 举报

 楼主| 发表于 2003-12-31 09:11:42 | 显示全部楼层
[quote:c7bfb66cbf="Dragonfly"]good DIY![/quote]

haha! 为了龙版的鼓励,特转贴:

5 .USB设备的自动检测

5.1 USB设备检测的一般过程
USB设备检测也是通过/proc目录下的USB文件系统进行的。为了使一个USB设备能够正常工作,必须要现在系统中插入USB桥接器模块。在检测开始时,一般要先检测是否存在/proc/bus/usb目录,若不存在则尝试插入USB桥接模块。

现在一般的USB桥接器模块有两种类型,UHCI和OHCI。在决定插入那一个桥接器模块时,可以察看/proc/pci文件来决定。打开此文件,您若发现USB节为 I/O at 0xHHHH格式(例如出现 I/O at 0xe000 [0xe01f]),HHHH为16进制数,则桥接器类型为UHCI。若是它为32 bit memory at 0xHH000000形式(例如出现32 bit memory at 0xee000000),HH为16进制数,则桥接器类型为OHCI。但是若您的桥接器类型不满足上述任何一种情况,唯一的解决办法就是您尝试插入这两种模块,直到成功为止。一般而言,UHCI类型的桥接器它的插入模块是uhci或usb-uhci(由内核版本决定);而对于OHCI类型的桥接器它的插入模块是ohci或usb-ohci。

您在正确的插入了桥接器模块之后,这时/proc文件系统下就会出现USB设备目录,不过这时这个目录是空的,没有任何文件。这时您就必须挂接usbdevfs文件系统,然后通过此文件系统检测连接的设备。在成功挂接usb文件系统之后,就会生成文件/proc/bus/usb/devices,/proc/bus/usb/drivers和目录/proc/bus/usb/busNo。挂接usbdevfs文件您可以通过如下操作实现:
mount -t usbdevfs none /proc/bus/usb
或在/etc/fstab上加入
none /proc/bus/usb usbdevfs defaults 0 0

然后通过/proc/bus/usb/devices文件的内容,您就可以获得连接的设备信息,包括设备标识和制造商标是等信息。

usb设备类型描述:

设备规范           设备类码           接口类码
应用程序特定       -                  0xFE
声音接口           0x00               0x01
通信设备           0x02               -
CDC控制接口        -                  0x02
CDC数据接口        -                  0x0A
HID                0x00               0x03
HUB                0x09               0x09
批量存储设备       0x00               0x08
监视器             same as HID        same as HID
电源设备           same as HID        same as HID
物理设备           -                  0x05
打印机             -                  0x07
供应商特定         -                  0xFF

5.2 usb文件系统简介
T = 总线拓扑结构(Lev, Prnt, Port, Cnt, 等),是指USB设备和主机之间的连接方式
B = 带宽 (仅用于USB主控制器)
D = 设备描述信息
P = 产品标识信息
S = 串描述符
C = 配置描述信息 (* 表示活动配置)
I = 接口描述信息
E = 终端点描述信息

一般格式:
d = 十进制数
x = 十六进制数
s = 字符串

拓扑信息

T:  Bus=dd Lev=dd Prnt=dd Port=dd Cnt=dd Dev#=ddd Spd=ddd MxCh=dd
|   |       |       |         |        |        |         |         |__最大子设备
|   |       |       |         |        |        |         |__设备速度(Mbps)
|   |       |       |         |        |        |__设备编号
|   |       |       |         |        |__这层的设备数
|   |       |       |         |__此设备的父连接器/端口
|   |       |       |__父设备号
|   |       |__此总线在拓扑结构中的层次
|   |__总线编号
|__拓扑信息标志

带宽信息

B:  Alloc=ddd/ddd us (xx%), #Int=ddd, #Iso=ddd
|   |                            |           |__同步请求编号
|   |                            |__中断请求号
|   |__分配给此总线的总带宽
|__带宽信息标志


设备描述信息和产品标识信息

D:  Ver=x.xx Cls=xx(s) Sub=xx Prot=xx MxPS=dd #Cfgs=dd
P:  Vendor=xxxx ProdID=xxxx Rev=xx.xx

D:  Ver=x.xx Cls=xx(sssss) Sub=xx Prot=xx MxPS=dd #Cfgs=dd
|   |          |               |        |        |        |__配置编号
|   |          |               |        |        |______缺省终端点的最大包尺寸
|   |          |               |        |                  
|   |          |               |        |__设备协议
|   |          |               |__设备子类型
|   |          |__设备类型
|   |__设备USB版本
|__设备信息标志编号#1

P:  Vendor=xxxx ProdID=xxxx Rev=xx.xx
|   |             |              |__产品修订号
|   |             |__产品标识编码
|   |__制造商标识编码
|__设备信息标志编号#2


串描述信息

S:  Manufacturer=ssss
|   |__设备上读出的制造商信息
|__串描述信息

S:  Product=ssss
|   |__设备上读出的产品描述信息,对于USB主控制器此字段为"USB *HCI Root Hub"
|__串描述信息

S:  SerialNumber=ssss
|   |__设备上读出的序列号,对于USB主控制器它是一个生成的字符串,表示设备标识
|__串描述信息


配置描述信息

C:  #Ifs=dd Cfg#=dd Atr=xx MPwr=dddmA
|   |         |        |       |__最大电流(mA)
|   |         |        |__属性
|   |         |__配置编号
|   |__接口数
|__配置信息标志


接口描述信息(可为多个)

I:  If#=dd Alt=dd #EPs=dd Cls=xx(sssss) Sub=xx Prot=xx Driver=ssss
|   |       |        |        |                |       |        |__驱动名
|   |       |        |        |                |       |__接口协议
|   |       |        |        |                |__接口子类
|   |       |        |        |__接口类
|   |       |        |__中断点数
|   |       |__可变设置编号
|   |__接口编号
|__接口信息标志


终端点描述信息

E:  Ad=xx(s) Atr=xx(ssss) MxPS=dddd Ivl=dddms
E:  Ad=xx(s) Atr=xx(ssss) MxPS=dddd Ivl=dddms
|   |          |              |           |__间隔
|   |          |              |__终端点最大包尺寸
|   |          |__属性(终端点类型)
|   |__终端点地址(I=In,O=Out)
|__终端点信息标志



举个例子,这是在连接了一个USB键盘时的配置情况。
T: Bus=01 Lev=00 Prnt=00 Port=00 Cnt=00 Dev#= 1 Spd=12 MxCh= 2
B: Alloc= 41/900 us ( 5%), #Int= 3, #Iso= 0
D: Ver= 1.00 Cls=09(hub ) Sub=00 Prot=00 MxPS= 8 #Cfgs= 1
P: Vendor=0000 ProdID=0000 Rev= 0.00
S: Product=USB UHCI Root Hub
S: SerialNumber=e000
C:* #Ifs= 1 Cfg#= 1 Atr=40 MxPwr= 0mA
I: If#= 0 Alt= 0 #EPs= 1 Cls=09(hub ) Sub=00 Prot=00 Driver=hub
E: Ad=81(I) Atr=03(Int.) MxPS= 8 Ivl=255ms
T: Bus=01 Lev=01 Prnt=01 Port=00 Cnt=01 Dev#= 2 Spd=12 MxCh= 3
D: Ver= 1.10 Cls=09(hub ) Sub=00 Prot=00 MxPS= 8 #Cfgs= 1
P: Vendor=07e4 ProdID=a961 Rev= 0.01
S: Manufacturer=ALCOR
S: Product=Movado USB Keyboard
C:* #Ifs= 1 Cfg#= 1 Atr=e0 MxPwr=100mA
I: If#= 0 Alt= 0 #EPs= 1 Cls=09(hub ) Sub=00 Prot=00 Driver=hub
E: Ad=81(I) Atr=03(Int.) MxPS= 1 Ivl=255ms
T: Bus=01 Lev=02 Prnt=02 Port=00 Cnt=01 Dev#= 3 Spd=12 MxCh= 0
D: Ver= 1.10 Cls=00(>ifc ) Sub=00 Prot=00 MxPS= 8 #Cfgs= 1
P: Vendor=07e4 ProdID=a961 Rev= 0.01
S: Manufacturer=ALCOR
S: Product=Movado USB Keyboard
C:* #Ifs= 2 Cfg#= 1 Atr=e0 MxPwr= 0mA
I: If#= 0 Alt= 0 #EPs= 1 Cls=03(HID ) Sub=01 Prot=01 Driver=hid
E: Ad=81(I) Atr=03(Int.) MxPS= 8 Ivl= 10ms
I: If#= 1 Alt= 0 #EPs= 1 Cls=03(HID ) Sub=00 Prot=00 Driver=hid
E: Ad=82(I) Atr=03(Int.) MxPS= 4 Ivl=255ms

它的物理拓扑可用附加档案内图来表示。

对于Linux下的usb设备而言,T:(总线拓扑)行用于生成连接在hub上的设备的描述信息,I:(接口信息)行可用于决定每个设备所用的驱动程序,C:(配置信息)可用于列出设备使用最大电流。

对于Linux下的usb设备,您可以访问http://www.linux-usb.org(Tiger Leo注:好像这个网站现在死活进不去)获取更详细的信息。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

×
回复

使用道具 举报

 楼主| 发表于 2003-12-31 16:33:36 | 显示全部楼层
And English version of my solution:
http://www.justlinux.com/forum/showthread.php?threadid=119463
and
http://www.linuxquestions.org/questions/showthread.php?threadid=130254
回复

使用道具 举报

 楼主| 发表于 2004-1-1 13:08:44 | 显示全部楼层
我靠!今天在本网站无意搜索到:
http://www.linuxfans.org/nuke/modules.php?name=Forums&file=viewtopic&t=42088
原来已有兄弟先我之前找到解决的办法了!为什么之前在google上搜不着?害我自己捣鼓半天 :-)
类似的还有:
http://www.linuxfans.org/nuke/modules.php?name=Forums&file=viewtopic&t=44161
http://www.linuxfans.org/nuke/modules.php?name=Forums&file=viewtopic&t=18638
http://www.linuxfans.org/nuke/modules.php?name=Forums&file=viewtopic&t=18640
http://www.linuxfans.org/nuke/modules.php?name=Forums&file=viewtopic&t=14690

and
http://www.linuxsir.com/bbs/showthread.php?threadid=21251

    
回复

使用道具 举报

发表于 2004-1-2 09:01:58 | 显示全部楼层
呵呵,看来凑出UNUSUAL_DEV( 0x05e3, 0x0702, 0x0000, 0x0200, 这个是最重要的
回复

使用道具 举报

发表于 2004-2-5 12:41:00 | 显示全部楼层
mygod~
回复

使用道具 举报

发表于 2004-2-6 18:43:48 | 显示全部楼层
T:  Bus=01 Lev=01 Prnt=01 Port=00 Cnt=01 Dev#=  3 Spd=12  MxCh= 0
D:  Ver= 1.10 Cls=00(>ifc ) Sub=00 Prot=00 MxPS=64 #Cfgs=  1
P:  Vendor=0ea0 ProdID=6803 Rev= 1.00
S:  Manufacturer=USB
S:  Product=Solid state disk
S:  SerialNumber=F6F13FB3DEADF04
C:* #Ifs= 1 Cfg#= 1 Atr=80 MxPwr=100mA
I:  If#= 0 Alt= 0 #EPs= 3 Cls=08(stor.) Sub=06 Prot=50 Driver=usb-storage
E:  Ad=81(I) Atr=02(Bulk) MxPS=  64 Ivl=0ms
E:  Ad=02(O) Atr=02(Bulk) MxPS=  64 Ivl=0ms
E:  Ad=83(I) Atr=03(Int.) MxPS=   2 Ivl=1ms

Sub=00 Prot=00
|___ 00 是哪个常量啊?

该不会让我这么写吧?
UNUSUAL_DEV( 0x0ea0, 0x6803, 0x0000, 0x0200,
                "Falsh",
                "Falsh Disk",
                0, 0, NULL
                0, 0 ),
回复

使用道具 举报

发表于 2005-6-27 18:20:39 | 显示全部楼层
好贴!
回复

使用道具 举报

发表于 2005-7-25 11:59:04 | 显示全部楼层
我把USB硬盘(ntfs格式的分区)挂到电脑后,在RH9下用fdisk -l,可以查看到系统已经检测到了我的USB设备/dev/sda1,但用mount时候提示什么不支持NTFS,郁闷.....

#mount /dev/sda1  /USB-HD
mount:fs type ntfs not support by kernel.
把USB硬盘分了个FAT32分区出来还是不行
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

GMT+8, 2024-5-3 19:42 , Processed in 0.096854 second(s), 16 queries .

© 2021 Powered by Discuz! X3.5.

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