From: htk Date: Sun, 29 Sep 2013 23:51:26 +0000 (+0200) Subject: Support for reading target voltage X-Git-Url: https://git.gag.com/?a=commitdiff_plain;h=e886396e0e0ee27f8df2182f4d1a96bf59efedfb;p=fw%2Fstlink Support for reading target voltage --- diff --git a/gdbserver/gdb-server.c b/gdbserver/gdb-server.c index 13c5d16..bf14781 100644 --- a/gdbserver/gdb-server.c +++ b/gdbserver/gdb-server.c @@ -172,6 +172,7 @@ int parse_options(int argc, char** argv, st_state_t *st) { int main(int argc, char** argv) { + uint32_t voltage; stlink_t *sl = NULL; @@ -204,6 +205,11 @@ int main(int argc, char** argv) { printf("Chip ID is %08x, Core ID is %08x.\n", sl->chip_id, sl->core_id); + voltage = stlink_target_voltage(sl); + if (voltage != -1) { + printf("Target voltage is %d mV.\n", voltage); + } + sl->verbose=0; current_memory_map = make_memory_map(sl); diff --git a/src/stlink-common.c b/src/stlink-common.c index 23bea58..9613080 100644 --- a/src/stlink-common.c +++ b/src/stlink-common.c @@ -561,6 +561,22 @@ void stlink_version(stlink_t *sl) { } } +int stlink_target_voltage(stlink_t *sl) { + int voltage = -1; + DLOG("*** reading target voltage\n"); + if (sl->backend->target_voltage != NULL) { + voltage = sl->backend->target_voltage(sl); + if (voltage != -1) { + DLOG("target voltage = %ldmV\n", voltage); + } else { + DLOG("error reading target voltage\n"); + } + } else { + DLOG("reading voltage not supported by backend\n"); + } + return voltage; +} + uint32_t stlink_read_debug32(stlink_t *sl, uint32_t addr) { uint32_t data = sl->backend->read_debug32(sl, addr); DLOG("*** stlink_read_debug32 %x is %#x\n", data, addr); diff --git a/src/stlink-common.h b/src/stlink-common.h index c170195..0ac4f12 100644 --- a/src/stlink-common.h +++ b/src/stlink-common.h @@ -34,6 +34,7 @@ extern "C" { #define STLINK_GET_VERSION 0xf1 #define STLINK_GET_CURRENT_MODE 0xf5 +#define STLINK_GET_TARGET_VOLTAGE 0xF7 #define STLINK_DEBUG_COMMAND 0xF2 #define STLINK_DFU_COMMAND 0xF3 @@ -386,6 +387,7 @@ static const chip_params_t devices[] = { void (*step) (stlink_t * stl); int (*current_mode) (stlink_t * stl); void (*force_debug) (stlink_t *sl); + uint32_t (*target_voltage) (stlink_t *sl); } stlink_backend_t; struct _stlink { @@ -455,6 +457,7 @@ static const chip_params_t devices[] = { void stlink_step(stlink_t *sl); int stlink_current_mode(stlink_t *sl); void stlink_force_debug(stlink_t *sl); + int stlink_target_voltage(stlink_t *sl); // unprocessed diff --git a/src/stlink-sg.c b/src/stlink-sg.c index be1f752..53e93cc 100644 --- a/src/stlink-sg.c +++ b/src/stlink-sg.c @@ -878,7 +878,8 @@ stlink_backend_t _stlink_sg_backend = { _stlink_sg_write_reg, _stlink_sg_step, _stlink_sg_current_mode, - _stlink_sg_force_debug + _stlink_sg_force_debug, + NULL }; static stlink_t* stlink_open(const int verbose) { diff --git a/src/stlink-usb.c b/src/stlink-usb.c index 858361c..fa2bd7e 100644 --- a/src/stlink-usb.c +++ b/src/stlink-usb.c @@ -203,6 +203,34 @@ void _stlink_usb_version(stlink_t *sl) { } } +int _stlink_usb_target_voltage(stlink_t *sl) { + struct stlink_libusb * const slu = sl->backend_data; + unsigned char* const rdata = sl->q_buf; + unsigned char* const cmd = sl->c_buf; + ssize_t size; + uint32_t rep_len = 8; + int i = fill_command(sl, SG_DXFER_FROM_DEV, rep_len); + uint32_t factor, reading; + int voltage; + + cmd[i++] = STLINK_GET_TARGET_VOLTAGE; + + size = send_recv(slu, 1, cmd, slu->cmd_len, rdata, rep_len); + if (size == -1) { + printf("[!] send_recv\n"); + return -1; + } else if (size != 8) { + printf("[!] wrong length\n"); + return -1; + } + + factor = (rdata[3] << 24) | (rdata[2] << 16) | (rdata[1] << 8) | (rdata[0] << 0); + reading = (rdata[7] << 24) | (rdata[6] << 16) | (rdata[5] << 8) | (rdata[4] << 0); + voltage = 2400 * reading / factor; + + return voltage; +} + uint32_t _stlink_usb_read_debug32(stlink_t *sl, uint32_t addr) { struct stlink_libusb * const slu = sl->backend_data; unsigned char* const rdata = sl->q_buf; @@ -700,7 +728,8 @@ stlink_backend_t _stlink_usb_backend = { _stlink_usb_write_reg, _stlink_usb_step, _stlink_usb_current_mode, - _stlink_usb_force_debug + _stlink_usb_force_debug, + _stlink_usb_target_voltage };