SPI子系統分析之一 框架

2021-08-08 13:02:17 字數 1661 閱讀 9787

核心版本:3.9.5

spi子系統概述:

乙個spi主控制器對應一條spi匯流排,當然在系統中有唯一的匯流排編號.

spi匯流排上有兩類裝置:

主控端是spi匯流排的控制者,通過使用spi協議主動發起spi匯流排上的會話.而受控端則被動接受spi主控端的指令,並作出響應的響應.

linux目前只支援spi主控端,不能支援spi受控端裝置.

linux中的spi子系統向下直接和spi主控裝置硬體互動,讀取spi匯流排上的資料.向上則和fs子系統,mtd子系統,字元裝置子系統等等互動,給使用者空間提供訪問介面.

在spi子系統中,包含兩類裝置驅動:

由此可見,spi子系統中有兩種裝置,一種是controller driver驅動的,稱之為spi_master.另一種是由protocol driver驅動的,稱之為spi_device(個人覺得這種稱法不太準確,這個裝置只是協議解析裝置,而非真正的spi裝置).

linux的spi子系統之所以採用將主機和外設分離的思想,是因為spi主控器功能單一,只負責和spi匯流排互動,讀寫資料.但資料的具體含義,根據spi匯流排上的裝置不同,而千差萬別.首先主機spi控制器是一種平台裝置,它以platform的方式註冊進核心,外設的資訊是以boardinfo形式靜態定義的,在建立spi_master時,會根據外設的bus_num和主機的bus_num是否相等,來選擇是否將該外設掛接在該spi主控制器下.

核心一方面把spi通訊系統分成上面兩個部分,另一方面建立了乙個spi核心系統,用於聯接這兩部分.

根據上面的分析我們知道,spi通訊的資料流大致是:

其中protocol和controller之間的互動中,spi幀是乙個比較關鍵的資料結構.protocol通過分析上層請求生成這種幀,並且解析這種幀得到spi裝置的響應的結果.controller通過和spi匯流排互動,收發這樣的幀.在linux核心中,這個幀通過乙個叫做spi_message的結構來實現.

在有資料請求時,protocol解析請求生成這個幀,併發送到spi核心子系統.spi核心子系統通過protocol裝置的資訊,找到對應的controller裝置,並將這個幀傳送給controller.controller接受到這個幀後傳送到spi匯流排上,返程類似.

spi_master/spi_device和spi_driver的關係如下:

同時,spi裝置和驅動的對應關係如下:

結合上文介紹可知,spi_master是以platform_device註冊進核心的,系統會尋找其相應的platform_driver與其進行匹配,這其實就對應我們的controller driver.

而spi核心層所做的工作就是將這些與平台相關的部分抽象概括,抽象出所有控制器都具備的功能**,同時向上為spiprotocol驅動提供介面比如spi_message,spi_transfer,spi_async等,具體可參見linux/spi/spi.h檔案.

本文引用:

pinctrl子系統分析(一)

pinctrl子系統分析 一 pinctrl子系統分析 二 pinctrl子系統分析 三 許多soc的內部都包含了pin控制器,通過pin控制器,我們可以匹配引腳的狀態和功能特性。在了解pinctrl子系統之前,我們先來了解一些基本的概念。soc的很多引腳都可以配置成不同的功能,如a1和a2兩個引腳...

framebuffer 子系統分析

fb info screen base dma alloc writecombine fbi dev,map size,map dma,gfp kernel fb info screen base 是framebuffer起始虛擬位址,也就是mmap後程式寫入fb的位址,該位址會直接寫入到fb in...

framebuffer 子系統分析

come from struct fb info ranges 0 apertures struct fb var screeninfo struct fb fix screeninfo 這兩個結構體分別記錄了顯示器可以修改和不可修改的資訊,這些資料成員需要在驅動程式中初始化。其中fix.visua...