QSPI
介绍QSPI的功能和使用方法。
模块介绍
QSPI 是SoC和外设之间的一种串行接口总线(SPI),支持4x模式。SPI有主、从两种模式,通常一个主设备(Master)和一个或多个从设备(Slave)连接。主设备选择一个从设备进行通信,完成数据交互。主设备提供时钟,读写操作都由主设备发起。K3 QSPI暂时只支持主设备模式。
功能介绍

Linux spi驱动框架分为三部分: SPI core、SPI控制器驱动 和 SPI设备驱动。
SPI core主要作用:
- SPI总线和 spi_master 类注册
- SPI控制器添加和删除
- SPI设备添加和删除
- SPI设备驱动注册与注销
SPI控制器驱动:
- SPI Master控制器驱动,对SPI Master控制器进行操作
SPI设备驱动
- SPI Device驱动
源码结构介绍
控制器驱动代码位于 drivers/spi 目录下:
|-- spi-fsl-qspi.c #k3 qspi驱动
关键特性
特性
| 特性 | 特性说明 |
|---|---|
| 通信协议 | 支持SSP/SPI/MicroWire/PSP协议 |
| 通信频率 | 最高频率支持102MHz, 最低频率支持30MHz |
| 通信倍数 | x1/x2/x4 |
| 支持外设 | 支持spi-nor和spi-nand |
性能参数
通信频率
当前QSPI控制器最大支持102MHz,支持的通信频率列表:
- 30.72MHz
- 35.10MHz
- 40.96MHz
- 53.57MHz
- 68.26MHz
- 75MHz
- 81.92MHz
- 93.75MHz
- 98.3MHz
- 102.4MHz
通信倍速
QSPI 通信倍速支持 x1/x2/x4。
测试方法
可通过示波器或逻辑分析仪测试 SCK 信号频率,以确认通信倍速。
配置介绍
主要包括驱动使能配置和dts配置
CONFIG配置
- CONFIG_SPI 为SPI总线协议提供支持,默认值为
Y
Device Drivers
SPI support (SPI [=y])
- CONFIG_SPI_MEM 为简化操作SPI接口存储器设备提供支持,默认值为
Y
Device Drivers
SPI support (SPI [=y])
SPI memory extension (SPI_MEM [=y])
- CONFIG_SPI_FSL_QUADSPI 为 K3 QSPI 控制器驱动提供支持,默认值为
Y
Device Drivers
SPI support (SPI [=y])
Freescale QSPI controller (SPI_FSL_QUADSPI [=y])
dts配置
pinctrl
查看方案原理图,找到 QSPI 使用的 pin 组。可参考 PINCTRL里的 pin配置定义 小节,确定 QSPI 使用的 pin 组。
假设 QSPI 可以直接采用 k3_pinctrl.dtsi 中定义 pinctrl_qspi 组。
spi 设备配置
需要确认 SPI 设备类型,QSPI 与 SPI 设备通信频率和倍速。
设备类型
确认 QSPI 下连接的 SPI 设备类型,是 spi-nor 还是 spi-nand。
通信频率
QSPI 控制器和 SPI 设备最大通信速率。
当前 QSPI 控制器支持的通信频率列表见本文 性能参数 小节 的 通信频率 中的频率列表
spi 设备 dts
以 spi nor 为例,采用最大通信频率 30MHz,发送和接收都采用 x4 通信。
// 这里需要指定一下pin所需使用的电压,这里以1V8举例,更详细信息请参考pinctrl章节
&pinctrl {
qspi-cfg {
qspi-0-pins {
power-source = <1800>;
};
qspi-1-pins {
power-source = <1800>;
};
};
};
&qspi {
pinctrl-names = "default";
pinctrl-0 = <&qspi_cfg>;
status = "okay";
flash@0 {
compatible = "jedec,spi-nor";
reg = <0>;
spi-max-frequency = <30000000>;
m25p,fast-read;
spi-tx-bus-width = <4>;
spi-rx-bus-width = <4>;
broken-flash-reset;
status = "okay";
};
};
dts示例
spi-nor
综合上述信息,QSPI 连接 spi-nor flash,nor最大通信频率为 30MHz,且采用 x4 通信。
方案 dts 配置如下
&pinctrl {
qspi-cfg {
qspi-0-pins {
power-source = <1800>;
};
qspi-1-pins {
power-source = <1800>;
};
};
};
&qspi {
pinctrl-names = "default";
pinctrl-0 = <&qspi_cfg>;
status = "okay";
flash@0 {
compatible = "jedec,spi-nor";
reg = <0>;
spi-max-frequency = <30000000>;
m25p,fast-read;
spi-tx-bus-width = <4>;
spi-rx-bus-width = <4>;
broken-flash-reset;
status = "okay";
};
};
spi-nand
QSPI 连接 spi-nand flash,nand最大通信频率为30MHz,且采用 x4 通信。
方案 dts 配置可以参考 spi-nor,只用修改 flash 设备节点。
&pinctrl {
qspi-cfg {
qspi-0-pins {
power-source = <1800>;
};
qspi-1-pins {
power-source = <1800>;
};
};
};
&qspi {
pinctrl-names = "default";
pinctrl-0 = <&qspi_cfg>;
status = "okay";
flash@0 {
compatible = "spi-nand";
reg = <0>;
spi-max-frequency = <30000000>;
m25p,fast-read;
spi-tx-bus-width = <4>;
spi-rx-bus-width = <4>;
broken-flash-reset;
status = "okay";
};
};
接口介绍
API介绍
设备驱动注册与注销
int __spi_register_driver(struct module *owner, struct spi_driver *sdrv);
void spi_unregister_driver(struct spi_driver *sdrv);
数据传输API
- 初始化spi_message
void spi_message_init(struct spi_message *m);
- 添加spi_transfer到spi_message的transfer列表
void spi_message_add_tail(struct spi_transfer *t, struct spi_message *m);
- write数据
int spi_write(struct spi_device *spi, const void *buf, size_t len);
- read数据
int spi_read(struct spi_device *spi, void *buf, size_t len);
- 同步传输spi_message
int spi_sync(struct spi_device *spi, struct spi_message *message);
Debug介绍
sysfs
查看系统 SPI 总线设备和驱动信息 /sys/bus/spi
|-- devices // spi总线上的设备
|-- drivers // spi总线上注册的设备驱动
|-- drivers_autoprobe
|-- drivers_probe
`-- uevent
debugfs
用于查看系统中 SPI 设备信息 /sys/kernel/debug/spi-nor/spi4.0
|-- capabilities
`-- params
# cat capabilities
Supported read modes by the flash
1S-1S-1S
opcode 0x03
mode cycles 0
dummy cycles 0
1S-1S-1S (fast read)
opcode 0x0b
mode cycles 0
dummy cycles 8
1S-1S-2S
opcode 0x3b
mode cycles 0
dummy cycles 8
1S-2S-2S
opcode 0xbb
mode cycles 2
dummy cycles 2
1S-1S-4S
opcode 0x6b
mode cycles 0
dummy cycles 8
1S-4S-4S
opcode 0xeb
mode cycles 2
dummy cycles 4
4S-4S-4S
opcode 0xeb
mode cycles 2
dummy cycles 2
Supported page program modes by the flash
1S-1S-1S
opcode 0x02
# cat params
name gd25lq64c
id c8 60 17 c8 60 17
size 8.00 MiB
write size 1
page size 256
address nbytes 3
flags HAS_SR_TB | BROKEN_RESET | HAS_LOCK | HAS_16BIT_SR | NO_READ_CR | SOFT_RESET
opcodes
read 0xeb
dummy cycles 6
erase 0x20
program 0x02
8D extension none
protocols
read 1S-4S-4S
write 1S-1S-1S
register 1S-1S-1S
erase commands
20 (4.00 KiB) [1]
52 (32.0 KiB) [2]
d8 (64.0 KiB) [3]
c7 (8.00 MiB)
sector map
region (in hex) | erase mask | overlaid
------------------+------------+----------
00000000-007fffff | [ 1 ] | no
测试介绍
spi-nand/nor读写速率测试
打开CONFIG_MTD_TESTS
Device Drivers
Memory Technology Device (MTD) support (MTD [=y])
MTD tests support (DANGEROUS) (MTD_TESTS [=m])
测试命令
insmod mtd_speedtest.ko dev=0 #0表示spi-nand/nor的mtd设备号