aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAdrien Grassein <adrien.grassein@gmail.com>2022-01-06 19:06:47 +0100
committerAntonio Borneo <borneo.antonio@gmail.com>2022-01-22 10:20:17 +0000
commit666ff828b2024235694e4a0b47bf360b6ce6bcd7 (patch)
tree6e8dc9b66ae7d70fcf09b3a8a1cacb55b3278d3d
parente3bda57982ed87bd4d5faace5ea669848f3fe556 (diff)
downloadriscv-openocd-666ff828b2024235694e4a0b47bf360b6ce6bcd7.zip
riscv-openocd-666ff828b2024235694e4a0b47bf360b6ce6bcd7.tar.gz
riscv-openocd-666ff828b2024235694e4a0b47bf360b6ce6bcd7.tar.bz2
jtag: Add an option to ignore the bypass bit
Some CPU wrongly indicate the bypas bit in the codeid. It's the case of the NanoXplore NG-ULTRA chip that export a configurable (and potentially invalid) ID for one of its component. Add an option to ignore it. Signed-off-by: Adrien Grassein <adrien.grassein@gmail.com> Change-Id: Ic59743f23bfc4d4e23da0e8535fec8ca9e87ff1a Reviewed-on: https://review.openocd.org/c/openocd/+/6802 Tested-by: jenkins Reviewed-by: Antonio Borneo <borneo.antonio@gmail.com> Reviewed-by: Oleksij Rempel <linux@rempel-privat.de>
-rw-r--r--doc/openocd.texi4
-rw-r--r--src/jtag/core.c2
-rw-r--r--src/jtag/hla/hla_tcl.c2
-rw-r--r--src/jtag/jtag.h3
-rw-r--r--src/jtag/tcl.c6
5 files changed, 16 insertions, 1 deletions
diff --git a/doc/openocd.texi b/doc/openocd.texi
index cee54eb..ed92eb4 100644
--- a/doc/openocd.texi
+++ b/doc/openocd.texi
@@ -4153,6 +4153,10 @@ option. When vendors put out multiple versions of a chip, or use the same
JTAG-level ID for several largely-compatible chips, it may be more practical
to ignore the version field than to update config files to handle all of
the various chip IDs. The version field is defined as bit 28-31 of the IDCODE.
+@item @code{-ignore-bypass}
+@*Specify this to ignore the 'bypass' bit of the idcode. Some vendor put
+an invalid idcode regarding this bit. Specify this to ignore this bit and
+to not consider this tap in bypass mode.
@item @code{-ircapture} @var{NUMBER}
@*The bit pattern loaded by the TAP into the JTAG shift register
on entry to the @sc{ircapture} state, such as 0x01.
diff --git a/src/jtag/core.c b/src/jtag/core.c
index 29ab6cc..bbc9877 100644
--- a/src/jtag/core.c
+++ b/src/jtag/core.c
@@ -1273,7 +1273,7 @@ static int jtag_examine_chain(void)
jtag_tap_init(tap);
}
- if ((idcode & 1) == 0) {
+ if ((idcode & 1) == 0 && !tap->ignore_bypass) {
/* Zero for LSB indicates a device in bypass */
LOG_INFO("TAP %s does not have valid IDCODE (idcode=0x%" PRIx32 ")",
tap->dotted_name, idcode);
diff --git a/src/jtag/hla/hla_tcl.c b/src/jtag/hla/hla_tcl.c
index 5aa3301..6b206d2 100644
--- a/src/jtag/hla/hla_tcl.c
+++ b/src/jtag/hla/hla_tcl.c
@@ -59,6 +59,7 @@ static int jim_newtap_expected_id(struct jim_nvp *n, struct jim_getopt_info *goi
#define NTAP_OPT_DISABLED 4
#define NTAP_OPT_EXPECTED_ID 5
#define NTAP_OPT_VERSION 6
+#define NTAP_OPT_BYPASS 7
static int jim_hl_newtap_cmd(struct jim_getopt_info *goi)
{
@@ -75,6 +76,7 @@ static int jim_hl_newtap_cmd(struct jim_getopt_info *goi)
{ .name = "-disable", .value = NTAP_OPT_DISABLED },
{ .name = "-expected-id", .value = NTAP_OPT_EXPECTED_ID },
{ .name = "-ignore-version", .value = NTAP_OPT_VERSION },
+ { .name = "-ignore-bypass", .value = NTAP_OPT_BYPASS },
{ .name = NULL, .value = -1},
};
diff --git a/src/jtag/jtag.h b/src/jtag/jtag.h
index d7d7d97..def594e 100644
--- a/src/jtag/jtag.h
+++ b/src/jtag/jtag.h
@@ -135,6 +135,9 @@ struct jtag_tap {
/** Flag saying whether to ignore version field in expected_ids[] */
bool ignore_version;
+ /** Flag saying whether to ignore the bypass bit in the code */
+ bool ignore_bypass;
+
/** current instruction */
uint8_t *cur_instr;
/** Bypass register selected */
diff --git a/src/jtag/tcl.c b/src/jtag/tcl.c
index 566c406..e6e976d 100644
--- a/src/jtag/tcl.c
+++ b/src/jtag/tcl.c
@@ -470,6 +470,7 @@ static int jim_newtap_expected_id(struct jim_nvp *n, struct jim_getopt_info *goi
#define NTAP_OPT_DISABLED 4
#define NTAP_OPT_EXPECTED_ID 5
#define NTAP_OPT_VERSION 6
+#define NTAP_OPT_BYPASS 7
static int jim_newtap_ir_param(struct jim_nvp *n, struct jim_getopt_info *goi,
struct jtag_tap *tap)
@@ -532,6 +533,7 @@ static int jim_newtap_cmd(struct jim_getopt_info *goi)
{ .name = "-disable", .value = NTAP_OPT_DISABLED },
{ .name = "-expected-id", .value = NTAP_OPT_EXPECTED_ID },
{ .name = "-ignore-version", .value = NTAP_OPT_VERSION },
+ { .name = "-ignore-bypass", .value = NTAP_OPT_BYPASS },
{ .name = NULL, .value = -1 },
};
@@ -617,6 +619,9 @@ static int jim_newtap_cmd(struct jim_getopt_info *goi)
case NTAP_OPT_VERSION:
tap->ignore_version = true;
break;
+ case NTAP_OPT_BYPASS:
+ tap->ignore_bypass = true;
+ break;
} /* switch (n->value) */
} /* while (goi->argc) */
@@ -887,6 +892,7 @@ static const struct command_registration jtag_subcommand_handlers[] = {
"['-enable'|'-disable'] "
"['-expected_id' number] "
"['-ignore-version'] "
+ "['-ignore-bypass'] "
"['-ircapture' number] "
"['-mask' number]",
},