Fix windows COM port enumeration
This commit is contained in:
parent
00a000cca0
commit
7be7a34bbb
3 changed files with 43 additions and 14 deletions
|
@ -288,18 +288,35 @@ USB_INTERFACEDESC( \
|
|||
//_____ D E F I N I T I O N ________________________________________________
|
||||
|
||||
/************* COMPOSITE DEVICE DESCRIPTORS (using IAD) **********/
|
||||
|
||||
//TODO:Serial port enumeration will prevent falling through to the
|
||||
//supported network on Mac or Windows. Linux will take either.
|
||||
//Once Windows loads the RNDIS driver it will use it on a subsequent
|
||||
//Mac enumeration, and the device will fail to start.
|
||||
//This doesn't seem to hurt anything but beware, system corruption is
|
||||
//a possibility.
|
||||
#if USB_CONF_MACINTOSH
|
||||
FLASH uint8_t usb_dev_config_order[] = {
|
||||
// USB_CONFIG_RNDIS_DEBUG, //Enable here for Windows COM port debugging? (USB_CONF_CDC=1)
|
||||
USB_CONFIG_ECM_DEBUG, //Prefer CDC-ECM network enumeration
|
||||
USB_CONFIG_ECM,
|
||||
USB_CONFIG_RNDIS_DEBUG,
|
||||
USB_CONFIG_RNDIS,
|
||||
USB_CONFIG_EEM,
|
||||
#if USB_CONF_STORAGE
|
||||
USB_CONFIG_MS,
|
||||
#endif
|
||||
};
|
||||
#else
|
||||
FLASH uint8_t usb_dev_config_order[] = {
|
||||
USB_CONFIG_RNDIS_DEBUG, //Prefer RNDIS network enumeration
|
||||
USB_CONFIG_RNDIS,
|
||||
USB_CONFIG_ECM_DEBUG,
|
||||
USB_CONFIG_RNDIS_DEBUG, //Enable here for macintosh CDC-ECM enumeration
|
||||
USB_CONFIG_ECM,
|
||||
USB_CONFIG_EEM,
|
||||
#if USB_CONF_STORAGE
|
||||
USB_CONFIG_MS,
|
||||
#endif
|
||||
};
|
||||
#endif /* USB_CONF_MACINTOSH */
|
||||
|
||||
// usb_user_device_descriptor
|
||||
FLASH S_usb_device_descriptor usb_dev_desc_composite =
|
||||
|
|
|
@ -65,10 +65,15 @@
|
|||
|
||||
// USB Device descriptor
|
||||
#define USB_SPECIFICATION 0x0200
|
||||
|
||||
#if 1
|
||||
#define COMPOSITE_DEVICE_CLASS 0x02 // Misc
|
||||
#define COMPOSITE_DEVICE_SUB_CLASS 0x00 // Common
|
||||
#define COMPOSITE_DEVICE_PROTOCOL 0x00 // IAD
|
||||
#else //Windows wants these for composite device, but above seems to work anyway
|
||||
#define COMPOSITE_DEVICE_CLASS 0xEF // Misc
|
||||
#define COMPOSITE_DEVICE_SUB_CLASS 0x02 // Common
|
||||
#define COMPOSITE_DEVICE_PROTOCOL 0x01 // IAD
|
||||
#endif
|
||||
|
||||
#define NETWORK_DEVICE_CLASS 0x02 // CDC ACM
|
||||
#define NETWORK_DEVICE_SUB_CLASS 0x02 //
|
||||
|
|
|
@ -307,7 +307,7 @@ void usb_get_string_descriptor_sram(U8 string_type) {
|
|||
Usb_send_control_in();
|
||||
}
|
||||
|
||||
bail:
|
||||
//bail:
|
||||
if(Is_usb_receive_out()) {
|
||||
//! abort from Host
|
||||
Usb_ack_receive_out();
|
||||
|
@ -404,7 +404,7 @@ void usb_get_string_descriptor(U8 string_type) {
|
|||
Usb_send_control_in();
|
||||
}
|
||||
|
||||
bail:
|
||||
//bail:
|
||||
|
||||
if(Is_usb_receive_out()) {
|
||||
//! abort from Host
|
||||
|
@ -441,10 +441,12 @@ void usb_get_descriptor(void)
|
|||
U8 descriptor_type ;
|
||||
U8 string_type ;
|
||||
U8 dummy;
|
||||
U8 byteswereread;
|
||||
|
||||
zlp = FALSE; /* no zero length packet */
|
||||
string_type = Usb_read_byte(); /* read LSB of wValue */
|
||||
descriptor_type = Usb_read_byte(); /* read MSB of wValue */
|
||||
byteswereread = 0;
|
||||
|
||||
switch (descriptor_type)
|
||||
{
|
||||
|
@ -464,17 +466,22 @@ void usb_get_descriptor(void)
|
|||
default:
|
||||
dummy = Usb_read_byte();
|
||||
dummy = Usb_read_byte();
|
||||
dummy = Usb_read_byte();
|
||||
dummy = Usb_read_byte();
|
||||
if( usb_user_get_descriptor(descriptor_type, string_type)==FALSE )
|
||||
LSBwLength = Usb_read_byte();
|
||||
MSBwLength = Usb_read_byte();
|
||||
byteswereread=1;
|
||||
if( usb_user_get_descriptor(descriptor_type, string_type)==FALSE ) {
|
||||
Usb_enable_stall_handshake(); //TODO:is this necessary?
|
||||
Usb_ack_receive_setup(); //TODO:is this necessary?
|
||||
return;
|
||||
}
|
||||
break;
|
||||
}
|
||||
|
||||
dummy = Usb_read_byte(); //!< don't care of wIndex field
|
||||
dummy = Usb_read_byte();
|
||||
LSBwLength = Usb_read_byte(); //!< read wLength
|
||||
MSBwLength = Usb_read_byte();
|
||||
if (byteswereread==0) {
|
||||
dummy = Usb_read_byte(); //!< don't care of wIndex field
|
||||
dummy = Usb_read_byte();
|
||||
LSBwLength = Usb_read_byte(); //!< read wLength
|
||||
MSBwLength = Usb_read_byte();
|
||||
}
|
||||
|
||||
Usb_ack_receive_setup() ; //!< clear the receive setup flag
|
||||
|
||||
|
|
Loading…
Reference in a new issue