0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

I2C设备驱动的两个数据结构

麦辣鸡腿堡 来源:嵌入式Linux系统开发 作者:嵌入式Linux系统开 2023-07-22 15:49 次阅读

设备驱动

I2C 设备驱动重点关注两个数据结构:i2c_client 和 i2c_driver。i2c_client 就是描述设备信息的,i2c_driver 描述驱动内容。

一个设备对应一个 i2c_client,每检测到一个 I2C 设备就会给这个 I2C 设备分配一个 i2c_client。

i2c_driver 中包含 probe 函数和 device_driver 结构体。如果使用设备树的话,需要设置 device_driver 的 of_match_table 成员变量,也就是驱动的兼容(compatible)属性。

当 I2C 设备和驱动匹配以后,probe 函数就会执行。

因此,对于 Linux 来讲,不区分 I2C 控制器和 I2C 从机设备,用的都是同一套东西,即【总线、设备、驱动】框架,都有 probe 函数。

设备树

图片

注意,I2C 设备在设备树中必须挂到对应的总线下,如图是在 &i2c0 下。

驱动

图片

图片

当驱动和设备匹配时,probe 函数开始执行,重要的地方博主都写了注释

static int goodix_i2c_probe(struct i2c_client *client,
 const struct i2c_device_id *dev_id)
{
 struct goodix_ts_device *ts_device = NULL;
 struct goodix_ts_board_data *ts_bdata = NULL;
 int r = 0;

  //检查 I2C 控制器支持是否支持标准 I2C 协议
 r = i2c_check_functionality(client- >adapter,I2C_FUNC_I2C);

 /* 板级信息分配内存 */
 ts_bdata = devm_kzalloc(&client- >dev,sizeof(struct goodix_ts_board_data), GFP_KERNEL);
 ts_device = devm_kzalloc(&client- >dev,sizeof(struct goodix_ts_device), GFP_KERNEL);

  //填充结构体元素
 /* use pinctrl in core.c */
 ts_bdata- >pinctrl_dev = client- >adapter- >dev.parent;

 ts_device- >name = "GT9886 TouchDevcie";
 ts_device- >dev = &client- >dev;
 ts_device- >board_data = ts_bdata;
 ts_device- >hw_ops = &hw_i2c_ops;
 touch_filter_bdata = ts_bdata;

 /* ts core device */
 goodix_pdev = kzalloc(sizeof(struct platform_device), GFP_KERNEL); 
  
  //填充结构体元素
 goodix_pdev- >name = GOODIX_CORE_DRIVER_NAME;
 goodix_pdev- >id = 0;
 goodix_pdev- >num_resources = 0;
 goodix_pdev- >dev.platform_data = ts_device;
 goodix_pdev- >dev.release = goodix_pdev_release;

 r = platform_device_register(goodix_pdev);

 /* register platform driver*/
 r = goodix_ts_core_init();

  ......
}

I2C 从机设备驱动中的 probe 函数和器件强相关,各家撰写方式不一样。

在 I2C 设备驱动中,除了 init、exit、probe、remove 函数外,还要实现 read、write 函数才行。

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 驱动
    +关注

    关注

    11

    文章

    1718

    浏览量

    84353
  • I2C
    I2C
    +关注

    关注

    28

    文章

    1348

    浏览量

    120880
  • 数据结构
    +关注

    关注

    3

    文章

    564

    浏览量

    39905
收藏 人收藏

    评论

    相关推荐

    【Z-turn Board试用体验】+ Zynq linux的I2C驱动学习笔记(二)

    通信。将I2C设备的特有数据结构挂在到i2c_client.dev->driver_data下。以/driver/misc/eeprom/eeprom.
    发表于 06-21 22:25

    I2C设备驱动的开发

    linux3.2内核提供的I2C驱动都是主设备的,想让I2C做从设备,请教哪位大神做过I2C
    发表于 08-21 12:05

    为什么I2C总线忙于两个设备

    晚上好,我正试图通过PS2C作为主机来获得两个MPU-9250的工作。连接到总线只有一个MPU-9250一切工作完美!使用两个设备不能工作,并且I2
    发表于 11-14 11:31

    Linux的I2C体系结构

     在Linux 系统中,I2C 驱动由3 部分组成,即I2C 核心、I2C 总线驱动I2C
    发表于 08-06 06:53

    什么是基于嵌入式Linux的I2C设备驱动程序?

    由于I2C总线的通用性,Linux作为一款优秀的嵌入式操作系统,也必须要对其要有很好的支持。在Linux内核源码中对I2C总线的驱动是基于总线设备
    发表于 09-02 08:04

    如何用dsp标准I2C接口接ADS1110?

    Structure'里有两个地址(如下):从机地址、数据地址,而ads1110只有从机地址。这个结构体还不能修改,不知道怎么处理,能不能自己写一个结构体,但
    发表于 10-24 08:04

    HarmonyOS 驱动平台---I2C

    ,主从设备通过SDA(SerialData)串行数据线以及SCL(SerialClock)串行时钟线根线相连,如图1 所示。I2C数据的传
    发表于 09-16 18:54

    I2C使用步骤

    Phiilps 公司开发的,由于它引脚少,硬件实现简单,可扩展性强,不需要 USART、CAN 等通讯协议的外部收发设备现在被广泛地使用在系统内多个集成电路(IC)间的通讯。软件I2C将芯片的两个
    发表于 08-23 06:22

    I2C总线驱动设备驱动

    为400kbit/s常见iic设备eeprom触摸芯片温湿度传感器mpu6050(姿态传感器)…框架图I2C核心提供I2C总线驱动设备
    发表于 12-13 06:18

    使用i2c设备的方法

    导言:最近在使用多个i2c设备时,读写出现冲突,我决定使用多个i2c接口,我把摄像头关闭后,使用3B+上的两个i2c同时进行读写操作,
    发表于 01-05 06:54

    I2C设备驱动的相关资料下载

    文章目录1、简介2I2C总线、设备驱动结构体定义2.1 结构体定义--
    发表于 02-10 06:39

    新手关于I2C的理解

    新手关于I2C 的理解1- 关于I2CI2C是一个通信协议就如同UART一样都是实现数据的传递,例如有一个设备需要跟单片机进行数据的传输,则
    发表于 02-24 06:57

    如何使用I2C设备驱动接口开发应用程序

    的目的和结构本文的目的和背景I2C(或写作 i2c、IIC、iic)总线是由 Philips 公司开发的一种简单、双向二线制(时钟 SCL、数据 SDA)同步串行总线。它只需要
    发表于 08-18 10:54

    详解RT-Thread I2C设备驱动框架及相关函数

    的目的和结构本文的目的和背景I2C(或写作 i2c、IIC、iic)总线是由 Philips 公司开发的一种简单、双向二线制(时钟 SCL、数据 SDA)同步串行总线。它只需要
    发表于 10-25 12:02

    I2C总线的使用与编程

    数据。 主发送器模式:设备向从属接收器发送数据。 主接收器模式:设备从从属发送器接收数据。 从接收器模式:从主发送器接收多
    发表于 09-04 07:23