介绍
架构
SPI 驱动遵循 Linux 框架:spi-dev.c
、spi-mem.c
、spi.c
。SPI 软件架构如下图所示。
实现
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驱动程序的描述符: |
否 |
reg |
SPI设备的硬件地址和大小: 用于SPI角色设置的硬件地址: |
否 |
interrupts |
SPI设备的GIC号: |
否 |
clocks |
SPI设备的时钟: |
否 |
spi-max-frequency |
SPI设备的最大频率 |
否 |
spi-deactivate-delay |
SPI停用的延时时间。默认值:0 |
是 |
rtk,spi-for-kernel |
如果SPI控制器已注册到内核设备,请在子节点探测中注册板信息 |
0/1 |
rtk,spi-slave-mode |
|
0/1 |
rtk,spi-dma-en |
为1,
dmas = <&dma 3> 表示分配给SPI的物理通道,dma-names = "dma_spi" 表示DMA通道名称为0,dmas和dma-names是无用的参数
|
0/1 |
rtk,spi-master-poll-mode |
|
0/1 |
rtk,spi-default-cs |
如果芯片没有特别选择,它将是默认芯片。默认值:0 |
是 |
rtk,max-cs-num |
芯片的最大数量。默认值:2 |
是 |
rtk,spi-clk-divider |
用此值分频时钟。值越大,SPI传输速度越慢 |
是 |
rtk,spi-cs-gpios |
用于SPI的GPIO |
是 |
status |
是否启用设备
|
是 |
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";
};
编译配置
选择
:
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.4 或 spidev 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.4 或 spidev v6.6 。
从机模式
内核空间中 SPI 从设备的接口与主设备模式相同。要使用 SPI 从设备模式,只需在设备树中更改主/从模式,具体说明请参见 DTS Configuration。
SPI 从设备模式和 SPI 主设备模式的用法是相同的。要使用 SPI 从设备模式,可以在设备树中设 rtk, spi-slave-mode = 1
,具体说明请参见 DTS Configuration。否则,将 rtk, spi-slave-mode = 0
设置为主设备模式。