Перейти к содержанию
    

Как организовать эффективное взаимодействие с HID устройством ?

Изучаю 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.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Для двунаправленных потоков, о которых Вы говорите существует CDC класс, никто не мешает взять рабочий пример CDC RS232, и на стороне процессора вместо того, чтобы пробрасывать данные от хоста на UART, замкнуть обмен на себе. Тогда Вы получите двунапрвленный bulk обмен и

никакого перерасхода RAM со стороны микропроцессора.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Для двунаправленных потоков, о которых Вы говорите существует CDC класс, никто не мешает взять рабочий пример CDC RS232, и на стороне процессора вместо того, чтобы пробрасывать данные от хоста на UART, замкнуть обмен на себе. Тогда Вы получите двунапрвленный bulk обмен и

никакого перерасхода RAM со стороны микропроцессора.

Я знаю о существовании CDC класса.

Нужно чтобы устройство работало без установки драйверов или inf файла: воткнул шнурок, запустил exe-шник без инсталяции и все заработало!

По этой причине остается два варианта: HID и Mass storage.

Сейчас ковыряю HID, если выявятся непреодолимые трудности - буду думать дальше.

Ограничение в 64000 байт в секунду устраивает.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

* имеет ли смысл использовать feature репорты

Имеет. Особенно GET_FEATURE. Их ведь 255 штук м.б. Вот N этого репорта и будет запросом. Если вам этого хватит - ваш вопрос об эффективном взаимодействии решён.

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

* нужно ли поддерживать запись репортов через control transfer, ведь это нужно только win98 не-SE. которая не поддерживает out interrupt transfer.

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Забыл сказать, что всё мною сказанное в предыдущем посте, справедливо только в том случае, если буфер у EP0 размером 64 байта. Я привык к таким девайсам и уже забыл, что бывают более другие...

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Имеет. Особенно 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 там баг, починен только в висте.

Изменено пользователем _3m

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Чтобы сделать 255 репортов нужно создать 255 дескрипторов репоров, это совершенно нереально.

Почему нереально? Дескрипторы не хранятся, а формируются в цикле.

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

Верно. В этом случае даже можно использовать нулевой байт.

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

Нигде не читал об ОБЯЗАТЕЛЬНОСТИ InterruptIn и связанной с ним EP. У меня все работает как с, так и без, InterruptIn EP.

C interrupt out передачей несколько проще работать в микроконтроллере.

Простота эта связана с ограничением длины в 64 байта. Как, впрочем, и у InterruptIn.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Впрочем после прочтения информации о баге в драйверее hid win xp sp2-3 вопрос о работе через interrupt out отпал сам собой. В xp sp2-3 там баг, починен только в висте.

А можно ли подробнее про баг хрюшки?

У меня тоже PC <---> PIC18F2550, работает в режиме HID. И никак не удаётся достичь предельной скорости 64000 байт/с. Максимум получается только 42 кб/с. Ладно было бы 32 кб/с - хоть какая-то логика. а 42...

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...