Какая польза от of_device_id и i2c_device_id? - PullRequest
0 голосов
/ 18 мая 2018

Я понял драйвер 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, если он унаследован?

...