2
|
1 #include <stdio.h>
|
|
2 #include <util/delay.h>
|
|
3 #include "jtag.h"
|
|
4 #include "avriotools.h"
|
|
5
|
|
6 /* It is supposed to work at 1Mbps */
|
|
7 #define CLK_DELAY() do { _delay_ms(0.0004); } while(0)
|
|
8
|
|
9 void jtag_init(void) {
|
|
10 pin_mode(&JTAG_PORT, JTAG_TCK, PM_OUTPUT);
|
|
11 pin_mode(&JTAG_PORT, JTAG_TMS, PM_OUTPUT);
|
|
12 pin_mode(&JTAG_PORT, JTAG_TDI, PM_OUTPUT);
|
|
13 pin_mode(&JTAG_PORT, JTAG_TDO, PM_INPUT);
|
|
14 pin_lo(JTAG_PORT, JTAG_TCK);
|
|
15 pin_lo(JTAG_PORT, JTAG_TMS);
|
|
16 pin_lo(JTAG_PORT, JTAG_TDI);
|
|
17 }
|
|
18
|
|
19 #define TCK_LO() pin_lo(JTAG_PORT, JTAG_TCK)
|
|
20 #define TCK_HI() pin_hi(JTAG_PORT, JTAG_TCK)
|
|
21 #define SEND_BIT(pin, bit) \
|
|
22 do { \
|
|
23 if(bit) \
|
|
24 pin_hi(JTAG_PORT, JTAG_TDI); \
|
|
25 else \
|
|
26 pin_lo(JTAG_PORT, JTAG_TDI); \
|
|
27 CLK_DELAY(); \
|
|
28 TCK_HI(); \
|
|
29 CLK_DELAY(); \
|
|
30 } while(0)
|
|
31 #define GET_TDO() (JTAG_PIN & _BV(JTAG_TDO))
|
|
32
|
|
33 void jtag_tms(char *buf, int nbits) {
|
|
34 int i;
|
|
35 int byteoff, bitoff;
|
|
36 int bit;
|
|
37
|
|
38 for(i = 0; i < nbits; i++) {
|
|
39 byteoff = i / 8;
|
|
40 bitoff = i % 8;
|
|
41 bit = buf[byteoff] & (1 << bitoff);
|
|
42 SEND_BIT(JTAG_TMS, bit);
|
|
43 TCK_LO();
|
|
44 }
|
|
45 }
|
|
46
|
|
47 void jtag_shift(char *buf, int nbits) {
|
|
48 int i;
|
|
49 int byteoff, bitoff;
|
|
50 int bit;
|
|
51
|
|
52 for(i = 0; i < nbits; i++) {
|
|
53 byteoff = i / 8;
|
|
54 bitoff = i % 8;
|
|
55 bit = buf[byteoff] & (1 << bitoff);
|
|
56 SEND_BIT(JTAG_TDI, bit);
|
|
57 TCK_LO();
|
|
58 }
|
|
59 }
|
|
60
|
|
61 void jtag_shift_inout(char *ibuf, char *obuf, int nbits) {
|
|
62 int i;
|
|
63 int byteoff, bitoff;
|
|
64 int bit, tdo, bitmask;
|
|
65
|
|
66 for(i = 0; i < nbits; i++) {
|
|
67 byteoff = i / 8;
|
|
68 bitoff = i % 8;
|
|
69 bitmask = 1 << bitoff;
|
|
70
|
|
71 bit = ibuf[byteoff] & bitmask;
|
|
72 SEND_BIT(JTAG_TDI, bit);
|
|
73 tdo = GET_TDO();
|
|
74 TCK_LO();
|
|
75 if(tdo)
|
|
76 obuf[byteoff] |= bitmask;
|
|
77 else
|
|
78 obuf[byteoff] &= ~(bitmask);
|
|
79 }
|
|
80 }
|