Linux系統SPI驅動學習筆記(二)

五. SPI驅動的軟件架構

在內核的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設備。

個人理解,對應的SPI控制器驅動程序即spi-imx.c,SPI通過接口封裝層即spi.c,SPI協議驅動程序類似攝像頭驅動,SPI通用設備驅動程序是spidev.c。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章