网站首页 > java教程 正文
[TOC]
问题描述:
在驱动程序中,有很多时候都需要设置私有变量和获取变量,通常都会使用下面的函数:
可以从源码中看出,项目的函数是等价的
dev_set_drvdata == platform_set_drvdata
dev_get_drvdata == platform_get_drvdata
日志
添加打印日志信息
分析步骤
第1步:
第2步:
...
代码片段
#include <linux/init.h>
#include <linux/module.h>
#include <linux/platform_device.h>
#include <linux/of.h>
#include <linux/of_device.h>
#include <linux/slab.h>
// 定义设备私有数据结构体
struct platform_demo_dev {
int id;
char name[32];
int value;
// 可以添加更多设备相关的私有数据
};
// 定义驱动私有数据结构体
struct platform_demo_drv {
int driver_version;
char driver_name[32];
// 可以添加更多驱动相关的私有数据
};
// 探针函数 - 设备与驱动匹配时调用
static int platform_demo_probe(struct platform_device *pdev)
{
struct platform_demo_dev *dev_data;
struct platform_demo_drv *drv_data;
const char *name;
int ret;
printk(KERN_INFO "platform_demo_probe: Device matched\n");
// 1. 从设备树获取属性
ret = of_property_read_string(pdev->dev.of_node, "demo-name", &name);
if (ret) {
printk(KERN_ERR "Failed to read demo-name property\n");
return ret;
}
// 2. 分配并初始化设备私有数据
dev_data = devm_kzalloc(&pdev->dev, sizeof(struct platform_demo_dev), GFP_KERNEL);
if (!dev_data) {
return -ENOMEM;
}
// 从设备树获取其他属性
of_property_read_u32(pdev->dev.of_node, "demo-id", &dev_data->id);
of_property_read_u32(pdev->dev.of_node, "demo-value", &dev_data->value);
strncpy(dev_data->name, name, sizeof(dev_data->name) - 1);
// 3. 设置平台设备的私有数据 (使用dev_set_drvdata)
/*
static inline void dev_set_drvdata(struct device *dev, void *data)
{
dev->driver_data = data;
}
*/
dev_set_drvdata(&pdev->dev, dev_data);
printk(KERN_INFO "Set device private data: id=%d, name=%s, value=%d\n",
dev_data->id, dev_data->name, dev_data->value);
// 获取设备私有数据
struct platform_demo_dev *retrieved_dev_data = dev_get_drvdata(&pdev->dev);
if (retrieved_dev_data) {
printk(KERN_INFO "Retrieved device data: id=%d, name=%s, value=%d\n",
retrieved_dev_data->id, retrieved_dev_data->name, retrieved_dev_data->value);
}
// 4. 分配并初始化驱动私有数据
drv_data = kzalloc(sizeof(struct platform_demo_drv), GFP_KERNEL);
if (!drv_data) {
return -ENOMEM;
}
drv_data->driver_version = 1;
strncpy(drv_data->driver_name, "platform_demo_driver", sizeof(drv_data->driver_name) - 1);
// 5. 设置平台驱动的私有数据 (使用platform_set_drvdata)
/*
static inline void platform_set_drvdata(struct platform_device *pdev,
void *data)
{
dev_set_drvdata(&pdev->dev, data);
}
*/
platform_set_drvdata(pdev, drv_data);
printk(KERN_INFO "Set driver private data: name=%s, version=%d\n",
drv_data->driver_name, drv_data->driver_version);
// 获取驱动私有数据
struct platform_demo_drv *retrieved_drv_data = platform_get_drvdata(pdev);
if (retrieved_drv_data) {
printk(KERN_INFO "Retrieved driver data: name=%s, version=%d\n",
retrieved_drv_data->driver_name, retrieved_drv_data->driver_version);
}
return 0;
}
// 移除函数 - 设备与驱动分离时调用
static int platform_demo_remove(struct platform_device *pdev)
{
// 获取并释放驱动私有数据
struct platform_demo_drv *drv_data = platform_get_drvdata(pdev);
if (drv_data) {
printk(KERN_INFO "Removing driver private data: %s\n", drv_data->driver_name);
kfree(drv_data);
}
// 设备私有数据使用devm分配,会自动释放
printk(KERN_INFO "platform_demo_remove: Device removed\n");
return 0;
}
// 设备树匹配表
static const struct of_device_id platform_demo_of_match[] = {
{ .compatible = "demo,platform-private-data" },
{ /* Sentinel */ }
};
MODULE_DEVICE_TABLE(of, platform_demo_of_match);
// 平台驱动结构体
static struct platform_driver platform_demo_driver = {
.probe = platform_demo_probe,
.remove = platform_demo_remove,
.driver = {
.name = "platform_demo",
.of_match_table = platform_demo_of_match,
},
};
module_platform_driver(platform_demo_driver);
MODULE_LICENSE("GPL");
MODULE_AUTHOR("Your Name");
MODULE_DESCRIPTION("Platform driver demo with private data and device tree");
MODULE_VERSION("1.0");
图片
结论
输出结论
待查资料问题
- 问题 1:?
- 问题 2:?
参考链接
- 官方文档
猜你喜欢
- 2025-10-02 Delphi变量的作用域详解_delphi函数调用
- 2025-10-02 熬夜7天,我总结了JavaScript与ES的25个知识点
- 2025-10-02 VB编程(八)常量和变量_vb中常量
- 2025-10-02 JS前端闭包是什么?私有变量可以用到闭包
- 2025-10-02 JavaScript初学者指南_javascript学习指南
- 2025-10-02 大语言模型学习Python 中的描述符(Descriptor)
- 2025-10-02 scala基础学习(三)_scala语言基础
- 2025-10-02 你的 SpringBoot 项目藏着多少内存 “黑洞”?3 招根治泄漏难题
- 2025-10-02 linux中内部变量,环境变量,用户变量的区别
- 2025-10-02 Python中的property属性_python的prod
你 发表评论:
欢迎- 最近发表
-
- JUC系列之《CompletableFuture:Java异步编程的终极武器》
- SpringBoot+Jasync异步化改造狂降90%耗时,百万并发下的性能杀戮
- Java异步编程神器:CompletableFuture实战技巧
- Spring Boot 异步请求 + 虚拟线程性能提升?结果很意外
- 异步可以单线程,但高并发的异步肯定要用线程池
- Java线程实现原理及相关机制_java线程的实现
- java线程终止 interrupt 关键字详解
- Java处理百万级消息积压方案_java 实时处理亿级数据
- 阻塞模型将会使线程休眠,为什么 Java 线程状态却是 RUNNABLE?
- 安卓7系统设置永不休眠_android 设置永不休眠
- 标签列表
-
- java反编译工具 (77)
- java反射 (57)
- java接口 (61)
- java随机数 (63)
- java7下载 (59)
- java数据结构 (61)
- java 三目运算符 (65)
- java对象转map (63)
- Java继承 (69)
- java字符串替换 (60)
- 快速排序java (59)
- java并发编程 (58)
- java api文档 (60)
- centos安装java (57)
- java调用webservice接口 (61)
- java深拷贝 (61)
- 工厂模式java (59)
- java代理模式 (59)
- java.lang (57)
- java连接mysql数据库 (67)
- java重载 (68)
- java 循环语句 (66)
- java反序列化 (58)
- java时间函数 (60)
- java是值传递还是引用传递 (62)
本文暂时没有评论,来添加一个吧(●'◡'●)