IMX6ULL SPI

目录

spi_master结构体

spi_device结构体

spi_driver结构体

总结


对linux内核spi驱动框架的学习,会通过三个结构体来一步步深入了解,这三个结构体分别是spi_master,spi_device,spi_driver

spi_master结构体

借着IMX6ULL平台分析一下linux内核中的SPI驱动程序的大概框架,总体上的框架和上一节中的i2c的驱动是差不多的,回忆一下在i2c驱动程序中,围绕着一个重要的结构体叫做i2c_adapter,它是具体的i2c总线的抽象

也是厂商提供的i2c驱动部分,那么,在spi驱动中也同样存在一个结构体,它是spi总线的抽象,叫做spi_master,这个结构体的内容很长,就不列出来了,其中主要是针对spi总线提供的一些数据传输的函数

厂商提供的出厂驱动一般都是围绕spi_master所编写的驱动。
查看设备树,找到关于spi的设备节点

根据compatible属性找到nxp官方提供的spi驱动,文件为spi-imx.c,驱动开始是熟悉的平台设备驱动

查看spi_imx_probe函数

probe函数中就是设置spi_master的一些函数,这是函数都是根据Imx6ull平台的spi的数据传输函数,这些没啥说的,

在probe函数的最后调用spi_bitbang_start函数

在spi_bitbang_start的最后终于去注册spi_master了

总结:

对于厂商针对自己平台提供的spi的驱动其实就是操作spi_master结构体

  1. 申请一个spi_master结构体
  2. 设置spi_master结构体,重要的是其中的数据传输函数
  3. 注册spi_master结构体

spi_device结构体

这样一来,spi总线的操作函数就有了,接下来程序员就可以使用这些函数来访问具体的spi设备了,还要一个结构体需要我们注意,要访问spi设备的话第一步需要在设备树中添加spi设备节点,

在内核启动的时候就会去匹配这些设备节点,把所有添加的设备都抽象成一个spi_device结构体

可以看到spi_device结构体中有一个很重要的成员,就是上面的spi_master,每个设备都要挂在一个具体的spi总线下,这个spi_master就是该设备的所属,当然,其中也包括这个spi总线的操作函数,

所以,拿到了spi_device结构体就可以访问到spi设备了,这个和i2c驱动中的i2c_client结构体的作用就很类似了

那么,spi_device结构体怎么使用?何时使用呢?就牵扯出另一个重要的结构体,就是spi_driver(同样的,和i2c_driver结构体类似)

spi_driver结构体

介绍这个结构体之前要先说明,在linux内核中,虚拟出了一个spi总线,它管理spi_device和spi_driver,当向内核中注册一个spi_driver结构体的时候,内核就会在spi总线上匹配对应的spi_device

匹配的规则就是spi总线提供的规则

这里不去研究它是怎么匹配上的,我们的重点是spi_driver结构体

spi_driver结构体是由程序员向内核注册的,要匹配设备树中的spi设备节点,比如imx6ull平台存在如下一个spi设备节点

提供的驱动

驱动入口函数中直接注册spi_driver,通过spi_bus和设备节点生成的spi_device匹配成功之后,执行spi_driver的probe函数,

注意,probe函数的参数

可以看到probe函数的参数是spi_device结构体,spi_device结构体中有spi_master成员,spi_master结构体中有数据传输函数,所以,就可以在驱动程序中通过spi_device结构体访问spi设备了

然后就是具体的读写函数了,在网上搜索会找到很多例子

 

总结

在这里对linux内核的spi驱动框架进行了简单的介绍,真的是很简单,我没有去具体的分析spi_master是怎么设置的,也没有分析spi_driver是怎么匹配的,而是从整体上介绍了spi的驱动框架

当了解了spi的整体驱动框架之后,再去仔细的看它的细节就不会感到很吃力,最后是对本节内容的总结

1、厂商做好的:spi_master

一般厂商都会根据自己的单板提供spi总线的操作函数,在内核中就是抽象出来的spi_master结构体,设置spi_master结构体中的数据传输函数,并注册spi_master结构体

所以,这一部分并不需要我们去做

2、内核做好的:spi_device

每个spi设备都要挂在一个物理spi总线下面,表示出来就是在设备树的spi控制器节点下面添加具体的spi设备节点,在内核启动的时候会识别出来spi设备节点,并且把它抽象为一个spi_device结构体

spi_device结构体中包含它所属的spi控制器,也就是spi_master结构体

3、我们要做的:spi_driver

那么多工作都是别人做好的,总要有我们要做的吧,我们要做的就是编写具体的spi驱动,在驱动中注册spi_driver结构体,和spi_device结构体进行匹配,匹配成功进入spi_driver->probe函数

probe函数的参数就是匹配成功的spi_device结构体,拿到了spi_device结构体就拿到了具体的spi控制器的数据传输方法了,那么,接下来,就可以使用spi_device->master->传输函数来尽情的访问spi设备了。

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值