linux platform 总线(设备树)驱动

使用文档

设备树修改

新增一个 LED 节点 arch/arm/boot/dts/arm/vexpress-v2p-ca9.dts

	my_pl_led {compatible = "arm, cortex-a9-led";status = "okay";};

设备树编译

make dtbs

日志

  DTC     arch/arm/boot/dts/arm/vexpress-v2p-ca9.dtb

platform driver 源码

#include "linux/export.h"
#include "linux/ioport.h"
#include <linux/fs.h>
#include <linux/init.h>
#include <linux/kernel.h>
#include <linux/module.h>
#include <linux/platform_device.h>
#include <linux/types.h>
#include <linux/mod_devicetable.h>
#include <linux/of.h>#define PLATFORM_DEVICE_NAME "my_pl_led" /* 匹配设备树节点的名字 */static int my_probe(struct platform_device *device)
{printk("platform driver probe\r\n");struct device_node *my_device_node;my_device_node = of_find_node_by_name(NULL, PLATFORM_DEVICE_NAME);if (my_device_node) {printk("device node name %s \r\n", my_device_node->name);/* 获取  compatible 属性的字符串。*/const char *compatible;compatible = of_get_property(my_device_node, "compatible", NULL);if (compatible) {printk("Compatible property: %s\n", compatible);} else {printk("Compatible property not found\n");}/* 获取  status 属性的字符串。*/compatible = of_get_property(my_device_node, "status", NULL);if (compatible) {printk("status property: %s\n", compatible);} else {printk("status property not found\n");}} else {printk("can't find device node\r\n");}return 0;
}static int my_remove(struct platform_device *device)
{printk("platform driver remove\r\n");return 0;
}/*** @brief include mod_devicetable.h. 传统匹配方式ID列表* */
static const struct platform_device_id test_id_table = {.name = "low pri name", /* 用于非设备树匹配的时候,如果有设备树,可以匹配 compatible 属性的名字。 */
};/* 匹配列表 */
static const struct of_device_id led_of_match[] = {{ .compatible = "arm, cortex-a9-led" }, /* 和设备树节点 compatible 匹配的名字 */{ /* Sentinel */ },
};static struct platform_driver platform_driver_test = {.probe = my_probe,.remove = my_remove,.driver = {.of_match_table = led_of_match, /* 设备树匹配机制,匹配设备树中的 compatible 属性,优先级高 */.name = "my_pl_driver", /* platform 驱动名(ls /sys/bus/platform/drivers/my_pl_driver/) */.owner = THIS_MODULE,},.id_table   = &test_id_table, /* 旧的匹配机制,优先级低 */
};static int __init platform_driver_init(void)
{platform_driver_register(&platform_driver_test);printk("k: platform driver module init!\r\n");return 0;
}static void __exit platform_driver_exit(void)
{platform_driver_unregister(&platform_driver_test);printk("k: platform driver module exit!\r\n");
}module_init(platform_driver_init);
module_exit(platform_driver_exit);MODULE_LICENSE("GPL");
MODULE_AUTHOR("tyustli");
MODULE_INFO(intree, "Y"); /* loading out-of-tree module taints kernel */

makefile 源码

# 指定内核路径
KERNELDIR := /home/tyustli/code/open_source/kernel/linux-6.5.7
# 指定当前路径
CURRENT_PATH := $(shell pwd)
# 指定编译的模块名
obj-m := my_platform_driver.obuild: kernel_moduleskernel_modules:$(MAKE) -C $(KERNELDIR) M=$(CURRENT_PATH) modules
clean:$(MAKE) -C $(KERNELDIR) M=$(CURRENT_PATH) clean

编译驱动

../my_module_build.sh ../0013_dtsplatform/

查看模块 ko 文件

ls /lib/modules/6.5.7+/
my_platform_driver.ko

查看 platform 设备

ls /sys/bus/platform/devices/my_pl_led/
driver_override       power                 waiting_for_supplier
modalias              subsystem
of_node               uevent

platform 驱动

如果编译报错

 error:const struct platform_device_id’ has no member named ‘name’

解决

#include <linux/mod_devicetable.h>

platform_device_id 结构体原型

struct platform_device_id {char name[PLATFORM_NAME_SIZE];kernel_ulong_t driver_data;
};

platform 驱动模块安装

modprobe my_platform_driver

匹配成功日志

platform driver probe
device node name my_pl_led 
Compatible property: arm, cortex-a9-led
status property: okay
k: platform driver module init!
drm-clcd-pl111 10020000.clcd: DVI muxed to daughterboard 1 (core tile) CLCD
drm-clcd-pl111 10020000.clcd: initializing Versatile Express PL111

查看 platform 驱动

ls /sys/bus/platform/drivers/my_pl_driver/
bind    module  uevent  unbind

退出

Ctrl + a
x

注意事项

static struct platform_driver platform_driver_test = {.probe = my_probe,.remove = my_remove,.driver = {.of_match_table = led_of_match, /* 设备树匹配机制,匹配设备树中的 compatible 属性,优先级高 */.name = "my_pl_driver", /* platform 驱动名(ls /sys/bus/platform/drivers/my_pl_driver/) */.owner = THIS_MODULE,},.id_table   = &test_id_table, /* 旧的匹配机制,优先级低 */
};

有两种匹配方式

  • driver 的 of_match_table 匹配优先级较高,用于匹配设备树中的 compatible。
  • id_table 旧的匹配机制,匹配优先级较低,用于没有设备树时匹配。

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

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

相关文章

python+selenium - UI自动框架之封装浏览器引擎driver方法

在做兼容性测试的适合&#xff0c;可以运行指定的浏览器&#xff08;IE,Chrome,Edge&#xff09; 目录文件&#xff1a; from selenium import webdriver from urllib3.exceptions import ProtocolError from common.log import *def getDriver():# if browserType is None:br…

数据分析必备:一步步教你如何用Pandas做数据分析(6)

1、Pandas 函数应用 Pandas 重建索引操作实例 要将您自己或其他库的函数应用于Pandas对象&#xff0c;您应该了解三个重要的方法。方法如下所述。要使用的适当方法取决于您的函数是希望对整个数据帧进行操作&#xff0c;还是行操作还是按列操作&#xff0c;还是按元素操作。 表…

多进程操作文件

最近在调试多进程编程的时候&#xff0c;发现父进程打开过文件后&#xff0c;创建子进程&#xff0c;子进程会拷贝父进程的文件描述符&#xff0c; 举例&#xff0c;比如是串口设备&#xff0c;父进程打开串口后又关闭了串口&#xff0c;可是下次再打开就打不开了&#xff0c; …

模拟面试题

1.装箱和拆箱是指什么&#xff1f; 装箱——把栈中内容迁移到堆中去&#xff08;值转引用&#xff09; 拆箱——把堆中内容迁移到栈中去&#xff08;引用转值&#xff09; 2.值和引用类型在变量赋值时的区别是什么&#xff1f; 值类型&#xff1a;赋值时复制数据本身&a…

Gitee在已有项目基础上创建仓库中遇到的问题和解决

问题一&#xff1a;fatal: remote origin already exists 解释&#xff1a;当前仓库添加了一个名为"origin"的远程仓库配置&#xff0c;此时输入 git remote add origin https://xxx就会提示上面的内容。 解决方案1:移除旧的origin git remote remove origin 解决方案…

C++——mapset红黑树

目录 一补充知识 1关联式容器 2键值对 二set 1set的介绍 2set的使用 三map 1map的说明 2map的使用 四容器在oj中的使用 五AVL树 1概念 2插入 3AVL的旋转 3.1右单旋 3.2左单旋 3.3左右双旋 3.4右左双旋 4判断AVL树是否平衡 完整源代码 六红黑树 1概念 2性…

【Shader】Unity曲面弯曲效果

本期分享一个弯曲效果的Shader&#xff0c;类似于地铁跑酷的跑道 1、Shaer代码 Shader "Unlit/CurvedUnlit" { Properties{_MainTex ("Texture", 2D) "white" {}}SubShader{Tags { "RenderType""Opaque" }LOD 100Pass{CGP…

紫光展锐突破创新终端品类,搭载展锐芯的全球首款二合一5G云电脑正式发布

近日&#xff0c;搭载紫光展锐5G芯片T760的中兴云电脑逍遥系列正式发布&#xff0c;亮点&#xff1a; 全球首款二合一5G云电脑&#xff0c;支持本地/云端双模式&#xff0c;一键切换&#xff0c;用户可同时享有Android平板和Windows云电脑两种形态&#xff1b;支持5G蜂窝网络&…

C++相关概念和易错语法(13)(string的模拟实现)

string由于存在字符串和单字符的概念&#xff0c;使得它的一些接口&#xff0c;实现要比vector多一些。本质上来看string的实现是在顺序表的基础上加入串相关的操作。下面我会分享如何模拟实现string&#xff0c;这可以进一步提高我们对string的熟练程度。 1.构造函数、拷贝构…

附代码:策略常用-正余弦优化算法

正余弦优化算法作为群智能优化算法的一种, 正弦余弦算法 (sine cosine algorithm, SCA) 是 2016 年由 Mirjalili 提出的一种新型仿自然优化算法, 通过创建多个随机候选解, 利用正余弦函数的数学性质来平衡算法在搜系过程中的全局探索和局部开发能力。该算法具有结构简单、参数少…

docker三种自定义网络(虚拟网络) overlay实现原理

docker提供了三种自定义网络驱动&#xff1a;bridge、overlay、macvlan。 bridge驱动类似默认的bridge网络模式。 overlay和macvlan是用于创建跨主机网络。 支持自定义网段、网关&#xff0c;docker network create --subnet 172.77.0.0/24 --gateway 172.77.0.1 my_n…

PPT大珩助手新功能-生成迷宫

大珩助手是一款功能丰富的办公软件插件&#xff0c;它主要分为两个版本&#xff1a;PPT大珩助手和Word大珩助手。这两个版本都旨在提高用户在处理演示文稿和文档时的效率。 PPT大珩助手 这是一款专门为Microsoft PowerPoint设计的插件。它提供了多种功能&#xff0c;例如素材…

类与对象:抽象类、Object类和内部类

一.抽象类 1.概念 在面向对象的概念中&#xff0c;所有的对象都是通过类来描绘的&#xff0c;但是反过来&#xff0c;并不是所有的类都是用来描绘对象的&#xff0c;如果一个类中没有包含足够的信息来描绘一个具体的对象&#xff0c;这样的类就是抽象类。 抽象类也是类&#…

盲人社区生活支持体系:织就一张温暖的网

在当今社会&#xff0c;构建一个全面、包容的盲人社区生活支持体系成为了推动社会进步、保障残障人士权益的重要议题。随着科技的不断革新&#xff0c;一款名为“蝙蝠避障”的辅助软件走进了盲人的日常生活&#xff0c;它如同一位无形的向导&#xff0c;通过实时避障与拍照识别…

element DatePicker 日期选择器设置禁用未来日期,时间范围为60天

需要用到 DatePicker 里面的 picker-options 方法 disabledDate onPick方法 <el-date-pickerv-model"form.xxxx"type"daterange"value-format"yyyy-MM-dd":clearable"false":picker-options"pickerOptions"start-placeho…

运行Android项目时,提示错误: 程序包javax.annotation.processing不存在

今天在运行项目时提示错误: 错误: 程序包javax.annotation.processing不存在 import javax.annotation.processing.Generated; 最后是修改了Android Studio的JDK的路径修改为你安装的JDK路径&#xff0c;完成的修复&#xff1a;

5.23 Linux中超时检测方式+模拟面试

1.IO多路复用的原理&#xff1f; IO多路复用使得一个或少量线程资源处理多个连接的IO事件的技术。对于要处理的多个阻塞的IO操作&#xff0c;建立集合并存储它们的文件描述符&#xff0c;利用单个阻塞函数去监控集合中文件描述符事件到达的情况&#xff0c;&#xff08;如果到…

Web测试中的BUG定位与分析

在Web测试过程中&#xff0c;页面内容或数据显示错误、不显示等问题是常见的挑战。为了高效地定位并解决这些问题&#xff0c;我们可以利用浏览器自带的开发者工具、数据库等工具进行排查和分析定位BUG。 一、发现BUG 保存现场并复现&#xff1a;遇到问题时&#xff0c;首先截…

cPanel中如何移除之前添加的域名

我这边想要移除我之前绑定到主机的域名&#xff0c;但是不知道如何在主机上面进行移除&#xff0c;由于我使用的Hostease的Linux虚拟主机产品默认带普通用户权限的cPanel面板&#xff0c;但是不知道如何在cPanel上操作移除域名&#xff0c;因为也是对于Hostease主机产品不是很了…

技术驱动创新:淘宝扭蛋机小程序的技术实现与挑战

随着科技的飞速发展和人们生活方式的转变&#xff0c;小程序已经成为人们日常生活中不可或缺的一部分。淘宝扭蛋机小程序&#xff0c;作为一种集购物、娱乐于一体的新型电商模式&#xff0c;凭借其独特的创意和便捷的使用体验&#xff0c;受到了广大用户的喜爱。然而&#xff0…