总结

bus_register()
自己创建平台总线 /sys/bux/xxx
device_register()
对平台总线加入dev /sys/bus/xxx/dev
driver_register()
对平台总线加入drv /sys/bus/xxx/drv
两个相匹配的时候 直接调用drv->probe 函数 进行基本的class_create() device_create()等
创建设备文件 和设备节点

代码实例

xubs.cxdev.c

#include <linux/init.h>
#include <linux/module.h>#include <linux/device.h>int xbus_match(struct device *dev, struct device_driver *drv)
{printk(KERN_ALERT "%s-%s\n", __FILE__, __func__);if (!strncmp(dev_name(dev), drv->name, strlen(drv->name))) {printk(KERN_ALERT "dev & drv match\n");return 1;}return 0;}
static struct bus_type xbus = {.name = "xbus",.match = xbus_match,
};EXPORT_SYMBOL(xbus);static __init int xbus_init(void)
{int ret;printk(KERN_ALERT "xbus init\n");ret = bus_register(&xbus);if(ret != 0){return -1;}return 0;
}module_init(xbus_init);static __exit void xbus_exit(void)
{printk(KERN_ALERT "xbus exit\n");bus_unregister(&xbus);
}module_exit(xbus_exit);MODULE_AUTHOR("embedfire");
MODULE_LICENSE("GPL");

xdev.c

#include <linux/init.h>
#include <linux/module.h>
#include <linux/device.h>extern struct bus_type xbus;void xdev_release(struct device *dev)
{printk(KERN_ALERT "%s-%s\n", __FILE__, __func__);
}static struct device xdev = {.init_name = "xdev",.bus = &xbus,.release = xdev_release,
};static __init int xdev_init(void)
{int ret;printk(KERN_ALERT "xdev init\n");ret = device_register(&xdev);if(ret != 0){return -1;}return 0;
}static __exit void xdev_exit(void)
{printk(KERN_ALERT "xdev exit\n");device_unregister(&xdev);
}module_init(xdev_init);
module_exit(xdev_exit);MODULE_AUTHOR("embedfire");
MODULE_LICENSE("GPL");

xdrv.c

#include <linux/init.h>
#include <linux/module.h>#include <linux/device.h>extern struct bus_type xbus;int xdrv_probe(struct device *dev)
{printk(KERN_ALERT "%s-%s\n", __FILE__, __func__);return 0;
}int xdrv_remove(struct device *dev)
{printk(KERN_ALERT "%s-%s\n", __FILE__, __func__);return 0;
}static struct device_driver xdrv = {.name = "xdev",.bus = &xbus,.probe = xdrv_probe,.remove = xdrv_remove,
};static __init int xdrv_init(void)
{int ret;printk( KERN_ALERT"xdrv init\n");ret = driver_register(&xdrv);if(ret != 0){return -1;}return 0;
}static __exit void xdrv_exit(void)
{printk(KERN_ALERT "xdrv exit\n");driver_unregister(&xdrv);
}module_init(xdrv_init);
module_exit(xdrv_exit);MODULE_AUTHOR("embedfire");
MODULE_LICENSE("GPL");

详细解析

自己弄一套驱动总线 xbus
match规则 找到drv 和 dev的链表头去匹配
分离的思想 也在设备驱动模型中 在sys的目录下面 有一个bus的文件夹
bus用来管理一系列的总线

总线初始化

/sys/bus 在linux总线初始化的时候 就有这个文件夹
后续把自己定义的总线都放在这么文件夹下

buses_init()函数 内核启动自动执行//创建kset=bus_kset 创建kobj=bus 和目录bus_kset = kset_create_and_add("bus", &bus_uevent_ops, NULL);

自定义一个新的总线xbus

bus_register(struct bus_type *bus)函数  添加新的总线类型需要定义一个bus_type结构体并且把指针传进去 因为要创建三个目录项所以bus结构体里面有三个kobj对象看看bus结构体 bus_type->prive 有三个kset变量 用来满足三个目录项的要求因为每个目录项都要有属性文件 bus_type有三个attr_goup结构体指针因为要管理dev和drv结构体 所以 bus_type有两链表头-/sys/bus下建立xbus目录项,并创建属性文件
-/sys/bus/xbus下建立devices目录项,并创建属性文件
-/sys/bus/xbus下建立drivers目录项,并创建属性文件
- 初始化 priv->klist_devices链表头
- 初始化priv->klist_drivers链表头

创建dev drv

设备注册
往总线的device目录里面新增目录项
int device_register(struct device *dev)因为要建立新的目录项 device结构体也有kobj对象device对象要加入xubs的dev链表里面 所以device->p->klist进行加入
-/sys/bus/xbus/devices下建立yyy目录项
- 加入bus-> priv->devices_kset链表
- 加入bus-> priv->klist_devices链表
- 遍历bus-> priv->klist_drivers,执行bus->match()寻找合适的drv
- dev关联driv,执行drv->probe()匹配 dev列表节点和drv列表节点互相搜索有合适的 device->driver会指向匹配到的driver结构体然后调用driver->probe

06_平台总线匹配规则,自己搭建总线xbus相关推荐

  1. 外卖匹配系统_外卖平台派单规则浅析

    由于笔者多年的电商.O2O相关后台订单模块的产品设计经历,一直对于各类高频.端到端业务的订单分发及派单规则有浓厚兴趣,本文作为学习目的将国内两大外卖平台的骑手派单规则进行简单的整理及浅析. 首先,我们 ...

  2. 细说汽车电子通信总线之CAN 2.0 总线协议详解

    引言 1. CAN总线发展历史与ISO规范 2. CAN总线主要功能特性 3. CAN 2.0总线协议的物理层电气特性 4. CAN 2.0总线协议消息报文详解 4.1 CAN2.0总线的通信报文帧格 ...

  3. can总线不加末端电阻_细说汽车电子通信总线之CAN 2.0 总线协议详解

    引言 1. CAN总线发展历史与ISO规范 2. CAN总线主要功能特性 3. CAN 2.0总线协议的物理层电气特性 4. CAN 2.0总线协议消息报文详解 4.1 CAN2.0总线的通信报文帧格 ...

  4. can总线不加末端电阻_CAN总线入门

    今天的文章是关于最重要的车载总线--CAN BUS. 汽车上的 OBD 接口,到底是啥东西? 文章目录: 一.CAN 总线是什么? 二.CAN 总线的作用? 三.CAN 总线的优点 四.CAN 总线的 ...

  5. 10 计算机组成原理第六章 总线 总线的概念与分类 总线性能指标 总线仲裁 总线操作和定时 总线标准

    文章目录 1 总线的概念与分类 1.1总线的定义 1.2 总线的特点 1.3 总线的特性 1.4 总线的分类 1.4.1 串行总线与并行总线 1.4.2 按总线功能分类 1.5 系统总线的结构 1.6 ...

  6. nginx配置中location匹配规则详解

    女主宣言 nginx作为一款性能优异的反向代理服务器,可以用于静态代理.负载均衡.限流等多种场景.那么,要灵活的使用nginx,必须清楚nginx配置文件的使用.本文作者对nginx的http块中的l ...

  7. 【王道计组笔记】总线(4):总线操作和定时

    总线传输的四个阶段: (1)申请分配阶段:由需要使用总线的主模块(或主设备)提出申请,经总线仲裁机构决定将下一传输周期的总线使用权授予某一申请者.也可将次阶段细分为传输请求和总线仲裁两个阶段(确定谁获 ...

  8. pci总线协议学习笔记——PCI总线基本概念

    1.pci总线概述 (1)PCI,外设组件互连标准(Peripheral Component Interconnection),是一种由英特尔(Intel)公司1991年推出的用于定义局部总线的标准; ...

  9. 计算机组成原理——总线控制(总线判优控制、总线通信控制)

    总线控制 一.总线判优控制 1.基本概念: 总线判优控制的集中式方式有三种:链式查询.计数器定时查询.独立请求方式 1.链式查询方式 注:在查询链中离总线控制器最近的部件具有最高优先权,离总线控制器越 ...

最新文章

  1. Java访问权限(详尽版)
  2. 字节2020算法岗校招一面
  3. 基于增强现实和脑机接口的机械臂控制系统
  4. L1正则化与数据分布的关系
  5. 没想到单位的bt下载的速度可以到这么快,满意了
  6. SpringAOP Aspect注解实现简单日志功能
  7. 如何快速REPAIR TABLE
  8. vue获取剪切板内容_vue通过clipboard插件实现复制到剪切板功能
  9. C++新特性探究(十):Lambda
  10. 【车间调度】基于matlab免疫遗传算法求解多目标生产调度问题【含Matlab源码 710期】
  11. python如何调用tess_python下以api形式调用tesseract识别图片验证码
  12. 概率图模型(PGM)学习笔记(四)-贝叶斯网络-伯努利贝叶斯-多项式贝叶斯
  13. android 脱壳 加固,安卓的脱壳之战-爱加密加固
  14. 《人机交互技术》 第七章 Web界面设计
  15. 加强自定义菜单 即更换浏览器默认右击菜单栏
  16. linux非lvm分区在线扩容,Linux硬盘扩容(非LVM)
  17. Portal是什么东东
  18. 卷积神经网络——卷积神经网络基础
  19. linux配置mysql全局环境变量,Linux 配置 jdk mysql 环境变量
  20. oppo禁用android系统通知栏,状态栏设置OPPO版

热门文章

  1. html--P1-P10
  2. python批量下载文件教程_超简单超详细python小文件、大文件、批量下载教程
  3. 简单爬虫1688商品的主图和详情图
  4. iPhone之随机数的生成
  5. n阶台阶 java_上N阶楼梯,一次走1个台阶或者2个台阶,共有多少种走法?
  6. Python 输入时间字符串以分钟单位计算时间差
  7. list和tuple的区别:
  8. 压缩BCD码和非压缩BCD码的区别
  9. BERT6mA:使用基于深度学习的方法预测DNA N6甲基腺嘌呤位点
  10. eNSP:软件下载链接