Я понял драйвер I2C для датчика adxl34x.Если я сохраню только of_device_id, мой зонд не будет вызван, но если я включу i2c_device_id, зонд будет вызван.Я проверил некоторые объяснения, но узнал, что i2c_device_id используется для устаревших целей или для сопоставления файлов на доске.Здесь я использую дерево устройств.Как это возможно, что i2c_device_id делает устройство распознаваемым?Есть ли зависимость в драйверах I2C для использования i2c_Device_id и of_device_id ??вот мое понимание на этой верхней id_table используется для устаревших устройств i2c.См. В этом коде
static const struct i2c_device_id *i2c_match_id(const struct i2c_device_id *id,
const struct i2c_client *client)
{
while (id->name[0]) {
if (strcmp(client->name, id->name) == 0)
return id;
id++;
}
return NULL;
}
Нет ссылки на таблицу идентификаторов устройств, тогда как of_device_id
/**
* of_match_device - Tell if a struct device matches an of_device_id list
* @ids: array of of device match structures to search in
* @dev: the of device structure to match against
*
* Used by a driver to check whether an platform_device present in the
* system is in its list of supported devices.
*/
const struct of_device_id *of_match_device(const struct of_device_id *matches,
const struct device *dev)
{
if ((!matches) || (!dev->of_node))
return NULL;
return of_match_node(matches, dev->of_node);
}
Использует dev-> of_node
Так что можно с уверенностью сказать, что оба механизмаизолированы и не зависят друг от друга.Тогда почему мой драйвер не проверяется только с помощью этого,
/*
static const struct i2c_device_id adxl34x_id[] = {
{ "adxl345", 0 },
{ }
};
MODULE_DEVICE_TABLE(i2c, adxl34x_id);
*/
#ifdef CONFIG_OF
static const struct of_device_id adxl34x_of_id[] = {
/*
* The ADXL346 is backward-compatible with the ADXL345. Differences are
* handled by runtime detection of the device model, there's thus no
* need for listing the "adi,adxl346" compatible value explicitly.
*/
{ .compatible = "adi,adxl345", },
/*
* Deprecated, DT nodes should use one or more of the device-specific
* compatible values "adi,adxl345" and "adi,adxl346".
*/
{ .compatible = "adi,adxl34x", },
{ }
};
MODULE_DEVICE_TABLE(of, adxl34x_of_id);
#endif
static struct i2c_driver adxl34x_driver = {
.driver = {
.name = "adxl34x",
//.pm = &adxl34x_i2c_pm,
.of_match_table = of_match_ptr(adxl34x_of_id),
},
.probe = adxl34x_i2c_probe,
.remove = adxl34x_i2c_remove,
//.id_table = adxl34x_id, /*commented i2c_device_id*/
};
Вот некоторые ссылки, которые я прошел, чтобы получить некоторое понимание
https://patches.linaro.org/patch/16873/
https://lists.ozlabs.org/pipermail/linuxppc-dev/2015-July/131965.html
https://i2c.wiki.kernel.org/index.php/OF_Modalias
Я понял, что произойдет сначала совпадение стиля of_ *, затем совпадение типа i2c_device_id.
В моем случае, затем как of_ *не может связать тогда?
Зачем нужен i2c_device_table, если он унаследован?