вызов функции сопоставления универсального драйвера usb-устройства

#c #linux-kernel #usb #linux-device-driver

#c #linux-ядро #usb #linux-драйвер устройства

Вопрос:

Я просматривал generic.c, связанный с подсистемой USB в ядре Linux. Драйвер usb-устройства (usb_generic_driver) был зарегистрирован usb core (usb_init).

Структура usb_device_driver имеет элемент id_table(struct usb_device_id *id_table), но я не нашел в источнике, где эта id_table была заполнена и назначена в структуре usb_generic_driver.

 struct usb_device_driver {
   const char *name;

   bool (*match) (struct usb_device *udev);
   int (*probe) (struct usb_device *udev);
   void (*disconnect) (struct usb_device *udev);

   int (*suspend) (struct usb_device *udev, pm_message_t message);
   int (*resume) (struct usb_device *udev, pm_message_t message);
   const struct attribute_group **dev_groups;
   struct usbdrv_wrap drvwrap;
   const struct usb_device_id *id_table;
   unsigned int supports_autosuspend:1;
   unsigned int generic_subclass:1;
};
  

Если для универсального драйвера нет «id_table», то как вызывается функция сопоставления (usb_generic_driver_match). Если id_table определен для универсального драйвера, можете ли вы помочь мне найти id_table для драйвера.

Ответ №1:

И я не понимаю ваших сомнений. Универсальный драйвер USB по определению является универсальным. Это означает, что если драйвер не найден путем реального сопоставления (с таблицами идентификаторов в отдельных драйверах), он будет использоваться.

Сопоставление устройств сначала происходит на уровне шины. Который покрывается usb_device_match() вызовом, который сначала проверяет, является ли это устройством или интерфейсом, а затем пытается сопоставить по таблице идентификаторов, если таковая имеется. Поскольку для универсального драйвера у него нет таблицы соответствия, но есть определенный ->match() обратный вызов, который вызывается в качестве последнего средства.

Комментарии:

1. Спасибо за ответ. Теперь из вашего объяснения я понял, что функция сопоставления универсального драйвера (usb_generic_driver_match) будет вызываться, когда не найден соответствующий драйвер id_table. Но в функции сопоставления универсального драйвера (usb_generic_driver_match) снова вызывается функция итератора драйвера (bus_for_each_drv) и выполняется сопоставление для других драйверов. Я думаю, что уже то же самое было сделано в функции usb_device_match перед вызовом функции сопоставления общих драйверов.

2. USB — это шина с возможностью подключения с возможностью подключения, и возможны многие сценарии. Вот почему ему необходимо часто повторно сопоставлять изменения (кстати, идентификаторы устройств могут быть изменены даже без физического отсоединения устройства).

3. из-за таких сценариев, как изменение функциональности во время выполнения в составных USB-устройствах.