4 typedef struct Tap Tap;
5 typedef struct Dap Dap;
39 /* MPSSE command bits */
41 FEW = 1<<0, /* -ve CLK on write */
42 BITS = 1<<1, /* bits or bytes */
43 FER = 1<<2, /* -ve CLK on read */
44 LSB = 1<<3, /* LSB first = 1 else MSB first */
45 TDI = 1<<4, /* do write TDI */
46 TDO = 1<<5, /* do read TDO */
47 TMS = 1<<6, /* do write TMS */
55 dfd = open(dev, ORDWR);
66 io(int cmd, int len, uchar *dat)
77 if((cmd & (TDI|TMS)) != 0){
81 if(write(dfd, buf, p - buf) != (p - buf))
82 sysfatal("io write: %r");
84 if(readn(dfd, dat, len) != len)
85 sysfatal("io read: %r");
89 dstate(u32int s, int len)
99 io(TMS|LSB|BITS|FEW, len, b);
102 dshift(uvlong w, int len)
116 case 8: b[7] = w >> 56;
117 case 7: b[6] = w >> 48;
118 case 6: b[5] = w >> 40;
119 case 5: b[4] = w >> 32;
120 case 4: b[3] = w >> 24;
121 case 3: b[2] = w >> 16;
122 case 2: b[1] = w >> 8;
123 case 1: b[0] = w >> 0;
130 case 8: w |= (uvlong)b[7] << 56;
131 case 7: w |= (uvlong)b[6] << 48;
132 case 6: w |= (uvlong)b[5] << 40;
133 case 5: w |= (uvlong)b[4] << 32;
134 case 4: w |= (uvlong)b[3] << 24;
135 case 3: w |= (uvlong)b[2] << 16;
136 case 2: w |= (uvlong)b[1] << 8;
137 case 1: w |= (uvlong)b[0] << 0;
147 w &= ~((uvlong)((1<<len)-1) << s);
148 w |= (uvlong)(b[0] >> 8-len) << s;
152 return w & (1ULL<<s)-1;
170 for(i=0; i<512; i++){
171 if(dshift(i != 0, -1) == 0)
178 irw(Tap *tap, uvlong w)
180 /* 0011 -> Shift-IR */
183 dshiftones(tap->off);
184 if((tap->off + tap->len) == irlen){
185 dshift(w, tap->len-1);
186 lastbit = w >> (tap->len-1);
189 dshiftones(irlen - (tap->off + tap->len-1));
197 drr(Tap *tap, int len)
201 /* 001 -> Shift-DR */
204 d = dshift(0, -tap->delay);
206 dshift(d, tap->delay);
208 lastbit = (w >> len-1) & 1;
216 drw(Tap *tap, uvlong w, int len)
218 /* 001 -> Shift-DR */
221 dshift(0, tap->delay);
223 lastbit = (w >> len-1) & 1;
239 dapr(Dap *dap, uchar r, uchar a)
244 w = 1 | (a >> 1) & 0x6;
245 drw(dap->tap, w, 35);
247 w = drr(dap->tap, 35);
248 } while((w & 7) == 1);
252 dapw(Dap *dap, uchar r, uchar a, u32int v)
259 drw(dap->tap, w, 35);
266 CSYSPWRUPACK = 1<<31,
267 CSYSPWRUPREQ = 1<<30,
268 CDBGPWRUPACK = 1<<29,
269 CDBGPWRUPREQ = 1<<28,
276 s = dapr(dap, DPACC, CTRLSTAT);
277 if((s & (CDBGPWRUPACK|CSYSPWRUPACK)) == (CDBGPWRUPACK|CSYSPWRUPACK))
279 s |= CSYSPWRUPREQ|CDBGPWRUPREQ;
280 dapw(dap, DPACC, CTRLSTAT, s);
284 apa(Dap *dap, uchar a)
288 s = dap->port<<24 | a&0xf0;
289 if(s != dap->tap->dapsel){
290 dap->tap->dapsel = s;
291 dapw(dap, DPACC, SELECT, s);
296 apr(Dap *dap, uchar a)
299 return dapr(dap, APACC, a&0xC);
302 apw(Dap *dap, uchar a, u32int v)
305 dapw(dap, APACC, a&0xC, v);
308 mmr(Dap *ap, u32int addr)
314 mmw(Dap *ap, u32int addr, u32int val)
325 dstate(0x1F, 6); /* 011111 -> Reset->Idle */
326 dstate(0x3, 4); /* 0011 -> Shift-IR */
328 irlen = dshiftdelay();
331 dstate(0x7, 5); /* 00111 -> Shift-IR->Shift-DR */
333 ntaps = dshiftdelay();
335 dstate(0x1F, 6); /* 011111 -> Reset->Idle */
336 dstate(0x1, 3); /* 001 -> Shift-DR */
338 taps = realloc(taps, sizeof(taps[0]) * ntaps);
341 for(i=ntaps-1; i>=0; i--){
342 taps[i].delay = ntaps - i - 1;
344 taps[i].id = dshift(0, -32);
347 sysfatal("unknown tapid %.8ux\n", taps[i].id);
360 dstate(0x1F, 6); /* 011111 -> Reset->Idle */
363 sysfatal("wrong tapchain irlen %d %d\n", o, irlen);
366 for(i=0; i<ntaps; i++){
367 fprint(2, "tap%d: id=%.8ux off=%d len=%d delay=%d\n",
368 i, taps[i].id, taps[i].off, taps[i].len, taps[i].delay);
373 daps = realloc(daps, sizeof(daps[0]) * (ndaps+o));
375 daps[ndaps].tap = taps+i;
376 daps[ndaps].port = j;
377 daps[ndaps].id = apr(daps+ndaps, 0xFC);
378 fprint(2, "\tdap%d: id=%.8ux\n", j, daps[ndaps].id);
386 for(i=0; i<ndaps; i++){
407 InstrCompl_1 = 1<<24,
408 ExtDCCmodeShift = 20,
409 ExtDCCmodeMask = 3<<ExtDCCmodeShift,
424 MOEMask = 15<<MOEShift,
434 DBGITR = 0x084, /* Instruction Transfer Register */
435 DBGDTRRX = 0x080, /* Host to Target Data Transfer Register */
436 DBGDTRTX = 0x08C, /* Target to Host Data Transfer Register */
439 typedef struct Arm Arm;
451 dbgr(Arm *arm, u32int reg)
453 return mmr(arm->dbgap, arm->dbgbase+reg);
456 dbgw(Arm *arm, u32int reg, u32int val)
458 mmw(arm->dbgap, arm->dbgbase+reg, val);
461 dbgrpoll(Arm *arm, u32int reg, u32int mask, u32int val)
467 if((w & mask) == val)
474 startstop(Arm *arm, int stop)
478 s = dbgr(arm, DBGDSCR);
479 if((s & HALTED) != stop){
482 dbgw(arm, DBGDSCR, s);
484 dbgw(arm, DBGDRCR, stop ? HaltReq : RestartReq);
485 s = dbgrpoll(arm, DBGDSCR, HALTED, stop);
488 dbgw(arm, DBGDSCR, s);
490 fprint(2, "%s: startstop: %.8ux\n", arm->id, s);
495 armxec(Arm *arm, u32int instr)
497 dbgw(arm, DBGITR, instr);
498 dbgrpoll(arm, DBGDSCR, InstrCompl_1, InstrCompl_1);
501 #define ARMV4_5_MRC(CP, op1, Rd, CRn, CRm, op2) \
502 (0xee100010 | (CRm) | ((op2) << 5) | ((CP) << 8) \
503 | ((Rd) << 12) | ((CRn) << 16) | ((op1) << 21))
504 #define ARMV4_5_MCR(CP, op1, Rd, CRn, CRm, op2) \
505 (0xee000010 | (CRm) | ((op2) << 5) | ((CP) << 8) \
506 | ((Rd) << 12) | ((CRn) << 16) | ((op1) << 21))
509 trrxw(Arm *arm, u32int val)
511 dbgrpoll(arm, DBGDSCR, RXfull_1, 0);
512 dbgw(arm, DBGDTRRX, val);
517 dbgrpoll(arm, DBGDSCR, TXfull_1, TXfull_1);
518 return dbgr(arm, DBGDTRTX);
522 armrw(Arm *arm, int reg, u32int val);
525 armrr(Arm *arm, int rn)
531 armxec(arm, 0xE1A0000F);
532 armxec(arm, ARMV4_5_MCR(14, 0, 0, 0, 5, 0));
535 armxec(arm, ARMV4_5_MCR(14, 0, rn, 0, 5, 0));
540 armrw(Arm *arm, int rn, u32int val)
547 armxec(arm, 0xE1A0F000);
551 armxec(arm, ARMV4_5_MRC(14, 0, rn, 0, 5, 0));
556 * mww phys 0xf8000008 0xdf0d
557 * mww phys 0xf8000910 0xf
558 * load_image "/sys/src/boot/zynq/fsbl" 0xfffc0000 bin
562 boot(char *file, u32int entry)
568 fprint(2, "load %s", file);
569 if((fd = open(file, OREAD)) < 0)
570 sysfatal("open: %r");
572 size = seek(fd, 0, 2);
573 fprint(2, " [%ud]", size);
575 buf = malloc((size+3) & ~3);
576 if(readn(fd, buf, size) != size)
577 sysfatal("read: %r");
581 mmw(arm->memap, 0xf8000008, 0xdf0d);
582 mmw(arm->memap, 0xf8000910, 0xf);
585 for(dst = entry; size > 0; dst += 4, size -= 4){
588 mmw(arm->memap, dst, *src++);
591 fprint(2, ".\nentry %.8ux\n", entry);
593 armrw(arm, 15, entry);
599 fprint(2, "%s [ -j jtagdev ] entry image\n", argv0);
604 main(int argc, char *argv[])
606 char *jtag = "/dev/jtagddd94.0";
610 fmtinstall('H', encodefmt);
614 jtag = EARGF(usage());
622 entry = strtoul(argv[0], nil, 0);
628 arm[0].dbgbase = 0x80090000;
629 arm[0].dbgap = apbap;
630 arm[0].memap = ahbap;
633 arm[1].dbgbase = 0x80092000;
634 arm[1].dbgap = apbap;
635 arm[1].memap = ahbap;