Linux下I2C總線EEPROM驅動程序設計方法

2020-11-29 OFweek維科網

  3 Linux中I2C總線驅動體系結構

 

  在Linux系統中,對於一個給定的I2C總線硬體配置系統,I2C總線驅動程序體系結構由I2C總線驅動和I2C設備驅動組成。其中I2C總線驅動包括一個具體的控制器驅動和I2C總線的算法驅動。一個算法驅動適用於一類總線控制器。而一個具體的總線控制器驅動要使用某一種算法。例如,Linux內核中提供的算法i2e-algo-8260可以用在MPC82xx系列處理器提供的I2C總線控制器上。Linux內核中提供了一些常見處理器如MPC82xx系列的算法驅動。對於I2C設備,基本上每種具體設備都有自己的基本特性。其驅動程序一般都需要特別設計。

  在I2C總線驅動程序體系結構中。使用數據結構Driver來表示I2C設備驅動,使用數據結構Client表示一個具體的I2C設備。而對於I2C總線

  控制器,各種總線控制器在進行數據傳輸時採用的算法有好多種,使用相同算法的控制器提供的控制接口也可能不同。在I2C總線驅動程序體系結構中,用數據結構Algorithm來表示算法,用數據結構Adapter來表示不同的總線控制器。Linux內核的I2C總線驅動程序體系結構如圖5所示。

 

  

  圖5 Linux內核I2C總線驅動程序體系結構

 

  在圖5中,一個Client對象對應一個具體的I2C總線設備,而一種I2C設備的Driver可以同時支持多個Client。每個Adapter對應一個具體的I2C總線控制器。不同的I2C總線控制器可以使用相同的算法Algorithm。i2c-core是I2C總線驅動程序體系結構的核心,在這個模塊中,除了為總線設備驅動提供了一些統一的調用接口來訪問具體的總線驅動程序功能,以進行讀寫或設置操作外,還提供了將各種支持的總線設備驅動和總線驅動添加到這個體系中的方法,以及當不再使用這些驅動時將其從體系中刪除的方法。i2c-core將總線驅動程序體系一分為二,相互獨立。可以針對某個I2C總線設備來設計一個I2C設備驅動程序,而不需要關心系統的I2C總線控制器是何種類型,所以提高了其可移植性。另一方面,在設計I2C總線驅動時也可以不要考慮其將用來支持何種設備。因為i2c-core提供了統一的接口,所以也為設計這兩類驅動提供了方便。

 

  4 開發實例

 

  Linux內核已經提供了I2C驅動中所需要的基本模塊。i2c-core、i2c-dev和i2c-proc是總線控制器和I2C設備所需要的核心模塊。對於MPC8250處理器,內核中還有MPC8260的算法模塊i2c-algo-8260,它也適用於MPC8250的I2C控制接口。這些模塊程序在默認條件下是不會被編譯到內核裡的,所以需要在配置Linux內核時把這些模塊選中。在筆者的開發中需要實現的是I2C總線控制器驅動和I2C設備EEPROM驅動。

  4.1 I2C總線控制器驅動的設計

  MPC8250的I2C總線驅動程序由i2c-algo-8260算法模塊和MPC8250具體的I2C總線控制器驅動組成。其中i2c-algo-8260算法模塊已經在內核中實現,所以主要實現FC總線控制器驅動。

  i2c-algo-8260算法模塊主要用來描述MPC82xx處理器如何在I2C總線上傳輸數據。該模塊中主要實現了MPC82xx處理器上I2C總線的初始化、讀寫、ioctl控制和中斷請求等功能。另外,還有i2c_8260_add_bus和i2c_8260_del_bus兩個函數,它們是使用這個算法的Adapter初始化時和退出時調用的函數,用來註冊和註銷一個總線控制器,需要從模塊導出。這些函數功能都被封裝在一個i2c-algorithm結構中,傳遞給使用這個算法的Adapter。算法模塊中這些函數需要調用特定控制器模塊中的函數來實現具體的操作。

  在I2C總線控制器驅動模塊中主要要實現兩個結構體i2c_adapter和i2c_algo_8260_data,定義這兩個結構中的函數指針成員。並且用己經初始化好的i2c_algo_826o_data結構來初始化struct i2c_adapter結構的algo_data成員變量。其中,定義i2e_algo_8260_data結構為:

  struct i2c_algo_8260_data rw8250_data={

  setisr:rw8250_install_isr

  };

  這裡的成員變量rw8250_install__isr提供了MPC8250的I2C總線控制器向內核申請中端請求的功能。結構體i2c_adapter定義如下:

  struct i2c_adapter rw8250_ops={「rw8250」,I2C_HW_

  MPC8250_RW8250,NULL,&rw8250_data,rw8250_inc_use,rw8250_dec_use,rw8250_reg,rw8250_unreg,};

  其中,「rw8250」是該總線控制器的標識名,宏名I2C_HW_MPC8250_RW8250定義了內核中註冊該適配器的ID號,而成員函數rw8250_inc_use和rw8250_dec_use用來增加和減少內核使用該模塊的次數。

  另外,該模塊還要完成一個註冊模塊時的初始化函數rw8250_iic_init,在該函數中要初始化I2C控制器使用的通用埠號PortD14、PortD15,並在雙埠RAM 中為發送和接受數據的緩衝區分配空間。函數rw8250_iic_init在進行模塊初始化時將被init_module調用。

  總之。I2C控制器模塊中設計的這些函數都是為i2c_algo_8650算法模塊服務的。最後需要封裝在i2c-adapter結構中。通過i2c_algo_8260_data算法模塊中輸出的接口函數傳遞給算法模塊。

  4.2 I2C設備驅動的設計

  I2C設備EEPROM 驅動除了要根據EEPROM的具體特性進行設計外。還要考慮I2C總線驅動程序體系結構的特性。在EEPROM設備驅動程序中需要實現一個i2c_driver結構。每個對應於具體設備的Client都從這個結構來構造。在i2c_driver結構中有兩個函數attach_adapter和detach_client必須要實現。i2c_driver結構的定義如下:

  struct i2c_driver eeprom_driver = {

  /*name*/ 「I2C_EEPROM_DRIVER」,/*id*/I2C_DRIVERID_EEPROM,

  /*flags*/ I2C_DF_NOTIFY,/*attach_ adapter*/&eeprom_attach_adapter,/*detach_client */&eeprom_detach_client,

  /*command*/&eeprom_command,/*inc_use*/ &eeprom_inc_use,/*dec_use*/ &eeprom_dec_use

  };

  在設備驅動中。向EEPROM 寫數據通過調用i2c-core提供的i2c_master_send函數來完成。從EEPROM 讀取數據通過另一個函數i2c_master_read來完成。與一般設備驅動不同的地方就是在EEPROM驅動模塊初始函數中要調用i2c-core提供的i2c_add_driver函數來註冊該設備。在模塊退出函數中調用i2c_del_driver函數來註銷該設備。

 

  5 結束語

 

  I2C總線具有控制簡單、通信速率高等優點,作為一種2線雙向同步串行數據總線,它為嵌入式系統設計提供了一種完善的集成電路間的串行總線擴展技術,大大簡化了應用系統的硬體設計,為實現應用系統的模塊化設計創造了極為有利的條件。同時,在很多情況下需要對系統中的某些動態信息進行掉電保護。在數據量不太大的場合下,通過I2C總線連接的EEPROM在這方面就比較能發揮作用。而Linux作為一種新的作業系統,目前在嵌入式系統中的應用非常廣泛。其發展前景無法估量。由於Linux源碼開放,且非常易於移植,為其編寫設備驅動程序相對容易。本文介紹了Linux下I2C總線EEPROM驅動程序的一般設計方法。

相關焦點

  • 實戰經驗吐血推薦:怎樣在Linux環境下輕鬆實現基於I2C總線的EEPROM...
    MPC8250處理器正是通過內部的I2C總線控制器來和這些連接在I2C總線上的設備進行數據交換的。由於I2C總線的特性,Linux的I2C總線設備驅動程序的設計者在設計驅動程序時採用了獨特的體系結構。使開發I2C總線設備驅動程序與開發一般設備驅動程序的方法具有很大差別。因此,開發I2C總線設備驅動程序除了要涉及一般Linux內核驅動程序的知識外。
  • 數字溫度傳感器DS1621在Linux下的IIC接口驅動設計
    2 電路結構設計設計採用了S3C2440作為電路中的主設備,控制IIC總線上從器件,由主設備控制IIC總線上的時鐘信號以及各種數據信號。3 驅動程序設計在Linux下的驅動程序將所有設備看作文件,驅動程序則為應用程式和硬體設備之間提供了操作訪問的接口,使應用程式可以像操作普通文件一樣對硬體設備操作訪問。
  • 救活你的I2C總線故障方案出爐了!
    本文主要針對 i2c 設備,講解如何解決 i2c 設備主機與從機直接無法正常數據交互的問題,側重點是針對硬體設計不太合理、i2c 設備設計不標準導致總線故障的情況,並且通過分析現象,提出解決方案。對於在設備初始化中,沒有設置相應的寄存器或者發送命令,而導致的無法獲取想要的數據情況,不作詳細介紹。
  • 嵌入式Linux設備驅動開發之:GPIO驅動程序實例
    根據各種系統設計的需求,通過軟體方法可以將這些埠配置成具有相應功能(例如:外部中斷或數據總線)的埠。為了控制這些埠,S3C2410處理器為每個埠組分別提供幾種相應的控制寄存器。其中最常用的有埠配置寄存器(GPACON~GPHCON)和埠數據寄存器(GPADAT~GPHDAT)。
  • 基於Linux系統的多種串行總線統一接口的實現
    統一接口的應用層API與底層的具體總線操作形式無關,而且便於應用系統的升級和移植。文中給出了一種多種串行總線統一接口的實現方法,並以ARM9為平臺,以I2C、1-Wire、SPI為例,驗證了新方法的可行性。
  • 詳解I2C總線鍵盤電路以及驅動程序設計
    >以及驅動程序的設計。二、MAX7348MAX7348 是美國MAXIM 公司生產的2 線接口、低EMI 鍵盤開關和發聲控制器,可監控多達40 個按鍵,可對按鍵去抖並保存在FIFO 中,去抖時間用戶可在9 ~ 40ms 之間任意設置,MAX7348 自帶的音調發生器在控制器的作用下可自動發出按鍵聲和報警聲,在發聲期間,輸出還可以設置為高電平或低電平,以驅動電子發聲器、繼電器或指示燈。
  • 從串口驅動到Linux驅動模型,想轉Linux的必會!
    B、關於可移植性可移植性指與軟體從某一環境轉移到另一環境下的難易程度。為獲得較高的可移植性,在設計過程中常採用通用的程序設計語言和運行支撐環境。儘量不用與系統的底層相關性強的語言。可移植性是軟體質量之一,良好的可移植性可以提高軟體的生命周期。代碼的可移植性主題是軟體;可移植性是軟體產品的一種能力屬性,其行為表現為一種程度,而表現出來的程度與環境密切相關。
  • 基於嵌入式WinCE的CAN總線控制器驅動設計
    Windows CE作業系統之所以能夠支持各種各樣的硬體設備,是因為對每一款硬體設備,都有其對應的設備驅動程序,否則這款硬體就無法在Windows CE下正常工作。win CE提供了4種設備模型,其中2種是專門用於Win CE的模型,另外2種外部模型來自其他的作業系統。
  • 基於VHDL/CPLD的I2C串行總線控制器設計及實現
    I2C總線用兩根信號線進行數據傳輸,一根為串行數據線(SDA),另一根為串行時鐘線(SCL)。I2C總線允許若干兼容器件(如存儲器、A/D轉換器、D/A轉換器、LCD驅動器等)共享總線。I2C總線理論上可以允許的最大設備數,是以總線上所有器件的總電容(其中包括連線本身的電容和連接端的引出電容)不超過400pF為限,總線上所有器件依靠SDA線發送的地址信號尋址,不需要片選線。
  • 現場總線的開關量 I/O 模塊的總體方案設計
    20世紀80年代以來,開放的工業控制總線迅速發展,在此基礎上通過網絡連接的分散控制和嵌入式設備的控制技術逐步發展成熟,遠程I/O就是在這種條件下發展的一類產品,開放和通用是其主要特徵。3.4系統軟體方案設計軟體設計主要包括嵌入式作業系統以及用戶應用程式,即嵌入式Linux作業系統環境的建立以及在此系統下進行應用程式的開發。
  • 嵌入式Win CE中CAN總線控制器的驅動設計與實現
    基於Win CE的兩種模型是本機的設備驅動程序和流接口的驅動程序;兩種外部模型用於通用串行總線(USB)和網絡驅動器接口標準(NDIS)驅動程序。下面針對Win CE系統下基於三星公司的ARM9內核晶片S3C2410的CAN總線控制器SJA1000,以流接口驅動程序形式進行設計。
  • 基於嵌入式Linux的語音識別系統硬軟體設計
    3.硬體電路設計方案  硬體電路主要包括語音識別部分、主控部分、超聲波測距部分和舵機控制部分,如圖2所示。處理器為三星公司的S3C2440,系統主頻最高可達533 MHz,支持SPI、I2C、UART等接口,能夠滿足控制系統的需求。主控晶片S3C2440通過SPI總線完成對語音識別模塊的讀寫操作,超聲波測距部分和舵機控制部分由處理器的GPIO進行統一控制。
  • 飛利浦推出業界首款快速模式I2C總線控制器
    控制器擴展了計算、通信和聯網應用中I2C總線的用途皇家飛利浦電子集團推出全球首款在400 kHz頻率和2.5-3.3V低壓下運行的並行到串行接口I2C總線控制器。PCA9564優化了多重I2C設備或SMus組件與微處理器、微控制器、數位訊號處理器(DSP)之間的連接。
  • 基於CAN總線的運動控制系統設計
    1.2 軟體結構 主節點軟體結構如圖3所示,U-Boot作為BootLoader(啟動引導程序),負責初始化目標板硬體與引導作業系統。這裡採用μCLinux作為嵌入式作業系統。μCLinux(microcontrol linux)即「微控制器領域中的Linux系統」,主要是針對目標處理器沒有存儲管理單元(MMU)的嵌入式系統而設計的。
  • 樹莓派怎樣連接多個I2C設備
    i2c總線可以處理多個設備,但是它們應具有不同的i2c地址。有些i2c設備具有用於設置其他i2c地址的跳線,但許多設備卻沒有。在這種情況下,您可以使用i2c多路復用器(硬體)來旋轉i2c SDA(數據)和SCL(時鐘),也可以創建其他i2c總線或更多。
  • I2C總線驅動在嵌入式系統中的兩種實現
    他通過串行數據線(Serial Data Lines,SDL)及串行時鐘線(Serial ClockLine,SCL)兩線在連接到總線上的器件之間傳送信息,並根據地址識別每個器件。一個或多個微控制器以及外圍器件可以通過I2C總線接口非常方便的連接在一起構成系統。這種總線結構的連線和連接引腳少,器件間總線簡單。
  • 舞蹈機器人步進電機驅動電路和程序設計
    我們利用了單片機的I/O埠,通過74373鎖 存,由74LS244驅動,ULN2003對信號進行放大。8個電機共用4bit I/O埠作為數據總線,向電機傳送步進脈衝。每個電機分配1bit的I/O埠用作74373鎖存信號,鎖存步進電機四相脈衝,經ULN2003放大到 12V驅動電機運轉。
  • Linux下的串口總線驅動(二)
    四.TTY層內核代碼TTY驅動程序有三種:控制臺、串口和pty。在此我們主要分析Mini2440串口驅動。,然後對其進行填充,初始的termios,並設置TTY驅動操作,最後註冊TTY驅動。我們接下來看看struct tty_operations uart_ops下的.ioctl也就是uart_ioctl。
  • I2C總線設計注意事項
    當時在使用avr CPU設計數據採集器產品的CPU主板,外掛了Silicon lab的溫溼度傳感器Si7013,實時時鐘,主要實現溫溼度、時鐘及電流電壓等信號通過I²C總線到達CPU進行處理,並且由MCU EFM32WG290F64控制在液晶上和上位機界面上的CPU自帶的I²C總線外掛的六個I²C從設備,如下圖1所示。
  • 嵌入式Linux設備驅動開發之:實驗內容——test驅動
    本文引用地址:http://www.eepw.com.cn/article/257106.htm1.實驗目的該實驗是編寫最簡單的字符驅動程序,這裡的設備也就是一段內存,實現簡單的讀寫功能,並列出常用格式的Makefile以及驅動的加載和卸載腳本。讀者可以熟悉字符設備驅動的整個編寫流程。