0%

Linux驱动之SPI子系统

Linux SPI驱动框架

对于SPI的驱动框架与I2C是大致一致的,也分为两层,控制器驱动程序层叫 spi_controller ,主要提供transfer函数,进行spi协议的收发。

另一层是设备驱动层,基于 spi_bus_type,在driver里则使用spi_read、spi_writer 等函数,最终也会调用到 controller->transfer 函数进行发送接收。

数据结构

整体数据结构如下:原图

  • spi_controller结构体用于描述一个spi控制器,可以类比iic的i2c_adapt
  • spi_device结构体用于描述一个spi设备,可以类比于i2c_client结构体

spi_device结构里有个mode很重要下面是其详细描述,SPI模式主要有两个特征:

  • CPOL:这是时钟极性
    • 0:初始时钟状态为低电平,第一个时钟边沿是上升沿
    • 1:初始时钟状态为高电平,第一个时钟边沿是下降沿
  • CPHA:这是时钟相位,选择在哪个边沿采样数据
    • 0:数据在下降沿锁存,输出在上升沿改变
    • 1:数据在上升沿锁存,并在下降沿输出

这有四种SPI模式,如下:

  • spi_driver用于驱动spi设备,可以类比i2c_driver结构体
  • spi_message用于描述spi传输的消息,由多个spi_transfer段组成,可以类比i2c_message结构体
  • spi_transfer代表一个读写缓冲对,包含接收缓冲区及发送缓冲区,其实,spi_transfer的发送是通过构建spi_message实现,通过将spi_transfer中的链 transfer_list链接到spi_message中的transfers,再以spi_message形势向底层发送数据

实现

关于spi的实现其实也是分为controller和设备及设备驱动这三部分,controller一般由soc厂商编写好了驱动通过spi_register_controller向内核注册一个controller设备并挂载在spi_bus总线下,而device和device_driver的实现根platform或iic的实现也是大同小异,这里不做详细的分析了,感兴趣的可以查看内核源码。

参考文献

https://www.wikiwand.com/zh-cn/%E5%BA%8F%E5%88%97%E5%91%A8%E9%82%8A%E4%BB%8B%E9%9D%A2
https://blog.csdn.net/lizuobin2/article/details/51735963
https://blog.csdn.net/zhoutaopower/article/details/99866773
《Linux设备驱动开发》