“出來混,遲早要還的。”
基本上,Linux
核心中每一個目錄下邊都有一個Makefile
。Makefile
和Kconfig
就像一個城市的地圖,地圖帶領我們去認識一個城市,而Makefile
和Kconfig
則可以讓我們瞭解這個目錄下面的結構。drivers/usb/storage/
目錄下邊的Makefile
內容如下:
lfg1:/usr/src/linux-2.6.22/drivers/usb/storage #
cat Makefile
#
# Makefile for the USB Mass Storage device drivers.
#
# 15 Aug 2000, Christoph Hellwig
<hch@infradead.org>
# 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_USBAT) += 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-obj-$(CONFIG_USB_STORAGE_ALAUDA) += alauda.o
usb-storage-obj-$(CONFIG_USB_STORAGE_ONETOUCH) += onetouch.o
usb-storage-obj-$(CONFIG_USB_STORAGE_KARMA) += karma.o
usb-storage-objs := scsiglue.o protocol.o transport.o usb.o /
initializers.o $(usb-storage-obj-y)
ifneq ($(CONFIG_USB_LIBUSUAL),)
obj-$(CONFIG_USB) +=
libusual.o
endif
而Kconfig
檔案,其實就是對上面看到的這些Config
選項進行解釋,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 <http://www.datafabusa.com/
>.
顯然,這個選項和我們沒有關係,首先這是專門針對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
bool "SanDisk SDDR-55
SmartMedia support (EXPERIMENTAL)"
depends on USB_STORAGE &&
EXPERIMENTAL
help
Say Y here to include
additional code to support the Sandisk SDDR-55
SmartMedia reader in the
USB Mass Storage driver.
很顯然這是SanDisk
的產品,並且是針對SM
卡的,這也不是U
盤,所以都不去理睬了。事實上,很容易確定,只有CONFIG_USB_STORAGE
這個選項是需要真正關心的,而它所對應的模組叫usb-storage
,Makefile
中最後幾行也說了:
usb-storage-objs :=
scsiglue.o protocol.o transport.o usb.o /
initializers.o $(usb-storage-obj-y)
這就意味著我們只需要關注的檔案就是scsiglue.c
,protocol.c
,transport.c
,usb.c
,initializers.c
以及它們同名的.h
標頭檔。再次使用wc -l
命令統計一下這幾個檔案,發現總長度只有3654
行,比最初看到的15455
多行少了許多,當時信心就倍增。
不過需要特別注意的是,CONFIG_USB_STORAGE_DEBUG
這個編譯選項不是必需的,但是如果真的要自己修改或者調試usb-storage
的代碼,那麼開啟這個選項是很有必要的,因為它會負責列印一些調試資訊,以後在原始碼中會看到它的作用。
*****************************
摘自《Linux那些事兒之我是USB》
《Linux那些事兒之我是USB》
連結為:china-pub
、噹噹
、卓越
《Linux
核心修鍊之道》連結為: 卓越
、噹噹
、
china-pub