在本文中, 我们将介绍关于 spi-mem Linux 内核框架的工作, 该框架将允许在 SPI NOR 设备和常规 SPI 设备以及 SPI NAND 设备上复用 SPI 控制器驱动程序.
从 SPI 到双线, 四线, 八线 SPI
在过去, SPI 是一个简单的协议, 总线上的所有设备只共享 3 根信号线:
MISO: Master In Slave Out, 主设备输入从设备输出线
MOSI: Master Out Slave In, 主设备输出从设备输入线
SCLK: Serial Clock, 时钟线
另外每个设备有一个独立信号线, 用于选择我们想要通信的设备:
SS: Slave Select, 从设备选择线 (有时也称为片选线 CS,Chip Select)
但随后 SPI 存储出现了. 它从较小且相对较慢的 SPI NORs 开始, 如 dataflash,EEPROMs 和 SRAMs, 然后逐渐发展到较大的 SPI NORs 和 SPI NANDs. 像往常一样, 当涉及到处理存储时, 我们希望得到最佳性能表现. SPI 总线的限制很快成为瓶颈, 因此供应商决定添加更多的 I/O 线路, 并使 MISO/MOSI 线可以双向通信. 现在我们看到 SPI 控制器支持最多 8 路 I/O. 这就是业内所说的 DualSPI QuadSPI 和 OctoSPI.
为了在主从设备的数据传输中用上所有的 I/O 线, 必须有某种主从设备之间的协议, 这样双方才能知道, 何时可以在 I/O 线上收发数据, 应该使用多少根 I/O 线等. 这些由一组从设备预定义的操作规定了如何进行, 主设备必须遵循这组操作的规定, 进入特定的发送或接收状态. SPI 存储器操作通常包括:
1 字节的操作码, 表示将要进行从操作 (未来将很快会将出现 2 字节的操作码, 请做好准备)
0-N 字节的地址, 其含义取决于操作码(可以是绝对内存地址, 或其他含义)
0-N 字节的哑字节, 使得从设备有足够的时间来进入操作码请求的特定状态, 同样, 哑字节的数量时取决于操作码的
0-N 字节的输入或输出数据, 方向是取决于操作码
请注意, 虽然这个协议倾向于被用于存储设备, 但并没有什么能限制它只能用于存储设备, 如果一些 FPGA 使用相同的协议来操作非存储设备, 我也不会感到惊讶.
来源: https://www.cnblogs.com/zqb-all/p/10810054.html