USB驱动分析1

USB驱动分析 一
这个故事中使用的是2.6.10的内核代码.Linux内核代码目录中, 所有去设备驱动程序有关的代码都在drivers/目录下面,在这个目录中我们用ls命令可以看到很多子目录.
localhost:/usr/src/linux-2.6.10/drivers # ls
管式热交换器原理图
Kconfig   atm        cdrom    eisa      ide      macintosh  message  net      parport  s390    tc         w1
Makefile  base      char     fc4      ieee1394  mca        misc     nubus     pci      sbus    telephony  zorro
acorn     block      cpufreq  firmware  input     md         mmc      oprofile  pcmcia   scsi    usb
acpi      bluetooth  dio      i2c      isdn      media      mtd      parisc    pnp      serial  video
其中usb目录包含了所有usb设备的驱动,而usb目录下面又有它自己的子目录,进去看一下,
localhost:/usr/src/linux-2.6.10/drivers # cd usb/
locahost:/usr/src/linux-2.6.10/drivers/usb # ls
Kconfig  Makefile  README  atm  class  core  gadget  host  image  input  media  misc  net  serial  storage  usb-skeleton.c
注意到每一个目录下面都有一个Kconfig文件和一个Makefile,这很重要.稍后会有介绍.
而我们的故事其实是围绕着drivers/usb/storage这个目录来展开的.实际上这里边的代码清清楚楚地展示了我们日常频繁接触的U盘是如何工作的,是如何被驱动起来的.但是这个目录里边的冬冬并不是生活在世外桃源,他们总是和外面的世界有着千丝万缕的瓜葛.可以继续进来看一下,
localhost:/usr/src/linux-2.6.10/drivers/usb # cd storage/
localhost:/usr/src/linux-2.6.10/drivers/usb/storage # ls
Kconfig    debug.c  freecom.c      isd200.c    protocol.c  sddr09.c  shuttle_usbat.c  unusual_devs.h
Makefile   debug.h  freecom.h      isd200.h    protocol.h  sddr09.h  shuttle_usbat.h  usb.c
datafab.c  dpcm.c   initializers.c  jumpshot.c  scsiglue.c  sddr55.c  transport.c      usb.h
datafab.h  dpcm.h   initializers.h  jumpshot.h  scsiglue.h  sddr55.h  transport.h
咋一看,着实吓了一跳,用`wc -l *`这个命令统计一下,12076行,晕死...
wc [  -c |  -m ] [  -l ] [  -w ] [文件]
或者
脚踏式垃圾桶wc  -k [  -c ] [  -l ] [  -w ] [文件]
注:缺省情况下,wc 命令对 File 参数指定的文件中的行数、字数和字节数进行计数。这个命令将换行符数、字数和字节数写到标准输出并为所有指定的文件保留一个总数。
当使用 File 参数时, wc 命令显示文件名以及请求的计数。如果没有给 File 参数指定一个文件名,wc 命令使用标准输入。
wc 命令受 LANG、LC_ALL、LC_CTYPE 和 LC_MESSAGES 环境变量影响。
wc 命令将一个字看作是被一个空格(如空白和跳格)分隔的非零长度字符串。
-c 统计字节数,除非指定 -k 标志。如果指定 -k 标志,wc 命令统计字符数。
-k 统计字符数。指定 -k 标志等同于指定 -klwc 标志。如果将 -k 标志同其他标志一起使用,那么必须包含 -c 标志。否则,将会忽略 -k 标志。
注:这个标志在将来的发行版中将会撤销。
五仁参芪汤-l 统计行数。
-m 统计字符数。这个标志不能与 -c 标志一起使用。
-w 统计字数。一个字被定义为由空白、跳格或换行字符分隔的字符串。北斗接收机
但是,也许,生活中总是充满了跌宕起伏.
认真看了一下Makefile和Kconfig之后,心情明显好了许多.
出来混,迟早要还的.
从前在复旦,混了四年,没有学到任何东西,每天就是逃课,上网,玩游戏,睡觉.毕业的时候,身边的人读研的读研,出国的出国,工作的吧,去麦肯锡的去麦肯锡,去IBM的去IBM.而自己却一无所长,没有任何技能,直到这时候才发现那四年欠了很多债,早知今日,何必当初.幸运的是,我还有一张复旦的文凭,依靠着这张文凭,混进了Intel.然而,工作以后,更是发现当初在校期间没有好好读书其实真是在欠债,当初没学,工作以后还是要学,的确是迟早要还的,逃是逃不掉的.
毕业的时候,人家跟我说Makefile我完全不知,但是一说Make Love我就来劲了.现在想来依然觉得丢人.
基本上,Linux内核中每一个目录下边都有一个Makefile,Makefile和Kconfig就像一个城市的地图,地图带领我们去认识一个城市,而Makefile和Kconfig则可以让我们了解这个目录下面的结构.drivers/usb/storage/目录下边的Makefile内容如下:
#
# Makefile for the USB Mass Storage device drivers.
#
# 15 Aug 2000, Christoph Hellwig
# Rewritten to use lists instead of if-statements.
#
EXTRA_CFLAGS    := -Idrivers/scsi
obj-$(CONFIG_USB_STORAGE)      += usb-storage.o
usb-storage-obj-$(CONFIG_USB_STORAGE_DEBUG)     += debug.o
usb-storage-obj-$(CONFIG_USB_STORAGE_HP8200e)   += shuttle_usbat.o
usb-storage-obj-$(CONFIG_USB_STORAGE_SDDR09)    += sddr09.o
usb-storage-obj-$(CONFIG_USB_STORAGE_SDDR55)    += sddr55.o
usb-storage-obj-$(CONFIG_USB_STORAGE_FREECOM)   += freecom.o
usb-storage-obj-$(CONFIG_USB_STORAGE_DPCM)      += dpcm.o
usb-storage-obj-$(CONFIG_USB_STORAGE_ISD200)    += isd200.o
usb-storage-obj-$(CONFIG_USB_STORAGE_DATAFAB)   += datafab.o
usb-storage-obj-$(CONFIG_USB_STORAGE_JUMPSHOT)  += jumpshot.o
usb-storage-objs :=     scsiglue.o protocol.o transport.o usb.o \
                        initializers.o $(usb-storage-obj-y)
关于Kconfig文件,在故事的最后会介绍,此刻暂且不表,Kconfig文件比较长,就不贴出来了.但是通过看Kconfig文件,我们可以知道,除了CONFIG_USB_STORAGE这个编译选项是我们真正需要的以外,别的选项我们都可以不予理睬.比如,关于CONFIG_USB_STORAGE_DATAFAB,Kconfig文件中有这么一段,熊猫猪
config USB_STORAGE_DATAFAB
        bool "Datafab Compact Flash Reader support (EXPERIMENTAL)"
母线排        depends on USB_STORAGE && EXPERIMENTAL
        help
          Support for certain Datafab CompactFlash readers.
          Datafab has a web page at .
显然,这个选项和我们没有关系,首先这是专门针对Datafab公司的产品的,其次CompactFlash reader是一种flash设备,但这显然不是U盘,因为drivers/usb/storage这个目录里边的代码是针对一类设备的,不是某一种特定的设备,这一类设备就是usb mass storage设备,关于这类设备,有专门的文档进行介绍,有相应的spec,描述这类设备的通信或者物理上电特性上等方面的规范,U盘只是其中的一种,这种设备使用的通信协议被称为Bulk-Only Transport协议.再比如,关于CONFIG_USB_STORAGE_SDDR55这个选项,Kconfig文件中也有对应的一段,
config USB_STORAGE_SDDR55

本文发布于:2024-09-24 14:22:20,感谢您对本站的认可!

本文链接:https://www.17tex.com/tex/3/262048.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

标签:目录   命令   设备   没有   代码   文件   指定   使用
留言与评论(共有 0 条评论)
   
验证码:
Copyright ©2019-2024 Comsenz Inc.Powered by © 易纺专利技术学习网 豫ICP备2022007602号 豫公网安备41160202000603 站长QQ:729038198 关于我们 投诉建议