6. linux 内核中 i2c 子系统体系架构:
==============================================================================================
在 linux-2.6.22.6/driver/i2c/目录下有如下目录
Algos:(协议)算法相关的
busses: i2c 总线驱动相关文件
Chips: i2c 设备驱动相关文件(e2prom,ds1337)
外部文件:i2c-core.c(核心层的某些公用函数,全局结构体,数组,链表等的东西) i2c-dev.c(i2c 字符设备)
7. i2c 子系统分两个层次:
==============================================================================================
7.1 i2c 设备驱动层:(用 eeprom 为例子,/driver/i2c/chips 目录下)
==============================================================================================
设备驱动层涉及的关键结构体分析:
static struct i2c_driver eeprom_driver =
{
.driver = {
.name = "eeprom",
},
.id = I2C_DRIVERID_EEPROM,
.attach_adapter = eeprom_attach_adapter, /*探测函数*/
.detach_client = eeprom_detach_client,
};
从入口函数开始分析:
==========================================================================================
int __init eeprom_init(void)
/*将设备驱动 i2c _driver 加载到 i2c 子系统中去,*/
i2c_add_driver(&eeprom_driver);
i2c_register_driver(THIS_MODULE, driver);
/*找好总线*/
driver->driver.bus = &i2c_bus_type;
/*加载驱动到驱动链表里面*/
res = driver_register(&driver->driver);
/*去适配器链表上搜索每一个适配器,没搜索一个都会调用 driver->attach_adapter eeprom_attach_adapter */
struct i2c_adapter *adapter;
list_for_each_entry(adapter, &adapters, list)
{
driver->attach_adapter(adapter); /*实际上就是调用 eeprom_attach_adapter */
}
eeprom_attach_adapter 分析:(实际上就是一个探测函数)
============================================================================================
i2c_probe(adapter, &addr_data, eeprom_detect);
err = i2c_probe_address(adapter(控制器), address_data->normal_i2c[i](器件地址),-1, found_proc);