probe函式何時呼叫的

2022-08-21 05:30:15 字數 2724 閱讀 5427

linux中 probe函式何時呼叫的

所以的驅動教程上都說:只有裝置和驅動的名字匹配,bus就會呼叫驅動的probe函式,但是有時我們要看看probe函式裡面到底做了什麼,還有傳遞給probe函式的引數我們就不知道在哪定義(反正不是我們在驅動裡定義的),如果不知道傳遞進的引數,去看probe函式總是感覺不求甚解的樣子(你對系統不求甚解,系統也會對你的要求不求甚解的),心裡對自己寫出的程式沒底,保不齊那天來個bug,就悲劇了。

這裡以static int__devinit sst25l_probe(struct spi_device *spi)為例看看傳遞進的引數structspi_device *spi到底是什麼,在哪定義,什麼時候定義,定義了有什麼用…?(本著「five w and h」的原則打破沙鍋問到底)。首先struct spi_device *spi不是我們定義的驅動裡定義的;其次在read,write等函式裡都有struct spi_device *spi的影子,不過不是直接傳遞進去的,而是通過傳遞進去struct mtd_info *mtd,然後to_sst25l_flash(mtd),即container_of()出包含mtd的struct sst25l_flash *flash,其中flash裡的第乙個成員就是structspi_device *spi,而此成員的賦值就是將傳遞給probe中的struct spi_device *spi賦值給struct sst25l_flash *flash的,有**為證:

static int __devinit sst25l_probe(structspi_device *spi)

structflash_info *flash_info;

structsst25l_flash *flash;

flash->spi = spi;// 將structspi_device *spi賦值給struct sst25l_flash *flash

mutex_init(&flash->lock);

dev_set_drvdata(&spi->dev,flash);// &spi->dev ->p->driver_data = flash保持flash

所以搞清楚structspi_device *spi的**是搞清楚裝置驅動與主控驅動的聯絡紐帶的關鍵之一,當然要首先搞清楚probe函式什麼時候呼叫才能搞清楚struct spi_device *spi怎麼傳遞的,其重要性不言而喻(雖然言了很多,^-^,有點唐僧了)。我們先從驅動的init開始入手,畢竟這是驅動註冊開始的地方,也是一系列後續操作引發的地方:

static int __init sst25l_init(void)

returnspi_register_driver(&sst25l_driver);

裡面只有乙個函式,最喜歡這樣的函式了:

int spi_register_driver(struct spi_driver*sdrv)

sdrv->driver.bus= &spi_bus_type;

if(sdrv->probe)

sdrv->driver.probe= spi_drv_probe;

if(sdrv->remove)

sdrv->driver.remove= spi_drv_remove;

if(sdrv->shutdown)

sdrv->driver.shutdown= spi_drv_shutdown;

return driver_register(&sdrv->driver);

前面都是賦值,直接最後乙個語句:

int driver_register(struct device_driver*drv)

intret;

structdevice_driver *other;

ret = bus_add_driver(drv);

if(ret)

returnret;

ret= driver_add_groups(drv, drv->groups);

if(ret)

bus_remove_driver(drv);

returnret;

bus_add_driver(drv)看著就像「好人」:

int bus_add_driver(struct device_driver*drv)

structbus_type *bus;

structdriver_private *priv;

interror = 0;

if(drv->bus->p->drivers_autoprobe) else if (drv->probe) {

ret = drv->probe(dev);

if(ret)

gotoprobe_failed;

returnret;

這裡如果有匯流排上的probe函式就呼叫匯流排的probe函式,如果沒有則呼叫drv的probe函式。

在static int__driver_attach(struct device *dev, void *data)中先呼叫了driver_match_device(drv,dev),用於匹配,成功才繼續執行,否則直接返回了。driver_match_device(drv, dev)中:

static inline intdriver_match_device(struct device_driver *drv,

struct device *dev)

returndrv->bus->match ? drv->bus->match(dev, drv) : 1;

本文章參考:對原作者表示感謝!

probe 何時被呼叫

1 新裝置註冊後,匯流排先match device id,繫結合適的驅動後,呼叫驅動的probe 2 新驅動註冊後,匯流排先match device id,給驅動支援的,未繫結驅動的裝置繫結驅動,並把裝置新增到驅動支援的裝置鍊錶尾部.然後呼叫probe driver register bus add...

何時呼叫拷貝建構函式

拷貝建構函式是一種特殊的建構函式 拷貝建構函式是由編譯器呼叫,用來完成一系列基於同一類的其他物件的構件及初始化。拷貝建構函式的一般形式 類名 類名 變數名 函式體 拷貝建構函式的名稱必須和類名一致,形參必須是唯一的 不可改變的本型別的乙個引用型別的變數。拷貝構造函式呼叫的三種情況 物件以值傳遞的方式...

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

宣告 以下主要內容參考自 關於struct device driver結構中的probe探測函式的呼叫 用sourceinsight跟蹤 從driver register看起,此處我的這裡是 int driver register struct device driver drv klist ini...