Linux内核dev_set_drvdata()和dev_get_drvdata()存储自定义结构体用法(六)

2024-05-07 22:38

本文主要是介绍Linux内核dev_set_drvdata()和dev_get_drvdata()存储自定义结构体用法(六),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

定义位置:kernel/msm-3.18/include/linux/device.h
static inline void dev_set_drvdata(struct device *dev, void *data){dev->driver_data = data;
}
static inline void *dev_get_drvdata(const struct device *dev){return dev->driver_data;
}kernel/msm-3.18/include/linux/i2c.h
struct i2c_client{unsigned short addr;struct device dev;
};//自定义结构体
struct data{int num;char *name;
};栗子一:i2c_set_clientdata和i2c_get_clientdata也是调用这两个函数
kernel/msm-3.18/include/linux/i2c.h
static inline void i2c_set_clientdata(struct i2c_client *dev, void *data){dev_set_drvdata(&dev->dev, data);
}
static inline void *i2c_get_clientdata(const struct i2c_client *dev){return dev_get_drvdata(&dev->dev);
}struct data set_stu;
struct i2c_client *i2c;
//1.申请内存,devm_kzalloc()函数自动释放内存
devm_kzalloc(&i2c->dev, sizeof(struct stu), GFP_KERNEL);//2.设置结构体stu到kernel结构体void*
dev_set_drvdata(&i2c->dev, set_stu);//3.获取结构体stu
struct data get_stu;
get_stu = dev_get_drvdata(&i2c->dev);//4.置空,不用时
dev_set_drvdata(&i2c->dev, NULL);栗子二:struct snd_soc_dai{};
<1>.kernel/msm-3.18/include/sound/soc-dai.h
struct snd_soc_dai{struct snd_soc_codec *codec;
}; <2>.kernel/msm-3.18/include/sound/soc.h
struct snd_soc_codec { struct snd_soc_component component;
};<3>.kernel/msm-3.18/include/sound/soc.h
struct snd_soc_component {struct device *dev;
};struct data set_stu;
struct data get_stu;
struct snd_soc_dai *dai;//1.申请内存,devm_kzalloc()函数自动释放内存
devm_kzalloc(dai->codec->component.dev, sizeof(struct stu), GFP_KERNEL);//2.设置结构体stu到kernel结构体void*
dev_set_drvdata(dai->codec->component.dev, set_stu);//3.获取结构体stu
get_stu = (struct data*)dev_get_drvdata(dai->codec->component.dev); //4.置空,不用时
dev_set_drvdata(dai->codec->component.dev, NULL);

这篇关于Linux内核dev_set_drvdata()和dev_get_drvdata()存储自定义结构体用法(六)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/968596

相关文章

Linux下释放GPU显存

fuser -v /dev/nvidia* 查看当前系统中GPU占用的线程 使用kill -9 线程号释放显存

springboot 配置keytool生成的自定义证书

一、使用keytool生成自己的tomcathttps.p12证书,名字可以随便取  keytool -genkey -alias tomcathttps -keyalg RSA -keysize 2048 -keystore tomcathttps.p12 -validity 365 -genkey 表示要创建一个新的密钥 -alias 表示keystore的别名 -keyalg 表示使

Linux命令学习之二

每日一结 ​               命令置换:是将一个命令的输出作为另一个命令的参数,命令格式如下: commond1 `command2` 其中,命令command2的输出将作为命令command1的参数,需要注意的是, 命令置换的单引号为ESC键下方的 ` 其意思就是说,先运行单引号内的命令,再将其命令作为

Linux命令学习之一

每日一结                                                                                        注:当用户不确定一个软件包的类型时, 可使用file命令查看文件类型

Linux文件I/O之一

每日一结(标准I/O)   一  库    本质 :一组实现函数接口 [printf,scanf,strcpy,strlen]   使用标准库好处:屏蔽底层细节,向上层提供统一的接口,提高程序的可移植性   windows 库 : *.dll  linux   库 : *.so    二 系统调用接口    本

ARM_SWP指令用法

SWP 寄存器和存储器交换指令。SWP指令用于将一个内存单元(该单元地址放在寄存器Rn中)的内容读取到一个寄存器Rd 中,同时将另一个寄存器Rm 的内容写入到该内存单元中。使用SWP 可实现信号量操作。 指令格式如下: SWP{cond}{B} Rd,Rm,[Rn] 其中,B 为可选后缀,若有B,则交换字节,否则交换32 位字:Rd 为数据从存储器加载到的寄存器;Rm 的数据用于存储到存储

Linux网络编程之五

每日一结 组播: ​ 网络地址: 一些特殊的组播地址:   一 组播包收和发 1.发送方 (1)创建用户数据报套接字 (2)填充组播地址和端口  (3)发送数据到组播地址 2.接收方  (1)创建用户数据报套接字 (2)加入组播组  struct ip_mreq mreq; mreq.imr_m

Linux网络编程之四

每日一结 一 UDP并发  核心思想:父进程接收到客户端的数据,就创建子进程,在子进程中创建一个新的套接字  和客户端交互  int do_client(接受客户端地址,数据,数据长度) { 1.创建用户数据报套接字  2.自动分配地址  3.处理数据[例如:输出数据内容] 4.通过新创建的套接字将数据回发给客户端  w

Linux网络编程之三

每日一结 Tftp服务器的实现: server.c ​       client.c     代码分析如下:     一 Linux IO模型  (1)阻塞IO  (2)非阻塞IO  非阻塞IO

Linux网络编程之二

每日一结   一 TCP 函数接口  int listen(int sockfd, int backlog); 功能:设置流式套接字为监听模式  参数: @sockfd    流式套接字的fd  @backlog   请求队列的长度,最大128  返回值: 成功返回0,失败返回-1    int accept(i