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 ________________________________________________
|
//_____ D E F I N I T I O N ________________________________________________
|
||||||
|
|
||||||
/************* COMPOSITE DEVICE DESCRIPTORS (using IAD) **********/
|
/************* 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[] = {
|
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_RNDIS,
|
||||||
USB_CONFIG_ECM_DEBUG,
|
USB_CONFIG_ECM_DEBUG,
|
||||||
USB_CONFIG_RNDIS_DEBUG, //Enable here for macintosh CDC-ECM enumeration
|
|
||||||
USB_CONFIG_ECM,
|
USB_CONFIG_ECM,
|
||||||
USB_CONFIG_EEM,
|
USB_CONFIG_EEM,
|
||||||
#if USB_CONF_STORAGE
|
#if USB_CONF_STORAGE
|
||||||
USB_CONFIG_MS,
|
USB_CONFIG_MS,
|
||||||
#endif
|
#endif
|
||||||
};
|
};
|
||||||
|
#endif /* USB_CONF_MACINTOSH */
|
||||||
|
|
||||||
// usb_user_device_descriptor
|
// usb_user_device_descriptor
|
||||||
FLASH S_usb_device_descriptor usb_dev_desc_composite =
|
FLASH S_usb_device_descriptor usb_dev_desc_composite =
|
||||||
|
|
|
@ -65,10 +65,15 @@
|
||||||
|
|
||||||
// USB Device descriptor
|
// USB Device descriptor
|
||||||
#define USB_SPECIFICATION 0x0200
|
#define USB_SPECIFICATION 0x0200
|
||||||
|
#if 1
|
||||||
#define COMPOSITE_DEVICE_CLASS 0x02 // Misc
|
#define COMPOSITE_DEVICE_CLASS 0x02 // Misc
|
||||||
#define COMPOSITE_DEVICE_SUB_CLASS 0x00 // Common
|
#define COMPOSITE_DEVICE_SUB_CLASS 0x00 // Common
|
||||||
#define COMPOSITE_DEVICE_PROTOCOL 0x00 // IAD
|
#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_CLASS 0x02 // CDC ACM
|
||||||
#define NETWORK_DEVICE_SUB_CLASS 0x02 //
|
#define NETWORK_DEVICE_SUB_CLASS 0x02 //
|
||||||
|
|
|
@ -307,7 +307,7 @@ void usb_get_string_descriptor_sram(U8 string_type) {
|
||||||
Usb_send_control_in();
|
Usb_send_control_in();
|
||||||
}
|
}
|
||||||
|
|
||||||
bail:
|
//bail:
|
||||||
if(Is_usb_receive_out()) {
|
if(Is_usb_receive_out()) {
|
||||||
//! abort from Host
|
//! abort from Host
|
||||||
Usb_ack_receive_out();
|
Usb_ack_receive_out();
|
||||||
|
@ -404,7 +404,7 @@ void usb_get_string_descriptor(U8 string_type) {
|
||||||
Usb_send_control_in();
|
Usb_send_control_in();
|
||||||
}
|
}
|
||||||
|
|
||||||
bail:
|
//bail:
|
||||||
|
|
||||||
if(Is_usb_receive_out()) {
|
if(Is_usb_receive_out()) {
|
||||||
//! abort from Host
|
//! abort from Host
|
||||||
|
@ -441,10 +441,12 @@ void usb_get_descriptor(void)
|
||||||
U8 descriptor_type ;
|
U8 descriptor_type ;
|
||||||
U8 string_type ;
|
U8 string_type ;
|
||||||
U8 dummy;
|
U8 dummy;
|
||||||
|
U8 byteswereread;
|
||||||
|
|
||||||
zlp = FALSE; /* no zero length packet */
|
zlp = FALSE; /* no zero length packet */
|
||||||
string_type = Usb_read_byte(); /* read LSB of wValue */
|
string_type = Usb_read_byte(); /* read LSB of wValue */
|
||||||
descriptor_type = Usb_read_byte(); /* read MSB of wValue */
|
descriptor_type = Usb_read_byte(); /* read MSB of wValue */
|
||||||
|
byteswereread = 0;
|
||||||
|
|
||||||
switch (descriptor_type)
|
switch (descriptor_type)
|
||||||
{
|
{
|
||||||
|
@ -464,17 +466,22 @@ void usb_get_descriptor(void)
|
||||||
default:
|
default:
|
||||||
dummy = Usb_read_byte();
|
dummy = Usb_read_byte();
|
||||||
dummy = Usb_read_byte();
|
dummy = Usb_read_byte();
|
||||||
dummy = Usb_read_byte();
|
LSBwLength = Usb_read_byte();
|
||||||
dummy = Usb_read_byte();
|
MSBwLength = Usb_read_byte();
|
||||||
if( usb_user_get_descriptor(descriptor_type, string_type)==FALSE )
|
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;
|
return;
|
||||||
|
}
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
if (byteswereread==0) {
|
||||||
dummy = Usb_read_byte(); //!< don't care of wIndex field
|
dummy = Usb_read_byte(); //!< don't care of wIndex field
|
||||||
dummy = Usb_read_byte();
|
dummy = Usb_read_byte();
|
||||||
LSBwLength = Usb_read_byte(); //!< read wLength
|
LSBwLength = Usb_read_byte(); //!< read wLength
|
||||||
MSBwLength = Usb_read_byte();
|
MSBwLength = Usb_read_byte();
|
||||||
|
}
|
||||||
|
|
||||||
Usb_ack_receive_setup() ; //!< clear the receive setup flag
|
Usb_ack_receive_setup() ; //!< clear the receive setup flag
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue