我下載的原始碼包是linux2.6.32在mini2440上運行,有一個主USB和從USB,但是在從USB 插上我的金士頓隨身碟卻不見反應,因此不由得想探究一下。在/drivers/usb/下有如下檔案:
[root@zhaowanli usb]# ls
atm class gadget Kconfig modules.order otg storage
built-in.o core host Makefile mon README usb-skeleton.c
c67x00 early image misc musb serial wusbcore
檔案很多,挑其中幾個重要的檔案分析一下。首先Makefile 和Kconfig 當我們在原始碼根目錄下輸入make menuconfig 命令
後,所顯示的圖形介面的菜單選項就是由Kconfig提供
其內容部分如下:
menuconfig USB_SUPPORT
bool "USB support"
depends on HAS_IOMEM
default y
---help---
This option adds core support for Universal Serial Bus (USB).
You will also need drivers from the following menu to make use of it.
USB support 是一個布爾型變數,預設情況下為真。此選項表示支援USB裝置。
在class下有如下檔案
[root@zhaowanli class]# ls
cdc-acm.c cdc-acm.h cdc-wdm.c Kconfig Makefile usblp.c usbtmc.c
主要是幾類不常見的裝置的驅動 比如usblp.c 是指usb印表機的驅動。還包括數據機的驅動,usbtmc.c是測試和測量usb讀寫周期時間多少等的驅動。估計是一些USB廠家或者是我們想看看usb效能指標而寫的。而cdc-acm.c和cdc-wdm.c估計應該是指一般的usb抽象。
在core檔案夾下則放著USB裝置公用使用的函數,比如初始化函數,註冊函數等,包括主控制器(host Controller)和集線器(root hub)的驅動.後來隨著主控制器發展越來越複雜,形成三種Universal Host Controller Interface (UHCI),OpenHCI -- Open Host Controller Interface ,Enhanced Host Controller Interface (EHCI)
"EHCI"驅動程式設計成為實現新的高速 USB 2.0 協議的晶片提供支援。"OHCI"驅動程式用來為非 PC 系統上的(以及帶有 SiS 和 ALi 晶片集的 PC 主板上的)USB 晶片提供支援。"UHCI"驅動程式用來為大多數其它 PC 主板(包括 Intel 和 Via)上的 USB 實現提供支援。後來單獨立為一個目錄即為host目錄,裡面為三類主控器的驅動,由各個廠家維護。
gadget 目錄則對應外設,裡面都是一些廠家的具體裝置和USB外設控制器驅動
其他的像image目錄下放的是數位相機和掃描器的驅動 input下則是一些滑鼠和鍵盤觸控螢幕的驅動。media目錄下放的是多媒體驅動比如收音機等 而在serial下放的usb串列裝置驅動。
當然最終的目錄是storage目錄,裡面是 USB mass-storage 驅動該目錄下面的檔案如下:
[root@zhaowanli storage]# ls
alauda.c initializers.o option_ms.c shuttle_usbat.c ums-jumpshot.o unusual_karma.h
alauda.o isd200.c option_ms.h shuttle_usbat.o ums-karma.o unusual_onetouch.h
built-in.o isd200.o option_ms.o sierra_ms.c ums-onetouch.o unusual_sddr09.h
cypress_atacb.c jumpshot.c protocol.c sierra_ms.h ums-sddr09.o unusual_sddr55.h
cypress_atacb.o jumpshot.o protocol.h sierra_ms.o ums-sddr55.o unusual_usbat.h
datafab.c karma.c protocol.o transport.c ums-usbat.o usb.c
datafab.o karma.o scsiglue.c transport.h unusual_alauda.h usb.h
debug.c Kconfig scsiglue.h transport.o unusual_cypress.h usb.o
debug.h libusual.c scsiglue.o ums-alauda.o unusual_datafab.h usb-storage.o
freecom.c Makefile sddr09.c ums-cypress.o unusual_devs.h usual-tables.c
freecom.o modules.order sddr09.o ums-datafab.o unusual_freecom.h usual-tables.o
initializers.c onetouch.c sddr55.c ums-freecom.o unusual_isd200.h
initializers.h onetouch.o sddr55.o ums-isd200.o unusual_jumpshot.h
開啟Makefile檔案,其中一部分 為obj-$(CONFIG_USB_STORAGE) += usb-storage.o
usb-storage-obj-$(CONFIG_USB_STORAGE_DEBUG) += debug.o
usb-storage-objs := scsiglue.o protocol.o transport.o usb.o /
initializers.o sierra_ms.o option_ms.o $(usb-storage-obj-y)
ifeq ($(CONFIG_USB_LIBUSUAL),)
usb-storage-objs += usual-tables.o
else
obj-$(CONFIG_USB) += usb-libusual.o
usb-libusual-objs := libusual.o usual-tables.o
endif
obj-$(CONFIG_USB_STORAGE_ALAUDA) += ums-alauda.o
obj-$(CONFIG_USB_STORAGE_CYPRESS_ATACB) += ums-cypress.o
obj-$(CONFIG_USB_STORAGE_DATAFAB) += ums-datafab.o
obj-$(CONFIG_USB_STORAGE_FREECOM) += ums-freecom.o
obj-$(CONFIG_USB_STORAGE_ISD200) += ums-isd200.o
obj-$(CONFIG_USB_STORAGE_JUMPSHOT) += ums-jumpshot.o
obj-$(CONFIG_USB_STORAGE_KARMA) += ums-karma.o
obj-$(CONFIG_USB_STORAGE_ONETOUCH) += ums-onetouch.o
選項CONFIG_USB_STORAGE在Kconfig 中選定,而CONFIG_USB_STORAGE_DEBUG是調試選項
在我們需要調試時選上,一般不選。其它選項諸於CONFIG_USB_STORAGE_CYPRESS_ATACB是針對
CYPRESS公司的產品,在/usb/storage/下的源檔案是cypress_atacb.c,編譯後的目標檔案為ums-cypress.o
因此我們重點關注的是scsiglue.o protocol.o transport.o usb.o initializers.o sierra_ms.o option_ms.o
等檔案。 這些目標檔案對應在/usb/storage/目錄下的源檔案。透徹分析它們是我們理解並掌握USB驅動的關鍵。