Linux驱动学习之点灯(六,利用平台设备总线)

news2024/12/25 1:41:03

平台设备总线

平台设备总线是内核虚拟的一条总线,早期没有设备树时,通过名字匹配设备信息,如今有设备树通过设备树里的complitable属性匹配,下图是平台设备总线的结构体描述。

much函数是完成信息匹配的,

总线就是使用 match函数来根据注册的设备来查找对应的驱动,或者根据注册的驱动来查找相应的设备,因此每一条总线都必须实现此函数。 match函数有两个参数: dev和 drv,这两个参数分别为 device和 device_driver类型,也就是设备和驱动。
platform总线是bus_type的一个具体实例。

既然match是完成信息匹配的我们来重点关注这个函数

不难发现,先通过of方法匹配设备树里的 节点(通过compatible)不断往里跳

然后再匹配其他,最后通过name匹配。

下面是platform_driver结构体

这个我们是很熟悉的
probe函数,驱动和设备匹配成功以后会执行
driver成员,面向对象,device_driver为基类,platform_driver集成了这个基类并添加了一些特有的成员变量

of_match_table这个结构体我我们需要提供compatible 信息

由这个函数可以看出来(往里跳)

compatible非常重要,对于设备树而言,就是通过设备节点的compatiable属性值和of_match_table中每个项目的compatible成员变量进行比较,如果有相等的就表示设备和此驱动匹配成功

代码实现

定义一个平台驱动,实现probe和remove函数,分别在加载和卸载的时候会自动执行,

然后在driver里定义名子(一定要写,不然加载驱动会加载不上如下图),最后写出匹配表格

然后在 myprobe里实现 设备注册,在myremove里实现设备卸载

代码实列

#include "linux/device/class.h"
#include "linux/gpio.h"
#include "linux/of_gpio.h"
#include "linux/platform_device.h"
#include "linux/printk.h"
#include <linux/module.h>
#include "linux/device/driver.h"
#include "linux/cdev.h"
uint32_t pin1;
uint32_t pin2;
struct class *cls;
struct cdev *cdev;
static dev_t dev_num;
static int open (struct inode *i, struct file *f)
{
    gpio_set_value(pin1,0);
    gpio_set_value(pin2,0);
    return 0;
}
static int close (struct inode *i, struct file *f)
{
    gpio_set_value(pin1,1);
    gpio_set_value(pin2,1);
    return 0;
}
struct file_operations fops={
    .owner=THIS_MODULE,
    .open=open,
    .release=close,
};
int myprobe(struct platform_device *a)
{
  
   pin1=of_get_named_gpio(a->dev.of_node,"led_pin",0);
   pin2=of_get_named_gpio(a->dev.of_node,"led_pin",1);
   gpio_request(pin1,"led");
    gpio_request(pin2,"led");
    gpio_direction_output(pin1, 0);
    gpio_direction_output(pin2, 0);
      alloc_chrdev_region(&dev_num, 0, 1, "led");
    cdev= cdev_alloc();
    cdev->ops=&fops;
    cdev_add(cdev, dev_num,1);
   cls= class_create(THIS_MODULE, "led");
    device_create(cls,NULL,dev_num,NULL,"led");
    return 0;
}
int myremove (struct platform_device *dev){
     device_destroy(cls, dev_num);
    class_destroy(cls);
    unregister_chrdev_region(dev_num,1);
    gpio_free(pin1);
    gpio_free(pin2);
    printk(KERN_INFO "Goodbye, world!\n");
    return 0;
}
static struct of_device_id mymatch={
    .compatible="led",
};
struct platform_driver driver={
    .probe=myprobe,
    .remove=myremove,
    .driver={
        .name="led",
        .of_match_table=&mymatch,
    },

};
static int __init start(void)
{
    platform_driver_register(&driver);
    printk("hahaa\r\n");
    return 0;
}
static void __exit stop(void)
{
    platform_driver_unregister(&driver);
    printk("gun\r\n");
}
module_init(start);
module_exit(stop);
MODULE_LICENSE("GPL");

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

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

相关文章

Python 编程 之 tkinter : 导航栏与局部页面切换

import tkinter as tk class App: def __init__(self, root): self.root root self.root.title("导航栏与局部页面切换") self.root.geometry(800x500)self.root.minsize(width800, height300)# 创建导航栏 self.navbar tk.Frame(self.root, bggray) self.n…

TIM输出比较之PWM驱动直流电机应用案例

文章目录 前言一、应用案例演示二、电路接线图三、应用案例代码四、应用案例分析4.1 初始化PWM模块4.1.1 RCC开启时钟4.1.2 配置时基单元4.1.3 配置输出比较单元4.1.4 配置GPIO4.1.5 运行控制 4.2 PWM输出模块4.3 电机模块4.3.1 Motor初始化模块4.3.2 电机调速模块 4.4 主程序 …

0基础学习Python路径(21)Python NameSpaceScope

命名空间定义了在某个作用域内变量名和绑定值之间的对应关系&#xff0c;命名空间是键值对的集合&#xff0c;变量名与值是一一对应关系。作用域定义了命名空间中的变量能够在多大范围内起作用。 命名空间在 Python 解释器中是以字典的形式存在的&#xff0c;是以一种可以看得…

Linux Nvidia驱动一览

Unix Drivers | NVIDIAUnix Drivershttps://www.nvidia.cn/drivers/unix/

告别手动录入,自动化PDF转Excel工具精选

PDF文件可以跨平台高兼容&#xff0c;这就使得在很多需要保存页面版式的文件我们都用PDF格式进行传输。很多时候Excel文件也被这样转发&#xff0c;可是编辑却成为了问题&#xff0c;这时候要是能有pdf转换成excel的工具就能事半功倍了。 1.福昕PDF转换大师 链接一下>>…

【项目】微服务及时通讯系统:客户端环境搭建

1. 安装Qt6 下载在线安装工具 Qt6 相比 Qt5 在模块重组、图形渲染、性能优化和 C 标准支持方面都有显著改进&#xff0c;但不完全向后兼容&#xff0c;需要对旧代码进行调整。 Qt6项目中&#xff0c;一旦代码规模变大了&#xff0c;使用MinGW编译速度就会慢很多。MSVC&…

JavaWeb基础 -- Cookies与Session的区别

JavaWeb基础 – Cookies与Session的区别 1.内容简介 在Java开发面试过程中这类问题也是经常被面试官问到&#xff0c;因此本章将会讲解Cookies与Session的区别&#xff0c;与此同时也会顺带讲解Token、JWT的区别。 2.C/S会话 2.1 产生原因 HTTP协议是无状态的&#xff0c;即…

Linux权限管理应用实例

目录 权限管理应用实例1 权限管理应用实例2 权限管理应用实例3 权限管理应用实例1 有两个组police和bandit&#xff0c;四个用户jack&#xff0c;jerry&#xff0c;xh&#xff0c;xq。 权限管理应用实例2 创建这两个组还有四个用户&#xff0c;并且给这些用户设置密码。 …

C++ 设计模式——命令模式

C 设计模式——命令模式 C 设计模式——命令模式主要组成部分构建过程命令模式 UML 图UML 图解析 命令模式的优点命令模式的缺点命令模式适用场景总结完整代码 C 设计模式——命令模式 命令(Command)模式是一种行为型模式&#xff0c;它将请求封装为对象&#xff0c;从而使您能…

百度云语音识别demo验证

百度云语音识别调研 百度语音识别API: https://ai.baidu.com/ai-doc/SPEECH/il9mh8cjb 1: 注册登录百度账户. 2:打开控制台选择语音技术. 3: 领取免费额度(个人账户.企业账户不确定是否免费额度一样) 4: 由于开发测试使用,可以选择不需要包名. 5: 下载demo程序: https://g…

pat1074 k个一组反转链表

是我的错觉吗 直接把%d赋值给数组小标&#xff0c;不能把值副进去&#xff1f; 可是这样可以&#xff1f; 乱套了这 同样的代码 所以暂时将你眼睛闭了起来 所以还是好好老实两次赋值 。。。 写糊了已经 注意这句话 链表中部翻转&#xff1a; 不带dummy真的好麻烦且头…

苹果手机照片格式heic怎么改jpg?教你3招快速转换

苹果手机照片格式heic怎么改jpg&#xff1f;将苹果手机照片格式从HEIC转为JPG&#xff0c;在日常使用中带来了极大便利。HEIC格式虽高效节省空间&#xff0c;但兼容性不如JPG广泛。转为JPG后&#xff0c;照片能轻松在多数设备、软件和在线平台上分享、打印或编辑&#xff0c;无…

SmartGit-Git版本控制系统的图形化客户端

SmartGit&#xff1a; SmartGit是一款免费的、专业的Git版本控制系统的图形化客户端。它适用于Windows、Mac和Linux等多种操作系统&#xff0c;提供了直观的用户界面和丰富的功能。支持创建、克隆、推送、拉取、合并和管理Git仓库&#xff0c;以及强大的分支管理功能。还提供了…

武汉流星汇聚:亚马逊中国卖家精准布局,万圣节装饰热销引领潮流

随着秋风渐起&#xff0c;万圣节的脚步虽还远在三个月之后&#xff0c;但消费者对于节日氛围的营造与期待已悄然升温。在亚马逊这一全球电商巨头的平台上&#xff0c;万圣节相关产品的搜索热潮正以前所未有的速度席卷而来&#xff0c;为中国卖家提供了又一个展示实力、捕捉商机…

大模型概念入门:探索这一AI技术的奥秘

一、引言 ChatGPT、Open AI、大模型、提示词工程、Token、幻觉等人工智能的黑话&#xff0c;在2023年这个普通却又神奇的年份里&#xff0c;反复的冲刷着大家的认知。让一部分人彻底躺平的同时&#xff0c;让另外一部分人开始焦虑起来&#xff0c;生怕在这个人工智能的奇迹之年…

无人机搭载的高压喷水清洗技术详解

随着城市化进程的加速&#xff0c;高空建筑、桥梁、电力设施等清洁维护问题日益凸显。传统的人工清洗方式不仅效率低下、成本高昂&#xff0c;还存在高空作业安全风险。无人机搭载的高压喷水清洗技术应运而生&#xff0c;以其独特的优势成为解决这一难题的新方案。该技术通过无…

不看表了

前段时间重温了一遍刘德华在1992年拍的《赌城大亨-新哥传奇》&#xff0c;里面叶倩文唱的《不了情》&#xff0c;顾媚唱的太凄&#xff0c;小凤姐唱的太醇&#xff0c;而莎莉叶倩文唱的太有大时代风云际会儿女情长味道。 刘德华华仔和邱淑贞豆豆&#xff0c;合作拍摄的两部大佬…

网络空间安全中的数字孪生技术研究

源自&#xff1a;系统仿真学报 作者&#xff1a;任乾坤,熊鑫立,刘京菊&#xff0c;姚倩 注&#xff1a;若出现显示不完全的情况&#xff0c;可 V 搜索“人工智能技术与咨询”查看完整文章 人工智能、大数据、多模态大模型、计算机视觉、自然语言处理、数字孪生、深度强化学习…

软件工程造价师习题练习 19

1.在 A 系统中&#xff0c;用户可以对白名单进行新增、删除与查询的操作。在查询的过程中&#xff0c;用户在搜索框内录入关键字&#xff0c;这个“录入”可以识别为非基本过程。 正确 错误 在A系统中&#xff0c;用户对白名单进行新增、删除与查询的操作构成了系统的主要功能…