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型別 */
};
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)
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);
……
}
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)
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;
}
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。屬於半雙工。在嵌...