jtag-mpsse

JTAG tools for FTDI MPSSE transports
git clone http://frotz.net/git/jtag-mpsse.git
Log | Files | Refs

jtag.c (4101B)


      1 /* Copyright 2014 Brian Swetland <swetland@frotz.net>
      2  *
      3  * Licensed under the Apache License, Version 2.0 (the "License");
      4  * you may not use this file except in compliance with the License.
      5  * You may obtain a copy of the License at
      6  *
      7  *     http://www.apache.org/licenses/LICENSE-2.0
      8  *
      9  * Unless required by applicable law or agreed to in writing, software
     10  * distributed under the License is distributed on an "AS IS" BASIS,
     11  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
     12  * See the License for the specific language governing permissions and
     13  * limitations under the License.
     14  */
     15 
     16 #include <stdio.h>
     17 
     18 #include "jtag.h"
     19 #include "zynq.h"
     20 
     21 void pause(const char *msg) {
     22 	char crap[1024];
     23 	fprintf(stderr,">>> %s <<<\n", msg);
     24 	fgets(crap, sizeof(crap), stdin);
     25 }
     26 
     27 int jtag_dp_rd(JTAG *jtag, u32 addr, u32 *val) {
     28 	int retry = 30;
     29 	u64 u;
     30 	jtag_ir_wr(jtag, DAP_IR_DPACC);
     31 	jtag_dr_io(jtag, 35, XPACC_RD(addr), NULL);
     32 	while (retry-- > 0) {
     33 		jtag_dr_io(jtag, 35, XPACC_RD(DPACC_RDBUFF), &u);
     34 		switch (XPACC_STATUS(u)) {
     35 		case XPACC_OK:
     36 			*val = u >> 3;
     37 			return 0;
     38 		case XPACC_WAIT:
     39 			fprintf(stderr,"!");
     40 			continue;
     41 		default:
     42 			return -1;
     43 		}
     44 	}
     45 	return -1;
     46 }
     47 
     48 int jtag_dp_wr(JTAG *jtag, u32 addr, u32 val) {
     49 	int retry = 30;
     50 	u64 u;
     51 	u = XPACC_WR(addr);
     52 	u |= (((u64) val) << 3);
     53 	jtag_ir_wr(jtag, DAP_IR_DPACC);
     54 	jtag_dr_io(jtag, 35, u, NULL);
     55 	while (retry-- > 0) {
     56 		jtag_dr_io(jtag, 35, XPACC_RD(DPACC_RDBUFF), &u);
     57 		switch (XPACC_STATUS(u)) {
     58 		case XPACC_OK:
     59 			return 0;
     60 		case XPACC_WAIT:
     61 			fprintf(stderr,"!");
     62 			continue;
     63 		default:
     64 			return -1;
     65 		}
     66 	}
     67 	return -1;
     68 }
     69 
     70 /* TODO: cache state, check errors */
     71 int jtag_ap_rd(JTAG *jtag, u32 addr, u32 *val) {
     72 	u64 u;
     73 	jtag_dp_wr(jtag, DPACC_SELECT, DPSEL_APSEL(0) | DPSEL_APBANKSEL(addr));
     74 	jtag_ir_wr(jtag, DAP_IR_APACC);
     75 	jtag_dr_io(jtag, 35, XPACC_RD(addr), NULL);
     76 	jtag_ir_wr(jtag, DAP_IR_DPACC);
     77 	jtag_dr_io(jtag, 35, XPACC_RD(DPACC_RDBUFF), &u);
     78 	*val = (u >> 3);
     79 	return 0;
     80 }
     81 
     82 int jtag_ap_wr(JTAG *jtag, u32 addr, u32 val) {
     83 	u64 u;
     84 	jtag_dp_wr(jtag, DPACC_SELECT, DPSEL_APSEL(0) | DPSEL_APBANKSEL(addr));
     85 	jtag_ir_wr(jtag, DAP_IR_APACC);
     86 	u = XPACC_WR(addr);
     87 	u |= (((u64) val) << 3);
     88 	jtag_dr_io(jtag, 35, u, NULL);
     89 	jtag_ir_wr(jtag, DAP_IR_DPACC);
     90 	jtag_dr_io(jtag, 35, XPACC_RD(DPACC_RDBUFF), &u);
     91 	return 0;
     92 }
     93 
     94 int main(int argc, char **argv) {
     95 	JTAG *jtag;
     96 	unsigned n;
     97 	u64 u;
     98 	u32 x;
     99 
    100 	if (!(jtag = jtag_open()))
    101 		return -1;
    102 	if ((n = jtag_enumerate(jtag)) <= 0)
    103 		return -1;
    104 
    105 #if 0
    106 	if (jtag_select(jtag, 0x4ba00477))
    107 		return -1;
    108 	if (jtag_ir_wr(jtag, DAP_IR_IDCODE))
    109 		return -1;
    110 	if (jtag_dr_io(jtag, 32, 0, &u))
    111 		return -1;
    112 #endif
    113 
    114 	u = 0xaaaaaaaa;
    115 	if (jtag_select(jtag, 0x13722093))
    116 		return -1;
    117 	if (jtag_ir_wr(jtag, XIL_IDCODE))
    118 		return -1;
    119 	if (jtag_dr_io(jtag, 32, 0, &u))
    120 		return -1;
    121 	fprintf(stderr,"idcode? %08lx\n", u);
    122 
    123 	jtag_ir_wr(jtag, XIL_USER4);
    124 	jtag_dr_io(jtag, 32, 0x12345678, &u);
    125 	fprintf(stderr, "user4 %08lx\n", u);
    126 	jtag_dr_io(jtag, 32, 0xa7a7a7a7, &u);
    127 	fprintf(stderr, "user4 %08lx\n", u);
    128 	jtag_dr_io(jtag, 32, 0xa7a7a7a7, &u);
    129 	fprintf(stderr, "user4 %08lx\n", u);
    130  
    131 #if 0
    132 	jtag_dp_rd(jtag, DPACC_CSW, &x);
    133 	fprintf(stderr,"CSW %08x\n", x);
    134 
    135 	jtag_dp_wr(jtag, DPACC_CSW, DPCSW_CSYSPWRUPREQ | DPCSW_CDBGPWRUPREQ);
    136 	do {
    137 		jtag_dp_rd(jtag, DPACC_CSW, &x);
    138 		fprintf(stderr,"CSW %08x\n", x);
    139 	} while ((x & (DPCSW_CSYSPWRUPACK | DPCSW_CDBGPWRUPACK)) != (DPCSW_CSYSPWRUPACK | DPCSW_CDBGPWRUPACK));
    140 
    141 	jtag_ap_rd(jtag, APACC_BASE, &x);
    142 	fprintf(stderr,"base %08x\n", x);
    143 
    144 	jtag_ap_rd(jtag, APACC_IDR, &x);
    145 	fprintf(stderr,"idr %08x\n", x);
    146 #endif
    147 
    148 #if STRESSTEST
    149 	for (n = 0; n < 0xFFFFFFFF; n++) { 
    150 		u32 z = (n >> 16) | (n << 16);
    151 		x = 0xeeeeeeee;
    152 		jtag_ap_wr(jtag, APACC_TAR, z);
    153 		jtag_ap_rd(jtag, APACC_TAR, &x);
    154 		if (z != x) {
    155 			fprintf(stderr,"%08x != %08x\n", z, x);
    156 		}
    157 		//if ((n & 0xFFF) == 0)
    158 			fprintf(stderr,"%08x\r", z);
    159 	}
    160 
    161 	jtag_ap_wr(jtag, APACC_TAR, 0x12345678);
    162 #endif
    163 
    164 #if 0
    165 	jtag_ap_rd(jtag, APACC_TAR, &x);
    166 	fprintf(stderr,"tar %08x\n", x);
    167 
    168 	fprintf(stderr,"done\n");
    169 	jtag_dp_wr(jtag, DPACC_CSW, 0);
    170 #endif
    171 
    172 	return 0;
    173 }