Liangzhen Lai / Mbed 2 deprecated DDRO_software

Dependencies:   mbed

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?

UserRevisionLine numberNew 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