前面說了一大堆,估計早就看暈了,還是用圖來說明下問題。
首先,系統為i2c構造了一條i2c匯流排--i2c_bus_type。注意這裡說的匯流排是軟體層面上的,不是硬體上存在的scl和sda組成的i2c匯流排。一條匯流排有鍊錶:bus.p.kilist_device和bus.p.klist_driver。這對任何匯流排都是成立的,這也是linux2.6的裝置--匯流排--驅動模型。當我們呼叫i2c_register_adapter是會呼叫device_register(adap.dev)就是將內嵌i2c_adapter的struct dev註冊到系統,本質就是將i2c_adapter.dev連入了匯流排的bus.p.klist_device鍊錶了。同時dev.bus也會指向i2c_bus_type。因此,當我們註冊多個i2c_adapter到系統中時就會出現下面左邊所示,最終會通過一條雙鏈表連線起來。同理,我們呼叫i2c_register_driver將i2c_driver註冊到系統時會呼叫driver_register將i2c_driver.driver連入bus.p.klist_driver鍊錶中,註冊多個i2c_driver時形成了一條含多個i2c_driver的雙鏈表,同時每個i2c_driver.driver.bus會指向i2c_bus_type。在呼叫driver_register時還會做一件事,就是將i2c_driver.id_table中所支援的i2c裝置的名字與系統中存在的i2c_client.name進行匹配,如果名字相同就說明該驅動支援該i2c裝置,然後i2c_driver.probe函式就會被呼叫。而probe中就可以字元裝置那一套東西來註冊字元裝置驅動,建立裝置檔案等等。。。
當我們呼叫i2c_new_device建立i2c裝置時也會呼叫device_register,說明i2c_client.dev最終也會連線到匯流排裝置這邊這條鍊錶上來。而且i2c_client.adap會指向其物理上連線的那個i2c_adapter。對於新版的驅動有多種實現方法:第一種是在bsp檔案中靜態定義關於i2c裝置的i2c_board_info結構資訊(我們很清楚這個裝置的名字及該裝置在匯流排的位址),這樣在呼叫i2c_register_adapter時會呼叫i2c_scan_board_info時會建立i2c_client並將其連線到匯流排的裝置鍊錶上。因此當有i2c裝置驅動註冊到系統中來時呼叫driver_register時會用驅動的id_table中的裝置名與匯流排裝置鍊錶中每個i2c_client.name進行匹配,成功後呼叫驅動的probe方法。
Linux2 6 37 I2C驅動框架分析(三)
最幾天忙著公司的sensor驅動,自己的活的忙不過來。終於抽出了點時間繼續完成未完的i2c驅動分析。當呼叫i2c register adapter或i2c add driver時,都會遍歷已經註冊的i2c driver或i2c adapter作為引數呼叫 process new adapter或 p...
Linux驅動 I2C匯流排
這裡以rk3288為例子,使用的是linux4.14,根據裝置樹節點i2c 與rk3x i2c driver,match之後,就會呼叫對應的probe rk3x i2c probe 這裡主要就是註冊乙個adapt i2c add adapter 也就是i2c控制器,或者說是i2c主裝置,既然是主裝置...
Linux驅動之I2C裝置驅動
核心 4.20 晶元 hym8563 rtc 下面的 分析主要都在注釋中,會按照驅動中函式的執行順序分析。static const struct i2c device id hym8563 id module device table i2c,hym8563 id static const stru...