X-Git-Url: https://git.gag.com/?a=blobdiff_plain;f=src%2Fstlink-usb.c;h=ec4053ac7bd050bd3d4f0f91b750084902e7a94a;hb=3652f98a5d6c8bbe4707c5764b10e5bb9a13c370;hp=858361c6695a2d65affe60f8aa32f163e1c5ba5d;hpb=22cb598c6f346d67cc60e8c168b32502104f061f;p=fw%2Fstlink diff --git a/src/stlink-usb.c b/src/stlink-usb.c index 858361c..ec4053a 100644 --- a/src/stlink-usb.c +++ b/src/stlink-usb.c @@ -203,6 +203,34 @@ void _stlink_usb_version(stlink_t *sl) { } } +int32_t _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 };