关闭

基于2.6.28.6内核的SPI驱动总结

1354人阅读 评论(0) 收藏 举报

参考: 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下也创建了两个结点。

 

 

0
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:35405次
    • 积分:740
    • 等级:
    • 排名:千里之外
    • 原创:34篇
    • 转载:0篇
    • 译文:0篇
    • 评论:2条
    最新评论