kopia lustrzana https://github.com/stlink-org/stlink
Expose JTAG NRST
rodzic
b1e89edb57
commit
28956cf2c9
|
@ -470,6 +470,11 @@ void stlink_reset(stlink_t *sl) {
|
|||
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);
|
||||
|
|
|
@ -70,6 +70,7 @@ extern "C" {
|
|||
// 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
|
||||
|
@ -267,6 +268,7 @@ extern "C" {
|
|||
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);
|
||||
|
@ -330,6 +332,7 @@ extern "C" {
|
|||
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);
|
||||
|
|
|
@ -537,6 +537,19 @@ void _stlink_sg_reset(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) {
|
||||
|
@ -820,6 +833,7 @@ stlink_backend_t _stlink_sg_backend = {
|
|||
_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,
|
||||
|
|
|
@ -348,6 +348,26 @@ void _stlink_usb_reset(stlink_t * sl) {
|
|||
}
|
||||
|
||||
|
||||
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;
|
||||
|
@ -533,6 +553,7 @@ stlink_backend_t _stlink_usb_backend = {
|
|||
_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,
|
||||
|
|
Ładowanie…
Reference in New Issue