diff options
Diffstat (limited to 'src/transport/swd_libswd_drv_openocd.c')
-rw-r--r-- | src/transport/swd_libswd_drv_openocd.c | 65 |
1 files changed, 57 insertions, 8 deletions
diff --git a/src/transport/swd_libswd_drv_openocd.c b/src/transport/swd_libswd_drv_openocd.c index 19c8f9c8..c503a9a2 100644 --- a/src/transport/swd_libswd_drv_openocd.c +++ b/src/transport/swd_libswd_drv_openocd.c @@ -3,7 +3,8 @@ * * Driver Bridge between LibSWD and OpenOCD. * - * Copyright (C) 2010-2011, Tomasz Boleslaw CEDRO (http://www.tomek.cedro.info) + * Copyright (C) 2010-2011 Tomasz Boleslaw CEDRO + * cederom@tlen.pl, http://www.tomek.cedro.info * All rights reserved. * * Redistribution and use in source and binary forms, with or without @@ -41,6 +42,7 @@ #include <helper/log.h> #include <jtag/interface.h> #include <helper/log.h> +#include <helper/command.h> /** OpenOCD as for now use global pointer to driver structure. */ extern struct jtag_interface *jtag_interface; @@ -56,6 +58,7 @@ extern struct jtag_interface *jtag_interface; * \return data count transferred, or negative SWD_ERROR code on failure. */ int swd_drv_mosi_8(swd_ctx_t *swdctx, swd_cmd_t *cmd, char *data, int bits, int nLSBfirst){ + LOG_DEBUG("OpenOCD's swd_drv_mosi_8(swdctx=@0x%08X, cmd=@0x%08X, data=0x%08X, bits=%d, nLSBfirst=0x%02X)", (int)swdctx, (int)cmd, *data, bits, nLSBfirst); if (data==NULL) return SWD_ERROR_NULLPOINTER; if (bits<0 && bits>8) return SWD_ERROR_PARAM; if (nLSBfirst!=0 && nLSBfirst!=1) return SWD_ERROR_PARAM; @@ -67,7 +70,7 @@ int swd_drv_mosi_8(swd_ctx_t *swdctx, swd_cmd_t *cmd, char *data, int bits, int /* Split output data into char array. */ for (i=0;i<8;i++) mosidata[(nLSBfirst==SWD_DIR_LSBFIRST)?(i):(7-i)]=((1<<i)&(*data))?1:0; /* Then send that array into interface hardware. */ - res=jtag_interface->transfer(NULL, bits, mosidata, misodata); + res=jtag_interface->transfer(NULL, bits, mosidata, misodata, 0); if (res<0) return SWD_ERROR_DRIVER; return i; @@ -84,6 +87,7 @@ int swd_drv_mosi_8(swd_ctx_t *swdctx, swd_cmd_t *cmd, char *data, int bits, int * \return data count transferred, or negative SWD_ERROR code on failure. */ int swd_drv_mosi_32(swd_ctx_t *swdctx, swd_cmd_t *cmd, int *data, int bits, int nLSBfirst){ + LOG_DEBUG("OpenOCD's swd_drv_mosi_32(swdctx=@0x%08X, cmd=@0x%02X, data=0x%08X, bits=%d, nLSBfirst=0x%02X)", (int)swdctx, (int)cmd, *data, bits, nLSBfirst); if (data==NULL) return SWD_ERROR_NULLPOINTER; if (bits<0 && bits>8) return SWD_ERROR_PARAM; if (nLSBfirst!=0 && nLSBfirst!=1) return SWD_ERROR_PARAM; @@ -94,7 +98,7 @@ int swd_drv_mosi_32(swd_ctx_t *swdctx, swd_cmd_t *cmd, int *data, int bits, int //UrJTAG drivers shift data LSB-First. for (i=0;i<32;i++) mosidata[(nLSBfirst==SWD_DIR_LSBFIRST)?(i):(31-i)]=((1<<i)&(*data))?1:0; - res=jtag_interface->transfer(NULL, bits, mosidata, misodata); + res=jtag_interface->transfer(NULL, bits, mosidata, misodata, 0); if (res<0) return SWD_ERROR_DRIVER; return i; } @@ -118,11 +122,13 @@ int swd_drv_miso_8(swd_ctx_t *swdctx, swd_cmd_t *cmd, char *data, int bits, int static signed int res; static char misodata[8], mosidata[8]; - res=jtag_interface->transfer(NULL, bits, mosidata, misodata); + // This function sends and reveice MSb-first. + res=jtag_interface->transfer(NULL, bits, mosidata, misodata, 0); if (res<0) return SWD_ERROR_DRIVER; /* Now we need to reconstruct the data byte from shifted in LSBfirst byte array. */ *data=0; for (i=0;i<bits;i++) *data|=(misodata[(nLSBfirst==SWD_DIR_LSBFIRST)?(bits-1-i):(i)]?(1<<i):0); + LOG_DEBUG("OpenOCD's swd_drv_miso_8(swdctx=@0x%08X, cmd=@0x%08X, data=@0x%08X, bits=%d, nLSBfirst=0x%02X) reads: 0x%08X", (int)swdctx, (int)cmd, (int)data, bits, nLSBfirst, *data); return i; } @@ -145,11 +151,13 @@ int swd_drv_miso_32(swd_ctx_t *swdctx, swd_cmd_t *cmd, int *data, int bits, int static signed int res; static char misodata[32], mosidata[32]; - res=jtag_interface->transfer(NULL, bits, mosidata, misodata); + res=jtag_interface->transfer(NULL, bits, mosidata, misodata, 0); if (res<0) return SWD_ERROR_DRIVER; /* Now we need to reconstruct the data byte from shifted in LSBfirst byte array. */ *data=0; for (i=0;i<bits;i++) *data|=(misodata[(nLSBfirst==SWD_DIR_LSBFIRST)?(bits-1-i):(i)]?(1<<i):0); + LOG_DEBUG("OpenOCD's swd_drv_miso_32(swdctx=@0x%08X, cmd=@0x%02X, data=@0x08%X, bits=%d, nLSBfirst=0x%02X) reads: 0x%08X", (int)swdctx, (int)cmd, (int)data, bits, nLSBfirst, *data); + LOG_DEBUG("OpenOCD's swd_drv_miso_32() reads: 0x%08X\n", *data); return i; } @@ -163,6 +171,7 @@ int swd_drv_miso_32(swd_ctx_t *swdctx, swd_cmd_t *cmd, int *data, int bits, int * \return number of bits transmitted or negative SWD_ERROR code on failure. */ int swd_drv_mosi_trn(swd_ctx_t *swdctx, int bits){ + LOG_DEBUG("OpenOCD's swd_drv_mosi_trn(swdctx=@0x%08X, bits=%d)\n", (int)swdctx, bits); if (bits<SWD_TURNROUND_MIN_VAL && bits>SWD_TURNROUND_MAX_VAL) return SWD_ERROR_TURNAROUND; @@ -173,7 +182,7 @@ int swd_drv_mosi_trn(swd_ctx_t *swdctx, int bits){ if (res<0) return SWD_ERROR_DRIVER; /* Clock specified number of bits for proper TRN transaction. */ - res=jtag_interface->transfer(NULL, bits, buf, buf); + res=jtag_interface->transfer(NULL, bits, buf, buf, 0); if (res<0) return SWD_ERROR_DRIVER; return bits; @@ -189,6 +198,7 @@ int swd_drv_mosi_trn(swd_ctx_t *swdctx, int bits){ * \return number of bits transmitted or negative SWD_ERROR code on failure. */ int swd_drv_miso_trn(swd_ctx_t *swdctx, int bits){ + LOG_DEBUG("OpenOCD's swd_drv_miso_trn(swdctx=@0x%08X, bits=%d)\n", (int)swdctx, bits); if (bits<SWD_TURNROUND_MIN_VAL && bits>SWD_TURNROUND_MAX_VAL) return SWD_ERROR_TURNAROUND; @@ -196,11 +206,11 @@ int swd_drv_miso_trn(swd_ctx_t *swdctx, int bits){ static char buf[SWD_TURNROUND_MAX_VAL]; /* Use driver method to set high (read) signal named RnW. */ - res=jtag_interface->bitbang(NULL, "RnW", 0, &val); + res=jtag_interface->bitbang(NULL, "RnW", 0xFFFFFFFF, &val); if (res<0) return SWD_ERROR_DRIVER; /* Clock specified number of bits for proper TRN transaction. */ - res=jtag_interface->transfer(NULL, bits, buf, buf); + res=jtag_interface->transfer(NULL, bits, buf, buf, 0); if (res<0) return SWD_ERROR_DRIVER; return bits; @@ -215,6 +225,7 @@ int swd_drv_miso_trn(swd_ctx_t *swdctx, int bits){ * \return SWD_OK on success, negative SWD_ERROR code on failure. */ int swd_log_level_inherit(swd_ctx_t *swdctx, int loglevel){ + LOG_DEBUG("OpenOCD's swd_log_level_inherit(swdctx=@0x%08X, loglevel=%d)\n", (int)swdctx, loglevel); if (swdctx==NULL){ LOG_WARNING("swd_log_level_inherit(): SWD Context not (yet) initialized...\n"); return SWD_OK; @@ -252,4 +263,42 @@ int swd_log_level_inherit(swd_ctx_t *swdctx, int loglevel){ } else return SWD_OK; } +/** We will use OpenOCD's logging mechanisms to show LibSWD messages. */ +int swd_log(swd_ctx_t *swdctx, swd_loglevel_t loglevel, char *msg, ...){ + if (swdctx==NULL) return SWD_ERROR_NULLCONTEXT; + if (loglevel > SWD_LOGLEVEL_MAX) return SWD_ERROR_PARAM; + + if (loglevel > swdctx->config.loglevel) return SWD_OK; + int res; + va_list ap; + va_start(ap, msg); + res=vprintf(msg, ap); + va_end(ap); + return res; + + + LOG_DEBUG("swdctx=0x%08X, loglevel=0x%02X, msg=%s\n", (int)swdctx, (int)loglevel, msg); + switch(loglevel){ + case SWD_LOGLEVEL_NORMAL: + LOG_USER(msg, ap); + break; + case SWD_LOGLEVEL_ERROR: + LOG_ERROR(msg, ap); + break; + case SWD_LOGLEVEL_WARNING: + LOG_WARNING(msg, ap); + break; + case SWD_LOGLEVEL_INFO: + printf(msg, ap); + break; + case SWD_LOGLEVEL_DEBUG: + LOG_DEBUG(msg, ap); + break; + default: + LOG_USER(msg, ap); + } + va_end(ap); + + return SWD_OK; +} |