全志R16_SPI匯流排驅動的使用文件

SZX511發表於2019-08-15

介紹Linux 核心中SPI 子系統的介面及使用方法,為SPI裝置驅動的開發提供參考。適用於基於Linux 3.4核心的全志R16硬體平臺。

2. 2. 模組介紹
2.1.  模組功能介紹
Linux 中 SPI 體系結構圖 2.1 所示,圖中用分割線分成了三個層次:
1. 使用者空間,包括所有使用 SPI 裝置的應用程式;
2. 核心,也就是驅動部分;
3. 硬體,指實際物理裝置,包括了 SPI 控制器和 SPI 外設。

其中,Linux 核心中的 SPI 驅動程式僅支援主裝置,邏輯上又可以分為 3 個部分:
1. SPI 核心(SPI Core):實現對 SPI 匯流排驅動及 SPI 裝置驅動的管理;
2. SPI 匯流排驅動(SPI Master Driver):針對不同型別的 SPI 控制器,實現對 SPI 匯流排訪問的具體方法;
3. SPI 裝置驅動(SPI Device Driver):針對特定的 SPI 裝置,實現具體的功能,包括 read,write 以及 ioctl 等對使用者層操作的介面。

SPI匯流排驅動主要實現了適用於特定SPI控制器的匯流排讀寫方法,並註冊到Linux核心的SPI架構,SPI外設就可以透過SPI架構完成裝置和匯流排的適配。但是匯流排驅動本身並不會進行任何的通訊,它只是提供通訊的實現,等待裝置驅動來呼叫其函式。

SPI Core的管理正好遮蔽了SPI匯流排驅動的差異,使得SPI裝置驅動可以忽略各種匯流排控制器的不同,不用考慮其如何與硬體裝置通訊的細節。

2.2. 相關術語介紹
Sunxi 指Allwinner 的一系列 SOC 硬體平臺
SPI:Serial Peripheral Interface,同步序列外設介面
SPI Master:SPI 主裝置
SPI Device:指 SPI 外部裝置

2.3. 模組配置介紹
2.3.1 sys_config.fex sys_config.fex 配置說明
在不同的 Sunxi 硬體平臺中,SPI 控制器的數目也不同,但對於每一個 SPI 控制器來說,
在 sys_config.fex 中配置引數相似,如下:
[spi0]
spi_used = 1
spi_cs_bitmap = 1
spi_cs0 = port:PC27<3><1><default><default>
spi_sclk = port:PC02<3><default><default><default>
spi_mosi = port:PC00<3><default><default><default>
spi_miso = port:PC01<3><default><default><default>

其中:
1. spi_used 置為 1 表示使能,0 表示不使能;
2. spi_cs_bitmap,由於 SPI 控制器支援多個 CS,這一個參數列示 CS 的掩碼;
3. spi_cs0、spi_sclk、spi_mosi 和 spi_miso 用於配置相應的 GPIO。
對於 SPI 裝置,還需要透過以下引數配置 SPI board info,這些資訊會透過 SPI 子系統的介面 spi_register_board_info()在 SPI 匯流排驅動初始化前就註冊到核心中。

[spi_devices]
spi_dev_num = 1
[spi_board0]
modalias = "m25p32"
max_speed_hz = 33000000
bus_num = 0
chip_select = 0
mode = 0

其中:
1. spi_dev_num 表示 SPI 裝置的數目,決定了下面有幾個[spi_boardx];
2. modalias,SPI 裝置的名字,在做匯流排適配時會用到;
3. max_speed_hz,最大傳輸速度,單位是 Hz;
4. bus_num,SPI 控制器的序號,從 0 開始編號;
5. chip_select,理論上可以選 0,1,2,3,取決於硬體的 CS 連線
6. mode,即 spi_board_info 結構中的 mode 成員,其定義同 spi_device 中的 mode

#define SPI_CPHA 0x01 /* clock phase */

#define SPI_CPOL 0x02 /* clock polarity */

#define SPI_MODE_0 (0|0) /* (original MicroWire) */

#define SPI_MODE_1 (0|SPI_CPHA)

#define SPI_MODE_2 (SPI_CPOL|0)

#define SPI_MODE_3 (SPI_CPOL|SPI_CPHA)

#define SPI_CS_HIGH 0x04 /* chipselect active high? */

#define SPI_LSB_FIRST 0x08 /* per-word bits-on-wire */

#define SPI_3WIRE 0x10 /* SI/SO signals shared */

#define SPI_LOOP 0x20 /* loopback mode */

#define SPI_NO_CS 0x40 /* 1 dev/bus, no chipselect */

#define SPI_READY 0x80 /* slave pulls low to pause */


來源:

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/31529038/viewspace-2653738/,如需轉載,請註明出處,否則將追究法律責任。

相關文章