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

news2024/9/22 13:34:21

总结

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/177165.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

TryHackMe-红队-07_武器化

Weaponization 了解并探索常见的红队武器化技术。您将学习如何使用业内常见的方法来构建自定义有效负载&#xff0c;以获得初始访问权限。 什么是武器化 武器化是网络杀伤链模式的第二阶段。在此阶段&#xff0c;攻击者使用可交付的有效负载&#xff08;如word文档&#xff…

七、python-PySpark篇(黑马程序猿-python学习记录)

1. pyspark定义 2. 下载 点击右下角版本 点击解释器设置 点击号 搜索pyspark 选择pyspark 勾选选项 在输入框中输入 -i https://pypi.tuna.tsinghua.edu.cn/simple 点击安装软件包 提示正在安装 等一两分钟就能安装完毕 3. 获取PySpark版本号 # 导包 from pyspark import Spar…

树,二叉树的认识

1.树概念及结构 1.1树的概念 注意&#xff1a;树形结构中&#xff0c;子树之间不能有交集&#xff0c;否则就不是树形结构 1.2 树的相关概念 1.3 树的表示 树结构相对线性表就比较复杂了&#xff0c;要存储表示起来就比较麻烦了&#xff0c;既然保存值域&#xff0c;也要保存…

(18)go-micro微服务ELK介绍

文章目录一 什么是ELK二 Beats的六种工具三 ELK系统的特点四 ELKbeats系统架构五 ELK优点六 最后一 什么是ELK ELK是三个[开源软件]的缩写&#xff0c;分别表示&#xff1a;Elasticsearch , Logstash, Kibana , 它们都是开源软件&#xff0c;新增了一个Beats。 Elasticsearch …

几种觉排序优劣

冒泡排序 比较相邻的元素。如果第一个比第二个大&#xff0c;就交换他们两个。 对每一对相邻元素做同样的工作&#xff0c;从开始第一对到结尾的最后一对。在这一点&#xff0c;最后的元素应该会是最大的数。 针对所有的元素重复以上的步骤&#xff0c;除了最后一个。 持…

23. 异常处理机制

1. 异常 即便 python 程序的语法是正确的&#xff0c;在运行它的时候&#xff0c;也有可能发生错误。运行期检测到的错误被称为异常。 # int不能与str相加, 触发异常 print(22) # 0 不能作为除数, 触发异常 print(1/0) # sum未定义, 触发异常 print(num)异常以不同的类型出现…

【JavaSE专栏4】关键字、标识符和命名规范

作者主页&#xff1a;Designer 小郑 作者简介&#xff1a;Java全栈软件工程师一枚&#xff0c;来自浙江宁波&#xff0c;负责开发管理公司OA项目&#xff0c;专注软件前后端开发&#xff08;Vue、SpringBoot和微信小程序&#xff09;、系统定制、远程技术指导。CSDN学院、蓝桥云…

k8s部署elk+filebeat。springCloud集成elk+filebeat+kafka+zipkin实现多个服务日志链路追踪聚合到es

一、目的 如今2023了&#xff0c;大多数javaweb架构都是springboot微服务&#xff0c;一个前端功能请求后台可能是多个不同的服务共同协做完成的。例如用户下单功能&#xff0c;js转发到后台网关gateway服务&#xff0c;然后到鉴权spring-sercurity服务&#xff0c;然后到业务…

mysql数据库管理-GTID详解

一、GTID概述 1 sql线程执行的事件也可以通过log_slave_updates系统变量来决定是否写入自己的二进制文件中&#xff0c;这是可以用于级联复制的场景。 GTID是MYSQL5.6新增的特性&#xff0c;GTID&#xff08;Global Transaction Identifier&#xff09;全称为全局事务标示符…

17种编程语言实现排序算法-计数排序

开源地址 https://gitee.com/lblbc/simple-works/tree/master/sort/ 覆盖语言&#xff1a;C、C、C#、Java、Kotlin、Dart、Go、JavaScript(JS)、TypeScript(TS)、ArkTS、swift、PHP。 覆盖平台&#xff1a;安卓(Java、Kotlin)、iOS(SwiftUI)、Flutter(Dart)、Window桌面(C#)、…

力扣sql简单篇练习(五)

力扣sql简单篇练习(五) 1 游戏玩法分析 I 1.1 题目内容 1.1.1 基本题目信息 1.1.2 示例输入输出 1.2 示例sql语句 # 第一次登录平台的日期就代表是时间靠前的日期 # 窗口函数是Mysql8版本后才能使用 SELECT e.player_id,e.event_date first_login FROM (SELECT player_id,e…

五、python-地图可视化篇(黑马程序猿-python学习记录)

黑马程序猿的python学习视频&#xff1a;https://www.bilibili.com/video/BV1qW4y1a7fU/ 目录 1. 基础地图 2. 设置分段 1. 基础地图 from pyecharts.charts import Map # 准备地图对象 map Map() # 准备数据 data[ ("北京",99), ("上海",199), ("…

17种编程语言实现排序算法-堆排序

开源地址 https://gitee.com/lblbc/simple-works/tree/master/sort/ 覆盖语言&#xff1a;C、C、C#、Java、Kotlin、Dart、Go、JavaScript(JS)、TypeScript(TS)、ArkTS、swift、PHP。 覆盖平台&#xff1a;安卓(Java、Kotlin)、iOS(SwiftUI)、Flutter(Dart)、Window桌面(C#)、…

Maplab 2.0发布:多传感器融合的SLAM框架,支持多机器人、语义回环检测功能

摘要 将多种传感器和深度学习集成到SLAM系统中是当前研究的重要领域。多模态是一块跳板&#xff0c;既可以在挑战场景下增强鲁棒性&#xff0c;又可以解决不同传感器配置的多机系统建图问题。Maplab 2.0提供了一个更加通用的开源平台&#xff0c;最初的Maplab用于创建和管理视…

5-3中央处理器-数据通路的功能和基本结构

文章目录一.功能二.基本结构三.数据流向&#xff08;一&#xff09;内部单总线方式1.寄存器之间的数据传送2.主存与CPU之间的数据传送3.执行算术或逻辑运算&#xff08;二&#xff09;专用数据通路方式一.功能 数据在功能部件之间传送的路径称为数据通路。路径上的部件称为数据…

合宙ESP32C3上手使用

概述经典款是有ch343 ttl 转usb 需要安装驱动 GPIO20/21新款使用usb 直连不需要驱动 USB GPIO18/19ESP32C3 是ESP-RISC-V CPU 是基于 RISC-V ISA 的 32 位内核&#xff0c;包括基本整数 (I)&#xff0c;乘法/除法 (M) 和压缩 (C) 标准扩展。ESP-RISC-V CPU 内核具有 4 级有序标…

【蓝桥杯】简单数论1——GCDLCM

GCD 最大公约数Greatest Common Divisor(GCD)&#xff1a;整数a和b的GCD是指能同时整除a和b的最大整数&#xff0c;记为gcd(a,b)。由于-a的因子和a的因子相同&#xff0c;因此gcd(a, b) gcd(al, |bl)。编码时只关注正整数的最大公约数。 GCD性质 (1) gcd(a, b) gcd(a, ab) …

一、python准备工作篇(黑马程序猿-python学习记录)

黑马程序猿的python学习视频&#xff1a;https://www.bilibili.com/video/BV1qW4y1a7fU/ 目录 1. python官网 2. 检查是否安装完毕 3. pycharm官网 5. phcharm更换主题 6. 新建第一个python文件 7. pycharm字体大小设置 8. 设置快捷键 设置字体大小 ​​​​​​​9. 安装中文…

Python机器学习:假设检验

方差分析这部分内容还不是很理解&#xff0c;在这里先做一个笔记&#xff0c;以后有时间再回过头来改一改。 用到的数据集→\rightarrow→Iris 什么是假设检验&#xff1f; 假设检验就是利用样本数据对某个事先做出的统计假设&#xff0c;再按照某种方法去检验&#xff0c;最后…

CSS样式基础内容2

目录 Emmet语法 快速格式化代码 CSS的复合选择器 后代选择器 子选择器 并集选择器 伪类选择器 链接伪类选择器 focus伪类选择器 CSS元素显示模式 块元素 行内元素 行内块元素 元素显示模式转换 案例-简洁版侧边栏 单行文字垂直居中 CSS的背景 背景图片 方位名词…