|
Драйверы USB TMC для linux |
|
|
|
Oct 3 2012, 09:52
|
Группа: Участник
Сообщений: 12
Регистрация: 22-08-12
Пользователь №: 73 215

|
Доброго дня всем! Нужно создать драйвер устройства USB TMC (Test and Measurement Class) Gadget, ОС linux (дистрибутив linux-davinci), процессор AM1808 от TI. Есть ли здесь у кого опыт создания устройств usb gadget для linux? Есть вопросы...
|
|
|
|
|
 |
Ответов
|
Oct 9 2012, 06:40
|

Местный
  
Группа: Свой
Сообщений: 216
Регистрация: 15-06-04
Из: Менделеево
Пользователь №: 30

|
QUOTE (_galb_ @ Oct 3 2012, 13:52)  Доброго дня всем! Нужно создать драйвер устройства USB TMC (Test and Measurement Class) Gadget, ОС linux (дистрибутив linux-davinci), процессор AM1808 от TI. Есть ли здесь у кого опыт создания устройств usb gadget для linux? Есть вопросы... Есть опыт написания драйверов usb-storage, usb-video. Там все по аналогии с имеющимся драйвером похожего устройства. делается
|
|
|
|
|
Oct 10 2012, 05:58
|
Группа: Участник
Сообщений: 12
Регистрация: 22-08-12
Пользователь №: 73 215

|
Цитата(gosha @ Oct 9 2012, 12:40)  Есть опыт написания драйверов usb-storage, usb-video. Со стороны хоста, или со стороны гаджета? Мои вопросы состоят примерно в следующем: 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).
|
|
|
|
|
Oct 10 2012, 10:27
|

Местный
  
Группа: Свой
Сообщений: 216
Регистрация: 15-06-04
Из: Менделеево
Пользователь №: 30

|
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/
|
|
|
|
|
Oct 17 2012, 10:11
|
Группа: Участник
Сообщений: 12
Регистрация: 22-08-12
Пользователь №: 73 215

|
Цитата(gosha @ Oct 10 2012, 16:27)  Какая версия ядра? Linux-2.6.37, сборка linux-davinci Цитата(gosha @ Oct 10 2012, 16:27)  При подсоединении устройства, usb_core определяет его bDeviceClass idVendor idProduct , какой драйвер зарегистрировался на это устройство. Дальше пусть этот драйвер сам разбирается с этим устройством. Как раз и интересно, как дальше драйвер разбирается с устройством. Как я вижу, стандартные запросы USB (GET_STATUS, CLEAR_FEATURE, ...) обрабатываются в функции composite_setup (библиотеки composite.c). Пока не понятно, где обрабатываются специфические для класса запросы (например, для TMC запрос GET_CAPABILITY). Ну и мехинизм посылки ответа хосту тоже не до конца понятен... Может, конечно, я туплю, но пока что из всего, что прочитано, как надо сделать до меня не дошло
Сообщение отредактировал _galb_ - Oct 17 2012, 10:12
|
|
|
|
Сообщений в этой теме
_galb_ Драйверы USB TMC для linux Oct 3 2012, 09:52    gosha QUOTE (_galb_ @ Oct 17 2012, 14:11) Linux... Oct 18 2012, 14:32 _galb_ gosha, спасибо Вам за ответ, стало более понятно ... Oct 23 2012, 04:22 _galb_ gosha, ещё вопрос... в своём драйвере Вы использов... Oct 24 2012, 05:07 gosha QUOTE (_galb_ @ Oct 24 2012, 09:07) gosha... Oct 24 2012, 07:18  _galb_ Цитата(gosha @ Oct 24 2012, 13:18) При на... Oct 26 2012, 04:58   gosha QUOTE (_galb_ @ Oct 26 2012, 08:58) и всё... Nov 8 2012, 10:16    _galb_ хорошо, с регистрацией и определением устройства в... Nov 9 2012, 07:44
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|