首页 > 其他分享 >i2c私有数据保存

i2c私有数据保存

时间:2024-01-20 17:14:24浏览次数:24  
标签:drvdata get 私有 void 保存 dev i2c data

相信在i2c驱动中,会经常看到有 i2c_set_clientdata i2c_get_clientdata

这两个经常碰到,知道就是保存是有数据,但是一直没有跟下去,今天得空跟了一下,一目了然

不同的版本内核会有区别,我这个是基于kernel-4.19

 

首先看下原函数

static inline void i2c_set_clientdata(struct i2c_client *dev, void *data)
{
  dev_set_drvdata(&dev->dev, data);
}

----->

include/linux/device.h

static inline void dev_set_drvdata(struct device *dev, void *data)
{
    dev->driver_data = data;
}

----->

在文件 include/linux/device.h 中定义有


struct device       *parent;
......
void        *driver_data;   /* Driver data, set and get with dev_set/get_drvdata */
......
}
本质上就是使用了struct device这个结构体中的 driver_data
也就是i2c_client->dev->driver_data = void *data 把传入的参数保存在driver_data中,使用的时候直接读取

下面看下读取,实际上也是一样的,文件位置不变
static inline void *i2c_get_clientdata(const struct i2c_client *dev)
{
    return dev_get_drvdata(&dev->dev);
}
--->
static inline void *dev_get_drvdata(const struct device *dev)
{
    return dev->driver_data;
}

 

直接返回了保存的私有数据

 

到这里应该一目了然了,下面看下使用案例

static int wacom_i2c_probe(struct i2c_client *client,const struct i2c_device_id *id)
{
    .....
    int *testnumber
    testnumber = kzalloc(sizeof(*testnumber), GFP_KERNEL); //申请一块内存 不然空指针
    *testnumber = 126 ;

    i2c_set_clientdata(client, testnumber); // 保存私有数据到 i2c_client->dev->driver_data
    testnumber = i2c_get_clientdata(client) ;  //读取保存的数据

    printk("chencx test i2c_get_clientdata=%d---\n", *testnumber) ; //打印显示     ...... }

  

实际打印

 chencx test i2c_get_clientdata=126---

 

测试完成

 

同理,input_get_drvdata  input_set_drvdata是一样的,看下函数原型

 

static inline void *input_get_drvdata(struct input_dev *dev)
{
    return dev_get_drvdata(&dev->dev);
}

static inline void input_set_drvdata(struct input_dev *dev, void *data)
{
    dev_set_drvdata(&dev->dev, data);
}

实际上就是和上面的一样的 

 

到此,记录完成

 

标签:drvdata,get,私有,void,保存,dev,i2c,data
From: https://www.cnblogs.com/ChenChangXiong/p/17976750

相关文章

  • STM32CubeMX教程19 I2C - MPU6050驱动
    1、准备材料正点原子stm32f407探索者开发板V2.4STM32CubeMX软件(Version6.10.0)野火DAP仿真器keilµVision5IDE(MDK-Arm)ST-LINK/V2驱动XCOMV2.6串口助手逻辑分析仪nanoDLA2、实验目标使用STM32CubeMX软件配置STM32F407开发板的I2C1与MPU6050芯片通信,读取MPU6050的三轴加......
  • Pickle之物理保存
    背景:有时候我们经过千辛万苦调优参数得到一个模型对象、又或者经过复杂计算得到一个结果对象,这时我们想保存这些对象,以便下次(电脑关机后开机)或别的电脑上快速的引用这些对象。这时候pickle模块出场,它可实现将对象序列化并保存成本地文件,方便你到处引用。举例:df=pd.read_exc......
  • 【驱动】I2C驱动分析(二)-驱动框架
    I2C驱动框架简介I2C驱动属于总线-设备-驱动模型的,与I2C总线设备驱动模型相比,大体框架是一样,系统的整体框架如下所示。最上层是应用层,在应用层用户可以直接用openreadwrite对设备进行操作,往下是设备驱动层,这个就是外围的比如一些用I2C总线连接到SOC的传感器或者EEPROM的驱......
  • 【驱动】I2C驱动分析(三)-关键数据类型
    I2Cbusi2c_bus_type用于表示I2C总线类型。bus_type是Linux内核中用于表示总线类型的结构体,用于管理该类型总线上的设备。structbus_typei2c_bus_type={ .name ="i2c", .match =i2c_device_match, .probe =i2c_device_probe, .remove =i2c_device_remove,......
  • 【驱动】I2C驱动分析(五)-模拟I2C驱动
    在drivers/i2c/busses下包含各种I2C总线驱动,使用GPIO模拟I2C总线的驱动i2c-gpio.c,这里只分析i2c-gpio.c。i2c-gpio.c它是gpio模拟I2C总线的驱动,总线也是个设备,在这里将总线当作平台设备处理,那驱动当然是平台设备驱动,看它的驱动注册和注销函数。i2c_gpio_initi2c_gpio_init调用......
  • 【驱动】I2C驱动分析(四)-关键API解析
    简介在Linux内核源代码中的driver目录下包含一个i2c目录i2c-core.c这个文件实现了I2C核心的功能以及/proc/bus/i2c*接口。i2c-dev.c实现了I2C适配器设备文件的功能,每一个I2C适配器都被分配一个设备。通过适配器访设备时的主设备号都为89,次设备号为0-255。I2c-dev.c......
  • 【驱动】I2C驱动分析(六)-I2C驱动模板
    前言LinuxI2C驱动是嵌入式Linux驱动开发人员经常需要编写的一种驱动,因为凡是系统中使用到的I2C设备,几乎都需要编写相应的I2C驱动去配置和控制它,例如RTC实时时钟芯片、音视频采集芯片、音视频输出芯片、EEROM芯片、AD/DA转换芯片等等。下面我们看下如何写一个基本的I2C驱动。内......
  • 【驱动】I2C驱动分析(一)-I2C驱协议简介
    什么是I²CI²C叫集成电路总线它是一种串行通信接口,具有双向两线同步串行总线,通常由两根线组成——SDA(串行数据线)和SCL(串行时钟线)和上拉电阻。它们用于需要许多不同部件(例如传感器、引脚、扩展和驱动程序)协同工作的项目,因为它们可以将多达128个设备连接到主板,同时保持清晰......
  • GB28181智慧安防视频监控EasyCVR v3.5系统增加录像保存地址的配置
    智慧安防监控EasyCVR视频管理平台能在复杂的网络环境中,将前端设备统一集中接入。在网络传输上,平台支持设备通过4G、5G、WIFI、有线等方式进行视频流的快捷传输,视频流经平台处理后可对外进行多格式的分发,实现多展示终端观看(电脑、大屏、电视墙、手机端等)。国标GB28181协议EasyCVR安......
  • Python 面向对象的私有属性获取
    前言全局说明一、安装flask模块二、引用模块三、启动服务模块安装、引用模块、启动Web服务方法,参考下面链接文章:https://www.cnblogs.com/wutou/p/17963563四、面向对象的私有属性获取4.1.2classFoo:def__init__(self):self.name='wangwu'......