Linux SPI总线设备驱动模型详解
2018-02-01 08:27
507 查看
转载自:http://blog.csdn.net/u014106791/article/details/52301671
Linux系统中有很多条总线,如I2C、USB、platform、PCI等。
以spi为例,假如有M种不同类型CPU,N中不同SPI外设,在写裸机驱动的时候” />
2016年08月24日 16:42:10
随着技术不断进步,系统的拓扑结构越来越复杂,对热插拔、跨平台移植性的要求越来越高,早期的内核难以满足这些要求,从linux2.6内核开始,引入了总线设备驱动模型。其实在linux2.4总线的概念就已经提出来了,直到2.6版本的内核才运用。
Linux系统中有很多条总线,如I2C、USB、platform、PCI等。
以spi为例,假如有M种不同类型CPU,N中不同SPI外设,在写裸机驱动的时候,M种CPU驱动同一个外设需要M份代码,而N种外设使用同一个cpu又需要N份代码,所以需要M*N份代码,这是典型的高内聚低耦合架构。
这种网状的拓扑结构是不符合人的逻辑思维的,将M*N种耦合变成M+1+N中耦合,将大大减少linux移植工作。
在系统中抽象出一条SPI总线,然后总线中(总线注册的那个文件 spi.c 和spi.h,I2C总线注册是i2c-core.c和i2c-core.h)包含SPI控制器抽象结构体spi_master等,spi控制器和外设之间交互采用spi总线提供的标准api来进行,控制器设备和外设驱动填充相关结构体。
试想一下usb,当我们把鼠标或者键盘插入电脑时,是不是会有个驱动加载的过程?这就是在寻找总线上的驱动。总线有一种义务,就是感知设备在总线上的挂载和卸载,同时有义务去寻找与设备匹配的驱动。我们的spi也一样,当有外设挂载到spi总线上的时候,就会寻找总线上所有的驱动与之匹配,匹配成功,则由该驱动服务这个设备。反过来,总线有义务感知驱动在总线上的挂载和卸载,当驱动挂载到总线时,会寻找与之匹配的设备,该驱动就服务于匹配的设备。
总线在内核中的抽象
在linux内核中,总线由bus_type结构描述,定义在linux/device.h中。
struct bus_type {
const char name; /总线名称*/
int (*match) (struct device *dev, struct
device_driver drv); /驱动与设备的匹配函数*/
………
}主要关注match函数,当有一个设备挂载到一条总线上的时候,总线要把这个设备和挂载到这条总线上的驱动一一进行匹配,匹配的函数就是这个match指针。
总线的注册与注销
注册:bus_register(struct bus_type *bus)若成功,新的总线将被添加进系统,并可在/sys/bus 下看到相应的目录。
注销:void bus_unregister(struct bus_type *bus)。
进入到板子的/sys/bus目录,ls一下,可以看到系统所有的总线。
随便进入一个目录,如SPI目录
Devices目录表示这条总线上所有挂载的设备。Drivers目录表示这条总线上所有的设备。
下面以一个示例来注册一条总线到系统中,一般情况下,是不需要另外添加总线到设备中的。添加的总线名字叫my_bus,加载驱动之后,会在/sys/bus目录下看到一个my_bus目录。
新建bus.c:
#include <linux/init.h>
<script type="text/javascript"> var username = "u014106791";var _blogger = username;var blog_address = "/u014106791";var static_host = "http://static.blog.csdn.net"; var currentUserName = ""; var fileName = '52301671';var commentscount = 0; var islock = false window.quickReplyflag = true; var totalFloor=0; var isBole = false; var isDigg = false; var isExpert=false; var isAdm=false; </script>
<script src="//static.blog.csdn.net/public/switchHome/switchHome.js?v=2017.044"></script> <script type="text/javascript" src="http://static.blog.csdn.net/Skin/skin3-template/fonts/iconfont.js"></script> <script src="//csdnimg.cn/rabbit/exposure-click/main.js?v1.15.23"></script> <script type="text/javascript" src="http://c.csdnimg.cn/pubfooter/js/tracking_for_recommend.js?v=0911" charset="utf-8"></script> <script type="text/javascript" src="http://csdnimg.cn/pubfooter/js/tracking.js" charset="utf-8"></script> <script type="text/javascript" src="http://static.blog.csdn.net/scripts/cnick.js" charset="utf-8"></script> <link rel="stylesheet" href="http://static.blog.csdn.net/code/prettify.css" /> <script type="text/javascript" src="http://static.blog.csdn.net/code/prettify.js"></script>
<script type="text/javascript"> // Traffic Stats of the entire Web site By baidu var _hmt = _hmt || []; (function() { var hm = document.createElement("script"); hm.src = "https://hm.baidu.com/hm.js?6bcd52f51e9b3dce32bec4a3997715ac"; var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(hm, s); })(); // Traffic Stats of the entire Web site By baidu end </script> <meta name="description" content="随着技术不断进步,系统的拓扑结构越来越复杂,对热插拔、跨平台移植性的要求越来越高,早期的内核难以满足这些要求,从linux2.6内核开始,引入了总线设备驱动模型。其实在linux2.4总线的概念就已经提出来了,直到2.6版本的内核才运用。
Linux系统中有很多条总线,如I2C、USB、platform、PCI等。
以spi为例,假如有M种不同类型CPU,N中不同SPI外设,在写裸机驱动的时候” />
<title>Linux SPI总线设备驱动模型详解 - CSDN博客</title>
Linux SPI总线设备驱动模型详解
原创2016年08月24日 16:42:10
<ul class="article_tags clearfix csdn-tracking-statistics" data-mod="popu_377"> <li class="tit">标签:</li> </ul> <ul class="right_bar"> <li><button class="btn-noborder"><i class="icon iconfont icon-read"></i><span class="txt">1906</span></button></li> <!--<li><button class="btn-noborder"><i class="icon iconfont icon-dashang-"></i><span class="txt">0</span></button></li>--> <li class="edit"> <a class="btn-noborder" href="" > <i class="icon iconfont icon-bianji"></i><span class="txt">编辑</span> </a> </li> <li class="del"> <a class="btn-noborder" onclick="javascript:deleteArticle(fileName);return false;"> <i class="icon iconfont icon-shanchu"></i><span class="txt">删除</span> </a> </li> </ul> </div> <div id="article_content" class="article_content csdn-tracking-statistics" data-mod="popu_519" data-dsm="post">
随着技术不断进步,系统的拓扑结构越来越复杂,对热插拔、跨平台移植性的要求越来越高,早期的内核难以满足这些要求,从linux2.6内核开始,引入了总线设备驱动模型。其实在linux2.4总线的概念就已经提出来了,直到2.6版本的内核才运用。
Linux系统中有很多条总线,如I2C、USB、platform、PCI等。
以spi为例,假如有M种不同类型CPU,N中不同SPI外设,在写裸机驱动的时候,M种CPU驱动同一个外设需要M份代码,而N种外设使用同一个cpu又需要N份代码,所以需要M*N份代码,这是典型的高内聚低耦合架构。
这种网状的拓扑结构是不符合人的逻辑思维的,将M*N种耦合变成M+1+N中耦合,将大大减少linux移植工作。
在系统中抽象出一条SPI总线,然后总线中(总线注册的那个文件 spi.c 和spi.h,I2C总线注册是i2c-core.c和i2c-core.h)包含SPI控制器抽象结构体spi_master等,spi控制器和外设之间交互采用spi总线提供的标准api来进行,控制器设备和外设驱动填充相关结构体。
试想一下usb,当我们把鼠标或者键盘插入电脑时,是不是会有个驱动加载的过程?这就是在寻找总线上的驱动。总线有一种义务,就是感知设备在总线上的挂载和卸载,同时有义务去寻找与设备匹配的驱动。我们的spi也一样,当有外设挂载到spi总线上的时候,就会寻找总线上所有的驱动与之匹配,匹配成功,则由该驱动服务这个设备。反过来,总线有义务感知驱动在总线上的挂载和卸载,当驱动挂载到总线时,会寻找与之匹配的设备,该驱动就服务于匹配的设备。
总线在内核中的抽象
在linux内核中,总线由bus_type结构描述,定义在linux/device.h中。
struct bus_type {
const char name; /总线名称*/
int (*match) (struct device *dev, struct
device_driver drv); /驱动与设备的匹配函数*/
………
}主要关注match函数,当有一个设备挂载到一条总线上的时候,总线要把这个设备和挂载到这条总线上的驱动一一进行匹配,匹配的函数就是这个match指针。
总线的注册与注销
注册:bus_register(struct bus_type *bus)若成功,新的总线将被添加进系统,并可在/sys/bus 下看到相应的目录。
注销:void bus_unregister(struct bus_type *bus)。
进入到板子的/sys/bus目录,ls一下,可以看到系统所有的总线。
随便进入一个目录,如SPI目录
Devices目录表示这条总线上所有挂载的设备。Drivers目录表示这条总线上所有的设备。
下面以一个示例来注册一条总线到系统中,一般情况下,是不需要另外添加总线到设备中的。添加的总线名字叫my_bus,加载驱动之后,会在/sys/bus目录下看到一个my_bus目录。
新建bus.c:
#include <linux/init.h>
相关文章推荐
- Linux SPI总线设备驱动模型详解
- Linux SPI总线设备驱动模型详解
- Linux SPI总线设备驱动模型详解
- Linux总线设备驱动模型
- Linux 设备模型 --- 总线设备驱动模型 --- 总线
- Linux设备模型(总线、设备、驱动程序和类)之三:device_driver && 多厂家驱动自动识别
- Linux平台总线驱动设备模型
- Linux 设备总线驱动模型
- Linux SPI总线和设备驱动架构之一:系统概述
- linux平台总线驱动设备模型之点亮LED
- Linux SPI总线和设备驱动架构之四:SPI数据传输的队列化
- Linux平台总线驱动设备模型
- Linux平台总线驱动设备模型
- Linux SPI总线和设备驱动架构之二:SPI通用接口层
- Linux底层驱动之设备驱动模型--三角关系:总线、设备和驱动
- Linux设备模型(总线、设备、驱动程序和类)之三:device_driver && 多厂家驱动自动识别
- 迅为4412开发板Linux驱动教程——总线_设备_驱动注册流程详解
- linux内核模型---总线,设备,驱动在展讯平台上I2C设备的实例解析
- Linux设备模型(总线、设备、驱动程序和类)之三:device_driver && 多厂家驱动自动识别
- Linux SPI总线和设备驱动架构之一:系统概述