#1、概要
Linux 中的spi驱动主要是由spi子系统来管理的,其核心代码位于kernel/drivers/spi/spi.c中。具体的spi控制器驱动也在kernel/drivers/spi/目录中。目前spi子系统只支持spi主机模式,还不支持spi从机模式。
spi通常是由spi控制器、spi总线和连接在spi总线上的设备构成:这里的总线只是指物理的spi连线,并不是指Linux设备模型中逻辑上的总线概念。可以把spi控制器和spi总线看成是一体的,spi总线就是spi控制器加上和spi设备的连接线。spi设备包含很多种,它可以是一个spi接口的nor flash,例如ST的M25P80。它也可以是一个spi网卡,例如ENC28J60。
#2、spi控制器
Linux的spi子系统对spi控制器的描述使用的是struct spi_master这个数据结构,所以在内核中,一个spi_master结构就代表了一个spi控制器,或者说代表一个spi主机。
它的主要定义如下:
struct spi_master {
struct device dev;
struct list_head list;
s16 bus_num; //总线(或控制器)编号,总线和设备匹配时用到
u16 num_chipselect; //片选数量,决定该控制器下面挂接多少个SPI设备
u16 dma_alignment;
u16 mode_bits;
u16 flags;
spinlock_t bus_lock_spinlock;
struct mutex bus_lock_mutex;
bool bus_lock_flag;
int (*setup)(struct spi_device *spi); //这个需要我们自己具体实现,
//主要设置SPI控制器和工作方式
int (*transfer)(struct spi_device *spi,
struct spi_message *mesg); //这个不同的控制器要具体实现,
//传输数据最后都要调用这个函数
void (*cleanup)(struct spi_device *spi); //注销时使用
};
在Linux-2.6以后引入设备模型概念,所有的设备和驱动都需要依附于总线。附于Spi总线的设备驱动对应的总线类型为spi_bus_type,在内核的drivers/spi/spi.c中定义。
struct bus_type spi_bus_type = {
.name = "spi",
.dev_attrs = spi_dev_attrs,
.match = spi_match_device,
.uevent = spi_ueven