controlador de Linux, la función de la sonda cuando se le llama

  

visto recientemente el modelo de controlador de dispositivo Linux, en kobject, KSET por lo que no es misión muy clara. Cuando vea una estructura device_driver esta estructura, pensar en una pregunta: ¿Dónde está su función de inicialización llaman? Cuando la función de registro ante la unidad para activar el PCI PCI conducción puede llamarlo, cuando se conduce S3C2410 struct largos enganchen a la platform_device mach-smdk2410.c * smdk2410_devices dispositivo añadido es también llamado {}. Pero nunca pensé en el proceso de registro del controlador específico y exige una profunda investigación.

a continuación, abra el seguimiento de SourceInsight bits:

driver_register de mira: int driver_register (struct device_driver * DRV) {klist_init (&DRV- > klist_devices, klist_devices_get, klist_devices_put); init_completion ( &DRV- > sin carga); bus_add_driver retorno (DRV);} init_completion klist_init y no ir solos, algunos de los trabajos puede ser de 2,6 a hacer este modelo de dispositivo. La intuición me dice que vaya bus_add_driver.

bus_add_driver en: kobject son más y klist, attr y así sucesivamente. O relacionados con el modelo del dispositivo. Pero hay una: driver_attach (DRV); solo escuchar el nombre como: driver_attach vacío (struct device_driver * DRV) {bus_for_each_dev (DRV- > bus, NULL, DRV, __driver_attach);} Este familiares dispositivos transversales en el autobús y establecer con __driver_attach. En __driver_attach son principalmente en esto: driver_probe_device (DRV, dev); driver_probe_device fue a ir a ver: hay una muy importante :! Si (DRV- > bus- > & coincidir; &DRV- > bus - > partido (dev, DRV)) Goto Hecho; obviamente, la función de concordancia se pidió a un conductor de autobús. Si devuelve 1, se puede continuar, hecho de otra manera para arriba. palabras de ejecución hereda: si (DRV- > sonda) {ret = DRV- > sonda (dev), si (r) {dev- > driver = NULL; Goto ProbeFailed;} se llama siempre que la presencia de la sonda. Con esto se completa la llamada de la sonda.

La cadena proceso clave o en DRV- > bus- > partido, ya que el resto del lugar es malo, entonces el registro falla, pero no fallan, siempre y cuando el registro y devolver un partido, qucheng entonces definitivamente se llama de la sonda. Usted puede inscribirse para un tipo de bus y bus, y siempre volver partido 1, se encuentra, siempre y cuando la estructura tipo de bus device_driver correcta, la función de la sonda siempre se llama dispositivo de .PCI tiene su propio modelo de autobús, que se estima en su hay una coincidencia en la condición de determinación. static int pci_bus_match (dispositivo struct * dev, struct device_driver * drv) {struct pci_dev * pci_dev = to_pci_dev (dev); struct pci_driver * pci_drv = to_pci_driver (drv); const struct pci_device_id * found_id; found_id = pci_match_device (pci_drv, pci_dev); si (found_id) return 1; return 0;} y luego rastrear sabe se basa principalmente en familiarizados id_table venir. Otra solución ------------------------------- ----------------- -------------------------------------------------- ----------------------------

ve desde driver_register, aquí estoy aquí está:

int driver_register (struct device_driver * DRV) {if ((DRV- > > autobús-; sonda &&DRV- > sonda) | |  (DRV- > bus- > & eliminan; &DRV- > quitar) | |  (DRV- > bus- > apagado &&DRV- > apagado)) {printk (KERN_WARNING " controlador '% s' necesita una reforma - por favor utilice métodos tipoDeBus \\ n ", DRV- > nombre); klist_init} (&DRV- > klist_devices, null, null); bus_add_driver retorno (DRV);} klist_init irrelevante, no es él, para ir en particular bus_add_driver:

int bus_add_driver (struct device_driver * drv .) {//una primera kobject_set_name (&DRV- > kobj, "% s ", DRV- > nombre);. //2 más kobject_register (&DRV- > kobj) //3 a continuación. llamar: driver_attach (DRV)} int driver_attach (struct device_driver * DRV) {bus_for_each_dev retorno (DRV- > bus, NULL, DRV, __driver_attach);} function es real __driver_attach:

static int __driver_attach (struct dispositivo dev *, void * data) {... si (dev- >! conductor) driver_probe_device (DRV, dev); ...} int driver_probe_device (struct device_driver * drv, struct device * dev) {. . ..//1 primer bus determina si partido: if (! DRV- > bus- > & partido; &DRV- > > autobús-; partido (dev, DRV)) Goto hecho; //2. de nuevo con La sonda banco de ejecución: ret = really_probe (dev, DRV); ...} es una función really_probe que estamos buscando:

static int really_probe (struct dispositivo dev *, * estructura device_driver DRV) {... función de conducción de autobuses //1 sonda pertenece llama primero :. si (dev- > bus- > sonda) {ret = dev- > bus- > sonda (dev); si (RET) Goto probe_failed;} else if (DRV- > sonda) {//2 y luego llamar a la función de sonda de conducir:. ret = DRV- > sonda (dev), si (r) Goto probe_failed;} ...} en donde, drv - > sonda (dev), es la función sonda específica vocación real de la unidad de alcanzar. Es decir, el correspondiente título de este artículo están pidiendo, la función de la sonda en este momento se llama.


Copyright © Conocimiento de Windows All Rights Reserved