Linux驱动----总线

news2024/9/22 21:12:21

总线相关

  • 总线
    • 注册和注销总线
    • device对象----描述设备信息,包括地址,中断号和其他的一些自定义数据
      • 注册和注销device对象----指将device注册到mybus总线
    • driver对象----描述设备驱动的方法(操作地址和中断)
      • 注册和注销driver对象----指将driver注册到mybus总线
      • 总线匹配成功之后,如何自动调用driver的probe方法
  • 平台总线
    • 平台总线作用
    • 平台总线中的三元素

总线

在这里插入图片描述

总线的作用是将设备与驱动关联起来,或者称为管理起来,完成匹配
总线是在sys/bus目录下的,linux文件系统已经预设了一些总线,例如IIC总线,SPI总线,USB总线等,我们也可以自己创建自己的总线,以下是创建自己的总线需要注意的地方:

struct bus_type  : 总线对象,描述一个总线,管理device和driver
struct bus_type {
	const char *name;
	int (*match)(struct device *dev, struct device_driver *drv);
}

注册和注销总线

int bus_register(struct bus_type *bus);
void bus_unregister(struct bus_type *bus);

注册总线和注销总线需要分别写在模块初始化和模块退出的部分,这里不再赘述。

需要将device和driver分别放入我们的总线中进行匹配,因此需要先创建device和driver对象

device对象----描述设备信息,包括地址,中断号和其他的一些自定义数据

设备对象,用于描述设备信息,包括地址,中断号和其他的一些自定义数据。

struct device{
	struct kobject kobj,  //所有对象的父类
	const char *init_name,  //在总线中的名字,用于做匹配,在sys/bus/mybus/device/名字
	struct bus_type *bus,  //依附于总线的对象,也就是在哪个bus中
	void *platform_data, //自定义的数据,可以指向任何数据类型
	.....
}

注册和注销device对象----指将device注册到mybus总线

int device_register(struct device *dev);
void device_unregister(struct device *dev); 

driver对象----描述设备驱动的方法(操作地址和中断)

struct device_driver{
	const char *name,  //driver的名字, 用于匹配 sys/bus/mybus/driver/名字
	struct bus_type, //指向该对象依附于哪个总线的
	int (*probe)(struct device* dev); //如果device和driver匹配后,driver要做的事情
	int (*remove)(struct device* dev); //如果device和driver从总线移除之后,driver要做的事情
}

注册和注销driver对象----指将driver注册到mybus总线

int driver_register(struct device_driver *drv);
void driver_unregister(struct device_driver *drv); 

总线匹配成功之后,如何自动调用driver的probe方法

1、实现bus对象中的match方法

int match_mybus(struct device *dev, struct device_driver* drv){
	//如果匹配成功,match方法返回一个1,否则返回0
	if(! strncmp(drv->name,  dev->kobj.name, strlen(drv->name))){
		printk("match ok\n");
		return 1;
	}else {
		printk("match failed\n");
		return 0;
	}
	return 0;
}

2、保证driver和device中的名字一致,总线中调用match去匹配,匹配成功才能自动执行drv中的probe方法执行匹配成功后的操作

struct device_driver my_driver = {
	.name = "fs_dev_drv", 
	.bus = &mybus,
	.probe = my_drvprobe,
};

struct my_devinfo deviceinfo = {
	.name = "testdev",
	.irqno = 0000,
	.addr = 0x8888,
};
struct device my_device = {
	.init_name = "fs_dev_drv",
	.bus = &mybus,
	.platform_data = &deviceinfo,  //通过platform指向一个描述硬件设备的结构体
};
int probe(struct device* dev);  //可以实现例如通过probe函数获取dev中某个设备的中断号,地址等

struct my_devinfo *pdesc;
int my_drvprobe(struct device* dev){
	pdesc = (struct my_devinfo* )dev->platform_data;
	printk("name = %s\n", pdesc->name);
	printk("irqno = %d\n", pdesc->irqno);
	unsigned long *paddr = ioremap(pdesc->addr, 8);
	return 0;
}

平台总线

平台总线作用

用于平台升级:当soc升级的时候,相似的驱动代码需要编写很多次,其中会有大量重复,因此需要平台总线

device(中断/地址)和driver(操作逻辑)分离,这样就可以在平台升/级的时候修改device中的信息(中断/地址)即可,实现一个driver驱动多个相似的模块,并且修改的代码量很少。

平台总线中的三元素

1、bus:platform_bus不需要自己创建,开机的时候自动创建

struct bus_type platform_bus_type = {
	.name = "platform",
	.dev_group = platform_dev_groups,
	.match = platform_match,
	.uevent = platform_uevent,
	.pm = &platform_dev_pm_ops,
};

匹配方法:
优先匹配driver中的id_table, 里面包含了支持不同平台的名字,
直接匹配driver中的名字和device中的名字

int platform_match(struct device* dev, struct device_driver* drv);
int platform_match(pdev, pdrv){
	if(pdrv->id_table)
		return platform_match_id(pdrv->id_table, pdev)  != NULL; //先匹配driver中的id_table
	return (strcmp(pdev->name, drv->name) == 0);匹配driver中的名字和device中的名字
}

2、device对象

struct platform_device{
	const char *name, //用于做匹配
	int id, //一般直接给-1
	struct device dev, //继承了device父类
	u32	num_resources, //资源的个数
	struct resource *resource, // 资源:包括了一个设备的地址和中断
}

3、driver对象

struct platform_driver {
	int (*probe)(struct platform_device *),  //匹配成功后调用的函数
	int (*remove)(struct platform_device *),  //device移除后调用的函数
	const struct platform_device_id *id_table,  //如果driver支持多个平台,在列表中写出来
	struct device_driver driver,  //继承了drvier父类
};

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

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

相关文章

38 器件移动、旋转、镜像、对齐、等间距操作介绍39 器件、网络、过孔锁定与解锁操作40 相同模块复用操作41 测量、查询功能介绍

38 器件移动、旋转、镜像、对齐、等间距操作介绍&&39 器件、网络、过孔锁定与解锁操作&&40 相同模块复用操作&& 41 测量、查询功能介绍 第一部分 38 器件移动、旋转、镜像、对齐、等间距操作介绍第二部分 39 器件、网络、过孔锁定与解锁操作第三部分 4…

明确工作目标学习稿:计算技术体系的发展方向

学习2022年《孙凝晖:建立高水平自立自强的计算技术新体系》 计算所新时期的目标就是要建立高水平自立自强的计算技术新体系,其中,针对处理器提出“C体系”、针对信息基础设施提出“信息高铁”体系。 计算技术体系的新结构 包含C体系、信息高…

自建数据库VS云数据库

自建数据库VS云数据库 什么是自建数据库?自建数据库方案自建数据库的优点自建数据库的缺点什么是云数据库?自建数据库的缺点什么是云数据库? 云数据库方案云数据库的优点云数据库的缺点适用场景比较总结 【纪录片】中国数据库前世今生 在数字…

日志采集格式指定实验

目录 一. 进入配置文件,有两种方式指定采集格式 (1)日志默认格式指定 (2)指定用liu的格式采集某一个日志 二.重启服务 三.测试 #WESTOS_FORMAT: 格式名称 #%FROMHOST-IP%: 日志来源主…

合作开发中的Simulink算法保护

项目越来越大,分工越来越细,合作开发已经成为常态。在几家公司或者几个团队合作开发同一个项目的时候,经常会出现互相之间技术上要做一些保密工作,一方做的模型或代码不能给另一方看到,但又要求可以让对方能够运行自己…

File类的用法

目录 File的常见方法 普通文件的创建 普通文件的删除 deleteOnExit 目录的创建 mkdir mkdirs 文件的重命名和剪切 剪切 重命名 InputStream read() OutputStream write() Reader Writer write(String str) 代码练习 扫描指定⽬录,并找到名称中包含…

git clone private repo

Create personal access token Clone repo $ git clone https://<user_name>:<personal_access_tokens>github.com/<user_name>/<repo_name>.git

【DOCKER】VNC可视化UBUNTU容器

1. 启动测试容器 # 启动容器 # -e USERu20 vncserver所需环境变量 # -p 15901:5901 vncserver所需端口 docker run -id --privilegedtrue --restart always --useru20 --workdir/home/u20 -p 15901:5901 -e USERu20 --name ui u20:dev# 进入容器 docker exec -it ui /bin/ba…

jupyter支持跨机器远程访问

1. 远程访问场景 本地往往缺少GPU设备&#xff0c;为了让我们的代码能在有GPU设备的机器上运行&#xff0c;就需要在远程机器上启动jupyter notebook, 这意味着我们要在本地机器的浏览器上访问远程机器上的jupyter notebook。但是直接按ip访问会报如下错误&#xff1a; 因为ju…

MATLAB优化模型(3)

一、前言 在MATLAB中处理各种优化问题&#xff0c;如背包问题、指派问题&#xff08;也称为分配问题&#xff09;、抽屉原理应用、旅行商问题&#xff08;TSP&#xff09;以及排队论模型&#xff0c;通常需要结合MATLAB的优化工具箱&#xff08;如Optimization Toolbox&#xf…

C++ | 动态内存管理 new、delete (用法、底层)详解

目录 简单回顾C语言动态内存管理 new、delete的用法 内置类型 new delete 自定义类型 new、delete底层讲解&#xff08;重要&#xff09; operator new 与 operator delete 定位 new 结语 简单回顾C语言动态内存管理 在C语言的学习阶段 我们接触到了三个能在堆上开辟…

vulhub靶场之wordpress关卡(保姆级教程)

一.打开wordpress关卡 1.选择简体中文 然后添加信息 点击安装wordpress 1.2 登陆后台 1.3 在后台修改模板 1.4 找一个php文件&#xff0c;在最开头加入一句话木马 点击更新 然后访问默认模板路径 下面的是默认的模板路径 /wp-content/themes/twentyfifteen/404.php 然后…

JAVA基础 - 数据库编程

目录 一. 简介 二. 数据持久化 三. 安装MySQL 四. JDBC API 五. 三个重要接口 一. 简介 数据库编程是指使用编程语言与数据库进行交互&#xff0c;以实现数据的存储、检索、更新、删除等操作。 在数据库编程中&#xff0c;常见的任务包括&#xff1a; 连接数据库&#x…

Spring统一返回类型中关于String的问题

文章目录 1. 问题铺垫2. 解决方法3. 问题分析4 解决方法解释 1. 问题铺垫 首先设置了以下代码统一处理返回类型 ControllerAdvice public class ResponseAdvice implements ResponseBodyAdvice {Overridepublic boolean supports(MethodParameter returnType, Class converte…

GuLi商城-新增商品-获取分类下所有分组以及属性

/*** 根据分类id查询出所有的分组以及这些组里面的属性* @param catelogId* @return*/ @Override public List<AttrGroupWithAttrsVo> getAttrGroupWithAttrsByCatelogId(Long catelogId) {//1、查询分组信息List<AttrGroupEntity> attrGroupEntities = this.list(…

SwiftUI 中掌握 ScrollView 的使用:滚动可见性

文章目录 前言视图修饰符应用场景可见性完整示例ContentViewVideoPlayerViewScrollViewVisibilityApp 总结 前言 我们的滚动 API 中又有一个重要的新增功能&#xff1a;滚动可见性。现在&#xff0c;你可以获取可见标识符列表&#xff0c;或者快速检查并监控 ScrollView 内视图…

一文彻底搞懂 Fine-tuning - 超参数(Hyperparameter)

最近这一两周看到不少互联网公司都已经开始秋招提前批了。不同以往的是&#xff0c;当前职场环境已不再是那个双向奔赴时代了。求职者在变多&#xff0c;HC 在变少&#xff0c;岗位要求还更高了。 最近&#xff0c;我们又陆续整理了很多大厂的面试题&#xff0c;帮助一些球友解…

【Unity】web gl inputFied 中文输入,同时支持TextMeshInputFied,支持全屏

同时支持TextMeshInputFied&#xff0c;支持全屏。 使用github包【WebGLInput】&#xff1a;https://github.com/kou-yeung/WebGLInput 需要资源的在这里也可以下载 https://download.csdn.net/download/weixin_46472622/89600795 用于unity web gl 中文输入&#xff0c;只需…

本地项目提交到Gitee

在项目目录 右键 git bash here 可以在黑屏输入命令 也可以在项目里面 命令都是一样的 要排除哪些 git add . 添加所有文件 git commit -m "Initial commit" 提交到本地 git remote add origin https://gitee.com/xxxx/xxxx.git 添加远程仓库 …

2-54 基于matlab的模糊自适应PID控制器

基于matlab的模糊自适应PID控制器&#xff0c;PID参数的整定必须考虑到在不同时刻三个参数的作用及相互之间的关系。在线实时模糊自整定PID算法的基础上&#xff0c;通过计算当前系统e和误差变化率ec&#xff0c;利用模糊规则进行模糊推理&#xff0c;查询模糊矩阵表进行参数调…