基于2.6.28.6内核的SPI驱动总结

原创 2011年01月12日 10:10:00

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

 

 

linux-2.6.26下SPI1(0) Linux2.6.32下SPI驱动的移植(mini2440)

Linux2.6.32下SPI驱动的移植如下图所示: 下面需要修改部分内核代码,具体操作如下: 1.  修改arch/arm/mach-s3c2440/mach-m...
  • forch
  • forch
  • 2011年09月30日 13:45
  • 2185

linux内核SPI总线驱动分析

1、SPI概述 SPI是英语Serial Peripheral interface的缩写,顾名思义就是串行外围设备接口,SPI是一种高速的,全双工, 同步的通信总线,并且在芯片的管脚上只占用四根线。通...
  • lrl2ye
  • lrl2ye
  • 2017年05月04日 08:41
  • 142

Am335x 应用层之SPI操作

我们先来看一下SPI的时序图,下面的内容转自http://blog.chinaunix.net/uid-8307196-id-2032955.html SPI接口有四种不同的数据传输时序,取决于...

全志A20配置使用spi 功能

全志A20配置使用spi。 Yao.GUET 2014-07-17,转载请注明出处:http://blog.csdn.net/Yao_GUET A20上带有4个spi接口,由于Humm...
  • Diwat
  • Diwat
  • 2015年04月01日 14:03
  • 2060

Linux驱动修炼之道-SPI驱动框架源码分析(上)

SPI协议是一种同步的串行数据连接标准,由摩托罗拉公司命名,可工作于全双工模式。相关通讯设备可工作于m/s模式。主设备发起数据帧,允许多个从设备的存在。每个从设备 有独立的片选信号,SPI一般来...

[Linux] 内核中 SPI 设备驱动模型(Platform设备驱动方式)

传统 Platform设备驱动方式 中 SPI 驱动模型
  • dearsq
  • dearsq
  • 2016年06月30日 14:54
  • 486

Linux内核---48.spi驱动修改

Linux内核---48.spi驱动修改

linux内核SPI总线驱动简单编写测试

linux内核SPI总线驱动简单编写测试 下面有两个大的模块: 一个是SPI总线驱动的分析            (研究了具体实现的过程) 另一个是SPI总线驱动的编写(不用研究...
  • wjs1033
  • wjs1033
  • 2015年03月24日 16:12
  • 698

61 OrangePi Linux内核里的spi控制器驱动

在全志H3里有2个spi控制器, 每个控制可有4个片选信号: //////////////////////////script.bin里的spi控制器,spi设备相关设置:[spi0] spi_us...
  • jklinux
  • jklinux
  • 2017年07月04日 12:37
  • 667

linux内核SPI总线驱动分析(一)

转载自: http://www.cnblogs.com/liugf05/archive/2012/12/03/2800457.html 下面有两个大的模块: 一个是SPI总线驱动的分析     ...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:基于2.6.28.6内核的SPI驱动总结
举报原因:
原因补充:

(最多只允许输入30个字)