I2C設備驅動介紹_第1頁
I2C設備驅動介紹_第2頁
I2C設備驅動介紹_第3頁
I2C設備驅動介紹_第4頁
I2C設備驅動介紹_第5頁
已閱讀5頁,還剩21頁未讀 繼續免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

ShanghaiInfoTMMicroelectronicsCo.,Ltd.

I2C設備驅動介紹Jiawen.Liang目錄

盈量而知芯,方行天下I2C總線I2C子系統I2C設備驅動I2C總線

盈量而知芯,方行天下I2C總線I2C總線I2C總線I2C總線

盈量而知芯,方行天下I2C(Inter-IntegratedCircuit)總線是由PHILIPS公司開發的兩線式串行總線,用于連接微控制器及其外圍設備,是微電子通信控制領域廣泛采用的一種總線標準。它是同步通信的一種特殊形式,具有接口線少,控制方式簡單,器件封裝形式小,通信速率較高等優點。I2C總線支持任何IC生產過程(NMOSCMOS、雙極性)。兩線――串行數據(SDA)和串行時鐘(SCL)線在連接到總線的器件間傳遞信息。每個器件都有一個唯一的地址識別(無論是微控制器——MCU、LCD驅動器、存儲器或鍵盤接口),而且都可以作為一個發送器或接收器(由器件的功能決定)。很明顯,LCD驅動器只是一個接收器,而存儲器則既可以接收又可以發送數據。主機是初始化總線的數據傳輸并產生允許傳輸的時鐘信號的器件;MCU一般作為主機,而其他與其連接的外設都被認為是從機。I2C總線

盈量而知芯,方行天下I2C總線

盈量而知芯,方行天下I2C總線

盈量而知芯,方行天下I2C總線

盈量而知芯,方行天下I2C子系統

盈量而知芯,方行天下I2C子系統I2C子系統

盈量而知芯,方行天下為了方便i2c設備驅動的開發,避免因為I2C控制器的硬件差異而導致設備驅動的差異性,linux對I2C總線進行了封裝。為I2C設備、控制器、及驅動提供了統一的注冊平臺,同時為數據傳輸提供了統一的接口。I2C總線作為一類抽象的總線模型,具體的通信由總線控制器i2c_adapter所提供的總線驅動算法i2c_algorithm來完成。與用戶空間的交互由設備驅動完成,由i2c-dev結構維護。i2c_driver結構維護了一類設備的驅動方法,i2c_client結構維護i2c子系統中獨立的i2c設備。另外,設備只完成與I2C-core的數據交互,不能與適配器直接通信,真正數據的傳輸由i2c-core調用相應的i2c控制器完成。

I2C子系統

盈量而知芯,方行天下Linux的I2C體系結構分為3個組成部分:

?

I2C核心

I2C

核心提供了I2C總線驅動和設備驅動的注冊、注銷方法,I2C通信方法(即“algorithm”)上層的、與具體適配器無關的代碼以及探測設備、檢測設備地址的上層代碼等。

?

I2C總線驅動

I2C總線驅動是對I2C硬件體系結構中適配器端的實現,適配器可由CPU控制,甚至直接集成在CPU內部。I2C總線驅動主要包含了I2C適配器數據結構i2c_adapter、I2C適配器的algorithm數據結構i2c_algorithm和控制I2C適配器產生通信信號的函數。

經由I2C總線驅動的代碼,我們可以控制I2C適配器以主控方式產生開始位、停止位、讀寫周期,以及以從設備方式被讀寫、產生ACK等。

?

I2C設備驅動

I2C設備驅動是對I2C硬件體系結構中設備端的實現,設備一般掛接在受CPU控制的I2C適配器上,通過I2C適配器與CPU交換數據。

I2C設備驅動主要包含了數據結構i2c_driver和i2c_client,我們需要根據具體設備實現其中的成員函數。

I2C子系統

盈量而知芯,方行天下I2C子系統

盈量而知芯,方行天下在Linux內核源代碼中的drivers目錄下包含一個i2c目錄,而在i2c目錄下又包含如下文件和文件夾:

?

i2c-core.c:這個文件實現了I2C核心的功能以及/proc/bus/i2c*接口。

?

i2c-dev.c:實現了I2C適配器設備文件的功能,每一個I2C適配器都被分配一個設備。通過適配器訪問設備時的主設備號都為89,次設備號為0~255。應用程序通過

“i2c-%d”(i2c-0,i2c-1,...,i2c-10,...)文件名并使用文件操作接口open()、write()、read()、ioctl()和close()等來訪問這個設備。i2c-dev.c并沒有針對特定的設備而設計,只是提供了通用的read()、write()和ioctl()等接口,應用層可以借用這些接口訪問掛接在適配器上的I2C設備的存儲空間或寄存器并控制I2C設備的工作方式。

?

chips文件夾

:這個目錄中包含了一些特定的I2C設備驅動,如Dallas公司的DS1337實時鐘芯片、EPSON公司的RTC8564實時鐘芯片和I2C接口的EEPROM驅動等。

?

busses文件夾:這個文件中包含了一些I2C總線的驅動,如S3C2410的I2C控制器驅動為i2c-s3c2410.c。

?

algos文件夾:實現了一些I2C總線適配器的algorithm。此外,內核中的i2c.h這個頭文件對i2c_driver、i2c_client、i2c_adapter和i2c_algorithm這4個數據結構進行了定義。理解這4個結構體的作用十分關鍵,分別給出了它們的定義。I2C子系統

盈量而知芯,方行天下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子系統

盈量而知芯,方行天下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子系統

盈量而知芯,方行天下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子系統

盈量而知芯,方行天下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設備驅動

盈量而知芯,方行天下I2C設備驅動I2C設備驅動

盈量而知芯,方行天下編寫I2C設備驅動有兩種方法。一種是利用系統給i2c-dev.c來實現一個i2c適配器的設備文件,然后通過在應用層操作i2c適配器來控制i2c設備。

另一種是為i2c設備,獨立編寫一個設備驅動。在這種情況下,是不需要使用i2c-dev.c的。通常我們為i2c設備在內核層編寫驅動程序。目前內核支持兩種編寫i2c驅動程序的方式,分別稱這兩種方式為“Adapter方式(LEGACY)”和“Probe方式(newstyle)”。兩者流程上基本相似,而前者屬于舊式驅動開發方式,就不作討論。這里關注現在流行使用的Probe方式。I2C設備驅動

盈量而知芯,方行天下●

構建i2c_driverstaticstructi2c_driverpca953x_driver={.driver={.name="pca953x",},.probe=pca953x_probe,//當有i2c_client和i2c_driver匹配時調用

.remove=pca953x_remove,//注銷時調用

.id_table=pca953x_id,//匹配規則

};●注冊i2c_driverstaticint__initpca953x_init(void){returni2c_add_driver(&pca953x_driver);}module_init(pca953x_init);I2C設備驅動

盈量而知芯,方行天下在注冊i2c_driver的過程中,是將driver注冊到了i2c_bus_type的總線上。此總線的匹配規則是: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的名稱和id_table中的名稱做匹配的。本驅動中的id_table為:staticconststructi2c_device_idpca953x_id[]={{"pca9534",0,},{}};I2C設備驅動

盈量而知芯,方行天下●

注冊i2c_board_info

對于Probe模式,通常在平臺代碼中要完成i2c_board_info的注冊。方法如下:staticstructi2c_board_info__initdatatest_i2c_devices[]={{I2C_BOARD_INFO("pca9534",0x27),//pca9534為芯片名稱,0x27為芯片地址

.platform_data=&pca9534_data,};i2c_register_board_info(0,test_i2c_devices,ARRAY_SIZE(test_i2c_devices));//注冊●

字符驅動注冊在Probe方式下,添加字符驅動的位置在pca953x_probe中。staticint__devinitpca953x_probe(structi2c_client*client,conststructi2c_device_id*id){……

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經權益所有人同意不得將文件中的內容挪作商業或盈利用途。
  • 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
  • 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論