spi总线之flash设备驱动

这篇文章分析挂在spi总线下的flash设备驱动程序,设备树信息如下所示。

spi总线之flash设备驱动

Spi设备驱动程序如下:

spi总线之flash设备驱动

看到没有,spi_driver驱动结构与platform_driver结构基本一致。我们来看看spi总线的匹配方式如何。Spi核心层定义与注册如下所示。

spi总线之flash设备驱动

spi总线之flash设备驱动

注册方式与platform总线完全一致,看到初始化驱动的入口函数了吗,这也是在前文提到过的,是module_init的一种变形。

匹配函数如下所示。

spi总线之flash设备驱动

这里的匹配函数与platform匹配方式完全一样。下面分析probe函数。

spi总线之flash设备驱动

248:这个同样是获取dev->platform_data数据,这个指针我已经强调了很多次了,是内核可以操作的接口,我们用户自定义的还有一个指针,在platfrom总线文章中已经说明。在spi设备树中该指针存放的是flash设备的分区表信息,设备树中能够看到。

后面剩下的是标准的mtd设备驱动,构造flash结构,提供读写函数接口。

spi总线之flash设备驱动

这个有一个spi_nor_scan扫描函数,注意这里是读取flash设备的id信息,看看否能够匹配,相当于上电自检功能。最后是注册mtd设备驱动。

这里侧重看一下mtd设备是如何写的,代码如下所示。

spi总线之flash设备驱动spi总线之flash设备驱动

Mtd设备写采用的是spi message方式读写,构造spi_message消息包,调用spi_sync实现发送。spi总线之flash设备驱动

__spi_sync函数中调用了__spi_queued_transfer函数,这个函数在注册spi控制器驱动时候也出现了,这一块由spi core负责管理。

在应用程序如何访问spi下挂在的设备呢?方法比较多。这里介绍常用的两种。如果spi设备下挂在的flash设备,那么flash驱动一般通过mtd方式注册的,在应用程序可以open 打开 /dev/mtd*设备几点进行读写访问。如果spi下挂在简单的传感器,那么可以通过sys接口,在应用程序中打开/sys/class/节点进行读写,eeprom就是通过sys接口的。内核层与应用层交互的接口常用的就那些,后期专门拿一章节进行讲解。

到目前为止整个spi驱动程序讲解完毕,看了本次spi文章后,在结合内核源代码,我相信移植出自己的spi驱动程序不是很难。我主要是讲解驱动框架,具体的细节可以参考源代码。后期会逐渐分析内核驱动源码,实质还是以应用为主。通过驱动框架了解,在项目开发中能够快速搭建出适应产品的驱动程序。