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

 
 
> Linux: работа с USB HID устройством - чтение Input Report (Interrupr In EP)., Под Win всё работает, а в Linux надо настраивать? Или нужен HID драйве
galjoen
сообщение Apr 8 2008, 18:12
Сообщение #1


Знающий
****

Группа: Свой
Сообщений: 841
Регистрация: 10-05-07
Из: Чебоксары (Россия)
Пользователь №: 27 640



Подключаю свой самодельный Full Speed HID к Linux. У него имеются 3 вида репортов SetFeature, GetFeature и Input. SetFeature и GetFeature через шлются контрольный канал (адрес EP = 0) и работают без проблем. Даже лучше чем под Win т.к. позволяют задавать таймаут, а под Win таймаут =5 секундам и изменить невозможно. Input Report шлётся от устройства в комп через EP, работающую в режиме Interrupt In с интервалом опроса 2 милисекунды (так у меня в дескрипторе EP). И с ним проблемма.
В Win всё корректно - после подключения моего устройства хост как и положено шлёт запросы 1 раз за 2 кадра (2 милисекунды). Причём даже если никто это устройство не использует. И буферизирует посланные мной Input репорты. Причём кол-во буферов можно задавать.
Linux по своей инициативе вообще не шлёт никаких запросов. Если подключиться к устройству, то можно слать запросы (ReadFile). Но ни о каких 2 милисекундах и речи нет. Выполняешь ReadFile - запрос посылается. И буферизации никакой нет. Из-за этого Input репорты теряются. Особенно почему-то при выводе на экран. Т.е. какое-то время не опрашивали Interrupt In EP (переключились на другую задачу) - буфер в устройстве переполняется - данные теряются.
Выходов из этой ситуации 2.
Первый (лучший): сказать Linux чтоб он опрашивал Interrupt In EP (как и написано в её дескрипторе) и буферизировал прочитанные данные (как Win). Но как это сделать я не знаю (невозможно?).
Второй (вынужденный): повесить на таймер программку, которая будет запускаться 1 раз в 2 милисекунды (реал тайм!). И будет читать Interrupt In EP (ReadFile) и буферизировать прочитанное. Как это сделать я тоже не знаю, но наверное смогу разобраться.

А может ещё какие способы имеются?
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
amw
сообщение Apr 9 2008, 08:13
Сообщение #2


Знающий
****

Группа: Свой
Сообщений: 601
Регистрация: 22-09-05
Из: Kharkov
Пользователь №: 8 847



Цитата(galjoen @ Apr 8 2008, 21:12) *
Первый (лучший): сказать Linux чтоб он опрашивал Interrupt In EP (как и написано в её дескрипторе) и буферизировал прочитанные данные (как Win). Но как это сделать я не знаю (невозможно?).
Второй (вынужденный): повесить на таймер программку, которая будет запускаться 1 раз в 2 милисекунды (реал тайм!). И будет читать Interrupt In EP (ReadFile) и буферизировать прочитанное. Как это сделать я тоже не знаю, но наверное смогу разобраться.

А может ещё какие способы имеются?

При втыкании устройства Вы получаетет в логах сообщение типа
Код
Apr  9 11:02:16 fox kernel: HID device claimed by neither input, hiddev nor hidraw

Если ни один драйвер не "зацепился" за Ваше устройство, то Linux переведет его в Suspend и забудет о его существовании до тех пор, пока кто нибудь не зацепится за него.
Это может быть как драйвер, так и userspace программа, например через libusb usb_clame_interface.
Вероятно Ваше устройство не соответствует ни одному из драйверов. Драйверы как правило выполняют clame_interface если устройство получается "законченным", например клавиатура или мышь. А Ваше устройство не поддерживает всех ожидаемых драйвером запросов и репортов.
Третий вариант - посмотрите на кой из драйверов наиболее вероятно "зацепить" Ваше устройство (см. hiddev) и либо прописать ему Ваш VID/PID либо передать Ваш VID/PID при загрузке драйвера через modprobe.


--------------------
- А мораль отсюда такова: всякому овощу свое время. Или, хочешь, я это сформулирую попроще: никогда не думай, что ты иная, чем могла бы быть иначе, чем будучи иной в тех случаях, когда иначе нельзя не быть.
© Lewis Carroll. Alice's adventures in wonderland.
Go to the top of the page
 
+Quote Post
galjoen
сообщение Apr 11 2008, 15:37
Сообщение #3


Знающий
****

Группа: Свой
Сообщений: 841
Регистрация: 10-05-07
Из: Чебоксары (Россия)
Пользователь №: 27 640



Цитата(amw @ Apr 9 2008, 12:13) *
Вероятно Ваше устройство не соответствует ни одному из драйверов. Драйверы как правило выполняют clame_interface если устройство получается "законченным", например клавиатура или мышь. А Ваше устройство не поддерживает всех ожидаемых драйвером запросов и репортов.

Да, не поддерживает. У Linux на уровне ядра, как я понял, из HID устройств поддерживаются только
Код
47 static char *hid_types[] = {"Device", "Pointer", "Mouse", "Device", "Joystick",
48                                 "Gamepad", "Keyboard", "Keypad", "Multi-Axis Controller"};

И больше вариантов вроде как и нет. Т.е. они взяли Generic Desktop Page (0x01) и из неё 8 первых устройств:
Код
00 Undefined
01 Pointer CP 4.1
02 Mouse CA 4.1
03 Reserved
04 Joystick CA 4.1
05 Game Pad CA 4.1
06 Keyboard CA 4.1
07 Keypad CA 4.1
08 Multi-axis Controller CA 4.1

Попробую я чем нибудь из этого списка заделаться, но не уверен, что получится. Сейчас у меня: FF00-FFFF Vendor-defined Usage Page.

2 XVR - А где вы буферизацию input репортов в hiddev нашли? Я что-то не нашёл.
Цитата(amw @ Apr 9 2008, 12:13) *
Третий вариант - посмотрите на кой из драйверов наиболее вероятно "зацепить" Ваше устройство (см. hiddev) и либо прописать ему Ваш VID/PID либо передать Ваш VID/PID при загрузке драйвера через modprobe.

У моего устройства VID=PID=0 и под Win драйвер для него грузится по коду класса (3=HID) в дескрипторе интерфейса. Кроме того моё устройство должно работать при втыкании в любой компьютер без к.л. настроек, чтоб его мог запустить любой чайник. Оно составное и помимо HID содержит в себе ещё Mass Storage. И вот с этого Mass Stogage программа-то и должна запускаться. Причём на каком компьютере я не знаю и соотв-нно настраивать там ничего нельзя. Под Win всё проходит на ура. А сейчас Linux стал распостранятся, вот я и под Linux версию решил сделать. И под Linux работало до тех пор пока я Input Report (через Interrupt In EP) не ввёл. Хотя под Linux приходится задавать права доступа в файле udev.rules, что не есть гуд.
А вот, что пишется в dmesg:
Код
usb 2-1: new full speed USB device using uhci_hcd and address 7
usb 2-1: device descriptor read/all, error -71
usb 2-1: new full speed USB device using uhci_hcd and address 9
usb 2-1: device not accepting address 9, error -32
usb 2-1: new full speed USB device using uhci_hcd and address 10
usb 2-1: configuration #1 chosen from 1 choice
scsi7 : SCSI emulation for USB Mass Storage devices
usb-storage: device found at 10
usb-storage: waiting for device to settle before scanning
drivers/usb/input/hid-core.c: ctrl urb status -75 received
drivers/usb/input/hid-core.c: ctrl urb status -75 received
HID device not claimed by input or hiddev
  Vendor: Dinas     Model: Build-in F-Disk   Rev: 1.00
    Type:   Direct-Access                      ANSI SCSI revision: 00
    SCSI device sdh: 8192 1024-byte hdwr sectors (8 MB)
    sdh: Write Protect is on
    sdh: Mode Sense: 23 00 80 00
    sdh: assuming drive cache: write through
    SCSI device sdh: 8192 1024-byte hdwr sectors (8 MB)
    sdh: Write Protect is on
    sdh: Mode Sense: 23 00 80 00
    sdh: assuming drive cache: write through
     sdh: unknown partition table
     sd 7:0:0:0: Attached scsi removable disk sdh
     usb-storage: device scan complete

Ошибки в начале - это когда я STALL посылаю в ответ на запросы GetFeaure репортов. Некоторые из репортов у меня только для записи, а Linux прочесть пытается. Зачем? Для кэширования что-ли?

Думаю, что так и придётся по таймеру чтение Input репортов делать. Вроде никаких граблей там не предвидится. Или я сильно заблуждаюсь?
Go to the top of the page
 
+Quote Post
amw
сообщение Apr 11 2008, 19:26
Сообщение #4


Знающий
****

Группа: Свой
Сообщений: 601
Регистрация: 22-09-05
Из: Kharkov
Пользователь №: 8 847



Цитата(galjoen @ Apr 11 2008, 18:37) *
Да, не поддерживает. У Linux на уровне ядра, как я понял, из HID устройств поддерживаются только
Код
47 static char *hid_types[] = {"Device", "Pointer", "Mouse", "Device", "Joystick",
48                                 "Gamepad", "Keyboard", "Keypad", "Multi-Axis Controller"};

Да. Правильно поняли.
Но!
Если Вы не хотите делать полный поддерживаемый девайс - не делайте.
Об этом чуть ниже.
Цитата
У моего устройства VID=PID=0 и под Win драйвер для него грузится по коду класса (3=HID) в дескрипторе интерфейса.

Ну это не есть хорошо. Фактически Вы используете глюк в ОС. Известный глюк и им многие ползуются и, видимо, это будет продолжаться долго, потому как сама Windows этим глюком ползуется.
Цитата
А вот, что пишется в dmesg:
Код
usb 2-1: new full speed USB device using uhci_hcd and address 7
usb 2-1: device descriptor read/all, error -71
usb 2-1: new full speed USB device using uhci_hcd and address 9
usb 2-1: device not accepting address 9, error -32
usb 2-1: new full speed USB device using uhci_hcd and address 10

Ошибки в начале - это когда я STALL посылаю в ответ на запросы GetFeaure репортов. Некоторые из репортов у меня только для записи, а Linux прочесть пытается. Зачем? Для кэширования что-ли?

Это плохо. Это не похоже на то о чем Вы говорите. Хотя я не работал с "репортами только для чтения".
Это точно сами репорты? Или это попытка прочитать ReportDescriptor? Дескриптор то должен читаться.
Цитата
Думаю, что так и придётся по таймеру чтение Input репортов делать. Вроде никаких граблей там не предвидится. Или я сильно заблуждаюсь?

Я не проверял на постоянность опроса нестандартного USB HID но такое устройство делал.
Попробуйте вот что.
Возмите libusb, она есть во всех дистрах Linux. Там есть пример. Попробуйте просто открыть Ваш USB HID и посмотреть, идет ли опрос с нужным интервалом, если Вы не запрашиваетет из программы его.
То есть просто открыть и все. Не читать и не писать.
Если идут - дальше уже решайте сами. Если нет, ну тоже решайте сами, но я бы порекомендовал написать драйвер. Возмите пример и модифицируйте его. Пример лежит прямо в дереве исходников ядра. drivers/usb/usb-skeleton.c. Но не пытайтесь повторить один из HID драйверов, а делайте как Вам надо.

Да еще вот что. В Lnux RootHUB можно открыть с помощью libusb по VID/PID = 0. Так что Вы пока поменяйте VID/PID на что нибудь отличное от нуля и 0xFFFF. И проверте опрос.

А в Windows устройство опрашивается всегда, не зависимо от того, есть ли штатный драйвер именно этого устройства или нет.
В Linux если нет драйвера - то об устройстве ОС "забывает до востребования", то есть пока кто нибудь не откроет это устройство.

Сообщение отредактировал amw - Apr 11 2008, 19:29


--------------------
- А мораль отсюда такова: всякому овощу свое время. Или, хочешь, я это сформулирую попроще: никогда не думай, что ты иная, чем могла бы быть иначе, чем будучи иной в тех случаях, когда иначе нельзя не быть.
© Lewis Carroll. Alice's adventures in wonderland.
Go to the top of the page
 
+Quote Post

Сообщений в этой теме
- galjoen   Linux: работа с USB HID устройством - чтение Input Report (Interrupr In EP).   Apr 8 2008, 18:12
|- - XVR   Цитата(galjoen @ Apr 11 2008, 19:37) 2 XV...   Apr 11 2008, 17:18
|- - galjoen   Цитата(amw @ Apr 11 2008, 23:26) Это плох...   Apr 12 2008, 13:46
|- - amw   Цитата(galjoen @ Apr 12 2008, 16:46) А Fe...   Apr 12 2008, 15:07
||- - galjoen   Цитата(amw @ Apr 12 2008, 19:07) А понял,...   Apr 14 2008, 20:40
||- - amw   Цитата(galjoen @ Apr 14 2008, 23:40) Кодd...   Apr 15 2008, 08:48
||- - galjoen   Цитата(amw @ Apr 15 2008, 12:48) Устройст...   Apr 15 2008, 09:56
||- - amw   Цитата(galjoen @ Apr 15 2008, 12:56) Разб...   Apr 15 2008, 10:14
||- - galjoen   Цитата(amw @ Apr 15 2008, 12:48) Вот снял...   Apr 17 2008, 10:22
||- - amw   Цитата(galjoen @ Apr 17 2008, 13:22) Это ...   Apr 17 2008, 16:48
||- - galjoen   Цитата(amw @ Apr 17 2008, 20:48) Мммм...э...   Apr 17 2008, 17:55
||- - amw   Цитата(galjoen @ Apr 17 2008, 20:55) Може...   Apr 18 2008, 07:40
||- - galjoen   Разработчики модуля USB для Linux прислали ответ. ...   Apr 22 2008, 14:46
||- - amw   Цитата(galjoen @ Apr 22 2008, 17:46) Разр...   Apr 22 2008, 15:17
||- - galjoen   Цитата(amw @ Apr 22 2008, 19:17) Теперь В...   Apr 25 2008, 15:42
||- - amw   Цитата(galjoen @ Apr 25 2008, 18:42) Да к...   Apr 25 2008, 18:56
||- - galjoen   Цитата(amw @ Apr 25 2008, 22:56) Ну и lin...   May 6 2008, 09:28
||- - amw   Цитата(galjoen @ May 6 2008, 12:28) Спаси...   May 6 2008, 12:09
||- - galjoen   Цитата(amw @ May 6 2008, 16:09) Гляньте е...   May 7 2008, 15:45
||- - amw   Цитата(galjoen @ May 7 2008, 18:45) Прове...   May 8 2008, 09:45
||- - galjoen   После годового перерыва вернулся к этой теме. Наде...   Apr 22 2009, 14:10
|- - path_finder   Цитата(galjoen @ Apr 12 2008, 15:46) Насч...   Apr 15 2008, 13:35
|- - galjoen   Цитата(path_finder @ Apr 15 2008, 17:35) ...   Apr 15 2008, 13:53
- - XVR   Цитата(galjoen @ Apr 8 2008, 22:12) Подкл...   Apr 9 2008, 08:14
- - amw   linux-2.6.28.1/drivers/hid/Kconfig ЦитатаSay Y her...   Apr 22 2009, 21:04
- - galjoen   Цитата(amw @ Apr 23 2009, 01:04) Три вари...   May 1 2009, 10:47
- - galjoen   Вобщем-то под Linux мой HID работает на том-же уро...   May 16 2009, 13:14
- - galjoen   Выявил ещё один глюк в многострадальном hidraw. В ...   Aug 19 2009, 11:54


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

 


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


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