I2C驱动分为3层:
1. I2C BUS驱动
2. I2C核心层(协议相关)
3. I2C chip
I2C BUS 驱动分析:drivers\i2c\busses\i2c-s3c2410.c
1. 分配一个i2c_adapter
2. 设置: 实现发出I2C命令、数据的函数
3. 注册:i2c_add_adapter
4. 硬件相关的设置
I2C chip驱动分析:drivers\i2c\chips\ds1337.c
ds1337_init
i2c_add_driver(&ds1337_driver); /* 添加driver */
1. 分配i2c_driver
2. 设置: i2c_driver里有一个attach_adapter,用来识别是否存在I2C设备
3. 注册: i2c_add_driver
static struct i2c_driver ds1337_driver = {
.driver = {
.name = "ds1337",
},
.attach_adapter = ds1337_attach_adapter,
.detach_client = ds1337_detach_client,
.command = ds1337_command,
};
drivers\i2c\busses\i2c-s3c2410.c:
i2c_add_adapter => i2c_register_adapter => i2c_driver.attach_adapter
i2c_register_driver => i2c_driver.attach_adapter
i2c_driver.attach_adapter //ds1337_attach_adapter
i2c_probe(adapter, &addr_data, ds1337_detect);
ds1337_detect
i2c_attach_client /* 添加设备 */
分析drivers\i2c\chips\ds1337.c
ds1337_init
i2c_add_driver(&ds1337_driver);
i2c_register_driver
// 把i2c_drvier放入键表
// 对每一个adapter(发出I2C信息的能力),调用attach_adapter
list_for_each_entry(adapter, &adapters, list) {
driver->attach_adapter(adapter);
ds1337_attach_adapter // 识别I2C设备
// i2c-core.c
i2c_probe(adapter, &addr_data, ds1337_detect);
i2c_probe_address(adapter, addr, kind, found_proc)
err = found_proc(adapter, addr, kind);
ds1337_detect(adapter, 0x68, xxxxx)
// 分配一个i2c_client
// 设置
// 读I2C设备,确定该设备确实存在
ds1337_read(new_client, DS1337_REG_STATUS, &data)
i2c_smbus_read_byte_data
i2c_smbus_xfer
// s3c24xx_i2c_algorithm
adapter->algo->smbus_xfer
/*
* linux/drivers/i2c/chips/ds1337.c
*
* Copyright (C) 2005 James Chapman <jchapman@katalix.com>
*
* based on linux/drivers/acorn/char/pcf8583.c
* Copyright (C) 2000 Russell King
*
* This prog