Как записать необработанные данные на USB-устройство

У меня несколько раз возникала эта проблема. Я обнаружил, что отправка SIGINT процессу byobu ( kill -2 ) разблокирует сеанс. Это сработало, когда XON / XOFF у меня не работал. После подачи сигнала я могу повторно подключиться к оболочкам byobu и нормально работать.

8
04.07.2016, 20:09
1 ответ

USB-устройства намного сложнее, чем просто каналы, которые вы читаете и пишете. Вам нужно будет написать код для управления ими. Вам не нужно писать драйвер ядра. См. http://libusb.info (урожденный libusb.org) и http://libusb.sourceforge.net/api-1.0 . Утверждается, что он работает с Linux, OSX, Windows, Android, OpenBSD и т. Д. В Mac OS X в I / O Kit есть функции уровня пользователя, которые позволят вам получить доступ к USB. Под Windows вы можете использовать WinUSB, но это сложно.

Вот небольшая диаграмма, которую я однажды нарисовал, чтобы помочь мне понять архитектуру USB:

                 ╭──────────────────────────────────────╮
    ┌──────┐     │   device     ┌─────┐  ┌───────────┐  │
    │ Port ├──┐  │            ┌─┤ EP0 ├──┤ control   │  │
    └──────┘  │  │ ┌────────┐ │ └─────┘  │┌─────────┐│  │
              ├────┤addr = 2├─┤ ┌─────┐  ││         ││  │
              │  │ └────────┘ ├─┤ EP1 ├──┼┤interface││  │
              │  │            │ └─────┘  ││   #0    ││  │
              │  │            │ ┌─────┐  │├─────────┤│  │
              │  │            ├─┤ EP2 ├──┼┤         ││  │
              │  │            │ └─────┘  ││interface││  │
              │  │            │ ┌─────┐  ││   #1    ││  │
              │  │            └─┤ EP3 ├──┼┤         ││  │
              │  │              └─────┘  │└─────────┘│  │
              │  │                       └───────────┘  │
              │  ╰──────────────────────────────────────╯
              │
              │
              :

Краткое изложение: каждое устройство имеет адрес (назначается оператором-оператором и может быть изменен) и вплоть до (я думаю) 32 конечных точки.

Внутри устройства есть один или несколько «интерфейсов». Например, веб-камера может иметь интерфейс «камера» и интерфейс «микрофон». Многофункциональный принтер обеспечит несколько интерфейсов.

Конечная точка 0 используется для управления и настройки устройства, а остальные - для доступа к различным интерфейсам. Каждый интерфейс имеет ноль или более (обычно больше) конечных точек.

Конечные точки могут быть одного из нескольких типов передачи:

  • Передачи управления используются для запроса и настройки устройства. Каждое устройство должно поддерживать минимальный набор управляющих операторов. Я считаю, что передача управления используется только с конечной точкой 0.
  • Массовые передачи отправляют или получают данные с полной пропускной способностью
  • Прерывания передачи (я не совсем уверен, чем это отличается от массовых передач; USB не имеет прерываний. ). Примеры включают клавиатуру и мышь
  • . Изохронные передачи отправляют или получают данные с полной полосой пропускания с требованиями в реальном времени, но без надежности. Используется для аудио / видео приложений.

Также стоит отметить: USB-устройство может иметь несколько конфигураций, которые определяют, какие интерфейсы доступны, и так далее. Изменение конфигурации устройства почти аналогично отключению устройства от сети и установке на его место другого устройства.

Вся эта информация представлена ​​в дескрипторах устройства, дескрипторах конфигурации, дескрипторах интерфейса, дескрипторах конечных точек и т. Д., который можно запросить через нулевую конечную точку.

(Внутренне данные не являются потоком байтов, они упакованы в пакеты, точные форматы которых являются частью спецификации USB. По большей части вам не нужно беспокоиться об этом, поскольку контроллеры и драйверы будут управлять эта часть для вас.)

На практике, в зависимости от вашей библиотеки API и операционной системы, вам необходимо обнаружить устройство, прочитать различные дескрипторы, чтобы узнать, с чем вы имеете дело, при необходимости установить его конфигурацию (если ОС разрешает), откройте интерфейс и откройте конечные точки.

Для массовых конечных точек вы можете читать и записывать в них необработанные данные. Для передачи управления библиотека API будет предоставлять вызовы функций. Я никогда не использовал прерывание или изохронную передачу; Я уверен, что в вашей библиотеке API будет соответствующая документация.


Дополнительная информация: «Функция» - это набор интерфейсов, которые работают вместе. Изначально это не было частью спецификации USB, и драйвер устройства должен знать, какие интерфейсы должны быть сгруппированы вместе. Рабочая группа USB определила классы устройств, которые поддерживают функции. Это делается через дескриптор ассоциации интерфейса (IAD).

20
27.01.2020, 20:09

Теги

Похожие вопросы