web-dev-qa-db-ja.com

ドライバーのprobe()を呼び出す人

probe()呼び出しはどのように呼び出されますか?誰がそれを呼ぶの?私の理解では、__init()driverを登録し、その後、何らかの形でprobe()registerに呼び出され、デバイスデータとirqなどが呼び出されます。どのように正確に起こりますか?

私はタッチスクリーンドライバーに取り組んでおり、その__initi2c driverに自分自身を登録します。次に、nullを返すi2c_clientデータを期待します。どこでいっぱいになるかを追跡したい。

35
iSegFault

長い話:ドライバーのprobe()関数は、その特定のバスに対して_register_driver_を呼び出した結果として呼び出されます。より正確には、_bus_type_構造体のprobe()によって呼び出されます。あなたの場合:_i2c_bus_type_。

I2Cケースのコールチェーンは次のとおりです。

  • i2c_register_driver
  • driver_register
  • bus_add_driver
  • driver_attach
  • __driver_attach(デバイス用)
  • driver_probe_device
  • really_probe
  • i2c_device_probe(これは、dev-> bus-> probeがi2cドライバー用であるものです)
  • your_probe_function
36
Mircea

プラットフォームドライブのプローブ機能をトレースするグラフを用意しました。 AFAIKがプラットフォームドライバーであるI2Cドライバーを使用しています。これが問題の追跡に役立つことを願っています。

enter image description here

また、次のリンクを見て、kernelnewbiesに関する議論を参照してください。

https://www.mail-archive.com/kernelnewbies%40kernelnewbies.org/msg12423.html

11
Sunil Shahu

platform device driverの例を考えてみましょう。

  1. driver->probe()コールバックの開始トリガー関数は、ドライバーのロード中に呼び出されるmodule_init()マクロです。このmacroinclude/linux/module.hで定義されています。

  2. module_init(my_driver_init)には、my_driver_init()関数へのコールバックがあります。 my_driver_init()関数にはplatform_driver_register(my_driver)への呼び出しが必要です

  3. platform_driver_register(my_driver)は、my_driver -> probe()ハンドルを汎用drv -> probe()に割り当て、driver_register(my_driver)関数を呼び出します。

  4. driver_register(my_driver)関数は、プラットフォームバスにmy_driverを追加し、driver_attach()関数を呼び出します。

  5. 同様に、platform_deviceでもプラットフォームバスにアタッチする必要があります。

  6. 最後に、driver_match_device()が、.nameからのプラットフォームデバイスリストで一致するdriver.id_tableおよびACPI/DTSに基づいて成功を返す場合にのみ、driver_probe_device()を持つdrv->probe()が呼び出されます折り返し電話。

3
Sachin Mokashi

@ iSegFault:probe()が呼び出され、デバイスが存在し、機能が正常であることを確認します。デバイスがホットプラグ可能でない場合、機能はprobe()はinit()メソッド内に配置できます。これにより、ドライバーの実行時のメモリフットプリントが削減されます。 P.S リンク

Probe()は、デバイスのブート時またはデバイスの接続時に発生します。「プラットフォーム」デバイスの場合、プラットフォームデバイスが登録され、そのデバイス名がデバイスドライバーで指定された名前と一致すると、プローブ機能が呼び出されます。 P.S リンク

I2c_detect関数はI2Cアダプターをプローブし、addr_data構造体で指定されたさまざまなアドレスを探します。デバイスが見つかった場合、chip_detect関数が呼び出されます。 P.S リンク

あなたの疑いを確実にクリアする一つのリンク。 P.S リンク

カーネル2.4.29では、プローブがどのように発生するかを示すことができますか?以下を参照してください(ファイル名: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

};

ファイル名: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;
}

いくつかの重要なリンク:

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

Kernel-2.4.29のPCIでは、ベンダーとデバイスIDが識別されると呼び出されます。 PCIバスドライバーがこれを行います。以下のコードをご覧ください:

ファイル名: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;
}
2
Manish

プローブ関数は、すでに登録されているものを除く、検出されたデバイスのすべてのインターフェースに対して呼び出されます。

1
Anubhav Gupta

nameがフォームドライバーの構造をデバイスの構造に一致させると、プローブ関数が呼び出されます。以下に、たとえばドライバーとデバイスの両方の構造について説明します。

1:ドライバー構造

 static struct driver your_driver = {
        .driver = {
              .name = YUR_NAME,

                  },

例えば。

static struct i2c_driver l3Gd20_driver = {
        .driver = {

                        .name = l3Gd20_gyr,

                   }

2:デバイス構造

static structure device  your_devices = {
              .name = YUR_NAME,
              },

例えば。

static struct i2c_board_info mxc_i2c2_board_info[] __initdata = {
                {
                I2C_BOARD_INFO("l3Gd20_gyr", 0x6a),
                 },

注:ドライバーとデバイスからのname(l3Gd20_gyr)が一致すると、プローブが呼び出しを取得します。

0
Deepak Singh