Linux2.6.37 I2C驱动框架分析(三)
来源:互联网 发布:广告铃声制作软件 编辑:程序博客网 时间:2024/06/16 09:43
最几天忙着公司的sensor驱动,自己的活的忙不过来。终于抽出了点时间继续完成未完的I2C驱动分析。
当调用i2c_register_adapter或i2c_add_driver时,都会遍历已经注册的i2c_driver或i2c_adapter作为参数调用__process_new_adapter或 __process_new_driver。其中:
__process_new_driver(struct device *dev, void *data)
i2c_do_add_adapter(data, to_i2c_adapter(dev));
__process_new_adapter(struct device_driver *d, void *data)
i2c_do_add_adapter(to_i2c_driver(d), data);
从上面两个函数调用情况来看,最终都是调用了i2c_do_add_adapter函数。那我们接下来就来分析这个函数的实现。
i2c_do_add_adapter(struct i2c_driver *driver,struct i2c_adapter *adap)
i2c_detect(adap, driver); 调用i2c_detect对i2c设备进行探测
if (driver->attach_adapter) { 如果是老版的驱动调用驱动的attach_adapter函数,不建议使用了
driver->attach_adapter(adap);
}
继续分析i2c_detect函数的实现吧!
i2c_detect(struct i2c_adapter *adapter, struct i2c_driver *driver)
address_list = driver->address_list;
if (!driver->detect || !address_list) 如果驱动即没有detect函数,又没有设备的地址直接返回了
return 0;
if (!(adapter->class & driver->class)) 适配器的类和驱动的类不一致也直接返回
return 0;
temp_client = kzalloc(sizeof(struct i2c_client), GFP_KERNEL); 条件满足动态分配一个临时的i2c_client结构
temp_client->adapter = adapter; 设置i2c设备所属的i2c_adapter
for (i = 0; address_list[i] != I2C_CLIENT_END; i += 1) {
temp_client->addr = address_list[i]; 从设备地址列表中依次取出设备地址,直到I2C_CLIENT_END
i2c_detect_address(temp_client, driver); 调用该函数去探测设备是否真的存在
}
毫无疑问,我们知道要去分析i2c_detect_address函数了。
i2c_detect_address(struct i2c_client *temp_client, struct i2c_driver *driver)
i2c_check_addr_validity(addr); 检查设备地址的合法性
i2c_check_addr_busy(adapter, addr) 判断该地址是否在总线上正使用着
i2c_default_probe(adapter, addr) 调用默认的探测函数了
i2c_smbus_xfer(adap, addr, 0, I2C_SMBUS_WRITE, 0,I2C_SMBUS_QUICK, NULL); 调用该函数给设备发数据
i2c_transfer(adapter, msg, num)algo->master_xfer>; 最终调用适配器驱动的master_xfer给设备地址信息,看能否收到ACK信号。如果能收到表明设备是存在的,探测成功。
到这里关于注册适配器驱动和注册i2c设备驱动的分析就要告一段落了。。。
接下来我们转去分析一个具体的i2c适配器的驱动。
此时我们应该很清楚,一个适配器的驱动最为关键的地址在于,适配器驱动的通信方法的实现:如发出S信号、发出从机地址、等待ACK信号。发送数据。。。。,这些都是与我们的硬件密切相关的。明天就分析S3C2440的适配器驱动吧!
- Linux2.6.37 I2C驱动框架分析(三)
- Linux2.6.37 I2C驱动框架分析(一)
- Linux2.6.37 I2C驱动框架分析(二)
- Linux2.6.37 I2C驱动框架分析(五)
- Linux2.6.37 I2C驱动框架分析(六)
- Linux2.6.37 I2C驱动框架(四)
- I2C设备驱动(三)--linux i2c驱动框架
- Linux下I2C驱动分析(三)
- i2c 驱动举例框架分析
- PowerPC + Linux2.6.25平台下的I2C驱动架构分析
- PowerPC + Linux2.6.25平台下的I2C驱动架构分析
- linux2.6.22.6驱动源码框架分析
- linux内核I2C驱动子系统分析(三)
- Linux I2C设备驱动编写(三)-实例分析AM3359
- Linux I2C设备驱动编写(三)-实例分析AM3359
- Linux I2C设备驱动编写(三)-实例分析AM3359
- Linux I2C设备驱动编写(三)-实例分析AM3359
- Linux I2C设备驱动编写(三)-实例分析AM3359
- Oracle Database Compression 3 - Hybrid Columnar Compression
- UVa:10717 Mint
- flume ng配置拓扑图
- Oracle Database Compression 1 - Basic Compression
- 从这段工作中学到的东西
- Linux2.6.37 I2C驱动框架分析(三)
- mono touch中,Async/Await 关键词应用举例
- MOSFET结构及其工作原理详解
- 51单片机——AT2402
- WWDC
- Js和C#中的字符串编码解码
- AFX_NOVTABLE与__declspec(novtable)
- busybox inittab文件分析
- 编程能力的四种境界