13.53M
Категория: ПрограммированиеПрограммирование

Программирование USB - устройства в режиме Device (лекция 11)

1.

Программирование USB-устройства в режиме Device:
направления освоения USB
1

2.

Программирование USB:
принцип кодирования на физическом уровне
NRZI with stuffing (Non Return to Zero
Invert) – принцип возврата к нулю с
инвертированием
единиц:
0 – передний или задний фронт,
1 – неизменный уровень напряжения
Формат передачи данных – LSB,
минимальная длина пакета 19 бит
2

3.

Программирование USB:
фрагментация данных на канальном уровне
3

4.

Программирование USB:
структура и форматы пакетов
Обобщённый формат USB-пакета
Два
младших
бита
PID
определяют
группу
принадлежности
пакета: 00 –
специальный
пакет (Special),
01 – маркер
(Token), 10 –
подтверждение
(Handshake),
11

пакет
данных (Data)
4

5.

Стандарт USB: типы
и форматы пакетов
Формат пакетов-маркеров IN, OUT, SETUP, PING
Формат пакета SOF
Формат пакета данных
Формат пакета подтверждения
Формат пакета SPLIT
Флаг SC (Start/Complete): 0 – маркер запуска SS (Start Split), 1 – маркер завершения CS
(Complete Split) расщеплённой транзакции
Поля S и E: для управляющих транзакций и прерываний S определяет скорость (0 – FS, 1
– LS); для остальных транзакций, кроме OUT, S = E = 0; для транзакции OUT пара
[S:E] означает: 10 – стартовый пакет, 01 – последний пакет, 00 – промежуточный
пакет, 11 – в пакете все данные транзакции
Поле ET описывает тип целевой конечной точки, с которой будет производиться
транзакция:
00

управление,
01

изохронная
транзакция,
10 – передача массива данных, 11 - прерывание
5

6.

Стандарт USB:
выборочные типы пакетов
6

7.

Стандарт USB:
разновидности пакетов SOF
7

8.

Стандарт USB:
разновидности пакетов Data данных
8

9.

Стандарт USB:
алгоритм
вычисления CRC-5
Порождающий многочлен
x5 + x2 + x0
(битовое представление
порождающего
многочлена100101)
9

10.

Стандарт USB:
алгоритм
вычисления CRC-5
Порождающий многочлен
x5 + x2 + x0
(битовое представление
порождающего
многочлена100101)
10

11.

Стандарт USB:
алгоритм
вычисления CRC-5
Порождающий многочлен
x 5 + x2 + x0
(битовое представление
порождающего
многочлена100101)
11

12.

Стандарт USB:
алгоритм
вычисления CRC-5
Порождающий многочлен
x5 + x2 + x0
(битовое представление
порождающего
многочлена100101)
12

13.

Стандарт USB:
алгоритм
вычисления CRC-5
Порождающий многочлен
x5 + x2 + x0
(битовое представление
порождающего
многочлена100101)
13

14.

Стандарт
USB:
алгоритм
вычисления
CRC-16
Порождающий многочлен
x16 + x15 + x2 + x0
(битовое представление
порождающего
многочлена11000000000000101)
14

15.

Стандарт
USB:
алгоритм
вычисления
CRC-16
Порождающий многочлен
x16 + x15 + x2 + x0
(битовое представление
порождающего
многочлена11000000000000101)
15

16.

Программирование USB:
транзакции
16

17.

Стандарт USB:
осциллограмма кадра
17

18.

Стандарт USB: осциллограмма посылки
18

19.

Стандарт USB: осциллограммы
транзакций
SOF
IN
Data0
Данные компьютера (хост-машины)
SOF
SETUP
бит-стаффинг
Data0
Данные контроллера (Device)
ACK
Данные
компьютера
(хост-машины)
ACK
19

20.

Стандарт USB: осциллограмма пакета
Пакет SOF (35 бит)
Длительность
3 мкс на скорости
12 Мбит
20

21.

Стандарт USB:
множество состояний прерываний USB-контроллера
Источник – регистр OTG_FS_GINTSTS (Global INTerrupt
STatuS, STM32F407vd_datasheet.pdf, с. 1055)
1. sofintr – приём пакета начала кадра
2. inepintr – запрос данных входной (IN) конечной
точки
3. outepintr – передача данных для выходной
(OUT) конечной точки
4. rxstsqlvl – появление данных в приёмной
очереди (Receive Status Queue Level)
5. usbreset – сброс шины ведущим устройством
(host-машиной)
25
6.usbsuspend – краткая приостановка работы шины

22.

Стандарт USB:
множество состояний прерываний USB-контроллера
Источник – регистр OTG_FS_GINTSTS (Global INTerrupt STatuS,
STM32F407vd_datasheet.pdf, с. 1055)
7. enumdone – завершение перечисления устройств в шине
8. wkupintr – выход из спящего режима
9. modemismatch – несоответствие режима
10. incomplisoin – незавершённая изохронная передача
данных для входной конечной точки (incomplete
isochronous IN transfer)
11. incomplisoout – незавершённая изохронная передача
данных для выходной конечной точки (incomplete
isochronous OUT transfer)
12. sessreqintr – запрос сессии либо запуск новой сессии
13. otgintr – прерывание OTG (On-The-Go)
22

23.

Стандарт USB:
примерные осциллограммы протокола взаимодействия
в режиме FS (Full Speed)
23

24.

Стандарт USB: иерархия USB-дескрипторов
устройства (HID-устройства)
24

25.

Стандарт USB:
транзакция «SETUP 1»
пауза
конечная точка 0
функция 0
25

26.

Стандарт USB:
расшифровка пакета «SETUP 1» (начало)
Назначение пакета – запрос дескриптора устройства размером 64 байт
(см. данные 7 и 8 == 0х40 0х00)
USB-обработчики outepintr, rxstsqlvl
Определяющая функция
void USBD_ParseSetupRequest( USB_OTG_CORE_HANDLE *pdev, USB_SETUP_REQ *req)
файла usbd_req.c
pdev->dev.setup_packet == 0х80 0х06 0х00 0х01 0х00 0х00 0х40 0х00
req->bmRequest = *(uint8_t *) (pdev->dev.setup_packet);
0х80
1
направление
передачи:
Device -> Host
00
Стандартный тип
00000
Device
(запрос – дескриптор устройства,
что отражено в параметре req->bRequest)
req->bRequest
= *(uint8_t *) (pdev->dev.setup_packet + 1);
0х06
GET_DESCRIPTOR (0x06)
req->wValue
req->wIndex
req->wLength
= SWAPBYTE
= SWAPBYTE
= SWAPBYTE
(pdev->dev.setup_packet + 2);
(pdev->dev.setup_packet + 4);
(pdev->dev.setup_packet + 6);
0х0100
0х0000
0х0040
26

27.

Стандарт USB:
расшифровка пакета «SETUP 1»
(окончание)
У req->bmRequest определяющими являются 5 младших битов:
бит 0 – запрос параметров устройства (USB_REQ_RECIPIENT_DEVICE)
бит 1 – запрос параметров интерфейса (USB_REQ_RECIPIENT_INTERFACE)
бит 2 – запрос параметров конечной точки (USB_REQ_RECIPIENT_ENDPOINT)
bmRequestType
bRequest
wValue
1000 0000b GET_DESCRIPTOR (0x06) Descriptor Type & Index
0х80
0х06
0х01
0х00
wIndex
Zero or Language ID
0х00 0х00
wLength
Descriptor Length
0х40 0х00
Data
Descriptor
27

28.

Стандарт USB:
ответ на запрос «SETUP 1»
USB-обработчик inepint
28

29.

Стандарт USB:
транзакция «SETUP 2»
конечная точка 0
функция 0
29

30.

Стандарт USB:
следующие за «SETUP 2» пакеты
не представляют особого интереса
30

31.

Стандарт USB:
расшифровка пакета «SETUP 2»
Назначение пакета – установка адреса устройства, равного 1
(см. данные 3 и 4 == 0х01 0х00)
pdev->dev.setup_packet == 0х00 0х05 0х01 0х00 0х00 0х00 0х00 0х00
req->bmRequest = *(uint8_t *) (pdev->dev.setup_packet);
0
направление
передачи:
Host -> Device
req->bRequest
00
Стандартный тип
0х00
00000
Device
req->wValue
req->wIndex
req->wLength
= *(uint8_t *) (pdev->dev.setup_packet + 1);
0х05
SET_ADDRESS (0x05)
= SWAPBYTE (pdev->dev.setup_packet + 2);
0х0001
= SWAPBYTE (pdev->dev.setup_packet + 4);
0х0000
= SWAPBYTE (pdev->dev.setup_packet + 6);
0х0000
bmRequestType
0000 0000b
0х00
bRequest
SET_ADDRESS (0x05)
0х05
wIndex
Zero
0х00 0х00
wLength
Zero
0х00 0х00
wValue
Device Address
0х01 0х00
Data
None
Данный пакет не требует ответа!
31

32.

Стандарт USB:
транзакция «SETUP 3»
конечная точка 0
функция 1
32

33.

Стандарт USB:
расшифровка пакета «SETUP 3»
Назначение пакета – запрос дескриптора устройства размером 18 байт
(см. данные 7 и 8 == 0х12 0х00)
pdev->dev.setup_packet == 0х80 0х06 0х00 0х01 0х00 0х00 0х12 0х00
req->bmRequest = *(uint8_t *) (pdev->dev.setup_packet);
1
направление
передачи:
Device -> Host
req->bRequest
00
Стандартный тип
0х80
00000
Device
req->wValue
req->wIndex
req->wLength
= *(uint8_t *) (pdev->dev.setup_packet + 1);
0х06
GET_DESCRIPTOR (0x06)
= SWAPBYTE (pdev->dev.setup_packet + 2);
0х0100
= SWAPBYTE (pdev->dev.setup_packet + 4);
0х0000
= SWAPBYTE (pdev->dev.setup_packet + 6);
0х0012
bmRequestType
1000 0000b
0х80
bRequest
GET_DESCRIPTOR (0x06)
0х06
wIndex
Zero or Language ID
0х00 0х00
wLength
Descriptor Length
0х12 0х00
wValue
Descriptor Type & Index
0х01
0х00
Data
Descriptor
33

34.

Стандарт USB: ответ на запрос «SETUP 3»
34

35.

Стандарт USB:
транзакция «SETUP 4»
конечная точка 0
функция 1
35

36.

Стандарт USB:
расшифровка пакета «SETUP 4»
Назначение пакета – запрос дескриптора конфигурации размером не более 255
байт
(см. данные 7 и 8 == 0хFF 0х00)
pdev->dev.setup_packet == 0х80 0х06 0х00 0х02 0х00 0х00 0хFF 0х00
req->bmRequest = *(uint8_t *) (pdev->dev.setup_packet);
0х80
1
направление
передачи:
Device -> Host
req->bRequest
00
Стандартный тип
00000
Device
req->wValue
req->wIndex
req->wLength
= *(uint8_t *) (pdev->dev.setup_packet + 1);
0х06
GET_DESCRIPTOR (0x06)
= SWAPBYTE (pdev->dev.setup_packet + 2);
0х0200
= SWAPBYTE (pdev->dev.setup_packet + 4);
0х0000
= SWAPBYTE (pdev->dev.setup_packet + 6);
0х00FF
bmRequestType
1000 0000b
0х80
bRequest
GET_DESCRIPTOR (0x06)
0х06
wIndex
Zero or Language ID
0х00 0х00
wLength
Descriptor Length
0хFF 0х00
wValue
Descriptor Type & Index
0х02
0х00
Data
Descriptor
36

37.

Стандарт USB:
ответ на запрос «SETUP 4»
37

38.

Стандарт USB: дескрипторы
конфигурации и интерфейса
38

39.

Стандарт USB: дескрипторы
HID-устройства и конечной точки
39

40.

Стандарт USB:
транзакция «SETUP 5»
конечная точка 0
функция 1
40

41.

Стандарт USB:
расшифровка пакета «SETUP 5»
Назначение пакета – запрос строкового дескриптора (точнее,
серийного номера) устройства длиной не более 255 байт
pdev->dev.setup_packet == 0х80 0х06 0х03 0х03 0х09 0х04 0хFF 0х00
req->bmRequest = *(uint8_t *) (pdev->dev.setup_packet);
1
направление
передачи:
Device -> Host
req->bRequest
00
Стандартный тип
0х80
00000
Device
req->wValue
req->wIndex
req->wLength
= *(uint8_t *) (pdev->dev.setup_packet + 1);
0х06
GET_DESCRIPTOR (0x06)
= SWAPBYTE (pdev->dev.setup_packet + 2);
0х0303
= SWAPBYTE (pdev->dev.setup_packet + 4);
0х0409
= SWAPBYTE (pdev->dev.setup_packet + 6);
0х00FF
bmRequestType
1000 0000b
0х80
bRequest
GET_DESCRIPTOR (0x06)
0х06
wIndex
Zero or Language ID Идентификатор языка
0х09 0х04
0x0409 – английский (США)
wValue
Descriptor Type & Index
0х03
0х03
wLength
Descriptor Length
0хFF 0х00
Data
Descriptor
41

42.

Стандарт USB:
ответ на запрос «SETUP 5»
Данное 1 → длина посылки 0x0A == 10 байт
Данное 2 → формат данных 0x03 == строковый UNICODE
Непосредственные символы строки:
Данные 3 и 4 → 0x30 0x00 → 0x0030 → '0'
Данные 5 и 6 → 0x30 0x00 → 0x0030 → '0'
Данные 7 и 8 → 0x30 0x00 → 0x0030 → '0'
Данные 9 и 10 → 0x31 0x00 → 0x0031 → '1'
В результате: «0001» – константа USBD_SERIALNUMBER_FS_STRING
файла Libraries/STM32_USB_OTG_Driver/src/usbd_desc.c
42

43.

Стандарт USB:
транзакция «SETUP 6»
конечная точка 0
функция 1
43

44.

Стандарт USB:
расшифровка пакета «SETUP 6»
Назначение пакета – запрос «языкового» дескриптора устройства
pdev->dev.setup_packet == 0х80 0х06 0х00 0х03 0х00 0х00 0хFF 0х00
req->bmRequest = *(uint8_t *) (pdev->dev.setup_packet);
1
направление
передачи:
Device -> Host
req->bRequest
00
Стандартный тип
0х80
00000
Device
req->wValue
req->wIndex
req->wLength
= *(uint8_t *) (pdev->dev.setup_packet + 1);
0х06
GET_DESCRIPTOR (0x06)
= SWAPBYTE (pdev->dev.setup_packet + 2);
0х0300
= SWAPBYTE (pdev->dev.setup_packet + 4);
0х0000
= SWAPBYTE (pdev->dev.setup_packet + 6);
0х00FF
bmRequestType
1000 0000b
0х80
bRequest
GET_DESCRIPTOR (0x06)
0х06
wIndex
Zero or Language ID
0х00 0х00
wValue
Descriptor Type & Index
0х03
0х00
wLength
Descriptor Length
0хFF 0х00
Data
Descriptor
44

45.

Стандарт USB:
ответ на запрос «SETUP 6»
Данное 1 → длина посылки 0x04 == 4 байт
Данное 2 → формат данных 0x03 == строковый
Непосредственные данные 3 и 4 → 0x09 0x04 → 0x0409
В результате: код поддерживаемого языка устройства равен 0х0409, что
означает английский язык США; за него отвечает константа
USBD_LANGID_STRING файла
Libraries/STM32_USB_OTG_Driver/src/usbd_desc.c
45

46.

Стандарт USB:
транзакция «SETUP 7»
конечная точка 0
функция 1
46

47.

Стандарт USB:
расшифровка пакета «SETUP 7»
Назначение пакета – запрос названия устройства
pdev->dev.setup_packet == 0х80 0х06 0х02 0х03 0х09 0х04 0хFF 0х00
req->bmRequest = *(uint8_t *) (pdev->dev.setup_packet);
1
направление
передачи:
Device -> Host
req->bRequest
00
Стандартный тип
0х80
00000
Device
req->wValue
req->wIndex
req->wLength
= *(uint8_t *) (pdev->dev.setup_packet + 1);
0х06
GET_DESCRIPTOR (0x06)
= SWAPBYTE (pdev->dev.setup_packet + 2);
0х0302
= SWAPBYTE (pdev->dev.setup_packet + 4);
0х0409
= SWAPBYTE (pdev->dev.setup_packet + 6);
0х00FF
bmRequestType
1000 0000b
0х80
bRequest
GET_DESCRIPTOR (0x06)
0х06
wIndex
Zero or Language ID
0х09 0х04
Идентификатор языка
0x0409 – английский (США)
wValue
Descriptor Type & Index
0х03
0х02
wLength
Descriptor Length
0хFF 0х00
Data
Descriptor
47

48.

Стандарт USB:
ответ на запрос «SETUP 7»
48

49.

Стандарт USB:
ответ на запрос «SETUP 7»
49

50.

Стандарт USB:
ответ на запрос «SETUP 7»
Данное 1 → длина посылки 0x4A == 74 байт
Данное 2 → формат данных 0x03 == строковый в формате UNICODE
Непосредственные данные 3 и 4 → 0x43 0x00 → 0x0043 → 'C'
Непосредственные данные 5 и 6 → 0x50 0x00 → 0x0050 → 'P'
В результате: «CP2103 USB to UART Bridge Controller»;
за него отвечает константа USBD_PRODUCT_FS_STRING файла
Libraries/STM32_USB_OTG_Driver/src/usbd_desc.c
50

51.

Стандарт USB:
ответ на запрос «SETUP 7»
Следующий кадр как продолжение предыдущего с незавершённо переданной
строкой описания продукта
Непосредственные данные 1 и 2 → 0x6F 0x00 → 0x006F → 'o'
Непосредственные данные 3 и 4 → 0x6C 0x00 → 0x006C → 'l'
В результате: «oller»
51

52.

Стандарт USB:
транзакция «SETUP 8»
конечная точка 0
функция 1
52

53.

Стандарт USB:
расшифровка пакета «SETUP 8»
Назначение пакета – запрос уточняющего дескриптора устройства (необходим
для HS-устройств). У FS-устройства ответ на данный запрос отсутствует!
pdev->dev.setup_packet == 0х80 0х06 0х00 0х06 0х00 0х00 0х0A 0х00
req->bmRequest = *(uint8_t *) (pdev->dev.setup_packet);
1
направление
передачи:
Device -> Host
req->bRequest
00
Стандартный тип
0х80
00000
Device
req->wValue
req->wIndex
req->wLength
= *(uint8_t *) (pdev->dev.setup_packet + 1);
0х06
GET_DESCRIPTOR (0x06)
= SWAPBYTE (pdev->dev.setup_packet + 2);
0х0600
= SWAPBYTE (pdev->dev.setup_packet + 4);
0х0000
= SWAPBYTE (pdev->dev.setup_packet + 6);
0х000А
bmRequestType
1000 0000b
0х80
bRequest
GET_DESCRIPTOR (0x06)
0х06
wIndex
Zero or Language ID
0х00 0х00
wLength
Descriptor Length
0х0А 0х00
wValue
Descriptor Type & Index
0х06
0х00
Data
Descriptor
53

54.

Стандарт USB:
транзакция «SETUP 9»
конечная точка 0
функция 1
54

55.

Стандарт USB:
расшифровка пакета «SETUP 9»
Назначение пакета – запрос стандартного дескриптора устройства
pdev->dev.setup_packet == 0х80 0х06 0х00 0х01 0х00 0х00 0х12 0х00
req->bmRequest = *(uint8_t *) (pdev->dev.setup_packet);
1
направление
передачи:
Device -> Host
req->bRequest
00
Стандартный тип
0х80
00000
Device
req->wValue
req->wIndex
req->wLength
= *(uint8_t *) (pdev->dev.setup_packet + 1);
0х06
GET_DESCRIPTOR (0x06)
= SWAPBYTE (pdev->dev.setup_packet + 2);
0х0100
= SWAPBYTE (pdev->dev.setup_packet + 4);
0х0000
= SWAPBYTE (pdev->dev.setup_packet + 6);
0х0012
bmRequestType
1000 0000b
0х80
bRequest
GET_DESCRIPTOR (0x06)
0х06
wIndex
Zero or Language ID
0х00 0х00
wLength
Descriptor Length
0х12 0х00
wValue
Descriptor Type & Index
0х01
0х00
Data
Descriptor
55

56.

Стандарт USB:
ответ на запрос «SETUP 9»
Запрос-ответ «SETUP 9»
идентичен «SETUP 3»
56

57.

Стандарт USB:
транзакция «SETUP 10»
конечная точка 0
функция 2
Внимание! По сравнению с предыдущими
запросами номер функции изменился!
57

58.

Стандарт USB:
расшифровка пакета «SETUP 10»
Назначение пакета – запрос дескриптора конфигурации размером 9 байт
pdev->dev.setup_packet == 0х80 0х06 0х00 0х02 0х00 0х00 0х09 0х00
req->bmRequest = *(uint8_t *) (pdev->dev.setup_packet);
0х80
1
направление
передачи:
Device -> Host
req->bRequest
00
Стандартный тип
00000
Device
req->wValue
req->wIndex
req->wLength
= *(uint8_t *) (pdev->dev.setup_packet + 1);
0х06
GET_DESCRIPTOR (0x06)
= SWAPBYTE (pdev->dev.setup_packet + 2);
0х0200
= SWAPBYTE (pdev->dev.setup_packet + 4);
0х0000
= SWAPBYTE (pdev->dev.setup_packet + 6);
0х0009
bmRequestType
1000 0000b
0х80
bRequest
GET_DESCRIPTOR (0x06)
0х06
wIndex
Zero or Language ID
0х00 0х00
wValue
Descriptor Type & Index
0х02
0х00
wLength
Descriptor Length
0х09 0х00
Data
Descriptor
58

59.

Стандарт USB:
ответ на запрос «SETUP 10»
Ответ на запрос «SETUP 4» включает
в себя ответ на «SETUP 10»
59

60.

Стандарт USB:
транзакция «SETUP 11»
конечная точка 0
функция 2
60

61.

Стандарт USB:
расшифровка пакета «SETUP 11»
Назначение пакета – запрос дескриптора конфигурации размером 34 байт
pdev->dev.setup_packet == 0х80 0х06 0х00 0х02 0х00 0х00 0х22 0х00
req->bmRequest = *(uint8_t *) (pdev->dev.setup_packet);
0х80
1
направление
передачи:
Device -> Host
req->bRequest
00
Стандартный тип
00000
Device
req->wValue
req->wIndex
req->wLength
= *(uint8_t *) (pdev->dev.setup_packet + 1);
0х06
GET_DESCRIPTOR (0x06)
= SWAPBYTE (pdev->dev.setup_packet + 2);
0х0200
= SWAPBYTE (pdev->dev.setup_packet + 4);
0х0000
= SWAPBYTE (pdev->dev.setup_packet + 6);
0х0022
bmRequestType
1000 0000b
0х80
bRequest
GET_DESCRIPTOR (0x06)
0х06
wIndex
Zero or Language ID
0х00 0х00
wLength
Descriptor Length
0х22 0х00
wValue
Descriptor Type & Index
0х02
0х00
Data
Descriptor
61

62.

Стандарт USB: ответ на запрос
«SETUP 11»
Ответ на «SETUP 11»
идентичен ответу на «SETUP 4»
62

63.

Стандарт USB:
транзакция «SETUP 12»
конечная точка 0
функция 2
63

64.

Стандарт USB:
расшифровка пакета «SETUP 12»
Назначение пакета – разрешение работы устройства с одновременным заданием
желаемого дескриптора конфигурации, равного 1
pdev->dev.setup_packet == 0х00 0х09 0х01 0х00 0х00 0х00 0х00 0х00
req->bmRequest = *(uint8_t *) (pdev->dev.setup_packet);
0х00
0
направление
передачи:
Host -> Device
req->bRequest
req->wValue
req->wIndex
req->wLength
00
Стандартный тип
00000
Device (получатель)
= *(uint8_t *) (pdev->dev.setup_packet + 1);
0х09
SET_CONFIGURATION (0x09)
= SWAPBYTE (pdev->dev.setup_packet + 2);
0х0001
= SWAPBYTE (pdev->dev.setup_packet + 4);
0х0000
= SWAPBYTE (pdev->dev.setup_packet + 6);
0х0000
bmRequestType
bRequest
0000 0000b
SET_CONFIGURATION (0x09)
0х00
0х09
wIndex
Zero or Language ID
0х00 0х00
wValue
Descriptor Type & Index
0х00
0х01
wLength
Descriptor Length
0х00 0х00
Данный пакет не требует ответа!
64

65.

Стандарт USB:
транзакция «SETUP 13»
конечная точка 0
функция 2
65

66.

Стандарт USB:
расшифровка пакета «SETUP 13»
Назначение пакета – подготовка к запросу класса интерфейса
pdev->dev.setup_packet == 0х21 0х0A 0х00 0х00 0х00 0х00 0х00 0х00
req->bmRequest = *(uint8_t *) (pdev->dev.setup_packet);
0
направление
передачи:
Host -> Device
req->bRequest
req->wValue
req->wIndex
req->wLength
01
Class
0х21
00001
Интерфейс
= *(uint8_t *) (pdev->dev.setup_packet + 1);
0х0A
GET_INTERFACE (0x0A)
= SWAPBYTE (pdev->dev.setup_packet + 2);
0х0000
= SWAPBYTE (pdev->dev.setup_packet + 4);
0х0000
= SWAPBYTE (pdev->dev.setup_packet + 6);
0х0000
bmRequestType
0010 0001b
0х21
bRequest
GET_INTERFACE (0x0A)
0х0A
wIndex
Zero or Language ID
0х00 0х00
wLength
Descriptor Length
0х00 0х00
wValue
Descriptor Type & Index
0х00
0х00
Данный пакет не требует ответа!
66

67.

Стандарт USB:
транзакция «SETUP 14»
конечная точка 0
функция 2
67

68.

Стандарт USB:
расшифровка пакета «SETUP 14»
Назначение пакета – запрос дескриптора отчёта интерфейса
pdev->dev.setup_packet == 0х81 0х06 0х00 0х22 0х00 0х00 0х8A 0х00
req->bmRequest = *(uint8_t *) (pdev->dev.setup_packet);
1
направление
передачи:
Device -> Host
req->bRequest
00
Стандартный тип
0х81
00001
Интерфейс
req->wValue
req->wIndex
req->wLength
= *(uint8_t *) (pdev->dev.setup_packet + 1);
0х06
GET_DESCRIPTOR (0x06)
= SWAPBYTE (pdev->dev.setup_packet + 2);
0х2200
= SWAPBYTE (pdev->dev.setup_packet + 4);
0х0000
= SWAPBYTE (pdev->dev.setup_packet + 6);
0х008A
bmRequestType
1000 0001b
0х81
bRequest
GET_DESCRIPTOR (0x06)
0х06
wIndex
Zero or Language ID
0х00 0х00
wLength
Descriptor Length
0х8A 0х00
wValue
Descriptor Type & Index
0х22
0х00
68

69.

Стандарт USB:
ответ на запрос «SETUP 14»
69

70.

Стандарт USB: ответ на запрос «SETUP 14»
70

71.

Стандарт USB: ответ
на запрос «SETUP 14»
71

72.

Стандарт USB: дескриптор отчёта интерфейса в USBlyzer
72

73.

Программирование USB: передача
данных для первой конечной точки
73

74.

Программирование USB: передача
данных для первой конечной точки
74

75.

Программирование USB:
типы конечных точек и каналов передачи данных
1. Поточный (bulk)
2. Управляющий (control) – конечная точка 0
3. Прерывание (interrupt)
4. Изохронный (isoch)
Каналы с прерыванием могут содержать IN- или OUT-пересылки. При получении
IN-пакета функция может вернуть пакет с данными, NACK-пакет или STALLпакет. Если у функции нет информации, для которой требуется прерывание, то
в фазе передачи данных функция возвращает NACK-пакет. Если работа
конечной точки с прерыванием приостановлена, то функция возвращает
STALL-пакет. При необходимости прерывания функция возвращает
необходимую информацию в фазе передачи данных. Если Host-машина
успешно получила данные, то она посылает ACK-пакет. В противном случае
согласующий пакет хостом не посылается
Изохронные транзакции содержат фазу передачи признака и фазу передачи
данных, но не имеют фазы согласования. Host-машина отсылает IN- или OUTпризнак, после чего в фазе передачи данных конечная точка (для IN-признака)
или Host-машина (для OUT-признака) пересылает данные. Изохронные
транзакции не поддерживают фазу согласования и повторные посылки данных
в случае возникновения ошибок
75

76.

Спасибо за
внимание
English     Русский Правила