Итак, за сутки неплохо продвинулся вперед, детально изучил дескрипторы и вообще что к чему. Многие вопросы отпали сами собой.
Вот, наваял файлик с дескрипторами будущего девайса. Всего 4 рабочих эндпоинта. Остались вопросы по-мелочи: обязательно ли делать строковые дескрипторы и правильно ли я инициализировал порядок работы vendor specific? Никак не могу найти где прочитать про interface protocol, он ведь тоже определен для классов?
Код
typedef unsigned char BYTE;
const BYTE DEVICE_DESCRIPTOR [] = {
0x12, //0 0-17 (18) размер в байтах
0x01, //1 дескриптор устр-ва
0x02, 0x00, //2 USB 2.0
0x00, //4 см. дескриптор интерфеса
0x00, //5 см. дескриптор интерфеса
0x00, //6 см. дескриптор интерфеса
0x20, //7 размер EP 0 32 байта
0x12, 0xab, //8 VID с потолка
0x00, 0x01, //10 PID с потолка
0x00, 0x01, //12 Version 1.0
0x00, //14 нет
0x00, //15 нет
0x00, //16 нет
0x01 //17 1 конф-ия
};
const BYTE CONFIG_DESCRIPTOR [] = {
0x09, // 9 байт
0x02, // дескр-р конф-ии
0x00,0x2e, // всего байт возвращает - 4x7 (EP) + 2x9 = 46
0x01, // 1 интерфес
0x01, // "1"
0x00, // нет
0xc0, // self-powered
0x96 // 300mA
};
const BYTE INTERFACE_DESCRIPTOR [] = {
0x09, // 9 байт
0x04, // дескр-р инт-са
0x00, // интерфес "0"
0x00, // альт. интерфейс "0"
0x04, // 4 ендпоинта: EP1 DIN interrupt, EP1 DOUT interrupt, EP2 DOUT interrupt, EP2 DIN control
0xff, // vendor specific class
0x01, // subclass "1"
0xff, // vendor specific protocol
0x00 // нет
};
const BYTE ENDPOINT1_IN_DESCRIPTOR [] = {
0x07, // 7 байт
0x05, // дескр-р ендпоинта
0x81, // EP1 IN, основный данные
0x03, // interrupt
0x00, 0x40, // размер 64 байта
0x64 // каждые 100 мс
};
const BYTE ENDPOINT1_OUT_DESCRIPTOR [] = {
0x07, // 7 байт
0x05, // дескр-р ендпоинта
0x01, // EP1 OUT, запись данных в ус-во
0x03, // interrupt
0x00, 0x40, // размер 64 байта
0x64 // каждые 100 мс
};
const BYTE ENDPOINT2_IN_DESCRIPTOR [] = {
0x07, // 7 байт
0x05, // дескр-р ендпоинта
0x82, // EP2 IN, прочие данные
0x03, // interrupt
0x00, 0x40, // размер 64 байта
0x64 // каждые 100 мс
};
const BYTE ENDPOINT2_OUT_DESCRIPTOR [] = {
0x07, // 7 байт
0x05, // дескр-р ендпоинта
0x02, // EP2 OUT, команды
0x00, // control type
0x00, 0x40, // размер 64 байта
0x32 // каждые 40 мс
};
Нижайше прошу кинуть помидором в то место, где я накосячил