Здравствуйте, ega23, Вы писали:
E>Привет всем!
E>Исходные данные: Разработан некий хитрый device — считыватель Proximity карт. Вся его задача по запросу извне выдавать код карты (4 байта). Устройство подключается к USB.
E>Теперь, собственно, вопросы.
E>1. Каким образом составить DeviceDescriptor и ReportDescriptor, т.е. какие поля обязательны, а в какие можно нули проставить?
E>2. Нужен ли для этого устройства собственный драйвер, или можно воспользоваться чем-нибудь стандартным, например hid.sys?
E>В принципе, эти вопросы основные. Для меня это дело абсолютно новое (до этого с БД работал), поэтому совершенно непонятно с чего начать. Электронщику, который это устройство разрабатывал, нужно прошить в чип дескрипторы, а я его этими дескрипторами держу.
E>Буду рад любой информации.
1.Форматы всех дескрипторов описаны в спецификации USB (
www.usb.org).
В SDK к USB-контроллеру обычно бывают примеры прошивок, например для USBN9602
эти дескрипторы заполняются так:
const byte DEV_DESC[] = {DEV_LENGTH, /*length of this desc. */
DEVICE, /*DEVICE descriptor */
0x00,0x01, /*spec rev level (BCD) */
0x00, /*device class */
0x00, /*device subclass */
0x00, /*device protocol */
0x08, /*max packet size */
0x00,0x04, /*National's vendor ID */
0x5B,0xC3, /*National's product ID */
0x40,0x01, /*National's revision ID */
MFG_STR_OFS, /*index of manuf. string */
PID_STR_OFS, /*index of prod. string */
0, /*index of ser. # string */
0x01 /*number of configs. */
};
unsigned char ReportDescriptor[59] = {
0x05, 0x01, /* USAGE_PAGE (Generic Desktop) */
0x15, 0x00, /* LOGICAL_MINIMUM (0) */
0x09, 0x04, /* USAGE (Joystick) */
0xa1, 0x01, /* COLLECTION (Application) */
0x15, 0x00, /* LOGICAL_MINIMUM (0) */
0x26, 0xff, 0x00, /* LOGICAL_MAXIMUM (255) */
0x75, 0x08, /* REPORT_SIZE (8) */
0x95, 0x01, /* REPORT_COUNT (1) */
0x81, 0x03, /* INPUT (Cnst,Var,Abs) */
0x05, 0x01, /* USAGE_PAGE (Generic Desktop) */
0x09, 0x01, /* USAGE (Pointer) */
0xa1, 0x00, /* COLLECTION (Physical) */
0x09, 0x30, /* USAGE (X) */
0x09, 0x31, /* USAGE (Y) */
0x95, 0x02, /* REPORT_COUNT (2) */
0x81, 0x02, /* INPUT (Data,Var,Abs) */
0xc0, /* END_COLLECTION */
0x15, 0x00, /* LOGICAL_MINIMUM (0) */
0x25, 0x01, /* LOGICAL_MAXIMUM (1) */
0x75, 0x01, /* REPORT_SIZE (1) */
0x95, 0x04, /* REPORT_COUNT (4) */
0x81, 0x03, /* INPUT (Cnst,Var,Abs) */
0x05, 0x09, /* USAGE_PAGE (Button) */
0x19, 0x01, /* USAGE_MINIMUM (Button 1) */
0x29, 0x04, /* USAGE_MAXIMUM (Button 4) */
0x55, 0x00, /* UNIT_EXPONENT (0) */
0x65, 0x00, /* UNIT (None) */
0x95, 0x04, /* REPORT_COUNT (4) */
0x81, 0x02, /* INPUT (Data,Var,Abs) */
0xc0 /* END_COLLECTION */
};
2. Для HID-устройства можно обойтись без написания драйвера, пример работы с HID-устройством из user mode есть в DDK