




版權(quán)說(shuō)明:本文檔由用戶(hù)提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
ShanghaiInfoTMMicroelectronicsCo.,Ltd.
I2C設(shè)備驅(qū)動(dòng)介紹Jiawen.Liang目錄
盈量而知芯,方行天下I2C總線(xiàn)I2C子系統(tǒng)I2C設(shè)備驅(qū)動(dòng)I2C總線(xiàn)
盈量而知芯,方行天下I2C總線(xiàn)I2C總線(xiàn)I2C總線(xiàn)I2C總線(xiàn)
盈量而知芯,方行天下I2C(Inter-IntegratedCircuit)總線(xiàn)是由PHILIPS公司開(kāi)發(fā)的兩線(xiàn)式串行總線(xiàn),用于連接微控制器及其外圍設(shè)備,是微電子通信控制領(lǐng)域廣泛采用的一種總線(xiàn)標(biāo)準(zhǔn)。它是同步通信的一種特殊形式,具有接口線(xiàn)少,控制方式簡(jiǎn)單,器件封裝形式小,通信速率較高等優(yōu)點(diǎn)。I2C總線(xiàn)支持任何IC生產(chǎn)過(guò)程(NMOSCMOS、雙極性)。兩線(xiàn)――串行數(shù)據(jù)(SDA)和串行時(shí)鐘(SCL)線(xiàn)在連接到總線(xiàn)的器件間傳遞信息。每個(gè)器件都有一個(gè)唯一的地址識(shí)別(無(wú)論是微控制器——MCU、LCD驅(qū)動(dòng)器、存儲(chǔ)器或鍵盤(pán)接口),而且都可以作為一個(gè)發(fā)送器或接收器(由器件的功能決定)。很明顯,LCD驅(qū)動(dòng)器只是一個(gè)接收器,而存儲(chǔ)器則既可以接收又可以發(fā)送數(shù)據(jù)。主機(jī)是初始化總線(xiàn)的數(shù)據(jù)傳輸并產(chǎn)生允許傳輸?shù)臅r(shí)鐘信號(hào)的器件;MCU一般作為主機(jī),而其他與其連接的外設(shè)都被認(rèn)為是從機(jī)。I2C總線(xiàn)
盈量而知芯,方行天下I2C總線(xiàn)
盈量而知芯,方行天下I2C總線(xiàn)
盈量而知芯,方行天下I2C總線(xiàn)
盈量而知芯,方行天下I2C子系統(tǒng)
盈量而知芯,方行天下I2C子系統(tǒng)I2C子系統(tǒng)
盈量而知芯,方行天下為了方便i2c設(shè)備驅(qū)動(dòng)的開(kāi)發(fā),避免因?yàn)镮2C控制器的硬件差異而導(dǎo)致設(shè)備驅(qū)動(dòng)的差異性,linux對(duì)I2C總線(xiàn)進(jìn)行了封裝。為I2C設(shè)備、控制器、及驅(qū)動(dòng)提供了統(tǒng)一的注冊(cè)平臺(tái),同時(shí)為數(shù)據(jù)傳輸提供了統(tǒng)一的接口。I2C總線(xiàn)作為一類(lèi)抽象的總線(xiàn)模型,具體的通信由總線(xiàn)控制器i2c_adapter所提供的總線(xiàn)驅(qū)動(dòng)算法i2c_algorithm來(lái)完成。與用戶(hù)空間的交互由設(shè)備驅(qū)動(dòng)完成,由i2c-dev結(jié)構(gòu)維護(hù)。i2c_driver結(jié)構(gòu)維護(hù)了一類(lèi)設(shè)備的驅(qū)動(dòng)方法,i2c_client結(jié)構(gòu)維護(hù)i2c子系統(tǒng)中獨(dú)立的i2c設(shè)備。另外,設(shè)備只完成與I2C-core的數(shù)據(jù)交互,不能與適配器直接通信,真正數(shù)據(jù)的傳輸由i2c-core調(diào)用相應(yīng)的i2c控制器完成。
I2C子系統(tǒng)
盈量而知芯,方行天下Linux的I2C體系結(jié)構(gòu)分為3個(gè)組成部分:
?
I2C核心
I2C
核心提供了I2C總線(xiàn)驅(qū)動(dòng)和設(shè)備驅(qū)動(dòng)的注冊(cè)、注銷(xiāo)方法,I2C通信方法(即“algorithm”)上層的、與具體適配器無(wú)關(guān)的代碼以及探測(cè)設(shè)備、檢測(cè)設(shè)備地址的上層代碼等。
?
I2C總線(xiàn)驅(qū)動(dòng)
I2C總線(xiàn)驅(qū)動(dòng)是對(duì)I2C硬件體系結(jié)構(gòu)中適配器端的實(shí)現(xiàn),適配器可由CPU控制,甚至直接集成在CPU內(nèi)部。I2C總線(xiàn)驅(qū)動(dòng)主要包含了I2C適配器數(shù)據(jù)結(jié)構(gòu)i2c_adapter、I2C適配器的algorithm數(shù)據(jù)結(jié)構(gòu)i2c_algorithm和控制I2C適配器產(chǎn)生通信信號(hào)的函數(shù)。
經(jīng)由I2C總線(xiàn)驅(qū)動(dòng)的代碼,我們可以控制I2C適配器以主控方式產(chǎn)生開(kāi)始位、停止位、讀寫(xiě)周期,以及以從設(shè)備方式被讀寫(xiě)、產(chǎn)生ACK等。
?
I2C設(shè)備驅(qū)動(dòng)
I2C設(shè)備驅(qū)動(dòng)是對(duì)I2C硬件體系結(jié)構(gòu)中設(shè)備端的實(shí)現(xiàn),設(shè)備一般掛接在受CPU控制的I2C適配器上,通過(guò)I2C適配器與CPU交換數(shù)據(jù)。
I2C設(shè)備驅(qū)動(dòng)主要包含了數(shù)據(jù)結(jié)構(gòu)i2c_driver和i2c_client,我們需要根據(jù)具體設(shè)備實(shí)現(xiàn)其中的成員函數(shù)。
I2C子系統(tǒng)
盈量而知芯,方行天下I2C子系統(tǒng)
盈量而知芯,方行天下在Linux內(nèi)核源代碼中的drivers目錄下包含一個(gè)i2c目錄,而在i2c目錄下又包含如下文件和文件夾:
?
i2c-core.c:這個(gè)文件實(shí)現(xiàn)了I2C核心的功能以及/proc/bus/i2c*接口。
?
i2c-dev.c:實(shí)現(xiàn)了I2C適配器設(shè)備文件的功能,每一個(gè)I2C適配器都被分配一個(gè)設(shè)備。通過(guò)適配器訪(fǎng)問(wèn)設(shè)備時(shí)的主設(shè)備號(hào)都為89,次設(shè)備號(hào)為0~255。應(yīng)用程序通過(guò)
“i2c-%d”(i2c-0,i2c-1,...,i2c-10,...)文件名并使用文件操作接口open()、write()、read()、ioctl()和close()等來(lái)訪(fǎng)問(wèn)這個(gè)設(shè)備。i2c-dev.c并沒(méi)有針對(duì)特定的設(shè)備而設(shè)計(jì),只是提供了通用的read()、write()和ioctl()等接口,應(yīng)用層可以借用這些接口訪(fǎng)問(wèn)掛接在適配器上的I2C設(shè)備的存儲(chǔ)空間或寄存器并控制I2C設(shè)備的工作方式。
?
chips文件夾
:這個(gè)目錄中包含了一些特定的I2C設(shè)備驅(qū)動(dòng),如Dallas公司的DS1337實(shí)時(shí)鐘芯片、EPSON公司的RTC8564實(shí)時(shí)鐘芯片和I2C接口的EEPROM驅(qū)動(dòng)等。
?
busses文件夾:這個(gè)文件中包含了一些I2C總線(xiàn)的驅(qū)動(dòng),如S3C2410的I2C控制器驅(qū)動(dòng)為i2c-s3c2410.c。
?
algos文件夾:實(shí)現(xiàn)了一些I2C總線(xiàn)適配器的algorithm。此外,內(nèi)核中的i2c.h這個(gè)頭文件對(duì)i2c_driver、i2c_client、i2c_adapter和i2c_algorithm這4個(gè)數(shù)據(jù)結(jié)構(gòu)進(jìn)行了定義。理解這4個(gè)結(jié)構(gòu)體的作用十分關(guān)鍵,分別給出了它們的定義。I2C子系統(tǒng)
盈量而知芯,方行天下structi2c_adapter{structmodule*owner;unsignedintid;
unsignedintclass;/*classestoallowprobingfor*/
conststructi2c_algorithm*algo;/*thealgorithmtoaccessthebus*/void*algo_data;/*datafieldsthatarevalidforalldevices*/structrt_mutexbus_lock;inttimeout;/*injiffies*/intretries;
structdevicedev;/*theadapterdevice*/intnr;charname[48];structcompletiondev_released;structlist_headuserspace_clients;};I2C子系統(tǒng)
盈量而知芯,方行天下structi2c_algorithm{/*Ifanadapteralgorithmcan'tdoI2C-levelaccess,setmaster_xfertoNULL.IfanadapteralgorithmcandoSMBusaccess,setsmbus_xfer.IfsettoNULL,theSMBusprotocolissimulatedusingcommonI2Cmessages*//*master_xfershouldreturnthenumberofmessagessuccessfullyprocessed,oranegativevalueonerror*/
int(*master_xfer)(structi2c_adapter*adap,structi2c_msg*msgs,intnum);
int(*smbus_xfer)(structi2c_adapter*adap,u16addr,unsignedshortflags,charread_write,u8command,intsize,unioni2c_smbus_data*data);/*Todeterminewhattheadaptersupports*/u32(*functionality)(structi2c_adapter*);};I2C子系統(tǒng)
盈量而知芯,方行天下structi2c_driver{unsignedintclass;int(*attach_adapter)(structi2c_adapter*);int(*detach_adapter)(structi2c_adapter*);/*Standarddrivermodelinterfaces*/
int(*probe)(structi2c_client*,conststructi2c_device_id*);
int(*remove)(structi2c_client*);/*drivermodelinterfacesthatdon'trelatetoenumeration*/void(*shutdown)(structi2c_client*);
int(*suspend)(structi2c_client*,pm_message_tmesg);
int(*resume)(structi2c_client*);void(*alert)(structi2c_client*,unsignedintdata);int(*command)(structi2c_client*client,unsignedintcmd,void*arg);structdevice_driverdriver;conststructi2c_device_id*id_table;/*Devicedetectioncallbackforautomaticdevicecreation*/int(*detect)(structi2c_client*,structi2c_board_info*);constunsignedshort*address_list;structlist_headclients;};I2C子系統(tǒng)
盈量而知芯,方行天下structi2c_client{unsignedshortflags;/*div.,seebelow*/
unsignedshortaddr;/*chipaddress-NOTE:7bit*//*addressesarestoredinthe*//*_LOWER_7bits*/
charname[I2C_NAME_SIZE];
structi2c_adapter*adapter;/*theadapterwesiton*/
structi2c_driver*driver;/*andouraccessroutines*/structdevicedev;/*thedevicestructure*/intirq;/*irqissuedbydevice*/structlist_headdetected;};I2C設(shè)備驅(qū)動(dòng)
盈量而知芯,方行天下I2C設(shè)備驅(qū)動(dòng)I2C設(shè)備驅(qū)動(dòng)
盈量而知芯,方行天下編寫(xiě)I2C設(shè)備驅(qū)動(dòng)有兩種方法。一種是利用系統(tǒng)給i2c-dev.c來(lái)實(shí)現(xiàn)一個(gè)i2c適配器的設(shè)備文件,然后通過(guò)在應(yīng)用層操作i2c適配器來(lái)控制i2c設(shè)備。
另一種是為i2c設(shè)備,獨(dú)立編寫(xiě)一個(gè)設(shè)備驅(qū)動(dòng)。在這種情況下,是不需要使用i2c-dev.c的。通常我們?yōu)閕2c設(shè)備在內(nèi)核層編寫(xiě)驅(qū)動(dòng)程序。目前內(nèi)核支持兩種編寫(xiě)i2c驅(qū)動(dòng)程序的方式,分別稱(chēng)這兩種方式為“Adapter方式(LEGACY)”和“Probe方式(newstyle)”。兩者流程上基本相似,而前者屬于舊式驅(qū)動(dòng)開(kāi)發(fā)方式,就不作討論。這里關(guān)注現(xiàn)在流行使用的Probe方式。I2C設(shè)備驅(qū)動(dòng)
盈量而知芯,方行天下●
構(gòu)建i2c_driverstaticstructi2c_driverpca953x_driver={.driver={.name="pca953x",},.probe=pca953x_probe,//當(dāng)有i2c_client和i2c_driver匹配時(shí)調(diào)用
.remove=pca953x_remove,//注銷(xiāo)時(shí)調(diào)用
.id_table=pca953x_id,//匹配規(guī)則
};●注冊(cè)i2c_driverstaticint__initpca953x_init(void){returni2c_add_driver(&pca953x_driver);}module_init(pca953x_init);I2C設(shè)備驅(qū)動(dòng)
盈量而知芯,方行天下在注冊(cè)i2c_driver的過(guò)程中,是將driver注冊(cè)到了i2c_bus_type的總線(xiàn)上。此總線(xiàn)的匹配規(guī)則是:staticconststructi2c_device_id*i2c_match_id(conststructi2c_device_id*id,conststructi2c_client*client){while(id->name[0]){if(strcmp(client->name,id->name)==0)returnid;id++;}returnNULL;}可以看出是利用i2c_client的名稱(chēng)和id_table中的名稱(chēng)做匹配的。本驅(qū)動(dòng)中的id_table為:staticconststructi2c_device_idpca953x_id[]={{"pca9534",0,},{}};I2C設(shè)備驅(qū)動(dòng)
盈量而知芯,方行天下●
注冊(cè)i2c_board_info
對(duì)于Probe模式,通常在平臺(tái)代碼中要完成i2c_board_info的注冊(cè)。方法如下:staticstructi2c_board_info__initdatatest_i2c_devices[]={{I2C_BOARD_INFO("pca9534",0x27),//pca9534為芯片名稱(chēng),0x27為芯片地址
.platform_data=&pca9534_data,};i2c_register_board_info(0,test_i2c_devices,ARRAY_SIZE(test_i2c_devices));//注冊(cè)●
字符驅(qū)動(dòng)注冊(cè)在Probe方式下,添加字符驅(qū)動(dòng)的位置在pca953x_probe中。staticint__devinitpca953x_probe(structi2c_client*client,conststructi2c_device_id*id){……
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶(hù)所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶(hù)上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶(hù)上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶(hù)因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 爺爺生日發(fā)言稿
- 宿遷專(zhuān)版2025版中考?xì)v史復(fù)習(xí)方案第一部分中國(guó)古代史課時(shí)訓(xùn)練04三國(guó)兩晉南北朝時(shí)期:政權(quán)分立與民族交融
- 研發(fā)領(lǐng)導(dǎo)力述職
- 學(xué)期學(xué)習(xí)成果匯報(bào)
- 行為習(xí)慣教育課
- 企業(yè)文化促創(chuàng)新
- 農(nóng)業(yè)團(tuán)隊(duì)半年工作報(bào)告
- 第七章 力(章末檢測(cè))-【幫課堂】2023-2024學(xué)年八年級(jí)物理下冊(cè)同步學(xué)與練(人教版)(解析版)
- 第九講 重力【寒假自學(xué)課】2024年八年級(jí)物理寒假提升學(xué)與練(原卷版)
- 04-第3節(jié) 速度-課時(shí)2 速度的測(cè)量及速度-時(shí)間圖像 3年9考
- 高中人音版必修 音樂(lè)鑒賞20人民音樂(lè)家課件
- 風(fēng)電齒輪箱講義(20151010)
- 小組合作學(xué)習(xí)評(píng)價(jià)量化表
- 石油化工行業(yè)典型事故案例
- 圓二色譜儀操作規(guī)程培訓(xùn)
- 幼兒園一日生活中的保教結(jié)合(課堂PPT)
- 有害物質(zhì)培訓(xùn)教材(ROHS2.0及REACH)
- 德語(yǔ)A1單詞表
- ARL4460 OXSAS曲線(xiàn)制作及學(xué)習(xí)筆記
- 高三地理二輪專(zhuān)題河流特征
- Unit__A_View_of_Mountains
評(píng)論
0/150
提交評(píng)論