[Any] idea is dead without a good application for it. So California Dreamin USB virtual peripheral could be a very nice sample of academic research, but hardly anybody is going to build a keyboard or mouse using it. I have been thinking for a while what to do with it as well. First project that came to my mind was building a hardware key logger for USB keyboards, something like www.keyghost.com, built for PS2 protocol using PIC16F877. It was quite simple to implement USB part using SX, serial EEPROM and a few switching ICs. Furthermore I found out that built-in features of SX MCU would help to create a device able to work not only with pure low-speed USB keyboards, but also composite, built-in-hub, things, hence covering all existing systems (SUN, Mac, PC). Recording keystrokes is fun, but if we can do that, why not go further and try to record all low-speed USB traffic. No problem for SX again, problem for the memory. Serial EEPROM is just to slow to handle it. Solution was www.ramtron.com FRAM with 1MHz two-wire interface (let me pay credit here to www.svtehs.com, who happens to advertise it). Finally California Dreamin found a real life application in the worlds smallest low-speed USB analyzer Atapchi (stands for a small fruit in Singapore, tastes like apricot). I hope you find this project interesting (mail your questions to chinook at pacific.net.sg)
The list of MCUs you can use with Atapchi (not full)
Input, recording low-speed USB traffic. Atapchi is plugged into a USB self-powered hub, a USB repeater is plugged into Atapchi, device under development is plugged into the repeater. All traffic from/to the device is recorded.
Output, downloading the data. Atapchi is plugged into a USB repeater, the repeater is plugged into a self-powered hub. Atapchi enumerates as a generic USB keyboard and types memory content into any text editor.
Device is the mouse you see on the picture above (Justy UMN-05 SG). MCU used is omnipresent Cypress CY7C63001A. Total listing length is 1083 lines.
reset eop 060 0001 00 0 setup 0002 data0 [ bb 29 ] 80 06 00 01 00 00 40 00 0003 ack eop 001 0004 00 0 in 0005 data1 [ c8 e7 ] 12 01 00 01 00 00 00 08 0006 ack eop 002 0007 00 0 out 0008 data1 [ 00 00 ] zero-length 0009 ack reset eop 043 0010 00 0 setup 0011 data0 [ 57 85 ] 00 05 05 00 00 00 00 00 0012 ack eop 001 0013 00 0 in 0014 data1 [ 00 00 ] zero-length 0015 ack eop 014 0016 05 0 setup 0017 data0 [ 07 2f ] 80 06 00 01 00 00 12 00 0018 ack eop 001 0019 05 0 in 0020 data1 [ c8 e7 ] 12 01 00 01 00 00 00 08 0021 ack eop 001 0022 05 0 in 0023 data0 [ 7e 33 ] 58 04 03 00 00 00 01 02 0024 ack