2010-06-01 22 views
8

Comme je l'ai compris après avoir lu le chapitre relatif au modèle de périphérique Linux dans les pilotes de périphériques Linux 3rd Edition, lorsqu'un nouveau périphérique est configuré, le noyau (2.6) suit plus ou moins cette séquence:Quelle est la séquence suivie par le noyau Linux pour configurer un périphérique?

  1. Le dispositif est enregistré dans le noyau d'entraînement (device_register(), ce qui comprend l'initialisation de l'appareil)
  2. a kobject est inscrit dans le modèle de dispositif
  3. Il crée une entrée dans sysfs et provoque un événement hotplug
  4. bus et les conducteurs sont vérifiées pour voir quelles l'un correspond à l'appareil
  5. Sonde
  6. L'appareil est binded au pilote

Mon doute principal est, à l'étape 1, quand est device_register() appelé et quels domaines doit déjà être défini dans le struct device? Est-il appelé par le bus auquel l'appareil est connecté? Un exemple dans le code?

Ai-je mal compris quelque chose? :)

Répondre

3

PCI code hotplug va appeler pci_do_scan_bus() pour passer par tous les créneaux horaires, voir si on trouve un dispositif/pont et les ajouter à notre arbre de l'appareil:

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 
... 
} 

Les champs dispositif struct sont réellement remplis dans le cadre de l'appel à pci_scan_child_bus(). Voici le graphe d'appel (en quelque sorte :)):

pci_scan_child_bus> pci_scan_slot (recherche d'emplacements sur le bus)> pci_scan_single_device> pci_device_add> device_initialize.

Notez que device_initialize() est la première partie de device_register(). Vous verrez que les champs du périphérique struct sont remplis dans pci_device_add après l'appel à device_initialize(). Vous pouvez le trouver sous drivers/pci/probe.c dans les sources du noyau. La structure pci_dev sera également remplie, elle sera ensuite utilisée par le pilote spécifique à l'appareil.

L'ajout réel du kobject à la hiérarchie de périphériques se produit dans pci_bus_add_devices. Voici le graphe des appels:

pci_bus_add_devices> pci_bus_add_device> device_add.

Comme vous pouvez le voir, ce flux d'appels termine la deuxième partie de la fonction device_register(). Donc, en bref, device_register() se compose de: 1. Initialiser le périphérique et 2. Ajouter le périphérique. pci_device_add fait l'étape 1 et l'étape 2. pci_bus_add_device ne

Fichiers d'intérêt sont: drivers/pci/{pci.c, bus.c, probe.c}

0

Dans type de bus struct il y a le pointeur vers la fonction correspond à, dont le travail consiste à faire correspondre le pilote associé à l'unité. Ainsi, lorsque l'appareil est associé à un bus, dès que l'appareil est connecté au bus, il incombe au bus de rechercher l'appareil.SVP corrigez-moi si ce n'est pas le cas.