Doesn't Windows have a generic CDC driver for emulated serial ports?
Yes (Arduino Uno/etc uses it, for example.) But for windows you still need at least a .inf file to confirm to windows that the particular VID/PID is in fact a CDC device. Or something like that :-(
I'm not sure why USB/Serial devices seem to frequently have their own drivers. I don't recall seeing a lot of flames about the CDC specifications being awful, for example. (However, windows and Mac apparently have different problems dealing with "composite" devices (in general) that include CDC as a component (for example, the TI launchpad wants to define both CDC "comm uart" and custom HID "debug interface", and had assorted problems. Maple wanted to be both CDC and Mass Storage, and that had problems.) Of course, if you use the windows driver, you're also at the mercy of bugs that it may have, without much hope of fixing them yourself...)
I really need to learn more about USB.
You can start with this "USB Design by Example" document made available by FTDI.
http://www.ftdichip.com/Support/Documents/TechnicalPublications/USBDesignByExample.htmIt does have some FTDI-specific references, but it's not bad for something that's free. (One of the annoying thing about this whole FTDI-gate thing is that I used to think that FTDI was one of the better examples of how a complex-peripheral chip company ought to work. Lots of documentation, the features you wanted to have, drivers for many platforms... Sigh.)
After that, there's Jan Axelson's book:
http://janaxelson.com/usbc.htmThere was also an NXP "class" presented at a trade show that I found relatively useful, maybe
? (Hmm. doesn't look like the video came out too good.)
Basically, you go through some relatively exacting "Enumeration" phase that defines to the host what sort of device(s) you have, and then you provide some service routines for reading and providing data for the "endpoints" of those devices.
(although, having read a lot of each of those, but not having actually written any USB code, I'm finding that it looks like there might be a pretty big gap between "theory" and "practice" Sigh.)
(And on a lot of microcontrollers, it looks like the provided solution is "use our bloated general purpose libraries, because USB is obviously too complex for end users to actually write code." Sigh, again.)