Similar presentations:
Программирование 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: дескриптор отчёта интерфейса в USBlyzer72
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.
Спасибо завнимание