Linux驅動子系統之I2C 5

2021-06-19 15:10:48 字數 2892 閱讀 6945



5 客戶驅動

5.1 概述

i2c客戶驅動是對i2c從裝置的實現,乙個具體的i2c客戶驅動包括兩個部分:一部分是i2c_driver,用於將裝置掛接於i2c匯流排;另一部分是裝置本身的驅動。

i2c客戶驅動程式主要由i2c_driver和i2c_client來描述。

5.2 例項原始碼分析

好了,我們來深入了解客戶驅動**的實現,drivers/misc/eeprom/at24.c檔案支援大多數i2c介面的eeprom

i2c_driver實現

[cpp]view plain

copy

print?

static

struct i2c_driver at24_driver = , 

.probe= at24_probe,  /* 當i2c_client和i2c_driver匹配時呼叫 */

.remove= __devexit_p(at24_remove), /* 登出時呼叫 */

.id_table= at24_ids,   /* i2c_driver支援的i2c_client型別 */

}; 

初始化和解除安裝

[cpp]view plain

copy

print?

static

int __init at24_init(void) 

static

void __exit at24_exit(void)   

at24_probe函式

[cpp]view plain

copy

print?

static

int at24_probe(struct i2c_client*client, const

struct i2c_device_id *id) 

…… 

err = sysfs_create_bin_file(&client->dev.kobj,&at24->bin); 

if(err) 

gotoerr_clients; 

i2c_set_clientdata(client,at24); 

…… 

probe函式主要的工作是在sys目錄下建立bin節點檔案,使用者可以同此節點檔案來操作eeprom,並提供操作方法(read,write)

5.3  i2c_client實現

at24c不依賴於具體的cpu和i2c控制器硬體特性,因此如果電路板包含該外設,只需要新增對應的i2c_board_info,下面是at24c08 i2c_client在板檔案中的實現:

[cpp]view plain

copy

print?

static

struct at24_platform_data at24c08 =; 

static

struct i2c_board_infomini2440_i2c_devs __initdata = , 

}; 

static

void __init mini2440_init(void)   

i2c_register_board_info函式會把i2c從裝置硬體特性資訊註冊到全域性鍊錶__i2c_board_list,在呼叫i2c_add_adapter函式時,會遍歷__i2c_board_list獲得從裝置資訊來構造i2c_client。

i2c_client的構建

我們呼叫i2c_register_board_info函式會把i2c從裝置硬體特性資訊註冊到全域性鍊錶__i2c_board_list,但是還沒有構建出乙個i2c_client結構體,也沒有註冊進i2c匯流排。我們來分析一下構造的過程,呼叫i2c_add_adapter函式時,會遍歷__i2c_board_list獲得從裝置資訊來構造i2c_client:i2c_register_adapter()->i2c_scan_static_board_info()->i2c_new_device()->device_register()。

5.4  i2c_driver和i2c_client的match

在呼叫i2c_add_driver註冊i2c_driver和構建i2c_client時,都會呼叫i2c bus中註冊的i2c_device_match()->i2c_match_id()函式通過i2c_driver->id_table->name和client->name來匹配

[cpp]view plain

copy

print?

static

const

struct i2c_device_id*i2c_match_id(const

struct i2c_device_id *id, 

conststruct i2c_client *client) 

returnnull; 

5.5 測試

已在mini2440上實驗成功,在/sys/bus/i2c/devices/0-0050/目錄下(50代表從裝置位址)會產生乙個eeprom檔案,這個檔案相當於是硬體裝置eeprom的對映,我們可以像普通檔案一樣對eeprom檔案進行操作,實質上就是就硬體eeprom的操作。重啟開發板,你會發現對eeprom檔案修改過的內容不會改變,這就證明實驗成功了,要知道sys檔案系統是無法對資料儲存的。

Linux驅動子系統之I2C 5

5 客戶驅動 5.1 概述 i2c客戶驅動是對i2c從裝置的實現,乙個具體的i2c客戶驅動包括兩個部分 一部分是i2c driver,用於將裝置掛接於i2c匯流排 另一部分是裝置本身的驅動。i2c客戶驅動程式主要由i2c driver和i2c client來描述。5.2 例項原始碼分析 好了,我們來...

Linux驅動子系統之I2C 5

5 客戶驅動 5.1 概述 i2c客戶驅動是對i2c從裝置的實現,乙個具體的i2c客戶驅動包括兩個部分 一部分是i2c driver,用於將裝置掛接於i2c匯流排 另一部分是裝置本身的驅動。i2c客戶驅動程式主要由i2c driver和i2c client來描述。5.2 例項原始碼分析 好了,我們來...

Linux驅動子系統之I2C 1

1.1 概述 i2c匯流排是由philips公司開發的兩線式序列匯流排,這兩根線為時鐘線 scl 和雙向資料線 sda 由於i2c匯流排僅需要兩根線,因此在電路板上占用的空間更少,帶來的問題是頻寬較窄。i2c在標準模式下傳輸速率最高100kb s,在快速模式下最高可達400kb s。屬於半雙工。在嵌...