Linux那些事儿 之 戏说USB(9)面纱
生活随笔
收集整理的這篇文章主要介紹了
Linux那些事儿 之 戏说USB(9)面纱
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
int retval;if (nousb) {pr_info("%s: USB support disabled\n", usbcore_name);return 0;}第2行知道C語言的人都會知道nousb是一個標志,只是不同的標志有不一樣的精彩,這里的nousb是用來讓我們在啟動內核的時候通過內核參數去掉USB子系統的,linux社會是一個很人性化的世界,它不會去逼迫我們接受USB,一切都只關乎我們自己的需要。不過我想我們一般來說是不會去指定nousb的吧,畢竟它那么的討人可愛。如果你真的定義了nousb,那它就只會幽怨的說一句“USB support disabled”,然后退出usb_init。
第3行,pr_info只是一個打印信息的宏,printk的變體,在include/linux/printk.h里定義:
#define pr_info(fmt, ...) \printk(KERN_INFO pr_fmt(fmt), ##__VA_ARGS__)這個可變參數宏要不要說一下?地球人都知道了,不過還是聊一下吧,我有多話癥。99年的ISO C標準里規定了可變參數宏,和函數語法類似,給個例子
#define debug(format, ...) fprintf (stderr, format, __VA_ARGS__)
里面的“…”就表示可變參數,調用時,它們就會替代宏體里的__VA_ARGS__。GCC總是會顯得特立獨行一些,它支持更復雜的形式,可以給可變參數取個名字,再給個這種形式的例子
#define debug(format, args...) fprintf (stderr, format, args)
是不是顯得更容易讀了些?有了名字總是會容易交流一些。是不是與咱們的pr_info比較接近了?除了‘##’,它主要是針對空參數的情況。既然說是可變參數,那傳遞空參數也總是可以的,空即是多,多即是空,股市里的哲理這里同樣也是適合的。如果沒有‘##’,傳遞空參數的時候,比如
debug ("A message")
宏展開后,里面的字符串后面會多個多余的逗號。這個逗號你應該不會喜歡,它是表錯情了,而‘##’則會使預處理器去掉這個多余的逗號。
drivers/usb/core/usb.c
usb_acpi_register();retval = bus_register(&usb_bus_type);if (retval)goto bus_register_failed;retval = bus_register_notifier(&usb_bus_type, &usb_bus_nb);if (retval)goto bus_notifier_failed;retval = usb_major_init();if (retval)goto major_init_failed;retval = usb_register(&usbfs_driver);if (retval)goto driver_register_failed;retval = usb_devio_init();if (retval)goto usb_devio_init_failed;retval = usb_hub_init();if (retval)goto hub_init_failed;retval = usb_register_device_driver(&usb_generic_driver, THIS_MODULE);if (!retval)goto out;這些行是代碼里的排比句,相似的init不相似的內容,很顯然都是在完成一些初始化,也是usb_init任勞任怨所付出的全部。這里先簡單的說一下。
1行,電源管理方面的。
2行,注冊USB總線,只有成功的將USB總線子系統注冊到系統中,我們才可以向這個總線添加USB設備。基于它顯要的江湖地位,就拿它做為日后突破的方向了,擒賊先擒王,這個越老越青春的道理在linux中也是同樣適用的。
5行,給USB總線注冊一個通知鏈
8行,一個實際的總線也是一個設備,必須單獨注冊,因為USB是通過快速串行通信來讀寫數據,這里把它當作了字符設備來注冊。
11~16行,都是usbfs相關的初始化。
17行,hub的初始化,這個復旦人甲正在講。
20行,注冊USB device driver,戴好眼鏡看清楚了,是USB device driver而不是USB driver,前面說過,一個設備可以有多個接口,每個接口對應不同的驅動程序,這里所謂的device driver對應的是整個設備,而不是某個接口。內核里結構到處有,只是USB這兒格外多。
剩下的幾行代碼都是有關資源清除的,usb_init這個短短的函數在承載著我們的希望的時候嘎然而止了,你的感覺是什么?我的感覺是:這哪是我能說的清楚的啊。它的每個分叉都更像是一個陷阱,黑黝黝看不到底,但是已經沒有回頭的路。
總結
以上是生活随笔為你收集整理的Linux那些事儿 之 戏说USB(9)面纱的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Linux那些事儿 之 戏说USB(8)
- 下一篇: Linux那些事儿 之 戏说USB(10