Expose JTAG NRST
authorUwe Bonnes <bon@elektron.ikp.physik.tu-darmstadt.de>
Mon, 12 Dec 2011 14:22:19 +0000 (15:22 +0100)
committerUwe Bonnes <bon@elektron.ikp.physik.tu-darmstadt.de>
Mon, 12 Dec 2011 14:22:19 +0000 (15:22 +0100)
src/stlink-common.c
src/stlink-common.h
src/stlink-sg.c
src/stlink-usb.c

index ab145104c039962457e80a1a258e3aa77382471f..c614677d15bd3cb0749faf25e624e0953c0cb098 100644 (file)
@@ -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);
index ae02961a0544ff1112d4a86939cbd8869318970b..b2a4adc5bf1256e3b56f4859ab3e63d8bf5593d2 100644 (file)
@@ -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);
index 394417b1819f4e6075b7f5060cd8021fab128008..0e4504c7f9ca7d6d91e22546b38fb7a03e71b024 100644 (file)
@@ -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,
index 1320831d1ff3b0e1143a5641f375f037eef8f876..678e4c42bd389c57296a2663232090be4174dd3d 100644 (file)
@@ -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,