Linux2 6 37 I2C驅動框架分析(三)

2021-06-19 17:04:35 字數 1900 閱讀 6420

最幾天忙著公司的sensor驅動,自己的活的忙不過來。終於抽出了點時間繼續完成未完的i2c驅動分析。

當呼叫i2c_register_adapter或i2c_add_driver時,都會遍歷已經註冊的i2c_driver或i2c_adapter作為引數呼叫__process_new_adapter或 __process_new_driver。其中:

__process_new_driver(struct device *dev, void *data)

i2c_do_add_adapter(data, to_i2c_adapter(dev));

__process_new_adapter(struct device_driver *d, void *data)

i2c_do_add_adapter(to_i2c_driver(d), data);

從上面兩個函式呼叫情況來看,最終都是呼叫了i2c_do_add_adapter函式。那我們接下來就來分析這個函式的實現。

i2c_do_add_adapter(struct i2c_driver *driver,struct i2c_adapter *adap)

i2c_detect(adap, driver);        呼叫i2c_detect對i2c裝置進行探測

if (driver->attach_adapter)

繼續分析i2c_detect函式的實現吧!

i2c_detect(struct i2c_adapter *adapter, struct i2c_driver *driver)

address_list = driver->address_list;

if (!driver->detect || !address_list)  如果驅動即沒有detect函式,又沒有裝置的位址直接返回了

return 0;

if (!(adapter->class & driver->class))  介面卡的類和驅動的類不一致也直接返回

return 0;

temp_client = kzalloc(sizeof(struct i2c_client), gfp_kernel); 條件滿足動態分配乙個臨時的i2c_client結構

temp_client->adapter = adapter; 設定i2c裝置所屬的i2c_adapter

for (i = 0; address_list[i] != i2c_client_end; i += 1)

毫無疑問,我們知道要去分析i2c_detect_address函式了。

i2c_detect_address(struct i2c_client *temp_client, struct i2c_driver *driver)

i2c_check_addr_validity(addr);  檢查裝置位址的合法性

i2c_check_addr_busy(adapter, addr)  判斷該位址是否在匯流排上正使用著

i2c_default_probe(adapter, addr)  呼叫預設的探測函式了

i2c_smbus_xfer(adap, addr, 0, i2c_smbus_write, 0,i2c_smbus_quick, null); 呼叫該函式給裝置發資料 

i2c_transfer(adapter, msg, num)algo->master_xfer>;  最終呼叫介面卡驅動的master_xfer給裝置位址資訊,看能否收到ack訊號。如果能收到表明裝置是存在的,探測成功。

到這裡關於註冊介面卡驅動和註冊i2c裝置驅動的分析就要告一段落了。。。

接下來我們轉去分析乙個具體的i2c介面卡的驅動。

此時我們應該很清楚,乙個介面卡的驅動最為關鍵的位址在於,介面卡驅動的通訊方法的實現:如發出s訊號、發出從機位址、等待ack訊號。傳送資料。。。。,這些都是與我們的硬體密切相關的。明天就分析s3c2440的介面卡驅動吧!

Linux2 6 37 I2C驅動框架(四)

前面說了一大堆,估計早就看暈了,還是用圖來說明下問題。首先,系統為i2c構造了一條i2c匯流排 i2c bus type。注意這裡說的匯流排是軟體層面上的,不是硬體上存在的scl和sda組成的i2c匯流排。一條匯流排有鍊錶 bus.p.kilist device和bus.p.klist driver...

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...