I've been battling the Tsunami for a few days now - apparently I could program it via the bootloader and it did execute the downloaded program but no serial communication whatsoever was possible once it was up and running. I've tested it on three different Windows XP computers with the same result - the COM port shows up alright, but it doesn't work. Quick tests on other people's machines confirmed that this does not happen on Linux, nor on Windows 7. What I had no way of knowing is that it could not possibly work on those XP machines specifically because they are all Windows XP SP2...
Quick note: since no-one in their right mind would still run XP SP2 instead of SP3 if they had a choice, brushing people off with "just upgrade already, idiot!" is deeply counter-productive, a useless piece of advice and also quite insulting. So let's not go there. Now back to our regular programming...
Soooo, countless captured and painstakingly analysed USB descriptors later it started becoming obvious there was something wrong with the descriptors, and I eventually found the post at [1], which neatly explains that the ability to handle CDC serial devices within a composite USB device (like the Leonardo is on which the Tsunami is based) only came about with Windows XP SP3, which is why Leonardos (and some other similar duinos) completely fail to work under XP SP2 - a tiny "detail" even the official Arduino site neglects to mention, basically, anywhere. The issue is the (IMHO useless) HID device bundled in together with the CDC serial port - without the "composite" / HID thing, the CDC itself would work fine. Which suggest the solution - also described at [1] - just tear out the @#$$#@^% HID part...!
Essentially, you need to look up the files "CDC.cpp", "USBDesc.h", "USBCore.h" and "USBCore.cpp" residing probably under "\hardware\arduino\avr\cores\arduino" in your Arduino installation folder, and make a few small changes:
in USBDesc.h:
#define CDC_ENABLED
//#define HID_ENABLED
...
#if defined CDC_ENABLED && defined HID_ENABLED
#define COMPOSITE_DEVICE
#endif
in CDC.cpp:
const CDCDescriptor _cdcInterface =
{
#ifdef COMPOSITE_DEVICE
D_IAD(0,2,CDC_COMMUNICATION_INTERFACE_CLASS,CDC_ABSTRACT_CONTROL_MODEL,1),
#endif
in USBCore.h:
#ifdef COMPOSITE_DEVICE
IADDescriptor iad; // Only needed on compound device
#endif
in USBCore.cpp:
const DeviceDescriptor USB_DeviceDescriptor =
D_DEVICE(DEVICE_CLASS,0x00,0x00,64,USB_VID,USB_PID,0x100,IMANUFACTURER,IPRODUCT,0,1);
const DeviceDescriptor USB_DeviceDescriptorA =
D_DEVICE(DEVICE_CLASS,0x00,0x00,64,USB_VID,USB_PID,0x100,IMANUFACTURER,IPRODUCT,0,1);
That's it - it's not elegant, it's a hack, and obviously no project (Tsunami or other) using this Arduino installation will now include HID support (unless you temporarily uncomment again the "HID_ENABLED" part), but the plain CDC device this creates should work fine even on XP SP2 - it sure works fine for me.
Good luck...!
PS - if you're testing with a third-party terminal, DO make sure DTR gets activated when you use it or else you'll still see the exact same big fat nothing. Just sayin'...
[1] - http://forum.arduino.cc/index.php?topic=137032.0
Wow - fantastic debug job, and I'm sorry you had so much trouble with it.
Have you considered submitting a patch to Arduino? At least that way there's a chance you might be able to just stick a #define in your sketch instead of needing to customize the core yourself.
Thanks, no problem - I do really like my Tsunami... I don't intend to propose a patch though, partially because this workaround has been sitting on their own forums for years now - if it didn't get picked up yet, there just isn't interest on their part in patching such an apparently obscure issue; the other reason is that it's been quite a while since I was juggling USB stuff and I'm not quite sure the change in "USBCore.cpp" is quite legit for all cases and boards in general - as you can see, they had two (originally slightly different) descriptors defined, which I redefined to be identical (otherwise you still get a composite device) so I kinda shunted something there; I can't follow what their reasoning behind that was so I can't really propose a "proper" fix...