mini2440 iic驱动解析
2016-06-28 16:41
211 查看
mini2440 IIC驱动解析
最近在学习iic驱动,于是就找到kermel2.6.32源码,在目录/driver/iic和/dirver/rtc目录下游荡了一周,战死脑细胞无数,最后终于攻克了几个反人类的why。在这里记录一下,已便后者能取其精华,快速成长,最好是能成长为大神,将这种正常人类难以理解的代码给干掉。good luck for u!代码分布
研究iic总线就要结合一个iic设备一起read代码。这里推荐rtc设备,因为感觉rtc比较典型。rtc最为平台设备被注册进虚拟总线
目录:/arm/arch/mach-s3c2440/mach-mini2440.c
rtc驱动被注册到iic总线,用来驱动iic总线上的iic设备
目录:/driver/rtc/rtc-m41t80.c
iic适配器驱动和iic核心函数提供平台无关iic驱动/设备注册等函数
目录:/driver/iic/
rtc驱动注册
rtc作为iic总线设备,使用的是由iic模块提供的相关函数,包括且不限于iic驱动注册/iic适配器驱动注册/iic设备注册/iic总线类型等,iic模块目录是/driver/iic。进入rtc-m41t80.c文件,该文件就是rtc驱动文件,可以看到该文件和常见驱动结构文件一样,都是凡胎肉体。直接找到module_init(m41t80_rtc_init);函数,紧接着就是一系列的函数调用。
->m41t80_rtc_init
->i2c_add_driver_driver(&m41t80_driver)
->i2c_register_driver(arg1, struct i2c_driver *dirver)
设置i2c_driver->dirver.bus = &i2c_bus_type
->driver_register(i2c_driver->driver)
->bus_add_driver(struct device_driver)
->driver_attach(strucct device_driver)
->bus_for_each_dev(drv->bus, NULL, struct device_driver, __driver_attach)
遍历iic总线上的所有dev,使用driver_match_dev(drv, dev)函数确定匹配关系
->driver_probe_device(drv,dev)
->really_probe(dev, drv)
if(dev->bus->probe){ dev->bus->probe(dev) } else if(drv->probe){ drv->probe(dev) } rtc的探测就是在这里,逻辑上可能很绕。首先rtc的probe函数在i2c_driver结构体中定义,这里没有显示的直接调用i2c_driver->probe, 也没有调用i2c_driver->dirver->probe,而是通过dev->bus->probe来间接调用i2c_driver->probe;dev的bus是&i2c_bus_type,而i2c_bus_type的probe函数又会根据dev中的device_driver找到包含这个dev的对应i2c_driver,进而调用i2c_driver->probe函数。
相关文章推荐
- android 项目中出现红色感叹号的解决方法
- JS 和 CSS 的位置对其他资源加载顺序的影响
- struts2之初学习
- Android色彩矩阵处理图像
- UIGestureRecognizer(手势识别器)
- 支付系统开发--简易版支付系统介绍
- java堆栈理解
- Android:控件GridView的使用
- java 读取配置文件(1)(.properties后缀)
- build AOSP for N6P/N5
- android 多线程断点续传下载 二
- IOS开发直播客户端的SDK
- Linux 文件IO
- Swift String
- Hbase:java.lang.IllegalArgumentException: Not a host:port pair: PBUF
- Flask
- iOS中静态库的介绍及使用(1)
- 1千用户与1千万用户的网站系统架构区别?
- 国内常用的DNS
- Hbase基本操作