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 }