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.