Linux核心SPI子系統架構分析(清晰)
SPI匯流排上有兩類裝置:一類是主控端,通常作為SOC系統的一個子模組出現,比如很多嵌入式MPU中都常常包含SPI模組。一類是受控端,例如一些SPI介面的Flash、感應器等等。主控端是SPI匯流排的控制者,通過使用SPI協議主動發起SPI匯流排上的會話。而受控端則被動接受 SPI主控端的指令,並作出響應的響應。
Linux目前只支援SPI主控端,不能支援SPI受控端裝置。
Linux中的SPI是依靠SPI子系統實現的。這個子系統向下直接和SPI主控裝置硬體互動,讀取SPI匯流排上的資料。向上則和FS子系統、MTD子系統、字元裝置子系統等等互動,給使用者空間提供提供者。
在SPI子系統中,包含兩類裝置驅動。一類稱之為Controller driver,用於驅動SPI主控裝置,以和SPI匯流排互動,讀寫通訊資料。另一類稱之為Protocol driver,用於解析Controller driver讀取的資料,形成有意義的協議資料。舉例來說,將AT25晶片通過SPI匯流排和LPC3250的SPI控制器聯結在一起,構成一個SPI匯流排通訊系統。Protocol driver的作用,就是根據使用者空間或者上層子系統的請求,(比如讀寫Flash指定地址出的資料),找到對應的SPI指令,並產生一個SPI會話幀(指令+地址+資料)資料。Controller
driver的作用,就是將這個會話幀的資料通過SPI控制器的硬體,發到SPI匯流排上去。
由此可見,SPI子系統中有兩種裝置,一種是Controller driver驅動的,稱之為spi_master。另一種是由Protocol driver驅動的,稱之為spi_device(個人覺得這種稱法不太準確,這個裝置只是協議解析裝置,而非真正的spi裝置)。
核心之所以把SPI子系統這麼劃分,是因為SPI主控器功能單一,只負責和SPI匯流排互動,讀寫資料。但資料的具體含義,根據SPI匯流排上的裝置不同,而千差萬別。
核心一方面把SPI通訊系統分成上面兩個部分,另一方面建立了一個spi核心系統,用於聯結這兩部分。
根據上面的分析我們知道,SPI通訊的資料流大致是:
1、使用者請求=>Protocol driver分析請求,產生SPI通訊幀=>Controller driver將通訊幀發送到SPI匯流排上;
2、SPI裝置傳回資料=>Controller driver從SPI匯流排上讀回=>Protocol解析通訊資料並上報;
其中Protocol和Controller之間的互動中,SPI幀是一個比較關鍵的資料結構。Protocol通過分析上層請求產生這種幀,並且解析這種幀得到SPI裝置的響應的結果。Controller通過和SPI匯流排互動,收發這樣的幀。在Linux核心中,這個幀通過一個叫做 spi_message的結構來實現。
在有資料請求時,Protocol解析請求產生這個幀,並發送到SPI核心子系統。SPI核心子系統通過Protocol裝置的資訊,找到對應的 Controller裝置,並將這個幀發送給Controller。Controller接受到這個幀後發送到SPI匯流排上。返程類似。
關於SPI Controller和Protocol這兩種裝置以及SPI核心子系統相互之間是如何工作的,請參考下一篇《Linux核心SPI子系統實現分析》。