《Linux內(nèi)核修煉之道》——分析內(nèi)核源碼如何入手?(上)
《Linux內(nèi)核修煉之道》——分析內(nèi)核源碼如何入手?(上)
透過現(xiàn)象看本質(zhì),獸獸門無非就是一些人體藝術(shù)展示。同樣往本質(zhì)里看過去,學(xué)習(xí)內(nèi)核,就是學(xué)習(xí)內(nèi)核的源代碼,任何內(nèi)核有關(guān)的書籍都是基于內(nèi)核,而又不高于內(nèi)核的。
既然要學(xué)習(xí)內(nèi)核源碼,就要經(jīng)常對內(nèi)核代碼進行分析,而內(nèi)核代碼千千萬,還前仆后繼的不斷往里加,這就讓大部分人都有種霧里看花花不見的無助感。不過不要怕,孔老夫子早就留給我們了應(yīng)對之策:敏于事而慎于言,就有道而正焉,可謂好學(xué)也已。這就是說,做事要踏實才是好學(xué)生好同志,要遵循嚴(yán)謹(jǐn)?shù)膽B(tài)度,去理解每一段代碼的實現(xiàn),多問多想多記。如果抱著走馬觀花,得過且過的態(tài)度,結(jié)果極有可能就是一邊看一邊丟,沒有多大的收獲。
假設(shè)全國房價上漲1.5%,假設(shè)80后局長是農(nóng)民子弟,??,既然我們的人生充滿了假設(shè),那么我在這里假設(shè)你現(xiàn)在就迫不及待的希望研究內(nèi)核中USB子系統(tǒng)的實現(xiàn),應(yīng)該沒有意見吧?那好,下面就以USB子系統(tǒng)的實現(xiàn)分析為標(biāo)本看看分析內(nèi)核源碼應(yīng)該如何入手。
分析README
內(nèi)核中USB子系統(tǒng)的代碼位于目錄drivers/usb,這個結(jié)論并不需要假設(shè)。于是我們進入到該目錄,執(zhí)行命令ls,結(jié)果顯示如下:
atm class core gadget host image misc mon serial storage Kconfig
Makefile README usb-skeleton.c
目錄drivers/usb共包含有10個子目錄和4個文件,usb-skeleton.c是一個簡單的USB driver的框架,感興趣的可以去看看,目前來說,它還吸引不了我們的眼球。那么首先應(yīng)該關(guān)注什么?如果迎面走來一個ppmm,你會首先看臉、腳還是其它?當(dāng)然答案依據(jù)每個人的癖好會有所不同。不過這里的問題應(yīng)該只有一個答案,那就是Kconfig、Makefile、README。
README里有關(guān)于這個目錄下內(nèi)容的一般性描述,它不是關(guān)鍵,只是幫助你了解。再說了,面對“read我吧read我吧”這么熱情奔放的呼喚,善良的我們是不可能無動于衷的,所以先來看看里面都有些什么內(nèi)容。
23 Here is a list of what each subdirectory here is, and what is contained in
24 them.
25
26 core/ - This is for the core USB host code, including the
27 usbfs files and the hub class driver ("khubd").
28
29 host/ - This is for USB host controller drivers. This
30 includes UHCI, OHCI, EHCI, and others that might
31 be used with more specialized "embedded" systems.
32
33 gadget/ - This is for USB peripheral controller drivers and
34 the various gadget drivers which talk to them.
35
36
37 Individual USB driver directories. A new driver should be added to the
38 first subdirectory in the list below that it fits into.
39
40 image/ - This is for still image drivers, like scanners or
41 digital cameras.
42 input/ - This is for any driver that uses the input subsystem,
43 like keyboard, mice, touchscreens, tablets, etc.
44 media/ - This is for multimedia drivers, like video cameras,
45 radios, and any other drivers that talk to the v4l
46 subsystem.
47 net/ - This is for network drivers.
48 serial/ - This is for USB to serial drivers.
49 storage/ - This is for USB mass-storage drivers.
50 class/ - This is for all USB device drivers that do not fit
51 into any of the above categories, and work for a range
52 of USB Class specified devices.
53 misc/ - This is for all USB device drivers that do not fit
54 into any of the above categories.
這個README文件描述了前邊使用ls命令列出的那10個文件夾的用途。那么什么是USB Core?Linux內(nèi)核開發(fā)者們,專門寫了一些代碼,負(fù)責(zé)實現(xiàn)一些核心的功能,為別的設(shè)備驅(qū)動程序提供服務(wù),比如申請內(nèi)存,比如實現(xiàn)一些所有的設(shè)備都會需要的公共的函數(shù),并美其名曰USB Core。
時代總在發(fā)展,當(dāng)年胖楊貴妃照樣迷死唐明皇,而如今人們欣賞的則是林志玲這樣的魔鬼身材。同樣,早期的Linux內(nèi)核,其結(jié)構(gòu)并不是如今天這般有層次感,遠不像今天這般錯落有致,那時候drivers/usb/這個目錄下邊放了很多很多文件,USB Core與其他各種設(shè)備的驅(qū)動程序的代碼都堆砌在這里,后來,怎奈世間萬千的變幻,總愛把有情的人分兩端。于是在drivers/usb/目錄下面出來了一個core目錄,就專門放一些核心的代碼,比如初始化整個USB系統(tǒng),初始化Root Hub,初始化主機控制器的代碼,再后來甚至把主機控制器相關(guān)的代碼也單獨建了一個目錄,叫host目錄,這是因為USB主機控制器隨著時代的發(fā)展,也開始有了好幾種,不再像剛開始那樣只有一種,所以呢,設(shè)計者們把一些主機控制器公共的代碼仍然留在core目錄下,而一些各主機控制器單獨的代碼則移到host目錄下面讓負(fù)責(zé)各種主機控制器的人去維護。
那么USB gadget那?gadget白了說就是配件的意思,主要就是一些內(nèi)部運行Linux的嵌入式設(shè)備,比如PDA,設(shè)備本身有USB設(shè)備控制器(USB Device Controller),可以將PC,也就是我們的主機作為master端,將這樣的設(shè)備作為slave端和主機通過USB進行通信。從主機的觀點來看,主機系統(tǒng)的USB驅(qū)動程序控制插入其中的USB設(shè)備,而USB gadget的驅(qū)動程序控制外圍設(shè)備如何作為一個USB設(shè)備和主機通信。比如,我們的嵌入式板子上支持SD卡,如果我們希望在將板子通過USB連接到PC之后,這個SD卡被模擬成U盤,那么就要通過USB gadget架構(gòu)的驅(qū)動。
剩下的幾個目錄分門別類的放了各種USB設(shè)備的驅(qū)動,比如U盤的驅(qū)動在storage目錄下,觸摸屏和USB鍵盤鼠標(biāo)的驅(qū)動在input目錄下,等等。
我們響應(yīng)了README的熱情呼喚,它便給予了我們想要的,通過它我們了解了USB目錄里的那些文件夾都有著什么樣的角色。到現(xiàn)在為止,就只剩下內(nèi)核的地圖——Kconfig與Makefile兩個文件了。有地圖在手,對于在內(nèi)核中游蕩的我們來說,是件很愉悅的事情,不過,因為我們的目的是研究內(nèi)核對USB子系統(tǒng)的實現(xiàn),而不是特定設(shè)備或host controller的驅(qū)動,所以這里的定位很明顯,USB Core就是我們需要關(guān)注的對象,那么接下來就是要對core目錄中的內(nèi)容進行定位了。
分析Kconfig和Makefile
進入到drivers/usb/core目錄,執(zhí)行命令ls,結(jié)果顯示如下:
Kconfig Makefile buffer.c config.c devices.c devio.c driver.c
endpoint.c file.c generic.c hcd-pci.c hcd.c hcd.h hub.c hub.h
inode.c message.c notify.c otg_whitelist.h quirks.c sysfs.c urb.c
usb.c usb.h
然后執(zhí)行wc命令,如下所示。
# wc –l ./*
148 buffer.c
607 config.c
706 devices.c
1677 devio.c
1569 driver.c
357 endpoint.c
248 file.c
238 generic.c
1759 hcd.c
458 hcd.h
433 hcd-pci.c
3046 hub.c
195 hub.h
758 inode.c
144 Kconfig
21 Makefile
1732 message.c
68 notify.c
112 otg_whitelist.h
161 quirks.c
710 sysfs.c
589 urb.c
984 usb.c
160 usb.h
16880 total
drivers/usb/core目錄共包括24個文件,16880行代碼。core不愧是core,為大家默默的做這么多事。不過這么多文件里不一定都是我們所需要關(guān)注的,先拿咱們的地圖來看看接下來該怎么走。先看看Kconfig文件,可以看到下面的選項。
15 config USB_DEVICEFS
16 bool "USB device filesystem"
17 depends on USB
18 ---help---
19 If you say Y here (and to "/proc file system support" in the "File
20 systems" section, above), you will get a file /proc/bus/usb/devices
21 which lists the devices currently connected to your USB bus or
22 busses, and for every connected device a file named
23 "/proc/bus/usb/xxx/yyy", where xxx is the bus number and yyy the
24 device number; the latter files can be used by user space programs
25 to talk directly to the device. These files are "virtual", meaning
26 they are generated on the fly and not stored on the hard drive.
27
28 You may need to mount the usbfs file system to see the files, use
29 mount -t usbfs none /proc/bus/usb
30
31 For the format of the various /proc/bus/usb/ files, please read
32 <file:Documentation/usb/proc_usb_info.txt>.
33
34 Usbfs files can't handle Access Control Lists (ACL), which are the
35 default way to grant access to USB devices for untrusted users of a
36 desktop system. The usbfs functionality is replaced by real
37 device-nodes managed by udev. These nodes live in /dev/bus/usb and
38 are used by libusb.
選項USB_DEVICEFS與usbfs文件系統(tǒng)有關(guān)。usbfs文件系統(tǒng)掛載在/proc/bus/usb目錄,顯示了當(dāng)前連接的所有USB設(shè)備及總線的各種信息,每個連接的USB設(shè)備在其中都會有一個對應(yīng)的文件進行描述。比如文件/proc/bus/usb/xxx/yyy,xxx表示總線的序號,yyy表示設(shè)備所在總線的地址。不過不能夠依賴它們來穩(wěn)定地訪問設(shè)備,因為同一設(shè)備兩次連接對應(yīng)的描述文件可能會不同,比如,第一次連接一個設(shè)備時,它可能是002/027,一段時間后再次連接,它可能就已經(jīng)改變?yōu)?02/048。
就好比好不容易你暗戀的mm今天見你的時候?qū)δ銙伭藗€媚眼,你心花怒放,趕快去買了100塊彩票慶祝,到第二天再見到她的時候,她對你說你是誰啊,你悲痛欲絕的刮開那100塊彩票,上面清一色的謝謝你。
因為usbfs文件系統(tǒng)并不屬于USB子系統(tǒng)實現(xiàn)的核心部分,與之相關(guān)的代碼我們可以不必關(guān)注。
74 config USB_SUSPEND
75 bool "USB selective suspend/resume and wakeup (EXPERIMENTAL)"
76 depends on USB && PM && EXPERIMENTAL
77 help
78 If you say Y here, you can use driver calls or the sysfs
79 "power/state" file to suspend or resume individual USB
80 peripherals.
81
82 Also, USB "remote wakeup" signaling is supported, whereby some
83 USB devices (like keyboards and network adapters) can wake up
84 their parent hub. That wakeup cascades up the USB tree, and
85 could wake the system from states like suspend-to-RAM.
86
87 If you are unsure about this, say N here.
這一項是有關(guān)USB設(shè)備的掛起和恢復(fù)。開發(fā)USB的人都是節(jié)電節(jié)能的好孩子,所以協(xié)議里就規(guī)定了,所有的設(shè)備都必須支持掛起狀態(tài),就是說為了達到節(jié)電的目的,當(dāng)設(shè)備在指定的時間內(nèi),如果沒有發(fā)生總線傳輸,就要進入掛起狀態(tài)。當(dāng)它收到一個non-idle的信號時,就會被喚醒。節(jié)約用電從USB做起。不過這個與主題也沒太大關(guān)系,相關(guān)代碼也可以不用關(guān)注了。
剩下的還有幾項,不過似乎與咱們關(guān)系也不大,還是去看看Makefile。
5 usbcore-objs := usb.o hub.o hcd.o urb.o message.o driver.o /
6 config.o file.o buffer.o sysfs.o endpoint.o /
7 devio.o notify.o generic.o quirks.o
8
9 ifeq ($(CONFIG_PCI),y)
10 usbcore-objs += hcd-pci.o
11 endif
12
13 ifeq ($(CONFIG_USB_DEVICEFS),y)
14 usbcore-objs += inode.o devices.o
15 endif
16
17 obj-$(CONFIG_USB) += usbcore.o
18
19 ifeq ($(CONFIG_USB_DEBUG),y)
20 EXTRA_CFLAGS += -DDEBUG
21 endif
Makefile可比Kconfig簡略多了,所以看起來也更親切點,咱們總是拿的money越多越好,看的代碼越少越好。這里之所以會出現(xiàn)CONFIG_PCI,是因為通常USB的Root Hub包含在一個PCI設(shè)備中。hcd-pci和hcd顧名而思義就知道是說主機控制器的,它們實現(xiàn)了主機控制器公共部分,按協(xié)議里的說法它們就是HCDI(HCD的公共接口),host目錄下則實現(xiàn)了各種不同的主機控制器。
CONFIG_USB_DEVICEFS前面的Kconfig文件里也見到了,關(guān)于usbfs的,與咱們的主題無關(guān),inode.c和devices.c兩個文件也可以不用管了。
那么我們可以得出結(jié)論,為了理解內(nèi)核對USB子系統(tǒng)的實現(xiàn),我們需要研究buffer.c、config.c、driver.c、endpoint.c、file.c、generic.c、hcd.c hcd.h、hub.c、message.c、notify.c、otg_whitelist.h、quirks.c、sysfs.c、urb.c 和usb.c文件。這么看來,好像大都需要關(guān)注的樣子,沒有減輕多少壓力,不過這里本身就是USB Core部分,是要做很多的事為咱們分憂的,所以多點也是可以理解的
透過現(xiàn)象看本質(zhì),獸獸門無非就是一些人體藝術(shù)展示。同樣往本質(zhì)里看過去,學(xué)習(xí)內(nèi)核,就是學(xué)習(xí)內(nèi)核的源代碼,任何內(nèi)核有關(guān)的書籍都是基于內(nèi)核,而又不高于內(nèi)核的。
既然要學(xué)習(xí)內(nèi)核源碼,就要經(jīng)常對內(nèi)核代碼進行分析,而內(nèi)核代碼千千萬,還前仆后繼的不斷往里加,這就讓大部分人都有種霧里看花花不見的無助感。不過不要怕,孔老夫子早就留給我們了應(yīng)對之策:敏于事而慎于言,就有道而正焉,可謂好學(xué)也已。這就是說,做事要踏實才是好學(xué)生好同志,要遵循嚴(yán)謹(jǐn)?shù)膽B(tài)度,去理解每一段代碼的實現(xiàn),多問多想多記。如果抱著走馬觀花,得過且過的態(tài)度,結(jié)果極有可能就是一邊看一邊丟,沒有多大的收獲。
假設(shè)全國房價上漲1.5%,假設(shè)80后局長是農(nóng)民子弟,??,既然我們的人生充滿了假設(shè),那么我在這里假設(shè)你現(xiàn)在就迫不及待的希望研究內(nèi)核中USB子系統(tǒng)的實現(xiàn),應(yīng)該沒有意見吧?那好,下面就以USB子系統(tǒng)的實現(xiàn)分析為標(biāo)本看看分析內(nèi)核源碼應(yīng)該如何入手。
分析README
內(nèi)核中USB子系統(tǒng)的代碼位于目錄drivers/usb,這個結(jié)論并不需要假設(shè)。于是我們進入到該目錄,執(zhí)行命令ls,結(jié)果顯示如下:
atm class core gadget host image misc mon serial storage Kconfig
Makefile README usb-skeleton.c
目錄drivers/usb共包含有10個子目錄和4個文件,usb-skeleton.c是一個簡單的USB driver的框架,感興趣的可以去看看,目前來說,它還吸引不了我們的眼球。那么首先應(yīng)該關(guān)注什么?如果迎面走來一個ppmm,你會首先看臉、腳還是其它?當(dāng)然答案依據(jù)每個人的癖好會有所不同。不過這里的問題應(yīng)該只有一個答案,那就是Kconfig、Makefile、README。
README里有關(guān)于這個目錄下內(nèi)容的一般性描述,它不是關(guān)鍵,只是幫助你了解。再說了,面對“read我吧read我吧”這么熱情奔放的呼喚,善良的我們是不可能無動于衷的,所以先來看看里面都有些什么內(nèi)容。
23 Here is a list of what each subdirectory here is, and what is contained in
24 them.
25
26 core/ - This is for the core USB host code, including the
27 usbfs files and the hub class driver ("khubd").
28
29 host/ - This is for USB host controller drivers. This
30 includes UHCI, OHCI, EHCI, and others that might
31 be used with more specialized "embedded" systems.
32
33 gadget/ - This is for USB peripheral controller drivers and
34 the various gadget drivers which talk to them.
35
36
37 Individual USB driver directories. A new driver should be added to the
38 first subdirectory in the list below that it fits into.
39
40 image/ - This is for still image drivers, like scanners or
41 digital cameras.
42 input/ - This is for any driver that uses the input subsystem,
43 like keyboard, mice, touchscreens, tablets, etc.
44 media/ - This is for multimedia drivers, like video cameras,
45 radios, and any other drivers that talk to the v4l
46 subsystem.
47 net/ - This is for network drivers.
48 serial/ - This is for USB to serial drivers.
49 storage/ - This is for USB mass-storage drivers.
50 class/ - This is for all USB device drivers that do not fit
51 into any of the above categories, and work for a range
52 of USB Class specified devices.
53 misc/ - This is for all USB device drivers that do not fit
54 into any of the above categories.
這個README文件描述了前邊使用ls命令列出的那10個文件夾的用途。那么什么是USB Core?Linux內(nèi)核開發(fā)者們,專門寫了一些代碼,負(fù)責(zé)實現(xiàn)一些核心的功能,為別的設(shè)備驅(qū)動程序提供服務(wù),比如申請內(nèi)存,比如實現(xiàn)一些所有的設(shè)備都會需要的公共的函數(shù),并美其名曰USB Core。
時代總在發(fā)展,當(dāng)年胖楊貴妃照樣迷死唐明皇,而如今人們欣賞的則是林志玲這樣的魔鬼身材。同樣,早期的Linux內(nèi)核,其結(jié)構(gòu)并不是如今天這般有層次感,遠不像今天這般錯落有致,那時候drivers/usb/這個目錄下邊放了很多很多文件,USB Core與其他各種設(shè)備的驅(qū)動程序的代碼都堆砌在這里,后來,怎奈世間萬千的變幻,總愛把有情的人分兩端。于是在drivers/usb/目錄下面出來了一個core目錄,就專門放一些核心的代碼,比如初始化整個USB系統(tǒng),初始化Root Hub,初始化主機控制器的代碼,再后來甚至把主機控制器相關(guān)的代碼也單獨建了一個目錄,叫host目錄,這是因為USB主機控制器隨著時代的發(fā)展,也開始有了好幾種,不再像剛開始那樣只有一種,所以呢,設(shè)計者們把一些主機控制器公共的代碼仍然留在core目錄下,而一些各主機控制器單獨的代碼則移到host目錄下面讓負(fù)責(zé)各種主機控制器的人去維護。
那么USB gadget那?gadget白了說就是配件的意思,主要就是一些內(nèi)部運行Linux的嵌入式設(shè)備,比如PDA,設(shè)備本身有USB設(shè)備控制器(USB Device Controller),可以將PC,也就是我們的主機作為master端,將這樣的設(shè)備作為slave端和主機通過USB進行通信。從主機的觀點來看,主機系統(tǒng)的USB驅(qū)動程序控制插入其中的USB設(shè)備,而USB gadget的驅(qū)動程序控制外圍設(shè)備如何作為一個USB設(shè)備和主機通信。比如,我們的嵌入式板子上支持SD卡,如果我們希望在將板子通過USB連接到PC之后,這個SD卡被模擬成U盤,那么就要通過USB gadget架構(gòu)的驅(qū)動。
剩下的幾個目錄分門別類的放了各種USB設(shè)備的驅(qū)動,比如U盤的驅(qū)動在storage目錄下,觸摸屏和USB鍵盤鼠標(biāo)的驅(qū)動在input目錄下,等等。
我們響應(yīng)了README的熱情呼喚,它便給予了我們想要的,通過它我們了解了USB目錄里的那些文件夾都有著什么樣的角色。到現(xiàn)在為止,就只剩下內(nèi)核的地圖——Kconfig與Makefile兩個文件了。有地圖在手,對于在內(nèi)核中游蕩的我們來說,是件很愉悅的事情,不過,因為我們的目的是研究內(nèi)核對USB子系統(tǒng)的實現(xiàn),而不是特定設(shè)備或host controller的驅(qū)動,所以這里的定位很明顯,USB Core就是我們需要關(guān)注的對象,那么接下來就是要對core目錄中的內(nèi)容進行定位了。
分析Kconfig和Makefile
進入到drivers/usb/core目錄,執(zhí)行命令ls,結(jié)果顯示如下:
Kconfig Makefile buffer.c config.c devices.c devio.c driver.c
endpoint.c file.c generic.c hcd-pci.c hcd.c hcd.h hub.c hub.h
inode.c message.c notify.c otg_whitelist.h quirks.c sysfs.c urb.c
usb.c usb.h
然后執(zhí)行wc命令,如下所示。
# wc –l ./*
148 buffer.c
607 config.c
706 devices.c
1677 devio.c
1569 driver.c
357 endpoint.c
248 file.c
238 generic.c
1759 hcd.c
458 hcd.h
433 hcd-pci.c
3046 hub.c
195 hub.h
758 inode.c
144 Kconfig
21 Makefile
1732 message.c
68 notify.c
112 otg_whitelist.h
161 quirks.c
710 sysfs.c
589 urb.c
984 usb.c
160 usb.h
16880 total
drivers/usb/core目錄共包括24個文件,16880行代碼。core不愧是core,為大家默默的做這么多事。不過這么多文件里不一定都是我們所需要關(guān)注的,先拿咱們的地圖來看看接下來該怎么走。先看看Kconfig文件,可以看到下面的選項。
15 config USB_DEVICEFS
16 bool "USB device filesystem"
17 depends on USB
18 ---help---
19 If you say Y here (and to "/proc file system support" in the "File
20 systems" section, above), you will get a file /proc/bus/usb/devices
21 which lists the devices currently connected to your USB bus or
22 busses, and for every connected device a file named
23 "/proc/bus/usb/xxx/yyy", where xxx is the bus number and yyy the
24 device number; the latter files can be used by user space programs
25 to talk directly to the device. These files are "virtual", meaning
26 they are generated on the fly and not stored on the hard drive.
27
28 You may need to mount the usbfs file system to see the files, use
29 mount -t usbfs none /proc/bus/usb
30
31 For the format of the various /proc/bus/usb/ files, please read
32 <file:Documentation/usb/proc_usb_info.txt>.
33
34 Usbfs files can't handle Access Control Lists (ACL), which are the
35 default way to grant access to USB devices for untrusted users of a
36 desktop system. The usbfs functionality is replaced by real
37 device-nodes managed by udev. These nodes live in /dev/bus/usb and
38 are used by libusb.
選項USB_DEVICEFS與usbfs文件系統(tǒng)有關(guān)。usbfs文件系統(tǒng)掛載在/proc/bus/usb目錄,顯示了當(dāng)前連接的所有USB設(shè)備及總線的各種信息,每個連接的USB設(shè)備在其中都會有一個對應(yīng)的文件進行描述。比如文件/proc/bus/usb/xxx/yyy,xxx表示總線的序號,yyy表示設(shè)備所在總線的地址。不過不能夠依賴它們來穩(wěn)定地訪問設(shè)備,因為同一設(shè)備兩次連接對應(yīng)的描述文件可能會不同,比如,第一次連接一個設(shè)備時,它可能是002/027,一段時間后再次連接,它可能就已經(jīng)改變?yōu)?02/048。
就好比好不容易你暗戀的mm今天見你的時候?qū)δ銙伭藗€媚眼,你心花怒放,趕快去買了100塊彩票慶祝,到第二天再見到她的時候,她對你說你是誰啊,你悲痛欲絕的刮開那100塊彩票,上面清一色的謝謝你。
因為usbfs文件系統(tǒng)并不屬于USB子系統(tǒng)實現(xiàn)的核心部分,與之相關(guān)的代碼我們可以不必關(guān)注。
74 config USB_SUSPEND
75 bool "USB selective suspend/resume and wakeup (EXPERIMENTAL)"
76 depends on USB && PM && EXPERIMENTAL
77 help
78 If you say Y here, you can use driver calls or the sysfs
79 "power/state" file to suspend or resume individual USB
80 peripherals.
81
82 Also, USB "remote wakeup" signaling is supported, whereby some
83 USB devices (like keyboards and network adapters) can wake up
84 their parent hub. That wakeup cascades up the USB tree, and
85 could wake the system from states like suspend-to-RAM.
86
87 If you are unsure about this, say N here.
這一項是有關(guān)USB設(shè)備的掛起和恢復(fù)。開發(fā)USB的人都是節(jié)電節(jié)能的好孩子,所以協(xié)議里就規(guī)定了,所有的設(shè)備都必須支持掛起狀態(tài),就是說為了達到節(jié)電的目的,當(dāng)設(shè)備在指定的時間內(nèi),如果沒有發(fā)生總線傳輸,就要進入掛起狀態(tài)。當(dāng)它收到一個non-idle的信號時,就會被喚醒。節(jié)約用電從USB做起。不過這個與主題也沒太大關(guān)系,相關(guān)代碼也可以不用關(guān)注了。
剩下的還有幾項,不過似乎與咱們關(guān)系也不大,還是去看看Makefile。
5 usbcore-objs := usb.o hub.o hcd.o urb.o message.o driver.o /
6 config.o file.o buffer.o sysfs.o endpoint.o /
7 devio.o notify.o generic.o quirks.o
8
9 ifeq ($(CONFIG_PCI),y)
10 usbcore-objs += hcd-pci.o
11 endif
12
13 ifeq ($(CONFIG_USB_DEVICEFS),y)
14 usbcore-objs += inode.o devices.o
15 endif
16
17 obj-$(CONFIG_USB) += usbcore.o
18
19 ifeq ($(CONFIG_USB_DEBUG),y)
20 EXTRA_CFLAGS += -DDEBUG
21 endif
Makefile可比Kconfig簡略多了,所以看起來也更親切點,咱們總是拿的money越多越好,看的代碼越少越好。這里之所以會出現(xiàn)CONFIG_PCI,是因為通常USB的Root Hub包含在一個PCI設(shè)備中。hcd-pci和hcd顧名而思義就知道是說主機控制器的,它們實現(xiàn)了主機控制器公共部分,按協(xié)議里的說法它們就是HCDI(HCD的公共接口),host目錄下則實現(xiàn)了各種不同的主機控制器。
CONFIG_USB_DEVICEFS前面的Kconfig文件里也見到了,關(guān)于usbfs的,與咱們的主題無關(guān),inode.c和devices.c兩個文件也可以不用管了。
那么我們可以得出結(jié)論,為了理解內(nèi)核對USB子系統(tǒng)的實現(xiàn),我們需要研究buffer.c、config.c、driver.c、endpoint.c、file.c、generic.c、hcd.c hcd.h、hub.c、message.c、notify.c、otg_whitelist.h、quirks.c、sysfs.c、urb.c 和usb.c文件。這么看來,好像大都需要關(guān)注的樣子,沒有減輕多少壓力,不過這里本身就是USB Core部分,是要做很多的事為咱們分憂的,所以多點也是可以理解的