日韩无码专区无码一级三级片|91人人爱网站中日韩无码电影|厨房大战丰满熟妇|AV高清无码在线免费观看|另类AV日韩少妇熟女|中文日本大黄一级黄色片|色情在线视频免费|亚洲成人特黄a片|黄片wwwav色图欧美|欧亚乱色一区二区三区

RELATEED CONSULTING
相關(guān)咨詢(xún)
選擇下列產(chǎn)品馬上在線溝通
服務(wù)時(shí)間:8:30-17:00
你可能遇到了下面的問(wèn)題
關(guān)閉右側(cè)工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營(yíng)銷(xiāo)解決方案
Linux內(nèi)核i2c子系統(tǒng)驅(qū)動(dòng)介紹 (linux內(nèi)核i2c子系統(tǒng)驅(qū)動(dòng))

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)專(zhuān)注于臨澧網(wǎng)站建設(shè)服務(wù)及定制,我們擁有豐富的企業(yè)做網(wǎng)站經(jīng)驗(yàn)。 熱誠(chéng)為您提供臨澧營(yíng)銷(xiāo)型網(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)銷(xiāo)落地服務(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è)備類(lèi)型、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è)備類(lèi)型、驅(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è)備類(lèi)型等信息。

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. 注銷(xiāo)i2c_driver和i2c_adapter

當(dāng)使用完i2c_driver和i2c_adapter之后,需要使用i2c_del_driver和i2c_del_adapter函數(shù)來(lái)注銷(xiāo)。

三、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)核提供的接口,就類(lèi)似寫(xiě)應(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ā),一定要先專(zhuān)注一個(gè)設(shè)備,從頭到尾熟悉一遍,然后總結(jié)驅(qū)動(dòng)開(kāi)發(fā)是怎樣的、驅(qū)動(dòng)是如何關(guān)聯(lián)到系統(tǒng)中

的、Linux 采用什么樣的分層模式來(lái)提供對(duì)多種多樣設(shè)備的支持,如類(lèi)似 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è)備種類(lèi)繁多,不可能所有都掌握,某一子系統(tǒng)也只能是熟悉,因?yàn)橥?lèi)設(shè)備還有許多自由的特性。

寫(xiě)驅(qū)動(dòng)的步驟可以概括為:

) 閱讀設(shè)備規(guī)范,對(duì)設(shè)備的運(yùn)行機(jī)理有所了解

為了減少干擾,不考慮要支持的 OS,獨(dú)立與 OS 考慮基本的功能如何實(shí)現(xiàn)

) 參考同類(lèi)設(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)的角度來(lái)看待設(shè)備,分類(lèi)是多維的,所以 /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)核各類(lè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)接口就好了,之后

專(zhuān)注與設(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è)手上有一塊從淘寶上買(mǎi)來(lái)的開(kāi)發(fā)板,我要在開(kāi)發(fā)板的I2C總線上增加一個(gè)從設(shè)備(如at24c08),那么我要怎樣寫(xiě)這晌答個(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è)客戶(hù)端

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);

從上面的程序可以看到,寫(xiě)一個(gè)i2c設(shè)備驅(qū)動(dòng)程序,與寫(xiě)普通的字符驅(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ō),寫(xiě)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.從用戶(hù)空間實(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è)備有稱(chēng)之為枝尺“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)專(zhuān)業(yè)-網(wǎng)站建設(shè),軟件開(kāi)發(fā)老牌服務(wù)商!微信小程序開(kāi)發(fā),APP開(kāi)發(fā),網(wǎng)站制作,網(wǎng)站營(yíng)銷(xiāo)推廣服務(wù)眾多企業(yè)。電話(huà):028-86922220


當(dāng)前標(biāo)題:Linux內(nèi)核i2c子系統(tǒng)驅(qū)動(dòng)介紹 (linux內(nèi)核i2c子系統(tǒng)驅(qū)動(dòng))
分享網(wǎng)址:http://www.5511xx.com/article/coedgig.html