QUOTE (_galb_ @ Oct 10 2012, 09:58)

Со стороны хоста, или со стороны гаджета?
Мои вопросы состоят примерно в следующем:
1) В папке drivers/usb/gadget во всех драйверах используются функции библиотеки composite.c. Например, драйвер регистрируется с помощью функции usb_composite_probe, которая в свою очередь вызывает usb_gadget_probe_driver, описанную в include/linux/usb/gadget.h. А реализация этой функции, похоже, у каждого драйвера своя. Например, для драйвера zero.c её нет в явном виде, и мне не понятно, в каком направлении дальше идёт регистрация драйвера Gadget Zero в системе...
2) Если продолжить рассматривать драйвер zero.c, то там явно описывается только дескриптор устройства ( в структуре zero_driver = { <...>, .dev = &device_desc, <...> } ). Остальные дескрипторы (Configuration Descriptor, Interface Descriptor), похоже, инициализируются где-то через функции composite.c. Мне не понятно, как их (дескрипторы) задавать (например, для USB TMC устройств мне нужно прописать bInterfaceClass = 0xFE, bInterfaceSubClass = 3, bInterfaceProtocol = 1).
Со стороны хоста.
Какая версия ядра?
Драйвер при загрузке insmod в сообщает таблицу usb дескрипторов, при подключении каких usb idVendor idProduct и пр необходимо запустить его ф-ю по-пробовать и поднять драйвер.
При подсоединении устройства, usb_core определяет его bDeviceClass idVendor idProduct , какой драйвер зарегистрировался на это устройство.
Дальше пусть этот драйвер сам разбирается с этим устройством.
usb_core запускает ф-ю probe() драйвера, который зарегистрировался на этот тип usb устройств.
Эта ф-я проверяет устройство и поднимает его интерфейсы.
Напр, если это eth драйвер, в системе регистрируется напр eth2.
В данном случае, это ф-я bind()
При извлечении usb устройства, интерфейс unregister: eth_unbind().
CODE
static struct usb_device_descriptor [u]device_desc[/u] = {
.bDescriptorType = USB_DT_DEVICE,
.bcdUSB = cpu_to_le16 (0x0200),
.bDeviceClass = USB_CLASS_COMM,
.bDeviceSubClass = 0,
.bDeviceProtocol = 0,
.idVendor = cpu_to_le16 (CDC_VENDOR_NUM),
.idProduct = cpu_to_le16 (CDC_PRODUCT_NUM),
}
static int __ref eth_bind(struct usb_composite_dev *cdev)
{...}
static struct usb_composite_driver eth_driver = {
.[b]dev[/b] = &[u]device_desc[/u],
.strings = dev_strings,
.[b]bind[/b] = [b]eth_bind[/b],
.[b]unbind[/b] = __exit_p([b]eth_unbind[/b]),
};
http://lwn.net/Articles/395712/