介绍

架构

SPI 驱动遵循 Linux 框架:spi-dev.cspi-mem.cspi.c。SPI 软件架构如下图所示。

../../rst_linux/8_spi/figures/spi_software_arch.svg

有关 linux SPI 的更多细节请参考 spi v5.4spi v6.6

实现

SPI 驱动的实现如下表所列:

驱动程序位置

介绍

<linux>/drivers/rtkdrivers/spi/Kconfig

通用 SPI 驱动程序 Kconifg

<linux>/drivers/rtkdrivers/spi/Makefile

通用 SPI 驱动程序 Makefile

<linux>/drivers/rtkdrivers/spi/spi-realtek-general.c

通用 SPI 函数

<linux>/drivers/rtkdrivers/spi/spi-realtek-general.h

SPI相关的函数声明、宏定义、结构定义和引用的其他头文件。

配置

设备树配置

SPI 设备树属性

spi0: spi0@0x400E8000 {
   compatible = "realtek,ameba-spi";
   rtk,spi-index = <0>;
   reg = <0x400E8000 0x100>,
   <0x41000000 0x30>; // reg base for spi role setting.
   interrupts = <GIC_SPI 40 IRQ_TYPE_LEVEL_HIGH>;
   clocks = <&rcc RTK_CKE_SPI0>;
   clock-names = "rtk_spi_clk";
   spi-max-frequency = <100000000>;
   spi-deactivate-delay = <0>;
   rtk,spi-for-kernel = <0>;
   rtk,spi-slave-mode = <0>;
   rtk,spi-dma-en = <0>;
   dmas = <&dma 16>,<&dma 17>;
   dma-names = "spi0-tx","spi0-rx";
   rtk,spi-master-poll-mode = <0>;
   rtk,spi-default-cs = <0>;
   rtk,max-cs-num = <2>;
   //only master mode set SPI_CS to GPIO, so spi0_pins only set SPI0_CLK, SPI0_MOSI and SPI0_MISO.
   rtk,spi-cs-gpios = <&gpiob 17 0>;
   status = "disabled";
};

SPI 设备树配置如下表所列。

属性

描述

可配置?

compatible

SPI驱动程序的描述符: "realtek,ameba-spi"

reg

SPI设备的硬件地址和大小: <0x400E8000 0x100>

用于SPI角色设置的硬件地址: <0x41000000 0x30>

interrupts

SPI设备的GIC号: <GIC_SPI 40 IRQ_TYPE_LEVEL_HIGH>

clocks

SPI设备的时钟: <&rcc RTK_CKE_SPI0>

spi-max-frequency

SPI设备的最大频率 <100000000>

spi-deactivate-delay

SPI停用的延时时间。默认值:0

rtk,spi-for-kernel

如果SPI控制器已注册到内核设备,请在子节点探测中注册板信息

0/1

rtk,spi-slave-mode

  • 0: SPI主机

  • 1: SPI从机

0/1

rtk,spi-dma-en

  • 0: CPU 传输

  • 1: DMA 传输

为1,dmas = <&dma 3> 表示分配给SPI的物理通道,dma-names = "dma_spi" 表示DMA通道名称
为0,dmas和dma-names是无用的参数

0/1

rtk,spi-master-poll-mode

  • 0: 中断模式

  • 1: 轮询模式

0/1

rtk,spi-default-cs

如果芯片没有特别选择,它将是默认芯片。默认值:0

rtk,max-cs-num

芯片的最大数量。默认值:2

rtk,spi-clk-divider

用此值分频时钟。值越大,SPI传输速度越慢

rtk,spi-cs-gpios

用于SPI的GPIO

status

是否启用设备

  • disabled

  • okay

SPI Pinmux

SPI 的引脚分配如下所示。

SPI 设备

端口名称

引脚名称

pinctrl 描述

SPI0

PA13

MOSI

需手动添加

SPI0

PA14

MISO

需手动添加

SPI0

PA15

SCLK

需手动添加

SPI0

PA26

CS

需手动添加

SPI0

PB4

MOSI

需手动添加

SPI0

PB3

MISO

需手动添加

SPI0

PB6

SCLK

需手动添加

SPI0

PB5

CS

需手动添加

SPI0

PB19

MOSI

<&spi0_pins>

SPI0

PB20

MISO

<&spi0_pins>

SPI0

PB18

SCLK

<&spi0_pins>

SPI0

PB17

CS

<&spi0_pins>

SPI0

PB29

MOSI

需手动添加

SPI0

PB30

MISO

需手动添加

SPI0

PB31

SCLK

需手动添加

SPI0

PC0

CS

需手动添加

SPI1

PA5

MOSI

<&spi1_pins>

SPI1

PA4

MISO

<&spi1_pins>

SPI1

PA3

SCLK

<&spi1_pins>

SPI1

PA2

CS

<&spi1_pins>

SPI1

PA9

MOSI

需手动添加

SPI1

PA10

MISO

需手动添加

SPI1

PA11

SCLK

需手动添加

SPI1

PA12

CS

需手动添加

SPI1

PA28

MOSI

需手动添加

SPI1

PA29

MISO

需手动添加

SPI1

PA26

SCLK

需手动添加

SPI1

PA27

CS

需手动添加

SPI1

PB10

MOSI

需手动添加

SPI1

PB11

MISO

需手动添加

SPI1

PB12

SCLK

需手动添加

SPI1

PB13

CS

需手动添加

SPI1

PB28

MOSI

需手动添加

SPI1

PB27

MISO

需手动添加

SPI1

PB25

SCLK

需手动添加

SPI1

PB26

CS

需手动添加

可以根据具体情况修改 Pinmux。有关详细信息,请参阅 pinctrl 说明文档。

SPI 组

SPI 组有两个名为 spi0 和 spi1 的 SPI 设备。这两个 SPI 设备的用法是相同的。

aliases {
   spi0 = "/ocp/spi0@0x400E8000";
   spi1 = "/ocp/spi1@0x400E9000";
};

编译配置

选择 Device Drivers > Drivers for Realtek > SPI General Controller

../../rst_linux/8_spi/figures/spi_general_controller_driver.png

APIs

用户空间 API

主机模式

提供给用户空间的 SPI 接口位于 <linux>/drivers/spi/spi-dev.c

以下是一些常用的 API,用于控制 SPI 设备:

接口

介绍

spidev_open

打开SPI设备

spidev_release

释放SPI设备

spidev_ioctl

配置SPI参数,控制读写SPI数据

spidev_write

调用SPI驱动程序发送消息

spidev_read

调用SPI驱动程序读取消息

更多细节请参考 spidev v5.4spidev v6.6

用户空间的 SPI 演示位于 <test>/spi

从机模式

用户空间中 SPI 从设备的接口与主设备模式相同。要使用 SPI 从设备模式,只需在设备树中更改主/从模式,具体说明请参见 DTS Configuration

SPI 从设备模式和 SPI 主设备模式的使用方法是相同的。要使用 SPI 从设备模式,请在设备树中设 rtk, spi-slave-mode = 1,具体说明请参见 DTS Configuration。否则,将 rtk, spi-slave-mode = 0 设置为主设备模式。

内核空间 API

主机模式

内核空间的 SPI 接口在 <linux>/include/linux/spi/spi.h 中描述。

接口

介绍

spi_sync_transfer

同步SPI数据传输

spi_write

SPI同步写入

spi_read

SPI同步读取

spi_write_then_read

这会复制txbuf和rxbuf数据;仅用于小型传输!

更多细节请参考 spidev v5.4spidev v6.6

从机模式

内核空间中 SPI 从设备的接口与主设备模式相同。要使用 SPI 从设备模式,只需在设备树中更改主/从模式,具体说明请参见 DTS Configuration

SPI 从设备模式和 SPI 主设备模式的用法是相同的。要使用 SPI 从设备模式,可以在设备树中设 rtk, spi-slave-mode = 1,具体说明请参见 DTS Configuration。否则,将 rtk, spi-slave-mode = 0 设置为主设备模式。