Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Как организовать эффективное взаимодействие с HID устройством ?
Форум разработчиков электроники ELECTRONIX.ru > Интерфейсы > Форумы по интерфейсам > RS232/LPT/USB/PCMCIA/FireWire
_3m
Изучаю USB HID класс. Обмен информацией работает - посылаю и принимаю репорты через Interrupt transfer, работают SET_FEATURE и GET_FEATURE, научился писишным софтом перезапускать зависший usb порт и определять факт зависания. Однако в литературе я нигде не нашел рекомендаций по организации взаимодействия между прикладным софтом PC и девайсом. В литературе и демо-проектах рассматривается джойстики мышки и светодиоды (зажечь/погасить по команда PC). Нигде не рассматривается как строить взаимодействие со сложными устройствами генерирующие двунаправленные потоки данных близкие к предельным для HID устройств (например PC<->PIC18F2550_HID_class<->СС1100).
Мои эксперименты показывают что использование простейшего взаимодействия типа "запрос PC - ответ HID девайса" получится неэффективным. Несинхронизированный поточный обмен работает минимум в 2 раза быстрее, но требуется буферизация а в пике с рамой напряженка.
Также есть и более конкретные вопросы:
* имеет ли смысл использовать feature репорты
* нужно ли поддерживать запись репортов через control transfer, ведь это нужно только win98 не-SE. которая не поддерживает out interrupt transfer.
tAmega
Для двунаправленных потоков, о которых Вы говорите существует CDC класс, никто не мешает взять рабочий пример CDC RS232, и на стороне процессора вместо того, чтобы пробрасывать данные от хоста на UART, замкнуть обмен на себе. Тогда Вы получите двунапрвленный bulk обмен и
никакого перерасхода RAM со стороны микропроцессора.
_3m
Цитата(tAmega @ Jan 20 2009, 15:11) *
Для двунаправленных потоков, о которых Вы говорите существует CDC класс, никто не мешает взять рабочий пример CDC RS232, и на стороне процессора вместо того, чтобы пробрасывать данные от хоста на UART, замкнуть обмен на себе. Тогда Вы получите двунапрвленный bulk обмен и
никакого перерасхода RAM со стороны микропроцессора.

Я знаю о существовании CDC класса.
Нужно чтобы устройство работало без установки драйверов или inf файла: воткнул шнурок, запустил exe-шник без инсталяции и все заработало!
По этой причине остается два варианта: HID и Mass storage.
Сейчас ковыряю HID, если выявятся непреодолимые трудности - буду думать дальше.
Ограничение в 64000 байт в секунду устраивает.
galjoen
Цитата(_3m @ Jan 20 2009, 15:01) *
* имеет ли смысл использовать feature репорты

Имеет. Особенно GET_FEATURE. Их ведь 255 штук м.б. Вот N этого репорта и будет запросом. Если вам этого хватит - ваш вопрос об эффективном взаимодействии решён.
У меня у некоторых HID-ов только FEATURE и есть. Ни InterruptIn ни, тем более, InterruptOut нет вообще.
Цитата(_3m @ Jan 20 2009, 15:01) *
* нужно ли поддерживать запись репортов через control transfer, ведь это нужно только win98 не-SE. которая не поддерживает out interrupt transfer.

Вы имеете ввиду InterruptOut? А они разве у вас есть? Зачем? Имхо у них нет никаких преимуществ перед SET_FEATURE.
galjoen
Забыл сказать, что всё мною сказанное в предыдущем посте, справедливо только в том случае, если буфер у EP0 размером 64 байта. Я привык к таким девайсам и уже забыл, что бывают более другие...
_3m
Цитата(galjoen @ Feb 19 2009, 00:29) *
Имеет. Особенно GET_FEATURE. Их ведь 255 штук м.б. Вот N этого репорта и будет запросом. Если вам этого хватит - ваш вопрос об эффективном взаимодействии решён.

Чтобы сделать 255 репортов нужно создать 255 дескрипторов репоров, это совершенно нереально. Если в дескрипторе 1 репорт то винда не дает работать с report id отличным от нуля, во всяком случае мне это не удалось.

Цитата
У меня у некоторых HID-ов только FEATURE и есть. Ни InterruptIn ни, тем более, InterruptOut нет вообще.

Так ведь interrupt in по спецификации обязателен для hid класса. Как же оно у вас работает то?

Цитата
Вы имеете ввиду InterruptOut? А они разве у вас есть? Зачем? Имхо у них нет никаких преимуществ перед SET_FEATURE.

C interrupt out передачей несколько проще работать в микроконтроллере.
Впрочем после прочтения информации о баге в драйверее hid win xp sp2-3 вопрос о работе через interrupt out отпал сам собой. В xp sp2-3 там баг, починен только в висте.
galjoen
Цитата(_3m @ Feb 24 2009, 22:44) *
Чтобы сделать 255 репортов нужно создать 255 дескрипторов репоров, это совершенно нереально.

Почему нереально? Дескрипторы не хранятся, а формируются в цикле.
Цитата(_3m @ Feb 24 2009, 22:44) *
Если в дескрипторе 1 репорт то винда не дает работать с report id отличным от нуля, во всяком случае мне это не удалось.

Верно. В этом случае даже можно использовать нулевой байт.
Цитата(_3m @ Feb 24 2009, 22:44) *
Так ведь interrupt in по спецификации обязателен для hid класса. Как же оно у вас работает то?

Нигде не читал об ОБЯЗАТЕЛЬНОСТИ InterruptIn и связанной с ним EP. У меня все работает как с, так и без, InterruptIn EP.
Цитата(_3m @ Feb 24 2009, 22:44) *
C interrupt out передачей несколько проще работать в микроконтроллере.

Простота эта связана с ограничением длины в 64 байта. Как, впрочем, и у InterruptIn.
Epikur
Цитата(_3m @ Feb 24 2009, 22:44) *
Впрочем после прочтения информации о баге в драйверее hid win xp sp2-3 вопрос о работе через interrupt out отпал сам собой. В xp sp2-3 там баг, починен только в висте.

А можно ли подробнее про баг хрюшки?
У меня тоже PC <---> PIC18F2550, работает в режиме HID. И никак не удаётся достичь предельной скорости 64000 байт/с. Максимум получается только 42 кб/с. Ладно было бы 32 кб/с - хоть какая-то логика. а 42...
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.