平台总线模型简介

news2024/7/6 18:52:27

1. 平台总线介绍

平台总线模型将一个驱动分成两部分 device.c, driver.c。一个描述硬件, 一个控制硬件。
平台总线通过比较字符串, 将name相同的device.cdriver.c匹配到一起来控制硬件。
在这里插入图片描述
driver通过平台总线去拿到device.c内容。
平台总线的优点是减少重复代码 提高效率。
类似.h.c的关系
平台总线的原则是先分离, 后搭档。

2.注册Platform设备

在Linux内核里用platform_device的结构体描述硬件资源

struct platform_device {
	const char	*name; //device的名字, 将和driver的名字进行匹配
	int		id; //名字+id 为/sys/bus/platform/devices 下的名称
	bool		id_auto; // 自动设置id 一般不用
	struct device	dev;
	u32		num_resources;  // 存储资源的个数
	struct resource	*resource;

	const struct platform_device_id	*id_entry;
	char *driver_override; /* Driver name to force a match */

	/* MFD cell pointer */
	struct mfd_cell *mfd_cell;

	/* arch specific additions */
	struct pdev_archdata	archdata;
};

struct resource {
	resource_size_t start; //根据不同资源 理解不同 如 flags = REG 则代表起始地址
	resource_size_t end;
	const char *name; // 资源名称 如中断:irq
	unsigned long flags; // 资源类型. 如IO MEM REG IRQ DMA BUS
	unsigned long desc;
	struct resource *parent, *sibling, *child;
};

补充:
该结构体的名称为name + id可以在/sys/bus/platform/devices下查看。假设id=-1id不会显示。

下面是device的示例代码
执行完成在在/sys/bus/platform/devices目录下可以找到

#include <linux/module.h>
#include <linux/init.h>
#include <linux/platform_device.h>

static struct resource my_device_resources[] = {
    [0] = {
        .start = 0xFDD60000,
        .start = 0xFDD60004,
        .flags = IORESOURCE_MEM,
    },
    [1] = {
        .start = 13,
        .start = 13,
        .flags = IORESOURCE_IRQ,
    },
};

void mydevice_release(struct device *dev) {
    printk("device release ok...\n");
} 

struct platform_device platform_device_test = {
    .name = "mydeivce",
    .id = -1,
    .resource = my_device_resources,
    .num_resources = ARRAY_SIZE(my_device_resources),
    .dev = {
        .release = mydevice_release,// 必须实现
    }
};


static void platform_device_exit(void)
{
    platform_device_unregister(&platform_device_test);
    printk("device exit release ok...\n");
}

static int platform_device_init(void)
{
    platform_device_register(&platform_device_test);
    printk("device init release ok...\n");
    return 0;
}
module_init(platform_device_init);
module_exit(platform_device_exit);

MODULE_LICENSE("GPL");
MODULE_AUTHOR("fashi");
MODULE_VERSION("V1.0");

3.注册Platform驱动

platform driver结构体

struct platform_driver {
	int (*probe)(struct platform_device *); //匹配成功执行 一定实现
	int (*remove)(struct platform_device *); // 移除设备执行
	void (*shutdown)(struct platform_device *); //关掉设备执行
	int (*suspend)(struct platform_device *, pm_message_t state); //挂起执行
	int (*resume)(struct platform_device *); //恢复执行
	struct device_driver driver; // 设备公用属性
	const struct platform_device_id *id_table; //设备列表数组 里面可以存放多个设备名字符串 也可以用来匹配设备 优先级大于driver.name
	bool prevent_deferred_probe;
};

驱动加载匹配成功的时候会打印"This i mydriver_probe"

#include <linux/module.h>
#include <linux/init.h>
#include <linux/platform_device.h>

int mydriver_probe(struct platform_device *dev);

struct platform_driver platform_driver_test = {
    .probe = mydriver_probe,
    .driver = {
        .name = "mydeivce" //和匹配device name保持一致
    }
};

/* 匹配到的device结构体指针会传进来 */
int mydriver_probe(struct platform_device *dev)
{

    printk("This is mydriver_probe\n");
    printk("IRQ is %lld\n", dev->resource[1]->start);//获取在mydevice设备里定义的IRQ start 也可以使用platform_get_resource获取
    return 0;
}

static int platform_driver_init(void)
{
    platform_driver_register(&platform_driver_test);
    printk("driver init release ok...\n");
    return 0;
}

static void platform_driver_exit(void)
{
    platform_driver_unregister(&platform_driver_test);
    printk("driver exit release ok...\n");
}


module_init(platform_driver_init);
module_exit(platform_driver_exit);

MODULE_LICENSE("GPL");
MODULE_AUTHOR("fashi");
MODULE_VERSION("V1.0");

reference:
https://www.bilibili.com/video/BV1bP4y1v7Gc/?spm_id_from=333.999.0.0&vd_source=378aafb211994a6d9b19c51b8c69b7be

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

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

相关文章

中间件(三)- Kafka(一)

Kafka 1. Kafka简介1.1 名字由来1.2 主要特性1.3 相关术语1.4 架构图1.5 消息队列1.6 Kafka消费模式1. 一对一消费模式2. 一对多消费模式 1.7 消息中间件 2. Kafka安装及使用2.1 下载kafka2.2 修改配置文件2.3 启动2.4 docker启动 3. 简单指令3.1 topic相关3.2 Kafka 生产/消费…

`JOB`的正确打开方式

文章目录 JOB的正确打开方式 简介工作原理使用场景使用方式注意事项启动JOB失败的情况JOB正确打开方式错误方式正确方式进阶方式终极方式 总结 JOB的正确打开方式 最近有一些小伙伴在使用JOB时&#xff0c;由于使用不当&#xff0c;引起一些问题。例如把license占满&#xff0c…

ASEMI代理长电可控硅MCR100-8特征,MCR100-8应用

编辑-Z 长电可控硅MCR100-8参数&#xff1a; 型号&#xff1a;MCR100-8 VDRM/VRRM&#xff1a;600V IT(RMS)&#xff1a;0.8A 结点温度Tj&#xff1a;-40~125℃ 储存温度Tstg&#xff1a;-55 ~ 150℃ 通态电压VTM&#xff1a;1.7V 栅极触发电压VGT&#xff1a;0.8V 正…

泰克MDO4104C(Tektronix) mdo4104c混合域示波器

泰克 MDO4104C混合域示波器&#xff0c;1 GHz&#xff0c;4 通道&#xff0c;2.5 - 5 GS/s&#xff0c;20 M 点 ​泰克 MDO4104C 示波器是一款 6 合 1 集成示波器&#xff0c;可以配置可选的频谱分析仪、任意波形/函数发生器、逻辑分析仪、协议分析仪和 DVM/频率计数器。当配置…

黑盒测试能发现以下几类错误

黑盒测试能发现以下几类错误 黑盒测试是指在不考虑被测试软件的内部结构和工作原理的情况下&#xff0c;通过输入输出的方式对被测试软件进行测试。它主要关注被测试软件的功能是否达到预期的要求。黑盒测试能够发现以下几类错误。 1. 输入错误&#xff1a;黑盒测试可以检查被测…

如何增加网站权重?有效提高网站权重的技巧方法

权重对于网站优化来说非常的重要&#xff0c;那什么是网站权重呢&#xff1f;网站权重是指搜索引擎给网站&#xff08;包括网页&#xff09;赋予一定的权威值&#xff0c;对网站&#xff08;含网页&#xff09;权威的评估评价。一个网站权重越高&#xff0c;在搜索引擎所占的份…

【C++】虚表和虚基表到底有哪些区别?

虚表和虚基表 虚表虚基表虚拟继承和虚函数都存在时的对象模型 虚表 我们知道&#xff0c;如果类中声明了的方法是用virtual进行修饰的&#xff0c;则说明当前这个方法要作为虚函数&#xff0c;而虚函数的存储和普通函数的存储是有区别的 当有虚函数声明时&#xff0c;编译器会…

运营-16.个性化推荐

个性化推荐 个性化推荐&#xff0c;是根据用户的行为来分析用户的喜好&#xff0c;进而做商品精准推荐。 为什么要做个性化推荐&#xff1f; 1. 收集用户信息&#xff0c;精准获取用户需求&#xff1b; 2. 减少用户搜索商品的页面层级&#xff0c;提高转化率&#xff1b; …

聊聊 Milvus GC:从一次数据丢失事件展开

QueryNode 日志中频繁报错&#xff1f;对象存储数据离奇消失[1]&#xff1f; 令人震惊的数据丢失事件就这样发生了&#xff0c;一位来自 BOSS 直聘的 AI 研发工程师无意卷入到此次的风波中&#xff0c;他和 Milvus 社区的伙伴经过层层排查、抽丝剥茧&#xff0c;成功找出了问题…

还在用 JS 做节流吗?CSS 也可以防止按钮重复点击

目录 一、CSS 实现思路分析 二、CSS 动画的精准控制 三、CSS 实现的其他思路 四、总结一下 众所周知&#xff0c;函数节流&#xff08;throttle&#xff09;是 JS 中一个非常常见的优化手段&#xff0c;可以有效的避免函数过于频繁的执行。 举个例子&#xff1a;一个保存按…

opencv_c++学习(二十)

一、形态学应用案例 开、闭运算、形态学梯度等原理&#xff1a; 相关函数: morphologyEx(InputArray src, OutputArray dst, int op, lnputArray kernel, Point anchor Point(-1,-1), int iterations 1, int borderType BORDER_CONSTANT, const Scalar & border…

Android中静态和动态文字的绘制和测量

Android中静态和动态文字的绘制和测量 Android中自定义视图的时候存在两种情况&#xff0c;静态文字和动态文字。 顾名思义&#xff0c;静态文字就是显示内容是固定的&#xff0c;不会产生变化的文字&#xff0c;而动态文字则是内容会不断产生变化的文字信息。 在说明为什么…

Revit技巧 | Revit中图元不可见怎么办?

在revit中&#xff0c;控制图元课件性的设置有很多种&#xff0c;因此图元不可见&#xff0c;也会有各种各样的原因&#xff0c;这也是经常困扰新手的问题&#xff0c;下面我把这些解决办法做一些归纳总结。 图元如果过远偏离当前视图的中心&#xff0c;将导致视图不可见这时&…

MySQL:数据库的查询与连接

目录 1.复合查询 1.1 多表查询&#xff08;联合查询&#xff09; 1.2 join on (inner join) 1.3 自连接 1.4 子查询 1.5 合并查询 2.内外连接 3.关于高内聚、低耦合 1.复合查询 1.1 多表查询&#xff08;联合查询&#xff09; 什么是多表插叙&#xff1f;实际开发中往…

网络安全管理员证书有什么用?2023证书怎么考?证书报考条件?

网络安全管理员是做什么工作的呢&#xff1f;现如今&#xff0c;网络高速发展&#xff0c;带动了很多行业的兴起&#xff0c;比如说电商行业&#xff0c;今天已经步入到足不出户即可购物的时代了&#xff0c;当然网络也是一把“双刃剑”&#xff0c;带来了好处的同时&#xff0…

Sui Move Object讲解

要了解Sui的独特特性&#xff0c;首先要了解Sui中以对象为中心的数据模型。 Sui的设计初衷是重新定义数字资产所有权的可能性。重新设计的一个基本部分 — — Sui是以对象为中心的数据模型&#xff0c;也是Sui和其他Layer 1区块链之间的一个显著区别。 其他L1如何处理资产所有…

day8 - 使用不同的滤波核进行图像降噪

本期主要介绍用于图像平滑处理的滤波&#xff0c;分别是方框滤波、均值滤波、中值滤波、高斯滤波&#xff0c;比较不同滤波的效果&#xff1b;并了解自定义滤波器进行图像处理。 完成本期内容&#xff0c;你可以&#xff1a; 会使用方框滤波、均值滤波、中值滤波、高斯滤波进行…

实时聊天组合功能,你了解吗?

你有兴趣安装实时聊天组合功能吗&#xff1f;如果您选择了SaleSmartly&#xff08;ss客服&#xff09;&#xff0c;您的实时聊天插件可以不仅仅只是聊天通道&#xff0c;还可以有各种各样的功能&#xff0c;你不需要包含每一个功能&#xff0c;正所谓「宁缺勿滥」&#xff0c;功…

Windows主机中构建适用于K8S Operator开发环境

基于 win 10 打造K8S应用开发环境 一、wsl子系统安装 在cmd命令行终端或powershell中操作 1.1 确认windows操作系统版本 1.2 开启wsl功能 1.3 wsl配置 PS C:\Users\cpf> wsl提示&#xff1a;适用于 Linux 的 Windows 子系统没有已安装的分发版。可以通过访问 Microsoft St…

使用canvas给图片添加水印

上接文章“图片处理” canvas元素其实就是一个画布&#xff0c;我们可以很方便地绘制一些文字、线条、图形等&#xff0c;它也可以将一个img标签里渲染的图片画在画布上。 我们在上传文件到后端的时候&#xff0c;使用input标签读取用户本地文件后得到的其实是一个Blob对象&a…