Кто вызывает зонд () водителя - PullRequest
35 голосов
/ 28 сентября 2011

Как вызывается probe() call? Кто это называет? Насколько я понимаю, __init() регистрирует driver, а затем как-то probe() вызывается для register данных устройства и irq и т. Д. Как именно это происходит?

Я работаю над драйвером сенсорного экрана, и __init регистрируется на i2c driver. Затем зонд ожидает i2c_clien t данных, которые возвращают ноль Я хочу отслеживать, где он заполняется.

Ответы [ 6 ]

35 голосов
/ 03 октября 2011

Короче говоря: функция probe () драйвера вызывается в результате вызова register_driver для этой конкретной шины.Точнее, это называется probe() этой bus_type структуры.В вашем случае: i2c_bus_type.

Вот цепочка вызовов в вашем случае I2C:

  • i2c_register_driver
  • driver_register
  • bus_add_driver
  • driver_attach
  • __ driver_attach (для вашего устройства)
  • driver_probe_device
  • very_probe
  • i2c_device_probe (это то, что для проверки dev-> bus-> используетсядрайвер i2c)
  • your_probe_function
11 голосов
/ 14 октября 2015

Я подготовил график, который отслеживает функцию датчика привода платформы. Вы работаете с драйвером I2C, который AFAIK является драйвером платформы. Я надеюсь, что это поможет вам отследить проблему.

enter image description here

Кроме того, просмотрите следующую ссылку, чтобы увидеть обсуждение новинок ядра.

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

3 голосов
/ 21 декабря 2016

Давайте рассмотрим пример platform device driver:

  1. Функция запуска запуска для обратного вызова driver->probe() - это макрос module_init(), вызываемый при загрузке драйвера;это macro определено в include/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 & .id_table из driver совпадений в списке устройств платформы, которыеприходит либо из ACPI/DTS, затем вызывается driver_probe_device() с обратным вызовом drv->probe().

2 голосов
/ 03 марта 2015

@ 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

В PCI для ядра-2.4.29 он вызывается при идентификации поставщика и идентификатора устройства. Драйвер шины 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;
}
1 голос
/ 31 марта 2015

Функция пробника будет вызываться для каждого интерфейса обнаруженного устройства, кроме тех, которые уже зарегистрированы.

0 голосов
/ 01 июля 2014

Функция зонда будет вызвана, когда 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),
                 },

Примечание. Когда имя (l3gd20_gyr) из драйвера и устройства будет совпадать, ваш зонд получит вызов.

...