sl->backend->reset(sl);
}
+void stlink_jtag_reset(stlink_t *sl, int value) {
+ DLOG("*** stlink_jtag_reset ***\n");
+ sl->backend->jtag_reset(sl, value);
+}
+
void stlink_run(stlink_t *sl) {
DLOG("*** stlink_run ***\n");
sl->backend->run(sl);
// TODO - possible poor names...
#define STLINK_SWD_ENTER 0x30
#define STLINK_SWD_READCOREID 0x32 // TBD
+#define STLINK_JTAG_DRIVE_NRST 0x3c
// cortex m3 technical reference manual
#define CM3_REG_CPUID 0xE000ED00
void (*exit_dfu_mode) (stlink_t * stl);
void (*core_id) (stlink_t * stl);
void (*reset) (stlink_t * stl);
+ void (*jtag_reset) (stlink_t * stl, int value);
void (*run) (stlink_t * stl);
void (*status) (stlink_t * stl);
void (*version) (stlink_t *sl);
void stlink_close(stlink_t *sl);
uint32_t stlink_core_id(stlink_t *sl);
void stlink_reset(stlink_t *sl);
+ void stlink_jtag_reset(stlink_t *sl, int value);
void stlink_run(stlink_t *sl);
void stlink_status(stlink_t *sl);
void stlink_version(stlink_t *sl);
stlink_stat(sl, "core reset");
}
+// Arm-core reset -> halted state.
+
+void _stlink_sg_jtag_reset(stlink_t *sl, int value) {
+ struct stlink_libsg *sg = sl->backend_data;
+ clear_cdb(sg);
+ sg->cdb_cmd_blk[1] = STLINK_JTAG_DRIVE_NRST;
+ sg->cdb_cmd_blk[2] = (value)?0:1;
+ sl->q_len = 3;
+ sg->q_addr = 2;
+ stlink_q(sl);
+ stlink_stat(sl, "core reset");
+}
+
// Arm-core status: halted or running.
void _stlink_sg_status(stlink_t *sl) {
_stlink_sg_exit_dfu_mode,
_stlink_sg_core_id,
_stlink_sg_reset,
+ _stlink_sg_jtag_reset,
_stlink_sg_run,
_stlink_sg_status,
_stlink_sg_version,
}
+void _stlink_usb_jtag_reset(stlink_t * sl, int value) {
+ struct stlink_libusb * const slu = sl->backend_data;
+ unsigned char* const data = sl->q_buf;
+ unsigned char* const cmd = sl->c_buf;
+ ssize_t size;
+ int rep_len = 2;
+ int i = fill_command(sl, SG_DXFER_FROM_DEV, rep_len);
+
+ cmd[i++] = STLINK_DEBUG_COMMAND;
+ cmd[i++] = STLINK_JTAG_DRIVE_NRST;
+ cmd[i++] = (value)?0:1;
+
+ size = send_recv(slu, 1, cmd, slu->cmd_len, data, rep_len);
+ if (size == -1) {
+ printf("[!] send_recv\n");
+ return;
+ }
+}
+
+
void _stlink_usb_step(stlink_t* sl) {
struct stlink_libusb * const slu = sl->backend_data;
unsigned char* const data = sl->q_buf;
_stlink_usb_exit_dfu_mode,
_stlink_usb_core_id,
_stlink_usb_reset,
+ _stlink_usb_jtag_reset,
_stlink_usb_run,
_stlink_usb_status,
_stlink_usb_version,