53b939ce5fb03207d37faaa073cc63421ea5e7b9
[goodfet] / firmware / apps / plugins / ps2.c
1 /*! \file glitch.c
2   \author Travis Goodspeed
3   \brief PS2 Timing Monitor for GoodFET
4   
5   This module spies on PS/2.  For now, it just reports the
6   inter-character timing information.
7 */
8
9 #include "platform.h"
10 #include "command.h"
11 #include "ps2.h"
12 #include "jtag.h"
13
14
15 u16 mclock=0;
16 u32 clock=0;
17
18 // Timer A0 interrupt service routine
19 interrupt(TIMERA0_VECTOR) Timer_A (void)
20 {
21   if(!clock++)
22     mclock++;
23   return;
24 }
25
26
27
28 /** Pins (Clk, Dat)
29     TDI P5.1
30     TDO P5.2
31 */
32
33 // This is just a plugin for now.
34 #define ps2handle pluginhandle
35
36 u32 oldclock=0;
37 //! Handles a monitor command.
38 int ps2handle(unsigned char app,
39               unsigned char verb,
40               unsigned int len){
41   switch(verb){
42   case START:
43     WDTCTL = WDTPW + WDTHOLD;             // Stop WDT
44     TACTL = TASSEL1 + TACLR;              // SMCLK, clear TAR
45     CCTL0 = CCIE;                         // CCR0 interrupt enabled
46     CCR0 = 0x100; //clock divider
47     TACTL |= MC_3;
48     _EINT();                              // Enable interrupts 
49     
50     
51     P5DIR&=~(TDI+TDO);//input mode
52     P5OUT=0; // pull down
53     
54     debugstr("Waiting for a keypress.");
55     //Wait for a keypress.
56     
57     while(1){
58       //Debounce the 1s polling
59       while((P5IN&TDI && P5IN&TDO))
60         while((P5IN&TDI));// && P5IN&TDO));
61       
62       //Transmit the data only if it is new.
63       
64       if((cmddatalong[0]=clock-oldclock)>0x100)
65         txdata(app,verb,4);
66       oldclock=clock;
67     }
68     break;
69   case STOP:
70   default:
71     debugstr("Unknown ps2 verb.");
72     txdata(app,NOK,0);
73   }
74 }