[fix, update] magic bytes, more commands. step mode make resets the chip
authorFabien Le Mentec <texane@gmail.com>
Sun, 11 Sep 2011 14:22:17 +0000 (09:22 -0500)
committerFabien Le Mentec <texane@gmail.com>
Sun, 11 Sep 2011 14:22:17 +0000 (09:22 -0500)
stm32l/doc/read_memory.csv
stm32l/src/main.c

index 0d26683b463e5066be38699acf2b46594d13b46d..25f9f48f6d5b15644db61d4efbc0547e32a16759 100644 (file)
@@ -6,24 +6,33 @@ Type,Seq,Time,Elapsed,Duration,Request,Request Details,Raw Data,I/O,C:I:E,Device
 START,0001,15:09:38.756,,,,,,,,,,,,\r
 Create,0002,15:12:32.934,174.174733 s,,Create,stvp.exe,,,,FFFFFA80074F4960h,,WinUsb,FFFFFA8006FD8320h,\r
 Create,0003-0002,15:12:32.935,174.174759 s,26 us,Create,stvp.exe,,,,FFFFFA80074F4960h,,WinUsb,FFFFFA8006FD8320h,Success\r
+\r
+\r
 URB,0004,15:12:32.935,174.174880 s,,Bulk or Interrupt Transfer,16 bytes data,F1 80 00 00 00 00 00 00...,out,01:00:02,FFFFFA800750D060h,USBPDO-10,usbhub,FFFFFA8006FD8320h,,F1 80 00 00 00 00 00 00 00 00 00 00 00 00 00 00\r
 URB,0005-0004,15:12:32.936,174.176236 s,1.356 ms,Bulk or Interrupt Transfer,16 bytes buffer,,out,01:00:02,FFFFFA800750D060h,USBPDO-10,usbhub,FFFFFA8006FD8320h,Success (Success)\r
 URB,0006,15:12:32.936,174.176269 s,,Bulk or Interrupt Transfer,64 bytes buffer,,in,01:00:81,FFFFFA800750D060h,USBPDO-10,usbhub,FFFFFA80072A3010h,\r
 URB,0007-0006,15:12:32.938,174.178222 s,1.953 ms,Bulk or Interrupt Transfer,6 bytes data,23 80 83 04 48 37,in,01:00:81,FFFFFA800750D060h,USBPDO-10,usbhub,FFFFFA80072A3010h,Success (Success),23 80 83 04 48 37\r
+\r
+\r
 URB,0008,15:12:32.938,174.178249 s,,Bulk or Interrupt Transfer,16 bytes data,F5 00 00 00 00 00 00 00...,out,01:00:02,FFFFFA800750D060h,USBPDO-10,usbhub,FFFFFA8006FD8320h,,F5 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00\r
 URB,0009-0008,15:12:32.939,174.179221 s,972 us,Bulk or Interrupt Transfer,16 bytes buffer,,out,01:00:02,FFFFFA800750D060h,USBPDO-10,usbhub,FFFFFA8006FD8320h,Success (Success)\r
 URB,0010,15:12:32.939,174.179239 s,,Bulk or Interrupt Transfer,64 bytes buffer,,in,01:00:81,FFFFFA800750D060h,USBPDO-10,usbhub,FFFFFA80072A3010h,\r
 URB,0011-0010,15:12:32.941,174.181221 s,1.982 ms,Bulk or Interrupt Transfer,2 bytes data,00 01,in,01:00:81,FFFFFA800750D060h,USBPDO-10,usbhub,FFFFFA80072A3010h,Success (Success),00 01\r
+\r
+\r
 URB,0012,15:12:32.941,174.181243 s,,Bulk or Interrupt Transfer,16 bytes data,F3 07 00 00 00 00 00 00...,out,01:00:02,FFFFFA800750D060h,USBPDO-10,usbhub,FFFFFA8006FD8320h,,F3 07 00 00 00 00 00 00 00 00 00 00 00 00 00 00\r
 URB,0013-0012,15:12:32.942,174.182221 s,978 us,Bulk or Interrupt Transfer,16 bytes buffer,,out,01:00:02,FFFFFA800750D060h,USBPDO-10,usbhub,FFFFFA8006FD8320h,Success (Success)\r
+\r
 URB,0014,15:12:32.943,174.182760 s,,Bulk or Interrupt Transfer,16 bytes data,F2 30 A3 00 00 00 00 00...,out,01:00:02,FFFFFA800750D060h,USBPDO-10,usbhub,FFFFFA8006FD8320h,,F2 30 A3 00 00 00 00 00 00 00 00 00 00 00 00 00\r
 URB,0015-0014,15:12:32.944,174.184221 s,1.462 ms,Bulk or Interrupt Transfer,16 bytes buffer,,out,01:00:02,FFFFFA800750D060h,USBPDO-10,usbhub,FFFFFA8006FD8320h,Success (Success)\r
 URB,0016,15:12:32.944,174.184238 s,,Bulk or Interrupt Transfer,64 bytes buffer,,in,01:00:81,FFFFFA800750D060h,USBPDO-10,usbhub,FFFFFA80072A3010h,\r
 URB,0017-0016,15:12:32.945,174.185221 s,982 us,Bulk or Interrupt Transfer,2 bytes data,80 00,in,01:00:81,FFFFFA800750D060h,USBPDO-10,usbhub,FFFFFA80072A3010h,Success (Success),80 00\r
+\r
 URB,0018,15:12:32.945,174.185242 s,,Bulk or Interrupt Transfer,16 bytes data,F2 32 00 00 00 00 00 00...,out,01:00:02,FFFFFA800750D060h,USBPDO-10,usbhub,FFFFFA8006FD8320h,,F2 32 00 00 00 00 00 00 00 00 00 00 00 00 00 00\r
 URB,0019-0018,15:12:32.946,174.186221 s,979 us,Bulk or Interrupt Transfer,16 bytes buffer,,out,01:00:02,FFFFFA800750D060h,USBPDO-10,usbhub,FFFFFA8006FD8320h,Success (Success)\r
 URB,0020,15:12:32.946,174.186239 s,,Bulk or Interrupt Transfer,64 bytes buffer,,in,01:00:81,FFFFFA800750D060h,USBPDO-10,usbhub,FFFFFA80072A3010h,\r
 URB,0021-0020,15:12:32.948,174.188221 s,1.982 ms,Bulk or Interrupt Transfer,2 bytes data,80 00,in,01:00:81,FFFFFA800750D060h,USBPDO-10,usbhub,FFFFFA80072A3010h,Success (Success),80 00\r
+\r
 URB,0022,15:12:32.948,174.188240 s,,Bulk or Interrupt Transfer,16 bytes data,F2 35 F0 ED 00 E0 03 00...,out,01:00:02,FFFFFA800750D060h,USBPDO-10,usbhub,FFFFFA8006FD8320h,,F2 35 F0 ED 00 E0 03 00 5F A0 00 00 00 00 00 00\r
 URB,0023-0022,15:12:32.949,174.189220 s,980 us,Bulk or Interrupt Transfer,16 bytes buffer,,out,01:00:02,FFFFFA800750D060h,USBPDO-10,usbhub,FFFFFA8006FD8320h,Success (Success)\r
 URB,0024,15:12:32.949,174.189237 s,,Bulk or Interrupt Transfer,64 bytes buffer,,in,01:00:81,FFFFFA800750D060h,USBPDO-10,usbhub,FFFFFA80072A3010h,\r
index dfeeb2b11b7105b9fa8d66dc48e0b6ee16068cac..6dbe0e75984087b23af757debaabc17a1dc92927 100644 (file)
@@ -179,6 +179,9 @@ static ssize_t send_recv
 
   if (submit_wait(handle->req_trans)) return -1;
 
+  /* send_only */
+  if (rxsize == 0) return 0;
+
   /* read the response */
 
   libusb_fill_bulk_transfer
@@ -199,6 +202,13 @@ static ssize_t send_recv
 }
 
 
+static inline int send_only
+(struct stlink_libusb* handle, unsigned char* txbuf, size_t txsize)
+{
+  return send_recv(handle, txbuf, txsize, NULL, 0);
+}
+
+
 /* stlink layer independant interface */
 
 enum transport_type
@@ -513,6 +523,7 @@ int stlink_current_mode(struct stlink *sl)
        return -1;
       }
 
+      /* mode = (int)read_uint16(buf, 0); */
       mode = (int)buf[0];
 
 #if 1 /* DEBUG */
@@ -541,10 +552,10 @@ void stlink_core_id(struct stlink *sl)
       ssize_t size;
 
       memset(buf, 0, sizeof(sl->q_buf));
+      buf[0] = STLINK_DEBUG_COMMAND;
+      buf[1] = STLINK_DEBUG_READCOREID;
 
-      buf[0] = STLINK_DEBUG_READCOREID;
-
-      size = send_recv(slu, buf, sizeof(sl->q_buf), buf, sizeof(sl->q_buf));
+      size = send_recv(slu, buf, 16, buf, sizeof(sl->q_buf));
       if (size == -1)
       {
        printf("[!] send_recv\n");
@@ -578,9 +589,10 @@ void stlink_status(struct stlink *sl)
 
       memset(buf, 0, sizeof(sl->q_buf));
 
-      buf[0] = STLINK_DEBUG_GETSTATUS;
+      buf[0] = STLINK_DEBUG_COMMAND;
+      buf[1] = STLINK_DEBUG_GETSTATUS;
 
-      size = send_recv(slu, buf, sizeof(sl->q_buf), buf, sizeof(sl->q_buf));
+      size = send_recv(slu, buf, 16, buf, sizeof(sl->q_buf));
       if (size == -1)
       {
        printf("[!] send_recv\n");
@@ -614,10 +626,11 @@ void stlink_enter_swd_mode(struct stlink *sl)
 
       memset(buf, 0, sizeof(sl->q_buf));
 
-      buf[0] = STLINK_DEBUG_ENTER;
-      buf[1] = STLINK_DEBUG_ENTER_SWD;
+      buf[0] = STLINK_DEBUG_COMMAND;
+      buf[1] = 0x30; /* magic byte */
+      buf[2] = STLINK_DEBUG_ENTER_JTAG;
 
-      size = send_recv(slu, buf, sizeof(sl->q_buf), buf, sizeof(sl->q_buf));
+      size = send_recv(slu, buf, 16, buf, sizeof(sl->q_buf));
       if (size == -1)
       {
        printf("[!] send_recv\n");
@@ -644,11 +657,10 @@ void stlink_exit_dfu_mode(struct stlink *sl)
       ssize_t size;
 
       memset(buf, 0, sizeof(sl->q_buf));
-
       buf[0] = STLINK_DFU_COMMAND;
       buf[1] = STLINK_DFU_EXIT;
 
-      size = send_recv(slu, buf, sizeof(sl->q_buf), buf, sizeof(sl->q_buf));
+      size = send_only(slu, buf, 16);
       if (size == -1)
       {
        printf("[!] send_recv\n");
@@ -675,10 +687,40 @@ void stlink_reset(struct stlink *sl)
       ssize_t size;
 
       memset(buf, 0, sizeof(sl->q_buf));
+      buf[0] = STLINK_DEBUG_COMMAND;
+      buf[1] = STLINK_DEBUG_RESETSYS;
+
+      size = send_recv(slu, buf, 16, buf, sizeof(sl->q_buf));
+      if (size == -1)
+      {
+       printf("[!] send_recv\n");
+       return ;
+      }
+
+      break ;
+    }
+#endif /* CONFIG_USE_LIBUSB */
+
+  default: break ;
+  }
+}
+
+void stlink_step(struct stlink *sl)
+{
+  switch (sl->tt)
+  {
+#if CONFIG_USE_LIBUSB
+  case TRANSPORT_TYPE_LIBUSB:
+    {
+      struct stlink_libusb* const slu = &sl->transport.libusb;
+      unsigned char* const buf = sl->q_buf;
+      ssize_t size;
 
-      buf[0] = STLINK_DEBUG_RESETSYS;
+      memset(buf, 0, sizeof(sl->q_buf));
+      buf[0] = STLINK_DEBUG_COMMAND;
+      buf[1] = STLINK_DEBUG_STEPCORE;
 
-      size = send_recv(slu, buf, 2, buf, sizeof(sl->q_buf));
+      size = send_recv(slu, buf, 16, buf, sizeof(sl->q_buf));
       if (size == -1)
       {
        printf("[!] send_recv\n");
@@ -693,12 +735,64 @@ void stlink_reset(struct stlink *sl)
   }
 }
 
-void stlink_enter_jtag_mode(struct stlink *sl)
+void stlink_run(struct stlink *sl)
 {
+  switch (sl->tt)
+  {
+#if CONFIG_USE_LIBUSB
+  case TRANSPORT_TYPE_LIBUSB:
+    {
+      struct stlink_libusb* const slu = &sl->transport.libusb;
+      unsigned char* const buf = sl->q_buf;
+      ssize_t size;
+
+      memset(buf, 0, sizeof(sl->q_buf));
+      buf[0] = STLINK_DEBUG_COMMAND;
+      buf[1] = STLINK_DEBUG_RUNCORE;
+
+      size = send_recv(slu, buf, 16, buf, sizeof(sl->q_buf));
+      if (size == -1)
+      {
+       printf("[!] send_recv\n");
+       return ;
+      }
+
+      break ;
+    }
+#endif /* CONFIG_USE_LIBUSB */
+
+  default: break ;
+  }
 }
 
 void stlink_exit_debug_mode(struct stlink *sl)
 {
+  switch (sl->tt)
+  {
+#if CONFIG_USE_LIBUSB
+  case TRANSPORT_TYPE_LIBUSB:
+    {
+      struct stlink_libusb* const slu = &sl->transport.libusb;
+      unsigned char* const buf = sl->q_buf;
+      ssize_t size;
+
+      memset(buf, 0, sizeof(sl->q_buf));
+      buf[0] = STLINK_DEBUG_COMMAND;
+      buf[1] = STLINK_DEBUG_EXIT;
+
+      size = send_only(slu, buf, 16);
+      if (size == -1)
+      {
+       printf("[!] send_only\n");
+       return ;
+      }
+
+      break ;
+    }
+#endif /* CONFIG_USE_LIBUSB */
+
+  default: break ;
+  }
 }
 
 
@@ -715,8 +809,11 @@ int main(int ac, char** av)
     printf("-- version\n");
     stlink_version(sl);
 
-    printf("-- exit_dfu_mode\n");
-    stlink_exit_dfu_mode(sl);
+    if (stlink_current_mode(sl) == STLINK_DEV_DFU_MODE)
+    {
+      printf("-- exit_dfu_mode\n");
+      stlink_exit_dfu_mode(sl);
+    }
 
     printf("-- enter_swd_mode\n");
     stlink_enter_swd_mode(sl);
@@ -736,6 +833,16 @@ int main(int ac, char** av)
     printf("-- status\n");
     stlink_status(sl);
 
+    printf("-- step\n");
+    stlink_step(sl);
+    getchar();
+
+    printf("-- run\n");
+    stlink_run(sl);
+
+    printf("-- exit_debug_mode\n");
+    stlink_exit_debug_mode(sl);
+
     stlink_close(sl);
   }
   stlink_finalize(TRANSPORT_TYPE_LIBUSB);