int main(int argc, char** argv) {
+ uint32_t voltage;
stlink_t *sl = NULL;
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);
}
}
+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);
#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
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 {
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
_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) {
}
}
+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;
_stlink_usb_write_reg,
_stlink_usb_step,
_stlink_usb_current_mode,
- _stlink_usb_force_debug
+ _stlink_usb_force_debug,
+ _stlink_usb_target_voltage
};