以上是linux驅動從入口函式到驅動probe函式的整個流程。
module_init(***_init_module):驅動入口函式,一般在驅動**的最下方。其引數即為驅動初始化函式。
module_init
(***_init_module)
//這就入口
module_exit
(***_exit_module)
//這就裝置退掉的時候調的,不是出口啊,一般來說不要...
***_init_module:驅動初始化函式,當乙個裝置接入後,它的路就從這裡開始了。
***_register_driver:這通常是乙個巨集控,其本體為__***_register_driver。
#define ***_register_driver(drv) \
__***_register_driver(struct ***_driver *,struct module *)
//這個***_driver還挺關鍵,隨後再議。
__***_register_driver:這個函式中包含了很多對驅動結構體中函式的重定向,這個之後再說,先關注一下它的返回值。
int
__***_register_driver
(struct ***_driver *drv ,
struct module *owner)
driver_register:這個函式的執行結果就是__***_register_driver函式的返回值。
int
driver_register
(struct device_driver *drv)
//device_driver它出現了...0.0
bus_add_driver:在函式driver_register中執行,它的結果將決定匯流排是否可完成裝置和驅動的匹配。引數和上面那個函式是一樣的。
driver_attach:它來了,它來了,他們又開始套娃了 …可能是我太菜了,不能理解這個函式是幹嘛的…
int
driver_attach
(struct device_driver *drv)
bus_for_each_dev:driver_attach函式只做了一件事,就是返回這個函式的結果。(所以為什麼不直接返回這個函式的結果???)這個函式有四個引數,我就不打出來了…費勁…
fn(dev,data):bus_for_each_dev函式的第四個引數是__driver_attach函式,fn事實上就是指向__driver_attach的函式指標。所以這裡事實上執行的是__driver_attach 。
driver_match_device:這個函式是__driver_attach函式中的乙個函式,主要目的就是為了匹配裝置和驅動。它將會返回這麼個玩意:別問我這幹啥的,我也不知道…嘿嘿嘿… 不過假如沒匹配上,那這個驅動就gg了。
static
inline
intdriver_match_device
(struct device_driver *drv,
struct device *dev)
//device它出現了..0.0
driver_probe_device:這個函式建立在裝置與驅動已經匹配上的情況下,它在函式__driver_attach中,走到這它還會提示一下驅動裝置已經匹配了哦嘿嘿嘿
我自己加的printk,不知道你們加沒加…
int
driver_probe_device
(struct device_driver *drv,
struct device *dev)
really_probe:如函式名所示,really_probe。就是真正的probe函式從這裡開始,在函式中會呼叫drv->probe,從而開始驅動**中的probe函式。
(以上觀點僅代表個人看法,歡迎指正。)
struct bus_type
;
struct device
struct device_driver
其實在linux核心中,所有裝置的驅動的定義,都是以struct device_driver為基類進行繼承擴充套件的。
device_driver和device分別表示驅動和裝置,這兩都依附在一種匯流排上,因此都包含struct bus_type指標。在linux核心中,裝置和驅動是分開註冊的,註冊乙個裝置的時候,並不需要驅動已經存在。(驅動:俺也一樣。)裝置和驅動各自湧向核心,然後找另一半。匯流排則用match函式把他們**在一塊。匹配成功後則執行驅動的probe函式。
匯流排驅動和裝置最終都會落實為sysfs這玩意我稍後再議中的乙個目錄,進一步追蹤**會發現,他們實際上都可是kobject的派生類,kobject可看作是所有匯流排、裝置和驅動的抽象基類,1個kobject對應sysfs中的1個目錄。
匯流排、裝置和驅動中的各個attribute則直接落實為sysfs中的1個檔案,attribute會伴隨著show()和store()這兩個函式,分別用於讀寫該attribute對應的sysfs檔案。
(上面這三段話熟嗎,熟就對了,來自於linux裝置驅動開發詳解基於最新的linux4.0第125頁…目前就這樣吧,等有啥改動了,回頭再改…)
linux驅動概述
核心主要包括以下功能 程序管理 記憶體管理 檔案系統 裝置控制 網路功能。程序管理 建立和銷毀程序,處理程序的輸入輸出,實現不同程序之間的通訊,程序排程 linux將裝置分成三種基本型別 字元裝置 塊裝置 網路裝置 核心執行時不依賴c庫,也不能依賴c庫,因此不能使用printf等 printk不支援...
驅動開發1 概述
1 linux下驅動開發不需要直接操作暫存器 2 重點是根據linux下的各種驅動框架進行開發。一定要滿足框架,也就是linux下各種驅動框架的掌握。3 linux一切皆檔案,驅動最終表現就是 dev 檔案,對驅動的操作就是對這些檔案操作 4 裝置樹 在3.0核心以後支援 這個乙個.dts檔案,此檔...
Linux驅動學習 Linux裝置驅動概述
linux裝置驅動概述 以點亮led為例 包括應用程式 庫 作業系統 核心 驅動程式。而開發人員中 只要關注自己的那一層,相鄰層只關注介面就可以了 應用程式使用庫提供的open函式開啟led的裝置檔案 庫根據open函式傳入的引數執行 swi 指令,這是軟中斷,這條指令會引起 cpu異常,進入核心 ...