[国嵌攻略][125][总线设备驱动模型]
总线模型
随着技术的不断进步,系统的拓扑结构也越来越复杂,对热插拔,跨平台移植性的要求越来越高,2.4内核已经难以满足这些需求。为了适应这种形势的需要,从Linux2.6内核开始提供了全新的设备驱动模型。
总线驱动设备模型
这个模型首先有一条总线,然后是总线上挂载有很多驱动。当有设备插到总线上的时候,总线会把设备和驱动进行匹配,当设备匹配到驱动时,总线把控制权交给相应的驱动处理;当设备从总线上拔掉的时候,总线会找到相应的驱动来处理相应的事件。这样驱动就可以支持热插拔,并且当驱动从一种总线(如USB)改到另一种总线(如MINIPCI)时,驱动需要修改的部分很少,提高了驱动的可移植性。
总线
1.描述结构
在Linux内核中,总线由bus_type结构表示,定义在<linux/device.h>
struct bus_type{
const char *name; //总线名称
int (*match)(struct device *dev, struct device_driver *drv); //匹配函数,驱动与设备的匹配函数。如果返回非零表示匹配成功,否则匹配失败。物理总线通过设备中的ID与驱动进行匹配,虚拟总线通过设备的名字与驱动进行匹配。
......
}
2.总线的注册与注销
总线的注册使用:
bus_register(struct bus_type *bus)
若成功,新的总线将被添加进系统,并可以在/sys/bus下看到相应的目录
总线的注销使用:
void bus_unregister(struct bus_type *bus)
busmod.c
/******************************************************************** *头文件 *********************************************************************/ #include <linux/init.h> #include <linux/module.h> #include <linux/device.h>/******************************************************************** *总线匹配 *********************************************************************/ //总线匹配 int bus_match(struct device *dev, struct device_driver *drv){//名称匹配int isMatch;isMatch = !strncmp(dev->kobj.name, drv->name, strlen(drv->name));return isMatch; }/******************************************************************** *模块安装 *********************************************************************/ //总线结构 struct bus_type busmod = {.name = "busmod", //总线名称.match = bus_match //匹配函数 };//安装模块 static int ibus_init(void){//注册总线bus_register(&busmod);return 0; }//卸载模块 static void ibus_exit(void){//注销总线bus_unregister(&busmod); }/******************************************************************** *模块声明 *********************************************************************/ MODULE_LICENSE("GPL"); MODULE_AUTHOR("D"); MODULE_DESCRIPTION(""); MODULE_VERSION("v1.0");EXPORT_SYMBOL(busmod);module_init(ibus_init); module_exit(ibus_exit);
驱动
1.描述结构
在Linux内核中,驱动由device_driver结构来表示。
struct device_driver{
const char *name; //驱动名称
struct bus_type *bus; //驱动程序所在的总线
int (*probe)(struct device *dev); //驱动函数,当总线找到与设备匹配的驱动时,调用该函数对设备进行处理
......
}
2.驱动的注册与注销
驱动的注册使用:
int driver_register(struct device_driver *drv)
若成功,新的驱动将被添加进系统,并可以在/sys/bus/xxx/drivers下看到该驱动。
驱动的注销使用:
void driver_unregister(struct device_driver *drv)
drvmod.c
/******************************************************************** *头文件 *********************************************************************/ #include <linux/init.h> #include <linux/module.h> #include <linux/device.h>/******************************************************************** *全局变量 *********************************************************************/ extern struct bus_type busmod;/******************************************************************** *驱动处理 *********************************************************************/ //驱动处理 int drv_probe(struct device *dev){printk("Driver found the device it can be handle!\n");return 0; }/******************************************************************** *模块安装 *********************************************************************/ //驱动结构 struct device_driver drvmod = {.name = "drvmod", //驱动名称.bus = &busmod, //所属总线.probe = drv_probe, //驱动函数 };//安装模块 static int idrv_init(void){//注册驱动driver_register(&drvmod);return 0; }//卸载模块 static void idrv_exit(void){//注销驱动driver_unregister(&drvmod); }/******************************************************************** *模块声明 *********************************************************************/ MODULE_LICENSE("GPL"); MODULE_AUTHOR("D"); MODULE_DESCRIPTION(""); MODULE_VERSION("v1.0");module_init(idrv_init); module_exit(idrv_exit);
设备
1.描述结构
在Linux内核中,设备由struct device结构表示。
struct device{
const char *init_name; //设备名称,必须与驱动名称相同
struct bus_type *bus; //设备所在的总线
struct kobject kobj.name; //当调用device_register函数时,init_name会被赋值到该变量,然后清空init_name。
......
}
2.设备的注册与注销
设备的注册使用:
int device_register(struct device *dev)
若成功,新的设备将被添加进系统,并可以在/sys/bus/xxx/devices下看到该设备。
设备的注销使用:
void device_unregister(struct device *dev)
devmod.c
/******************************************************************** *头文件 *********************************************************************/ #include <linux/init.h> #include <linux/module.h> #include <linux/device.h>/******************************************************************** *全局变量 *********************************************************************/ extern struct bus_type busmod;/******************************************************************** *模块安装 *********************************************************************/ //设备结构 struct device devmod = {.init_name = "drvmod", //设备名称,必须与驱动名称相同.bus = &busmod //所属总线 };//安装模块 static int idev_init(void){//注册设备device_register(&devmod);return 0; }//卸载模块 static void idev_exit(void){//注销设备device_unregister(&devmod); }/******************************************************************** *模块声明 *********************************************************************/ MODULE_LICENSE("GPL"); MODULE_AUTHOR("D"); MODULE_DESCRIPTION(""); MODULE_VERSION("v1.0");module_init(idev_init); module_exit(idev_exit);
先有驱动后有设备和先有设备后有设备,总线都能让驱动和设备匹配。
第一种情况:
总线上面已经挂载了驱动,然后添加设备,总线会拿match函数去对设备与每个驱动进行匹配。如果能够匹配,那么会调用相应的probe函数。
第二种情况:
总线上面已经挂载了设备,然后添加驱动,总线会拿match函数去对驱动与每个设备进行匹配。如果能够匹配,那么会调用相应的probe函数。
转载于:https://www.cnblogs.com/d442130165/p/5259776.html
[国嵌攻略][125][总线设备驱动模型]相关推荐
- 驱动进化之路:总线设备驱动模型
文章目录 1 驱动编写的3种方法 1.1 传统写法 1.2 总线设备驱动模型 1.3 设备树 2 在 Linux 中实现"分离":Bus/Dev/Drv 模型 2.1 模型 2.2 ...
- Linux SPI总线设备驱动模型详解
随着技术不断进步,系统的拓扑结构越来越复杂,对热插拔.跨平台移植性的要求越来越高,早期的内核难以满足这些要求,从linux2.6内核开始,引入了总线设备驱动模型.其实在linux2.4总线的概念就已经 ...
- 【嵌入式Linux】嵌入式Linux驱动开发基础知识之总线设备驱动模型
文章目录 前言 1.驱动编写的三种方法 1.1.传统写法 1.2.总线驱动模型 1.3.设备树驱动模型 2.Linux实现分离:Bus/Dev/Drv模型 2.1.Bus/Dev/Drv模型 2.2. ...
- 【Bus】编写一个Demo虚拟的总线-设备-驱动模型
文章目录 1. 前言 2. 总线驱动模型三要素 2.1 总线 2.2 设备 2.3 驱动 3. Demo Code 3.1 virt_bus_core.c 3.2 virt_device.c 3.3 ...
- linux驱动开发篇(三)—— 总线设备驱动模型
linux系列目录: linux基础篇(一)--GCC和Makefile编译过程 linux基础篇(二)--静态和动态链接 ARM裸机篇(一)--i.MX6ULL介绍 ARM裸机篇(二)--i.MX6 ...
- Linux驱动——驱动分离思想和总线设备驱动模型
驱动分离思想: 在传统的字符设备驱动思想中一个驱动程序对应一个硬件资源,在驱动入口函数中对资源进行配置,在file_operation中对各个硬件资源进行操作.这种思想使得内核中驱动代码变得庞大,为了 ...
- linux一个spi总线挂多个设备,Linux SPI总线设备驱动模型详解
随着技术不断进步,系统的拓扑结构越来越复杂,对热插拔.跨平台移植性的要求越来越高,早期的内核难以满足这些要求,从linux2.6内核开始,引入了总线设备驱动模型.其实在linux2.4总线的概念就已经 ...
- [国嵌攻略][139][输入子系统原理分析]
输入子系统核心架构 1.设备驱动层 2.核心层 3.事件层 4.用户空间 输入设备注册 1.拿设备ID去匹配handler的ID,找到对应的handler(事件处理者) 最常用的handler是evd ...
- Linux总线驱动设计(1)-总线设备驱动模型
1.总线模型概述 随着技术的不断进步,系统的拓扑结构也越来越复杂,对热插拔,跨平台移植性的要求也越来越高,2.4内核已经难以满足这些需求.为适应这种形势的需要,从Linux 2.6内核开始提供了全新的 ...
最新文章
- 机器学习基石(6)--Theory of Generalization
- RBAC用户角色权限设计方案
- 解决mybatis generator无法覆盖XML
- [密码学基础][每个信息安全博士生应该知道的52件事][Bristol52]42蒙哥马利乘法,哪里泄漏侧信道路吗?
- 什么叫pmt测试分析_RVS — 面向目标硬件的软件性能测试工具
- Alibaba Sentinel 限流与熔断初探
- iOS模拟器上NSHomeDirectory和resourcePath的根路径不同
- Eclipse添加注释的快捷键alt+shift+j,在菜单中是source-gt;generate element comment
- java web 中的乱码
- 关于浮动-float
- dd 删除引导扇区_硬盘U盘数据怎么用bootice彻底删除及清零引导记录教程
- 全国各地电台FM.ini汇总
- 【计算机视觉】opencv姿态解算4 视觉导航 单目特征检测与实时位姿
- C++:未定义引用静态类成员?
- 云服务器上搭建个人云笔记——leanote
- 一首励志的歌曲《我相信》
- 计算机开始菜单设置方法,开始菜单不见了,教您Win7开始菜单不见了如何解决
- 百度音乐2013 8.2.8 去广告VIP绿色版|zd423作品
- GDKOI-PJ-2021 Day1总结
- 使用 Nginx 构建前端日志统计服务(打点采集)服务
热门文章
- sqlserver 更新 datetime 数据_SqlServer 关于 datetime 的更新引发的思考
- abaqus推荐用哪一版本的_ABAQUS推荐资料合集(一)
- jssdk 获取微信收货地址_微信收货地址共享开发接口讲解
- recv返回的数据过大 易语言_高性能数据传输系统的框架设计
- 内涝预测过程的噪音_提高人工智能模型准确率的测试过程中需要注意什么?
- html基本结构(头部需加上样式表),HTML基本结构、头部、注释(示例代码)
- 五人合伙最佳股份分配_【干货要点】再谈“类直营”——百果园的店长合伙人...
- html背景只向x轴扩散,有趣的css—简单的下雨效果2.0版
- java获取数据库当前时间_java中获取系统的当前时间
- 范德堡大学排名计算机,2019上海软科世界一流学科排名计算机科学与工程专业排名范德堡大学排名第201-300...