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 函数才行。

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

    关注

    12

    文章

    1840

    浏览量

    85310
  • I2C
    I2C
    +关注

    关注

    28

    文章

    1488

    浏览量

    123846
  • 数据结构
    +关注

    关注

    3

    文章

    573

    浏览量

    40137
收藏 人收藏

    评论

    相关推荐

    Linux内核中描述I2C的四个核心结构

    I2C核心维护了i2c_bus结构体,提供了I2C总线驱动设备
    的头像 发表于 09-04 09:35 1537次阅读
    Linux内核中描述<b class='flag-5'>I2C</b>的四个核心<b class='flag-5'>结构</b>体

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

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

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

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

    I2C总线驱动设备驱动

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

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

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

    基于嵌入式Linux下的I2C设备驱动的总体思路与框架设计

    由于I2C总线的通用性,Linux作为一款优秀的嵌入式操作系统,也必须要对其要有很好的支持。在Linux内核源码中对I2C总线的驱动是基于总线设备
    发表于 08-20 09:04 3753次阅读
    基于嵌入式Linux下的<b class='flag-5'>I2C</b><b class='flag-5'>设备</b><b class='flag-5'>驱动</b>的总体思路与框架设计

    Linux的I2C驱动架构

    意义上的读写函数一样,这两个函数对i2c_client指针指定的设备,读写int个char。返回值为读写的字节数。对于我们现有的SLIC的驱 动,只要将最后要往总线上进行读写的数据引出
    发表于 04-02 14:38 681次阅读

    STM32 I2C硬件的结构

    我们可以看见STM32的硬件I2C两个数据有关的寄存器“数据寄存器(Data register)”(DR)和“数据移位寄存器(Data
    的头像 发表于 04-30 15:00 7337次阅读
    STM32 <b class='flag-5'>I2C</b>硬件的<b class='flag-5'>结构</b>

    Linux驱动I2C设备驱动(基于Freescale i.MX6ULL平台了解I2C驱动框架,顺便写个简陋的MPU6050驱动

    文章目录1、简介2I2C总线、设备驱动结构体定义2.1 结构体定义--
    发表于 12-06 13:51 8次下载
    Linux<b class='flag-5'>驱动</b>:<b class='flag-5'>I2C</b><b class='flag-5'>设备</b><b class='flag-5'>驱动</b>(基于Freescale <b class='flag-5'>i</b>.MX6ULL平台了解<b class='flag-5'>I2C</b>的<b class='flag-5'>驱动</b>框架,顺便写个简陋的MPU6050<b class='flag-5'>驱动</b>)

    嵌入式内核及驱动开发-09IIC子系统框架使用(I2C协议和时序,I2C驱动框架,I2C设备驱动开发,MPU6050硬件连接

    设备adapter i2c 控制器对象数据包对象读写数据设备树中添加MPU6050信息内核选配添加设备
    发表于 12-06 14:06 17次下载
    嵌入式内核及<b class='flag-5'>驱动</b>开发-09IIC子系统框架使用(<b class='flag-5'>I2C</b>协议和时序,<b class='flag-5'>I2C</b><b class='flag-5'>驱动</b>框架,<b class='flag-5'>I2C</b>从<b class='flag-5'>设备</b><b class='flag-5'>驱动</b>开发,MPU6050硬件连接

    两个PS I2C控制器的回环测试

    I2C 总线的根信号线 SCL 和 SDA 需要上拉才能正常工作,当板卡上没有合适的硬件设置或者没有合适的 I2Cslave 设备,我们就无法进行
    的头像 发表于 04-13 08:35 2352次阅读

    如何在Versal平台实现两个PS I2C控制器的回环

    I2C 总线的根信号线 SCL 和 SDA 需要上拉才能正常工作,当板卡上没有合适的硬件设置或者没有合适的 I2Cslave 设备,我们就无法进行
    发表于 08-02 09:23 574次阅读
    如何在Versal平台实现<b class='flag-5'>两个</b>PS <b class='flag-5'>I2C</b>控制器的回环

    I2C控制器驱动介绍

    控制器驱动 I2C 总线驱动重点是 I2C 适配器驱动,这里要用到两个重要的
    的头像 发表于 07-22 15:38 1497次阅读
    <b class='flag-5'>I2C</b>控制器<b class='flag-5'>驱动</b>介绍

    I2C子系统SW Architecture

    适配器(控制器)驱动,这里用到两个重要的数据结构i2c_adapter 和 i2c_algorithm。其中,Linux 内核将 SOC
    的头像 发表于 07-22 16:01 959次阅读
    <b class='flag-5'>I2C</b>子系统SW Architecture

    I2C子系统几个主要的结构

    I2C Data Structure 我们要搞懂一个 Linux 子系统,必须研究它的数据结构,搞懂每个结构体存储了什么东西,才能梳理清楚该子系统的架构。 I2C 子系统有几个主要的
    的头像 发表于 07-22 16:04 861次阅读
    <b class='flag-5'>I2C</b>子系统几个主要的<b class='flag-5'>结构</b>体