script: add bscan_jedec command
bscan_jedec <device> reads the SPI flash JEDEC ID (0x9F + 3 bytes) through a loaded BSCAN proxy, via bscan_spi_xfer. Validation command for the proxy path; not yet exercised on hardware.
This commit is contained in:
@@ -2951,6 +2951,50 @@ static int cmd_bscan_load_bitstream(script_ctx *ctx, char *line)
|
|||||||
return JTAG_CORE_NO_ERROR;
|
return JTAG_CORE_NO_ERROR;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
const char *cmd_bscan_jedec_help[] = {
|
||||||
|
"<device>",
|
||||||
|
"Read the SPI flash JEDEC ID (0x9F) through the loaded BSCAN proxy.",
|
||||||
|
"Requires a proxy bitstream already loaded (bscan_load_bitstream).",
|
||||||
|
""};
|
||||||
|
static int cmd_bscan_jedec(script_ctx *ctx, char *line)
|
||||||
|
{
|
||||||
|
char dev_txt[DEFAULT_BUFLEN];
|
||||||
|
int device;
|
||||||
|
unsigned long idcode;
|
||||||
|
const fpga_target *t;
|
||||||
|
uint8_t tx = 0x9F;
|
||||||
|
uint8_t rx[3] = {0};
|
||||||
|
jtag_core *jc = (jtag_core *)ctx->app_ctx;
|
||||||
|
|
||||||
|
if (get_param(ctx, line, 1, dev_txt) < 0) {
|
||||||
|
ctx->script_printf(ctx, MSG_ERROR, "Usage: bscan_jedec <device>\n");
|
||||||
|
return JTAG_CORE_BAD_PARAMETER;
|
||||||
|
}
|
||||||
|
device = (int)strtoul(dev_txt, NULL, 0);
|
||||||
|
|
||||||
|
if (jtagcore_get_number_of_devices(jc) <= 0) {
|
||||||
|
ctx->script_printf(ctx, MSG_ERROR, "No device on the chain. Run jtag_autoinit first.\n");
|
||||||
|
return JTAG_CORE_NOT_FOUND;
|
||||||
|
}
|
||||||
|
idcode = jtagcore_get_dev_id(jc, device);
|
||||||
|
t = fpga_lookup_by_idcode(idcode);
|
||||||
|
if (!t) {
|
||||||
|
ctx->script_printf(ctx, MSG_ERROR, "Device %d IDCODE 0x%.8lX not in FPGA registry\n", device, idcode);
|
||||||
|
return JTAG_CORE_NOT_FOUND;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (bscan_spi_xfer(jc, t, &tx, 1, rx, sizeof(rx)) < 0) {
|
||||||
|
ctx->script_printf(ctx, MSG_ERROR, "bscan_spi_xfer failed (proxy not loaded?)\n");
|
||||||
|
return JTAG_CORE_IO_ERROR;
|
||||||
|
}
|
||||||
|
|
||||||
|
ctx->script_printf(ctx, MSG_INFO_0,
|
||||||
|
"JEDEC ID: %.2X %.2X %.2X (manufacturer 0x%.2X, device 0x%.2X%.2X)\n",
|
||||||
|
rx[0], rx[1], rx[2], rx[0], rx[1], rx[2]);
|
||||||
|
ctx->last_data_value = (rx[0] << 16) | (rx[1] << 8) | rx[2];
|
||||||
|
return JTAG_CORE_NO_ERROR;
|
||||||
|
}
|
||||||
|
|
||||||
cmd_list script_commands_list[] =
|
cmd_list script_commands_list[] =
|
||||||
{
|
{
|
||||||
{"print", cmd_print, cmd_print_help},
|
{"print", cmd_print, cmd_print_help},
|
||||||
@@ -2998,6 +3042,7 @@ cmd_list script_commands_list[] =
|
|||||||
{"bscan_set_ir", cmd_bscan_set_ir, cmd_bscan_set_ir_help},
|
{"bscan_set_ir", cmd_bscan_set_ir, cmd_bscan_set_ir_help},
|
||||||
{"bscan_shift_dr", cmd_bscan_shift_dr, cmd_bscan_shift_dr_help},
|
{"bscan_shift_dr", cmd_bscan_shift_dr, cmd_bscan_shift_dr_help},
|
||||||
{"bscan_load_bitstream", cmd_bscan_load_bitstream, cmd_bscan_load_bitstream_help},
|
{"bscan_load_bitstream", cmd_bscan_load_bitstream, cmd_bscan_load_bitstream_help},
|
||||||
|
{"bscan_jedec", cmd_bscan_jedec, cmd_bscan_jedec_help},
|
||||||
{0, 0}};
|
{0, 0}};
|
||||||
|
|
||||||
///////////////////////////////////////////////////////////////////////////////
|
///////////////////////////////////////////////////////////////////////////////
|
||||||
|
|||||||
Reference in New Issue
Block a user