您的位置:首页 > 其它

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函数。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: