GNU/Linux >> Belajar Linux >  >> Linux

Mengapa metode probe diperlukan di driver perangkat Linux selain init?

Init(void) // berjalan sekali ketika driver/modul dipanggil dan mengatur segalanya untuk mesin driver kernel.

Probe(*pdev) // digunakan oleh mesin driver kernel sesuai kebutuhan untuk mendeteksi dan menginstal perangkat aktual


@Bandicoot :probe() akan dipanggil untuk memastikan bahwa perangkat ada dan fungsionalitasnya baik-baik saja. Jika perangkat tidak hot-pluggable, fungsionalitas probe() dapat diletakkan di dalam metode init(). Ini akan mengurangi jejak memori run time driver . Tautan P.S

Probe() terjadi pada saat booting perangkat atau saat perangkat tersambung. Untuk perangkat "platform", fungsi pemeriksaan dipanggil saat perangkat platform didaftarkan dan nama perangkatnya cocok dengan nama yang ditentukan pada driver perangkat. Tautan P.S

Fungsi i2c_detect menyelidiki adaptor I2C, mencari alamat berbeda yang ditentukan dalam struktur addr_data. Jika perangkat ditemukan, fungsi chip_detect kemudian dipanggil. Tautan P.S.

Satu tautan yang pasti akan menghilangkan keraguan Anda. Tautan P.S

Di kernel 2.4.29, saya dapat menunjukkan kepada Anda bagaimana penyelidikan terjadi? Silakan lihat di bawah (Nama file: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

};

Nama File: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;
}

Beberapa tautan penting:

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

Di PCI untuk kernel-2.4.29, itu dipanggil ketika vendor dan id perangkat diidentifikasi. Sopir bus PCI melakukan ini untuk Anda. Silakan lihat kode di bawah ini:

Nama File: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;
}

Driver xxx_init_module() fungsi memanggil pci_register_driver(struct pci_driver *drv) dengan meneruskan referensi ke struktur bertipe pci_driver . struct pci_driver adalah struktur penting yang harus dimiliki semua driver PCI, yang diinisialisasi dengan variabel seperti nama driver, daftar tabel perangkat PCI yang dapat didukung driver, rutinitas callback untuk subsistem inti PCI.

Struktur driver pci_driver memiliki bidang anggota penting yang tercantum di bawah ini:

  1. name – Beri nama driver yang unik di antara semua driver PCI di kernel. Ini akan muncul di bawah /sys/bus/pci/drivers .

  2. pci_device_id – Tabel data identifikasi perangkat terdiri dari jenis chip yang didukung driver ini.

  3. probe – Alamat xxx_probe() fungsi.

  4. remove/suspend/resume/shutdown – alamat ke fungsi yang dipanggil oleh sistem inti PCI saat perangkat PCI dilepas/ditangguhkan/dilanjutkan/dimatikan. Umumnya digunakan oleh lapisan atas untuk manajemen daya.

Untuk informasi lebih lanjut tentang bagaimana pemeriksaan driver dijalankan dari inti PCI, lihat Linux Device Driver Init.


Jenis perangkat yang berbeda dapat memiliki fungsi probe(). Misalnya, perangkat PCI dan USB keduanya memiliki fungsi probe().

Jika Anda berbicara tentang perangkat PCI, saya sarankan Anda membaca bab 12 dari Driver Perangkat Linux, yang mencakup bagian inisialisasi driver ini. USB tercakup dalam bab 13.

Jawaban yang lebih singkat, dengan asumsi PCI:Fungsi init driver memanggil pci_register_driver() yang memberi kernel daftar perangkat yang dapat diservis, bersama dengan penunjuk ke probe() fungsi. Kernel kemudian memanggil probe() driver berfungsi sekali untuk setiap perangkat.

Fungsi penyelidikan ini memulai inisialisasi per perangkat:menginisialisasi perangkat keras, mengalokasikan sumber daya, dan mendaftarkan perangkat dengan kernel sebagai blok atau perangkat jaringan atau apa pun itu.

Itu memudahkan driver perangkat, karena mereka tidak perlu mencari perangkat atau khawatir menemukan perangkat yang terhubung dengan panas. Kernel menangani bagian itu dan memberi tahu driver yang tepat ketika memiliki perangkat untuk Anda tangani.


Linux
  1. Cara menginstal driver perangkat di Linux

  2. Mengapa kita membutuhkan bootloader di perangkat tertanam?

  3. Apa perbedaan antara driver platform Linux dan driver perangkat biasa?

  1. Pengandar perangkat IOCTL Linux

  2. Bagaimana menemukan driver (modul) yang terkait dengan perangkat di Linux?

  3. Memahami driver perangkat Linux webcam

  1. Linux:Bagaimana Menemukan Driver Perangkat yang Digunakan Untuk Perangkat?

  2. Linux – Bagaimana Kernel Linux Mengetahui Nomor Mayor dan Minor Perangkat?

  3. Linux – Bagaimana Cara Menemukan Driver (modul) yang Berhubungan Dengan Perangkat Di Linux?