Как я понял после чтения главы, связанной с Моделью устройства Linux в Драйверах устройств Linux 3-й Выпуск, когда новое устройство настроено, ядро (2.6) следует более или менее за этой последовательностью:
device_register()
, что включает инициализацию устройства),Мое основное сомнение на шаге 1, когда device_register()
названный и какие поля должны уже быть установлены в device
структура?
Это называет шина, с которой подключено устройство? Какой-либо пример в коде?
Я неправильно понял что-нибудь?:)
Код горячего подключения 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}