This is the DDRO software we write to operate the chip

Dependencies:   mbed

Embed: (wiki syntax)

« Back to documentation index

Show/hide line numbers JTAG.cpp Source File

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