реклама на сайте
подробности

 
 
> Драйверы USB TMC для linux
_galb_
сообщение Oct 3 2012, 09:52
Сообщение #1





Группа: Участник
Сообщений: 12
Регистрация: 22-08-12
Пользователь №: 73 215



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

Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
gosha
сообщение Oct 9 2012, 06:40
Сообщение #2


Местный
***

Группа: Свой
Сообщений: 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.
Там все по аналогии с имеющимся драйвером похожего устройства. делается
Go to the top of the page
 
+Quote Post
_galb_
сообщение Oct 10 2012, 05:58
Сообщение #3





Группа: Участник
Сообщений: 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).
Go to the top of the page
 
+Quote Post
gosha
сообщение Oct 10 2012, 10:27
Сообщение #4


Местный
***

Группа: Свой
Сообщений: 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/
Go to the top of the page
 
+Quote Post



Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 24th July 2025 - 15:16
Рейтинг@Mail.ru


Страница сгенерированна за 0.01412 секунд с 7
ELECTRONIX ©2004-2016