From a6f42631bd12df1d6d91a1470b91363183c71f96 Mon Sep 17 00:00:00 2001 From: Fabien Le Mentec Date: Sun, 11 Sep 2011 09:22:17 -0500 Subject: [PATCH 1/1] [fix, update] magic bytes, more commands. step mode make resets the chip --- stm32l/doc/read_memory.csv | 9 +++ stm32l/src/main.c | 137 +++++++++++++++++++++++++++++++++---- 2 files changed, 131 insertions(+), 15 deletions(-) diff --git a/stm32l/doc/read_memory.csv b/stm32l/doc/read_memory.csv index 0d26683..25f9f48 100644 --- a/stm32l/doc/read_memory.csv +++ b/stm32l/doc/read_memory.csv @@ -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,,,,,,,,,,,, Create,0002,15:12:32.934,174.174733 s,,Create,stvp.exe,,,,FFFFFA80074F4960h,,WinUsb,FFFFFA8006FD8320h, Create,0003-0002,15:12:32.935,174.174759 s,26 us,Create,stvp.exe,,,,FFFFFA80074F4960h,,WinUsb,FFFFFA8006FD8320h,Success + + 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 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) 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, 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 + + 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 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) 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, 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 + + 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 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) + 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 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) 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, 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 + 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 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) 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, 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 + 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 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) 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, diff --git a/stm32l/src/main.c b/stm32l/src/main.c index dfeeb2b..6dbe0e7 100644 --- a/stm32l/src/main.c +++ b/stm32l/src/main.c @@ -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); -- 2.30.2