#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-устройствах.