В какой последовательности следует ядро ​​Linux для настройки устройства? - PullRequest
8 голосов
/ 01 июня 2010

Как я понял после прочтения главы, связанной с моделью устройства Linux в драйверах устройств Linux, 3-е издание, при настройке нового устройства ядро ​​(2.6) более или менее следует этой последовательности:

  1. Устройство зарегистрировано в ядре драйвера (device_register(), что включает в себя инициализацию устройства)
  2. Kobject зарегистрирован в модели устройства
  3. Он создает запись в sysfs и вызывает горячее подключениесобытие
  4. Шина и драйверы проверяются, чтобы определить, какой из них соответствует устройству
  5. Зонд
  6. Устройство привязано к драйверу

Мой главныйНа шаге 1 возникает сомнение, когда вызывается device_register() и какие поля уже должны быть установлены в структуре device?

Вызывается ли она по шине, к которой подключено устройство?Любой пример в коде?

Я что-то не так понял?:)

Ответы [ 2 ]

3 голосов
/ 05 июня 2010

Код горячего подключения PCI будет вызывать pci_do_scan_bus (), чтобы пройти через все слоты, посмотреть, найдем ли мы устройство / мост и добавим ли они в наше дерево устройств:

unsigned int __devinit pci_do_scan_bus(struct pci_bus *bus)   { 
    max = pci_scan_child_bus(bus) //scan bus for all slots and devices in them
    pci_bus_add_devices(bus);  //add what we find
...
}

Поля в struct device фактически заполняются как часть вызова pci_scan_child_bus (). Вот график звонков (вроде:)):

pci_scan_child_bus> pci_scan_slot (поиск слотов на шине)> pci_scan_single_device> pci_device_add> device_initialize.

Обратите внимание, что device_initialize () является первой частью device_register (). Вы увидите, что поля struct device заполнены в pci_device_add после вызова device_initialize (). Вы можете найти его в drivers / pci / probe.c в исходниках ядра. Также будет заполнена структура pci_dev, которая позднее будет использоваться драйвером, специфичным для устройства.

Фактическое добавление kobject в иерархию устройств происходит в pci_bus_add_devices. Вот график звонков:

pci_bus_add_devices> pci_bus_add_device> device_add.

Как видите, этот поток вызовов завершает вторую часть функции device_register ().

Итак, вкратце, device_register () состоит из: 1. Инициализировать устройство и 2. Добавить устройство. pci_device_add выполняет шаг 1, а pci_bus_add_device - шаг 2.

Интересующие файлы: drivers / pci / {pci.c, bus.c, probe.c}

0 голосов
/ 19 октября 2012

В тип шины struct есть указатель на функцию match , задача которой - сопоставить драйвер, связанный с устройством. Поэтому, когда устройство связано с шиной, то, как только устройство подключается к шине, шина отвечает за поиск устройства.

Пожалуйста, поправьте меня, если это не так.

...