新聞中心
I2C(Inter-Integrated Circuit)總線是一種串行數(shù)據(jù)傳輸協(xié)議,被用于連接芯片之間的通信。在Linux內(nèi)核中,i2c子系統(tǒng)驅(qū)動(dòng)負(fù)責(zé)管理I2C總線,允許多個(gè)設(shè)備通過(guò)同一條總線進(jìn)行通信。本文將介紹linux內(nèi)核i2c子系統(tǒng)驅(qū)動(dòng)的相關(guān)知識(shí)。

創(chuàng)新互聯(lián)專注于臨澧網(wǎng)站建設(shè)服務(wù)及定制,我們擁有豐富的企業(yè)做網(wǎng)站經(jīng)驗(yàn)。 熱誠(chéng)為您提供臨澧營(yíng)銷型網(wǎng)站建設(shè),臨澧網(wǎng)站制作、臨澧網(wǎng)頁(yè)設(shè)計(jì)、臨澧網(wǎng)站官網(wǎng)定制、微信小程序開(kāi)發(fā)服務(wù),打造臨澧網(wǎng)絡(luò)公司原創(chuàng)品牌,更為您提供臨澧網(wǎng)站排名全網(wǎng)營(yíng)銷落地服務(wù)。
一、i2c子系統(tǒng)驅(qū)動(dòng)的結(jié)構(gòu)
在Linux內(nèi)核中,i2c子系統(tǒng)驅(qū)動(dòng)通常包含以下幾個(gè)結(jié)構(gòu):
1. i2c_adapter結(jié)構(gòu)體
i2c_adapter結(jié)構(gòu)體描述了一條I2C總線的特性,包括總線地址、時(shí)鐘頻率、數(shù)據(jù)傳送方式等。該結(jié)構(gòu)體的定義在i2c.h頭文件中,如下所示:
struct i2c_adapter {
struct module *owner;
const char *name;
u32 class;
u32 nr;
struct bus_type *bus;
u32 algo_data;
struct i2c_algorithm *algo;
void *algo_priv;
struct device dev;
unsigned long algo_data_dma;
unsigned long owndata;
unsigned int timeout;
unsigned int retries;
bool (*unrecoverable)(struct i2c_adapter *, struct i2c_msg *);
int (*setup)(struct i2c_adapter *);
void (*shutdown)(struct i2c_adapter *);
int (*bus_recovery)(struct i2c_adapter *);
void *adapdata;
struct i2c_lock_operations *lock_ops;
const struct of_device_id *of_match_table;
};
2. i2c_algorithm結(jié)構(gòu)體
i2c_algorithm結(jié)構(gòu)體定義了I2C總線中的通信算法,包括數(shù)據(jù)傳輸格式、地址范圍等。該結(jié)構(gòu)體的定義在i2c.h頭文件中,如下所示:
struct i2c_algorithm {
int (*master_xfer)(struct i2c_adapter *adap, struct i2c_msg *msgs,
int num);
int (*bus_xfer)(struct i2c_adapter *adapter, u16 addr,
unsigned short flags, char read_write,
u8 command, int size, union i2c_bus_data *data);
int (*master_recv)(struct i2c_adapter *adap, struct i2c_msg *msgs,
int num);
int (*master_send)(struct i2c_adapter *adap, struct i2c_msg *msgs,
int num);
u32 (*functionality)(struct i2c_adapter *);
struct module *owner;
const char *name;
};
3. i2c_driver結(jié)構(gòu)體
i2c_driver結(jié)構(gòu)體描述了一個(gè)i2c設(shè)備的特性,包括設(shè)備類型、ID等信息。該結(jié)構(gòu)體的定義在i2c.h頭文件中,如下所示:
struct i2c_driver {
unsigned int class;
const struct i2c_device_id *id_table;
int (*probe)(struct i2c_client *, const struct i2c_device_id *);
int (*remove)(struct i2c_client *);
void (*shutdown)(struct i2c_client *);
int (*suspend)(struct i2c_client *, pm_message_t state);
int (*resume)(struct i2c_client *);
const struct i2c_device_id *of_match_table;
const struct of_device_id *of_match_table;
struct device_driver driver;
};
4. i2c_client結(jié)構(gòu)體
i2c_client結(jié)構(gòu)體描述了一個(gè)具體的i2c設(shè)備,包括設(shè)備地址、設(shè)備類型、驅(qū)動(dòng)等信息。該結(jié)構(gòu)體的定義在i2c.h頭文件中,如下所示:
struct i2c_client {
int irq;
unsigned short flags;
unsigned short addr;
char name[I2C_NAME_SIZE];
struct device dev;
struct i2c_adapter *adapter;
struct i2c_driver *driver;
void *algo_data;
struct i2c_board_info const *board_info;
};
二、i2c子系統(tǒng)驅(qū)動(dòng)的通信過(guò)程
i2c子系統(tǒng)驅(qū)動(dòng)的通信過(guò)程需要經(jīng)過(guò)以下步驟:
1. 注冊(cè)i2c_adapter
初次使用I2C總線時(shí),需要先注冊(cè)i2c_adapter結(jié)構(gòu)體,告訴內(nèi)核I2C總線的特性。在Linux內(nèi)核中,注冊(cè)i2c_adapter結(jié)構(gòu)體可以使用i2c_add_adapter函數(shù)來(lái)完成。
2. 注冊(cè)i2c_driver
為了能夠與具體的i2c設(shè)備通信,需要先注冊(cè)i2c_driver結(jié)構(gòu)體。在Linux內(nèi)核中,注冊(cè)i2c_driver結(jié)構(gòu)體可以使用i2c_add_driver函數(shù)來(lái)完成。
3. 連接i2c_client設(shè)備
一旦I2C總線被注冊(cè)成功,可以使用i2c_new_device函數(shù)連接一個(gè)i2c_client設(shè)備。在連接設(shè)備時(shí),需要指定設(shè)備地址、設(shè)備類型等信息。
4. 與設(shè)備通信
當(dāng)i2c_client設(shè)備連接成功后,就可以使用該設(shè)備進(jìn)行I2C通信了。在Linux內(nèi)核中,I2C數(shù)據(jù)的傳輸通常使用i2c_transfer函數(shù)進(jìn)行。該函數(shù)需要傳入一個(gè)指向i2c_msg結(jié)構(gòu)體的指針,該結(jié)構(gòu)體用于描述數(shù)據(jù)的傳輸信息。
5. 注銷i2c_driver和i2c_adapter
當(dāng)使用完i2c_driver和i2c_adapter之后,需要使用i2c_del_driver和i2c_del_adapter函數(shù)來(lái)注銷。
三、i2c子系統(tǒng)驅(qū)動(dòng)的應(yīng)用場(chǎng)景
i2c子系統(tǒng)驅(qū)動(dòng)在Linux內(nèi)核中的應(yīng)用廣泛,包括但不限于以下場(chǎng)景:
1. 屏幕顯示
在Linux內(nèi)核中,i2c子系統(tǒng)驅(qū)動(dòng)可用于控制顯示器的點(diǎn)陣屏幕,比如樹(shù)莓派的OLED屏幕等。
2. 觸摸屏
i2c子系統(tǒng)驅(qū)動(dòng)還可用于連接觸摸屏設(shè)備,實(shí)現(xiàn)觸摸控制。
3. 傳感器
i2c子系統(tǒng)驅(qū)動(dòng)也可以用于連接各種傳感器設(shè)備,如溫度傳感器、氣壓傳感器等。這些設(shè)備通常需要I2C總線進(jìn)行數(shù)據(jù)傳輸。
i2c子系統(tǒng)驅(qū)動(dòng)在Linux內(nèi)核中的應(yīng)用范圍廣泛,是連接各種設(shè)備的重要手段。通過(guò)對(duì)i2c子系統(tǒng)驅(qū)動(dòng)的深入了解,可以更好地開(kāi)發(fā)和使用相關(guān)設(shè)備。
相關(guān)問(wèn)題拓展閱讀:
- 求教怎么學(xué)習(xí)linux內(nèi)核驅(qū)動(dòng)
- 在linux上怎樣增加一個(gè)i2c設(shè)備?
求教怎么學(xué)習(xí)linux內(nèi)核驅(qū)動(dòng)
1. 分享Linux內(nèi)核學(xué)習(xí)和驅(qū)動(dòng)開(kāi)發(fā)的經(jīng)驗(yàn)。
內(nèi)核逗戚學(xué)習(xí)
Linux 內(nèi)核功能越來(lái)越完善,如果沒(méi)有充裕的時(shí)間,深入內(nèi)核并不是很現(xiàn)實(shí)。所以建議先讀一本內(nèi)核的書(shū),
之一遍是讀,會(huì)讀的很迷糊;之后反省一下,然后再瀏覽一下;可以想象一個(gè) OS 是如何運(yùn)行的,這樣可以不
陷入 Linux 內(nèi)核的細(xì)節(jié);最后可以深入自己感興趣或者需要的那一子系統(tǒng)
推薦 《Linux Kernel Development》
即便是子系統(tǒng),也是很龐大的。一個(gè)省力的方式是網(wǎng)上搜一些相關(guān)的文章,便于快速了解這個(gè)子系統(tǒng)的運(yùn)作;
然后結(jié)合代碼,形成自己的認(rèn)知,最后做一下總結(jié)。如果僅僅是快速了解某一子系統(tǒng)的運(yùn)作,可以參考一些早期
代碼的注解書(shū)籍,再深入的時(shí)候看看最新的代碼實(shí)現(xiàn)
對(duì)內(nèi)核的認(rèn)知是一個(gè)反復(fù)的過(guò)程,一開(kāi)始并不完善,可能需要反復(fù)糾正。不要陷入這種糾錯(cuò)中;而是以后繼續(xù)
使用和學(xué)習(xí)過(guò)程中,發(fā)現(xiàn)了沒(méi)有弄清楚的地方再深入,畢竟 Linux 內(nèi)核是不斷變化的
還有一個(gè)很好的方式是,從系統(tǒng)調(diào)用入手,現(xiàn)在這方面的數(shù)據(jù)不少,而且對(duì)系統(tǒng)調(diào)用的語(yǔ)義都有講解,這樣可以
間接了解 Linux 系統(tǒng)的一些概念。對(duì)系統(tǒng)調(diào)用熟悉了,可以根據(jù)系統(tǒng)調(diào)用的執(zhí)行過(guò)程,來(lái)大體了解內(nèi)核的一個(gè)
運(yùn)作過(guò)程;但是跟蹤系統(tǒng)調(diào)用的時(shí)候要注意抓主線,現(xiàn)在內(nèi)核系統(tǒng)很復(fù)雜,一些 code path 上可能會(huì)涉及多個(gè)
子系統(tǒng),可以從名字上猜測(cè)它們是干什么的,不需要深入,否則會(huì)發(fā)現(xiàn)精力完全被分散掉了
學(xué)習(xí) Linux 內(nèi)核,一個(gè)很重要的是抽象的能力,所謂的抽象這里僅僅是指分清接口和接口的實(shí)現(xiàn)。因?yàn)?Linux
內(nèi)核子系統(tǒng)很多,有很多子系統(tǒng)相互滲透,這樣 code path 看上去很復(fù)雜。閱讀代碼的時(shí)候,為了排除干擾,
需要分清哪些是自己需要看的,哪些是其它子系統(tǒng)的接口,對(duì)于其它子系統(tǒng)的接口,先當(dāng)作它們功能完善不會(huì)
出問(wèn)題好了,這樣可以關(guān)注重點(diǎn);打個(gè)比方,一個(gè)應(yīng)用程序的代碼可能量很大,比如一個(gè) apache 項(xiàng)目,它
包含很多組件,有時(shí)候閱讀代碼的時(shí)候會(huì)看到不同組件的 API,深入看相關(guān)組件實(shí)現(xiàn)并不現(xiàn)實(shí),這時(shí)候分清主次
對(duì)于代碰孝碼的閱讀就很有幫助了,總不能看到了 malloc 就要先把它的實(shí)現(xiàn)弄清楚吧,系統(tǒng)調(diào)用多者呢
推薦書(shū)籍
OReilly.Linux.System.Programming.2nd.Edition
The.Linux.Programming.Interface
驅(qū)動(dòng)開(kāi)發(fā)
一直圍繞服務(wù)器做,接觸的比較多的是網(wǎng)卡驅(qū)動(dòng)。最開(kāi)始想著從上到下,好好學(xué)習(xí)協(xié)議棧,后來(lái)發(fā)現(xiàn)內(nèi)容太多,
進(jìn)展太慢。后來(lái)參考一些驅(qū)動(dòng)開(kāi)發(fā)方面的書(shū)籍,把驅(qū)動(dòng)獨(dú)立開(kāi),使用內(nèi)核提供的接口,就類似寫應(yīng)用的時(shí)候很多
情況下只需要了解系統(tǒng)接口和庫(kù)函數(shù)的原型描述而不需要繼續(xù)深入一樣。這樣把自己從內(nèi)核復(fù)雜的實(shí)現(xiàn)細(xì)節(jié)中解
放出來(lái),可以重點(diǎn)看網(wǎng)卡的特性部分;之后可以再深入了解設(shè)備的運(yùn)作過(guò)程,比如網(wǎng)卡的收發(fā)包在協(xié)議棧中的
位置和運(yùn)作
個(gè)人感覺(jué)如果工作中能接觸驅(qū)動(dòng)開(kāi)發(fā)更好,否則很多情況下,有的設(shè)備并不常見(jiàn),比如 Infiniband 卡
現(xiàn)在民用設(shè)備越來(lái)越廣泛,可以選擇自己感興山吵陵趣而手頭又容易有的設(shè)備進(jìn)行研究,比如無(wú)線網(wǎng)卡、wifi 等
驅(qū)動(dòng)開(kāi)發(fā),一定要先專注一個(gè)設(shè)備,從頭到尾熟悉一遍,然后總結(jié)驅(qū)動(dòng)開(kāi)發(fā)是怎樣的、驅(qū)動(dòng)是如何關(guān)聯(lián)到系統(tǒng)中
的、Linux 采用什么樣的分層模式來(lái)提供對(duì)多種多樣設(shè)備的支持,如類似 VFS 一樣的抽象分層
推薦
linux device driver, 3rd edition
Linux設(shè)備驅(qū)動(dòng)開(kāi)發(fā)詳解
2. 您覺(jué)得Linux驅(qū)動(dòng)開(kāi)發(fā)的難點(diǎn)是什么,有什么好的方法來(lái)克服?
Linux 內(nèi)核對(duì)各種設(shè)備的驅(qū)動(dòng)開(kāi)發(fā)提供了完善的框架支持,對(duì)應(yīng)某個(gè)驅(qū)動(dòng),把對(duì)外的接口弄清楚就可以了。打個(gè)
比方,一個(gè)設(shè)備可能在不同的 OS 上需要支持,比如 FreeBSD/Windows 等,每個(gè) OS 都有自己定義的接口,
設(shè)備的驅(qū)動(dòng)定義好與這些 OS 接口的連接,剩下的就是設(shè)備本身的特性管理以及驅(qū)動(dòng)接口中對(duì)設(shè)備管理函數(shù)的調(diào)
用了,比如寄存器訪問(wèn)、配置管理、緩沖區(qū)管理、數(shù)據(jù)收發(fā)等,比較重要的中斷和同步的控制,要避免數(shù)據(jù)處理的
時(shí)候的死鎖。
比如網(wǎng)卡驅(qū)動(dòng),基本的要求是提供內(nèi)核需要的接口,這樣網(wǎng)卡驅(qū)動(dòng)才能掛接到系統(tǒng)中,剩下的就是接口需要調(diào)用
網(wǎng)卡驅(qū)動(dòng)的內(nèi)部函數(shù),來(lái)對(duì)網(wǎng)卡進(jìn)行控制、數(shù)據(jù)收發(fā)和管理等
Linux 支持的設(shè)備種類繁多,不可能所有都掌握,某一子系統(tǒng)也只能是熟悉,因?yàn)橥愒O(shè)備還有許多自由的特性。
寫驅(qū)動(dòng)的步驟可以概括為:
) 閱讀設(shè)備規(guī)范,對(duì)設(shè)備的運(yùn)行機(jī)理有所了解
為了減少干擾,不考慮要支持的 OS,獨(dú)立與 OS 考慮基本的功能如何實(shí)現(xiàn)
) 參考同類設(shè)備在 Linux 內(nèi)核中的驅(qū)動(dòng)架構(gòu)
) 提供基本的 Linux 設(shè)備驅(qū)動(dòng)接口和實(shí)現(xiàn)設(shè)備的基本功能,比如網(wǎng)卡收發(fā)小數(shù)據(jù)量
) 在性能上逐步提示,比如網(wǎng)卡傳輸?shù)臄?shù)據(jù)量加大、中斷及時(shí)處理、避免死鎖等
) 對(duì)邊界條件進(jìn)行完善,網(wǎng)卡上就是對(duì)一些特殊大小的數(shù)據(jù)包傳輸完善等
) 對(duì)設(shè)備進(jìn)行更高級(jí)控制的支持,比如網(wǎng)卡支持 ethtool 等工具
) 反復(fù)調(diào)試、改進(jìn)和優(yōu)化
3. Linux內(nèi)核有上百個(gè)驅(qū)動(dòng)子系統(tǒng),你研究過(guò)內(nèi)核各種驅(qū)動(dòng)子系統(tǒng)的共性,層次結(jié)構(gòu)設(shè)計(jì)嗎?分享學(xué)習(xí)一個(gè)Linux內(nèi)核子系統(tǒng)的經(jīng)驗(yàn),例如USB、I2C、HID等driver。
每一個(gè)子系統(tǒng)都巨大無(wú)比,而且涉及各種硬件規(guī)范,很難去搞明白所有。只能是遇到問(wèn)題的時(shí)候,
能對(duì)某一部分深入下去。之前了解過(guò) SCSI 的架構(gòu),最上層的抽象,中間層的橋梁,更底層的設(shè)備
驅(qū)動(dòng)控制
如果僅僅是做 driver 的工作,可以把精力放在設(shè)備特性上,Linux 內(nèi)核部分只需要了解驅(qū)動(dòng)
接口和同步、內(nèi)存管理等基本功能
4. 您深入研究過(guò)Linux設(shè)備驅(qū)動(dòng)模型,關(guān)注過(guò)Linux內(nèi)核驅(qū)動(dòng)的設(shè)計(jì)思想嗎?
Linux 設(shè)備驅(qū)動(dòng)模型是從分類的角度來(lái)看待設(shè)備,分類是多維的,所以 /sys 下也是多個(gè)目錄
另外,設(shè)備驅(qū)動(dòng)模型給出了系統(tǒng)中設(shè)備布局信息,比如根據(jù)總線地址可以定位對(duì)應(yīng)的設(shè)備目錄等
Linux 內(nèi)核驅(qū)動(dòng)可以都是遵循一個(gè)逐層抽象的架構(gòu):
最上層的抽象層便于系統(tǒng)軟件的訪問(wèn),
中間層的實(shí)現(xiàn)硬件協(xié)議細(xì)節(jié),同時(shí)提供上下兩層連接的接口,
對(duì)于最下層的 driver 來(lái)說(shuō)就是要定義底層驅(qū)動(dòng)要實(shí)現(xiàn)的接口和實(shí)際的設(shè)備控制
由于 Linux 內(nèi)核各類驅(qū)動(dòng)的框架支持,driver 可以更加關(guān)注設(shè)備本身的特性
5. Android系統(tǒng)是基于Linux內(nèi)核的,傳統(tǒng)的Linux驅(qū)動(dòng)開(kāi)發(fā)和Android驅(qū)動(dòng)開(kāi)發(fā)有什么區(qū)別?
傳統(tǒng)的 Linux 內(nèi)核驅(qū)動(dòng)開(kāi)發(fā),只需要定義好 Linux 需要的驅(qū)動(dòng)接口就好了,之后
專注與設(shè)備本身的特性
而 Android 驅(qū)動(dòng)開(kāi)發(fā),需要將設(shè)備操作接口繼續(xù)封裝,提供上層使用的 Java API;
driver 部分可以使用 C 代碼,一些更復(fù)雜的操作可以用 Java 實(shí)現(xiàn),然后 driver
提供對(duì)復(fù)雜操作的接口支持
一個(gè)很重要的方面是功能的分離定義,比如哪些是 driver 實(shí)現(xiàn)的,哪些是上層實(shí)現(xiàn)的,
它們之間的接口是怎樣的,定義好這些,就可以按照傳統(tǒng) driver 的實(shí)現(xiàn)方式來(lái)做了;
從某種程度上,可以看作是傳統(tǒng) driver 跟相關(guān) tools 轉(zhuǎn)換成了 Android driver
和上層 Java 接口
1.首先要了解為什么要學(xué)習(xí)內(nèi)核?下圖已表明,如果要從事驅(qū)動(dòng)開(kāi)發(fā)或系統(tǒng)研究,就要學(xué)習(xí)內(nèi)核。
2.內(nèi)核的知識(shí)就像下面的繩結(jié)一樣,一環(huán)余或攜扣一環(huán),我們要解開(kāi)它們,就必須要先找到線頭也就是內(nèi)核中的函數(shù)豎伏接口。初學(xué)階段,我們一般不深入的研究?jī)?nèi)核代碼,會(huì)使用內(nèi)核的接口函數(shù)就不錯(cuò)了。
3.下面提供了如何學(xué)習(xí)這些內(nèi)核函數(shù)的方法,就像解繩子一樣
4.學(xué)習(xí)內(nèi)核的四步法則,思維導(dǎo)圖的設(shè)計(jì)尤為團(tuán)清重要,這也是能否學(xué)習(xí)好內(nèi)核的關(guān)鍵
5.語(yǔ)言基礎(chǔ)也需要扎實(shí),所以需要把C語(yǔ)言鞏固鞏固
在linux上怎樣增加一個(gè)i2c設(shè)備?
假設(shè)手上有一塊從淘寶上買來(lái)的開(kāi)發(fā)板,我要在開(kāi)發(fā)板的I2C總線上增加一個(gè)從設(shè)備(如at24c08),那么我要怎樣寫這晌答個(gè)“I2C設(shè)備驅(qū)動(dòng)”,讓
應(yīng)用程序可以訪問(wèn)at24c08呢?
先來(lái)看一個(gè)最簡(jiǎn)單的i2c設(shè)備驅(qū)動(dòng):
static struct i2c_board_info at24cxx_info = { //所支持的i2c設(shè)備的列表
I2C_BOARD_INFO(“at24c08”, 0x50), //一項(xiàng)代表一個(gè)支持的設(shè)備,它的名字叫做“at24c08”,器件地址是0x50
};
static struct i2c_client *at24cxx_client;
static int at24cxx_dev_init(void)
{
struct i2c_adapter *i2c_adap; //分配一個(gè)適配器的指針
i2c_adap = i2c_get_adapter(0); //調(diào)用core層的函數(shù),獲得一個(gè)i2c總線。這里我們已經(jīng)知道新增的器件掛接在編號(hào)為0的i2c總線上
at24cxx_client = i2c_new_device(i2c_adap, &at24cxx_info); // 把i2c適配器和新增的I2C器件關(guān)聯(lián)起來(lái),這個(gè)用了i2c總線0,地址是0x50。這就組成了一個(gè)客戶端
at24cxx_client i2c_put_adapter(i2c_adap);
return 0;
}
static void at24cxx_dev_exit(void)
{
i2c_unregister_device(at24cxx_client);
}
module_init(at24cxx_dev_init);
module_exit(at24cxx_dev_exit);
從上面的程序可以看到,寫一個(gè)i2c設(shè)備驅(qū)動(dòng)程序,與寫普通的字符驅(qū)動(dòng)基本一樣。特別之處是它調(diào)用了i2c的core層的函數(shù),以獲得對(duì)i2c總線的控制。因?yàn)橛玫氖情_(kāi)發(fā)板,板上的與soc芯片(一般來(lái)說(shuō)就是arm的芯片)i2c總線驅(qū)動(dòng)一般都做好了,直接調(diào)用core層的函數(shù)就可以控制soc的i2c模塊了。也就是說(shuō),寫i2c設(shè)備驅(qū)動(dòng)不需要關(guān)注arm內(nèi)部的i2c模塊的寄存器,我們需要關(guān)注的是設(shè)備(at24c08)的寄存器以及猛謹(jǐn)高它的datasheet對(duì)時(shí)序的要求。
其實(shí),添加i2c設(shè)備的方法很靈活。根據(jù)Linux的官方文檔《linux-3.4.2\Documentation\i2c\instantiating-devices》,添加i2c設(shè)備的方法總結(jié)有4種:
1. i2c_register_board_info:根據(jù)總線編號(hào)、設(shè)備名字(“at24c08”)、設(shè)備地址(0x50)注冊(cè)一個(gè)字符驅(qū)動(dòng)。這種方法最簡(jiǎn)單、最粗暴,最貼近平時(shí)在開(kāi)片機(jī)上開(kāi)發(fā)i2c器件的。
2. i2c_new_device:根據(jù)i2c總線的編號(hào),聲明一個(gè)i2c設(shè)備:這種方法就是上面例子用的方法。這種方法也簡(jiǎn)單,但是需要事先知道器件掛接在哪條總線上。對(duì)于設(shè)備,還實(shí)現(xiàn)知道了設(shè)備地址0x50,總線適配器也支持名字為“at24c08”的設(shè)備
3. i2c_new_probed_device:
4.從用戶空間實(shí)例化一個(gè)器件:這個(gè)方法相當(dāng)智能快速,如下輸入指令,即可增加一個(gè)i2c設(shè)備,同時(shí)增加了對(duì)應(yīng)的設(shè)備文件。
# echo eeprom 0x50 > /sys/bus/i2c/devices/i2c-3/new_device
根據(jù)英文文檔的標(biāo)題,添加i2c設(shè)備有稱之為枝尺“i2c設(shè)備的實(shí)例化”。
從上述可以知道,在實(shí)例化一個(gè)i2c設(shè)備之前,除了有對(duì)應(yīng)的驅(qū)動(dòng)支持總線外(這里是總線0),還需要有一個(gè)驅(qū)動(dòng)使用了總線0發(fā)送時(shí)序,支持名字為”at24c08″的器件。這個(gè)驅(qū)動(dòng)用總線驅(qū)動(dòng)的函數(shù),配置了at24c08的寄存器。
linux內(nèi)核i2c子系統(tǒng)驅(qū)動(dòng)的介紹就聊到這里吧,感謝你花時(shí)間閱讀本站內(nèi)容,更多關(guān)于linux內(nèi)核i2c子系統(tǒng)驅(qū)動(dòng),Linux內(nèi)核i2c子系統(tǒng)驅(qū)動(dòng)介紹,求教怎么學(xué)習(xí)linux內(nèi)核驅(qū)動(dòng),在linux上怎樣增加一個(gè)i2c設(shè)備?的信息別忘了在本站進(jìn)行查找喔。
成都服務(wù)器托管選創(chuàng)新互聯(lián),先上架開(kāi)通再付費(fèi)。
創(chuàng)新互聯(lián)(www.cdcxhl.com)專業(yè)-網(wǎng)站建設(shè),軟件開(kāi)發(fā)老牌服務(wù)商!微信小程序開(kāi)發(fā),APP開(kāi)發(fā),網(wǎng)站制作,網(wǎng)站營(yíng)銷推廣服務(wù)眾多企業(yè)。電話:028-86922220
本文名稱:Linux內(nèi)核i2c子系統(tǒng)驅(qū)動(dòng)介紹 (linux內(nèi)核i2c子系統(tǒng)驅(qū)動(dòng))
分享地址:http://fisionsoft.com.cn/article/coedgig.html


咨詢
建站咨詢
