Пытаюсь реализовать USB - устройство которое в Windows будет представляться как 2-COM порта.
Один COM - порт реализовал, драйвер использовал стандартный usbser.sys.
Дескрипторы при этом следующие:
Код
DeviceDescriptor CDC1_HS_Device_Descriptor[] =
{
18,
0x01,
USB_VERSION_20,
0x02,
0x00,
0x00,
0x40,
0xABCD,
0xABCD,
USB_RELEASE_NUMBER,
0,
0,
0,
0x01
};
ConfigurationDescriptor CDC1_Standard_Config_Descriptor[] =
{
9,
0x02,
0x43,
0x02,
0x01,
0x00,
0x40,
250
};
InterfaceDescriptor CDC1_HS_Default_Interface_COM_Descriptor[] = //communication interface
{
9,
0x04,
0x00,
0x00,
0x01,
0x02,
0x02,
0x01,
0x00
};
InterfaceDescriptor CDC1_HS_Default_Interface_DATA_Descriptor[] = //data interface
{
9,
0x04,
0x01,
0x00,
0x02,
0x0A,
0x00,
0x00,
0x00
};
CDCFunctionalDescriptor CDC1_Heder_Functional_Descriptor[] = //heder functional descriptor
{
0x05,
0x24,
0x00,
0x00,
0x02
};
CDCFunctionalDescriptor CDC1_Call_Management_Descriptor[] = //call management descriptor
{
0x05,
0x24,
0x01,
0x03,
0x01
};
CDCFunctionalDescriptor CDC1_Abstract_Control_Management_Descriptor[] = //abstract control management descriptor
{
0x04,
0х24,
0x02,
0x06,
};
CDCFunctionalDescriptor CDC1_Union_Interface_Functional_Descriptor[] = //union interface functional descriptor
{
0x05,
0х24,
0x06,
0x00,
0x01
};
EndpointDescriptor CDC1_HS_Interrupt_In2_Descriptor[] =
{
7,
USB_ENDPOINT_DESCRIPTOR_TYPE,
0x82,
0x03,
0x0020,
0x02
};
EndpointDescriptor CDC1_HS_Bulk_Out4_Descriptor[] =
{
7,
USB_ENDPOINT_DESCRIPTOR_TYPE,
0x04,
0x02,
0x0020,
0x00
};
EndpointDescriptor CDC1_HS_Bulk_In4_Descriptor[] =
{
7,
USB_ENDPOINT_DESCRIPTOR_TYPE,
0x84,
0x02,
0x0020,
0x00
};
{
18,
0x01,
USB_VERSION_20,
0x02,
0x00,
0x00,
0x40,
0xABCD,
0xABCD,
USB_RELEASE_NUMBER,
0,
0,
0,
0x01
};
ConfigurationDescriptor CDC1_Standard_Config_Descriptor[] =
{
9,
0x02,
0x43,
0x02,
0x01,
0x00,
0x40,
250
};
InterfaceDescriptor CDC1_HS_Default_Interface_COM_Descriptor[] = //communication interface
{
9,
0x04,
0x00,
0x00,
0x01,
0x02,
0x02,
0x01,
0x00
};
InterfaceDescriptor CDC1_HS_Default_Interface_DATA_Descriptor[] = //data interface
{
9,
0x04,
0x01,
0x00,
0x02,
0x0A,
0x00,
0x00,
0x00
};
CDCFunctionalDescriptor CDC1_Heder_Functional_Descriptor[] = //heder functional descriptor
{
0x05,
0x24,
0x00,
0x00,
0x02
};
CDCFunctionalDescriptor CDC1_Call_Management_Descriptor[] = //call management descriptor
{
0x05,
0x24,
0x01,
0x03,
0x01
};
CDCFunctionalDescriptor CDC1_Abstract_Control_Management_Descriptor[] = //abstract control management descriptor
{
0x04,
0х24,
0x02,
0x06,
};
CDCFunctionalDescriptor CDC1_Union_Interface_Functional_Descriptor[] = //union interface functional descriptor
{
0x05,
0х24,
0x06,
0x00,
0x01
};
EndpointDescriptor CDC1_HS_Interrupt_In2_Descriptor[] =
{
7,
USB_ENDPOINT_DESCRIPTOR_TYPE,
0x82,
0x03,
0x0020,
0x02
};
EndpointDescriptor CDC1_HS_Bulk_Out4_Descriptor[] =
{
7,
USB_ENDPOINT_DESCRIPTOR_TYPE,
0x04,
0x02,
0x0020,
0x00
};
EndpointDescriptor CDC1_HS_Bulk_In4_Descriptor[] =
{
7,
USB_ENDPOINT_DESCRIPTOR_TYPE,
0x84,
0x02,
0x0020,
0x00
};
Конфигурацию отправляю в следующем порядке:
CDC1_Standard_Config_Descriptor[], //9-байт
CDC1_HS_Default_Interface_COM_Descriptor[], //9-байт
CDC1_Heder_Functional_Descriptor[] //5-байт
CDC1_Call_Management_Descriptor[] //5-байт
CDC1_Abstract_Control_Management_Descriptor[] //4-байт
CDC1_Union_Interface_Functional_Descriptor[] //5-байт
CDC1_HS_Interrupt_In2_Descriptor[] //7-байт
CDC1_HS_Default_Interface_DATA_Descriptor[] //9-байт
CDC1_HS_Bulk_Out4_Descriptor[] //7-байт
CDC1_HS_Bulk_In4_Descriptor[] //7-байт
Устанавливаю драйвер и все работает.
Для 2-х COM-портов:
Конфигурацию отправляю в следующем порядке:
CDC1_Standard_Config_Descriptor[], //9-байт
CDC1_HS_Default_Interface_COM_Descriptor[], //9-байт
CDC1_Heder_Functional_Descriptor[] //5-байт
CDC1_Call_Management_Descriptor[] //5-байт
CDC1_Abstract_Control_Management_Descriptor[] //4-байт
CDC1_Union_Interface_Functional_Descriptor[] //5-байт
CDC1_HS_Interrupt_In2_Descriptor[] //7-байт
CDC1_HS_Default_Interface_DATA_Descriptor[] //9-байт
CDC1_HS_Bulk_Out4_Descriptor[] //7-байт
CDC1_HS_Bulk_In4_Descriptor[] //7-байт
CDC2_HS_Default_Interface_COM_Descriptor[], //9-байт
CDC2_Heder_Functional_Descriptor[] //5-байт
CDC2_Call_Management_Descriptor[] //5-байт
CDC2_Abstract_Control_Management_Descriptor[] //4-байт
CDC2_Union_Interface_Functional_Descriptor[] //5-байт
CDC2_HS_Interrupt_In2_Descriptor[] //7-байт
CDC2_HS_Default_Interface_DATA_Descriptor[] //9-байт
CDC2_HS_Bulk_Out4_Descriptor[] //7-байт
CDC2_HS_Bulk_In4_Descriptor[] //7-байт
Теперь используется 4-е интерфейса.
Появляется устройство только драйвер на него поставить не удается.
В каком порядке нужно передавать дескрипторы для 2-х COM - портов?
Сколько интерфейсов при этом используется?
Нужно ли использовать IAD?