Liunx驅動中,probe函式何時被呼叫

2021-08-03 08:51:31 字數 1438 閱讀 3994

眾所周知,專業的程式設計師都知道,程式入口通常為main()函式,而

驅動程式真正的入口是***_probe()函式;

我們看**第一步,就是從入口函式開始的,天才第一步,雀氏紙尿褲。從總——分——總的方式學會linux驅動

step1:驅動模組的載入

linux模組的載入手動載入:1、通過執行insmod命令

自動載入:2、通過模組編譯進核心,在核心啟動時模組自動載入

自動載入是呼叫module_init(hello_init) -->從而程式進入hello_init()函式當中;

下面以led驅動為例分析:

static int __init aw2013_led_init(void)

module_init(aw2013_led_init);

由於這裡aw2013-led是led 的晶元掛載i2c匯流排上面(可以通過檢視硬體原理圖得知)。

根據platform的匯流排bus、裝置device、驅動driver的裝置驅動模型

;在這裡匯流排是:i2c ,裝置是:aw2013-led晶元,驅動是:aw2013-led.c,

step2:將dirver載入到bus上

#define i2c_add_driver(driver) \

i2c_register_driver(this_module,driver)

在函式i2c_register_driver中,將傳遞進來的引數driver新增到i2c驅動列表list當中,主要呼叫driver_register()函式;

首先判斷在目前匯流排上該driver是否已經被註冊了,如果沒有註冊則呼叫bus_add_driver(drv)函式。

下面來看bus_add_driver函式主要是driver_attach()

void

driver_attach(

struct

device_driver

*drv)

遍歷匯流排上的每個裝置,找到與該驅動相匹配的。在__driver_attach()函式中,首先driver_match_device(drv,dev)呼叫platform_match函式判斷device與driver是否匹配。

static inline int driver_match_device(struct device_driver *drv,struct device *dev)

然後一旦匹配函式match成功;就走進driver_probe_device()函式中,呼叫驅動的probe函式

繼承執行的話:

if (drv->probe)

終點:在這裡我們可以看到drv->probe(dev)函式被呼叫的位置。致此敬禮

***************==具體呼叫的bus_type型別的match函式實現是在哪?還需找到

驅動註冊的probe函式

probe的呼叫 從driver register看起 int driver register struct device driver drv klist init與init completion沒去管它,可能是2.6的這個裝置模型要做的一些工作。直覺告訴我要去bus add driver。bus...

驅動註冊的probe函式

probe的呼叫 從driver register看起 int driver register struct device driver drv klist init與init completion沒去管它,可能是2.6的這個裝置模型要做的一些工作。直覺告訴我要去bus add driver。bus...

驅動註冊的probe函式

probe的呼叫 從driver register看起 int driver register struct device driver drv klist init與init completion沒去管它,可能是2.6的這個裝置模型要做的一些工作。直覺告訴我要去bus add driver。bus...