《Linux那些事兒之我是USB》我是隨身碟(8)匯流排、裝置和驅動(上)

來源:互聯網
上載者:User

struct bus_type中為裝置和驅動準備了兩個鏈表,而代表裝置的結構體struct device中又有兩個成員,struct bus_type *bus和struct device_driver *driver。同樣,代表驅動的結構體struct device_driver同樣有兩個成員,struct bus_type *bus和struct list_head devices,struct device和struct device_driver的定義和struct bus_type一樣,在include/linux/device.h中。憑直覺,可以知道,struct device中的bus記錄的是這個裝置連在哪條匯流排上,driver記錄的是這個裝置用的是哪個驅動。反過來,struct device_driver中的bus代表的也是這個驅動屬於哪條匯流排,devices記錄的是這個驅動支援的那些裝置。沒錯,是devices(複數),而不是device(單數),因為一個驅動程式可以支援一個或多個裝置,反過來一個裝置則只會綁定給一個驅動程式。

於是我們想知道,關於bus,關於device,關於driver,它們是如何建立聯絡的呢?換而言之,這三個資料結構中的指標是如何被賦值的?絕對不可能發生的事情是,一旦為一條匯流排申請了一個struct bus_type的資料結構之後,它就知道它的devices鏈表和drivers鏈表會包含哪些東西,這些東西一定不會是先天就有的,只能是後來填進來的。

而具體到USB系統,完成這個工作的就是USB Core。USB Core的代碼會進行整個USB系統的初始化,比如申請struct bus_typeusb_bus_type,然後會掃描USB匯流排,看線上串連了哪些USB裝置。或者說Root Hub上連了哪些USB裝置,比如說連了一個USB鍵盤,那麼就為它準備一個struct device,根據它的實際情況,為這個struct device賦值,並插入devices鏈表中來。又比如Root Hub上連了一個普通的Hub,那麼除了要為這個Hub本身準備一個struct device以外,還得繼續掃描看這個Hub上是否又連了別的裝置,如果有的話繼續重複之前的事情,這樣一直進行下去,直到完成整個掃描,最終就把usb_bus_type中的devices鏈表給建立了起來。

那drivers鏈表呢?這個就不用bus方面主動了,而該由每一個驅動本身去bus上面登記,或者說掛牌。具體到USB系統,每一個USB裝置的驅動程式都會有一個struct usb_driver結構體,其代碼如下,來自include/linux/usb.h:

833 struct usb_driver {

834   const char *name;

835

836   int (*probe) (struct usb_interface*intf,

837                      const struct usb_device_id *id);

838

839    void(*disconnect) (struct usb_interface *intf);

840

841   int (*ioctl) (struct usb_interface*intf, unsigned int code,

842                        void *buf);

843   

844     int (*suspend) (struct usb_interface *intf,pm_message_t message);

845    int(*resume) (struct usb_interface *intf);

846

847     void(*pre_reset) (struct usb_interface *intf);

848   void (*post_reset) (structusb_interface *intf);

849

850    conststruct usb_device_id *id_table;

851

852    structusb_dynids dynids;

853   struct usbdrv_wrap drvwrap;

854    unsignedint no_dynamic_id:1;

855     unsignedint supports_autosuspend:1;

856 };

857 #define to_usb_driver(d)  \

  container_of(d,struct usb_driver, drvwrap.driver)

此刻我們只需注意到其中的structdevice_driver driver這個成員,USB Core為每一個裝置驅動準備了一個函數,讓它把這個struct device_driver driver插入到usb_bus_type中的drivers鏈表中去。而這個函數正是我們此前看到的usb_register。而與之對應的usb_deregister函數所從事的正是與之相反的工作,把這個結構體從drivers鏈表中刪除。

可以說,USB Core的確是用心良苦,為每一個USB裝置驅動做足了功課,正因為如此,作為一個實際的USB裝置驅動,它在初始化階段所要做的事情就很少,很簡單了,直接調用usb_register即可。事實上,沒有人是理所當然應該為你做什麼的,但USB Core這麼做了。所以每一個寫USB裝置驅動的人應該銘記,USB裝置驅動絕不是一個人在工作,在他身後,是USB Core所提供的默默無聞又不可或缺的支援。

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.