1. 程式人生 > >linux下IIC驅動開發分析

linux下IIC驅動開發分析

1.IIC規範

IIC(InterIntegrated Circuit)匯流排是一種由PHILIPS公司開發的兩線式序列匯流排,用於連線微控制器及其外圍裝置。IIC匯流排產生於在80年代,最初為音訊和視訊裝置開發,如今主要在伺服器管理中使用,其中包括單個元件狀態的通訊。例如管理員可對各個元件進行查詢,以管理系統的配置或掌握元件的功能狀態,如電源和系統風扇。可隨時監控記憶體、硬碟、網路、系統溫度等多個引數,增加了系統的安全性,方便了管理。

2.1IIC匯流排的特點

IIC匯流排最主要的優點是其簡單性和有效性。由於介面直接在元件之上,因此IIC匯流排佔用的空間非常小,減少了電路板的空間和晶片管腳的數量,降低了互聯成本。匯流排的長度可高達

25英尺,並且能夠以10Kbps的最大傳輸速率支援40個元件。IIC匯流排的另一個優點是,它支援多主控(multimastering)其中任何能夠進行傳送和接收的裝置都可以成為主匯流排。一個主控能夠控制訊號的傳輸和時鐘頻率。當然,在任何時間點上只能有一個主控。

2.2IIC匯流排工作原理

2.2.1 匯流排構成及訊號型別

IIC匯流排是由資料線SDA和時鐘SCL構成的序列匯流排,可傳送和接收資料。在CPU與被控IC之間、ICIC之間進行雙向傳送,最高傳送速率100kbps。各種被控制電路均並聯在這條總線上,但就像電話機一樣只有撥通各自的號碼才能工作,所以每個電路和模組都有唯一的地址,在資訊的傳輸過程中,

IIC總線上並接的每一模組電路既是主控器(或被控器),又是傳送器(或接收器),這取決於它所要完成的功能。

CPU發出的控制訊號分為地址碼和控制量兩部分:

?地址碼用來選址,即接通需要控制的電路,確定控制的種類;

?控制量決定該調整的類別(如對比度、亮度等)及需要調整的量。

這樣,各控制電路雖然掛在同一條總線上,卻彼此獨立,互不相關。

IIC匯流排在傳送資料過程中共有三種類型訊號:

?開始訊號:SCL為高電平時,SDA由高電平向低電平跳變,開始傳送資料。

?結束訊號:SCL為高電平時,SDA由低電平向高電平跳變,結束傳送資料。

?資料傳輸訊號:在開始條件以後,時鐘訊號SCL的高電平週期期問,當資料線穩定時,資料線

SDA的狀態表示資料有效,即資料可以被讀走,開始進行讀操作。在時鐘訊號SCL的低電平週期期間,資料線上資料才允許改變。每位資料需要一個時鐘脈衝。

?應答訊號:接收資料的IC在接收到8bit資料後,向傳送資料的IC發出特定的低電平脈衝,表示已收到資料。CPU向受控單元發出一個訊號後,等待受控單元發出一個應答訊號,CPU接收到應答訊號後,根據實際情況作出是否繼續傳遞訊號的判斷。若未收到應答訊號,由判斷為受控單元出現故障。

目前有很多半導體積體電路上都集成了IIC介面。帶有IIC介面的微控制器有:CYGNAL C8051F0XX系列,PHILIPSP87LPC7XX系列,MICROCHIPPIC16C6XX系列等。很多外圍器件如儲存器、監控晶片等也提供IIC介面。

2.3匯流排基本操作

IIC規程運用主/從雙向通訊。器件傳送資料到總線上,則定義為傳送器,器件接收資料則定義為接收器。主器件和從器件都可以工作於接收和傳送狀態。匯流排必須由主器件(通常為微控制器)控制,主器件產生序列時鐘(SCL)控制匯流排的傳輸方向,併產生起始和停止條件。SDA線上的資料狀態僅在SCL為低電平的期間才能改變,SCL為高電平的期間,SDA狀態的改變被用來表示起始和停止條件。

2.3.1 控制位元組

在起始條件之後,必須是器件的控制位元組,其中高四位為器件型別識別符(不同的晶片型別有不同的定義,EEPROM一般應為1010),接著三位為片選,最後一位為讀寫位,當為1時為讀操作,為0時為寫操作。

2.3.2 寫操作

寫操作分為位元組寫和頁面寫兩種操作,對於頁面寫根據晶片的一次裝載的位元組不同有所不同。關於頁面寫的地址、應答和資料傳送的時序。

2.3.3 讀操作

讀操作有三種基本操作:當前地址讀、隨機讀和順序讀。圖4給出的是順序讀的時序圖。應當注意的是:最後一個讀操作的第9個時鐘週期不是“不關心”。為了結束讀操作,主機必須在第9個週期間發出停止條件或者在第9個時鐘週期內保持SDA為高電平、然後發出停止條件。

2.3.4 匯流排仲裁

主機只能在匯流排空閒的時候啟動傳輸。兩個或多個主機可能在起始條件的最小持續內產生一個起始條件,結果在總線上產生一個規定的起始條件。

SCL線是高電平時,仲裁在SDA線發生:這樣,在其他主機發送低電平時,傳送高電平的主機將斷開它的資料輸出級,因為總線上的電平和它自己的電平不同。

仲裁可以持續多位。從地址位開始,同一個器件的話接著就是資料位(如果主機-傳送器),或者比較相應位(如果主機-接收器)。IIC匯流排的地址和資料資訊由贏得仲裁的主機決定,在這個過程中不會丟失資訊。

仲裁不能在下面情況之間進行:

?重複起始條件和資料位;

?停止條件和資料位;

?重複起始條件和停止條件。

2.4特性總結

?IIC肯定是2線的(不算地線)IIC協議確實很科學,3/4線的SPI要好,當然線多通訊速率相對就快了

?IIC的原則是

lSCL=1(高電平),SDA千萬別忽悠!!!否則,SDA下跳則"判罰""起始訊號S",SDA上跳則"判罰""停止訊號P".

lSCL=0(低電平),SDA隨便忽悠!!!(可別忽悠過火到SCL跳高)

?每個位元組後應該由對方回送一個應答訊號ACK做為對方線上的標誌.非應答訊號一般在所有位元組的最後一個位元組後.一般要由雙方協議簽定.

?SCL必須由主機發送,否則天下大亂

?首位元組是"片選訊號",7位從機地址加1位方向(讀寫)控制.從機收到(聽到)自己的地址才能傳送應答訊號(必須應答!!!)表示自己線上.其他地址的從機不允許忽悠!!!(當然群呼可以忽悠但只能聽不許說話)

?讀寫是站在主機的立場上定義的.""是主機接收從機資料,""是主機發送資料給從機.

?重複位主要用於主機從傳送模式到接收模式的轉換"訊號",由於只有2,所以收發轉換肯定要比SPI複雜,因為SPI可用不同的邊沿來收發資料,IIC不行.

?在硬體IIC模組,特別是MCU/ARM/DSP等每個階段都會得到一個準確的狀態碼,根據這個狀態碼可以很容易知道現在在什麼狀態和什麼出錯資訊.

?7IIC匯流排可以掛接127個不同地址的IIC裝置,0"裝置"作為群呼地址.10IIC匯流排可以掛接更多的10IIC裝置.

3.1LinuxIIC驅動架構

Linux定義了系統的IIC驅動體系結構,在Linux系統中,IIC驅動由3部分組成,即IIC核心、IIC匯流排驅動和IIC裝置驅動。這3部分相互協作,形成了非常通用、可適應性很強的IIC框架。

3.1.1 IIC核心

IIC 核心提供了IIC匯流排驅動和裝置驅動的註冊、登出方法,IIC通訊方法(即“algorithm”,筆者認為直譯為運算方法並不合適,為免引起誤解,下文將直接使用“algorithm”)上層的、與具體介面卡無關的程式碼以及探測裝置、檢測裝置地址的上層程式碼等。

在我們的Linux驅動的i2c資料夾下有algosbusseschips三個資料夾,另外還有i2c-core.ci2c-dev.c兩個檔案。

i2c-core.c檔案實現了I2Ccore框架,是Linux核心用來維護和管理的I2C的核心部分,其中維護了兩個靜態的List,分別記錄系統中的I2Cdriver結構和I2Cadapter結構。I2Ccore提供介面函式,允許一個I2CadatperI2CdriverI2Cclient初始化時在I2Ccore中進行註冊,以及退出時進行登出。同時還提供了I2C匯流排讀寫訪問的一般介面,主要應用在I2C裝置驅動中。

3.1.2 IIC匯流排驅動

IIC匯流排驅動是對IIC硬體體系結構中介面卡端的實現,介面卡可由CPU控制,甚至直接整合在CPU內部。匯流排驅動的職責,是為系統中每個I2C匯流排增加相應的讀寫方法。但是匯流排驅動本身並不會進行任何的通訊,它只是存在那裡,等待裝置驅動呼叫其函式。

IIC匯流排驅動主要包含了IIC介面卡資料結構i2c_adapterIIC介面卡的algorithm資料結構i2c_algorithm和控制IIC介面卡產生通訊訊號的函式。經由IIC匯流排驅動的程式碼,我們可以控制IIC介面卡以主控方式產生開始位、停止位、讀寫週期,以及以從裝置方式被讀寫、產生ACK等。

Busses資料夾下的i2c-mpc.c檔案實現了PowerPCI2C匯流排介面卡驅動,定義描述了具體的I2C匯流排介面卡的i2c_adapter資料結構,實現比較底層的對I2C匯流排訪問的具體方法。I2Cadapter 構造一個對I2Ccore層介面的資料結構,並通過介面函式向I2Ccore註冊一個控制器。I2Cadapter主要實現對I2C匯流排訪問的演算法,iic_xfer() 函式就是I2Cadapter底層對I2C匯流排讀寫方法的實現。同時I2Cadpter 中還實現了對I2C控制器中斷的處理函式。

3.1.3 IIC裝置驅動

IIC裝置驅動是對IIC硬體體系結構中裝置端的實現,裝置一般掛接在受CPU控制的IIC介面卡上,通過IIC介面卡與CPU交換資料。裝置驅動則是與掛在I2C總線上的具體的裝置通訊的驅動。通過I2C匯流排驅動提供的函式,裝置驅動可以忽略不同匯流排控制器的差異,不考慮其實現細節地與硬體裝置通訊。

IIC裝置驅動主要包含了資料結構i2c_driveri2c_client,我們需要根據具體裝置實現其中的成員函式。

i2c-dev.c檔案中實現了I2Cdriver,提供了一個通用的I2C裝置的驅動程式,實現了字元型別裝置的訪問介面,實現了對使用者應用層的介面,提供使用者程式訪問I2C裝置的介面,包括實現openreleasereadwrite以及最重要的ioctl等標準檔案操作的介面函式。我們可以通過open函式開啟 I2C的裝置檔案,通過ioctl函式設定要訪問從裝置的地址,然後就可以通過 readwrite函式完成對I2C裝置的讀寫操作。

通過I2Cdriver提供的通用方法可以訪問任何一個I2C的裝置,但是其中實現的readwriteioctl等功能完全是基於一般裝置的實現,所有的操作資料都是基於位元組流,沒有明確的格式和意義。為了更方便和有效地使用I2C裝置,我們可以為一個具體的I2C裝置開發特定的I2C裝置驅動程式,在驅動中完成對特定的資料格式的解釋以及實現一些專用的功能。

3.1LinuxIIC驅動開發

3.2.1 IIC匯流排驅動

在系統開機時,首先裝載的是I2C匯流排驅動。一個匯流排驅動用於支援一條特定的I2C匯流排的讀寫。一個匯流排驅動通常需要兩個模組,一個struct i2c_adapter和一個struct i2c_algorithm來描述:

static struct i2c_adapter pb1550_board_adapter =

{

  name:              "pb1550 adapter",

  id:                I2C_HW_AU1550_PSC,

  algo:              NULL,

  algo_data:         &pb1550_i2c_info,

  inc_use:           pb1550_inc_use,

  dec_use:           pb1550_dec_use,

  client_register:   pb1550_reg,

  client_unregister: pb1550_unreg,

  client_count:      0,

};

這個樣例掛接了一個叫做“pb1550 adapter”的驅動。但這個模組並未提供讀寫函式,具體的讀寫方法由第二個模組,struct i2c_algorithm提供。

static struct i2c_algorithm au1550_algo =

{

.name         = "Au1550 algorithm",

.id      = I2C_ALGO_AU1550,

.master_xfer = au1550_xfer,

.functionality     = au1550_func,

};

i2c_adap->algo = &au1550_algo;

這個樣例給上述匯流排驅動增加了讀寫演算法。通常情況下每個I2C匯流排驅動都定義一個自己的讀寫演算法,但鑑於有些匯流排使用相同的演算法,因而可以共用同一套讀寫函式。本例中的驅動定義了自己的讀寫演算法模組,起名叫“Au1550 algorithm”

全部填妥後,通過呼叫:

i2c_add_adapter(i2c_adap);

將這兩個模組註冊到作業系統裡,匯流排驅動就算裝上了。對於AMD au1550,這部分已經由AMD提供了。

3.2.2 IIC裝置驅動

I2C的裝置驅動是通過i2c_add_driver(&my_driver)i2c-core註冊的,my_driver中的核心是detach_client attach_adapter函式,在attach_adapter中通過probe探測到總線上的裝置並把裝置和驅動建立連線以完成裝置的初始化。

裝置驅動透過I2C匯流排同具體的裝置進行通訊。一個裝置驅動有兩個模組來描述,struct i2c_driverstruct i2c_client

當系統開機、I2C匯流排驅動裝入完成後,就可以裝入裝置驅動了。首先裝入如下結構:

相關推薦

linuxIIC驅動開發分析

1.IIC規範 IIC(Inter-Integrated Circuit)匯流排是一種由PHILIPS公司開發的兩線式序列匯流排,用於連線微控制器及其外圍裝置。IIC匯流排產生於在80年代,最初為音訊和視訊裝置開發,如今主要在伺服器管理中使用,其中包括單個元件狀態的通訊。例如管理員可對各個元件進行查詢,以

Linux wifi 驅動開發(三)—— SDIO介面WiFi驅動淺析

      SDIO-Wifi模組是基於SDIO介面的符合wifi無線網路標準的嵌入式模組,內建無線網路協議IEEE802.11協議棧以及TCP/IP協議棧,能夠實現使用者主平臺數據通過SDIO口到無線網路之間的轉換。SDIO具有傳輸資料快,相容SD、MMC介面等特點。  

Linux wifi 驅動開發(一)—— WiFi基礎知識解析

 一、WiFi相關基礎概念 1、什麼是wifi        我們看一下百度百科是如何定義的:       Wi-Fi是一種可以將個人電腦、手持裝置(如pad、手機)等終端以無線方式互相連線的技術,事實上它是一個高頻無線電訊號。[1]  無線保真是一個無線網路通訊技術的品牌

Linux wifi 驅動開發(二)—— WiFi模組淺析

一、什麼是wifi 模組         百度百科上這樣定義:         Wi-Fi模組又名串列埠Wi-Fi模組,屬於物聯網傳輸層,功能是將串列埠或TTL電平轉為符合Wi-Fi無線網路通訊標準的嵌入式模組,內建無線網路協議IEEE802.11b.g.n協議棧以及TCP

Linuxspi驅動開發(2)

Linux下spi驅動開發之m25p10驅動測試 目標:在華清遠見的FS_S5PC100平臺上編寫一個簡單的spi驅動模組,在probe階段實現對m25p10的ID號探測、flash擦除、flash狀態讀取、flash寫入、flash讀取等操作。程式碼已經經過測試,運行於

linux基於vc088x開發分析CLK模型(時鐘管理)

Linux clk 模型   Linux clk模型採用面向物件的思想來設計實現的。 在porting層建立一個一個的clk節點物件,然後將所有的clk節點物件連成一個list。 當驅動層需要設定時鐘的時候,通過porting層與驅動層

LinuxI2C驅動分析(一)

        最近在做一個基於全志A33晶片的android移植時發現嵌入式裝置很多都用到了I2C匯流排通訊,比如說攝像頭,G-sensor,觸控式螢幕等,為此我覺得很好的理解I2C裝置驅動在今後的嵌入式開發中是非常有好處的,而目前我也是處於學習階段,便將這些學習的過程給

Linux SD卡驅動開發(六) —— SD卡啟動過程總體分析

一、工作流程 mmc驅動主要檔案包括 drivers/mmc/card/block.c drivers/mmc/card/queue.c drivers/mmc/core/core.c drivers/mmc/core/host.c drivers/mmc/core/ 核心

linux 安裝web開發環境

技術 cnblogs -- 時間日誌 java inux 協議 環境變量 含義 以下使用 linux centos系統 一、JDK的安裝 1、下載jdk-8u111-linux-x64.tar.gz 2、解壓該文件,將解壓後的文件復制到 /usr/local/jdk1.7

linux的Java開發 intellij idea+tomcat+maven

rac project article attribute tail 3.1 構圖 eat quest 前期準備:安裝intellij idea、下載tomcat、下載maven(註意我用的是tomcat6、maven 3.2.1、jdk1.6.0_45,之前maven用的

Hasen的linux設備驅動開發學習之旅--時鐘

interval 好的 mask 再次 ask 中斷處理程序 eas 中斷 基礎 /** * Author:hasen * 參考 :《linux設備驅動開發具體解釋》 * 簡單介紹:android小菜鳥的linux * 設備驅動開發學習之

LinuxPower Management開發總結

提升 padding pro 進程 框架 eight 概述 lock str 本文作為一個提綱挈領的介紹性文檔,後面會以此展開,逐漸豐富。 關於Linux省電: 保持CPU處於工作狀態時: 1. 設備使能RPM,不使用的設備動態關閉。 2. cpufreq動態調節CPU/G

Linux搭建STM8開發環境

post get des apt b- blog div 復制 bsp 使用SDCC+STM8Flash+STLink搭建Linux開發STM8開發環境,對應的MCS51,LPC之類的也可以使用SDCC 1、安裝SDCC$ sudo apt-get install sdcc

rk3399iic驅動

先簡要說明一下東西, 板子是rk3399的板子,跑的安卓系統,安卓7.1,由於板載一塊音訊編解碼晶片,正好可以支援iic介面,於是就嘗試讀取他的Device ID 0x6281 暫存器地址0xff,核心文件下kernel\Documentation\iic目錄下有iic相關的文件說明該核心版本下相對

rk3399iic驅動方式二-----裝置樹

方式一 前面說了iic在新核心下的一種方式,下面是第二種方式,這種方式在fireflyWiki教程裡面有說明 程式碼如下 #include <linux/kernel.h> #include <linux/module.h> #include <linux/

Linux學習筆記 二 LinuxC語言開發工具

2.1常用編輯工具 1.vim編輯器 VIM編輯器基本山可分為三種模式分別是命令模式,插入模式和底行模式 下面是VIM模式轉換圖。 (1)在.vimrc檔案中設定幾個常用的底行命令 設定縮排命令    :set smartindent 

Linux搭建PHP開發環境,Php-Fpm程序管理。

目前PHP專案開發幾種比較流行的架構搭建中,LNMP在效能方面是最好的,正因為如此,使得LNMP架構逐漸流行起來,今天,前面提到了Nginx部署,由於專案實際環境的需要,今天就在說一下怎麼部署PHP。 環境 CentOS 6.3 PHP 5.6 安裝步驟 1. 下載並安裝P

linux驅動控制gpio的方法

arm linux下寫驅動控制gpio時,有兩種方法: 1. 用ioremap()得到暫存器的地址,然後用iowrite32()或writel()函式寫暫存器控制gpio 1)查datashee

Linux搭建Python開發環境部署

1.安裝作業系統 系統版本CentOS release 6.5 (Final)mini安裝 關閉SELinux 關閉防火牆功能 關閉SSH的UseDNS功能 配置IP地址 配置DNS伺服器 配置NTP伺服器 配置主機名   2. Pyenv安裝方式 2.1

linuxi2c驅動筆記

1. 幾個基本概念 1.1. 裝置模型 由 匯流排(bus_type) + 裝置(device) + 驅動(device_driver) 組成,在該模型下,所有的裝置通過匯流排連線起來,即使有些裝置沒有連線到一根物理總線上,linux為其設定了一個內部的、虛擬的platf