GNU/Linux >> Tutoriales Linux >  >> Linux

¿Por qué se necesita el método de sondeo en los controladores de dispositivos de Linux además de init?

Init(void) // se ejecuta una vez cuando se invoca el controlador/módulo y configura las cosas para la máquina del controlador del kernel.

Probe(*pdev) // es utilizado por la máquina del controlador del kernel según sea necesario para detectar e instalar dispositivos reales


@Bandicoot :se llamará a probe() para asegurarse de que el dispositivo existe y la funcionalidad está bien. Si el dispositivo no se puede conectar en caliente, la funcionalidad de probe() se puede colocar dentro del método init(). Esto reducirá la huella de memoria del tiempo de ejecución del controlador . PD enlace

La sonda () ocurre en el momento del arranque del dispositivo o cuando el dispositivo está conectado. Para un dispositivo de "plataforma", la función de sonda se invoca cuando se registra un dispositivo de plataforma y su nombre de dispositivo coincide con el nombre especificado en el controlador del dispositivo. PD enlace

La función i2c_detect sondea el adaptador I2C, buscando las diferentes direcciones especificadas en la estructura addr_data. Si se encuentra un dispositivo, se llama a la función chip_detect. P.S enlace.

Un enlace que seguro despejará tu duda. PD enlace

En el kernel 2.4.29, puedo mostrarles cómo funciona la sonda. Consulte a continuación (Nombre del archivo:drivers/acorn/char/pcf8583.c )

static struct i2c_driver pcf8583_driver = {
name:       "PCF8583",
id:     I2C_DRIVERID_PCF8583,
flags:      I2C_DF_NOTIFY,
attach_adapter: pcf8583_probe, /* This will be called from i2c-core.c P.S see below function i2c_add_driver()*/
detach_client:  pcf8583_detach,
command:    pcf8583_command

};

Nombre del archivo:drivers/i2c/i2c-core.c

int i2c_add_driver(struct i2c_driver *driver)
{
    ........................
    ........................

    /* now look for instances of driver on our adapters
     */
    if (driver->flags& (I2C_DF_NOTIFY|I2C_DF_DUMMY)) {
        for (i=0;i<I2C_ADAP_MAX;i++)
            if (adapters[i]!=NULL)
                /* Ignore errors */
                driver->attach_adapter(adapters[i]); /*This is a location from where probe is called. Pointer **driver** is of type **pcf8583_driver** which you have passed into this function*/
    }
    ADAP_UNLOCK();
    return 0;
}

Algunos enlaces importantes:

1) http://www.slideshare.net/varunmahajan06/i2c-subsystem-in-linux2624

2) http://www.programering.com/a/MjNwcTMwATM.html

3) http://www.linuxjournal.com/article/6717

4) http://www.developermemo.com/2943157/

5) http://free-electrons.com/doc/kernel-architecture.pdf

6) http://www.techques.com/question/1-3014627/Probe-problem-when-write-a-I2C-device-driver

En PCI para kernel-2.4.29, se llama cuando se identifican el proveedor y la identificación del dispositivo. El controlador de bus PCI hace esto por usted. Consulte el siguiente código:

Nombre del archivo:drivers/pci/pci.c

static int pci_announce_device(struct pci_driver *drv, struct pci_dev *dev)
{
   const struct pci_device_id *id;
   int ret = 0;
   if (drv->id_table) {
    id = pci_match_device(drv->id_table, dev); /* check for device presence*/
    if (!id) {
     ret = 0;
     goto out;
    }
   } else
  id = NULL;
  dev_probe_lock();
  if (drv->probe(dev, id) >= 0) { /* This is a location from where probe is called*/
   dev->driver = drv;
   ret = 1;
   }
   dev_probe_unlock();
  out:
  return ret;
}

Los conductores xxx_init_module() llamadas a funciones pci_register_driver(struct pci_driver *drv) pasando la referencia a la estructura de tipo pci_driver . struct pci_driver es una estructura importante que deben tener todos los controladores PCI, que se inicializa con variables como el nombre del controlador, la lista de tablas de dispositivos PCI que el controlador puede admitir, las rutinas de devolución de llamada para el subsistema principal PCI.

La estructura de controladores pci_driver tiene campos de miembros importantes que se enumeran a continuación:

  1. name – Nombre del controlador que es único entre todos los controladores PCI del núcleo. Aparecerá debajo de /sys/bus/pci/drivers .

  2. pci_device_id – Una tabla de datos de identificación del dispositivo consta del tipo de chips que admite este controlador.

  3. probe – La dirección de xxx_probe() función.

  4. remove/suspend/resume/shutdown – dirección a la función que llama el sistema central PCI cuando el dispositivo PCI se retira/suspende/reanudó/apaga respectivamente. Generalmente utilizado por las capas superiores para la administración de energía.

Para obtener más información sobre cómo se ejecuta el sondeo del controlador desde el núcleo PCI, consulte Linux Device Driver Init.


Diferentes tipos de dispositivos pueden tener funciones probe(). Por ejemplo, los dispositivos PCI y USB tienen funciones probe().

Si está hablando de dispositivos PCI, le recomendaría que lea el capítulo 12 de Controladores de dispositivos Linux, que cubre esta parte de la inicialización del controlador. USB se trata en el capítulo 13.

Respuesta más corta, asumiendo PCI:la función de inicio del controlador llama a pci_register_driver() lo que le da al kernel una lista de dispositivos a los que puede dar servicio, junto con un puntero al probe() función. Luego, el núcleo llama al probe() del controlador. función una vez para cada dispositivo.

Esta función de sondeo inicia la inicialización por dispositivo:inicializando el hardware, asignando recursos y registrando el dispositivo con el núcleo como un bloque o dispositivo de red o lo que sea.

Eso hace que sea más fácil para los controladores de dispositivos, porque nunca necesitan buscar dispositivos ni preocuparse por encontrar un dispositivo conectado en caliente. El kernel maneja esa parte y notifica al controlador correcto cuando tiene un dispositivo para que usted lo maneje.


Linux
  1. Linux:¿Cómo encontrar el controlador de dispositivo utilizado para un dispositivo?

  2. Linux:¿cómo sabe el kernel de Linux los números mayores y menores de los dispositivos?

  3. Linux:¿cómo encontrar el controlador (módulo) asociado con un dispositivo en Linux?

  4. ¿Por qué no puedo exportar la pantalla de Linux?

  5. ¿Cuál es la diferencia entre un controlador de plataforma Linux y un controlador de dispositivo normal?

Cómo instalar los drivers de NVIDIA en Ubuntu 19.04 Disco Dingo Linux

Cómo instalar los controladores NVIDIA en Ubuntu 19.10 Eoan Ermine Linux

Cómo instalar los controladores de NVIDIA en Ubuntu 20.10 Groovy Gorilla Linux

Cómo instalar los drivers de NVIDIA en Ubuntu 20.04 Focal Fossa Linux

Cómo instalar los últimos controladores de Nvidia en Linux Mint 16 Petra

¿Por qué el video tearing es un problema tan grande en Linux?