2015-02-09 1 views
3

Я видел один сценарий, в котором «struct of_device_id» не определено в драйвере, а в строке дерева файлов (dts), совместимой с файлом, добавлена ​​для той же записи устройства.Взаимодействие с драйвером с использованием дерева устройств без совместимой строки в драйвере

Ниже приведен пример дерева устройств для чипа.

&i2c1 { 

    ... 

    adv7ex: [email protected] { 
      compatible = "adv7ex"; 
      reg = <0x4a>; 
    }; 

    ... 

}; 

Ниже приведен фрагмент кода для драйвера чипа, который регистрируется как драйвер I2C.

static struct i2c_device_id adv7ex_id[] = { 
    { "adv7ex", ADV7EX }, 
    { } 
}; 
MODULE_DEVICE_TABLE(i2c, adv7ex_id); 

static struct i2c_driver adv7ex_driver = { 
    .driver = { 
     .owner = THIS_MODULE, 
     .name = "adv7ex", 
    }, 
    .probe = adv7ex_probe, 
    .remove = adv7ex_remove, 
    .id_table = adv7ex_id, 
}; 

module_i2c_driver(adv7ex_driver); 

Не могли бы вы помочь мне понять, как устройство для водителя связывание произошло в данном случае, как там нет «of_device_id» определение структуры в драйвере.

+0

Я думаю, вы ищете что-то вроде: i2c_register_adapter() -> of_i2c_register_devices() -> of_i2c_register_device() -> of_modalias_node(). – 0andriy

+0

Я не уверен, что цель of_i2c_register_device() заключается в том, что здесь нет совместимой строки, заполненной структурой голых драйверов (struct device_driver), а затем, как ядро ​​дерева устройств свяжет запись устройства с драйвером. – user3693586

+0

В ядре есть только одно сопоставление, то есть по имени (или modalias, который является псевдонимом имени). Таким образом, вы должны указать как в дереве устройств, так и в драйвере одинаковое имя. Вопрос, вероятно, в том, как их сопоставить. – 0andriy

ответ

1

На самом деле, это не ядро, которое будет загрузить драйвер, но в пользовательском пространстве инструменты:

MODULE_DEVICE_TABLE(i2c, adv7ex_id); 

Этот макрос добавляет специфические имена символов в вашем окончательном скомпилированного модуля (то есть: .ko файл), который будет проанализирован depmod, который затем добавит ссылку на ваш драйвер в module.alias, и, наконец, ваш драйвер будет загружен вашим инструментом hotplug пользователя.

Ссылка: https://www.kernel.org/doc/ols/2001/hotplug.pdf Раздел 5.

0

Как вы можете видеть here, i2c_device_match() функции сначала пытается соответствовать устройству по compatible строке (стиль, который является Device Tree). И если он терпит неудачу, он пытается сопоставить устройство по таблице идентификаторов.

Смежные вопросы