Люди добрые мы сами не местные... Эх... Не так начал...
В общем проблема в следующем - делаю некое устройство в авто на LPC2378. Само устройство будет общаться с компьютером через HID (тут все работает), плюс на это устройство заведен GPS, который устройство использует для синхронизации времени. Но ГПС также нужен на комьютере (не ставить же два). Делаю на LPC2378 составное устройство CDC serial + HID. Взял пример USB для KEIL (bundle LPC23XX_.R5/USBDEV v1.10) и немного дописал его.
На сегодняшний день устройство нормально проходит enumeration, в системе появляется HID устройство и дополнительный ком-порт (на хосте стоит Windows XP-SP3 со всеми последними обновлениями). Однако при попытке открыть устройство выдается "Не удается открыть COMx. Проверьте параметры порта."
При этом при подключении провода usb проходят 1 запрос GET_LINE_CODING и сразу следом за ним SET_LINE_CONTROL_STATE. При попытке подключения к com порту с помощью hiperterminal проходят 4! запроса GET_LINE_CODING, потом SET_LINE_CODING c параметрами spd=0, char=0, Par=0, DB=0 затем еще три GET_LINE_CODING, затем SET_LINE_CODING с параметрами spd=4800, char=0, Par=0, DB=8 (т.е. те, которые я указал при подключении), потом GET_LINE_CODING и наконец SET_LINE_CONTROL_STATE.
Если бы был лог рабочего CDC устройства снятый каким-нибуть USB сниффером, можно было бы посмотреть что я делаю не так. Но лога нету, а я уже всю голову сломал пытаясь понять что неправильно. Подозреваю, что хосту неверно отдается инфа по GET_LINE_CODING.
Код обработки запросов в EP0 обработчике такой:
CODE
if (SetupPacket.wIndex.WB.L == USB_CDC_IF_NUM)
{
switch (SetupPacket.bRequest)
{
case SET_LINE_CODING:
memcpy((BYTE *)&LineCoding, EP0Data.pData, 7);
USB_StatusInStage();
goto class_ok;
case GET_LINE_CODING:
memcpy(EP0Buf, (BYTE *)&LineCoding, 7);
EP0Data.pData = EP0Buf;
EP0Data.Count = 7;
USB_DataInStage();
goto class_ok;
case SET_CONTROL_LINE_STATE:
USB_StatusInStage();
goto class_ok;
// Unhandled request
default:
printf("Unhandled CDC request %d\n", SetupPacket.bRequest);
}
}
SysNucleus USBTrace показывает вот такую картинку:
Структура LineCoding вроде правильно передается...