|
Linux: работа с USB HID устройством - чтение Input Report (Interrupr In EP)., Под Win всё работает, а в Linux надо настраивать? Или нужен HID драйве |
|
|
|
 |
Ответов
|
Apr 9 2008, 08:13
|
Знающий
   
Группа: Свой
Сообщений: 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.
|
|
|
|
|
Apr 11 2008, 15:37
|
Знающий
   
Группа: Свой
Сообщений: 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 репортов делать. Вроде никаких граблей там не предвидится. Или я сильно заблуждаюсь?
|
|
|
|
|
Apr 11 2008, 19:26
|
Знающий
   
Группа: Свой
Сообщений: 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.
|
|
|
|
|
Apr 12 2008, 13:46
|
Знающий
   
Группа: Свой
Сообщений: 841
Регистрация: 10-05-07
Из: Чебоксары (Россия)
Пользователь №: 27 640

|
Цитата(amw @ Apr 11 2008, 23:26)  Это плохо. Это не похоже на то о чем Вы говорите. Хотя я не работал с "репортами только для чтения". Это точно сами репорты? Или это попытка прочитать ReportDescriptor? Дескриптор то должен читаться. ReportDescriptor (USAGE) точно читается правильно. Во первых, никаких посылок STALL, повторов и т.п. нет. Во вторых, под Win всё работает, а Win не даст пользоваться Set(Get)Feature репортом если он в USAGE неправильно описан и, скорее всего, всем устройством не даст пользоваться (жёлтый вопросительный знак поставит в диспетчере устройств). В третьих, Linux последовательно читает все мой Feature репорты, причём сразу-же с правильной длиной в пакете запроса (SETUP). А эту длину он мог узнать только из моих ReportDescriptor (USAGE). Откуда же ещё? А Feature репорты можно описать как "только для чтения", но как "только для записи" невозможно. Я сделал так, как мне удобно было, поэтому некоторые только GetFeature, некоторые Get и Set, а некоторые только Set у меня получились. Я-то считал, что никто кроме меня этим пользоваться не будет. И если приходит запрос (SETUP пакет) на чтение (GetFeature) такого репорта (который у меня только для записи) я STALL возвращаю. Не на SETUP пакет конечно, а на маркер IN. В логах (под Linux) это отлично видно. Попробую конечно какую-нибудь ерунду в данных вернуть, но не думаю, что от этого что-то изменится. Цитата(amw @ Apr 11 2008, 23:26)  Я не проверял на постоянность опроса нестандартного USB HID но такое устройство делал. Попробуйте вот что. Возмите libusb, она есть во всех дистрах Linux. Там есть пример. Попробуйте просто открыть Ваш USB HID и посмотреть, идет ли опрос с нужным интервалом, если Вы не запрашиваетет из программы его. То есть просто открыть и все. Не читать и не писать. Если идут - дальше уже решайте сами. Если нет, ну тоже решайте сами, но я бы порекомендовал написать драйвер. Возмите пример и модифицируйте его. Пример лежит прямо в дереве исходников ядра. drivers/usb/usb-skeleton.c. Но не пытайтесь повторить один из HID драйверов, а делайте как Вам надо. Обязательно попробую, и о результатах сообщу, но попозже. Т.к. вариант с драйвером не устроит заказчиков. Им надо чтоб любой чайник без специалистов (секретарша, которая кроме ворда ничего не знает) мог бы наше устойство в свой комп воткнуть, мышкой на экзешник нажать, и логи прочесть. А драйвер устанавливать это слишком сложно и долго. Они боятся нашего устройства будут. Хотя если у них Linux стоит... Насчёт VID=PID=0. Ну не хочу я по $4000 каждые 2 года платить. Из принципа не хочу, т.к. VID мне и не нужен совсем. А вообще 'amw' и 'XVR', спасибо за ответы. Я сейчас сильно занят, и много времени этой теме уделять не могу. Сейчас заказчику другую тему сдаём... Поэтому за задержки заранее извиняюсь. Но недельки через две обязательно займусь вплотную.
|
|
|
|
|
Apr 12 2008, 15:07
|
Знающий
   
Группа: Свой
Сообщений: 601
Регистрация: 22-09-05
Из: Kharkov
Пользователь №: 8 847

|
Цитата(galjoen @ Apr 12 2008, 16:46)  А Feature репорты можно описать как "только для чтения", но как "только для записи" невозможно. А понял, ну тогда понятно откуда в логах ошибки. Цитата Насчёт VID=PID=0. Ну не хочу я по $4000 каждые 2 года платить. Из принципа не хочу, т.к. VID мне и не нужен совсем. Ну Вы для пробы поставте что-нибудь отличное от нуля, для проверки. Цитата Но недельки через две обязательно займусь вплотную. Это будет весьма полезно узнать.
--------------------
- А мораль отсюда такова: всякому овощу свое время. Или, хочешь, я это сформулирую попроще: никогда не думай, что ты иная, чем могла бы быть иначе, чем будучи иной в тех случаях, когда иначе нельзя не быть. © Lewis Carroll. Alice's adventures in wonderland.
|
|
|
|
Сообщений в этой теме
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 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
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|