驱动_spi驱动框架

spi驱动


 Spi总线上可以挂MMC、SD,flash、wifi网卡等常见设备。

应用


(从设备驱动层)

spi_driver层

 (自己编写)


 (核心层)

           

spi_core层                                 spi_bus_type

        

 (spi_core.c)


  (控制器层)

spi_adapter层                                      

 (spi_xxx.c)


 硬件

<结构体>


struct spi_message:就是对多个spi_transfer的封装.spi_message用来原子的执行spi_transfer表示的一串数组传输请求.这个传输队列是原子的,这意味着在这个消息完成之前不会有其它消息占用总线.消息的执行总是按照FIFO的顺序.向底层提交spi_message的代码要负责管理它的内存空间.未显示初始化的内存需要使用0来初始化.为spi_transfer和spi_message分配的内存应该在消息处理期间保证是完整的。

struct spi_message {

  struct list_head transfers; 

 /*此次消息的传输段(spi_transfer)队列,一个消息可以包含多个传输段*/

  struct spi_device *spi;

 /*传输的目的设备,无论如何这里都是spi从设备,至于数据流向(是从主机到从设备还是从从设备到主机)这是由write/read
  每个传输段(spi_transfer)内部的tx_buf或者是rx_buf决定的*/

  unsigned is_dma_mapped:1;

 /*如果为真,此次调用提供dma和cpu虚拟地址.spi主机提供了dma缓存池.如果此消息确定要使用dma(那当然更好
  了).则从那个缓存池中申请高速缓存.替代传输段(spi_transfer)中的tx_buf/rx_buf*/

  void (*complete)(void*context);

 /*用于异步传输完成时调用的回调函数*/

  void *context; 

 /*回调函数的参数*/

  unsigned actual_length;

 /*此次传输的实际长度,这个长度包括了此消息spi_message中所有传输段spi_transfer传输的长度之和(不管每个传
  输段spi_transfer到底是输入还是输出,因为本来具体的传输就是针对每一个传输段spi_transfer来进行的)*/

  int status;

 /*执行的结果.成功被置0,否则是一个负的错误码*/

  struct list_head queue;

 /*用于将该message链入bitbang等待队列*/

  void *state;

};

struct spi_device用来描述一个SPI从设备信息

SPI子系统只支持主模式,也就是说SOC上的SPI只能工作在master模式,外围设备只能为slave模式
struct spi_device {
  struct device dev;
  struct spi_master *master;  //对应的控制器指针
  u32 max_speed_hz;      //spi传输时钟
  u8 chip_select;    //片选号,用来区分同一主控制器上的设备
  u8 mode;  //各bit的定义如下,主要是传输模式/片选极性
  #define SPI_CPHA 0x01   /* clock phase */
  #define SPI_CPOL 0x02   /* clock polarity */
  #define SPI_MODE_0 (0|0)   /* (original MicroWire) */
  #define SPI_MODE_1 (0|SPI_CPHA)
  #define SPI_MODE_2 (SPI_CPOL|0)
  #define SPI_MODE_3 (SPI_CPOL|SPI_CPHA)
  #define SPI_CS_HIGH 0x04    /* chipselect active high? *//*片选电位为高*/
  #define SPI_LSB_FIRST 0x08    /* per-word bits-on-wire *//*先输出低比特*/
  #define SPI_3WIRE 0x10   /* SI/SO signals shared *//*输入输出共享接口,此时只能做半双工*/
  #define SPI_LOOP 0x20   /* loopback mode *//*回写/回显模式*/
  #define SPI_NO_CS 0x40    /* 1 dev/bus, no chipselect */
  #define SPI_READY 0x80    /* slave pulls low to pause */
  u8 bits_per_word;  /*每个字长的比特数*/
  int irq;       /*使用到的中断号*/
  void *controller_state;
  void *controller_data;
  char modalias[SPI_NAME_SIZE];  /*spi设备的名字*/
  int cs_gpio;    /* chip select gpio */

};

<笔记>


1. 从设备驱动层,也叫协议驱动层

2. 

猜你喜欢

转载自www.cnblogs.com/panda-w/p/11111038.html
今日推荐