LINUX SPI设备驱动模型分析之一 SPI设备驱动框架介绍

     从本章开始我们将进行spi驱动模块的分析,spi驱动模块与i2c驱动模块的实现非常相似。在spi驱动模块中主要涉及spi总线、spi master、spi device、 spi driver、spi通信接口、spi master字符设备几个部分。

spi驱动模块主要涉及如下几个内容:

spi驱动模块框架说明

spi总线部分分析

spi设备注册与注销部分分析

spi驱动注册与注销部分分析

Spi master对应字符设备部分分析

 

cpu-spi控制器-spi设备关联说明

     在分析spi模块的驱动模型之前,我们还是先说明一下cpu-spi控制器-spi设备之间的关联,这样有利于我们分析spi驱动模型。spi总线包含clk、mosi、miso、cs最少四个引脚,支持全双工通信。spi通过CPOL和CPHL位定义了四种类型的数据传输时序。与i2c不同的是,spi通过cs信号来决定通信的spi设备(i2c通过i2c设备的地址实现与具体设备的通信)。

       如下为cpu与spi控制器、spi设备之间的硬件关联图,假设我们现在就是spi模块的开发者,基于此硬件以及LINUX设备-总线-驱动模型,我们来进行抽象,大概可以得到如下信息:

  1. cpu需要借助spi控制器产生数据传输时序,从而完成与spi设备的通信,即cpu若要与具体的spi设备进行通信,则必须通过spi控制器;
  2. spi传输时序的产生也必须借助spi控制器,因此需要为spi控制器编写驱动程序,抽象对应的驱动类型;
  3. spi控制器也代表一个设备,因此需要为spi控制器抽象一个设备类型;
  4. 每个spi设备所要实现的功能有所不同,因此需要为每一个spi设备编写驱动,抽象对应的驱动类型;
  5. 每个spi设备也需要抽象一个设备类型;
  6. 需要为spi总线抽象spi总线模型。

 

          我们现在来看下spi驱动模型是如何抽象的,基本上和我们的猜想类似:

  1. 针对spi控制器与spi控制器驱动抽象出spi master类型,其中spi_master可以理解为spi控制器设备,同时该类中包含了spi通信实现产生接口spi_transfer(此处没有为spi 控制器抽象一个驱动类,而是将spi控制器产生通信时序的驱动,抽象为spi_transfer方法);
  2. 针对spi设备抽象了spi_dev、spi_driver类;
  3. 针对spi总线,实例化一个bus_type类型的对象。

spi总线与i2c类型,它们的控制器抽象类都提供了总线通信的方法(在i2c_adapter中抽象了algo方法,而在spi_master抽象了transfer接口)。

 

spi_master、spi dev、spi bus、spi driver的关联

       本篇我们先从整体上了解spi驱动模型中各设备与驱动间的关联,让我们有一个感性认识。

基于设备-总线-驱动模型的关联

       我们知道spi模型、i2c模型均是基于LINUX设备-总线-驱动模型的,下面我们主要描述下spi_driver、spi_device、spi_master、spi_bus这四个类型中device类型、device_driver类型的成员变量之间的关联。

如下图所示,我们可以得到如下关联

  1. 在spi总线上只有spi device、spi driver是注册到spi总线上的,而spi master是没有注册到spi总线上的,这点是与i2c驱动模型的区别(在i2c驱动模型中spi master也是注册到i2c总线上的,只是不进行与i2c driver的绑定);
  2. Spi device与spi driver借助设备-总线-驱动模型的数据结构与接口,完成绑定与解绑操作;
  3. Spi device与spi master之间借助设备模型的数据结构,完成父子节点的关联(如下图中橙色箭头所指)
  4. Spi device与spi master之间借助spi的数据结构,完成了device与master绑定(如下图中绿色箭头所指)

 

spi通用字符设备创建相关

 

    我们知道通过spi master提供的方法与具体的cs引脚设置,即可完成针对某一个spi dev的通信。因此spi 驱动模块也开发了通用字符设备,但与i2c不同的是,创建的spi通用字符设备需要同时包含spi master与spi device这两个变量。

 

     在i2c模型中,也存在i2c adapter设备对应的字符设备,在i2c设备驱动模型中,主要是在i2cadper 注册到i2c总线时,通过触发BUS_NOTIFY_ADD_DEVICE、BUS_NOTIFY_DEL_DEVICE通知,在这两个通知注册的处理接口中,借助device_add接口完成字符设备的添加;

      而在spi驱动模型中,因没有将spi master注册到spi总线上,因此无法使用i2c模块那一套方式创建字符设备,且spi字符设备必须与spi device进行绑定(主要是获取对应的cs引脚),这是与i2c通用字符设备不同的地方。而且spi模块注册了名为“spidev”spi driver,该spi driver就是为了创建spi 通用字符设备而存在的。

 

       本章主要是介绍spi设备驱动模型的框架,主要是说明spi设备驱动模块的数据结构以及这些数据结构体之间的关联,同时也简要说了spi通用字符设备以及其与i2c通用字符设备的区别。

发布了140 篇原创文章 · 获赞 30 · 访问量 45万+

猜你喜欢

转载自blog.csdn.net/lickylin/article/details/103226334
今日推荐