Можно ли изменить USB-протоколы в Linux?

Можно ли изменить USB-протоколы в Linux?

Я пытался найти способ заставить микроконтроллер напрямую взаимодействовать с компьютером через USB без моста UART-USB, и я подумал, что смогу сделать это, отключив протоколы USB для порта USB и используя порт как обычный последовательный порт. Однако мне сказали, что отключить часть USB нельзя. Однако я также слышал, что Linux оставляет гораздо больше внутренних механизмов операционной системы открытыми для изменения. Позволяет ли Linux изменять протоколы USB и превращать порт USB в обычный последовательный порт?

решение1

USB — это не «просто последовательный порт» в каком-либо смысле, который соответствовал бы старому стандарту последовательного порта RS-232 (также известному как EIA/TIA-232). Вы не можете превратить USB в RS-232, «отключив дополнительные требования».

В отличие от классических последовательных портов RS-232, USB использует дифференциальную передачу сигналов: на самом деле немного (очень немного) похоже на RS-485, хотя уровни сигналов и другие электрические характеристики сильно отличаются.

RS-232 может использовать напряжение сигнала до +/- 15 вольт: USB использует <0,3 В для логического низкого уровня и 2,8–3,6 вольт для логического высокого уровня в режимах USB 1; в высокоскоростном режиме USB 2 напряжения еще меньше.

Даже если в RS-232 используются логические уровни TTL (0..5 В), передатчик USB не сможет надежно генерировать сигнал RS-232 "space" (=состояние с более высоким напряжением). Уровни сигналов просто не совпадают между этими стандартами: сигнал передатчика USB будет слишком слабым для приемника RS-232 UART, а выходной сигнал RS-232 перегрузит приемник USB.

Вы также не можете обойти несовместимость с простой схемой преобразователя уровня: вместо того, чтобы отправлять только один стартовый бит, затем один байт данных, а затем один или два стоповых бита, USB-трансивер имеет дело с пакетами. В начале пакета должна быть последовательность синхронизации (8 бит для USB 1; 32 бита для высокоскоростных передач USB 2), затем передаются несколько байтов и, наконец, сигнал конца пакета, который не будет соответствовать ни одному из обычных состояний «логический низкий» или «логический высокий». Все это может быть реализовано аппаратно для эффективности, и поскольку обычно нет причин делать что-то по-другому, вероятно, нет никаких положений, чтобы обойти это для «битового banging» фактических линий данных при прямом программном управлении.

Сравните примеры сигнализацииRS-232иUSB-порт 1.1в Википедии.

Подводя итог: нет, проблема в том, что различия между USB и RS-232 слишком велики на уровне аппаратного обеспечения.

Связанный контент