скрытое меню

краткая шпаргалка по USB

Коротко о USB откуда все начинается

D+ и D- это дифференциальная пара, данные передаются в противофазе с одной лишь целью уменьшить помехи.

То есть линия передачи по сути одна !

Есть ведущее устройство (Хост) и ведомое (Device).

Ведущее и ведомое могут одновременно что-то посылать в канал. Поэтому протокол USB очень требовательно распределяет , что ведущий и когда посылает и что (и когда) ведомый должен ответить. Иначе никак нельзя.

Вот на картинке ниже все отчетливо видно (один пакет от ведомого):

фотка 1

Сначала все просто:

Пакет всегда начинается с SYN (10000000).

Завершается пакет всегда EOP (End Of Packet ) . Тут единственная ассиметрия : 2 бита линии DP и DM обе линии в нуле!

Примерная последовательность пакетов.

Инициализацию устройства пропускаем (запрос дескриптора, интерфейсов , конечных точекк и т.д.), чтобы не терять времени (переходим к сути).

Периодические пакеты "НЕ СПАТЬ" SOF (Start Of Frame) - это 1раз/1мс посылка от хоста ведомому ("не спи").
Их лучше сразу как-то отфильтровывать для понимания.

Далее остается три типа пакетов типа ( токен) их PID :
out
in
setup

У них такая структура [SYNC,PID] Address(7 бит) EndPoint (4 бит) [EOP ]

На примере обычной клавиатуры процесс идет так например :

Хост долбит периодически PID IN по адресу устройства (назначается хостом ведомому при инициализации) и там еще указывается Endpoint устройства (т.к. их может быть несколько).

фотка 2

Если никакая клавиша не нажата ведомый обязан ответить и отвечает NACK.

А вот когда на клавиатуре нажимается какая-нибудь клавиша, ведомый ответит сначала DATA0 пакетом и следом пакет ACK.

фотка 3

Проводная клавиатура Low Speed

Скан коды USB HID клавиатур это не ASCII коды и не не коды PS/2 клавы.

Простые нажатия возвращают DATA0 и DATA1
1 - 00 00 1E 00 00 00 00 00 00 (DATA0) 00 00 00 00 00 00 00 00 00 (DATA1)
2 - 00 00 1F 00 00 00 00 00 00 (DATA0) 00 00 00 00 00 00 00 00 00 (DATA1)
3 - 00 00 20 00 00 00 00 00 00 (DATA0) 00 00 00 00 00 00 00 00 00 (DATA1)
<- 00 00 50 00 00 00 00 00 00 (DATA0) 00 00 00 00 00 00 00 00 00 (DATA1)

И значение у нашей клавы будет в 3 байте из 8 переданных DATA0.

SHIFT F 02 00 00 00 00 00 00 00 (DATA0) 02 00 09 00 00 00 00 00 00 (DATA1).

В общем опытным путем разобраться можно.

Беспроводная клавиатура Full Speed

Возвращает в DATA0 12 байт

01 00 00 00 00 00 00 00 00 00 00 00 (DATA0) 01 00 1E 00 00 00 00 00 00 00 00 00 (DATA1)

Некоторые сокращения

PID - Packet Identificator

Low Speed (LS) – низкоскоростной режим со скоростью связи 1,5 Мбит/сек.
Full Speed (FS) – полноскоростной режим со скоростью связи 12 Мбит/сек.
Hi-Speed (HS) – высокоскоростной режим со скоростью связи 480 Мбит/сек.

Значение PID читаем так : xxxxyyyyy - это первые четыре бита (x) , y это тоже самое , только наоборот.

PID - это тип пакета, а бывает этих типов не мало:

HCD Host Controller Driver .

PID типы

Группа Значение PID Идентификатор пакета
Token 0001 OUT Token
Token 1001 IN Token
Token 0101 SOF Token
Token 1101 SETUP Token
Data 0011 DATA0
Data 1011 DATA1
Data 0111 DATA2
Data 1111 MDATA
Handshake 0010 ACK Handshake
Handshake 1010 NAK Handshake
Handshake 1110 STALL Handshake
Handshake 0110 NYET (No Response Yet)
Special 1100 PREamble
Special 1100 ERR
Special 1000 Split
Special 0100 Ping