Linux设备驱动platform驱动

更全面的内容可以查看我的github
提供了示例代码

platform设备驱动

Linux 系统要考虑到驱动的可重用性,因此提出了驱动的分离与分层这样的软件思路,为了达到所有硬件都可以按照总线设备驱动模型来实现驱动,Linux从2.6起就加入了 platform 设备驱动,在内核中建立一条虚拟的总线platform,它可以将那些不依赖于传统总线(如PCI, USB, I2C等)的设备,虚拟的挂在了platform总线上,达到统一。

platform总线驱动

platform总线驱动的代码可以查看linux/drivers/base/platform.c文件

platform 设备驱动

重要结构体

platform_device结构体

内核使用platform_device结构体来描述一个platform设备,该结构体定义位于Linux/include/linux/platform_device.h

struct platform_device
{// 设备的名字,用于和驱动进行匹配的const char *name;// 内核中维护的所有的设备必须包含该成员struct device dev;//资源个数u32 num_resources;	//描述资源struct resource * resource;...
};

这个结构体是为驱动程序提供设备信息,包括硬件信息和软件信息。

对于硬件信息,使用platform_device中的成员resource来描述,结构体如下

struct resource {resource_size_t start;  // 资源的起始地址resource_size_t end;    // 资源的结束地址const char *name;       // 资源的名字unsigned long flags;    // 资源的类型
};

flags可以常见的有下面几种:

  • IORESOURCE_IO:用于 IO 地址空间,对应于 IO 端口映射方式
  • IORESOURCE_MEM:用于外设的可直接寻址的地址空间
  • IORESOURCE_IRQ:用于指定该设备使用某个中断
  • IORESOURCE_DMA:用于指定使用的 DMA 通道

struct resource一般按下面方法使用

struct resource	res[]={[0] ={.start = 0x139d0000,.end  = 0x139d0000 + 0x3,.flags = IORESOURCE_MEM,},[1] ={.start = 199,.end  = 199,.flags = IORESOURCE_IRQ,},	
};
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;  bool prevent_deferred_probe;
};
  • probe: 当驱动和硬件信息匹配成功之后,就会调用probe函数,驱动所有的资源的注册和初始化全部放在probe函数中
  • remove: 当设备被移除时,此函数被调用。
  • shutdown: 系统关闭时,此函数被调用。
  • suspend 和 resume: 电源管理相关的回调,用于设备挂起和恢复(已经过时)
  • driver: 这是一个 struct device_driver 结构体,包含了驱动的一些通用信息。
  • id_table: 往往一个驱动可能能同时支持多个硬件,这些硬件的名字都放在该结构体数组中。

API

注册/注销设备
int platform_device_register(struct platform_device *pdev);
void platform_device_unregister(struct platform_device *pdev);
注册/注销驱动API
int platform_driver_register(struct platform_driver *drv);
void platform_driver_unregister(struct platform_driver *drv);

对于上面的函数,可以使用下面的宏替代

module_platform_driver(platform_driver)
// platform_driver 是platform_driver结构体

这个宏会定义指定名称的平台设备驱动注册函数和平台设备驱动注销函数,并且在函数体内分别通过platform_driver_register()函数和platform_driver_unregister()函数注册和注销该平台设备驱动。

获取resource
struct resource *platform_get_resource(struct platform_device *dev,unsigned int type, unsigned int num);
  • dev:指向要获取哪个设备的资源
  • type:资源类型
  • num:资源编号

框架

platform的驱动一般分为两个.c文件,一个是platform_driver.c文件,一个是platform_device.c文件。

在platform_device.c中,我们一般需要填充struct platform_device结构体和struct resource结构体,并使用platform_device_register()函数注册设备。这个文件必须先于
platform_driver.c文件完成,因为platform_driver.c文件中需要使用到struct platform_device结构体。

在platform_driver.c文件中,我们需要填充platform_driver结构体,platform_driver结构体中定义了probe函数,probe函数中会调用platform_get_resource函数获取设备资源,然后调用platform_set_drvdata函数将设备资源设置到设备结构体中。

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

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

相关文章

8086 汇编笔记(八):转移指令的原理

一、操作符 offset 操作符offset在汇编语言中是由编译器处理的符号,它的功能是取得标号的偏移地址 codesg segmentstart: mov ax,offset start ;相当于 mv ax,0s: mov ax,offset s ;相当于 mv ax,3codesg endsend start 二、jmp 指令 jmp为无条件…

【面试宝藏】容器技术详解其二

Docker与容器化技术详解 15. Docker Image 和 Docker Layer(层)有什么不同? Docker Image:Docker镜像是一个不可变的文件,包含应用程序的所有依赖项、库、配置和环境变量。它是运行Docker容器的基础,包含…

每天一个数据分析题(三百五十)

在“人货场”的业务模块下,有可能成为描述“场”的情况的相关数据表是 A. 订单表 B. 订单详情表 C. 客户详情表 D. 区域表 数据分析认证考试介绍:点击进入 题目来源于CDA模拟题库 点击此处获取答案

【二叉树】Leetcode 222. 完全二叉树的节点个数【简单】

完全二叉树的节点个数 你一棵 完全二叉树 的根节点 root ,求出该树的节点个数。 完全二叉树 的定义如下:在完全二叉树中,除了最底层节点可能没填满外,其余每层节点数都达到最大值,并且最下面一层的节点都集中在该层最…

【云原生_K8S系列】什么是 Kubernetes Pod?用实际例子解释

Kubernetes(简称K8S)是一个开源的容器编排平台,用于自动化容器化应用的部署、扩展和管理。在Kubernetes中,Pod是最小的部署单元。理解Pod的概念对于掌握Kubernetes至关重要。本篇文章将详细解释什么是Kubernetes Pod,并…

数字孪生概念、数字孪生技术架构、数字孪生应用场景,深度长文学习

一、数字孪生起源与发展 1.1 数字孪生产生背景 数字孪生的概念最初由Grieves教授于2003年在美国密歇根大学的产品全生命周期管理课程上提出,并被定义为三维模型,包括实体产品、虚拟产品以及二者间的连接,如下图所示: 2011年&…

【机器学习】机器学习在深度学习领域中的作用:半监督学习的视角

👀时空之门👀 🔍引言🎈半监督学习概述🚝机器学习在深度学习领域中的作用☘特征提取与表示学习🍀复杂任务建模❀结合半监督学习提升性能 🚀半监督学习在深度学习中的应用场景📕图像识…

反弹shell检测的一些思路

前言 反弹shell是攻击者常用的手段之一,通过反弹Shell,攻击者可以绕过防火墙,获取目标系统的shell访问权限,进行后续的恶意操作。因此,及时检测并阻止反弹Shell行为对于安全防护来说非常重要。本文通过介绍反弹shell的…

Baidu Comate帮开发者“代码搬砖”,2天搞定原先3周工作量

日常项目基础工作耗费大量时间、紧急任务一连“肝”几个大夜……对于一个计算机相关专业研究生来说,几乎是家常便饭。随着大模型能力赋能编码工具,被开发者们戏称的“代码搬砖”生活有了起色。 从去年开始,PPDE 飞桨开发者技术专家、澳门理工…

CV每日论文---2024.6.3

1、Video-MME: The First-Ever Comprehensive Evaluation Benchmark of Multi-modal LLMs in Video Analysis 中文标题:Video-MME:视频分析领域首个多模态法学硕士综合评估基准 简介:Video-MME 是一个全面评估多模态大语言模型(M…

day54_60

1.判断子序列 class Solution {public boolean isSubsequence(String s, String t) {if (s.length() 0) return true;for (int i 0, j 0; j < t.length(); j) {if (s.charAt(i) t.charAt(j)) {// 若已经遍历完 s &#xff0c;则提前返回 trueif (i s.length())return …

MAX7219(模拟SPI)驱动灯环的简单应用

文章目录 一、MAX7219是什么&#xff1f;二、使用步骤1.硬件1.1 引脚说明1.2 应用电路1.2.1 驱动数码管1.2.2 驱动点阵 2.软件2.1 时序2.2 寄存器2.2.1 掉电寄存器2.2.2 译码模式寄存器2.2.3 亮度寄存器2.2.4 扫描寄存器2.2.5 显示测试寄存器 2.3 初始化2.4 控制左侧灯环特定位…

一个小时搞定JAVA面向对象(5)——抽象与接口

文章目录 抽象抽象的注意事项static\final\private是否可以修饰抽象方法继承和抽象知识点回顾 接口接口实现总结抽象方法默认方法静态方法成员变量接口的特点接口和抽象类的区别 抽象 关键字: abstract 抽象方法: 修饰符 abstract 返回值类型 方法名(参数); 抽象类: public a…

大厂起诉了,协商拿了2N,整理点经验心得给大家,关于离职时如何让自己利益最大化!...

离职时&#xff0c;如何让自己的利益最大化&#xff1f; 一位跟大厂仲裁&#xff0c;并通过协商拿到2n的网友分享了自己的经验心得&#xff0c;干货满满&#xff0c;下面是要点总结&#xff1a; 1.大部分裁员都是违法裁员&#xff0c;应该给2n&#xff0c;但公司不会承认&…

oracle获取去年的第12月第一天

要获取去年的12月份的第一天&#xff0c;你可以使用ADD_MONTHS和TRUNC函数组合。这里是一个简单的SQL查询&#xff0c;它将返回去年的12月1日&#xff1a; sql复制代码 SELECT TRUNC(ADD_MONTHS(TRUNC(SYSDATE, YYYY), -1), MM) AS first_day_of_last_december FROM dual; 在…

【代码随想录——贪心算法——二周目】

1.买卖股票的最佳时间② 思路&#xff1a;构建每两天之间的利润之差&#xff0c;如果是正数则一直累加即可。 体现出来场景是&#xff0c;如果理论一直为正&#xff0c;则说明我们需要一直持有股票。当出现负数时&#xff0c;代表我们应该在前一天卖出。当出现正数时我们应该在…

客户端打开浏览器post提交数据

客户端请求url提交post数据的方式很多, 例如HttpWebRequest,HttpClient, 或者第三方的RestSharp以及Flurl 等. 使用也比较简单方便,资料一搜一大堆,不重点写了. 这里主要记录一种使用客户端登录,并且点击触发单点登录到浏览器页面跳转的一种方式. 客户端程序可以轻松启动电…

【耗时十个小时】程序员最趁手的SVM算法,学完你会哭着感谢努力的自己!

❤ 纯 干 货 ❤ 在这之前咱们已经接触了 各个算法的优缺点的总结&#xff0c;以及8个回归类算法、7个正则化算法的总结、5 个集成算法模型的全部总结&#xff01; 感兴趣的可以翻到之前看看~ 咱们今天就大概一起学习一下关于SVM的方方面面。 线性支持向量机 非线性支持向量…

【全开源】Java同城服务同城信息同城任务发布平台小程序APP公众号源码

&#x1f4e2; 连接你我&#xff0c;让任务触手可及 &#x1f31f; 引言 在快节奏的现代生活中&#xff0c;我们时常需要寻找一些便捷的方式来处理生活中的琐事。同城任务发布平台系统应运而生&#xff0c;它为我们提供了一个高效、便捷的平台&#xff0c;让我们能够轻松发布…

Python笔记 - Lambda表达式

探索Python中的Lambda表达式 在Python编程中&#xff0c;lambda表达式是一种简洁而强大的工具&#xff0c;用于创建匿名函数。与普通函数不同&#xff0c;lambda函数没有名称&#xff0c;仅由一个表达式组成。本文将通过多个具体的代码示例&#xff0c;深入介绍lambda表达式的…