参考: PowerPC+Linux2.6.25 平台下的SPI驱动构架分析
1、SPI总体构架
SPI的驱动分为三个层次:硬件抽象层、平台依赖层和用户接口层。
1.1、硬件抽象层(核心层)
drivers/spi/spi.c、spi.h为主体框架代码,spi.h提供核心数据结构的定义,如spi_driver、spi_device、spi_board_info、
spi_master和一些基本的函数定义;spi.c主要是注册spi_bus_type,定义一些函数,如spi_add_device、
spi_register_master、spi_register_board_info;
核心层为硬件平台无关层,向下屏蔽了物理总线控制器的差异,定义了统一的访问策略和接口;向上提供统一的接口,以便spi设备驱动
通过总线控制器收发数据。
struct spi_master{
struct device dev;
u16 bus_num; 对应spi0或spi1
u16 num_chipselect; 对应挂接的spi_slaves
int (*setup) (struct spi_device *spi) 供spi driver调用来进行设置
int (*transfer) (struct spi_device *spi, struct spi_message *mesg);
void (*cleanup) (struct spi_device *spi);
1.2、平台依赖层(platform总线设备和驱动)
drivers/spi/spi_sam.c,注册名为sam_spi的platform驱动。arch/arm/mach-s3c6410/plat-s3c64xx定义名为sam_spi的
platform设备,并在 arch/arm/mach-s3c6410/mach-smdk6410中添加设备。
mach-smdk6410中还注册了spi_board_info结构体(modalias为用户接口层的驱动名),它用来选择哪个主spi以及挂接在其上的哪
个从spi;(arm/mach-s3c6410文件夹下的makefile中mach-support项添加的是mach-smdk6410项,用于平台相关的)
spi总线的master是一条spi总线的控制器,在物理上连接若干spi从设备。每种处理器平台都有自已的控制器驱动,属于平台移植相
关层。本处是spi_sam.c,其按照核心层定义的接口实现了spi_master结构(probe函数最后调用spi_register_master)。
1.3、 用户接口层
drivers/spi/spidev.c向spi_bus_type总线上添加名为spidev的驱动,它的probe函数创建设备结点供用户调用,它的ioctrl提供给
用户读写寄存器或收发数据;
spidev驱动和sam_spi驱动都需要维护一个共同master结构体,spidev最终通过sam_spi实现底层的传输。
spi_device和spi_add_device在spi.c中定义,它通过master定位一个具体的硬件设备,通过modalias找到它对应的驱动;这样在
sys/bus/spi/devices下看到的设备名为spi0.0可能不和驱动名spidev相同,但是设备结构体中有master和modalias,它会根据
modalias找到驱动。
测试程序在Documentation/spi/spidev_test.c
调试记录:
在arch/arm/mach-s3c6410/mach-smdk6410中的spi_board_info结构体里面把两个spi都加上(主要是bus_num和num_chipslect来确定),然后bus/spi/devices下边就会有两个设备了(spi0.0和spi1.0),/dev下也创建了两个结点。