[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