音影先锋亚洲天堂网|电影世界尽头的爱完整版播放|国产 熟女 91|高清无码免费观看欧美日韩|韩国一区二区三区黄色录像|美女亚洲加勒比在线|亚洲综合网 开心五月|7x成人在线入口|成人网站免费日韩毛片区|国产黄片?一级?二级?三级

嵌入式Linux系統(tǒng)下I2C設(shè)備驅(qū)動(dòng)程序的開發(fā)

出處:liudewei 發(fā)布于:2007-11-28 14:46:15

     1 I2C總線簡(jiǎn)介

      I2C (Inter-Integrated Circuit)總線是一種由PHILIPS公司開發(fā)的兩線式串行總線,用于連接微控制器及其外圍設(shè)備。I2C總線主要的優(yōu)點(diǎn)就是簡(jiǎn)單性和有效性。

      1.1  I2C總線工作原理

      I2C總線是由數(shù)據(jù)線SDA和時(shí)鐘SCL構(gòu)成的串行總線,各種被控制器件均并聯(lián)在這條總線上,每個(gè)器件都有一個(gè)的地址識(shí)別,可以作為總線上的一個(gè)發(fā)送器件或接收器件(具體由器件的功能決定) [1]。I2C總線的接口電路結(jié)構(gòu)如圖1所示。


圖1  I2C總線接口電路

      1.2  I2C總線的幾種信號(hào)狀態(tài)

      1.  空閑狀態(tài):SDA和SCL都為高電平。

      2.  開始條件(S):SCL為高電平時(shí),SDA由高電平向低電平跳變,開始傳送數(shù)據(jù)。

      3.  結(jié)束條件(P):SCL為低電平時(shí),SDA由低電平向高電平跳變,結(jié)束傳送數(shù)據(jù)。

      4.  數(shù)據(jù)有效:在SCL的高電平期間, SDA保持穩(wěn)定,數(shù)據(jù)有效。SDA的改變只能發(fā)生在SCL的底電平期間。

      5.  ACK信號(hào): 數(shù)據(jù)傳輸?shù)倪^程中,接收器件每接收一個(gè)字節(jié)數(shù)據(jù)要產(chǎn)生一個(gè)ACK信號(hào),向發(fā)送器件發(fā)出特定的低電平脈沖,表示已經(jīng)收到數(shù)據(jù)。

      1.3  I2C總線基本操作

      I2C總線必須由主器件(通常為微控制器)控制,主器件產(chǎn)生串行時(shí)鐘(SCL),同時(shí)控制總線的傳輸方向,并產(chǎn)生開始和停止條件。

      數(shù)據(jù)傳輸中,首先主器件產(chǎn)生開始條件,隨后是器件的控制字節(jié)(前七位是從器件的地址,一位為讀寫位 )。接下來是讀寫操作的數(shù)據(jù),以及 ACK響應(yīng)信號(hào)。數(shù)據(jù)傳輸結(jié)束時(shí),主器件產(chǎn)生停止條件[1]。具體的過程如圖2所示。

圖2 完整的I2C數(shù)據(jù)傳輸過程

      2  Linux下I2C驅(qū)動(dòng)程序的分析

      2.1 Linux系統(tǒng)I2C驅(qū)動(dòng)的層次結(jié)構(gòu)

      Linux系統(tǒng)對(duì)I2C設(shè)備具有很好的支持,Linux系統(tǒng)下的I2C驅(qū)動(dòng)程序從邏輯上可以分為3個(gè)部分:

      1. I2C總線的驅(qū)動(dòng) I2C core :實(shí)現(xiàn)對(duì)I2C總線、I2C adapter及I2C driver的管理。

      2. I2C控制器的驅(qū)動(dòng) I2C adapter :針對(duì)不同類型的I2C控制器 ,實(shí)現(xiàn)對(duì)I2C總線訪問的具體方法。

      3. I2C設(shè)備的驅(qū)動(dòng) I2C driver :針對(duì)特定的I2C設(shè)備,實(shí)現(xiàn)具體的功能,包括read, write以及ioctl等對(duì)用戶層操作的接口。

      這三個(gè)部分的層次關(guān)系如圖3和圖4所示。

      2.2  I2C 總線驅(qū)動(dòng) I2C core

      I2C core是Linux內(nèi)核用來維護(hù)和管理的I2C的部分,其中維護(hù)了兩個(gè)靜態(tài)的List,分別記錄系統(tǒng)中的I2C driver結(jié)構(gòu)和I2C adapter結(jié)構(gòu)。I2C core提供接口函數(shù),允許一個(gè)I2C adatper,I2C driver和I2C client初始化時(shí)在I2C core中進(jìn)行注冊(cè),以及退出時(shí)進(jìn)行注銷。同時(shí)還提供了I2C總線讀寫訪問的一般接口(具體的實(shí)現(xiàn)在與I2C控制器相關(guān)的I2C adapter中實(shí)現(xiàn)),主要應(yīng)用在I2C設(shè)備驅(qū)動(dòng)中。

      2.3  I2C控制器的驅(qū)動(dòng) I2C adapter

      I2C adapter是針對(duì)不同類型I2C控制器硬件,實(shí)現(xiàn)比較底層的對(duì)I2C總線訪問的具體方法。I2C adapter 構(gòu)造一個(gè)對(duì)I2C core層接口的數(shù)據(jù)結(jié)構(gòu),并通過接口函數(shù)向I2C core注冊(cè)一個(gè)控制器。

      I2C adapter主要實(shí)現(xiàn)對(duì)I2C總線訪問的算法,iic_xfer() 函數(shù)就是I2C adapter底層對(duì)I2C總線讀寫方法的實(shí)現(xiàn)。同時(shí)I2C adpter 中還實(shí)現(xiàn)了對(duì)I2C控制器中斷的處理函數(shù)。

      2.4  I2C設(shè)備的驅(qū)動(dòng) I2C driver

      I2C driver中提供了一個(gè)通用的I2C設(shè)備的驅(qū)動(dòng)程序,實(shí)現(xiàn)了字符類型設(shè)備的訪問接口,對(duì)設(shè)備的具體訪問是通過I2C adapter來實(shí)現(xiàn)的。I2C driver構(gòu)造一個(gè)對(duì)I2C core層接口的數(shù)據(jù)結(jié)構(gòu),通過接口函數(shù)向 I2C Core注冊(cè)一個(gè)I2C設(shè)備驅(qū)動(dòng)。同時(shí)I2C driver 構(gòu)造一個(gè)對(duì)用戶層接口的數(shù)據(jù)結(jié)構(gòu),并通過接口函數(shù)向內(nèi)核注冊(cè)為一個(gè)主設(shè)備號(hào)為89的字符類型設(shè)備。

      I2C driver實(shí)現(xiàn)用戶層對(duì)I2C設(shè)備的訪問,包括open,read,write,ioctl,release等常規(guī)文件操作,我們可以通過open函數(shù)打開 I2C的設(shè)備文件,通過ioctl函數(shù)設(shè)定要訪問從設(shè)備的地址,然后就可以通過 read和write函數(shù)完成對(duì)I2C設(shè)備的讀寫操作。

      通過I2C driver提供的通用方法可以訪問任何一個(gè)I2C的設(shè)備,但是其中實(shí)現(xiàn)的read,write及ioctl等功能完全是基于一般設(shè)備的實(shí)現(xiàn),所有的操作數(shù)據(jù)都是基于字節(jié)流,沒有明確的格式和意義。為了更方便和有效地使用I2C設(shè)備,我們可以為一個(gè)具體的I2C設(shè)備開發(fā)特定的I2C設(shè)備驅(qū)動(dòng)程序,在驅(qū)動(dòng)中完成對(duì)特定的數(shù)據(jù)格式的解釋以及實(shí)現(xiàn)一些專用的功能。

      3 一個(gè)具體的I2C設(shè)備驅(qū)動(dòng)程序的開發(fā)

      DS1307是一款小巧的I2C接口的實(shí)時(shí)時(shí)鐘芯片,具有低功耗,全BCD碼時(shí)鐘和日歷輸出, 12 /24小時(shí)工作模式,時(shí)分秒、星期、年月日計(jì)時(shí)數(shù)據(jù),潤(rùn)年自動(dòng)補(bǔ)償,有效期至2100年,外加56 Bytes的NV RAM(非易失性的RAM)等特點(diǎn)。下面以DS1307為例,說明一個(gè)具體的I2C設(shè)備驅(qū)動(dòng)程序的設(shè)計(jì)要點(diǎn)。

      3.1  I2C設(shè)備驅(qū)動(dòng)程序的一般結(jié)構(gòu)

      一個(gè)具體的I2C設(shè)備驅(qū)動(dòng)需要實(shí)現(xiàn)兩個(gè)方面的接口,一個(gè)是對(duì)I2C core層的接口,用以掛接I2C adapter層來實(shí)現(xiàn)對(duì)I2C總線及I2C設(shè)備具體的訪問方法,包括要實(shí)現(xiàn)attach_adapter,detach_client,command等接口函數(shù)。另一個(gè)是對(duì)用戶應(yīng)用層的接口,提供用戶程序訪問I2C設(shè)備的接口,包括實(shí)現(xiàn)open,release,read,write以及重要的ioctl等標(biāo)準(zhǔn)文件操作的接口函數(shù)。

      對(duì)I2C core層的接口函數(shù)的具體功能解釋如下:

      attach_adapter:I2C driver在調(diào)用I2C_add_driver() 注冊(cè)時(shí),對(duì)發(fā)現(xiàn)的每一個(gè)I2C adapter(對(duì)應(yīng)一條I2C 總線)都要調(diào)用該函數(shù),檢查該I2C adapter是否符合I2C driver的特定條件,如果符合條件則連接此I2C adapter,并通過I2C adapter來實(shí)現(xiàn)對(duì)I2C總線及I2C設(shè)備的訪問。

      detach_client:I2C driver在刪除一個(gè)I2C device時(shí)調(diào)用該函數(shù),清除描述這個(gè)I2C device的數(shù)據(jù)結(jié)構(gòu),這樣以后就不能訪問該設(shè)備了。

      command:針對(duì)設(shè)備的特點(diǎn),實(shí)現(xiàn)一系列的子功能,是用戶接口中的ioctl功能的底層實(shí)現(xiàn)。

      3.2  DS1307驅(qū)動(dòng)程序?qū)崿F(xiàn)對(duì)I2C core層的接口

      在驅(qū)動(dòng)中必須實(shí)現(xiàn)一個(gè)struct i2c_driver 的數(shù)據(jù)結(jié)構(gòu),并在驅(qū)動(dòng)模塊初始化時(shí)向I2C core注冊(cè)一個(gè)I2C驅(qū)動(dòng),并完成對(duì)I2C adapter的相關(guān)操作。

struct i2c_driver ds1307_driver =

 {

name: DS1307,

id: I2C_DRIVERID_DS1307,

flags: I2C_DF_NOTIFY,

attach_adapter:ds1307_probe,

detach_client:ds1307_detach,

command: ds1307_command 

};

      數(shù)據(jù)結(jié)構(gòu)ds1307_driver中的name:DS1307,Id:I2C_DRIVERID_DS1307用來標(biāo)識(shí)DS1307驅(qū)動(dòng)程序。flags: I2C_DF_NOTIFY表示在I2C總線發(fā)生變化時(shí)通知該驅(qū)動(dòng)。

      ds1307_probe對(duì)應(yīng)i2c_driver數(shù)據(jù)結(jié)構(gòu)中的attach_adapter,主要功能:調(diào)用 I2C core 層提供的i2c_probe函數(shù)查找一條I2C總線,看是否有DS1307的設(shè)備存在,如果存在DS1307,則將對(duì)應(yīng)的I2C adapter 和DS1307設(shè)備掛接在一起,并通過該I2C adapter來實(shí)現(xiàn)對(duì)DS1307的訪問。同時(shí)使能DS1307, 并調(diào)用i2c_attach_client()向I2C core層注冊(cè)DS1307。

      ds1307_detach對(duì)應(yīng)i2c_driver數(shù)據(jù)結(jié)構(gòu)中的detach_client,主要功能:調(diào)用i2c_detach_client() 向I2C core層注銷DS1307,并不使能DS1307,這樣I2C驅(qū)動(dòng)就不能訪問DS1307了。

      ds1307_command對(duì)應(yīng)i2c_driver數(shù)據(jù)結(jié)構(gòu)中的command ,主要功能:針對(duì)DS1307時(shí)鐘芯片的特點(diǎn),實(shí)現(xiàn)一系列的諸如DS1307_GETTIME ,DS1307_SETTIME,DS1307_GETDATETIME,DS1307_MEM_READ,DS1307_MEM_WRITE等子功能,是用戶接口中的ioctl功能的底層實(shí)現(xiàn)。

      以上3個(gè)接口函數(shù)使DS1307的驅(qū)動(dòng)程序?qū)崿F(xiàn)了對(duì)I2C 總線及I2C adpater的掛接,因此就可以通過I2C core的提供對(duì)I2C總線讀寫訪問的通用接口,來開發(fā)實(shí)現(xiàn)DS1037驅(qū)動(dòng)程序?qū)τ脩魬?yīng)用層的接口函數(shù)。

      3.3  DS1307驅(qū)動(dòng)程序?qū)崿F(xiàn)對(duì)用戶應(yīng)用層的接口

      在驅(qū)動(dòng)中必須實(shí)現(xiàn)一個(gè)struct file_operations 的數(shù)據(jù)結(jié)構(gòu),并向內(nèi)核注冊(cè)為一個(gè)字符類型的設(shè)備(用單獨(dú)的主設(shè)備號(hào)來標(biāo)識(shí)),或者注冊(cè)為一個(gè)miscdevice設(shè)備(所有miscdevice設(shè)備共同一個(gè)主設(shè)備號(hào),不同的次設(shè)備號(hào),所有的miscdevice設(shè)備形成一個(gè)鏈表,對(duì)設(shè)備訪問時(shí)根據(jù)次設(shè)備號(hào)查找對(duì)應(yīng)的miscdevice設(shè)備,然后調(diào)用其struct file_operations中注冊(cè)的應(yīng)用層接口進(jìn)行操作)。

struct file_operations rtc_fops =

{

owner: THIS_MODULE,

ioctl: ds1307_rtc_ioctl,

read: ds1307_rtc_read,

write: ds1307_rtc_read,

open: ds1307_rtc_open,

release: ds1307_rtc_release

 };

      數(shù)據(jù)結(jié)構(gòu)rtc_fops 中的ds1307_rtc_open 和ds1307_rtc_release對(duì)應(yīng)file_operations中的open和release,分別用來打開和關(guān)閉DS1307。

      ds1307_rtc_ioctl對(duì)應(yīng)file_operations中的ioctl,對(duì)用戶提供的一系列控制時(shí)鐘芯片的具體命令:RTC_GET_TIME: 以固定的數(shù)據(jù)格式讀取實(shí)時(shí)時(shí)鐘的時(shí)間。RTC_SET_TIME:以固定的數(shù)據(jù)格式設(shè)定實(shí)時(shí)時(shí)鐘的時(shí)間。RTC_SYNC_TIME:系統(tǒng)時(shí)鐘和實(shí)時(shí)時(shí)鐘之間的時(shí)間同步。

      ds1307_rtc_read 對(duì)應(yīng)對(duì)應(yīng)file_operations中的read,實(shí)現(xiàn)與ds1307_rtc_ioctl 的子功能RTC_GET_TIME相同的功能,以及從NV RAM讀取數(shù)據(jù)。

      ds1307_rtc_write 對(duì)應(yīng)file_operations中的write,實(shí)現(xiàn)與ds1307_rtc_ioctl的子功能 RTC_SET_TIME相同的功能,以及將數(shù)據(jù)寫入NV RAM。

      3.4  DS1307驅(qū)動(dòng)程序的加載和測(cè)試

      在DS1307驅(qū)動(dòng)模塊的初始化函數(shù)ds1307_init()中,首先通過i2c_add_driver(&ds1307_driver)向I2C core層注冊(cè)一個(gè)I2C的設(shè)備驅(qū)動(dòng),然后再通過misc_register (&ds1307_rtc_miscdev)將DS1307注冊(cè)為一個(gè)miscdevice設(shè)備,這樣用戶程序就可以通過主設(shè)備號(hào)10 次設(shè)備號(hào) 135的設(shè)備節(jié)點(diǎn)/dev/rtc來訪問DS1307了。

      將DS1307的驅(qū)動(dòng)程序編譯成模塊的方式,通過insmod命令加載進(jìn)內(nèi)核,然后用測(cè)試代碼進(jìn)行測(cè)試,DS1307驅(qū)動(dòng)程序中實(shí)現(xiàn)的所有功能都達(dá)到了預(yù)期的效果。

      由于DS1307驅(qū)動(dòng)程序在底層實(shí)現(xiàn)了對(duì)DS1307時(shí)鐘芯片數(shù)據(jù)的解釋和轉(zhuǎn)換,所以在用戶程序中得到的就是有固定格式和意義的數(shù)據(jù),這樣就方便了用戶程序的訪問,提高了應(yīng)用開發(fā)的效率。

      4 總結(jié)

      I2C總線是一種結(jié)構(gòu)小巧,協(xié)議簡(jiǎn)單的總線,應(yīng)用很廣泛,訪問起來簡(jiǎn)單方便。linux系統(tǒng)下I2C的驅(qū)動(dòng)程序具有清晰的層次結(jié)構(gòu),可以很容易地為一個(gè)特定的I2C設(shè)備開發(fā)驅(qū)動(dòng)。本文通過對(duì)linux系統(tǒng)下I2C驅(qū)動(dòng),以及一個(gè)具體的DS1307時(shí)鐘芯片驅(qū)動(dòng)結(jié)構(gòu)的分析,基本上可以很清楚看出一個(gè)I2C設(shè)備驅(qū)動(dòng)的開發(fā)過程。實(shí)現(xiàn)的關(guān)鍵分為兩個(gè)部分,1. 對(duì)I2C core的接口,必須實(shí)現(xiàn) struct i2c_drvier數(shù)據(jù)結(jié)構(gòu)中的幾個(gè)特定的功能函數(shù)。這些函數(shù)是I2C驅(qū)動(dòng)與I2C總線物理層(I2C控制器)和I2C設(shè)備器件之間通信的基礎(chǔ)。2. 對(duì)用戶應(yīng)用層的接口,必須實(shí)現(xiàn)struct file_operation數(shù)據(jù)結(jié)構(gòu)中的一些特定功能的函數(shù),如 open ,release , read ,write,lseek等函數(shù)。以上兩類接口中,對(duì)I2C core的接口是對(duì)I2C設(shè)備訪問的基礎(chǔ),實(shí)現(xiàn)對(duì)I2C總線具體的訪問方法;對(duì)用戶應(yīng)用層的接口則是方便應(yīng)用程序開發(fā),實(shí)現(xiàn)設(shè)備特定功能的必不可少的部分。


  
關(guān)鍵詞:嵌入式Linux系統(tǒng)下I2C設(shè)備驅(qū)動(dòng)程序的開發(fā)DS1307DS1037

版權(quán)與免責(zé)聲明

凡本網(wǎng)注明“出處:維庫電子市場(chǎng)網(wǎng)”的所有作品,版權(quán)均屬于維庫電子市場(chǎng)網(wǎng),轉(zhuǎn)載請(qǐng)必須注明維庫電子市場(chǎng)網(wǎng),http://m.58mhw.cn,違反者本網(wǎng)將追究相關(guān)法律責(zé)任。

本網(wǎng)轉(zhuǎn)載并注明自其它出處的作品,目的在于傳遞更多信息,并不代表本網(wǎng)贊同其觀點(diǎn)或證實(shí)其內(nèi)容的真實(shí)性,不承擔(dān)此類作品侵權(quán)行為的直接責(zé)任及連帶責(zé)任。其他媒體、網(wǎng)站或個(gè)人從本網(wǎng)轉(zhuǎn)載時(shí),必須保留本網(wǎng)注明的作品出處,并自負(fù)版權(quán)等法律責(zé)任。

如涉及作品內(nèi)容、版權(quán)等問題,請(qǐng)?jiān)谧髌钒l(fā)表之日起一周內(nèi)與本網(wǎng)聯(lián)系,否則視為放棄相關(guān)權(quán)利。

DS1307實(shí)時(shí)時(shí)鐘芯片能提供精確的實(shí)時(shí)時(shí)間,有著低電流充電的作用!
廣告
OEM清單文件: OEM清單文件
*公司名:
*聯(lián)系人:
*手機(jī)號(hào)碼:
QQ:
有效期:

掃碼下載APP,
一鍵連接廣大的電子世界。

在線人工客服

買家服務(wù):
賣家服務(wù):
技術(shù)客服:

0571-85317607

網(wǎng)站技術(shù)支持

13606545031

客服在線時(shí)間周一至周五
9:00-17:30

關(guān)注官方微信號(hào),
第一時(shí)間獲取資訊。

建議反饋

聯(lián)系人:

聯(lián)系方式:

按住滑塊,拖拽到最右邊
>>
感謝您向阿庫提出的寶貴意見,您的參與是維庫提升服務(wù)的動(dòng)力!意見一經(jīng)采納,將有感恩紅包奉上哦!