mini2440-i2c驱动分析

在s3c2440的i2c驱动框架中, 分2个部分的内容, 一部分是i2c-adapter初始化, 一部分是i2c-driver的初始化. 针对s3c2440自带的eeprom, 走读一下代码, 看看哪些东西值的我们学习和借鉴.

s3c2440上有若干个i2c-adapter, 每一个对应一条i2c总线, 每个总线上可以挂多个i2c 设备, 读写这些设备的方式是操作i2c-adapter的寄存器.挂在同一个i2c-adapter下的i2c设备通过同一个 adapter的发送算法对数据进行操作.

换言之: 一个adapter对应一条总线, 对应一组算法, 操作这条总线下的设备.

那么很容易理解, 要操作i2c设备, adapter的初始化至关重要. 而adapter是用平台设备注册到系统

  1. adapter的平台设备 mach-mini2440.c

    对于熟悉平台设备的人说, 这段代码非常简单, 定义一个平台设备, 定义了i2c-adapter物理内存地址和中断线, 需要注意是,并把它注册到平台设备链表上.

    这些是资源, 但是i2c还需要有一个属性信息需要定义, 

    下面这个结构体, 定义了i2c-adapter使用的总线号, 从地址(如果做从需要使用), 工作频率, 延时信息,

    这些信息注册为平台设备的平台数据, 以便驱动程序使用.

  2. 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 总线

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值