Liangzhen Lai / Mbed 2 deprecated DDRO_Farrari

Dependencies:   mbed

Dependents:   Orange_Ferrari_board_functional

Committer:
liangzhen
Date:
Mon Oct 21 22:36:51 2013 +0000
Revision:
1:6a820a0ca03b
Parent:
0:84a8bcfbdec9
mbed code for Farrari board

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