У меня несколько раз возникала эта проблема. Я обнаружил, что отправка SIGINT процессу byobu ( kill -2
) разблокирует сеанс. Это сработало, когда XON / XOFF у меня не работал. После подачи сигнала я могу повторно подключиться к оболочкам byobu и нормально работать.
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 используется для управления и настройки устройства, а остальные - для доступа к различным интерфейсам. Каждый интерфейс имеет ноль или более (обычно больше) конечных точек.
Конечные точки могут быть одного из нескольких типов передачи:
Также стоит отметить: USB-устройство может иметь несколько конфигураций, которые определяют, какие интерфейсы доступны, и так далее. Изменение конфигурации устройства почти аналогично отключению устройства от сети и установке на его место другого устройства.
Вся эта информация представлена в дескрипторах устройства, дескрипторах конфигурации, дескрипторах интерфейса, дескрипторах конечных точек и т. Д., который можно запросить через нулевую конечную точку.
(Внутренне данные не являются потоком байтов, они упакованы в пакеты, точные форматы которых являются частью спецификации USB. По большей части вам не нужно беспокоиться об этом, поскольку контроллеры и драйверы будут управлять эта часть для вас.)
На практике, в зависимости от вашей библиотеки API и операционной системы, вам необходимо обнаружить устройство, прочитать различные дескрипторы, чтобы узнать, с чем вы имеете дело, при необходимости установить его конфигурацию (если ОС разрешает), откройте интерфейс и откройте конечные точки.
Для массовых конечных точек вы можете читать и записывать в них необработанные данные. Для передачи управления библиотека API будет предоставлять вызовы функций. Я никогда не использовал прерывание или изохронную передачу; Я уверен, что в вашей библиотеке API будет соответствующая документация.
Дополнительная информация: «Функция» - это набор интерфейсов, которые работают вместе. Изначально это не было частью спецификации USB, и драйвер устройства должен знать, какие интерфейсы должны быть сгруппированы вместе. Рабочая группа USB определила классы устройств, которые поддерживают функции. Это делается через дескриптор ассоциации интерфейса (IAD).