1. 程式人生 > >Linux SPI匯流排和裝置驅動架構之一:系統概述

Linux SPI匯流排和裝置驅動架構之一:系統概述

SPI是"Serial Peripheral Interface" 的縮寫,是一種四線制的同步序列通訊介面,用來連線微控制器、感測器、儲存裝置,SPI裝置分為主裝置和從裝置兩種,用於通訊和控制的四根線分別是:

  • CS    片選訊號
  • SCK  時鐘訊號
  • MISO  主裝置的資料輸入、從裝置的資料輸出腳
  • MOSI  主裝置的資料輸出、從裝置的資料輸入腳
因為在大多數情況下,CPU或SOC一側通常都是工作在主裝置模式,所以,目前的Linux核心版本中,只實現了主模式的驅動框架。

/*****************************************************************************************************/
宣告:本博內容均由

http://blog.csdn.net/droidphone原創,轉載請註明出處,謝謝!
/*****************************************************************************************************/

硬體結構

通常,負責發出時鐘訊號的裝置我們稱之為主裝置,另一方則作為從裝置,下圖是一個SPI系統的硬體連線示例:

                                            圖1.1    SPI硬體結構圖 如上圖所示,主裝置對應SOC晶片中的SPI控制器,通常,一個SOC中可能存在多個SPI控制器,像上面的例子所示,SOC晶片中有3個SPI控制器。每個控制器下可以連線多個SPI從裝置,每個從裝置有各自獨立的CS引腳。每個從裝置共享另外3個訊號引腳:SCK、MISO、MOSI。任何時刻,只有一個CS引腳處於有效狀態,與該有效CS引腳連線的裝置此時可以與主裝置(SPI控制器)通訊,其它的從裝置處於等待狀態,並且它們的3個引腳必須處於高阻狀態。

工作時序

按照時鐘訊號和資料訊號之間的相位關係,SPI有4種工作時序模式:
我們用CPOL表示時鐘訊號的初始電平的狀態,CPOL為0表示時鐘訊號初始狀態為低電平,為1表示時鐘訊號的初始電平是高電平。另外,我們用CPHA來表示在那個時鐘沿取樣資料,CPHA為0表示在首個時鐘變化沿取樣資料,而CPHA為1則表示要在第二個時鐘變化沿來取樣資料。核心用CPOL和CPHA的組合來表示當前SPI需要的工作模式:
  • CPOL=0,CPHA=1        模式0
  • CPOL=0,CPHA=1        模式1
  • CPOL=1,CPHA=0        模式2
  • CPOL=1,CPHA=1        模式3

軟體架構

在核心的SPI驅動的軟體架構中,進行了合理的分層和抽象,如下圖所示:

                                 圖2.1    SPI驅動的軟體架構

SPI控制器驅動程式

SPI控制器不用關心裝置的具體功能,它只負責把上層協議驅動準備好的資料按SPI匯流排的時序要求傳送給SPI裝置,同時把從裝置收到的資料返回給上層的協議驅動,因此,核心把SPI控制器的驅動程式獨立出來。SPI控制器驅動負責控制具體的控制器硬體,諸如DMA和中斷操作等等,因為多個上層的協議驅動可能會通過控制器請求資料傳輸操作,所以,SPI控制器驅動同時也要負責對這些請求進行佇列管理,保證先進先出的原則。

SPI通用介面封裝層

為了簡化SPI驅動程式的程式設計工作,同時也為了降低協議驅動程式和控制器驅動程式的耦合程度,核心把控制器驅動和協議驅動的一些通用操作封裝成標準的介面,加上一些通用的邏輯處理操作,組成了SPI通用介面封裝層。這樣的好處是,對於控制器驅動程式,只要實現標準的介面回撥API,並把它註冊到通用介面層即可,無需直接和協議層驅動程式進行互動。而對於協議層驅動來說,只需通過通用介面層提供的API即可完成裝置和驅動的註冊,並通過通用介面層的API完成資料的傳輸,無需關注SPI控制器驅動的實現細節。

SPI協議驅動程式

上面我們提到,控制器驅動程式並不清楚和關注裝置的具體功能,SPI裝置的具體功能是由SPI協議驅動程式完成的,SPI協議驅動程式瞭解裝置的功能和通訊資料的協議格式。向下,協議驅動通過通用介面層和控制器交換資料,向上,協議驅動通常會根據裝置具體的功能和核心的其它子系統進行互動,例如,和MTD層互動以便把SPI介面的儲存裝置實現為某個檔案系統,和TTY子系統互動把SPI裝置實現為一個TTY裝置,和網路子系統互動以便把一個SPI裝置實現為一個網路裝置,等等。當然,如果是一個專有的SPI裝置,我們也可以按裝置的協議要求,實現自己的專有協議驅動。

SPI通用裝置驅動程式

有時候,考慮到連線在SPI控制器上的裝置的可變性,在核心沒有配備相應的協議驅動程式,對於這種情況,核心為我們準備了通用的SPI裝置驅動程式,該通用裝置驅動程式向用戶空間提供了控制SPI控制的控制介面,具體的協議控制和資料傳輸工作交由使用者空間根據具體的裝置來完成,在這種方式中,只能採用同步的方式和SPI裝置進行通訊,所以通常用於一些資料量較少的簡單SPI裝置。