Linux內核SPI子系統架構分析

     

    SPI總線上有兩類設備:一類是主控端,通常作爲SOC系統的一個子模塊出現,比如很多嵌入式MPU中都常常包含SPI模塊。一類是受控端,例如一些SPI接口的Flash、傳感器等等。主控端是SPI總線的控制者,通過使用SPI協議主動發起SPI總線上的會話。而受控端則被動接受SPI主控端的指令,並作出響應的響應。

    Linux目前只支持SPI主控端,不能支持SPI受控端設備。

    Linux中的SPI是依靠SPI子系統實現的。這個子系統向下直接和SPI主控設備硬件交互,讀取SPI總線上的數據。向上則和FS子系統、MTD子系統、字符設備子系統等等交互,給用戶空間提供訪問接口。

    在SPI子系統中,包含兩類設備驅動。一類稱之爲Controllerdriver,用於驅動SPI主控設備,以和SPI總線交互,讀寫通信數據。另一類稱之爲Protocoldriver,用於解析Controllerdriver讀取的數據,形成有意義的協議數據。舉例來說,將AT25芯片通過SPI總線和LPC3250SPI控制器聯接在一起,構成一個SPI總線通信系統。Protocoldriver的作用,就是根據用戶空間或者上層子系統的請求,(比如讀寫Flash指定地址出的數據),找到對應的SPI指令,並生成一個SPI會話幀(指令+地址+數據)數據。Controllerdriver的作用,就是將這個會話幀的數據通過SPI控制器的硬件,發到SPI總線上去。

    由此可見,SPI子系統中有兩種設備,一種是Controllerdriver驅動的,稱之爲spi_master。另一種是由Protocoldriver驅動的,稱之爲spi_device(個人覺得這種稱法不太準確,這個設備只是協議解析設備,而非真正的spi設備)。

    內核之所以把SPI子系統這麼劃分,是因爲SPI主控器功能單一,只負責和SPI總線交互,讀寫數據。但數據的具體含義,根據SPI總線上的設備不同,而千差萬別。

    內核一方面把SPI通信系統分成上面兩個部分,另一方面創建了一個spi核心系統,用於聯接這兩部分。

根據上面的分析我們知道,SPI通信的數據流大致是:
    1
、用戶請求=>Protocoldriver分析請求,生成SPI通信幀=>Controllerdriver將通信幀發送到SPI總線上;
    2
SPI設備傳回數據=>ControllerdriverSPI總線上讀回=>Protocol解析通信數據並上報;

其中ProtocolController之間的交互中,SPI幀是一個比較關鍵的數據結構。Protocol通過分析上層請求生成這種幀,並且解析這種幀得到SPI設備的響應的結果。Controller通過和SPI總線交互,收發這樣的幀。在Linux內核中,這個幀通過一個叫做spi_message的結構來實現。

    在有數據請求時,Protocol解析請求生成這個幀,併發送到SPI核心子系統。SPI核心子系統通過Protocol設備的信息,找到對應的Controller設備,並將這個幀發送給ControllerController接受到這個幀後發送到SPI總線上。返程類似。

    關於SPIControllerProtocol這兩種設備以及SPI核心子系統相互之間是如何工作的,請參考下一篇《Linux內核SPI子系統實現分析》。

轉自:http://jianbo.de/b/archives/918


發佈了29 篇原創文章 · 獲贊 55 · 訪問量 19萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章