Zimin Wang / Mbed 2 deprecated DDRO_Farrari

Dependencies:   mbed-rtos mbed

Fork of DDRO_Farrari by Liangzhen Lai

Committer:
josewang
Date:
Tue Feb 25 02:14:41 2014 +0000
Revision:
10:95e9932f7990
Parent:
3:f8f27b0de752
Read from ram buffer and print

Who changed what in which revision?

UserRevisionLine numberNew contents of line
liangzhen 0:84a8bcfbdec9 1 #include "jtag.h"
liangzhen 0:84a8bcfbdec9 2 #include "mbed.h"
liangzhen 0:84a8bcfbdec9 3 #include "pinout.h"
liangzhen 0:84a8bcfbdec9 4 #include "mmap.h"
josewang 10:95e9932f7990 5 #include "panic.h"
josewang 10:95e9932f7990 6 #include "basic_io.h"
liangzhen 0:84a8bcfbdec9 7
liangzhen 0:84a8bcfbdec9 8 using namespace std;
liangzhen 0:84a8bcfbdec9 9
liangzhen 0:84a8bcfbdec9 10
liangzhen 0:84a8bcfbdec9 11
liangzhen 0:84a8bcfbdec9 12 //-----------------------------------------
liangzhen 0:84a8bcfbdec9 13 // Memory
liangzhen 0:84a8bcfbdec9 14
liangzhen 0:84a8bcfbdec9 15 unsigned int JTAG::memRead(unsigned int baseaddr, unsigned int readdata[], int size, bool check, bool print)
liangzhen 0:84a8bcfbdec9 16 {
liangzhen 0:84a8bcfbdec9 17 unsigned int mismatch = 0;
liangzhen 0:84a8bcfbdec9 18
liangzhen 0:84a8bcfbdec9 19 writeBanksel(0);
liangzhen 0:84a8bcfbdec9 20 writeAPACC(0x23000052, AP_CSW);
liangzhen 0:84a8bcfbdec9 21
liangzhen 0:84a8bcfbdec9 22 unsigned int addr = baseaddr;
liangzhen 0:84a8bcfbdec9 23
liangzhen 0:84a8bcfbdec9 24 int i = 0;
liangzhen 0:84a8bcfbdec9 25 while(i*1024 < size) {
liangzhen 0:84a8bcfbdec9 26 writeAPACC(addr, AP_TAR, false);
liangzhen 0:84a8bcfbdec9 27
liangzhen 0:84a8bcfbdec9 28 readAPACC(AP_DRW, false, false);
liangzhen 0:84a8bcfbdec9 29 unsigned int j;
liangzhen 0:84a8bcfbdec9 30 for(j=1024*i+1; j<1024*(i+1) && j<size; j++) {
liangzhen 0:84a8bcfbdec9 31 unsigned int word = readAPACC(AP_DRW, false, false);
liangzhen 0:84a8bcfbdec9 32 if(check) {
liangzhen 0:84a8bcfbdec9 33 if(readdata[j-1] != word) {
liangzhen 0:84a8bcfbdec9 34 mismatch++;
liangzhen 0:84a8bcfbdec9 35 if(print) {
josewang 10:95e9932f7990 36 mbed_printf("Mismatch line %x, was %x, expected %x\r\n", j-1, word, readdata[j-1]);
liangzhen 0:84a8bcfbdec9 37 }
liangzhen 0:84a8bcfbdec9 38 }
liangzhen 0:84a8bcfbdec9 39 }
liangzhen 0:84a8bcfbdec9 40 readdata[j-1] = word;
liangzhen 0:84a8bcfbdec9 41 }
liangzhen 0:84a8bcfbdec9 42 unsigned int word = rdBuff(false);
liangzhen 0:84a8bcfbdec9 43 if(check) {
liangzhen 0:84a8bcfbdec9 44 if(readdata[j-1] != word) {
liangzhen 0:84a8bcfbdec9 45 mismatch++;
liangzhen 0:84a8bcfbdec9 46 if(print) {
josewang 10:95e9932f7990 47 mbed_printf("Mismatch line %x, was %x, expected %x\r\n", j-1, word, readdata[j-1]);
liangzhen 0:84a8bcfbdec9 48 }
liangzhen 0:84a8bcfbdec9 49 }
liangzhen 0:84a8bcfbdec9 50 }
liangzhen 0:84a8bcfbdec9 51 readdata[j-1] = word;
liangzhen 0:84a8bcfbdec9 52
liangzhen 0:84a8bcfbdec9 53 addr = addr + 1024*4;
liangzhen 0:84a8bcfbdec9 54 i++;
liangzhen 0:84a8bcfbdec9 55 }
liangzhen 0:84a8bcfbdec9 56 return mismatch;
liangzhen 0:84a8bcfbdec9 57 }
liangzhen 0:84a8bcfbdec9 58
liangzhen 0:84a8bcfbdec9 59 void JTAG::memWrite(unsigned int baseaddr, unsigned int writedata[], int size, bool zero)
liangzhen 0:84a8bcfbdec9 60 {
liangzhen 0:84a8bcfbdec9 61 if(zero){
josewang 10:95e9932f7990 62 mbed_printf("Called with %x, %x\r\n", baseaddr, size);
liangzhen 0:84a8bcfbdec9 63 }
liangzhen 0:84a8bcfbdec9 64 writeBanksel(0);
liangzhen 0:84a8bcfbdec9 65 writeAPACC(0x23000052, AP_CSW);
liangzhen 0:84a8bcfbdec9 66
liangzhen 0:84a8bcfbdec9 67 unsigned int addr = baseaddr;
liangzhen 0:84a8bcfbdec9 68
liangzhen 0:84a8bcfbdec9 69 int i = 0;
liangzhen 0:84a8bcfbdec9 70 while(i*1024 < size) {
liangzhen 0:84a8bcfbdec9 71 writeAPACC(addr, AP_TAR, false);
liangzhen 0:84a8bcfbdec9 72
liangzhen 0:84a8bcfbdec9 73 for(int j=1024*i; j<1024*(i+1) && j<size; j++) {
liangzhen 0:84a8bcfbdec9 74 if(zero) {
liangzhen 0:84a8bcfbdec9 75 writeAPACC(0, AP_DRW, false);
liangzhen 0:84a8bcfbdec9 76 } else {
liangzhen 0:84a8bcfbdec9 77 writeAPACC(writedata[j], AP_DRW, false);
liangzhen 0:84a8bcfbdec9 78 }
liangzhen 0:84a8bcfbdec9 79 }
liangzhen 0:84a8bcfbdec9 80
liangzhen 0:84a8bcfbdec9 81 addr = addr + 1024*4;
liangzhen 0:84a8bcfbdec9 82 i++;
liangzhen 0:84a8bcfbdec9 83 }
liangzhen 0:84a8bcfbdec9 84 }
liangzhen 0:84a8bcfbdec9 85
liangzhen 0:84a8bcfbdec9 86 unsigned int JTAG::readMemory(unsigned int address)
liangzhen 0:84a8bcfbdec9 87 {
liangzhen 0:84a8bcfbdec9 88 writeBanksel(0);
liangzhen 0:84a8bcfbdec9 89 writeAPACC(0x23000052, AP_CSW);
liangzhen 0:84a8bcfbdec9 90 writeAPACC(address, AP_TAR);
liangzhen 0:84a8bcfbdec9 91 return readAPACC(AP_DRW);
liangzhen 0:84a8bcfbdec9 92 }
liangzhen 0:84a8bcfbdec9 93
liangzhen 0:84a8bcfbdec9 94 void JTAG::writeMemory(unsigned int address, unsigned int value)
liangzhen 0:84a8bcfbdec9 95 {
liangzhen 0:84a8bcfbdec9 96 writeBanksel(0);
liangzhen 0:84a8bcfbdec9 97 writeAPACC(0x23000052, AP_CSW);
liangzhen 0:84a8bcfbdec9 98 writeAPACC(address, AP_TAR);
liangzhen 0:84a8bcfbdec9 99 writeAPACC(value, AP_DRW);
liangzhen 0:84a8bcfbdec9 100 //rdBuff();
liangzhen 0:84a8bcfbdec9 101 }
liangzhen 0:84a8bcfbdec9 102
liangzhen 0:84a8bcfbdec9 103 int JTAG::loadProgram()
liangzhen 0:84a8bcfbdec9 104 {
liangzhen 0:84a8bcfbdec9 105 unsigned int address;
liangzhen 0:84a8bcfbdec9 106 unsigned int value;
liangzhen 0:84a8bcfbdec9 107 //dual_printf("Halting Core");
liangzhen 0:84a8bcfbdec9 108 PowerupDAP();
liangzhen 0:84a8bcfbdec9 109
liangzhen 0:84a8bcfbdec9 110 address = DHCSR_ADDR;
liangzhen 0:84a8bcfbdec9 111 value = DHCSR_DBGKEY | DHCSR_C_HALT | DHCSR_C_DEBUGEN;
liangzhen 0:84a8bcfbdec9 112 writeMemory(address, value);
liangzhen 0:84a8bcfbdec9 113 value = readMemory(address);
liangzhen 0:84a8bcfbdec9 114 if (! ((value & DHCSR_C_HALT) && (value & DHCSR_C_DEBUGEN)) ) {
josewang 10:95e9932f7990 115 panic("cannot halt the core, check DHCSR...\r\n");
liangzhen 0:84a8bcfbdec9 116 }
liangzhen 0:84a8bcfbdec9 117
liangzhen 0:84a8bcfbdec9 118 // dual_printf("Reading Program HEX");
liangzhen 0:84a8bcfbdec9 119 // pc.printf("loading program\r\n");
liangzhen 0:84a8bcfbdec9 120 FILE *fp = fopen("/local/program.txt", "r");
liangzhen 0:84a8bcfbdec9 121 // pc.printf("Program open\r\n");
liangzhen 0:84a8bcfbdec9 122 if (fp == NULL) {
josewang 10:95e9932f7990 123 panic("Error in open /local/program.txt\r\n");
liangzhen 0:84a8bcfbdec9 124 }
liangzhen 0:84a8bcfbdec9 125
liangzhen 0:84a8bcfbdec9 126 // Similar to MemWrite here
liangzhen 0:84a8bcfbdec9 127 // dual_printf("Load prog in Imem");
liangzhen 0:84a8bcfbdec9 128 writeBanksel(0);
liangzhen 0:84a8bcfbdec9 129 writeAPACC(0x23000052, AP_CSW);
liangzhen 0:84a8bcfbdec9 130 unsigned int addr = 0x10000000;
liangzhen 0:84a8bcfbdec9 131
liangzhen 0:84a8bcfbdec9 132 while(!feof(fp)) {
liangzhen 0:84a8bcfbdec9 133 writeAPACC(addr, AP_TAR, false);
liangzhen 0:84a8bcfbdec9 134 for(int j=0; j<1024 && !feof(fp); j++) {
liangzhen 0:84a8bcfbdec9 135 unsigned int d;
liangzhen 0:84a8bcfbdec9 136 fscanf(fp, "%X", &d);
liangzhen 0:84a8bcfbdec9 137 writeAPACC(d, AP_DRW, false);
liangzhen 0:84a8bcfbdec9 138 }
liangzhen 0:84a8bcfbdec9 139 addr = addr + 1024*4;
liangzhen 0:84a8bcfbdec9 140 }
liangzhen 0:84a8bcfbdec9 141
liangzhen 0:84a8bcfbdec9 142 // dual_printf("Check prog in Imem");
liangzhen 0:84a8bcfbdec9 143 unsigned int mismatch = 0;
liangzhen 0:84a8bcfbdec9 144
liangzhen 0:84a8bcfbdec9 145 writeBanksel(0);
liangzhen 0:84a8bcfbdec9 146 writeAPACC(0x23000052, AP_CSW);
liangzhen 0:84a8bcfbdec9 147 addr = 0x10000000;
liangzhen 0:84a8bcfbdec9 148
liangzhen 0:84a8bcfbdec9 149 while(!feof(fp)) {
liangzhen 0:84a8bcfbdec9 150 writeAPACC(addr, AP_TAR, false);
liangzhen 0:84a8bcfbdec9 151
liangzhen 0:84a8bcfbdec9 152 readAPACC(AP_DRW, false, false);
liangzhen 0:84a8bcfbdec9 153 unsigned int j;
liangzhen 0:84a8bcfbdec9 154 for(j=1; j<1024 && !feof(fp); j++) {
liangzhen 0:84a8bcfbdec9 155 unsigned int word = readAPACC(AP_DRW, false, false);
liangzhen 0:84a8bcfbdec9 156 unsigned int d;
liangzhen 0:84a8bcfbdec9 157 fscanf(fp, "%X", &d);
liangzhen 0:84a8bcfbdec9 158 if(d != word) {
liangzhen 0:84a8bcfbdec9 159 mismatch++;
josewang 10:95e9932f7990 160 mbed_printf("Mismatch line %x, was %x, expected %x\r\n", j-1, word, d);
liangzhen 0:84a8bcfbdec9 161 }
liangzhen 0:84a8bcfbdec9 162 }
liangzhen 0:84a8bcfbdec9 163 if(!feof(fp)){
liangzhen 0:84a8bcfbdec9 164 unsigned int word = rdBuff(false);
liangzhen 0:84a8bcfbdec9 165 unsigned int d;
liangzhen 0:84a8bcfbdec9 166 fscanf(fp, "%X", &d);
liangzhen 0:84a8bcfbdec9 167 if(d != word) {
liangzhen 0:84a8bcfbdec9 168 mismatch++;
josewang 10:95e9932f7990 169 mbed_printf("Mismatch line %x, was %x, expected %x\r\n", j-1, word, d);
liangzhen 0:84a8bcfbdec9 170 }
liangzhen 0:84a8bcfbdec9 171 }
liangzhen 0:84a8bcfbdec9 172 addr = addr + 1024*4;
liangzhen 0:84a8bcfbdec9 173 }
liangzhen 0:84a8bcfbdec9 174 if(mismatch) {
josewang 10:95e9932f7990 175 panic("Mem Load Failed");
liangzhen 0:84a8bcfbdec9 176 }
liangzhen 0:84a8bcfbdec9 177
liangzhen 0:84a8bcfbdec9 178 fclose(fp);
liangzhen 0:84a8bcfbdec9 179
liangzhen 0:84a8bcfbdec9 180 //dual_printf("Map Imem to addr 0");
liangzhen 0:84a8bcfbdec9 181 writeMemory(set_imem, 1);
liangzhen 0:84a8bcfbdec9 182 return 0;
liangzhen 0:84a8bcfbdec9 183 }
liangzhen 0:84a8bcfbdec9 184
liangzhen 0:84a8bcfbdec9 185 // ------------------------------------------------
liangzhen 0:84a8bcfbdec9 186 // DP/AP Config
liangzhen 0:84a8bcfbdec9 187
liangzhen 0:84a8bcfbdec9 188 unsigned int JTAG::rdBuff(bool set_ir=true)
liangzhen 0:84a8bcfbdec9 189 {
liangzhen 0:84a8bcfbdec9 190 if(set_ir) {
liangzhen 0:84a8bcfbdec9 191 setIR(JTAG_DPACC);
liangzhen 0:84a8bcfbdec9 192 }
liangzhen 0:84a8bcfbdec9 193 return shiftData(0, DP_RDBUFF, READ);
liangzhen 0:84a8bcfbdec9 194 }
liangzhen 0:84a8bcfbdec9 195
liangzhen 0:84a8bcfbdec9 196 unsigned int JTAG::readDPACC(unsigned char addr, bool set_ir, bool rdthis)
liangzhen 0:84a8bcfbdec9 197 {
liangzhen 0:84a8bcfbdec9 198 if(set_ir) {
liangzhen 0:84a8bcfbdec9 199 setIR(JTAG_DPACC);
liangzhen 0:84a8bcfbdec9 200 }
liangzhen 0:84a8bcfbdec9 201 unsigned int retdata = shiftData(0, addr, READ);
liangzhen 0:84a8bcfbdec9 202 if(rdthis) {
liangzhen 0:84a8bcfbdec9 203 return rdBuff();
liangzhen 0:84a8bcfbdec9 204 } else {
liangzhen 0:84a8bcfbdec9 205 return retdata;
liangzhen 0:84a8bcfbdec9 206 }
liangzhen 0:84a8bcfbdec9 207 }
liangzhen 0:84a8bcfbdec9 208 unsigned int JTAG::readAPACC(unsigned char addr, bool set_ir, bool rdthis)
liangzhen 0:84a8bcfbdec9 209 {
liangzhen 0:84a8bcfbdec9 210 if(set_ir) {
liangzhen 0:84a8bcfbdec9 211 setIR(JTAG_APACC);
liangzhen 0:84a8bcfbdec9 212 }
liangzhen 0:84a8bcfbdec9 213 unsigned int retdata = shiftData(0, addr, READ);
liangzhen 0:84a8bcfbdec9 214 if(rdthis) {
liangzhen 0:84a8bcfbdec9 215 return rdBuff();
liangzhen 0:84a8bcfbdec9 216 } else {
liangzhen 0:84a8bcfbdec9 217 return retdata;
liangzhen 0:84a8bcfbdec9 218 }
liangzhen 0:84a8bcfbdec9 219 }
liangzhen 0:84a8bcfbdec9 220
josewang 2:bf2ce6c4e789 221 // JTAG DP / AP Access Registers (DPACC / APACC)
josewang 2:bf2ce6c4e789 222 // http://infocenter.arm.com/help/index.jsp?topic=/com.arm.doc.ddi0413c/Babcdjce.html
liangzhen 0:84a8bcfbdec9 223 void JTAG::writeAPACC(unsigned int data, unsigned char addr, bool set_ir)
liangzhen 0:84a8bcfbdec9 224 {
liangzhen 0:84a8bcfbdec9 225 if(set_ir) {
liangzhen 0:84a8bcfbdec9 226 setIR(JTAG_APACC);
liangzhen 0:84a8bcfbdec9 227 }
liangzhen 0:84a8bcfbdec9 228 shiftData(data, addr, WRITE);
liangzhen 0:84a8bcfbdec9 229 }
liangzhen 0:84a8bcfbdec9 230
liangzhen 0:84a8bcfbdec9 231 void JTAG::writeDPACC(unsigned int data, unsigned char addr, bool set_ir)
liangzhen 0:84a8bcfbdec9 232 {
liangzhen 0:84a8bcfbdec9 233 if(set_ir) {
liangzhen 0:84a8bcfbdec9 234 setIR(JTAG_DPACC);
liangzhen 0:84a8bcfbdec9 235 }
liangzhen 0:84a8bcfbdec9 236 shiftData(data, addr, WRITE);
liangzhen 0:84a8bcfbdec9 237 }
liangzhen 0:84a8bcfbdec9 238
liangzhen 0:84a8bcfbdec9 239 void JTAG::writeBanksel(unsigned int banksel, bool set_ir)
liangzhen 0:84a8bcfbdec9 240 {
liangzhen 0:84a8bcfbdec9 241 if(set_ir) {
liangzhen 0:84a8bcfbdec9 242 setIR(JTAG_DPACC);
liangzhen 0:84a8bcfbdec9 243 }
liangzhen 0:84a8bcfbdec9 244 shiftData(banksel << 4, DP_SELECT, WRITE);
liangzhen 0:84a8bcfbdec9 245 }
liangzhen 0:84a8bcfbdec9 246
josewang 2:bf2ce6c4e789 247 // DAP: Debug Access Port
josewang 2:bf2ce6c4e789 248 // http://infocenter.arm.com/help/index.jsp?topic=/com.arm.doc.ddi0314h/Babdadfc.html
liangzhen 0:84a8bcfbdec9 249 void JTAG::DAP_enable(void)
liangzhen 0:84a8bcfbdec9 250 {
liangzhen 0:84a8bcfbdec9 251 setState('r');
liangzhen 0:84a8bcfbdec9 252 leaveState();
liangzhen 0:84a8bcfbdec9 253 // write CTRL to enable DAP
liangzhen 0:84a8bcfbdec9 254
liangzhen 0:84a8bcfbdec9 255 writeDPACC(0x50000000, DP_CTRLSTAT);
liangzhen 0:84a8bcfbdec9 256 writeDPACC(0x00000000, AP_SELECT);
liangzhen 0:84a8bcfbdec9 257 writeAPACC(0x23000042, AP_CSW);
liangzhen 0:84a8bcfbdec9 258 }
liangzhen 0:84a8bcfbdec9 259
liangzhen 0:84a8bcfbdec9 260
liangzhen 0:84a8bcfbdec9 261 void JTAG::PowerupDAP()
liangzhen 0:84a8bcfbdec9 262 {
liangzhen 0:84a8bcfbdec9 263 writeDPACC(0x12345678, DP_SELECT);
liangzhen 0:84a8bcfbdec9 264 int rd = readDPACC(DP_SELECT);
liangzhen 0:84a8bcfbdec9 265 if(rd != 0x12000070) {
josewang 10:95e9932f7990 266 //pc.printf("DP SELECT %x", rd);
josewang 10:95e9932f7990 267 //exit(1);
josewang 10:95e9932f7990 268 panic("DP SELECT %x", rd);
liangzhen 0:84a8bcfbdec9 269 }
liangzhen 0:84a8bcfbdec9 270 writeDPACC(0xedcba987, DP_SELECT);
liangzhen 0:84a8bcfbdec9 271 rd = readDPACC(DP_SELECT);
liangzhen 0:84a8bcfbdec9 272 if(rd != 0xed000080) {
josewang 10:95e9932f7990 273 //pc.printf("DP SELECT %x", rd);
josewang 10:95e9932f7990 274 //exit(1);
josewang 10:95e9932f7990 275 panic("DP SELECT %x", rd);
liangzhen 0:84a8bcfbdec9 276 }
liangzhen 0:84a8bcfbdec9 277 writeDPACC(0x10000000, DP_CTRLSTAT);
liangzhen 0:84a8bcfbdec9 278 rd = readDPACC(DP_CTRLSTAT);//////////////////////////////////////////////////////////////
liangzhen 0:84a8bcfbdec9 279 if(rd != 0x30000000) {
josewang 10:95e9932f7990 280 //pc.printf("DP CTRL %x", rd);
josewang 10:95e9932f7990 281 //exit(1);
josewang 10:95e9932f7990 282 panic("DP CTRL %x", rd);
liangzhen 0:84a8bcfbdec9 283 }
liangzhen 0:84a8bcfbdec9 284 writeDPACC(0x40000000, DP_CTRLSTAT);
liangzhen 0:84a8bcfbdec9 285 rd = readDPACC(DP_CTRLSTAT);
liangzhen 0:84a8bcfbdec9 286 if(rd != 0xc0000000) {
josewang 10:95e9932f7990 287 //pc.printf("DP CTRL %x", rd);
josewang 10:95e9932f7990 288 //exit(1);
josewang 10:95e9932f7990 289 panic("DP CTRL %x", rd);
liangzhen 0:84a8bcfbdec9 290 }
liangzhen 0:84a8bcfbdec9 291 writeDPACC(0x50000000, DP_CTRLSTAT);
liangzhen 0:84a8bcfbdec9 292 rd = readDPACC(DP_CTRLSTAT);
liangzhen 0:84a8bcfbdec9 293 if(rd != 0xf0000000) {
josewang 10:95e9932f7990 294 //pc.printf("DP CTRL %x", rd);
josewang 10:95e9932f7990 295 //exit(1);
josewang 10:95e9932f7990 296 panic("DP CTRL %x", rd);
liangzhen 0:84a8bcfbdec9 297 }
liangzhen 0:84a8bcfbdec9 298 writeBanksel(0xf);
liangzhen 0:84a8bcfbdec9 299 rd = readAPACC(AP_IDR);
liangzhen 0:84a8bcfbdec9 300 if(rd != 0x24770011) {
josewang 10:95e9932f7990 301 //pc.printf("AP IDR %x", rd);
josewang 10:95e9932f7990 302 //exit(1);
josewang 10:95e9932f7990 303 panic("AP IDR %x", rd);
liangzhen 0:84a8bcfbdec9 304 }
liangzhen 0:84a8bcfbdec9 305 }
liangzhen 0:84a8bcfbdec9 306
liangzhen 0:84a8bcfbdec9 307 // --------------------------------
liangzhen 0:84a8bcfbdec9 308 // State Manipulation
liangzhen 0:84a8bcfbdec9 309
josewang 2:bf2ce6c4e789 310 // IR: instruction register (IR)
liangzhen 0:84a8bcfbdec9 311 void JTAG::setIR(unsigned char A)
liangzhen 0:84a8bcfbdec9 312 {
liangzhen 0:84a8bcfbdec9 313 setState('i');
liangzhen 0:84a8bcfbdec9 314 char one = shiftBits(A, 4);
liangzhen 0:84a8bcfbdec9 315 if(one != 1) {
josewang 10:95e9932f7990 316 //dual_printf("ERROR: JTAG IR");
josewang 10:95e9932f7990 317 //pc.printf("Got %x instead of 1\r\n", one);
josewang 10:95e9932f7990 318 panic("ERROR: JTAG IR. Got %x instead of 1\r\n", one);
liangzhen 0:84a8bcfbdec9 319 }
liangzhen 0:84a8bcfbdec9 320 leaveState();
liangzhen 0:84a8bcfbdec9 321 }
liangzhen 0:84a8bcfbdec9 322
liangzhen 0:84a8bcfbdec9 323 //moves to specified state from IDLE (reset from anywhere)
liangzhen 0:84a8bcfbdec9 324 void JTAG::setState(unsigned char c)
liangzhen 0:84a8bcfbdec9 325 {
liangzhen 0:84a8bcfbdec9 326 switch (c) {
liangzhen 0:84a8bcfbdec9 327 case 'n':
liangzhen 0:84a8bcfbdec9 328 break;
liangzhen 0:84a8bcfbdec9 329 case 'r':
liangzhen 0:84a8bcfbdec9 330 reset();
liangzhen 0:84a8bcfbdec9 331 break;
liangzhen 0:84a8bcfbdec9 332 case 'd':
liangzhen 0:84a8bcfbdec9 333 TMSHigh();
liangzhen 0:84a8bcfbdec9 334 clockTicks(1);
liangzhen 0:84a8bcfbdec9 335 TMSLow();
liangzhen 0:84a8bcfbdec9 336 clockTicks(2);
liangzhen 0:84a8bcfbdec9 337 state = 'd';
liangzhen 0:84a8bcfbdec9 338 break;
liangzhen 0:84a8bcfbdec9 339 case 'i':
liangzhen 0:84a8bcfbdec9 340 TMSHigh();
liangzhen 0:84a8bcfbdec9 341 clockTicks(2);
liangzhen 0:84a8bcfbdec9 342 TMSLow();
liangzhen 0:84a8bcfbdec9 343 clockTicks(2);
liangzhen 0:84a8bcfbdec9 344 state = 'i';
liangzhen 0:84a8bcfbdec9 345 break;
liangzhen 0:84a8bcfbdec9 346 default:
liangzhen 0:84a8bcfbdec9 347 break;
liangzhen 0:84a8bcfbdec9 348 }
liangzhen 0:84a8bcfbdec9 349 }
liangzhen 0:84a8bcfbdec9 350
liangzhen 0:84a8bcfbdec9 351 //leave from current state to idle state
liangzhen 0:84a8bcfbdec9 352 void JTAG::leaveState(void)
liangzhen 0:84a8bcfbdec9 353 {
liangzhen 0:84a8bcfbdec9 354 switch (state) {
liangzhen 0:84a8bcfbdec9 355 case 'n':
liangzhen 0:84a8bcfbdec9 356 break;
liangzhen 0:84a8bcfbdec9 357 case 'r':
liangzhen 0:84a8bcfbdec9 358 TMSLow();
liangzhen 0:84a8bcfbdec9 359 clockTicks(1);
liangzhen 0:84a8bcfbdec9 360 state = 'n';
liangzhen 0:84a8bcfbdec9 361 break;
liangzhen 0:84a8bcfbdec9 362 case 'i':
liangzhen 0:84a8bcfbdec9 363 TMSHigh();
liangzhen 0:84a8bcfbdec9 364 clockTicks(2);
liangzhen 0:84a8bcfbdec9 365 TMSLow();
liangzhen 0:84a8bcfbdec9 366 clockTicks(1);
liangzhen 0:84a8bcfbdec9 367 state = 'n';
liangzhen 0:84a8bcfbdec9 368 break;
liangzhen 0:84a8bcfbdec9 369 case 'd':
liangzhen 0:84a8bcfbdec9 370 TMSHigh();
liangzhen 0:84a8bcfbdec9 371 clockTicks(2);
liangzhen 0:84a8bcfbdec9 372 TMSLow();
liangzhen 0:84a8bcfbdec9 373 clockTicks(1);
liangzhen 0:84a8bcfbdec9 374 state = 'n';
liangzhen 0:84a8bcfbdec9 375 break;
liangzhen 0:84a8bcfbdec9 376 default:
liangzhen 0:84a8bcfbdec9 377 break;
liangzhen 0:84a8bcfbdec9 378 }
liangzhen 0:84a8bcfbdec9 379 }
liangzhen 0:84a8bcfbdec9 380
liangzhen 0:84a8bcfbdec9 381 void JTAG::reset(void)
liangzhen 0:84a8bcfbdec9 382 {
liangzhen 0:84a8bcfbdec9 383 TMSHigh();
liangzhen 0:84a8bcfbdec9 384 clockTicks(10);
liangzhen 0:84a8bcfbdec9 385 TMSLow();
liangzhen 0:84a8bcfbdec9 386 state = 'r';
liangzhen 0:84a8bcfbdec9 387 return;
liangzhen 0:84a8bcfbdec9 388 }
liangzhen 0:84a8bcfbdec9 389
liangzhen 0:84a8bcfbdec9 390 unsigned int JTAG::readID(void)
liangzhen 0:84a8bcfbdec9 391 {
liangzhen 0:84a8bcfbdec9 392 setIR(JTAG_IDCODE);
liangzhen 0:84a8bcfbdec9 393 setState('d');
liangzhen 0:84a8bcfbdec9 394 unsigned int id = shiftBits(0, 32);
liangzhen 0:84a8bcfbdec9 395 leaveState();
liangzhen 0:84a8bcfbdec9 396
liangzhen 0:84a8bcfbdec9 397 return id;
liangzhen 0:84a8bcfbdec9 398 }
liangzhen 0:84a8bcfbdec9 399
liangzhen 0:84a8bcfbdec9 400 // --------------------------------------------
liangzhen 0:84a8bcfbdec9 401 // Data Shifting
liangzhen 0:84a8bcfbdec9 402
liangzhen 0:84a8bcfbdec9 403 unsigned int JTAG::shiftBits(unsigned int data, int n)
liangzhen 0:84a8bcfbdec9 404 {
liangzhen 0:84a8bcfbdec9 405 unsigned int c=0;
liangzhen 0:84a8bcfbdec9 406 clockLow();
liangzhen 0:84a8bcfbdec9 407 int i;
liangzhen 0:84a8bcfbdec9 408 for (i=0; i<n; i++) {
liangzhen 0:84a8bcfbdec9 409 if (TDO) {
liangzhen 0:84a8bcfbdec9 410 c+=(0x1 << i);
liangzhen 0:84a8bcfbdec9 411 }
liangzhen 0:84a8bcfbdec9 412
liangzhen 0:84a8bcfbdec9 413 clockTicks(1);
liangzhen 0:84a8bcfbdec9 414
liangzhen 0:84a8bcfbdec9 415 if ( (data & 1)== 0 ) {
liangzhen 0:84a8bcfbdec9 416 DataLow();
liangzhen 0:84a8bcfbdec9 417 } else {
liangzhen 0:84a8bcfbdec9 418 DataHigh();
liangzhen 0:84a8bcfbdec9 419 }
liangzhen 0:84a8bcfbdec9 420 data=data>>1;
liangzhen 0:84a8bcfbdec9 421 }
liangzhen 0:84a8bcfbdec9 422
liangzhen 0:84a8bcfbdec9 423 return c;
liangzhen 0:84a8bcfbdec9 424 }
liangzhen 0:84a8bcfbdec9 425
liangzhen 0:84a8bcfbdec9 426 unsigned int JTAG::shiftData(unsigned int data, char addr, bool rw)
liangzhen 0:84a8bcfbdec9 427 {
liangzhen 0:84a8bcfbdec9 428 bool gotwait = true;
liangzhen 0:84a8bcfbdec9 429 while(gotwait) {
liangzhen 0:84a8bcfbdec9 430 gotwait = false;
liangzhen 0:84a8bcfbdec9 431
liangzhen 0:84a8bcfbdec9 432 setState('d');
liangzhen 0:84a8bcfbdec9 433 // First 3 bits are either OK/FAULT 010, or WAIT 001
liangzhen 0:84a8bcfbdec9 434 int okstat = shiftBits(rw, 1);
liangzhen 0:84a8bcfbdec9 435 okstat |= (shiftBits(addr >> 2, 2) << 1);
liangzhen 0:84a8bcfbdec9 436
liangzhen 0:84a8bcfbdec9 437 if(okstat == 1) {
liangzhen 0:84a8bcfbdec9 438 wait_indicator = !wait_indicator;
liangzhen 0:84a8bcfbdec9 439 leaveState();
liangzhen 0:84a8bcfbdec9 440 gotwait = true;
liangzhen 0:84a8bcfbdec9 441 } else if(okstat == 2) {
liangzhen 0:84a8bcfbdec9 442 // Got OK/FAULT
liangzhen 0:84a8bcfbdec9 443 } else {
josewang 10:95e9932f7990 444 //dual_printf("invalid OK Stat");
liangzhen 0:84a8bcfbdec9 445 leaveState();
josewang 10:95e9932f7990 446 //exit(1);
josewang 10:95e9932f7990 447 panic("%s\r\n", "invalid OK Stat");
liangzhen 0:84a8bcfbdec9 448 }
liangzhen 0:84a8bcfbdec9 449 }
liangzhen 0:84a8bcfbdec9 450
liangzhen 0:84a8bcfbdec9 451 unsigned int retdata = shiftBits(data, 32);
liangzhen 0:84a8bcfbdec9 452 leaveState();
liangzhen 0:84a8bcfbdec9 453 return retdata;
liangzhen 0:84a8bcfbdec9 454 }
liangzhen 0:84a8bcfbdec9 455
liangzhen 0:84a8bcfbdec9 456
liangzhen 0:84a8bcfbdec9 457 // ----------------------------------
liangzhen 0:84a8bcfbdec9 458 // Toggle Functions
liangzhen 0:84a8bcfbdec9 459
liangzhen 0:84a8bcfbdec9 460 void JTAG::DataLow(void)
liangzhen 0:84a8bcfbdec9 461 {
liangzhen 0:84a8bcfbdec9 462 wait_us(delay);
liangzhen 0:84a8bcfbdec9 463 TDI = 0;
liangzhen 0:84a8bcfbdec9 464 }
liangzhen 0:84a8bcfbdec9 465 void JTAG::DataHigh(void)
liangzhen 0:84a8bcfbdec9 466 {
liangzhen 0:84a8bcfbdec9 467 wait_us(delay);
liangzhen 0:84a8bcfbdec9 468 TDI = 1;
liangzhen 0:84a8bcfbdec9 469 }
liangzhen 0:84a8bcfbdec9 470
liangzhen 0:84a8bcfbdec9 471 void JTAG::clockLow(void)
liangzhen 0:84a8bcfbdec9 472 {
liangzhen 0:84a8bcfbdec9 473 wait_us(delay);
liangzhen 0:84a8bcfbdec9 474 TCK = 0;
liangzhen 0:84a8bcfbdec9 475 }
liangzhen 0:84a8bcfbdec9 476
liangzhen 0:84a8bcfbdec9 477 void JTAG::clockHigh(void)
liangzhen 0:84a8bcfbdec9 478 {
liangzhen 0:84a8bcfbdec9 479 wait_us(delay);
liangzhen 0:84a8bcfbdec9 480 TCK = 1;
liangzhen 0:84a8bcfbdec9 481 }
liangzhen 0:84a8bcfbdec9 482
liangzhen 0:84a8bcfbdec9 483 void JTAG::clockTicks(unsigned char c)
liangzhen 0:84a8bcfbdec9 484 {
liangzhen 0:84a8bcfbdec9 485 int i;
liangzhen 0:84a8bcfbdec9 486 clockLow();
liangzhen 0:84a8bcfbdec9 487 for (i=0; i<c; i++) {
liangzhen 0:84a8bcfbdec9 488 clockLow();
liangzhen 0:84a8bcfbdec9 489 clockHigh();
liangzhen 0:84a8bcfbdec9 490 }
liangzhen 0:84a8bcfbdec9 491 clockLow();
liangzhen 0:84a8bcfbdec9 492 }
liangzhen 0:84a8bcfbdec9 493
josewang 2:bf2ce6c4e789 494 // JTAG: TMS (Test Mode Select)
josewang 2:bf2ce6c4e789 495 // http://en.wikipedia.org/wiki/Joint_Test_Action_Group
liangzhen 0:84a8bcfbdec9 496 void JTAG::TMSHigh(void)
liangzhen 0:84a8bcfbdec9 497 {
liangzhen 0:84a8bcfbdec9 498 wait_us(delay);
liangzhen 0:84a8bcfbdec9 499 TMS = 1;
liangzhen 0:84a8bcfbdec9 500 }
liangzhen 0:84a8bcfbdec9 501
liangzhen 0:84a8bcfbdec9 502 void JTAG::TMSLow(void)
liangzhen 0:84a8bcfbdec9 503 {
liangzhen 0:84a8bcfbdec9 504 wait_us(delay);
liangzhen 0:84a8bcfbdec9 505 TMS = 0;
liangzhen 0:84a8bcfbdec9 506 }
liangzhen 0:84a8bcfbdec9 507
liangzhen 0:84a8bcfbdec9 508 // --------------------------------
liangzhen 0:84a8bcfbdec9 509 // Initializing and Config
liangzhen 0:84a8bcfbdec9 510
liangzhen 0:84a8bcfbdec9 511 JTAG::JTAG()
liangzhen 0:84a8bcfbdec9 512 {
liangzhen 0:84a8bcfbdec9 513 //TDO.mode(PullUp);
liangzhen 0:84a8bcfbdec9 514 delay = 0;
liangzhen 0:84a8bcfbdec9 515 TMS = 0;
liangzhen 0:84a8bcfbdec9 516 TCK = 0;
liangzhen 0:84a8bcfbdec9 517 TDI = 0;
liangzhen 0:84a8bcfbdec9 518 reset();
liangzhen 0:84a8bcfbdec9 519 leaveState();
liangzhen 0:84a8bcfbdec9 520 return;
liangzhen 0:84a8bcfbdec9 521 }
liangzhen 0:84a8bcfbdec9 522
liangzhen 0:84a8bcfbdec9 523 void JTAG::setJTAGspeed(int speed)
liangzhen 0:84a8bcfbdec9 524 {
liangzhen 0:84a8bcfbdec9 525 delay = 1000/speed;
liangzhen 0:84a8bcfbdec9 526 return;
liangzhen 0:84a8bcfbdec9 527 }