在s3c2440的i2c驱动框架中, 分2个部分的内容, 一部分是i2c-adapter初始化, 一部分是i2c-driver的初始化. 针对s3c2440自带的eeprom, 走读一下代码, 看看哪些东西值的我们学习和借鉴.
s3c2440上有若干个i2c-adapter, 每一个对应一条i2c总线, 每个总线上可以挂多个i2c 设备, 读写这些设备的方式是操作i2c-adapter的寄存器.挂在同一个i2c-adapter下的i2c设备通过同一个 adapter的发送算法对数据进行操作.
换言之: 一个adapter对应一条总线, 对应一组算法, 操作这条总线下的设备.
那么很容易理解, 要操作i2c设备, adapter的初始化至关重要. 而adapter是用平台设备注册到系统
adapter的平台设备 mach-mini2440.c
对于熟悉平台设备的人说, 这段代码非常简单, 定义一个平台设备, 定义了i2c-adapter物理内存地址和中断线, 需要注意是,并把它注册到平台设备链表上.
这些是资源, 但是i2c还需要有一个属性信息需要定义,
下面这个结构体, 定义了i2c-adapter使用的总线号, 从地址(如果做从需要使用), 工作频率, 延时信息,
这些信息注册为平台设备的平台数据, 以便驱动程序使用.
adapter的平台驱动 i2c-s3c2440.c
通过平台总线的match过程, 调用probe函数
s3c24xx_i2c_probe中, 主要完成以下几个工作:
首先定义了一个s3c24xx_i2c, 此结构体用于描述一个adapter, 其中初始化此adapter的数据传输算法
获取i2c系统时钟, 并使能
ioremap映射物理地址, 及申请中断
设置adapter的设备关系(父设备是平台设备), 及初始化(gpio设置, 根据平台设备的平台数据设置CON频率, 设置S3C2410_IICADD地址寄存器)
设置总线, 并扫描总线上的i2c设备, 生成i2c client设备描述结构体, 并把i2c client注册称为adapter的子设备
设备平台设备的私有数据为
从整个过程看, 就是注册adapter, 并初始化的过程. 比较特殊的是, 当adapter初始化完成后, 还需要扫描所属这个总线的i2c设备, 并注册成为自己的子设备. i2c设备注册, 同样是通用的设备模型, 那么在同样存在match和probe的过程.
通过上述这样的操作, 系统就使能了某个adapter, 以及使能了内置在__i2c_board_list下, 并且属于这条总线的i2c设备
数据传输过程(发送和接收):
内核定义了一个函数:
只要i2c client和i2c driver可以匹配成功, 那么adapter默认就在i2c-client中, i2c驱动中,只需要构造msgs指定msgs的num就可以完成数据发送
最后奉献一张自己画的图, 一张图抵过千言万语:
理解了这些, 那么就可以从头开始暴力写一个自己的驱动框架了:
1)定义一个struct i2c_adapter, 初始化,调用i2c_register_adapter加入到i2c bus
2) 定义i2c_devinfo用于描述一个i2c cient, 调用i2c_new_device创建i2c client
3) 写一个i2c driver, 注册到i2c 总线
上一篇:Linux的I2C 设备驱动 -- mini2440 上i2c接口触摸屏驱动
下一篇:Linux I2C驱动完全分析(一)
推荐阅读最新更新时间:2024-11-12 15:45
设计资源 培训 开发板 精华推荐
- 具有板载 ADC 和 I2C 的 LTC2945CUD 功率监视器的典型应用
- 具有诊断功能的 CAT4106 6W 四通道 DC/DC LED 驱动器的典型应用
- 符合 IrDA 标准的发射器/接收器
- 【ART-Pi】NFC识别扩展板
- LT3724、15V 至 12V 25W SEPIC DC/DC 转换器
- 使用 Analog Devices 的 LT3470HTS8 的参考设计
- 使用 NXP Semiconductors 的 PCF2129A 的参考设计
- STLQ50C18R 50mA、3uA 电源电流低压降线性稳压器的典型(可调版本)应用
- 使用 Analog Devices 的 LT1317CMS8 的参考设计
- MCP6N11 和 MCP6V2x 惠斯通电桥参考设计演示板