linux怎么查看i2c设备驱动程序,Linux I2C驱动程序是如此简单吗?教你如何编写i2c驱动程序...

a8cc807430cb87e0ea9c47f65ffdf2ac.png

分析Linux中的I2C驱动程序框架

I2C核心(i2c_core)

I2C内核维护i2c_bus结构,提供I2C总线驱动程序和设备驱动程序的注册和取消方法,维护I2C总线驱动程序和设备链接列表,并实现设备和驱动程序匹配检测. 这部分代码由Linux内核提供.

I2C总线驱动程序

I2C总线驱动程序维护I2C适配器数据结构(i2c_adapter)和适配器的通信方法数据结构(i2c_algorithm). 因此,I2C总线驱动程序可以控制I2C适配器以生成启动,停止,ACK等. 这部分代码由特定的芯片制造商提供,例如Samsung和Qualcomm.

I2C设备驱动程序

I2C设备驱动程序主要维护两个结构: i2c_driver和i2c_client,它们实现与用户交互的文件操作集合fops和cdev. 这部分代码是开发人员需要完成的.

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

982452b6f230d975660438be7ed2caf2.png

1)i2c_client-挂在I2C总线上的I2C从设备

每个i2c从设备都需要通过i2c_client结构来描述linux 驱动,i2c_client对应于实际的i2c物理设备设备.

4b90f603738da9772120bd415b090e1d8618e32e.jpeg?token=03b0a5d8881302eaa82ebe6571a3f9&s=F8D6A1441AE089700C71FD870000E089

但是i2c_client不是由我们自己的程序创建的,而是由以下常见方法自动创建的:

方法一: 分配linux 驱动,设置,注册i2c_board_info

方法二: 获取适配器以调用i2c_new_device

方法三: 通过设备树(devicetree)创建

方法1和方法2由平台创建. 这两种方法是在内核版本3.0之前使用的,因此在此不再详细描述. 方法3是最新方法. 3.0版之后的内核就是以此方式创建的. 本文后面的情况将遵循方法3.

resized-Linux.jpg

2)i2c_adapter

I2C总线适配器,即SOC中的I2C总线控制器,硬件上的每对I2C总线都对应一个用于控制它的适配器. 在Linux内核代码中,每个适配器都提供了一个描述它的结构(结构i2c_adapter),然后通过i2c核心层将i2c设备与i2c适配器相关联. 主要用于完成与i2c总线控制器有关的数据通信. 芯片制造商提供的代码中保留了这种结构.

55e736d12f2eb938dcd514ef3e3a7331e4dd6fd4.jpeg?token=a1ef7eadce7ed8df52088ec5b2af75&s=B8D2A1445EE09F76065DE18F0000E089

3)i2c_algorithm

I2C总线数据通信算法,通过管理I2C总线控制器来实现在I2C总线上发送和接收数据的操作. 也可以将其理解为与I2C总线控制器(适配器适配器)相对应的驱动程序. 每个适配器对应一个驱动程序. 它用于描述适配器和设备之间的通信方法. 它是由芯片制造商实施的.

108ab9d7b61a8fee52b91769c4680947.png

4)i2c_driver

用于管理I2C驱动程序和i2c设备(客户端)的匹配检测,以实现与应用程序层交互的文件操作集fops,cdev等.

963aeba78e54438fb758de45bafdf9dc.png

12c6a7fc4bbcdfdcfa4383769b10c0f9.png

应用示例,实现mpu6050驱动,读取温度

在设备树中描述I2C设备信息

514548fe59cbb119d63b3862af1fd62c.png

最后,内核会将设备树的节点解析为i2c_client结构,并将其与i2c_driver结构进行匹配.

编写驱动程序代码

分配,设置,注册i2c_driver结构

c670c95330c4ccc9fbda564926d75e55.png

1-372-png_6_0_0_104_561_645_334_892.5_1263-931-0-404-931.jpg

i2c总线驱动程序模型属于设备模型中的类. 类似地,struct i2c_driver结构继承自struct驱动程序. 匹配方法与设备模型中描述的方法相同. 在这里,为了匹配设备树,必须实现驱动程序成员的Of_match_table成员:

0e5ca03cc573625e88cee22f69ebab49.png

如果设备树匹配成功,则最好调用探测功能

ebc43f686a32e46606a2c338b30d9912.png

实现文件操作的集合

ee808040e758fe6e032f1f181c858698.png

如何读写i2c从设备?

e0be469de7e82839f461f0f53968432b.png

在执行读写操作时,将使用重要的函数i2c_transfer(). 此功能由i2c内核提供给设备驱动程序. 通过它发送的数据需要打包为i2c_msg结构. 该函数最终将回叫. i2c_adapter-> i2c_algorithm-> master_xfer()接口将i2c_msg对象发送到i2c物理控制器.

0b55b319ebb745680b70d425a4e8138b821536.jpeg?token=e8824018adc85f0c5099739ed35f2c23&s=B2D6A16CEEE4BF741CD194870000708A

以上是我对Linux中I2C驱动程序框架的分析和实际案例分析. 如果您有任何不足之处,请指出. 如果您对Linux驱动程序感兴趣,欢迎收集并关注!

本文来自电脑杂谈,转载请注明本文网址:

http://www.pc-fly.com/a/ruanjian/article-203720-1.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Linux I2C设备驱动是Linux内核中的一个子系统,用于处理I2C总线上的设备驱动程序I2C是一种串行通信协议,通常用于连接各种外设,例如传感器、LCD屏幕、EEPROM、温度传感器等。 Linux I2C设备驱动程序通常包括以下几个部分: 1. i2c_driver结构体:定义I2C设备驱动的属性和操作函数。这个结构体包含了设备的名称、ID等信息,以及设备的初始化函数、读写函数等。通过注册这个结构体,将I2C设备驱动程序I2C总线绑定在一起。 2. i2c_client结构体:定义I2C设备的属性和操作函数。这个结构体包含了设备的地址、名称等信息,以及设备的读写函数等。通过这个结构体,可以访问I2C设备,读写寄存器等。 3. probe函数:用于初始化I2C设备。当I2C总线扫描到一个新的设备时,会调用该函数,完成设备的初始化工作。 4. remove函数:用于卸载I2C设备。当I2C总线上的设备被移除时,会调用该函数,完成设备的清理工作。 5. ioctl函数:用于实现设备的特殊操作。例如,设置I2C设备的工作模式、读取设备的状态等。 通过实现这些函数,可以编写一个完整的Linux I2C设备驱动程序。在驱动程序中,可以使用Linux内核提供的函数,例如i2c_transfer函数、i2c_smbus_read_byte函数等,来实现I2C设备的读写操作。同时,也可以使用Linux的调试工具来调试驱动程序,例如dmesg命令、insmod命令等。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值