/kernel-5.10/drivers/i2c/i2c-core-base.c 是 I2C 的核心部分,I2C 核心提供了一些與具體硬件無關(guān)的 API 函數(shù)
1、i2c_adapter 注冊/注銷函數(shù)
int i2c_add_adapter(struct i2c_adapter *adapter)//自動(dòng)分配 adapter ID
int i2c_add_numbered_adapter(struct i2c_adapter *adap)//指定 ID
void i2c_del_adapter(struct i2c_adapter * adap)
2、i2c_driver 注冊/注銷函數(shù)
int i2c_register_driver(struct module *owner, struct i2c_driver *driver)
int i2c_add_driver(struct i2c_driver *driver)
void i2c_del_driver(struct i2c_driver *driver)
上述 API 一般需要在 init/exit 或者 probe/remove 函數(shù)中成對使用。
設(shè)備和驅(qū)動(dòng)的匹配過程也是由 I2C 總線完成的,I2C 總線的數(shù)據(jù)結(jié)構(gòu)為 i2c_bus_type,定義在 /kernel-5.10/drivers/i2c/i2c-core-base.c 文件,i2c_bus_type 內(nèi)容如下:
struct bus_type i2c_bus_type = {
.name = "i2c",
.match = i2c_device_match,
.probe = i2c_device_probe,
.remove = i2c_device_remove,
.shutdown = i2c_device_shutdown,
};
.match 就是 I2C 總線的設(shè)備和驅(qū)動(dòng)匹配函數(shù),在這里就是 i2c_device_match 這個(gè)函數(shù),此函數(shù)內(nèi)容如下:
static int i2c_device_match(struct device *dev, struct device_driver *drv)
{
struct i2c_client *client = i2c_verify_client(dev);
struct i2c_driver *driver;
if (!client)
return 0;
/* Attempt an OF style match */
if (of_driver_match_device(dev, drv))
return 1;
/* Then ACPI style match */
if (acpi_driver_match_device(dev, drv))
return 1;
driver = to_i2c_driver(drv);
/* match on an id table if there is one */
if (driver- >id_table)
return i2c_match_id(driver- >id_table, client) != NULL;
return 0;
}
of_driver_match_device 函數(shù)用于完成設(shè)備樹設(shè)備和驅(qū)動(dòng)匹配。比較 I2C 設(shè)備節(jié)點(diǎn)的 compatible 屬性和 of_device_id 中的 compatible 屬性是否相等,如果相當(dāng)?shù)脑捑捅硎?I2C 設(shè)備和驅(qū)動(dòng)匹配。
acpi_driver_match_device 函數(shù)用于 ACPI 形式的匹配。
i2c_match_id 函數(shù)用于傳統(tǒng)的、無設(shè)備樹的 I2C 設(shè)備和驅(qū)動(dòng)匹配過程。比較 I2C 設(shè)備名字和 i2c_device_id 的 name 字段是否相等,相等的話就說明 I2C 設(shè)備和驅(qū)動(dòng)匹配。
-
I2C
+關(guān)注
關(guān)注
28文章
1488瀏覽量
123848 -
函數(shù)
+關(guān)注
關(guān)注
3文章
4332瀏覽量
62666
發(fā)布評(píng)論請先 登錄
相關(guān)推薦
評(píng)論