Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
JTAG.cpp@1:acf14b6dd1be, 2012-08-03 (annotated)
- Committer:
- liangzhen
- Date:
- Fri Aug 03 06:10:02 2012 +0000
- Revision:
- 1:acf14b6dd1be
- Child:
- 2:42e8a4eb3c00
DDRO software for the testbed;
Who changed what in which revision?
| User | Revision | Line number | New contents of line |
|---|---|---|---|
| liangzhen | 1:acf14b6dd1be | 1 | #include "JTAG.h" |
| liangzhen | 1:acf14b6dd1be | 2 | #include "mbed.h" |
| liangzhen | 1:acf14b6dd1be | 3 | |
| liangzhen | 1:acf14b6dd1be | 4 | using namespace std; |
| liangzhen | 1:acf14b6dd1be | 5 | |
| liangzhen | 1:acf14b6dd1be | 6 | Serial pc_jtag(USBTX, USBRX);//tx, rx => for debugging purposes |
| liangzhen | 1:acf14b6dd1be | 7 | DigitalOut TCK(p26); |
| liangzhen | 1:acf14b6dd1be | 8 | DigitalOut TMS(p25); |
| liangzhen | 1:acf14b6dd1be | 9 | DigitalOut TDI(p24); |
| liangzhen | 1:acf14b6dd1be | 10 | DigitalIn TDO(p23); |
| liangzhen | 1:acf14b6dd1be | 11 | DigitalOut JTAG_RESET (p21); |
| liangzhen | 1:acf14b6dd1be | 12 | |
| liangzhen | 1:acf14b6dd1be | 13 | JTAG::JTAG(){ |
| liangzhen | 1:acf14b6dd1be | 14 | TDO.mode(PullUp); |
| liangzhen | 1:acf14b6dd1be | 15 | delay = 100; |
| liangzhen | 1:acf14b6dd1be | 16 | TMS = 0; |
| liangzhen | 1:acf14b6dd1be | 17 | TCK = 0; |
| liangzhen | 1:acf14b6dd1be | 18 | TDI = 0; |
| liangzhen | 1:acf14b6dd1be | 19 | return; |
| liangzhen | 1:acf14b6dd1be | 20 | } |
| liangzhen | 1:acf14b6dd1be | 21 | |
| liangzhen | 1:acf14b6dd1be | 22 | |
| liangzhen | 1:acf14b6dd1be | 23 | |
| liangzhen | 1:acf14b6dd1be | 24 | unsigned int JTAG::readID(void){ |
| liangzhen | 1:acf14b6dd1be | 25 | unsigned int id = 0; |
| liangzhen | 1:acf14b6dd1be | 26 | setState('r'); |
| liangzhen | 1:acf14b6dd1be | 27 | leaveState(); |
| liangzhen | 1:acf14b6dd1be | 28 | setState('d'); |
| liangzhen | 1:acf14b6dd1be | 29 | unsigned char a,b,c,d; |
| liangzhen | 1:acf14b6dd1be | 30 | a = readByte(); |
| liangzhen | 1:acf14b6dd1be | 31 | b = readByte(); |
| liangzhen | 1:acf14b6dd1be | 32 | c = readByte(); |
| liangzhen | 1:acf14b6dd1be | 33 | d = readByte(); |
| liangzhen | 1:acf14b6dd1be | 34 | leaveState(); |
| liangzhen | 1:acf14b6dd1be | 35 | id = id | d; |
| liangzhen | 1:acf14b6dd1be | 36 | id = id << 8; |
| liangzhen | 1:acf14b6dd1be | 37 | id = id | c; |
| liangzhen | 1:acf14b6dd1be | 38 | id = id << 8; |
| liangzhen | 1:acf14b6dd1be | 39 | id = id | b; |
| liangzhen | 1:acf14b6dd1be | 40 | id = id << 8; |
| liangzhen | 1:acf14b6dd1be | 41 | id = id | a; |
| liangzhen | 1:acf14b6dd1be | 42 | pc_jtag.printf("JTAG ID: 0x%X\n",id); |
| liangzhen | 1:acf14b6dd1be | 43 | return id; |
| liangzhen | 1:acf14b6dd1be | 44 | } |
| liangzhen | 1:acf14b6dd1be | 45 | |
| liangzhen | 1:acf14b6dd1be | 46 | void JTAG::JTAG_test(void) { |
| liangzhen | 1:acf14b6dd1be | 47 | unsigned int id = 0; |
| liangzhen | 1:acf14b6dd1be | 48 | unsigned char a,b,c,d, e; |
| liangzhen | 1:acf14b6dd1be | 49 | readID(); |
| liangzhen | 1:acf14b6dd1be | 50 | DAP_enable(); |
| liangzhen | 1:acf14b6dd1be | 51 | unsigned int address = 0x60000004; |
| liangzhen | 1:acf14b6dd1be | 52 | unsigned int value = 0x12345678; |
| liangzhen | 1:acf14b6dd1be | 53 | writeMemory(address, value); |
| liangzhen | 1:acf14b6dd1be | 54 | address += 4; |
| liangzhen | 1:acf14b6dd1be | 55 | value = 0x87654321; |
| liangzhen | 1:acf14b6dd1be | 56 | writeMemory(address, value); |
| liangzhen | 1:acf14b6dd1be | 57 | pc_jtag.printf("%X %X\n", address, readMemory(address)); |
| liangzhen | 1:acf14b6dd1be | 58 | address -=4; |
| liangzhen | 1:acf14b6dd1be | 59 | pc_jtag.printf("%X %X\n", address, readMemory(address)); |
| liangzhen | 1:acf14b6dd1be | 60 | |
| liangzhen | 1:acf14b6dd1be | 61 | } |
| liangzhen | 1:acf14b6dd1be | 62 | |
| liangzhen | 1:acf14b6dd1be | 63 | unsigned int JTAG::readMemory(unsigned int address) { |
| liangzhen | 1:acf14b6dd1be | 64 | unsigned char a, b, c, d, e; |
| liangzhen | 1:acf14b6dd1be | 65 | d = address & 0xFF; |
| liangzhen | 1:acf14b6dd1be | 66 | address = address >> 8; |
| liangzhen | 1:acf14b6dd1be | 67 | c = address & 0xFF; |
| liangzhen | 1:acf14b6dd1be | 68 | address = address >> 8; |
| liangzhen | 1:acf14b6dd1be | 69 | b = address & 0xFF; |
| liangzhen | 1:acf14b6dd1be | 70 | address = address >> 8; |
| liangzhen | 1:acf14b6dd1be | 71 | a = address & 0xFF; |
| liangzhen | 1:acf14b6dd1be | 72 | |
| liangzhen | 1:acf14b6dd1be | 73 | // set TAR |
| liangzhen | 1:acf14b6dd1be | 74 | e = 0x40; |
| liangzhen | 1:acf14b6dd1be | 75 | writeAPACC(a,b,c,d,e); |
| liangzhen | 1:acf14b6dd1be | 76 | |
| liangzhen | 1:acf14b6dd1be | 77 | // read DRW |
| liangzhen | 1:acf14b6dd1be | 78 | e = 0xE0; |
| liangzhen | 1:acf14b6dd1be | 79 | writeAPACC(a,b,c,d,e); |
| liangzhen | 1:acf14b6dd1be | 80 | readAPACC(a,b,c,d,e); |
| liangzhen | 1:acf14b6dd1be | 81 | |
| liangzhen | 1:acf14b6dd1be | 82 | unsigned int out = 0; |
| liangzhen | 1:acf14b6dd1be | 83 | out = out | a; |
| liangzhen | 1:acf14b6dd1be | 84 | out = out << 8; |
| liangzhen | 1:acf14b6dd1be | 85 | out = out | b; |
| liangzhen | 1:acf14b6dd1be | 86 | out = out << 8; |
| liangzhen | 1:acf14b6dd1be | 87 | out = out | c; |
| liangzhen | 1:acf14b6dd1be | 88 | out = out << 8; |
| liangzhen | 1:acf14b6dd1be | 89 | out = out | d; |
| liangzhen | 1:acf14b6dd1be | 90 | |
| liangzhen | 1:acf14b6dd1be | 91 | return out; |
| liangzhen | 1:acf14b6dd1be | 92 | } |
| liangzhen | 1:acf14b6dd1be | 93 | |
| liangzhen | 1:acf14b6dd1be | 94 | void JTAG::writeMemory(unsigned int address, unsigned int value) { |
| liangzhen | 1:acf14b6dd1be | 95 | unsigned char a, b, c, d, e; |
| liangzhen | 1:acf14b6dd1be | 96 | d = address & 0xFF; |
| liangzhen | 1:acf14b6dd1be | 97 | address = address >> 8; |
| liangzhen | 1:acf14b6dd1be | 98 | c = address & 0xFF; |
| liangzhen | 1:acf14b6dd1be | 99 | address = address >> 8; |
| liangzhen | 1:acf14b6dd1be | 100 | b = address & 0xFF; |
| liangzhen | 1:acf14b6dd1be | 101 | address = address >> 8; |
| liangzhen | 1:acf14b6dd1be | 102 | a = address & 0xFF; |
| liangzhen | 1:acf14b6dd1be | 103 | |
| liangzhen | 1:acf14b6dd1be | 104 | // set TAR |
| liangzhen | 1:acf14b6dd1be | 105 | e = 0x40; |
| liangzhen | 1:acf14b6dd1be | 106 | writeAPACC(a,b,c,d,e); |
| liangzhen | 1:acf14b6dd1be | 107 | |
| liangzhen | 1:acf14b6dd1be | 108 | d = value & 0xFF; |
| liangzhen | 1:acf14b6dd1be | 109 | value = value >> 8; |
| liangzhen | 1:acf14b6dd1be | 110 | c = value & 0xFF; |
| liangzhen | 1:acf14b6dd1be | 111 | value = value >> 8; |
| liangzhen | 1:acf14b6dd1be | 112 | b = value & 0xFF; |
| liangzhen | 1:acf14b6dd1be | 113 | value = value >> 8; |
| liangzhen | 1:acf14b6dd1be | 114 | a = value & 0xFF; |
| liangzhen | 1:acf14b6dd1be | 115 | |
| liangzhen | 1:acf14b6dd1be | 116 | // check DRW |
| liangzhen | 1:acf14b6dd1be | 117 | e = 0xC0; |
| liangzhen | 1:acf14b6dd1be | 118 | writeAPACC(a,b,c,d,e); |
| liangzhen | 1:acf14b6dd1be | 119 | |
| liangzhen | 1:acf14b6dd1be | 120 | } |
| liangzhen | 1:acf14b6dd1be | 121 | |
| liangzhen | 1:acf14b6dd1be | 122 | void JTAG::DAP_enable(void) { |
| liangzhen | 1:acf14b6dd1be | 123 | // write CTRL to enable DAP |
| liangzhen | 1:acf14b6dd1be | 124 | unsigned char a, b, c, d, e; |
| liangzhen | 1:acf14b6dd1be | 125 | a = 0x54; |
| liangzhen | 1:acf14b6dd1be | 126 | b = 0x00; |
| liangzhen | 1:acf14b6dd1be | 127 | c = 0x00; |
| liangzhen | 1:acf14b6dd1be | 128 | d = 0x00; |
| liangzhen | 1:acf14b6dd1be | 129 | e = 0x40; |
| liangzhen | 1:acf14b6dd1be | 130 | writeDPACC(a,b,c,d,e); |
| liangzhen | 1:acf14b6dd1be | 131 | readDPACC(a,b,c,d,e); |
| liangzhen | 1:acf14b6dd1be | 132 | |
| liangzhen | 1:acf14b6dd1be | 133 | // set AP select |
| liangzhen | 1:acf14b6dd1be | 134 | a = 0x00; |
| liangzhen | 1:acf14b6dd1be | 135 | b = 0x00; |
| liangzhen | 1:acf14b6dd1be | 136 | c = 0x00; |
| liangzhen | 1:acf14b6dd1be | 137 | d = 0x00; |
| liangzhen | 1:acf14b6dd1be | 138 | e = 0x80; |
| liangzhen | 1:acf14b6dd1be | 139 | writeDPACC(a,b,c,d,e); |
| liangzhen | 1:acf14b6dd1be | 140 | readDPACC(a,b,c,d,e); |
| liangzhen | 1:acf14b6dd1be | 141 | |
| liangzhen | 1:acf14b6dd1be | 142 | // set AP CSW |
| liangzhen | 1:acf14b6dd1be | 143 | a = 0x00; |
| liangzhen | 1:acf14b6dd1be | 144 | b = 0x00; |
| liangzhen | 1:acf14b6dd1be | 145 | c = 0x00; |
| liangzhen | 1:acf14b6dd1be | 146 | d = 0x02; |
| liangzhen | 1:acf14b6dd1be | 147 | e = 0x00; |
| liangzhen | 1:acf14b6dd1be | 148 | writeAPACC(a,b,c,d,e); |
| liangzhen | 1:acf14b6dd1be | 149 | readAPACC(a,b,c,d,e); |
| liangzhen | 1:acf14b6dd1be | 150 | |
| liangzhen | 1:acf14b6dd1be | 151 | } |
| liangzhen | 1:acf14b6dd1be | 152 | |
| liangzhen | 1:acf14b6dd1be | 153 | void JTAG::setIR(unsigned char A) { |
| liangzhen | 1:acf14b6dd1be | 154 | setState('i'); |
| liangzhen | 1:acf14b6dd1be | 155 | writeByte(A); |
| liangzhen | 1:acf14b6dd1be | 156 | leaveState(); |
| liangzhen | 1:acf14b6dd1be | 157 | } |
| liangzhen | 1:acf14b6dd1be | 158 | |
| liangzhen | 1:acf14b6dd1be | 159 | void JTAG::readDPACC(unsigned char& A, unsigned char& B, unsigned char& C, unsigned char& D, unsigned char& E) { |
| liangzhen | 1:acf14b6dd1be | 160 | unsigned char i; |
| liangzhen | 1:acf14b6dd1be | 161 | E = 0; |
| liangzhen | 1:acf14b6dd1be | 162 | i = 0xA0; |
| liangzhen | 1:acf14b6dd1be | 163 | setIR(i); |
| liangzhen | 1:acf14b6dd1be | 164 | DataHigh(); |
| liangzhen | 1:acf14b6dd1be | 165 | setState('d'); |
| liangzhen | 1:acf14b6dd1be | 166 | if (TDO) { E += 0x04; } |
| liangzhen | 1:acf14b6dd1be | 167 | clockTicks(1); |
| liangzhen | 1:acf14b6dd1be | 168 | if (TDO) { E += 0x02; } |
| liangzhen | 1:acf14b6dd1be | 169 | clockTicks(1); |
| liangzhen | 1:acf14b6dd1be | 170 | if (TDO) { E += 0x01; } |
| liangzhen | 1:acf14b6dd1be | 171 | clockTicks(1); |
| liangzhen | 1:acf14b6dd1be | 172 | D = readByte(); |
| liangzhen | 1:acf14b6dd1be | 173 | C = readByte(); |
| liangzhen | 1:acf14b6dd1be | 174 | B = readByte(); |
| liangzhen | 1:acf14b6dd1be | 175 | A = readByte(); |
| liangzhen | 1:acf14b6dd1be | 176 | leaveState(); |
| liangzhen | 1:acf14b6dd1be | 177 | } |
| liangzhen | 1:acf14b6dd1be | 178 | |
| liangzhen | 1:acf14b6dd1be | 179 | void JTAG::readAPACC(unsigned char& A, unsigned char& B, unsigned char& C, |
| liangzhen | 1:acf14b6dd1be | 180 | unsigned char& D, unsigned char& E) { |
| liangzhen | 1:acf14b6dd1be | 181 | unsigned char i; |
| liangzhen | 1:acf14b6dd1be | 182 | E = 0; |
| liangzhen | 1:acf14b6dd1be | 183 | i = 0xB0; |
| liangzhen | 1:acf14b6dd1be | 184 | setIR(i); |
| liangzhen | 1:acf14b6dd1be | 185 | DataHigh(); |
| liangzhen | 1:acf14b6dd1be | 186 | setState('d'); |
| liangzhen | 1:acf14b6dd1be | 187 | if (TDO) { E += 0x04; } |
| liangzhen | 1:acf14b6dd1be | 188 | clockTicks(1); |
| liangzhen | 1:acf14b6dd1be | 189 | if (TDO) { E += 0x02; } |
| liangzhen | 1:acf14b6dd1be | 190 | clockTicks(1); |
| liangzhen | 1:acf14b6dd1be | 191 | if (TDO) { E += 0x01; } |
| liangzhen | 1:acf14b6dd1be | 192 | clockTicks(1); |
| liangzhen | 1:acf14b6dd1be | 193 | D = readByte(); |
| liangzhen | 1:acf14b6dd1be | 194 | C = readByte(); |
| liangzhen | 1:acf14b6dd1be | 195 | B = readByte(); |
| liangzhen | 1:acf14b6dd1be | 196 | A = readByte(); |
| liangzhen | 1:acf14b6dd1be | 197 | leaveState(); |
| liangzhen | 1:acf14b6dd1be | 198 | } |
| liangzhen | 1:acf14b6dd1be | 199 | |
| liangzhen | 1:acf14b6dd1be | 200 | void JTAG::writeAPACC(unsigned char A, unsigned char B, unsigned char C, |
| liangzhen | 1:acf14b6dd1be | 201 | unsigned char D, unsigned char E) { |
| liangzhen | 1:acf14b6dd1be | 202 | unsigned char i; |
| liangzhen | 1:acf14b6dd1be | 203 | i = 0xB0; |
| liangzhen | 1:acf14b6dd1be | 204 | setIR(i); |
| liangzhen | 1:acf14b6dd1be | 205 | setState('d'); |
| liangzhen | 1:acf14b6dd1be | 206 | writeByte(E); |
| liangzhen | 1:acf14b6dd1be | 207 | writeByte(D); |
| liangzhen | 1:acf14b6dd1be | 208 | writeByte(C); |
| liangzhen | 1:acf14b6dd1be | 209 | writeByte(B); |
| liangzhen | 1:acf14b6dd1be | 210 | writeByte(A); |
| liangzhen | 1:acf14b6dd1be | 211 | leaveState(); |
| liangzhen | 1:acf14b6dd1be | 212 | } |
| liangzhen | 1:acf14b6dd1be | 213 | |
| liangzhen | 1:acf14b6dd1be | 214 | void JTAG::writeDPACC(unsigned char A, unsigned char B, unsigned char C, unsigned char D, unsigned char E) { |
| liangzhen | 1:acf14b6dd1be | 215 | unsigned char i; |
| liangzhen | 1:acf14b6dd1be | 216 | i = 0xA0; |
| liangzhen | 1:acf14b6dd1be | 217 | setIR(i); |
| liangzhen | 1:acf14b6dd1be | 218 | setState('d'); |
| liangzhen | 1:acf14b6dd1be | 219 | writeByte(E); |
| liangzhen | 1:acf14b6dd1be | 220 | writeByte(D); |
| liangzhen | 1:acf14b6dd1be | 221 | writeByte(C); |
| liangzhen | 1:acf14b6dd1be | 222 | writeByte(B); |
| liangzhen | 1:acf14b6dd1be | 223 | writeByte(A); |
| liangzhen | 1:acf14b6dd1be | 224 | leaveState(); |
| liangzhen | 1:acf14b6dd1be | 225 | } |
| liangzhen | 1:acf14b6dd1be | 226 | |
| liangzhen | 1:acf14b6dd1be | 227 | //moves to specified state from IDLE (reset from anywhere) |
| liangzhen | 1:acf14b6dd1be | 228 | void JTAG::setState(unsigned char c){ |
| liangzhen | 1:acf14b6dd1be | 229 | switch(c) { |
| liangzhen | 1:acf14b6dd1be | 230 | case 'n': |
| liangzhen | 1:acf14b6dd1be | 231 | break; |
| liangzhen | 1:acf14b6dd1be | 232 | case 'r': |
| liangzhen | 1:acf14b6dd1be | 233 | reset(); |
| liangzhen | 1:acf14b6dd1be | 234 | break; |
| liangzhen | 1:acf14b6dd1be | 235 | case 'd': |
| liangzhen | 1:acf14b6dd1be | 236 | TMSHigh(); |
| liangzhen | 1:acf14b6dd1be | 237 | clockTicks(1); |
| liangzhen | 1:acf14b6dd1be | 238 | TMSLow(); |
| liangzhen | 1:acf14b6dd1be | 239 | clockTicks(2); |
| liangzhen | 1:acf14b6dd1be | 240 | state = 'd'; |
| liangzhen | 1:acf14b6dd1be | 241 | break; |
| liangzhen | 1:acf14b6dd1be | 242 | case 'i': |
| liangzhen | 1:acf14b6dd1be | 243 | TMSHigh(); |
| liangzhen | 1:acf14b6dd1be | 244 | clockTicks(2); |
| liangzhen | 1:acf14b6dd1be | 245 | TMSLow(); |
| liangzhen | 1:acf14b6dd1be | 246 | clockTicks(2); |
| liangzhen | 1:acf14b6dd1be | 247 | state = 'i'; |
| liangzhen | 1:acf14b6dd1be | 248 | break; |
| liangzhen | 1:acf14b6dd1be | 249 | default: |
| liangzhen | 1:acf14b6dd1be | 250 | break; |
| liangzhen | 1:acf14b6dd1be | 251 | } |
| liangzhen | 1:acf14b6dd1be | 252 | } |
| liangzhen | 1:acf14b6dd1be | 253 | |
| liangzhen | 1:acf14b6dd1be | 254 | void JTAG::setJTAGspeed(int speed){ |
| liangzhen | 1:acf14b6dd1be | 255 | delay = 1000/speed; |
| liangzhen | 1:acf14b6dd1be | 256 | return; |
| liangzhen | 1:acf14b6dd1be | 257 | } |
| liangzhen | 1:acf14b6dd1be | 258 | |
| liangzhen | 1:acf14b6dd1be | 259 | //leave from current state to idle state |
| liangzhen | 1:acf14b6dd1be | 260 | void JTAG::leaveState(void){ |
| liangzhen | 1:acf14b6dd1be | 261 | switch(state){ |
| liangzhen | 1:acf14b6dd1be | 262 | case 'n': |
| liangzhen | 1:acf14b6dd1be | 263 | break; |
| liangzhen | 1:acf14b6dd1be | 264 | case 'r': |
| liangzhen | 1:acf14b6dd1be | 265 | TMSLow(); |
| liangzhen | 1:acf14b6dd1be | 266 | clockTicks(1); |
| liangzhen | 1:acf14b6dd1be | 267 | state = 'n'; |
| liangzhen | 1:acf14b6dd1be | 268 | break; |
| liangzhen | 1:acf14b6dd1be | 269 | case 'i': |
| liangzhen | 1:acf14b6dd1be | 270 | TMSHigh(); |
| liangzhen | 1:acf14b6dd1be | 271 | clockTicks(2); |
| liangzhen | 1:acf14b6dd1be | 272 | TMSLow(); |
| liangzhen | 1:acf14b6dd1be | 273 | clockTicks(1); |
| liangzhen | 1:acf14b6dd1be | 274 | state = 'n'; |
| liangzhen | 1:acf14b6dd1be | 275 | break; |
| liangzhen | 1:acf14b6dd1be | 276 | case 'd': |
| liangzhen | 1:acf14b6dd1be | 277 | TMSHigh(); |
| liangzhen | 1:acf14b6dd1be | 278 | clockTicks(2); |
| liangzhen | 1:acf14b6dd1be | 279 | TMSLow(); |
| liangzhen | 1:acf14b6dd1be | 280 | clockTicks(1); |
| liangzhen | 1:acf14b6dd1be | 281 | state = 'n'; |
| liangzhen | 1:acf14b6dd1be | 282 | break; |
| liangzhen | 1:acf14b6dd1be | 283 | default: |
| liangzhen | 1:acf14b6dd1be | 284 | break; |
| liangzhen | 1:acf14b6dd1be | 285 | } |
| liangzhen | 1:acf14b6dd1be | 286 | } |
| liangzhen | 1:acf14b6dd1be | 287 | |
| liangzhen | 1:acf14b6dd1be | 288 | void JTAG::reset(void){ |
| liangzhen | 1:acf14b6dd1be | 289 | TMSHigh(); |
| liangzhen | 1:acf14b6dd1be | 290 | clockTicks(10); |
| liangzhen | 1:acf14b6dd1be | 291 | TMSLow(); |
| liangzhen | 1:acf14b6dd1be | 292 | state = 'r'; |
| liangzhen | 1:acf14b6dd1be | 293 | return; |
| liangzhen | 1:acf14b6dd1be | 294 | } |
| liangzhen | 1:acf14b6dd1be | 295 | |
| liangzhen | 1:acf14b6dd1be | 296 | void JTAG::writeByte(char c){ |
| liangzhen | 1:acf14b6dd1be | 297 | clockLow(); |
| liangzhen | 1:acf14b6dd1be | 298 | int i; |
| liangzhen | 1:acf14b6dd1be | 299 | for(i=0;i<8;i++) { |
| liangzhen | 1:acf14b6dd1be | 300 | clockTicks(1); |
| liangzhen | 1:acf14b6dd1be | 301 | if ( (c & 1)== 0 ) |
| liangzhen | 1:acf14b6dd1be | 302 | { |
| liangzhen | 1:acf14b6dd1be | 303 | DataLow(); |
| liangzhen | 1:acf14b6dd1be | 304 | } |
| liangzhen | 1:acf14b6dd1be | 305 | else |
| liangzhen | 1:acf14b6dd1be | 306 | { |
| liangzhen | 1:acf14b6dd1be | 307 | DataHigh(); |
| liangzhen | 1:acf14b6dd1be | 308 | } |
| liangzhen | 1:acf14b6dd1be | 309 | c=c>>1; |
| liangzhen | 1:acf14b6dd1be | 310 | } |
| liangzhen | 1:acf14b6dd1be | 311 | } |
| liangzhen | 1:acf14b6dd1be | 312 | |
| liangzhen | 1:acf14b6dd1be | 313 | char JTAG::readByte(void) { |
| liangzhen | 1:acf14b6dd1be | 314 | char c=0; |
| liangzhen | 1:acf14b6dd1be | 315 | clockLow(); |
| liangzhen | 1:acf14b6dd1be | 316 | int i; |
| liangzhen | 1:acf14b6dd1be | 317 | for(i=0;i<8;i++) { |
| liangzhen | 1:acf14b6dd1be | 318 | c=c>>1; |
| liangzhen | 1:acf14b6dd1be | 319 | if(TDO) { c+=0x80; } |
| liangzhen | 1:acf14b6dd1be | 320 | clockTicks(1); |
| liangzhen | 1:acf14b6dd1be | 321 | |
| liangzhen | 1:acf14b6dd1be | 322 | } |
| liangzhen | 1:acf14b6dd1be | 323 | return c; |
| liangzhen | 1:acf14b6dd1be | 324 | } |
| liangzhen | 1:acf14b6dd1be | 325 | |
| liangzhen | 1:acf14b6dd1be | 326 | void JTAG::DataLow(void) { |
| liangzhen | 1:acf14b6dd1be | 327 | wait_us(delay); |
| liangzhen | 1:acf14b6dd1be | 328 | TDI = 0; |
| liangzhen | 1:acf14b6dd1be | 329 | } |
| liangzhen | 1:acf14b6dd1be | 330 | void JTAG::DataHigh(void) { |
| liangzhen | 1:acf14b6dd1be | 331 | wait_us(delay); |
| liangzhen | 1:acf14b6dd1be | 332 | TDI = 1; |
| liangzhen | 1:acf14b6dd1be | 333 | } |
| liangzhen | 1:acf14b6dd1be | 334 | |
| liangzhen | 1:acf14b6dd1be | 335 | void JTAG::clockLow(void) { |
| liangzhen | 1:acf14b6dd1be | 336 | wait_us(delay); |
| liangzhen | 1:acf14b6dd1be | 337 | TCK = 0; |
| liangzhen | 1:acf14b6dd1be | 338 | } |
| liangzhen | 1:acf14b6dd1be | 339 | |
| liangzhen | 1:acf14b6dd1be | 340 | void JTAG::clockHigh(void) { |
| liangzhen | 1:acf14b6dd1be | 341 | wait_us(delay); |
| liangzhen | 1:acf14b6dd1be | 342 | TCK = 1; |
| liangzhen | 1:acf14b6dd1be | 343 | } |
| liangzhen | 1:acf14b6dd1be | 344 | |
| liangzhen | 1:acf14b6dd1be | 345 | void JTAG::clockTicks(unsigned char c) { |
| liangzhen | 1:acf14b6dd1be | 346 | int i; |
| liangzhen | 1:acf14b6dd1be | 347 | clockLow(); |
| liangzhen | 1:acf14b6dd1be | 348 | for(i=0;i<c;i++) { |
| liangzhen | 1:acf14b6dd1be | 349 | clockLow(); |
| liangzhen | 1:acf14b6dd1be | 350 | clockHigh(); |
| liangzhen | 1:acf14b6dd1be | 351 | } |
| liangzhen | 1:acf14b6dd1be | 352 | clockLow(); |
| liangzhen | 1:acf14b6dd1be | 353 | } |
| liangzhen | 1:acf14b6dd1be | 354 | |
| liangzhen | 1:acf14b6dd1be | 355 | void JTAG::TMSHigh(void) { |
| liangzhen | 1:acf14b6dd1be | 356 | wait_us(delay); |
| liangzhen | 1:acf14b6dd1be | 357 | TMS = 1; |
| liangzhen | 1:acf14b6dd1be | 358 | } |
| liangzhen | 1:acf14b6dd1be | 359 | |
| liangzhen | 1:acf14b6dd1be | 360 | void JTAG::TMSLow(void) { |
| liangzhen | 1:acf14b6dd1be | 361 | wait_us(delay); |
| liangzhen | 1:acf14b6dd1be | 362 | TMS = 0; |
| liangzhen | 1:acf14b6dd1be | 363 | } |
| liangzhen | 1:acf14b6dd1be | 364 | |
| liangzhen | 1:acf14b6dd1be | 365 | |
| liangzhen | 1:acf14b6dd1be | 366 | |
| liangzhen | 1:acf14b6dd1be | 367 | |
| liangzhen | 1:acf14b6dd1be | 368 | |
| liangzhen | 1:acf14b6dd1be | 369 | |
| liangzhen | 1:acf14b6dd1be | 370 | |
| liangzhen | 1:acf14b6dd1be | 371 | |
| liangzhen | 1:acf14b6dd1be | 372 | |
| liangzhen | 1:acf14b6dd1be | 373 | |
| liangzhen | 1:acf14b6dd1be | 374 | |
| liangzhen | 1:acf14b6dd1be | 375 | |
| liangzhen | 1:acf14b6dd1be | 376 | |
| liangzhen | 1:acf14b6dd1be | 377 | |
| liangzhen | 1:acf14b6dd1be | 378 | |
| liangzhen | 1:acf14b6dd1be | 379 | |
| liangzhen | 1:acf14b6dd1be | 380 | |
| liangzhen | 1:acf14b6dd1be | 381 | |
| liangzhen | 1:acf14b6dd1be | 382 | |
| liangzhen | 1:acf14b6dd1be | 383 |