Los controladores de dispositivos I2C asociación

  
 

en Linux
sistema operativo, cargar el controlador se divide en dos: el usuario para cargar automáticamente y cargar el arranque del kernel manualmente; hardware puede ser añadido al sistema utilizado de dos maneras: se inicia el sistema hot swap frontal y el sistema se está ejecutando. A continuación, AT91 procesador bajo el controlador I2C arquitectura ARM, por ejemplo, nos dicen acerca de cómo el hardware y los controladores asociados son vinculantes y desagregación.

1. Registro etapa de conducción proceso

1.1 at91_i2c_init () la función

en el fichero drivers /I2C /autobuses /I2C-at91.c, definir una estructura struct platform_driver e inicializado,) a través del uso de macros declarada module_init (cuando se carga el módulo en el kernel llama at91_i2c_init () función. En esta función, llamamos a la función platform_driver_register () para completar el registro.


estática at91_i2c_driver struct platform_driver = {

.probe = at91_i2c_probe,

.Remove = __devexit_p (at91_i2c_remove), Francia

. suspender = at91_i2c_suspend,

.resume = at91_i2c_resume,

.driver = {

.name = " at91_i2c ",

.owner = THIS_MODULE,

}, España

};


static int __init at91_i2c_init (void)

{

platform_driver_register retorno (&at91_i2c_driver);

}
función

en el fichero drivers /base /platform.c, función

1,2 platform_driver_register () la realización y platform_driver_register derivado (), por lo que la función de los otros módulos puede llamar a esta función. Después de terminar en un paquete simple, llamada función driver_register (), completó la transición de la plataforma para lograr la implementación del núcleo de Linux.

A continuación, tenemos que mirar al () y la función platform_drv_probe () platform_match. platform_match () función determina la unidad asociada con el dispositivo, y la función platform_drv_probe () es llamado en una presentación posterior de la función.

//unidad comparativo tanto el nombre como la información del nombre de la información del dispositivo es consistente

int platform_match estática (struct device * dev, struct device_driver * DRV)

{

struct platform_device * pdev = container_of (dev, struct platform_device, dev);


retorno (strncmp (pdev- > nombre, DRV- > nombre, BUS_ID_SIZE) == 0);

}


struct tipoDeBus platform_bus_type = {

.name = " plataforma ", España

.dev_attrs = platform_dev_attrs,

.match = platform_match,

.uevent = platform_uevent,

.suspend = platform_suspend,

.suspend_late = platform_suspend_late,

.resume_early = platform_resume_early,

.resume = platform_resume, España

};

EXPORT_SYMBOL_GPL (platform_bus_type);


/**

* platform_driver_register

* @drv: estructura controlador plataforma

* /

int platform_driver_register (struct platform_driver * DRV)

{

DRV- > driver.bus = &platform_bus_type;

//función en really_probe Platform_drv_probe función de devolución de llamada

si (DRV- > sonda)

DRV- > driver.probe = platform_drv_probe;

si (DRV- > quitar)

DRV- > driver.remove = platform_drv_remove;

si (DRV- > apagado)

DRV- > driver.shutdown = platform_drv_shutdown;

si (DRV- > suspender)

DRV- > driver.suspend = platform_drv_suspend;

si (DRV- > reanudar)

DRV- > conductor. reanudar = platform_drv_resume;

retorno driver_register (&DRV- > conductor);

}

EXPORT_SYMBOL_GPL (platform_driver_register);


1.3 driver_register () la función

en el fichero drivers /base /driver.c se logran driver_register) función (. En esta función, la inicialización del campo device_driver klist_device estructura struct y descargada a través del campo klist_device, el dispositivo puede guardar la lista conductor soportado por y " completa y " mecanismo de interfaz, la sincronización completa entre los hilos. Cadena y y " completa y " detalles de la interfaz puede hacer referencia a [1]. Volver bus_add_driver () la función de los resultados operativos.


/**

* driver_register - registro conductor del autobús

* @drv: controlador para registrar

*

* Se pasa la mayor parte de la obra a la llamada bus_add_driver (), Francia

* ya que la mayoría de las cosas que tenemos que hacer trato con el bus

* estructuras.

*

* el único aspecto interesante es que la configuración @ DRV- > sin carga

* como una conclusión de que se completa cuando la referencia piloto

* recuento llega a 0.

* /

int driver_register (struct device_driver * drv)

{

if ((DRV- > bus- > sonda &&DRV- > sonda)

Copyright © Conocimiento de Windows All Rights Reserved