Что последовательность сопровождается ядром Linux для конфигурирования устройства?

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

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

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

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

Я неправильно понял что-нибудь?:)

8
задан Jaime Soriano 4 June 2010 в 09:51
поделиться

1 ответ

Код горячего подключения 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}

3
ответ дан 6 December 2019 в 00:54
поделиться
Другие вопросы по тегам:

Похожие вопросы: