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