Linux中的I2C(一)——总体架构

本文简要介绍Linux I2C架构,包括硬件物理结构、Linux框架图、代码架构和数据结构。重点阐述了I2C总线的简单电路结构、内核代码组织方式以及与硬件交互的方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Linux中的I2C架构

!因为申请时间没有过一周。。 暂时无法上传图片。。 请谅解。。

1. 前言

    在这里声明,本文只是简单的记一下学习I2C时候的笔记,而且没有提及I2C的协议、master_xfer和smbus_xfer这些具体函数的实现,希望找到这类资料的读者和已经有一定较好的Linux设备架构理解的读者可以忽略这个系列文章。本文的目的仅仅是分享学习过程中的一些理解并且为自己保留一份学习笔记。
    I2C总线在现在的嵌入式中属于比较简单的一类,对于我们这种刚入门的小鸟去研究是一个不错的选择,因为他没有像PCIe那样的复杂的配置和管理事务的过程,但是总体来说在架构上能给我们不少Linux下驱动架构的理解。

2. 硬件物理结构

    I2C的电路结构比较简单,如下图。总线只有SCL和SDA两条线。Adapter是一个I2C总线的控制器,一条线可有多个,这个请参考《I2C总线协议规范》。我所接触到的那几个板子里面就有一个片子。

3. I2C Linux框架图

#! 声明: 这里所用的3幅图均来自《i2c源代码情景分析(beta2)》,按照原作者声明图片可以随便转用,修改,但是保证其他人也享受对你成果物上的图片的同样的权利 。我做了。。。- -!

这里简单介绍一下,Client代表I2C设备,Adapter代表我们的适配器,Algorithm描述着Adapter实现的通信方法。

4. 代码架构

    I2C的代码架构分的比较清晰。
    1) kernel/driver/i2c/i2c-core.c
    2) kernel/driver/i2c/busses/xxx.c
    3) kernel/driver/i2c/chips/xxx.c
    4) kernel/driver/i2c/i2c-dev.c

    1)是内核提供的,里面包含了i2c_bus_type的注册,client和adapter的注册和注销管理,还要有关于i2c通信方法接口等,个人理解是往client和adapter的中间夹了一层与硬件无关的接口,这样就有较好的移植性了。这点可能跟emmc/SD卡的core的目的是差不多的。
    2)就是我们的adapter的具体代码了,比如说i2c-s3c2410.c。上面架构图上的adapter结构体和algorithm结构体都在这个.c实现。
    3)是具体的设备芯片的代码,但是现在内核提供了一个通用的访问设备的cdev.c(也就是4))这个字符设备可以给app提供read,write,ioctl等接口来实现设备的操作,你可以通过ioctl选进行一系列的配置,然后开始读写。其实自己写一个设备驱动和直接用i2c-dev.c都能达到控制硬件的目的,对于这两种方法的优缺点网上有诸多描述,但是我感觉如果不是出自于完成工作的目的的话,剖析i2c-dev.c然后根据自己板子上的一些片子写自己的驱动是最好的,一切都是为了进步么。
    
    总的来说如果你拿到了一个板子你唯一做的东西是编写适配器的代码的.c,里面实现跟硬件相关的N多东西,然后通过初始化的时候注册一个platform_driver,其过程中会匹配platform_device,然后调用我们编写的platform_driver里的probe函数。这里回调probe的时候我们匹配的device会作为参数传进来。然后再整个probe函数最后记得调用i2c.h里的i2c_add_numbered_adapter函数,这个函数在i2c-core.c里面实现,至此我们就能完成我们的工作,然后根据i2c设备的芯片手册写一个app层的代码,这里调用i2c-dev.c生成的节点就可以操作设备。注意i2c的设备节点主设备号是89,次设备号对应我们的适配器结构体,所以建节点的时候要对应好。

5. 数据结构

    未完待续。。。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值