diff --git a/src/Makefile b/src/Makefile index 0d3cdf7..9430501 100644 --- a/src/Makefile +++ b/src/Makefile @@ -32,6 +32,8 @@ SRC = \ gdb_packet.c \ hex_utils.c \ jtag_devs.c \ + jtag_scan.c \ + jtagtap.c \ lmi.c \ lpc_common.c \ lpc11xx.c \ @@ -72,12 +74,6 @@ ifdef NO_OWN_LL SRC += jtagtap_generic.c swdptap_generic.c endif -ifndef OWN_HL -SRC += jtag_scan.c jtagtap.c -else -CFLAGS += -DOWN_HL -endif - ifdef PC_HOSTED CFLAGS += -DPC_HOSTED=1 else diff --git a/src/include/jtagtap.h b/src/include/jtagtap.h index 898b9c8..4c2ca43 100644 --- a/src/include/jtagtap.h +++ b/src/include/jtagtap.h @@ -21,13 +21,12 @@ #ifndef __JTAGTAP_H #define __JTAGTAP_H +typedef struct jtag_proc_s { /* Note: Signal names are as for the device under test. */ -int jtagtap_init(void); + void (*jtagtap_reset)(void); -void jtagtap_reset(void); - -uint8_t jtagtap_next(const uint8_t TMS, const uint8_t TDI); + uint8_t (*jtagtap_next)(const uint8_t TMS, const uint8_t TDI); /* tap_next executes one state transision in the JTAG TAP state machine: * - Ensure TCK is low * - Assert the values of TMS and TDI @@ -36,30 +35,39 @@ uint8_t jtagtap_next(const uint8_t TMS, const uint8_t TDI); * - Release TCK. */ -void jtagtap_tms_seq(uint32_t MS, int ticks); -void jtagtap_tdi_tdo_seq(uint8_t *DO, const uint8_t final_tms, const uint8_t *DI, int ticks); -void jtagtap_tdi_seq(const uint8_t final_tms, const uint8_t *DI, int ticks); + void (*jtagtap_tms_seq)(uint32_t MS, int ticks); + void (*jtagtap_tdi_tdo_seq) + (uint8_t *DO, const uint8_t final_tms, const uint8_t *DI, int ticks); /* Shift out a sequence on MS and DI, capture data to DO. * - This is not endian safe: First byte will always be first shifted out. * - DO may be NULL to ignore captured data. * - DO may be point to the same address as DI. */ + void (*jtagtap_tdi_seq) + (const uint8_t final_tms, const uint8_t *DI, int ticks); +} jtag_proc_t; +extern jtag_proc_t jtag_proc; /* generic soft reset: 1, 1, 1, 1, 1, 0 */ #define jtagtap_soft_reset() \ - jtagtap_tms_seq(0x1F, 6) + jtag_proc.jtagtap_tms_seq(0x1F, 6) /* Goto Shift-IR: 1, 1, 0, 0 */ #define jtagtap_shift_ir() \ - jtagtap_tms_seq(0x03, 4) + jtag_proc.jtagtap_tms_seq(0x03, 4) /* Goto Shift-DR: 1, 0, 0 */ #define jtagtap_shift_dr() \ - jtagtap_tms_seq(0x01, 3) + jtag_proc.jtagtap_tms_seq(0x01, 3) /* Goto Run-test/Idle: 1, 1, 0 */ #define jtagtap_return_idle() \ - jtagtap_tms_seq(0x01, 2) + jtag_proc.jtagtap_tms_seq(0x01, 2) +# if PC_HOSTED == 1 +int platform_jtagtap_init(void); +# else +int jtagtap_init(void); +# endif #endif diff --git a/src/platforms/common/jtagtap.c b/src/platforms/common/jtagtap.c index 0b5d4b4..a319a6b 100644 --- a/src/platforms/common/jtagtap.c +++ b/src/platforms/common/jtagtap.c @@ -26,10 +26,26 @@ #include "jtagtap.h" #include "gdb_packet.h" -int jtagtap_init(void) +jtag_proc_t jtag_proc; + +static void jtagtap_reset(void); +static void jtagtap_tms_seq(uint32_t MS, int ticks); +static void jtagtap_tdi_tdo_seq( + uint8_t *DO, const uint8_t final_tms, const uint8_t *DI, int ticks); +static void jtagtap_tdi_seq( + const uint8_t final_tms, const uint8_t *DI, int ticks); +static uint8_t jtagtap_next(uint8_t dTMS, uint8_t dTDI); + +int jtagtap_init() { TMS_SET_MODE(); + jtag_proc.jtagtap_reset = jtagtap_reset; + jtag_proc.jtagtap_next =jtagtap_next; + jtag_proc.jtagtap_tms_seq = jtagtap_tms_seq; + jtag_proc.jtagtap_tdi_tdo_seq = jtagtap_tdi_tdo_seq; + jtag_proc.jtagtap_tdi_seq = jtagtap_tdi_seq; + /* Go to JTAG mode for SWJ-DP */ for(int i = 0; i <= 50; i++) jtagtap_next(1, 0); /* Reset SW-DP */ jtagtap_tms_seq(0xE73C, 16); /* SWD to JTAG sequence */ @@ -38,7 +54,7 @@ int jtagtap_init(void) return 0; } -void jtagtap_reset(void) +static void jtagtap_reset(void) { #ifdef TRST_PORT if (platform_hwversion() == 0) { @@ -51,7 +67,7 @@ void jtagtap_reset(void) jtagtap_soft_reset(); } -inline uint8_t jtagtap_next(uint8_t dTMS, uint8_t dTDI) +static uint8_t jtagtap_next(uint8_t dTMS, uint8_t dTDI) { uint16_t ret; @@ -66,7 +82,7 @@ inline uint8_t jtagtap_next(uint8_t dTMS, uint8_t dTDI) return ret != 0; } -void jtagtap_tms_seq(uint32_t MS, int ticks) +static void jtagtap_tms_seq(uint32_t MS, int ticks) { gpio_set_val(TDI_PORT, TDI_PIN, 1); int data = MS & 1; @@ -80,8 +96,8 @@ void jtagtap_tms_seq(uint32_t MS, int ticks) } } -void -jtagtap_tdi_tdo_seq(uint8_t *DO, const uint8_t final_tms, const uint8_t *DI, int ticks) +static void jtagtap_tdi_tdo_seq( + uint8_t *DO, const uint8_t final_tms, const uint8_t *DI, int ticks) { uint8_t index = 1; gpio_set_val(TMS_PORT, TMS_PIN, 0); @@ -111,8 +127,7 @@ jtagtap_tdi_tdo_seq(uint8_t *DO, const uint8_t final_tms, const uint8_t *DI, int gpio_clear(TCK_PORT, TCK_PIN); } -void -jtagtap_tdi_seq(const uint8_t final_tms, const uint8_t *DI, int ticks) +static void jtagtap_tdi_seq(const uint8_t final_tms, const uint8_t *DI, int ticks) { uint8_t index = 1; while(ticks--) { diff --git a/src/platforms/libftdi/jtagtap.c b/src/platforms/libftdi/jtagtap.c index f586c46..a928d19 100644 --- a/src/platforms/libftdi/jtagtap.c +++ b/src/platforms/libftdi/jtagtap.c @@ -33,7 +33,17 @@ #include "general.h" #include "jtagtap.h" -int jtagtap_init(void) +jtag_proc_t jtag_proc; + +static void jtagtap_reset(void); +static void jtagtap_tms_seq(uint32_t MS, int ticks); +static void jtagtap_tdi_tdo_seq(uint8_t *DO, const uint8_t final_tms, + const uint8_t *DI, int ticks); +static void jtagtap_tdi_seq( + const uint8_t final_tms, const uint8_t *DI, int ticks); +static uint8_t jtagtap_next(uint8_t dTMS, uint8_t dTDI); + +int platform_jtagtap_init(void) { assert(ftdic != NULL); int err = ftdi_usb_purge_buffers(ftdic); @@ -65,6 +75,12 @@ int jtagtap_init(void) platform_buffer_write(ftdi_init, 9); platform_buffer_flush(); + jtag_proc.jtagtap_reset = jtagtap_reset; + jtag_proc.jtagtap_next =jtagtap_next; + jtag_proc.jtagtap_tms_seq = jtagtap_tms_seq; + jtag_proc.jtagtap_tdi_tdo_seq = jtagtap_tdi_tdo_seq; + jtag_proc.jtagtap_tdi_seq = jtagtap_tdi_seq; + /* Go to JTAG mode for SWJ-DP */ for (int i = 0; i <= 50; i++) jtagtap_next(1, 0); /* Reset SW-DP */ @@ -79,8 +95,7 @@ void jtagtap_reset(void) jtagtap_soft_reset(); } -void -jtagtap_tms_seq(uint32_t MS, int ticks) +static void jtagtap_tms_seq(uint32_t MS, int ticks) { uint8_t tmp[3] = {MPSSE_WRITE_TMS | MPSSE_LSB | MPSSE_BITMODE| MPSSE_READ_NEG, 0, 0}; while(ticks >= 0) { @@ -92,8 +107,8 @@ jtagtap_tms_seq(uint32_t MS, int ticks) } } -void -jtagtap_tdi_tdo_seq(uint8_t *DO, const uint8_t final_tms, const uint8_t *DI, int ticks) +static void jtagtap_tdi_tdo_seq( + uint8_t *DO, const uint8_t final_tms, const uint8_t *DI, int ticks) { int rsize, rticks; @@ -157,12 +172,13 @@ jtagtap_tdi_tdo_seq(uint8_t *DO, const uint8_t final_tms, const uint8_t *DI, int } } -void jtagtap_tdi_seq(const uint8_t final_tms, const uint8_t *DI, int ticks) +static void jtagtap_tdi_seq( + const uint8_t final_tms, const uint8_t *DI, int ticks) { return jtagtap_tdi_tdo_seq(NULL, final_tms, DI, ticks); } -uint8_t jtagtap_next(uint8_t dTMS, uint8_t dTDI) +static uint8_t jtagtap_next(uint8_t dTMS, uint8_t dTDI) { uint8_t ret; uint8_t tmp[3] = {MPSSE_WRITE_TMS | MPSSE_DO_READ | MPSSE_LSB | MPSSE_BITMODE | MPSSE_WRITE_NEG, 0, 0}; diff --git a/src/platforms/libftdi/platform.c b/src/platforms/libftdi/platform.c index 88ed4f2..93c89e9 100644 --- a/src/platforms/libftdi/platform.c +++ b/src/platforms/libftdi/platform.c @@ -191,6 +191,11 @@ int platform_jtag_scan(const uint8_t *lrlens) return jtag_scan(lrlens); } +int platform_jtag_dp_init() +{ + return 0; +} + void platform_init(int argc, char **argv) { BMP_CL_OPTIONS_t cl_opts = {0}; diff --git a/src/platforms/pc-hosted/jtagtap.c b/src/platforms/pc-hosted/jtagtap.c index 86e068d..bc5a816 100644 --- a/src/platforms/pc-hosted/jtagtap.c +++ b/src/platforms/pc-hosted/jtagtap.c @@ -35,9 +35,17 @@ #include "remote.h" #include "jtagtap.h" -/* See remote.c/.h for protocol information */ +jtag_proc_t jtag_proc; -int jtagtap_init(void) +static void jtagtap_reset(void); +static void jtagtap_tms_seq(uint32_t MS, int ticks); +static void jtagtap_tdi_tdo_seq( + uint8_t *DO, const uint8_t final_tms, const uint8_t *DI, int ticks); +static void jtagtap_tdi_seq( + const uint8_t final_tms, const uint8_t *DI, int ticks); +static uint8_t jtagtap_next(uint8_t dTMS, uint8_t dTDI); + +int platform_jtagtap_init(void) { uint8_t construct[PLATFORM_MAX_MSG_SIZE]; int s; @@ -52,10 +60,18 @@ int jtagtap_init(void) exit(-1); } + jtag_proc.jtagtap_reset = jtagtap_reset; + jtag_proc.jtagtap_next =jtagtap_next; + jtag_proc.jtagtap_tms_seq = jtagtap_tms_seq; + jtag_proc.jtagtap_tdi_tdo_seq = jtagtap_tdi_tdo_seq; + jtag_proc.jtagtap_tdi_seq = jtagtap_tdi_seq; + return 0; } -void jtagtap_reset(void) +/* See remote.c/.h for protocol information */ + +static void jtagtap_reset(void) { uint8_t construct[PLATFORM_MAX_MSG_SIZE]; int s; @@ -71,7 +87,7 @@ void jtagtap_reset(void) } } -void jtagtap_tms_seq(uint32_t MS, int ticks) +static void jtagtap_tms_seq(uint32_t MS, int ticks) { uint8_t construct[PLATFORM_MAX_MSG_SIZE]; @@ -88,7 +104,8 @@ void jtagtap_tms_seq(uint32_t MS, int ticks) } } -void jtagtap_tdi_tdo_seq(uint8_t *DO, const uint8_t final_tms, const uint8_t *DI, int ticks) +static void jtagtap_tdi_tdo_seq( + uint8_t *DO, const uint8_t final_tms, const uint8_t *DI, int ticks) { uint8_t construct[PLATFORM_MAX_MSG_SIZE]; int s; @@ -116,14 +133,14 @@ void jtagtap_tdi_tdo_seq(uint8_t *DO, const uint8_t final_tms, const uint8_t *DI } } -void jtagtap_tdi_seq(const uint8_t final_tms, const uint8_t *DI, int ticks) - +static void jtagtap_tdi_seq( + const uint8_t final_tms, const uint8_t *DI, int ticks) { return jtagtap_tdi_tdo_seq(NULL, final_tms, DI, ticks); } -uint8_t jtagtap_next(uint8_t dTMS, uint8_t dTDI) +static uint8_t jtagtap_next(uint8_t dTMS, uint8_t dTDI) { uint8_t construct[PLATFORM_MAX_MSG_SIZE]; diff --git a/src/platforms/pc-hosted/platform.c b/src/platforms/pc-hosted/platform.c index 82f7996..53f95ba 100644 --- a/src/platforms/pc-hosted/platform.c +++ b/src/platforms/pc-hosted/platform.c @@ -44,6 +44,11 @@ int platform_jtag_scan(const uint8_t *lrlens) return jtag_scan(lrlens); } +int platform_jtag_dp_init() +{ + return 0; +} + void platform_init(int argc, char **argv) { cl_opts.opt_idstring = "Blackmagic Debug Probe Remote"; diff --git a/src/platforms/pc-stlinkv2/adiv5_jtagdp.c b/src/platforms/pc-stlinkv2/adiv5_jtagdp.c deleted file mode 100644 index 30ff697..0000000 --- a/src/platforms/pc-stlinkv2/adiv5_jtagdp.c +++ /dev/null @@ -1,73 +0,0 @@ -/* - * This file is part of the Black Magic Debug project. - * - * Copyright (C) 2019 Uwe Bonnes(bon@elektron.ikp.physik.tu-darmstadt.de) - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - -/* This file implements a subset of JTAG-DP specific functions of the - * ARM Debug Interface v5 Architecure Specification, ARM doc IHI0031A - * used in BMP. - */ - -#include "general.h" -#include "target.h" -#include "adiv5.h" -#include "stlinkv2.h" -#include "jtag_devs.h" - -struct jtag_dev_s jtag_devs[JTAG_MAX_DEVS+1]; -int jtag_dev_count; - -int jtag_scan_stlinkv2(const uint8_t *irlens) -{ - uint32_t idcodes[JTAG_MAX_DEVS+1]; - (void) *irlens; - target_list_free(); - - jtag_dev_count = 0; - memset(&jtag_devs, 0, sizeof(jtag_devs)); - if (stlink_enter_debug_jtag()) - return 0; - jtag_dev_count = stlink_read_idcodes(idcodes); - /* Check for known devices and handle accordingly */ - for(int i = 0; i < jtag_dev_count; i++) - jtag_devs[i].idcode = idcodes[i]; - for(int i = 0; i < jtag_dev_count; i++) - for(int j = 0; dev_descr[j].idcode; j++) - if((jtag_devs[i].idcode & dev_descr[j].idmask) == - dev_descr[j].idcode) { - if(dev_descr[j].handler) - dev_descr[j].handler(&jtag_devs[i]); - break; - } - - return jtag_dev_count; -} - -void adiv5_jtag_dp_handler(jtag_dev_t *dev) -{ - ADIv5_DP_t *dp = (void*)calloc(1, sizeof(*dp)); - - dp->dev = dev; - dp->idcode = dev->idcode; - - dp->dp_read = stlink_dp_read; - dp->error = stlink_dp_error; - dp->low_access = stlink_dp_low_access; - dp->abort = stlink_dp_abort; - - adiv5_dp_init(dp); -} diff --git a/src/platforms/pc-stlinkv2/platform.c b/src/platforms/pc-stlinkv2/platform.c index eb8c6eb..07379b0 100644 --- a/src/platforms/pc-stlinkv2/platform.c +++ b/src/platforms/pc-stlinkv2/platform.c @@ -48,6 +48,7 @@ int platform_swdptap_init(void) } swd_proc_t swd_proc; +jtag_proc_t jtag_proc; static int adiv5_swdp_scan_stlinkv2(void) { @@ -107,3 +108,8 @@ int platform_buffer_read(uint8_t *data, int size) (void) data; return size; } + +int platform_jtagtap_init(void) +{ + return 0; +} diff --git a/src/platforms/pc-stlinkv2/stlinkv2.c b/src/platforms/pc-stlinkv2/stlinkv2.c index ab855ca..b69b66a 100644 --- a/src/platforms/pc-stlinkv2/stlinkv2.c +++ b/src/platforms/pc-stlinkv2/stlinkv2.c @@ -29,6 +29,8 @@ #include "adiv5.h" #include "stlinkv2.h" #include "exception.h" +#include "jtag_devs.h" +#include "target.h" #include #include @@ -1383,3 +1385,44 @@ uint32_t adiv5_ap_read(ADIv5_AP_t *ap, uint16_t addr) stlink_read_dp_register(ap->apsel, addr, &ret); return ret; } + +struct jtag_dev_s jtag_devs[JTAG_MAX_DEVS+1]; +int jtag_dev_count; +jtag_proc_t jtag_proc; + +int jtag_scan_stlinkv2(const uint8_t *irlens) +{ + uint32_t idcodes[JTAG_MAX_DEVS+1]; + (void) *irlens; + target_list_free(); + + jtag_dev_count = 0; + memset(&jtag_devs, 0, sizeof(jtag_devs)); + if (stlink_enter_debug_jtag()) + return 0; + jtag_dev_count = stlink_read_idcodes(idcodes); + /* Check for known devices and handle accordingly */ + for(int i = 0; i < jtag_dev_count; i++) + jtag_devs[i].idcode = idcodes[i]; + for(int i = 0; i < jtag_dev_count; i++) + for(int j = 0; dev_descr[j].idcode; j++) + if((jtag_devs[i].idcode & dev_descr[j].idmask) == + dev_descr[j].idcode) { + if(dev_descr[j].handler) + dev_descr[j].handler(&jtag_devs[i]); + break; + } + + return jtag_dev_count; +} + +int platform_jtag_dp_init(ADIv5_DP_t *dp) +{ + dp->dp_read = stlink_dp_read; + dp->error = stlink_dp_error; + dp->low_access = stlink_dp_low_access; + dp->abort = stlink_dp_abort; + + return true; + +} diff --git a/src/remote.c b/src/remote.c index d152a45..30cd075 100644 --- a/src/remote.c +++ b/src/remote.c @@ -159,7 +159,7 @@ void remotePacketProcessJTAG(uint8_t i, char *packet) break; case REMOTE_RESET: /* = reset ================================= */ - jtagtap_reset(); + jtag_proc.jtagtap_reset(); _respond(REMOTE_RESP_OK, 0); break; @@ -170,7 +170,7 @@ void remotePacketProcessJTAG(uint8_t i, char *packet) if (i<4) { _respond(REMOTE_RESP_ERR,REMOTE_ERROR_WRONGLEN); } else { - jtagtap_tms_seq( MS, ticks); + jtag_proc.jtagtap_tms_seq( MS, ticks); _respond(REMOTE_RESP_OK, 0); } break; @@ -183,7 +183,7 @@ void remotePacketProcessJTAG(uint8_t i, char *packet) } else { ticks=remotehston(2,&packet[2]); DI=remotehston(-1,&packet[4]); - jtagtap_tdi_tdo_seq((void *)&DO, (packet[1]==REMOTE_TDITDO_TMS), (void *)&DI, ticks); + jtag_proc.jtagtap_tdi_tdo_seq((void *)&DO, (packet[1]==REMOTE_TDITDO_TMS), (void *)&DI, ticks); /* Mask extra bits on return value... */ DO &= (1LL << (ticks + 1)) - 1; @@ -196,7 +196,7 @@ void remotePacketProcessJTAG(uint8_t i, char *packet) if (i!=4) { _respond(REMOTE_RESP_ERR,REMOTE_ERROR_WRONGLEN); } else { - uint32_t dat=jtagtap_next( (packet[2]=='1'), (packet[3]=='1')); + uint32_t dat=jtag_proc.jtagtap_next( (packet[2]=='1'), (packet[3]=='1')); _respond(REMOTE_RESP_OK,dat); } break; diff --git a/src/target/adiv5.h b/src/target/adiv5.h index 1ae53bd..cbab7a6 100644 --- a/src/target/adiv5.h +++ b/src/target/adiv5.h @@ -142,10 +142,15 @@ typedef struct ADIv5_DP_s { uint16_t addr, uint32_t value); void (*abort)(struct ADIv5_DP_s *dp, uint32_t abort); +#if PC_HOSTED == 1 + jtag_dev_t *dev; + uint8_t fault; +#else union { jtag_dev_t *dev; uint8_t fault; }; +#endif } ADIv5_DP_t; static inline uint32_t adiv5_dp_read(ADIv5_DP_t *dp, uint16_t addr) @@ -191,6 +196,7 @@ void adiv5_ap_write(ADIv5_AP_t *ap, uint16_t addr, uint32_t value); uint32_t adiv5_ap_read(ADIv5_AP_t *ap, uint16_t addr); void adiv5_jtag_dp_handler(jtag_dev_t *dev); +int platform_jtag_dp_init(ADIv5_DP_t *dp); void adiv5_mem_read(ADIv5_AP_t *ap, void *dest, uint32_t src, size_t len); void adiv5_mem_write(ADIv5_AP_t *ap, uint32_t dest, const void *src, size_t len); diff --git a/src/target/adiv5_jtagdp.c b/src/target/adiv5_jtagdp.c index e8d5879..d6a3cf8 100644 --- a/src/target/adiv5_jtagdp.c +++ b/src/target/adiv5_jtagdp.c @@ -55,13 +55,13 @@ void adiv5_jtag_dp_handler(jtag_dev_t *dev) } dp->dev = dev; - dp->idcode = dev->idcode; - - dp->dp_read = adiv5_jtagdp_read; - dp->error = adiv5_jtagdp_error; - dp->low_access = adiv5_jtagdp_low_access; - dp->abort = adiv5_jtagdp_abort; - + if ((PC_HOSTED == 0 ) || (!platform_jtag_dp_init(dp))) { + dp->idcode = dev->idcode; + dp->dp_read = adiv5_jtagdp_read; + dp->error = adiv5_jtagdp_error; + dp->low_access = adiv5_jtagdp_low_access; + dp->abort = adiv5_jtagdp_abort; + } adiv5_dp_init(dp); } @@ -90,11 +90,12 @@ static uint32_t adiv5_jtagdp_low_access(ADIv5_DP_t *dp, uint8_t RnW, request = ((uint64_t)value << 3) | ((addr >> 1) & 0x06) | (RnW?1:0); - jtag_dev_write_ir(dp->dev, APnDP ? IR_APACC : IR_DPACC); + jtag_dev_write_ir(&jtag_proc, dp->dev, APnDP ? IR_APACC : IR_DPACC); platform_timeout_set(&timeout, 2000); do { - jtag_dev_shift_dr(dp->dev, (uint8_t*)&response, (uint8_t*)&request, 35); + jtag_dev_shift_dr(&jtag_proc, dp->dev, (uint8_t*)&response, + (uint8_t*)&request, 35); ack = response & 0x07; } while(!platform_timeout_is_expired(&timeout) && (ack == JTAGDP_ACK_WAIT)); @@ -110,6 +111,6 @@ static uint32_t adiv5_jtagdp_low_access(ADIv5_DP_t *dp, uint8_t RnW, static void adiv5_jtagdp_abort(ADIv5_DP_t *dp, uint32_t abort) { uint64_t request = (uint64_t)abort << 3; - jtag_dev_write_ir(dp->dev, IR_ABORT); - jtag_dev_shift_dr(dp->dev, NULL, (const uint8_t*)&request, 35); + jtag_dev_write_ir(&jtag_proc, dp->dev, IR_ABORT); + jtag_dev_shift_dr(&jtag_proc, dp->dev, NULL, (const uint8_t*)&request, 35); } diff --git a/src/target/jtag_scan.c b/src/target/jtag_scan.c index 91935ad..28642f9 100644 --- a/src/target/jtag_scan.c +++ b/src/target/jtag_scan.c @@ -67,8 +67,15 @@ int jtag_scan(const uint8_t *irlens) * in SW-DP mode. */ DEBUG("Resetting TAP\n"); +#if PC_HOSTED == 1 + if (platform_jtagtap_init()) { + DEBUG("JTAG not available\n"); + return 0; + } +#else jtagtap_init(); - jtagtap_reset(); +#endif + jtag_proc.jtagtap_reset(); if (irlens) { DEBUG("Given list of IR lengths, skipping probe\n"); @@ -80,7 +87,7 @@ int jtag_scan(const uint8_t *irlens) uint32_t irout; if(*irlens == 0) break; - jtagtap_tdi_tdo_seq((uint8_t*)&irout, 0, ones, *irlens); + jtag_proc.jtagtap_tdi_tdo_seq((uint8_t*)&irout, 0, ones, *irlens); if (!(irout & 1)) { DEBUG("check failed: IR[0] != 1\n"); return -1; @@ -97,7 +104,7 @@ int jtag_scan(const uint8_t *irlens) jtagtap_shift_ir(); DEBUG("Scanning out IRs\n"); - if(!jtagtap_next(0, 1)) { + if(!jtag_proc.jtagtap_next(0, 1)) { DEBUG("jtag_scan: Sanity check failed: IR[0] shifted out as 0\n"); jtag_dev_count = -1; return -1; /* must be 1 */ @@ -105,7 +112,7 @@ int jtag_scan(const uint8_t *irlens) jtag_devs[0].ir_len = 1; j = 1; while((jtag_dev_count <= JTAG_MAX_DEVS) && (jtag_devs[jtag_dev_count].ir_len <= JTAG_MAX_IR_LEN)) { - if(jtagtap_next(0, 1)) { + if(jtag_proc.jtagtap_next(0, 1)) { if(jtag_devs[jtag_dev_count].ir_len == 1) break; jtag_devs[++jtag_dev_count].ir_len = 1; jtag_devs[jtag_dev_count].ir_prescan = j; @@ -126,7 +133,7 @@ int jtag_scan(const uint8_t *irlens) } DEBUG("Return to Run-Test/Idle\n"); - jtagtap_next(1, 1); + jtag_proc.jtagtap_next(1, 1); jtagtap_return_idle(); /* All devices should be in BYPASS now */ @@ -134,7 +141,7 @@ int jtag_scan(const uint8_t *irlens) /* Count device on chain */ DEBUG("Change state to Shift-DR\n"); jtagtap_shift_dr(); - for(i = 0; (jtagtap_next(0, 1) == 0) && (i <= jtag_dev_count); i++) + for(i = 0; (jtag_proc.jtagtap_next(0, 1) == 0) && (i <= jtag_dev_count); i++) jtag_devs[i].dr_postscan = jtag_dev_count - i - 1; if(i != jtag_dev_count) { @@ -145,7 +152,7 @@ int jtag_scan(const uint8_t *irlens) } DEBUG("Return to Run-Test/Idle\n"); - jtagtap_next(1, 1); + jtag_proc.jtagtap_next(1, 1); jtagtap_return_idle(); if(!jtag_dev_count) { return 0; @@ -157,17 +164,17 @@ int jtag_scan(const uint8_t *irlens) jtag_devs[i].ir_len; /* Reset jtagtap: should take all devs to IDCODE */ - jtagtap_reset(); + jtag_proc.jtagtap_reset(); jtagtap_shift_dr(); for(i = 0; i < jtag_dev_count; i++) { - if(!jtagtap_next(0, 1)) continue; + if(!jtag_proc.jtagtap_next(0, 1)) continue; jtag_devs[i].idcode = 1; for(j = 2; j; j <<= 1) - if(jtagtap_next(0, 1)) jtag_devs[i].idcode |= j; + if(jtag_proc.jtagtap_next(0, 1)) jtag_devs[i].idcode |= j; } DEBUG("Return to Run-Test/Idle\n"); - jtagtap_next(1, 1); + jtag_proc.jtagtap_next(1, 1); jtagtap_return_idle(); /* Check for known devices and handle accordingly */ @@ -187,7 +194,7 @@ int jtag_scan(const uint8_t *irlens) return jtag_dev_count; } -void jtag_dev_write_ir(jtag_dev_t *d, uint32_t ir) +void jtag_dev_write_ir(jtag_proc_t *jp, jtag_dev_t *d, uint32_t ir) { if(ir == d->current_ir) return; for(int i = 0; i < jtag_dev_count; i++) @@ -195,21 +202,21 @@ void jtag_dev_write_ir(jtag_dev_t *d, uint32_t ir) d->current_ir = ir; jtagtap_shift_ir(); - jtagtap_tdi_seq(0, ones, d->ir_prescan); - jtagtap_tdi_seq(d->ir_postscan?0:1, (void*)&ir, d->ir_len); - jtagtap_tdi_seq(1, ones, d->ir_postscan); + jp->jtagtap_tdi_seq(0, ones, d->ir_prescan); + jp->jtagtap_tdi_seq(d->ir_postscan?0:1, (void*)&ir, d->ir_len); + jp->jtagtap_tdi_seq(1, ones, d->ir_postscan); jtagtap_return_idle(); } -void jtag_dev_shift_dr(jtag_dev_t *d, uint8_t *dout, const uint8_t *din, int ticks) +void jtag_dev_shift_dr(jtag_proc_t *jp, jtag_dev_t *d, uint8_t *dout, const uint8_t *din, int ticks) { jtagtap_shift_dr(); - jtagtap_tdi_seq(0, ones, d->dr_prescan); + jp->jtagtap_tdi_seq(0, ones, d->dr_prescan); if(dout) - jtagtap_tdi_tdo_seq((void*)dout, d->dr_postscan?0:1, (void*)din, ticks); + jp->jtagtap_tdi_tdo_seq((void*)dout, d->dr_postscan?0:1, (void*)din, ticks); else - jtagtap_tdi_seq(d->dr_postscan?0:1, (void*)din, ticks); - jtagtap_tdi_seq(1, ones, d->dr_postscan); + jp->jtagtap_tdi_seq(d->dr_postscan?0:1, (void*)din, ticks); + jp->jtagtap_tdi_seq(1, ones, d->dr_postscan); jtagtap_return_idle(); } diff --git a/src/target/jtag_scan.h b/src/target/jtag_scan.h index cd46801..5134ec1 100644 --- a/src/target/jtag_scan.h +++ b/src/target/jtag_scan.h @@ -17,6 +17,7 @@ * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ +#include #ifndef __JTAG_SCAN_H #define __JTAG_SCAN_H @@ -25,7 +26,6 @@ #define JTAG_MAX_IR_LEN 16 typedef struct jtag_dev_s { -#if !defined(JTAG_HL) union { uint8_t dev; uint8_t dr_prescan; @@ -35,20 +35,16 @@ typedef struct jtag_dev_s { uint8_t ir_len; uint8_t ir_prescan; uint8_t ir_postscan; -#endif uint32_t idcode; const char *descr; -#if !defined(JTAG_HL) uint32_t current_ir; -#endif - } jtag_dev_t; extern struct jtag_dev_s jtag_devs[JTAG_MAX_DEVS+1]; extern int jtag_dev_count; -void jtag_dev_write_ir(jtag_dev_t *dev, uint32_t ir); -void jtag_dev_shift_dr(jtag_dev_t *dev, uint8_t *dout, const uint8_t *din, int ticks); +void jtag_dev_write_ir(jtag_proc_t *jp, jtag_dev_t *dev, uint32_t ir); +void jtag_dev_shift_dr(jtag_proc_t *jp, jtag_dev_t *dev, uint8_t *dout, const uint8_t *din, int ticks); #endif