dev_get_drvdata()函数

深入剖析dev_set_drvdata与dev_get_drvdata:Linux驱动私有数据管理实战 本文深入解析Linux内核驱动开发中`dev_set_drvdata`与`dev_get_drvdata`这对核心函数,阐述其作为设备私有数据管理标准工具的工作原理与实战价值。通过完整的平台设备驱动示例,详细展示了从probe到remove的生命周期中,如何利用该机制安全地绑定、存取设备实例专属的配置、状态与资源,有效避免全局变量带来的数据混乱,并强调了使用设备类型封装函数及devm托管API以提升代码健壮性与可维护性的最佳实践。 阅读详情
AI摘要

本文详细解析了Linux内核中的dev_get_drvdata函数,介绍了该函数如何获取device_private结构体中的driver_data字段,以及这一字段在设备驱动交互中的作用。

在Linux Driver的代码中,我们经常看到标题中的函数。那么这个函数究竟如何使用,它的工作原理又是什么?下面,我们来详细看一下这个函数的实现。

driver/base/dd.c 
1. void *dev_get_drvdata(const struct device *dev)
2. {
3.      if (dev && dev->p) {
4.           return dev->p->driver_data;
5.      return NULL;
6. }

从第4行代码中,我们可以看到此函数主要是返回了device->p->driver_data指针。那么,我们下面来看一下,Kernel中比较重要的Device结构体,它其实是对内核中所有设备的抽象表示。 所有的设备都有一个device实例与之对应,而且Device结构体的主要用法为将其嵌入到其他的设备结构体中,如platform_device等。同时,Device结构体也负责作为子系统之间交互的统一参数。那么,我们下面主要看一下,device结构体的构成。

include/linux/device.h

struct device {
     struct device *parent;
     struct device_private *p;  //负责保存driver核心部分的数据
     struct kobject kobj;
     const char *init_name;
     .......
     struct device_driver *driver;
#ifdef CONFIG_PINCTRL
     struct dev_pin_info *pins;
#endfi
     .......
     struct device_node *of_node;  //负责保存device_tree中相应的node地址
     .......
     const struct attribute_group **groups;
     ......
}

struct device_private {
     struct klist klist_children;
     struct klist_node knode_parent;
     struct klist_node knode_driver;
     struct klist_node knode_bus;
     struct list_head deferred_probe;
     void *driver_data;        //负责保存driver中相应的driver_data
     struct device *device;
}
     
那么,driver_data是何时进行初始化的呢?我们通过追踪代码是可以发现,一般driver_data的初始化是发生在Driver文件中的probe函数中的。

在probe函数中,malloc完相应的driver data结构体,填充完相应的域后,就会将driver data的地址赋值给driver data。这样,在实现与其他子系统交互的接口时,就能通过其他子系统传递过来的device指针来找到相应的driver data。
Linux Spi驱动子系统学习 前几天学习了Linux的I2C驱动子系统,工作需要,今天再看下spi子系统,学习这些子系统,最重要的是一定要掌握到两个思想: 1.面相对象的思想,即驱动和设备的分离,便于驱动的移植,通过设备的硬件信息来实例化驱动。 2.软件开发的分层思想,比如I2C子系统将I2C适配器的功能与I2C具体设备的驱动分成两个层次来实现。这样的好处不言而喻,非常便于驱动的移植。降低了I2C设备开发人员的工作量。 当然,... 阅读详情

相关推荐

基于MCP2515的Linux CAN总线驱动程序设计(三)

1. 前言         上篇文章介绍了使用SPI子系统设计的基于MCP2515的Linux CAN总线驱动程序,这篇文章主要介绍MCP2515的字符设备驱动功能函数的实现。 2. 硬件设计         MCP2515与S3C2416的硬件连接图如图3所示。如硬件原理图可知MCP2515芯片连接在S3C2416芯片的SPI0上,中断接在GPF1上;MCP2515输出连接SN65HV

leesheen的专栏 7929

linux驱动开发中常用函数--dev_get_drvdata()与dev_set_drvdata()的用法

dev_get_drvdata()与dev_set_drvdata()的用法

xi_xix_i的博客 2501

codec驱动常用接口函数积累之snd_soc_codec_get_drvdata

1、snd_soc_codec_get_drvdata ./include/sound/soc.h static inline void *snd_soc_codec_get_drvdata(struct snd_soc_codec *codec) { return dev_get_drvdata(codec->dev); } 调用dev_get_drvdata函数, 函...

Fire的博客 1484

函数dev_get_drvdata()

函数dev_get_drvdata(), 是用来返回driver的私有数据的,其函数实现如下。 另外,与之相对应的保存driver的私有数据的函数是dev_set_drvdata()。 void *dev_get_drvdata(const struct device *dev) { if (dev && dev->p) return dev->p->driver_data; re

jgw2008的专栏 3893

GD32F4x芯片加密实战:从读保护到安全启动全解析

本文详细解析了GD32F4x芯片加密的实战操作,从读保护功能到安全启动全流程。通过具体代码示例和应用场景分析,帮助开发者有效防止固件被盗用,提升工业控制、智能门锁等场景下的数据安全性。重点介绍了读保护功能的底层机制、配置步骤及常见问题解决方案。

weixin_42629671的博客 207

Meta开源Ego-Exo4D数据集:如何用1400小时多模态视频训练你的AI模型

Meta开源的Ego-Exo4D数据集包含1400小时多模态视频,涵盖第一人称和第三人称视角、眼动追踪、IMU传感器等多种模态,是AI模型训练的宝贵资源。本文详细介绍了从数据集下载、预处理到模型训练的全流程,帮助研究者高效利用这一多模态数据集进行AI模型开发。

weixin_29159441的博客 342

dev_get_drvdata()函数解析

dev_get_drvdata()函数解析

weixin_45977113的博客 1019

别再到处找资源了!WinCC 7.5 SP2官方下载与Windows 10保姆级安装避坑指南

本文提供了WinCC 7.5 SP2在Windows 10上的官方下载与安装全流程指南,重点解决了资源获取难、系统兼容性问题及分卷压缩处理等常见痛点。通过详细的步骤和实用技巧,帮助用户顺利完成安装并优化配置,适用于工控领域的学习者和从业者。

weixin_32924297的博客 473

关于dev_set_drvdata()和dev_get_drvdata()

内核版本:Linux-4.5 dev_set_drvdata()和dev_get_drvdata()代码如下:static inline void *dev_get_drvdata(const struct device *dev) { return dev->driver_data; } static inline void dev_set_drvdata(struct device

Tracy Mcgrady的专栏 9866

糖果【贪心】

【问题描述】 有N(1≤N <100,000)N(1≤N~<100,000)N(1≤N <100,000)种不同类型的糖果,每种糖果数量无限多。第i种糖果每颗的价格是Pi(1≤Pi≤1018),有Ci(1≤Ci≤1018)P_i(1≤P_i≤10^{18}),有C_i (1≤C_i≤10^{18)}Pi​(1≤Pi​≤1018),有Ci​(1≤Ci​≤1018)头牛想吃这种糖果。 FarmerJohnFarmer JohnFarmerJohn拥有金钱BBB元(1≤B≤1

算法小猪的博客 793

海思Hi3516CV610--SPI NAND Flash移植实战:从手册到驱动的完整适配

本文详细介绍了海思Hi3516CV610芯片上SPI NAND Flash的移植实战,包括从手册解读到驱动适配的完整流程。以GD5F2GM7UEYIGR Flash为例,重点讲解了关键参数确认、模式选择、时序配置以及U-Boot和Linux内核驱动的具体实现步骤,帮助开发者快速完成Flash移植工作。

weixin_29158413的博客 446

platform_set_drvdata

probe函数中定义的局部变量,如果我想在其他地方使用它怎么办呢? 这就需要把它保存起来。内核提供了这个方法,使用函数platform_set_drvdata()可以将ndev保存成平台总线设备的私有数据。以后再要使用它时只需调用platform_get_drvdata()就可以了。 #define platform_set_drvdata(_dev,data) dev_set_dr

smart_qiang的专栏 3944

基于YOLOv5/v8/v10的垃圾分类识别系统:设计实现与性能优化(附代码+数据集)

做完这个毕设,你已经掌握了从数据准备、模型训练到界面开发的全流程。把模型部署到树莓派上,做个真正的“智能垃圾桶”硬件装置;加入语音提示功能,检测到垃圾后自动语音播报类别;试试融合多个YOLO模型的优势,让分类精度再上一个台阶。按照这个教程一步步做,你的毕设不仅能顺利完成,还能做出很多亮点。要是过程中遇到啥问题,别慌,慢慢琢磨或者咱们一起聊聊,肯定能把这个毕设做成让你满意的作品。

know_F0727的博客 461

dev_set_drvdata、dev_get_drvdata使用详解

核心函数和是操作设备私有数据的基础函数,直接通过的// 将数据指针关联到设备:cite[2]:cite[6]// 获取设备关联的数据指针:cite[6]设备类型封装函数平台设备和// 通过平台设备结构体间接调用核心函数// 调用dev_set_drvdata:cite[1]:cite[2]I2C设备和PCI设备和45。

1566

AttributeError: module ‘numpy‘ has no attribute ‘int‘解决方案

本文主要介绍了AttributeError: module ‘numpy’ has no attribute 'int’解决方案,希望能对使用numpy的同学们有所帮助。 文章目录 1. 问题描述 2. 解决方案 2.1 方案一 2.2 方案二

weixin_43178406的博客 28万+

(6):单相三绕组变压器的拉氏变换数学模型和仿真模型

本节详细推导了基于耦合电路的单相三绕组变压器考虑铁心损耗情况下的拉普拉斯变换数学模型,并据此用Matlab/Simulink的传递函数模块搭建了相应的仿真模型,仿真结果表明所建立的数学模型和仿真模型都是正确的。本文的贡献是建立了考虑铁心损耗的单相三绕组变压器基于拉氏变换象函数的数学模型,为使用Simulink传递函数模块实现单相三绕组变压器的仿真模型提供了一条途径,所采用的建模方法和技巧具有启发作用,值得借鉴。

weixin_45670943的博客 372

dev_set_drvdata和dev_get_drvdata函数

 dev_set_drvdata函数用来设置device 的私有数据, dev_get_drvdata函数用来获取device 的私有数据。 两个函数的定义如下: /* * These exports can't be _GPL due to .h files using this within them, and it * might break something that was...

笔记 1万+

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

Linux驱动开发必备:dev_set_drvdata和dev_get_drvdata的5个实战技巧

本文深入探讨了Linux驱动开发中管理设备私有数据的核心技巧,重点解析了dev_set_drvdata和dev_get_drvdata这对关键API的实战应用。通过五个进阶心法,涵盖内存分配策略、多设备实例隔离、并发安全访问、复杂设备类型处理以及防御性编程,帮助开发者构建健壮、可维护的内核驱动,实现设备数据的优雅管理与隔离。

gitlab7runner的博客 829

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

深度学习工具包 DeepLearningToolbox

深度学习工具包Deprecation notice.-----This toolbox is outdated and no longer maintained.There are much better tools available for deep learning than this toolbox, e.g. [Theano](http://deeplearning.net/software/theano/), [torch](http://torch.ch/) or [tensorflow](http://www.tensorflow.org/)I would suggest you use one of the tools mentioned above rather than use this toolbox.Best, Rasmus.DeepLearnToolbox================A Matlab toolbox for Deep Learning.Deep Learning is a new subfield of machine learning that focuses on learning deep hierarchical models of data.It is inspired by the human brain's apparent deep (layered, hierarchical) architecture.A good overview of the theory of Deep Learning theory is[Learning Deep Architectures for AI](http://www.iro.umontreal.ca/~bengioy/papers/ftml_book.pdf)For a more informal introduction, see the following videos by Geoffrey Hinton and Andrew Ng.* [The Next Generation of Neural Networks](http://www.youtube.com/watch?v=AyzOUbkUf3M) (Hinton, 2007)* [Recent Developments in Deep Learning](http://www.youtube.com/watch?v=VdIURAu1-aU) (Hinton, 2010)* [Unsupervised Feature Learning and Deep Learning](http://www.youtube.com/watch?v=ZmNOAtZIgIk) (Ng, 2011)If you use this toolbox in your research please cite [Prediction as a candidate for learning deep hierarchical models of data](http://www2.imm.dtu.dk/pubdb/views/publication_details.php?id=6284)```@MASTERSTHESIS\{IMM2012-06284, author = "R. B. Palm", title = "Prediction as a candidate for learning deep hierarchical models of data", year = "2012",}```Contact: rasmusbergpalm at gmail dot comDirectories included in the toolbox-----------------------------------`NN/` - A library for Feedforward Backpropagation Neural Networks`CNN/` - A library for Convolutional Neural Networks`DBN/` - A library for Deep Belief Networks`SAE/` - A library for Stacked Auto-Encoders`CAE/` - A library for Convolutional Auto-Encoders`util/` - Utility functions used by the libraries`data/` - Data used by the examples`tests/` - unit tests to verify toolbox is workingFor references on each library check REFS.mdSetup-----1. Download.2. addpath(genpath('DeepLearnToolbox'));Example: Deep Belief Network---------------------```matlabfunction test_example_DBNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit RBM and visualize its weightsrand('state',0)dbn.sizes = [100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);figure; visualize(dbn.rbm{1}.W'); % Visualize the RBM weights%% ex2 train a 100-100 hidden unit DBN and use its weights to initialize a NNrand('state',0)%train dbndbn.sizes = [100 100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);%unfold dbn to nnnn = dbnunfoldtonn(dbn, 10);nn.activation_function = 'sigm';%train nnopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.10, 'Too big error');```Example: Stacked Auto-Encoders---------------------```matlabfunction test_example_SAEload mnist_uint8;train_x = double(train_x)/255;test_x = double(test_x)/255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit SDAE and use it to initialize a FFNN% Setup and train a stacked denoising autoencoder (SDAE)rand('state',0)sae = saesetup([784 100]);sae.ae{1}.activation_function = 'sigm';sae.ae{1}.learningRate = 1;sae.ae{1}.inputZeroMaskedFraction = 0.5;opts.numepochs = 1;opts.batchsize = 100;sae = saetrain(sae, train_x, opts);visualize(sae.ae{1}.W{1}(:,2:end)')% Use the SDAE to initialize a FFNNnn = nnsetup([784 100 10]);nn.activation_function = 'sigm';nn.learningRate = 1;nn.W{1} = sae.ae{1}.W{1};% Train the FFNNopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.16, 'Too big error');```Example: Convolutional Neural Nets---------------------```matlabfunction test_example_CNNload mnist_uint8;train_x = double(reshape(train_x',28,28,60000))/255;test_x = double(reshape(test_x',28,28,10000))/255;train_y = double(train_y');test_y = double(test_y');%% ex1 Train a 6c-2s-12c-2s Convolutional neural network %will run 1 epoch in about 200 second and get around 11% error. %With 100 epochs you'll get around 1.2% errorrand('state',0)cnn.layers = { struct('type', 'i') %input layer struct('type', 'c', 'outputmaps', 6, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %sub sampling layer struct('type', 'c', 'outputmaps', 12, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %subsampling layer};cnn = cnnsetup(cnn, train_x, train_y);opts.alpha = 1;opts.batchsize = 50;opts.numepochs = 1;cnn = cnntrain(cnn, train_x, train_y, opts);[er, bad] = cnntest(cnn, test_x, test_y);%plot mean squared errorfigure; plot(cnn.rL);assert(er<0.12, 'Too big error');```Example: Neural Networks---------------------```matlabfunction test_example_NNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);% normalize[train_x, mu, sigma] = zscore(train_x);test_x = normalize(test_x, mu, sigma);%% ex1 vanilla neural netrand('state',0)nn = nnsetup([784 100 10]);opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samples[nn, L] = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.08, 'Too big error');%% ex2 neural net with L2 weight decayrand('state',0)nn = nnsetup([784 100 10]);nn.weightPenaltyL2 = 1e-4; % L2 weight decayopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex3 neural net with dropoutrand('state',0)nn = nnsetup([784 100 10]);nn.dropoutFraction = 0.5; % Dropout fraction opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex4 neural net with sigmoid activation functionrand('state',0)nn = nnsetup([784 100 10]);nn.activation_function = 'sigm'; % Sigmoid activation functionnn.learningRate = 1; % Sigm require a lower learning rateopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex5 plotting functionalityrand('state',0)nn = nnsetup([784 20 10]);opts.numepochs = 5; % Number of full sweeps through datann.output = 'softmax'; % use softmax outputopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex6 neural net with sigmoid activation and plotting of validation and training error% split training data into training and validation datavx = train_x(1:10000,:);tx = train_x(10001:end,:);vy = train_y(1:10000,:);ty = train_y(10001:end,:);rand('state',0)nn = nnsetup([784 20 10]); nn.output = 'softmax'; % use softmax outputopts.numepochs = 5; % Number of full sweeps through dataopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, tx, ty, opts, vx, vy); % nntrain takes validation set as last two arguments (optionally)[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');```[![Bitdeli Badge](https://d2weczhvl823v0.cloudfront.net/rasmusbergpalm/deeplearntoolbox/trend.png)](https://bitdeli.com/free "Bitdeli Badge")

linux驱动开发扩展--dev_set_drvdata和dev_get_drvdata

struct device { ... struct device_private *p; ... } struct device_private { ... void *driver_data; ... } dev_set_drvdata void dev_set_drvdata(struct device *dev, void *data) { int error; if (!dev) return; if (!dev-...

linux驱动开发大纲 1227

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

dev_set_drvdata和dev_get_drvdata

dev_set_drvdata设置device 的私有数据, dev_get_drvdata获取device 的私有数据。 void *dev_get_drvdata(const struct device *dev) { if (dev && dev->p) return dev->p->driver_data; return NULL; } int dev_set_drvdata(struct device *dev, void *data) { int

wangkai6666的博客 527

dev_get_platdata和dev_get_drvdata

dev_get_platdata和dev_get_drvdata获取的对象是不同的。 dev_get_platdata获取的是device结构体成员变量的void * platform_data。 dev_get_drvdata获取的是device结构体struct device_private *成员变量P的成员变量void * driver_data。 另外有与d...

weixin_42897897的博客 1041

12.Linux驱动-关于dev_set_drvdata()和dev_get_drvdata()

内核版本:Linux-4.5 dev_set_drvdata()和dev_get_drvdata()代码如下: static inline void *dev_get_drvdata(const struct device *dev) { return dev->driver_data; } static inline void dev_set_drvdata(struct device *dev, void *data) { dev->driver_data = data; } 那么

weixin_43824344的博客 1673

驱动开发笔记--platform_set_drvdata & platform_get_drvdata分析

概述 在用到Linux设备驱动的platform框架时,常常会遇到两个函数platform_get_drvdata和platform_set_drvdata。通常,会在驱动的probe函数中获取device的相关信息,然后使用platform_set_drvdata进行保存局部变量。在其他函数中要用到时(比如remove),通过platform_get_drvdata来获取。 函数定义 include\linux\platform_device.h: static inline void platfo

nancy的专栏 2319

platform_set_drvdata()/platform_get_drvdata()/container_of()

platform_set_drvdata(struct platform_device *pdev, void *data) platform_get_drvdata(const struct platform_device *pdev): 驱动中常用到platform_set_drvdata 和 platform_get_drvdata这两个函数,用于保存局部变量: inc

angle_birds的专栏 3345

dev_get_platdata dev_get_drvdata

//dev_get_platdata和dev_get_drvdata获取的对象是不同的。 //dev_get_platdata获取的是device结构体成员变量的void * platform_data。 dev_get_drvdata获取的是device结构体void * driver_data。 另外有与dev_get_drvdata相对应的set函数dev_...

u010388659的博客 2530
上一篇: ubuntu 12.04下访问windows共享文件夹
下一篇: Linux Driver porting的步骤
计算机与认知
博客等级 码龄14年 31粉丝 19原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值