




版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
1、目錄目錄 I2C總線 I2C子系統(tǒng) I2C設備驅動I2CI2C總線總線 I2CI2C總線總線I2CI2C總線總線I2C總線I2CI2C總線總線 I2C(InterIntegrated Circuit)總線是由PHILIPS公司開發(fā)的兩線式串行總線,用于連接微控制器及其外圍設備,是微電子通信控制領域廣泛采用的一種總線標準。它是同步通信的一種特殊形式,具有接口線少,控制方式簡單,器件封裝形式小,通信速率較高等優(yōu)點。 I2C 總線支持任何IC 生產(chǎn)過程(NMOS CMOS、雙極性)。兩線串行數(shù)據(jù)(SDA)和串行時鐘 (SCL)線在連接到總線的器件間傳遞信息。每個器件都有一個唯一的地址識別(無論是微控
2、制器MCU、LCD 驅動器、存儲器或鍵盤接口),而且都可以作為一個發(fā)送器或接收器(由器件的功能決定)。很明顯,LCD 驅動器只是一個接收器,而存儲器則既可以接收又可以發(fā)送數(shù)據(jù)。主機是初始化總線的數(shù)據(jù)傳輸并產(chǎn)生允許傳輸?shù)臅r鐘信號 的器件;MCU一般作為主機,而其他與其連接的外設都被認為是從機。I2CI2C總線總線 I2CI2C總線總線 I2CI2C總線總線 I2CI2C總線總線 I2C子系統(tǒng) I2C子系統(tǒng) I2C子系統(tǒng) 為了方便i2c 設備驅動的開發(fā),避免因為I2C 控制器的硬件差異而導致設備驅動的差異性,linux 對I2C 總線進行了封裝。為 I2C 設備、控制器、及驅動提供了統(tǒng)一的注冊平臺
3、,同時為數(shù)據(jù)傳輸提供了統(tǒng)一的接口。 I2C 總線作為一類抽象的總線模型,具體的通信由總線控制器 i2c_adapter 所提供的總線驅動算法i2c_algorithm 來完成。與用戶空間的交互由設備驅動完成,由 i2c-dev 結構維護。i2c_driver 結構維護了一類設備的驅動方法,i2c_client 結構維護i2c 子系統(tǒng)中獨立的i2c 設備。另外,設備只完成與I2C-core 的數(shù)據(jù)交互,不能與適配器直接通信,真正數(shù)據(jù)的傳輸由i2c-core 調用相應的i2c 控制器完成。 I2C子系統(tǒng) Linux的I2C體系結構分為3個組成部分: I2C核心 I2C 核心提供了I2C總線驅動和設
4、備驅動的注冊、注銷方法,I2C通信方法(即“algorithm”)上層的、與具體適配器無關的代碼以及探測設備、檢測設備地址的上層代碼等。 I2C總線驅動 I2C總線驅動是對I2C硬件體系結構中適配器端的實現(xiàn),適配器可由CPU控制,甚至直接集成在CPU內部。 I2C總線驅動主要包含了I2C適配器數(shù)據(jù)結構i2c_adapter、I2C適配器的algorithm數(shù)據(jù)結構i2c_algorithm和控制I2C適配器產(chǎn)生通信信號的函數(shù)。 經(jīng)由I2C總線驅動的代碼,我們可以控制I2C適配器以主控方式產(chǎn)生開始位、停止位、讀寫周期,以及以從設備方式被讀寫、產(chǎn)生ACK等。 I2C設備驅動 I2C設備驅動是對I2
5、C硬件體系結構中設備端的實現(xiàn),設備一般掛接在受CPU控制的I2C適配器上,通過I2C適配器與CPU交換數(shù)據(jù)。 I2C設備驅動主要包含了數(shù)據(jù)結構i2c_driver和i2c_client,我們需要根據(jù)具體設備實現(xiàn)其中的成員函數(shù)。I2C子系統(tǒng) I2C子系統(tǒng) 在Linux內核源代碼中的drivers目錄下包含一個i2c目錄,而在i2c目錄下又包含如下文件和文件夾: i2c-core.c : 這個文件實現(xiàn)了I2C核心的功能以及/proc/bus/i2c*接口。 i2c-dev.c : 實現(xiàn)了I2C適配器設備文件的功能,每一個I2C適配器都被分配一個設備。通過適配器訪問設備時的主設備號都為89,次設備號
6、為0255。應用程序通過 “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接口的EEPR
7、OM驅動等。 busses文件夾:這個文件中包含了一些I2C總線的驅動,如S3C2410的I2C控制器驅動為i2c-s3c2410.c。 algos文件夾 : 實現(xiàn)了一些I2C總線適配器的algorithm。 此外,內核中的i2c.h這個頭文件對i2c_driver、i2c_client、i2c_adapter和i2c_algorithm這4個數(shù)據(jù)結構進行了定義。理解這4個結構體的作用十分關鍵,分別給出了它們的定義。I2C子系統(tǒng) struct i2c_adapter struct module *owner; unsigned int id; unsigned int class; /* cl
8、asses to allow probing for */ const struct i2c_algorithm *algo; /* the algorithm to access the bus */ void *algo_data; /* data fields that are valid for all devices */ struct rt_mutex bus_lock; int timeout; /* in jiffies */ int retries; struct device dev; /* the adapter device */ int nr; char name48
9、; struct completion dev_released; struct list_head userspace_clients; ;I2C子系統(tǒng) struct i2c_algorithm /* If an adapter algorithm cant do I2C-level access, set master_xfer to NULL. If an adapter algorithm can do SMBus access, set smbus_xfer. If set to NULL, the SMBus protocol is simulated using common I
10、2C messages */ /* master_xfer should return the number of messages successfully processed, or a negative value on error */ int (*master_xfer)(struct i2c_adapter *adap, struct i2c_msg *msgs, int num); int (*smbus_xfer) (struct i2c_adapter *adap, u16 addr, unsigned short flags, char read_write, u8 com
11、mand, int size, union i2c_smbus_data *data); /* To determine what the adapter supports */ u32 (*functionality) (struct i2c_adapter *);I2C子系統(tǒng) struct i2c_driver unsigned int class; int (*attach_adapter)(struct i2c_adapter *); int (*detach_adapter)(struct i2c_adapter *); /* Standard driver model interf
12、aces */ int (*probe)(struct i2c_client *, const struct i2c_device_id *); int (*remove)(struct i2c_client *); /* driver model interfaces that dont relate to enumeration */ void (*shutdown)(struct i2c_client *); int (*suspend)(struct i2c_client *, pm_message_t mesg); int (*resume)(struct i2c_client *)
13、; void (*alert)(struct i2c_client *, unsigned int data); int (*command)(struct i2c_client *client, unsigned int cmd, void *arg); struct device_driver driver; const struct i2c_device_id *id_table; /* Device detection callback for automatic device creation */ int (*detect)(struct i2c_client *, struct
14、i2c_board_info *); const unsigned short *address_list; struct list_head clients;I2C子系統(tǒng) struct i2c_client unsigned short flags; /* div., see below */ unsigned short addr; /* chip address - NOTE: 7bit */ /* addresses are stored in the */ /* _LOWER_ 7 bits */ char nameI2C_NAME_SIZE; struct i2c_adapter
15、*adapter; /* the adapter we sit on */ struct i2c_driver *driver; /* and our access routines */ struct device dev; /* the device structure */ int irq; /* irq issued by device */ struct list_head detected;I2CI2C設備驅動設備驅動 I2C設備驅動I2CI2C設備驅動設備驅動 編寫I2C設備驅動有兩種方法。一種是利用系統(tǒng)給i2c-dev.c來實現(xiàn)一個i2c適配器的設備文件,然后通過在應用層操作i
16、2c適配器來控制i2c設備。 另一種是為i2c設備,獨立編寫一個設備驅動。在這種情況下,是不需要使用i2c-dev.c的。通常我們?yōu)閕2c設備在內核層編寫驅動程序。 目前內核支持兩種編寫i2c驅動程序的方式,分別稱這兩種方式為“Adapter方式(LEGACY)”和“Probe方式(new style)”。兩者流程上基本相似,而前者屬于舊式驅動開發(fā)方式,就不作討論。這里關注現(xiàn)在流行使用的Probe方式。I2CI2C設備驅動設備驅動 構建i2c_driverstatic struct i2c_driver pca953x_driver = .driver = .name= pca953x, ,
17、.probe= pca953x_probe, /當有i2c_client和i2c_driver匹配時調用 .remove= pca953x_remove,/注銷時調用 .id_table= pca953x_id,/匹配規(guī)則 ; 注冊i2c_driverstatic int _init pca953x_init(void) return i2c_add_driver(&pca953x_driver); module_init(pca953x_init);I2CI2C設備驅動設備驅動 在注冊i2c_driver的過程中,是將driver注冊到了i2c_bus_type的總線上。此總線的匹配
18、規(guī)則是:static const struct i2c_device_id *i2c_match_id(const struct i2c_device_id *id, const struct i2c_client *client) while (id-name0) if (strcmp(client-name, id-name) = 0) return id; id+; return NULL; 可以看出是利用i2c_client的名稱和id_table中的名稱做匹配的。本驅動中的id_table為:static const struct i2c_device_id pca953x_id =
19、 pca9534, 0, , ;I2CI2C設備驅動設備驅動 注冊i2c_board_info 對于Probe模式,通常在平臺代碼中要完成i2c_board_info的注冊。方法如下:static struct i2c_board_info _initdata test_i2c_devices = I2C_BOARD_INFO(pca9534 , 0 x27),/pca9534為芯片名稱,0 x27為芯片地址 .platform_data = &pca9534 _data,; i2c_register_board_info(0, test_i2c_devices,ARRAY_SIZE(test_i2c_devices); /注冊 字符驅動注冊 在Probe方式下,添加字符驅動的位置在pca953x_probe中。static int _devinit pca953x_probe(struct i2c_cli
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經(jīng)權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 建筑鋼材期貨鎖價采購綠色節(jié)能合同
- 汽車廣告創(chuàng)意設計及營銷合同
- 寵物糞便處理責任保證協(xié)議(住宅小區(qū))
- 游戲虛擬貨幣發(fā)行與內容版權保護協(xié)議
- 高空作業(yè)安全盤扣式腳手架租賃一體化服務合同
- 夫妻間電子設備使用規(guī)范及忠誠度保障協(xié)議書
- Web前端開發(fā)課件 項目一 HTML文檔結構
- DB42-T 2005.2-2023 就業(yè)創(chuàng)業(yè)服務 第2部分:創(chuàng)業(yè)擔保貸款網(wǎng)辦服務規(guī)范
- 教師心理健康學習心得體會模版
- 2023年人教版四年級語文上冊八單元測試卷及答案2
- 《念奴嬌++過洞庭》教學設計++2024-2025學年統(tǒng)編版高一語文必修下冊
- 交通樞紐的安全管理事故預防與應急處理策略
- 《浙江省中藥飲片炮制規(guī)范》 2015年版
- 第19課《紫藤蘿瀑布》課件-2024-2025學年統(tǒng)編版語文七年級下冊
- 主題班會AI時代中學生的機遇與成長
- 供電公司故障搶修服務規(guī)范
- 初中體育課堂安全教育
- 碼頭安全生產(chǎn)知識
- 全屋整裝培訓
- 《風電安全生產(chǎn)培訓》課件
- 常見病用藥指導技術知到智慧樹章節(jié)測試課后答案2024年秋天津生物工程職業(yè)技術學院
評論
0/150
提交評論