GNU/Linux >> Znalost Linux >  >> Linux

Proč je v ovladačích zařízení Linux kromě init potřeba metoda sondy?

Init(void) // se spustí jednou při vyvolání ovladače/modulu a nastaví věci pro stroj s ovladačem jádra.

Probe(*pdev) // používá stroj s ovladačem jádra podle potřeby k detekci a instalaci skutečných zařízení


@Bandicoot :bude zavolána probe(), aby se ujistil, že zařízení existuje a funkčnost je v pořádku. Pokud zařízení není připojitelné za provozu, lze funkci probe() vložit do metody init(). Tím se sníží nároky na paměť řidiče za běhu . P.S odkaz

Probe() nastává v době spouštění zařízení nebo když je zařízení připojeno. U „platformového“ zařízení se funkce sondy vyvolá, když je platformové zařízení zaregistrováno a jeho název odpovídá názvu uvedenému v ovladači zařízení. P.S odkaz

Funkce i2c_detect zkoumá adaptér I2C a hledá různé adresy specifikované ve struktuře addr_data. Pokud je zařízení nalezeno, je zavolána funkce chip_detect. P.S odkaz.

Jeden odkaz, který jistě rozptýlí vaše pochybnosti. P.S odkaz

V jádře 2.4.29 vám mohu ukázat, jak probíhá sonda? Viz níže (název souboru: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

};

Název souboru: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;
}

Několik důležitých odkazů:

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-writing-a-I2C-device-driver

V PCI pro kernel-2.4.29 se volá, když je identifikováno id dodavatele a zařízení. Ovladač sběrnice PCI to udělá za vás. Podívejte se prosím níže na kód:

Název souboru: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;
}

Ovladače xxx_init_module() volání funkce pci_register_driver(struct pci_driver *drv) předáním odkazu na strukturu typu pci_driver . struct pci_driver je důležitou strukturou, kterou by měly mít všechny ovladače PCI, která se inicializuje pomocí proměnných, jako je název ovladače, tabulka seznamu zařízení PCI, která může ovladač podporovat, rutiny zpětného volání pro základní subsystém PCI.

Struktura driverů pci_driver má důležitá členská pole uvedená níže:

  1. name – Název ovladače, který je jedinečný mezi všemi ovladači PCI v jádře. Zobrazí se pod /sys/bus/pci/drivers .

  2. pci_device_id – Tabulka identifikačních údajů zařízení obsahuje typy čipů, které tento ovladač podporuje.

  3. probe – Adresa xxx_probe() funkce.

  4. remove/suspend/resume/shutdown – adresa funkce, kterou základní systém PCI volá, když je zařízení PCI odebráno/pozastaveno/obnoveno/vypnuto. Obecně se používá vyššími vrstvami pro správu napájení.

Další informace o tom, jak se sondování ovladače spouští z jádra PCI, najdete v Linux Device Driver Init.


Různé typy zařízení mohou mít funkce probe(). Například PCI a USB zařízení mají obě funkce probe().

Pokud mluvíte o zařízeních PCI, doporučil bych vám přečíst si kapitolu 12 Ovladače zařízení pro Linux, která pokrývá tuto část inicializace ovladačů. USB je popsáno v kapitole 13.

Kratší odpověď, za předpokladu PCI:Funkce init ovladače volá pci_register_driver() což dává jádru seznam zařízení, která může obsluhovat, spolu s ukazatelem na probe() funkce. Jádro poté zavolá probe() ovladače fungovat jednou pro každé zařízení.

Tato funkce sondy spouští inicializaci jednotlivých zařízení:inicializaci hardwaru, alokaci zdrojů a registraci zařízení v jádře jako blokové nebo síťové zařízení nebo co to je.

To usnadňuje ovladačům zařízení, protože nikdy nemusí hledat zařízení nebo se starat o nalezení zařízení, které bylo připojeno za provozu. Jádro se o tuto část postará a upozorní správný ovladač, když bude mít zařízení, se kterým budete pracovat.


Linux
  1. Linux:Jak najít ovladač zařízení používaný pro zařízení?

  2. Jak najít ovladač (modul) spojený se zařízením v Linuxu?

  3. Pochopení ovladačů zařízení pro webovou kameru pro Linux

  1. Jak nainstalovat ovladač zařízení v systému Linux

  2. Linux – Jak linuxové jádro zná hlavní a vedlejší čísla zařízení?

  3. Linux – Jak najít ovladač (modul) spojený se zařízením v Linuxu?

  1. Linux – Proč nemůže jádro spustit inicializaci?

  2. Proč nemohu exportovat zobrazení Linuxu?

  3. Proč drahá sluchátka zní na Linuxu levně – ovladače jsou na hovno?