linky_fan 发表于 2005-4-24 21:32:03

usb十全大补贴(完成版)

Gentoo Linux USB Guide(翻译and原创)

                                                                     Translated by linky_fan
                                                                            2005.6.1


1.介绍

什么是USB?

USB是建立在 Universal Serial Bus (通用串行总线)基础上, 实现计算机与计算机或着其他设备通信的一种外部接口.现在使用usb的设备可以说非常多, 键盘啦, 鼠标啦, 数码相机, 外置的刻录机打印机等, 很多很多的.

现今使用的usb版本有俩种 USB 1.1 和 USB 2.0 (不过好像听说usb组织已经统一了两种标准, 以后统统叫usb 2.0) , look 下面

USB2.0技术规范是有由Compaq、Hewlett Packard、Intel、Lucent、Microsoft、NEC、Philips共同制定、发布的,规范把外设数据传输速度提高到了 480Mbps,是USB 1.1设备的40倍!但按照原定计划新的USB 2.0标准只是准备把这个标准定在240Mbps,后来,经过努力将它提高到了480Mbps。

由于当时制订的标准有了变化,USB规范就产生了三种速度选择:480Mbps、12Mbps、1.5Mbps。 2003年6月份,当USB2.0标准开始逐渐广为使用之后,USB协会重新命名了USB的规格和标准,也许当时USB协会的举措只是为了更好的统一标准而不至于混乱,但也许USB协会没想到这个标准给MP3市场造成一个混乱的局面。

重新命名了USB标准将原先的USB 1.1改成了USB 2.0 Full Speed(全速版),同时将原有的USB 2.0改成了USB 2.0 High-Speed(高速版),并同时公布了新的标识。高速版的USB 2.0速度当然超过全速版的USB 2.0(480Mbps vs. 12Mbps)。


因为后续USB版本(2.0)是向前兼容的, 也就说现在最新的USB 2.0的设备是兼容USB 1.0的, USB 2.0 的最大数据传输率是 480 Mbps (也就是 60 MBps), 这点也可以说是USB 2.0和USB1.0的最大区别. 还有一个共同点就是所有的usb设备都是hot-pluggable的, 也就是支持热插拔 (顺便说个笑话, 有一次去逛街, 看到一个mm 穿了一件 t-shirt , 上面些的是Plug and play , 译成中文就是......., 汗 ) , 意思就是你不需要重启计算机就可以马上使用你刚刚插入的设备.

技术说明
在我们开始真正config内核前, 对一些细节的东西再来做一些说明. 如果你来不及要make menuconfig了, 那么这节可以跳过, 直接看后面的相关内容.

一个USB系统有一个host controller, 几个hub和一个root hub组成, 其中的那个roothub可以连接包含hub在内的127个USB设备, 而host controller是一个usb设备与操作系统之间的接口.现今使用的HCI(Host Controller Interface)有两种, 一种是OHCI (全名是 Open HCI 该标准是由Compaq制定的) , 另一种就UHCI (全名是Universal HCI) 和EHCI (全名是Enhanced HCI) , 后面这两种都是由Intel指定的, 所以这两种总是出现使用intel的芯片组的电脑中.OHCI/UHCI 都是符合USB1.1的两种工业级标准, 而EHCI则是为USB 2.0准备的.

硬件制造厂商提供给程式设计师一个接口用来实现操作系统和硬件之间的交互, 这个接口的名字叫做HCD (全名是 Host Controller Device), 只有通过这个设备, usb设备才能和操作系统之间进行通信. 看过下面这个图后相信大家理解上面的概念可以简单一些. :)

+ ----Hardware----   + ----Software---- +
    |                        |                      |
    | [USB Dev] -+-> {EHCI} -+--->( EHCD )      |
    |            |         |                      |User
    |            `-> {UHCI} -+--->( UHCD )      |
    |                        |                      |
    + ----Hardware----   + ----Software---- +

USB设备可以使用一个自定的驱动程序, 也可以根据该设备所属的类选用系统自带的驱动,这意味着同类型的设备可以共用同一个驱动. HID这个类大家都比较熟,全名是Human Interface Device, 包括了usb鼠标, 键盘等输入设备, 而USB Mass storage这个类包括了pen driver、数码相机、mp3播放器等。接着的USB CDC类 (全名是Communication Device Class)包括了各种usb接口的网络设备, 像是modem、网卡啦都是这个。

有一个很简单的命令可以检查一下你的系统上是不是支持usb 2.0而不用打开机箱look:o

注意:如果你发现在你的机子上没有下面这条命令, 那么是对应的软件包没有安装, 对于gentoo来说这个软件包是sys-apps/pciutils。简单的一条命令就可以搞定.
emerge pciutils

然后是运行命令and结果:

(In system that is USB 1.1 compliant, note the UHCI only)

# lspci -v | grep USB
0000:00:04.2 USB Controller: Intel Corp. 82371AB/EB/MB PIIX4 USB (rev 01) (prog-if 00 [UHCI])

(A system that is USB 2.0 compliant, note the EHCI and UHCI)

00:1d.0 USB Controller: Intel Corp. 82801DB USB (Hub #1) (rev 01) (prog-if 00 [UHCI])
00:1d.1 USB Controller: Intel Corp. 82801DB USB (Hub #2) (rev 01) (prog-if 00 [UHCI])
00:1d.2 USB Controller: Intel Corp. 82801DB USB (Hub #3) (rev 01) (prog-if 00 [UHCI])
00:1d.7 USB Controller: Intel Corp. 82801DB USB EHCI Controller (rev 01) (prog-if 20 [EHCI])

2.内核设置

安装内核

特别提醒:从gentoo 2005.0开始 , gentoo linux 使用2.6版本的内核作为默认的内核.在没有特别指定了2.4的profile的情况下, gentoo-sources在大多数的硬件平台上都会是2.6的版本. 请大家检查一下自己所用的gentoo-sources后开始下面的步骤.

[*]首先按照你的taste安装一个内核, 这里用的是gentoo-source(推荐大家可以试试morph的或是nitro的):wink:

emergegentoo-sources

[*]然后进入内核安装目录开始配置内核

# cd /usr/src/linux
# make menuconfig


[*]开始配置内核

现在为了俺们的那些usb设备在2.6版本的kernel里的正常使用开始配置吧.(2.4版本的俺就不说了哈^_^)

特别注意:在我的这个例子中的所有配置选项都属于比较基本的, 支持的对象包括USB mass storage device(大多数的U盘、数码相机和usb pen), 如果你所拥有的usb设备比较特殊, 请参考用户手册或google来确定如何加入该特定设备的支持,是做一个模块还是直接在内核中加入这个设备.

Device Drivers--->
SCSI device support--->

(SCSI选项在你选择USB Mass Storage支持时会自动加入,我们需要的是disk support.)
---   SCSI support type (disk, tape, CD-ROM)
<*>   SCSI disk support

(然后退回上一级并进入 USB support)

USB support--->

(这个选项是为了实现USB支持的root hub, 如果你需要把它编成模块的话, 名字是usbcore.)
<*> Support for Host-side USB

(激活下面这个选项可以在/proc/bus/usb里看到你所使用的usb设备, 这个选项是默认选项.)
[*]   USB device filesystem

(选择至少一个HCD设备. 如果你不是很确定该选哪一个的话就通通打上勾好了^_^)
--- USB Host Controller Drivers
<*> EHCI HCD (USB 2.0) support
< > OHCI HCD support
<*> UHCI HCD (most Intel and VIA) support

(向下移动一点我们可以看到关于CDC and mass storage的选项.)
< > USB Modem (CDC ACM) support
<*> USB Printer support
<*> USB Mass Storage support
[*]   USB Mass Storage Write-Protected Media Detection (EXPERIMENTAL)

(然后就是HID了, 如果你使用的是usb接口的鼠标、键盘、游戏杆或是其他usb输入设备的话请一定激活该选项)
--- USB Input Devices
<*> USB Human Interface Device (full HID) support
[*]   HID input layer support

(如过你在使用例如RTL8150等的USB网卡,你会需要下面这个)
USB Network Adapters--->
    <*> USB RTL8150 based ethernet device support (EXPERIMENTAL)

(如果你也在使用诸如Prolific 2303等的USB ----> RS232接口的设备请激活下面这些选项)
USB Serial Converter support--->
    <*> USB Serial Converter support
    <*> USB Prolific 2303 Single Port Serial Driver (NEW)


恭喜,经过上面这些步骤, 你的usb设备在编译完内核并重新启动新内核后就可以使用了,so what to do nest??^_^

[*]查看USB是否已经老老实实的在工作了

dmesg可是你的朋友哟

接下来就是我们开始使用usb设备之前的最后一步了, so, let's start. 我们来看看系统是如何响应这些个usb咚咚的. 在我所举的例子中, 使用的USB设备是一个512M的Memory Stick的适配器,我们用的工具就是强大的dmesg.

(把Memory Stick 连接到适配器中, and then..)
# dmesg | less

(设备使用USB1.1的接口然后得到一个地址, 同时也看看它使用的HCD)
usb 1-1: new full speed USB device using uhci_hcd and address 2

(SCSI 的支持会自动载入)
scsi0 : SCSI emulation for USB Mass Storage devices
usb-storage: device found at 2

(现在看到的就是这个咚咚的信息, 包括了型号容量)
usb-storage: waiting for device to settle before scanning
Vendor: JetFlashModel: TS512MJF2A      Rev: 1.00
Type:   Direct-Access                      ANSI SCSI revision: 02
SCSI device sda: 1003600 512-byte hdwr sectors (514 MB)

(Write-protect 探测代码在新版的内核中还是处于EXPERIMENTAL阶段)
sda: Write Protect is off
sda: Mode Sense: 0b 00 00 08
sda: assuming drive cache: write through
SCSI device sda: 1003600 512-byte hdwr sectors (514 MB)
/dev/scsi/host0/bus0/target0/lun0: p1
Attached scsi removable disk sda at scsi0, channel 0, id 0, lun 0
Attached scsi generic sg0 at scsi0, channel 0, id 0, lun 0,type 0
usb-storage: device scan complete
(从这里看到设备被识别为/dev/sda1, 接下来就可以挂载了)

(当设备从主机断开是, 系统响应如下)
usb 1-1: USB disconnect, address 2

一旦一个usb设备正确连接并挂载之后, 对它的操作就和对一个普通硬盘分区的操作一样了, 可以使用cp, rm, mv拷贝删除移动文件, 也可以进行格式化和分区的操作了.

# mount /dev/sda1 /mnt/usb
# df -h
Filesystem            SizeUsed Avail Use% Mounted on
/dev/hda8             9.4G7.5G1.9G80% /
/dev/hda9            11G8.1G2.4G78% /usr
none                  189M   0189M   0% /dev/shm
/dev/sda1             490M   34M457M   7% /mnt/usb


友情提醒:数码相机可以和memory stick设备一样被访问,我有一台Nikon Coolpix 5200, 在gentoo下访问它和u盘一样方便. 我这里没用使用PTP方式.

什么是PTP??

新款的数码相机一般都支持图片传输协议(Picture Transfer Protocol,PTP)。 PTP是由柯达与微软协商制定的一种标准,符合这种标准的图像设备在接入Windows XP系统之后可以更好地被系统和应用程序所共享。这主要是为了方便计算机知识不多的普通用户,使相机、应用软件、网站等结合在一起更容易地完成一些傻瓜式功能。

开放源码的Linux下也有多款支持PTP协议的软件,比较著名的是gtkam。在Red Hat 9.0中已经自带了该程序。如果是有经验的玩家,建议像下载源代码自己编译。

市面上的绝大多数新款数码相机都支持PTP协议,但往往不是缺省设置,需要自己将记忆体模式设定为PTP模式.

当然我也没保证所有的数码相机都可以这么方便得访问到, 如果大家有什么新得发现的话希望可以share一下^_^.

然后我们来看一下接上usb鼠标后dmesg会给出些什么

# dmesg | grep USB
drivers/usb/input/hid-core.c: v2.0:USB HID core driver
usb 1-1: new low speed USB device using address 2
input: USB HID v1.10 Mouse [Logitech USB-PS/2 Optical Mouse] on usb-0000:00:07.2-1

除了使用dmesg之外, 我们还可以使用lsusb命令来查看usb设备,这个工具是sys-apps/usbutils的一部分.

[*]用户空间的USB

一些不错的工具
前面我们已经看了如何配置内核, 如何在系统端加上usb设备的支持, 现在我们要
关注的是gentoo为我们用户提供了哪些好的访问工具.最有用的其中一个就是刚刚说过的lsusb了, 它会告诉你系统都连接了哪一些usb设备.

注意:lsusb实际上就是读取/proc/bus/usb中的内容, 所以请确定你在内核配置阶段加入了对于proc和proc中usb的文件系统的支持!

# emerge usbutils


运行usb的结果

# lsusb
(This is the 512 MB Memory Stick from Transcend)
Bus 001 Device 003: ID 0c76:0005 JMTek, LLC. USBdisk
(This is the Optical Mouse)
Bus 001 Device 002: ID 046d:c00e Logitech, Inc. Optical Mouse
(This is the root hub)
Bus 001 Device 001: ID 0000:0000


如果你是那种喜欢看到很多很多信息的类型,lsusb -t应该会让你很满意的^_^
另外一个有用的选项可以让lsusb以树型方式列出所有的设备.命令是 lsusb -t

# lsusb -t
Bus#1
`-Dev#   1 Vendor 0x0000 Product 0x0000
|-Dev#   2 Vendor 0x046d Product 0xc00e
`-Dev#   3 Vendor 0x0c76 Product 0x0005


你可以交替的使用-v 和-t 选项, 这样可以对usb的工作方式有一个更深入的了解.

Hot or Cold plug??

Gentoo使用两个软件包(sys-apps/hotplug 和 sys-apps/coldplug)来对可热插拔的设备进行一些奇妙的操作. 和一些经典的魔术一样, 在其背后一定是存在着一个简单的逻辑过程. 让我们一起来看看这个魔术和它背后的东西吧 :o

我们经常会听到一个词------->firmware, 它是定义在一小块很难修改的硬件中的一段程序, 它可以载入and运行但是通常只有高手才懂得如何修改. 没错, 它的中文名字叫做"固件", 很多计算机周边的设备都有固件存在其中,比如usb设备和pcmia设备, 它们或是用来确定设备是否运行正常, 或是在设备出现问题时自我修复.当一个设备与系统连接时, 固件(在一些情况下也被叫做driver)被系统读取进内存, 接着设备就可以使用了.

呵呵, 说的简单一点, Gentoo使用sys-apps/hotplug操作那些热插拔的设备, 它使用正确的firmware使我们可以轻松的使用它们. 这些将被hotplug加载进内存的firmware存放的地点是/lib/firmware目录. 安装步骤也很简单, just emerge!


# emerge hotplug


现在我想大家会问, 既然都有了hotplug了, 要coldplug做什么?sys-apps/coldplug做的事和sys-apps/hotplug所做的是一样的工作, 只不过前者是在系统启动时候就把那时已经连接到主机上的设备的firmware加载进内存并激活这些设备, 这样我我们进入系统之后就可以使用这些咚咚了, 很好的例子就是我现在笔记本上用的无线网卡了, 虽然不是usb接口也没有看到什么info, 但是幕后的coldplug功不可没. 安装coldplug同样很简单, emerge吧^_^

# emerge coldplug
(你也可以加入到boot这个runlevel中的)
# rc-update add coldplug boot
* coldplug added to runlevel boot
* rc-update complete.


注意一下, 上面的这段代码对与hotplug来说不合适, 因为它到现在为止并没有它自己的initscrips.


zhy2111314 发表于 2005-4-24 21:47:04

继续。。。。

cnhnln 发表于 2005-4-25 00:16:18

线材分不分1.1,2.0的阿?

wolf0403 发表于 2005-4-25 07:02:39

。。偶还是去看英文的好了。

线材分不分1.1,2.0的阿?
分,当然分。。。一个是 uhci (1.1),一个是 ehci(2.0)。

cnhnln 发表于 2005-4-25 12:02:58

那如何识别连接线是1.1的还是2.0的呢?

wolf0403 发表于 2005-4-25 12:33:09

线是一样的。取决于设备。

cnhnln 发表于 2005-4-25 12:56:55

那我问“线材分不分1.1,2.0的阿?”你说“分” :evil:

wolf0403 发表于 2005-4-26 14:20:49

。。。我以为你说的是“现在”。。。你知道在这个别字横行的年代,自动纠错率决定了交流的效率 -_-
专业名词用英文吧……

linky_fan 发表于 2005-6-2 15:36:42

bingo :mrgreen:

月下刀客 发表于 2005-6-2 21:13:24

我的U盘在好几个发行版下都不支持,何解?

紫光32M
在win下都无法格式化成fat32,只能 fat16。估计原因是空间不到32M。无限郁闷啊。
fdisk -l可以看到sda1,显示格式是fat16<32M。但不管如何挂载都提示超级块错误。

再次郁闷中。。。
:?

linky_fan 发表于 2005-6-2 22:31:31


我的U盘在好几个发行版下都不支持,何解?

紫光32M

老大, 该换了.:mrgreen:

fsck看看修不修得好, 不行的话用linux下的mkfs试试 :wink:

Zer4tul_CQ 发表于 2005-8-3 11:38:36

FAT16?试试msdos,别用vfat。

BTW,线材说是不分,其实也分的,实质是线材的做工和用料,有的线材是达不到2.0的标准的……这种通常就被认为是不支持2.0

二墨夭 发表于 2006-7-15 23:02:02

我家的烂电脑读不出USB设备
怎么重新安装USB?
我家的系统是XP的

linky_fan 发表于 2006-7-16 18:38:06

买块新的pci接口得usb卡继续用

lingice 发表于 2006-8-9 23:49:13

usb的音箱在gentoo下如何启用?
页: [1]
查看完整版本: usb十全大补贴(完成版)