ea02b40816732ee3f88e434d1a134a85e05798c7
[goodfet] / firmware / apps / jtag / jtag.c
1 //GoodFET JTAG Application
2 //Handles basic I/O
3
4 //Higher level left to client application.
5
6 #include "platform.h"
7 #include "command.h"
8 #include "jtag.h"
9
10
11 //! Set up the pins for JTAG mode.
12 void jtagsetup(){
13   P5DIR|=MOSI+SCK+TMS;
14   P5DIR&=~MISO;
15   P5OUT|=0xFFFF;
16   P4DIR|=TST;
17   P2DIR|=RST;
18 }
19
20 int savedtclk=0;
21 //! Shift 8 bits in and out.
22 unsigned char jtagtrans8(unsigned char byte){
23   unsigned int bit;
24   SAVETCLK;
25   for (bit = 0; bit < 8; bit++) {
26     /* write MOSI on trailing edge of previous clock */
27     if (byte & 0x80)
28       {SETMOSI;}
29     else
30       {CLRMOSI;}
31     byte <<= 1;
32     
33     if(bit==7)
34       SETTMS;//TMS high on last bit to exit.
35     
36     CLRTCK;
37     SETTCK;
38      /* read MISO on trailing edge */
39     byte |= READMISO;
40   }
41   RESTORETCLK;
42   
43   // exit state
44   CLRTCK;
45   SETTCK;
46   // update state
47   CLRTMS;
48   CLRTCK;
49   SETTCK;
50   
51   return byte;
52 }
53
54 //! Shift 8 bits in and out.
55 unsigned int jtagtrans16(unsigned int word){
56   unsigned int bit;
57   SAVETCLK;
58   
59   for (bit = 0; bit < 16; bit++) {
60     /* write MOSI on trailing edge of previous clock */
61     if (word & 0x8000)
62       {SETMOSI;}
63     else
64       {CLRMOSI;}
65     word <<= 1;
66     
67     if(bit==15)
68       SETTMS;//TMS high on last bit to exit.
69     
70     CLRTCK;
71     SETTCK;
72      /* read MISO on trailing edge */
73     word |= READMISO;
74   }
75   RESTORETCLK;
76   
77   // exit state
78   CLRTCK;
79   SETTCK;
80   // update state
81   CLRTMS;
82   CLRTCK;
83   SETTCK;
84   
85   return word;
86 }
87
88 //! Stop JTAG, release pins
89 void jtag_stop(){
90   P5OUT=0;
91   P4OUT=0;
92 }
93
94
95 //! Shift 16 bits of the DR.
96 unsigned int jtag_dr_shift16(unsigned int in){
97   // idle
98   SETTMS;
99   CLRTCK;
100   SETTCK;
101   // select DR
102   CLRTMS;
103   CLRTCK;
104   SETTCK;
105   // capture IR
106   CLRTCK;
107   SETTCK;
108
109   // shift DR, then idle
110   return(jtagtrans16(in));
111 }
112
113
114 //! Shift 8 bits of the IR.
115 unsigned char jtag_ir_shift8(unsigned char in){
116   // idle
117   SETTMS;
118   CLRTCK;
119   SETTCK;
120   // select DR
121   CLRTCK;
122   SETTCK;
123   // select IR
124   CLRTMS;
125   CLRTCK;
126   SETTCK;
127   // capture IR
128   CLRTCK;
129   SETTCK;
130   
131   // shift IR, then idle.
132   return(jtagtrans8(in));
133 }
134
135 //! Handles a monitor command.
136 void jtaghandle(unsigned char app,
137                unsigned char verb,
138                unsigned char len){
139   switch(verb){
140     //START handled by specific JTAG
141   case STOP:
142     jtag_stop();
143     txdata(app,verb,0);
144     break;
145   case SETUP:
146     jtagsetup();
147     txdata(app,verb,0);
148     break;
149   case JTAG_IR_SHIFT:
150     cmddata[0]=jtag_ir_shift8(cmddata[0]);
151     txdata(app,verb,1);
152     break;
153   case JTAG_DR_SHIFT:
154     cmddataword[0]=jtag_dr_shift16(cmddataword[0]);
155     txdata(app,verb,2);
156     break;
157   default:
158     txdata(app,NOK,0);
159   }
160 }
161
162