乙個platform匯流排型的i2c裝置的註冊

2021-08-04 15:11:54 字數 2865 閱讀 9236

首先在板級目錄下 arch/mips/platform 定義裝置資訊

static struct resource ls2h_i2c0_resources = ,

[1] = ,

};static struct platform_device ls2h_i2c0_device = ;

而且這裡還定義了乙個裝置結構體

static struct platform_device *ls2h_platform_devices = ;

結構體中的裝置都會通過函式ls2h_platform_init(也在這個檔案中)被註冊到系統中。

大概看一下這個函式做了什麼動作:

int ls2h_platform_init(void)

在看乙個函式 platform_add_devices的動作:

int platform_add_devices(struct platform_device **devs, int num)

} return ret;

}

可以看到這個函式就是把結構體中所有定義的裝置註冊到系統中。

下面就是裝置註冊時,函式的呼叫關係,最後註冊到裝置對應的匯流排上的裝置鏈中。這樣乙個platform裝置的註冊就完成了。輪到驅動的註冊了。

int platform_device_register(struct platform_device *pdev)

platform_device_add--->device_add--->bus_add_device--->klist_add_tail

i2c裝置對應的驅動註冊過程:

static int __init ls2h_i2c_init_driver(void)

subsys_initcall(ls2h_i2c_init_driver);

在系統驅動到subsys_initcall這個巨集呼叫時,就輪到驅動註冊了。

(還有一些相關的巨集,把不同的初始化放到不同的啟動階段執行)

函式的呼叫過程:

int platform_driver_register(struct platform_driver *drv)

driver_register--->bus_add_driver--->driver_attach--->bus_for_each_dev--->__driver_attach-->driver_probe_device--->really_probe--->dev->bus->probe || drv->probe

這裡就是乙個platform裝置驅動的註冊流程,最後會呼叫到驅動的probe函式,之後在probe中進行裝置的初始化,資源的申請等等操作。

driver_attach--->bus_for_each_dev--->__driver_attach

這個函式呼叫關係就是會從匯流排上尋找所有已經註冊的裝置來和驅動進行匹配,匹配成功才會有後面的操作滴。

看一下這個匹配的過程:

int driver_attach(struct device_driver *drv)

int bus_for_each_dev(struct bus_type *bus, struct device *start,

void *data, int (*fn)(struct device *, void *))

klist_iter_init_node函式遍尋匯流排上所有裝置,並對這個裝置執行函式fn,也就是函式__driver_attach。

static int __driver_attach(struct device *dev, void *data)

static inline int driver_match_device(struct device_driver *drv,

struct device *dev)

static int platform_match(struct device *dev, struct device_driver *drv)

else if (drv->probe)

....

}

意思就是當定義了匯流排上的probe函式,執行匯流排上的probe函式。還記得那個註冊函式不,那個函式就定義了匯流排上的probe函式,也就是說這個會執行匯流排上的probe函式platform_drv_probe。

static int platform_drv_probe(struct device *_dev)

這裡有呼叫了一次probe函式,這個probe函式就是驅動的probe函式啦。之後進行裝置初始化,資源申請等操作。

驅動最後註冊完畢了。

PCIe掃盲 乙個典型的PCI匯流排週期

pci匯流排是一種位址和資料復用的匯流排,即位址和資料占用同一組訊號線ad。pci匯流排的所有訊號都與時鐘訊號同步,及所有的訊號的變化都發生在時鐘的上公升沿,或者在時鐘上公升沿進行取樣。如下圖所示,除了時鐘訊號clk和資料位址復用訊號ad之外,pci匯流排至少還應包括frame 用於表示一次資料傳輸...

如何確定乙個SharePoint列表的ID

1.在瀏覽器中開啟那個你要檢視id的列表.2.在選單中選擇settings list settings 3.將瀏覽器中的url拷貝到記事本中.結果看起來像這樣.4.刪除包括 list 在內的前面部分.5.把所有的 7b 改為 結果就是列表的guid啦.上面的url的處理結果就是 當然,如果你是個開發...

(原創) 乙個通用的C 訊息匯流排框架

應用開發過程中經常會處理物件間通訊的問題,一般都是物件或介面的依賴和引用去實現物件間的通訊,這在一般情況下是沒問題的,但是如果相互通訊的物件很多,可能會造成物件間的引用關係像蜘蛛網一樣,這樣會導致物件關係很複雜,難以維護的問題,解決這個問題的乙個好方法是通過訊息匯流排去解耦物件間大量相互引用的緊耦合...