假设您有以下 i2c 驱动程序结构:
static const struct i2c_device_id lm75_ids[] = {
{ "adt75", adt75, },
{ }
};
MODULE_DEVICE_TABLE(i2c, lm75_ids);
static const struct of_device_id lm75_of_match[] = {
{ .compatible = "adi,adt75" },
{ },
};
MODULE_DEVICE_TABLE(of, lm75_of_match);
static struct i2c_driver lm75_driver = {
.driver = {
.name = "lm75",
.of_match_table = of_match_ptr(lm75_of_match),
},
.probe = lm75_probe,
.id_table = lm75_ids,
};
module_i2c_driver(lm75_driver);
当通过用户空间实例化 I2C 设备时:
echo adt75 0x50 > /sys/bus/i2c/devices/i2c-3/new_device
i2c-core 将名称“adt75”与 struct i2c_device_id 数组中的名称相匹配,并将该元素传递给 lm75_probe。
当通过 OF 设备树实例化 I2C 设备时,它的 compatible 属性会匹配(格式:“manufacturer,model”),并且“model”组件会与 struct i2c_device_id 数组匹配 - 该数组也将该元素传递给 lm75_probe。很整洁!
struct of_device_id 还有一个 .data 属性,您可以通过不同的机制访问它。