diff --git a/cpu/avr/dev/usb/usb_descriptors.c b/cpu/avr/dev/usb/usb_descriptors.c index 78d6c6b66..f934440b7 100644 --- a/cpu/avr/dev/usb/usb_descriptors.c +++ b/cpu/avr/dev/usb/usb_descriptors.c @@ -146,7 +146,6 @@ caps /* bmCapabilities */ masterInterface, /* bMasterInterface, The controlling interface for the union (bInterfaceNumber of a Communication or Data Class interface in this configuration) */ \ slaveInterface /* bSlaveInterface0, The controlled interace in the union (bInterfaceNumber of an interface in this configuration) */ \ - #define RNDIS_INTERFACES \ USB_INTERFACEDESC( \ INTERFACE0_NB, \ @@ -177,8 +176,6 @@ USB_INTERFACEDESC( \ USB_ENDPOINT(ENDPOINT_NB_2,EP_ATTRIBUTES_2,EP_SIZE_2,EP_INTERVAL_2), \ USB_ENDPOINT(ENDPOINT_NB_3,EP_ATTRIBUTES_3,EP_SIZE_3,EP_INTERVAL_3) - - #define CDC_SERIAL_INTERFACES \ USB_INTERFACEDESC( \ INTERFACE2_NB, \ @@ -208,10 +205,6 @@ USB_INTERFACEDESC( \ USB_ENDPOINT(ENDPOINT_NB_5,EP_ATTRIBUTES_5,EP_SIZE_5,EP_INTERVAL_5), \ USB_ENDPOINT(ENDPOINT_NB_6,EP_ATTRIBUTES_6,EP_SIZE_6,EP_INTERVAL_6) - - - - #define CDC_EEM_INTERFACES \ USB_INTERFACEDESC( \ EEM_INTERFACE0_NB, \ @@ -295,26 +288,43 @@ USB_INTERFACEDESC( \ //This doesn't seem to hurt anything but beware, system corruption is //a possibility. #if USB_CONF_MACINTOSH +/* Prefer CDC-ECM network enumeration (Macintosh, linux) */ FLASH uint8_t usb_dev_config_order[] = { - USB_CONFIG_ECM_DEBUG, //Prefer CDC-ECM network enumeration + USB_CONFIG_RNDIS, //windows gets networking only (if not here gets serial only) +#if USB_CONF_SERIAL + USB_CONFIG_ECM_DEBUG, //mac, linux get networking and serial port +#endif USB_CONFIG_ECM, +#if USB_CONF_SERIAL USB_CONFIG_RNDIS_DEBUG, - USB_CONFIG_RNDIS, +#endif +// USB_CONFIG_RNDIS, USB_CONFIG_EEM, #if USB_CONF_STORAGE USB_CONFIG_MS, #endif }; #else +/* Prefer RNDIS network enumeration (Windows, linux) */ FLASH uint8_t usb_dev_config_order[] = { - USB_CONFIG_RNDIS_DEBUG, //Prefer RNDIS network enumeration + +// USB_CONFIG_ECM, //windows doesnt like this here, will not go on to RNDIS +#if USB_CONF_SERIAL + USB_CONFIG_RNDIS_DEBUG, +#else USB_CONFIG_RNDIS, +#endif +#if 0 //XP may have a problem with these extra configurations + USB_CONFIG_RNDIS, +#if USB_CONF_SERIAL USB_CONFIG_ECM_DEBUG, +#endif USB_CONFIG_ECM, USB_CONFIG_EEM, #if USB_CONF_STORAGE USB_CONFIG_MS, #endif +#endif }; #endif /* USB_CONF_MACINTOSH */ @@ -334,7 +344,8 @@ FLASH S_usb_device_descriptor usb_dev_desc_composite = , USB_STRING_MAN , USB_STRING_PRODUCT , USB_STRING_SERIAL -, (sizeof(usb_dev_config_order)/sizeof(*usb_dev_config_order)) +, sizeof(usb_dev_config_order) +//, (sizeof(usb_dev_config_order)/sizeof(*usb_dev_config_order)) //TODO:was this right? }; @@ -573,8 +584,9 @@ FLASH S_usb_language_id usb_user_language_id = { PGM_VOID_P Usb_get_dev_desc_pointer(void) { +#if 1 return &(usb_dev_desc_composite.bLength); -/* +#else //these are all the same length if (usb_mode == rndis_only) return &(usb_dev_desc_network.bLength); @@ -585,15 +597,15 @@ PGM_VOID_P Usb_get_dev_desc_pointer(void) return &(usb_dev_desc_eem.bLength); return &(usb_dev_desc_mass.bLength); -*/ +#endif } U8 Usb_get_dev_desc_length(void) { +#if 1 return sizeof(usb_dev_desc_composite); -/* - +#else //these are all the same size if (usb_mode == rndis_only) return sizeof(usb_dev_desc_network); @@ -604,7 +616,7 @@ U8 Usb_get_dev_desc_length(void) return sizeof(usb_dev_desc_eem); return sizeof(usb_dev_desc_mass); -*/ +#endif } diff --git a/cpu/avr/dev/usb/usb_descriptors.h b/cpu/avr/dev/usb/usb_descriptors.h index 328644649..f5648ebf7 100644 --- a/cpu/avr/dev/usb/usb_descriptors.h +++ b/cpu/avr/dev/usb/usb_descriptors.h @@ -65,11 +65,12 @@ // USB Device descriptor #define USB_SPECIFICATION 0x0200 -#if 1 +#if USB_CONF_MACINTOSH #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 +#else //Windows wants these for composite device +//Above seems to work for Vista and Win7 but XP and Ubuntu 904 might need the old values #define COMPOSITE_DEVICE_CLASS 0xEF // Misc #define COMPOSITE_DEVICE_SUB_CLASS 0x02 // Common #define COMPOSITE_DEVICE_PROTOCOL 0x01 // IAD @@ -89,8 +90,17 @@ #define EP_CONTROL_LENGTH 64 #define VENDOR_ID 0x03EB // Atmel vendor ID = 03EBh + +#if USB_CONF_MACINTOSH +//A different product ID avoids instant windows corruption when it tries to use the cached drivers +//TODO:Get some valid ID's from Atmel +#define COMPOSITE_PRODUCT_ID 0x9921 //Product ID for composite device +#define NETWORK_PRODUCT_ID 0x9919 //Product ID for just CDC-ECM device +#else #define COMPOSITE_PRODUCT_ID 0x2021 //Product ID for composite device #define NETWORK_PRODUCT_ID 0x2019 //Product ID for just RNDIS device +#endif + #define MASS_PRODUCT_ID 0x202F //Product ID for mass storage #define RELEASE_NUMBER 0x1000 @@ -229,7 +239,6 @@ enum { #define EP_SIZE_6 0x20 #define EP_INTERVAL_6 0x01 - /*** Mass Storage ***/ #define MS_INTERFACE_NB 0 @@ -280,7 +289,6 @@ enum { #define EEM_EP_SIZE_2 0x40 //64 byte max size #define EEM_EP_INTERVAL_2 0x01 - /******* ECM Configuration *******/ // Interface 0 descriptor diff --git a/platform/avr-ravenusb/contiki-conf.h b/platform/avr-ravenusb/contiki-conf.h index e4dc8ca4f..7150208a8 100644 --- a/platform/avr-ravenusb/contiki-conf.h +++ b/platform/avr-ravenusb/contiki-conf.h @@ -184,16 +184,17 @@ extern void mac_log_802_15_4_rx(const uint8_t* buffer, size_t total_len); /* ************************************************************************** */ /* Set USB_CONF_MACINTOSH to prefer CDC-ECM+DEBUG enumeration for Mac/Linux * Leave undefined to prefer RNDIS+DEBUG enumeration for Windows/Linux - * TODO:Serial port will enumerate in all cases and prevent falling through to + * TODO:Serial port would enumerate in all cases and prevent falling through to * the supported network interface if USB_CONF_MACINTOSH is used with Windows - * or vice versa. If Windows has previously cached the RNDIS driver for the stick - * it will attempt to use it and give "device can not start" error. - * This doesn't seem to hurt anything but can potentially damage the OS! + * or vice versa. The Mac configuration is set up to still enumerate as RNDIS-ONLY + * on Windows (without the serial port). + * At present the Windows configuration will not enumerate on the Mac at all, + * since it wants a custom descriptor for USB composite devices. */ #define USB_CONF_MACINTOSH 0 /* Set USB_CONF_SERIAL to enable the USB serial port that allows control of the - * run-time configuration (COMx on Windows, ttyACMx on Linux, tty.usbx on Mac) + * run-time configuration (COMx on Windows, ttyACMx on Linux, tty.usbmodemx on Mac) * Debug printfs will go to this port unless USB_CONF_RS232 is set. */ #define USB_CONF_SERIAL 1 @@ -201,8 +202,9 @@ extern void mac_log_802_15_4_rx(const uint8_t* buffer, size_t total_len); /* RS232 debugs have less effect on network timing and are less likely * to be dropped due to buffer overflow. Only tx is implemented at present. * The tx pad is the middle one behind the jackdaw leds. + * RS232 output will work with or without enabling the USB serial port */ -#define USB_CONF_RS232 1 +#define USB_CONF_RS232 0 /* Disable mass storage enumeration for more program space */ //#define USB_CONF_STORAGE 1 /* TODO: Mass storage is currently broken */