This is the DDRO software we write to operate the chip
Embed:
(wiki syntax)
Show/hide line numbers
JTAG.cpp
00001 #include "JTAG.h" 00002 #include "mbed.h" 00003 00004 using namespace std; 00005 00006 LocalFileSystem local("local"); 00007 00008 Serial pc_jtag(USBTX, USBRX);//tx, rx => for debugging purposes 00009 DigitalOut TCK(p26); 00010 DigitalOut TMS(p25); 00011 DigitalOut TDI(p24); 00012 DigitalIn TDO(p23); 00013 DigitalOut JTAG_RESET (p21); 00014 00015 int expected_result[256] = { 00016 0x2B8FC0B 00017 , 0xF8A2005D 00018 , 0xF825F95F 00019 , 0x1B1FAA7 00020 , 0x24BFFBA 00021 , 0xFD0E02DD 00022 , 0xFA880752 00023 , 0xFCC00793 00024 , 0x478FD3C 00025 , 0xF9FFFF8D 00026 , 0x48B04E1 00027 , 0x43202C8 00028 , 0xF8AB010B 00029 , 0xF93AF535 00030 , 0xFE19FA08 00031 , 0x7709A0 00032 , 0xFBD1FC74 00033 , 0x2A20109 00034 , 0x76C0722 00035 , 0xFFFCFCD2 00036 , 0xFE97FF8F 00037 , 0x29EFA92 00038 , 0x7CB03B6 00039 , 0x56017A 00040 , 0x2F0FEFF 00041 , 0xF695FD10 00042 , 0x29405F8 00043 , 0xFCD402DD 00044 , 0xFEF40220 00045 , 0xFC70FBA0 00046 , 0xFCBFFA4D 00047 , 0xF60323 00048 , 0xFC4D00B2 00049 , 0xFE73FB95 00050 , 0xF9F0FD15 00051 , 0x2800057 00052 , 0x2390133 00053 , 0xFF90FA93 00054 , 0xFF75FEEE 00055 , 0xFE24022E 00056 , 0x59602D5 00057 , 0xFE1CFE5A 00058 , 0xFC4A052B 00059 , 0x575F8D5 00060 , 0xA6FA7B 00061 , 0xFE87FEE1 00062 , 0x2160075 00063 , 0x2D0FBD9 00064 , 0xFDB5FACF 00065 , 0xFD2FFF68 00066 , 0x2CC00AC 00067 , 0x725FCD0 00068 , 0x17202BF 00069 , 0x7F6FF0B 00070 , 0xFC75FD2D 00071 , 0xA39FC4F 00072 , 0xD3FA86 00073 , 0xFEB0FD08 00074 , 0x8BDF829 00075 , 0x41D0233 00076 , 0x5FB033D 00077 , 0xEB0259 00078 , 0x2C1FEA4 00079 , 0xF8D507D8 00080 , 0xFFBCFBBD 00081 , 0xFBE9FF9F 00082 , 0xFC8D0583 00083 , 0x610056F 00084 , 0x44FFD1E 00085 , 0xFE080213 00086 , 0xFDBE02CD 00087 , 0x7460455 00088 , 0x7F06CA 00089 , 0xFECEFDB8 00090 , 0xF6E50261 00091 , 0xFED5FB0B 00092 , 0x4D900E6 00093 , 0xFB91FED5 00094 , 0xFB7DFC9D 00095 , 0xFA630051 00096 , 0xF755039F 00097 , 0x5A3FE19 00098 , 0xFDA5FB37 00099 , 0xFBC0FD89 00100 , 0xFDC702F5 00101 , 0xF93D0164 00102 , 0xFD650806 00103 , 0xFC70FF32 00104 , 0xFCFDF722 00105 , 0xFA6C04AF 00106 , 0xFD5A017D 00107 , 0x44FFB39 00108 , 0x2D5FE04 00109 , 0xFDF8FEF0 00110 , 0xFA2BFF07 00111 , 0x160F87E 00112 , 0xF7C604B0 00113 , 0x24101C0 00114 , 0xFC6DF9BB 00115 , 0x1D30328 00116 , 0x580038F 00117 , 0x552FD58 00118 , 0xFB93FFC4 00119 , 0xFCCD0460 00120 , 0x62EFE73 00121 , 0x22709A5 00122 , 0xFE6AF97A 00123 , 0x4C900E1 00124 , 0xF6C204F6 00125 , 0x21F037F 00126 , 0xFFFDFE17 00127 , 0xFC70FF92 00128 , 0xFD8800E6 00129 , 0xFF93FE5E 00130 , 0x45E015D 00131 , 0x2460564 00132 , 0xFCE4FEEF 00133 , 0xFFE1FE69 00134 , 0x5FD012B 00135 , 0x2C80105 00136 , 0xFD160071 00137 , 0xFC220060 00138 , 0xF6ABFA44 00139 , 0x1BCFE0F 00140 , 0x172FA07 00141 , 0xFC4DFB2E 00142 , 0x1BF0832 00143 , 0x1240277 00144 , 0xBAAFFE5 00145 , 0xAEFDE6 00146 , 0x4410424 00147 , 0xF80AFB2F 00148 , 0xFD7EFC9F 00149 , 0xCEF9FC 00150 , 0x34D00EE 00151 , 0xD3009F 00152 , 0xF756050A 00153 , 0xF9BAFEFC 00154 , 0xFC240233 00155 , 0xFEDA02A5 00156 , 0xFF36001A 00157 , 0xFFB302FB 00158 , 0x5CCFE00 00159 , 0xFDF6FE08 00160 , 0x21C02E0 00161 , 0x516FF02 00162 , 0x27F843 00163 , 0x45CFE47 00164 , 0x195FC3B 00165 , 0xFC330442 00166 , 0x3F903BD 00167 , 0xFA3801CC 00168 , 0x19904A3 00169 , 0xF75E00B8 00170 , 0xFBC30044 00171 , 0x38FF43 00172 , 0xFE4605A4 00173 , 0x32BFD41 00174 , 0xFBEBFA81 00175 , 0xA8D0848 00176 , 0xFE94F9E2 00177 , 0x70C0402 00178 , 0xFF400475 00179 , 0xF721FF3F 00180 , 0x632051C 00181 , 0x49E0420 00182 , 0x796FDF2 00183 , 0x3D1F92A 00184 , 0x1D3FB6C 00185 , 0x53BF9C5 00186 , 0x2D90B51 00187 , 0x39F0331 00188 , 0xD59F9BA 00189 , 0x31DFCCC 00190 , 0xFB44FC3F 00191 , 0x8804D2 00192 , 0x136FFFC 00193 , 0xFAD20224 00194 , 0xF8ADFA57 00195 , 0xFD72FA15 00196 , 0x3AA099A 00197 , 0x39DF85C 00198 , 0xFA650025 00199 , 0x87FE4C 00200 , 0xFC86005A 00201 , 0x1700AE1 00202 , 0x2230312 00203 , 0x4DF0783 00204 , 0xFBE80513 00205 , 0xFC8F081C 00206 , 0x2C6086D 00207 , 0x1FE64 00208 , 0xF0FB92 00209 , 0x11508C5 00210 , 0x68FA5D 00211 , 0x33047D 00212 , 0xBD5FEB1 00213 , 0x2D5FDDC 00214 , 0x13CFEFC 00215 , 0xF3EFA1D 00216 , 0xFF880319 00217 , 0xFE58FEBD 00218 , 0x90265 00219 , 0xFBBD0518 00220 , 0xFD6FFAC6 00221 , 0x28D0215 00222 , 0x52F060B 00223 , 0x183F76F 00224 , 0xFAC3FCB9 00225 , 0x5C1FDAD 00226 , 0xFF720477 00227 , 0x751F5D3 00228 , 0x3CC09C7 00229 , 0x561045C 00230 , 0xFF48FEC1 00231 , 0x146F496 00232 , 0x2ACFD84 00233 , 0xFED403CE 00234 , 0xFB91FF04 00235 , 0xFC1702A4 00236 , 0xFE0A019F 00237 , 0xFE560322 00238 , 0xFCA400E5 00239 , 0xFCF6FC95 00240 , 0x656FC73 00241 , 0xFDBD015B 00242 , 0x402058C 00243 , 0xFE63F7AF 00244 , 0xF7D30635 00245 , 0xBC029A 00246 , 0xFDB1017F 00247 , 0x336FA01 00248 , 0x5F9FDB4 00249 , 0x6A701D0 00250 , 0xFD92FFA8 00251 , 0x30E0752 00252 , 0x4C302E4 00253 , 0xFE9DFF0E 00254 , 0x10DFE7D 00255 , 0xFB1E099F 00256 , 0xFEBDFE61 00257 , 0xFD870408 00258 , 0x239FEA7 00259 , 0x37004CE 00260 , 0xFD69FF8D 00261 , 0xFD8402A8 00262 , 0x28A05B0 00263 , 0xF90C0032 00264 , 0xFB21037A 00265 , 0xFB3CFF8A 00266 , 0xF4FDFC3C 00267 , 0xFA5502C5 00268 , 0x6A702EA 00269 , 0x27C0484 00270 , 0x500002D 00271 , 0x937052F 00272 }; 00273 00274 JTAG::JTAG() 00275 { 00276 TDO.mode(PullUp); 00277 delay = 10; 00278 TMS = 0; 00279 TCK = 0; 00280 TDI = 0; 00281 return; 00282 } 00283 00284 unsigned int JTAG::readID(void) 00285 { 00286 unsigned int id = 0; 00287 setState('r'); 00288 leaveState(); 00289 setState('d'); 00290 unsigned char a,b,c,d; 00291 a = readByte(); 00292 b = readByte(); 00293 c = readByte(); 00294 d = readByte(); 00295 leaveState(); 00296 id = id | d; 00297 id = id << 8; 00298 id = id | c; 00299 id = id << 8; 00300 id = id | b; 00301 id = id << 8; 00302 id = id | a; 00303 pc_jtag.printf("JTAG ID: 0x%X\n",id); 00304 return id; 00305 } 00306 00307 bool JTAG::JTAG_test(void) 00308 { 00309 00310 //for FFT test 00311 unsigned int address = 0x44000008; 00312 unsigned int value = 0x00000001; 00313 JTAG_RESET = 0; 00314 wait_us(100); 00315 JTAG_RESET = 1; 00316 wait_us(100); 00317 00318 //readID(); 00319 DAP_enable(); 00320 00321 loadProgram(); 00322 00323 address = 0x44000008; 00324 value = 0x00000001; 00325 writeMemory(address, value); 00326 00327 address = 0x44000004; 00328 writeMemory(address, value); 00329 wait(0.5); 00330 bool if_match = true; 00331 for(int i=0; i<256; i++) { 00332 address = 0x60000100; 00333 address += i*0x4; 00334 value = readMemory(address); 00335 if (expected_result[i]!=value) { 00336 if_match = false; 00337 } 00338 } 00339 return if_match; 00340 } 00341 00342 void JTAG::loadProgram() 00343 { 00344 unsigned int address; 00345 unsigned int value; 00346 00347 address = 0xE000EDF0; 00348 value = 0xA05F0003; 00349 writeMemory(address, value); 00350 value = readMemory(address); 00351 00352 00353 if (value & 0x00000003 == 0x00000003) { 00354 //pc_jtag.printf("Halting core...\n"); 00355 } else { 00356 pc_jtag.printf("cannot halt the core, check DHCSR...\n"); 00357 return; 00358 } 00359 00360 address = 0x44000008; 00361 value = 0x00000000; 00362 writeMemory(address, value); 00363 00364 FILE *fp = fopen("/local/program.hex", "r"); 00365 if (fp == NULL) { 00366 pc_jtag.printf("Error in open /local/program.hex\n"); 00367 return; 00368 } 00369 //pc_jtag.printf("open /local/program.hex...OK\n"); 00370 address = 0x10000000; 00371 value = 0x00000000; 00372 char buf = 'm'; 00373 bool file_end = false; 00374 int word_loc=0; 00375 while (!feof(fp)) { 00376 00377 buf = fgetc(fp); 00378 word_loc++; 00379 switch (buf) { 00380 case '0' : 00381 value <<= 4; 00382 value += 0x0; 00383 break; 00384 case '1' : 00385 value <<= 4; 00386 value += 0x1; 00387 break; 00388 case '2' : 00389 value <<= 4; 00390 value += 0x2; 00391 break; 00392 case '3' : 00393 value <<= 4; 00394 value += 0x3; 00395 break; 00396 case '4' : 00397 value <<= 4; 00398 value += 0x4; 00399 break; 00400 case '5' : 00401 value <<= 4; 00402 value += 0x5; 00403 break; 00404 case '6' : 00405 value <<= 4; 00406 value += 0x6; 00407 break; 00408 case '7' : 00409 value <<= 4; 00410 value += 0x7; 00411 break; 00412 case '8' : 00413 value <<= 4; 00414 value += 0x8; 00415 break; 00416 case '9' : 00417 value <<= 4; 00418 value += 0x9; 00419 break; 00420 case 'a' : 00421 value <<= 4; 00422 value += 0xA; 00423 break; 00424 case 'b' : 00425 value <<= 4; 00426 value += 0xB; 00427 break; 00428 case 'c' : 00429 value <<= 4; 00430 value += 0xC; 00431 break; 00432 case 'd' : 00433 value <<= 4; 00434 value += 0xD; 00435 break; 00436 case 'e' : 00437 value <<= 4; 00438 value += 0xE; 00439 break; 00440 case 'f' : 00441 value <<= 4; 00442 value += 0xF; 00443 break; 00444 case 'A' : 00445 value <<= 4; 00446 value += 0xA; 00447 break; 00448 case 'B' : 00449 value <<= 4; 00450 value += 0xB; 00451 break; 00452 case 'C' : 00453 value <<= 4; 00454 value += 0xC; 00455 break; 00456 case 'D' : 00457 value <<= 4; 00458 value += 0xD; 00459 break; 00460 case 'E' : 00461 value <<= 4; 00462 value += 0xE; 00463 break; 00464 case 'F' : 00465 value <<= 4; 00466 value += 0xF; 00467 break; 00468 default : 00469 word_loc--; 00470 break; 00471 } 00472 if(word_loc>7) { 00473 writeMemory(address, value); 00474 address += 4; 00475 value = 0; 00476 word_loc = 0; 00477 } 00478 } 00479 fclose(fp); 00480 } 00481 00482 unsigned int JTAG::readMemory(unsigned int address) 00483 { 00484 unsigned char a, b, c, d, e; 00485 d = address & 0xFF; 00486 address = address >> 8; 00487 c = address & 0xFF; 00488 address = address >> 8; 00489 b = address & 0xFF; 00490 address = address >> 8; 00491 a = address & 0xFF; 00492 00493 // set TAR 00494 e = 0x40; 00495 writeAPACC(a,b,c,d,e); 00496 00497 // read DRW 00498 e = 0xE0; 00499 writeAPACC(a,b,c,d,e); 00500 readAPACC(a,b,c,d,e); 00501 00502 unsigned int out = 0; 00503 out = out | a; 00504 out = out << 8; 00505 out = out | b; 00506 out = out << 8; 00507 out = out | c; 00508 out = out << 8; 00509 out = out | d; 00510 00511 return out; 00512 } 00513 00514 void JTAG::writeMemory(unsigned int address, unsigned int value) 00515 { 00516 unsigned char a, b, c, d, e; 00517 d = address & 0xFF; 00518 address = address >> 8; 00519 c = address & 0xFF; 00520 address = address >> 8; 00521 b = address & 0xFF; 00522 address = address >> 8; 00523 a = address & 0xFF; 00524 00525 // set TAR 00526 e = 0x40; 00527 writeAPACC(a,b,c,d,e); 00528 00529 d = value & 0xFF; 00530 value = value >> 8; 00531 c = value & 0xFF; 00532 value = value >> 8; 00533 b = value & 0xFF; 00534 value = value >> 8; 00535 a = value & 0xFF; 00536 00537 // check DRW 00538 e = 0xC0; 00539 writeAPACC(a,b,c,d,e); 00540 00541 } 00542 00543 void JTAG::DAP_enable(void) 00544 { 00545 setState('r'); 00546 leaveState(); 00547 // write CTRL to enable DAP 00548 unsigned char a, b, c, d, e; 00549 a = 0x50; 00550 b = 0x00; 00551 c = 0x00; 00552 d = 0x00; 00553 e = 0x40; 00554 writeDPACC(a,b,c,d,e); 00555 readDPACC(a,b,c,d,e); 00556 00557 // set AP select 00558 a = 0x00; 00559 b = 0x00; 00560 c = 0x00; 00561 d = 0x00; 00562 e = 0x80; 00563 writeDPACC(a,b,c,d,e); 00564 readDPACC(a,b,c,d,e); 00565 00566 // set AP CSW 00567 a = 0x23; 00568 b = 0x00; 00569 c = 0x00; 00570 d = 0x42; 00571 e = 0x00; 00572 writeAPACC(a,b,c,d,e); 00573 readAPACC(a,b,c,d,e); 00574 00575 // set AP CSW 00576 a = 0x23; 00577 b = 0x00; 00578 c = 0x00; 00579 d = 0x52; 00580 e = 0x00; 00581 writeAPACC(a,b,c,d,e); 00582 readAPACC(a,b,c,d,e); 00583 00584 } 00585 00586 void JTAG::setIR(unsigned char A) 00587 { 00588 setState('i'); 00589 writeByte(A); 00590 leaveState(); 00591 } 00592 00593 void JTAG::readDPACC(unsigned char& A, unsigned char& B, unsigned char& C, unsigned char& D, unsigned char& E) 00594 { 00595 unsigned char i; 00596 E = 0; 00597 i = 0xA0; 00598 setIR(i); 00599 DataHigh(); 00600 setState('d'); 00601 if (TDO) { 00602 E += 0x04; 00603 } 00604 clockTicks(1); 00605 if (TDO) { 00606 E += 0x02; 00607 } 00608 clockTicks(1); 00609 if (TDO) { 00610 E += 0x01; 00611 } 00612 clockTicks(1); 00613 D = readByte(); 00614 C = readByte(); 00615 B = readByte(); 00616 A = readByte(); 00617 leaveState(); 00618 } 00619 00620 void JTAG::readAPACC(unsigned char& A, unsigned char& B, unsigned char& C, 00621 unsigned char& D, unsigned char& E) 00622 { 00623 unsigned char i; 00624 E = 0; 00625 i = 0xB0; 00626 setIR(i); 00627 DataHigh(); 00628 setState('d'); 00629 if (TDO) { 00630 E += 0x04; 00631 } 00632 clockTicks(1); 00633 if (TDO) { 00634 E += 0x02; 00635 } 00636 clockTicks(1); 00637 if (TDO) { 00638 E += 0x01; 00639 } 00640 clockTicks(1); 00641 D = readByte(); 00642 C = readByte(); 00643 B = readByte(); 00644 A = readByte(); 00645 leaveState(); 00646 } 00647 00648 void JTAG::writeAPACC(unsigned char A, unsigned char B, unsigned char C, 00649 unsigned char D, unsigned char E) 00650 { 00651 unsigned char i; 00652 i = 0xB0; 00653 setIR(i); 00654 setState('d'); 00655 writeByte(E); 00656 writeByte(D); 00657 writeByte(C); 00658 writeByte(B); 00659 writeByte(A); 00660 leaveState(); 00661 } 00662 00663 void JTAG::writeDPACC(unsigned char A, unsigned char B, unsigned char C, unsigned char D, unsigned char E) 00664 { 00665 unsigned char i; 00666 i = 0xA0; 00667 setIR(i); 00668 setState('d'); 00669 writeByte(E); 00670 writeByte(D); 00671 writeByte(C); 00672 writeByte(B); 00673 writeByte(A); 00674 leaveState(); 00675 } 00676 00677 //moves to specified state from IDLE (reset from anywhere) 00678 void JTAG::setState(unsigned char c) 00679 { 00680 switch (c) { 00681 case 'n': 00682 break; 00683 case 'r': 00684 reset(); 00685 break; 00686 case 'd': 00687 TMSHigh(); 00688 clockTicks(1); 00689 TMSLow(); 00690 clockTicks(2); 00691 state = 'd'; 00692 break; 00693 case 'i': 00694 TMSHigh(); 00695 clockTicks(2); 00696 TMSLow(); 00697 clockTicks(2); 00698 state = 'i'; 00699 break; 00700 default: 00701 break; 00702 } 00703 } 00704 00705 void JTAG::setJTAGspeed(int speed) 00706 { 00707 delay = 1000/speed; 00708 return; 00709 } 00710 00711 //leave from current state to idle state 00712 void JTAG::leaveState(void) 00713 { 00714 switch (state) { 00715 case 'n': 00716 break; 00717 case 'r': 00718 TMSLow(); 00719 clockTicks(1); 00720 state = 'n'; 00721 break; 00722 case 'i': 00723 TMSHigh(); 00724 clockTicks(2); 00725 TMSLow(); 00726 clockTicks(1); 00727 state = 'n'; 00728 break; 00729 case 'd': 00730 TMSHigh(); 00731 clockTicks(2); 00732 TMSLow(); 00733 clockTicks(1); 00734 state = 'n'; 00735 break; 00736 default: 00737 break; 00738 } 00739 } 00740 00741 void JTAG::reset(void) 00742 { 00743 TMSHigh(); 00744 clockTicks(10); 00745 TMSLow(); 00746 state = 'r'; 00747 return; 00748 } 00749 00750 void JTAG::writeByte(char c) 00751 { 00752 clockLow(); 00753 int i; 00754 for (i=0; i<8; i++) { 00755 clockTicks(1); 00756 if ( (c & 1)== 0 ) { 00757 DataLow(); 00758 } else { 00759 DataHigh(); 00760 } 00761 c=c>>1; 00762 } 00763 } 00764 00765 char JTAG::readByte(void) 00766 { 00767 char c=0; 00768 clockLow(); 00769 int i; 00770 for (i=0; i<8; i++) { 00771 c=c>>1; 00772 if (TDO) { 00773 c+=0x80; 00774 } 00775 clockTicks(1); 00776 00777 } 00778 return c; 00779 } 00780 00781 void JTAG::DataLow(void) 00782 { 00783 wait_us(delay); 00784 TDI = 0; 00785 } 00786 void JTAG::DataHigh(void) 00787 { 00788 wait_us(delay); 00789 TDI = 1; 00790 } 00791 00792 void JTAG::clockLow(void) 00793 { 00794 wait_us(delay); 00795 TCK = 0; 00796 } 00797 00798 void JTAG::clockHigh(void) 00799 { 00800 wait_us(delay); 00801 TCK = 1; 00802 } 00803 00804 void JTAG::clockTicks(unsigned char c) 00805 { 00806 int i; 00807 clockLow(); 00808 for (i=0; i<c; i++) { 00809 clockLow(); 00810 clockHigh(); 00811 } 00812 clockLow(); 00813 } 00814 00815 void JTAG::TMSHigh(void) 00816 { 00817 wait_us(delay); 00818 TMS = 1; 00819 } 00820 00821 void JTAG::TMSLow(void) 00822 { 00823 wait_us(delay); 00824 TMS = 0; 00825 } 00826 00827 00828 00829 00830 00831 00832 00833 00834 00835 00836 00837 00838 00839 00840 00841 00842 00843 00844 00845
Generated on Thu Jul 14 2022 07:51:10 by
1.7.2