-#include <assert.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
struct stlink_libusb * const slu = sl->backend_data;
unsigned char* const cmd = sl->c_buf;
int i = 0;
- memset(cmd, 0, sizeof (sl->q_buf));
+ memset(cmd, 0, sizeof (sl->c_buf));
if(slu->protocoll == 1) {
cmd[i++] = 'U';
cmd[i++] = 'S';
cmd[i++] = 'B';
cmd[i++] = 'C';
write_uint32(&cmd[i], slu->sg_transfer_idx);
- i+= 4;
- write_uint32(&cmd[i], len);
- i+= 4;
+ write_uint32(&cmd[i + 4], len);
+ i += 8;
cmd[i++] = (dir == SG_DXFER_FROM_DEV)?0x80:0;
cmd[i++] = 0; /* Logical unit */
cmd[i++] = 0xa; /* Command length */
int i = fill_command(sl, SG_DXFER_FROM_DEV, rep_len);
cmd[i++] = STLINK_GET_VERSION;
- cmd[i++] = 0x80;
- size = send_recv(slu, 1, cmd, slu->cmd_len, data, 6);
+ size = send_recv(slu, 1, cmd, slu->cmd_len, data, rep_len);
if (size == -1) {
printf("[!] send_recv\n");
return;
unsigned char* const data = sl->q_buf;
unsigned char* const cmd = sl->c_buf;
- int i = fill_command(sl, SG_DXFER_TO_DEV, 0);
+ int i = fill_command(sl, SG_DXFER_TO_DEV, len);
cmd[i++] = STLINK_DEBUG_COMMAND;
cmd[i++] = STLINK_DEBUG_WRITEMEM_32BIT;
write_uint32(&cmd[i], addr);
- i += 4;
- write_uint16(&cmd[i], len);
+ write_uint16(&cmd[i + 4], len);
send_only(slu, 0, cmd, slu->cmd_len);
-#if Q_BUF_LEN < UINT16_MAX
- assert(len < sizeof(sl->q_buf)); // makes a compiler warning? always true?
-#endif
- assert((len & 3) == 0);
send_only(slu, 1, data, len);
}
cmd[i++] = STLINK_DEBUG_COMMAND;
cmd[i++] = STLINK_DEBUG_WRITEMEM_8BIT;
write_uint32(&cmd[i], addr);
- i += 4;
- write_uint16(&cmd[i], len);
+ write_uint16(&cmd[i + 4], len);
send_only(slu, 0, cmd, slu->cmd_len);
-
-#if Q_BUF_LEN < UINT16_MAX
- assert(len < sizeof(sl->q_buf)); // makes a compiler warning? always true?
-#endif
send_only(slu, 1, data, len);
}
struct stlink_libusb * const slu = sl->backend_data;
unsigned char* const cmd = sl->c_buf;
ssize_t size;
- int i = fill_command(sl, SG_DXFER_FROM_DEV, 0);
+ const int rep_len = 0;
+ int i = fill_command(sl, SG_DXFER_FROM_DEV, rep_len);
cmd[i++] = STLINK_DEBUG_COMMAND;
cmd[i++] = STLINK_DEBUG_ENTER;
struct stlink_libusb * const slu = sl->backend_data;
unsigned char* const cmd = sl->c_buf;
ssize_t size;
- int i = fill_command(sl, SG_DXFER_TO_DEV, 0);
+ int i = fill_command(sl, SG_DXFER_FROM_DEV, 0);
cmd[i++] = STLINK_DEBUG_COMMAND;
cmd[i++] = STLINK_DEBUG_EXIT;
ssize_t size;
int i = fill_command(sl, SG_DXFER_FROM_DEV, len);
-#if Q_BUF_LEN < UINT16_MAX
- assert(len < sizeof(sl->q_buf));
-#endif
-
cmd[i++] = STLINK_DEBUG_COMMAND;
cmd[i++] = STLINK_DEBUG_READMEM_32BIT;
write_uint32(&cmd[i], addr);
- i += 4;
- /* windows usb logs show only one byte is used for length ... */
- // Presumably, this is because usb transfers can't be 16 bits worth of bytes long...
- assert (len < 256);
- cmd[i] = (uint8_t) len;
+ write_uint16(&cmd[i + 4], len);
size = send_recv(slu, 1, cmd, slu->cmd_len, data, len);
if (size == -1) {
sl->core_stat = STLINK_CORE_STAT_UNKNOWN;
- /* flash memory settings */
- sl->flash_base = STM32_FLASH_BASE;
- sl->flash_size = STM32_FLASH_SIZE;
- sl->flash_pgsz = STM32_FLASH_PGSZ;
-
- /* system memory */
- sl->sys_base = STM32_SYSTEM_BASE;
- sl->sys_size = STM32_SYSTEM_SIZE;
-
- /* sram memory settings */
- sl->sram_base = STM32_SRAM_BASE;
- sl->sram_size = STM32L_SRAM_SIZE;
-
if (libusb_init(&(slu->libusb_ctx))) {
fprintf(stderr, "failed to init libusb context, wrong version of libraries?\n");
goto on_error;
goto on_libusb_error;
}
- libusb_reset_device(slu->usb_handle);
-
if (libusb_get_configuration(slu->usb_handle, &config)) {
/* this may fail for a previous configured device */
printf("libusb_get_configuration()\n");
slu->ep_rep = 1 /* ep rep */ | LIBUSB_ENDPOINT_IN;
slu->ep_req = 2 /* ep req */ | LIBUSB_ENDPOINT_OUT;
- /* libusb_reset_device(slu->usb_handle); */
slu->sg_transfer_idx = 0;
slu->cmd_len = (slu->protocoll == 1)? STLINK_SG_SIZE: STLINK_CMD_SIZE;
/* success */
+
if (stlink_current_mode(sl) == STLINK_DEV_DFU_MODE) {
- printf("-- exit_dfu_mode\n");
stlink_exit_dfu_mode(sl);
}
+
+ if (stlink_current_mode(sl) != STLINK_DEV_DEBUG_MODE) {
+ stlink_enter_swd_mode(sl);
+ }
+
stlink_version(sl);
+
+ /* per device family initialization */
+ stlink_identify_device(sl);
+
+ if (sl->chip_id == STM32F4_CHIP_ID) {
+
+ /* flash memory settings */
+ sl->flash_base = STM32_FLASH_BASE;
+ sl->flash_size = STM32F4_FLASH_SIZE;
+ sl->flash_pgsz = STM32F4_FLASH_PGSZ; //Dummy, pages size is variable in this config
+
+ /* system memory */
+ sl->sys_base = STM32_SYSTEM_BASE;
+ sl->sys_size = STM32_SYSTEM_SIZE;
+
+ /* sram memory settings */
+ sl->sram_base = STM32_SRAM_BASE;
+ sl->sram_size = STM32_SRAM_SIZE;
+
+ }
+
+ else if (sl->core_id == STM32L_CORE_ID) {
+
+ /* flash memory settings */
+ sl->flash_base = STM32_FLASH_BASE;
+ sl->flash_size = STM32_FLASH_SIZE;
+ sl->flash_pgsz = STM32L_FLASH_PGSZ;
+
+ /* system memory */
+ sl->sys_base = STM32_SYSTEM_BASE;
+ sl->sys_size = STM32_SYSTEM_SIZE;
+
+ /* sram memory settings */
+ sl->sram_base = STM32_SRAM_BASE;
+ sl->sram_size = STM32L_SRAM_SIZE;
+
+ }
+ else if (sl->core_id == STM32VL_CORE_ID) {
+
+ /* flash memory settings */
+ sl->flash_base = STM32_FLASH_BASE;
+ sl->flash_size = STM32_FLASH_SIZE;
+ sl->flash_pgsz = STM32_FLASH_PGSZ;
+
+ /* system memory */
+ sl->sys_base = STM32_SYSTEM_BASE;
+ sl->sys_size = STM32_SYSTEM_SIZE;
+
+ /* sram memory settings */
+ sl->sram_base = STM32_SRAM_BASE;
+ sl->sram_size = STM32_SRAM_SIZE;
+
+ }
+ else {
+ fprintf(stderr, "unknown coreid: %x\n", sl->core_id);
+ goto on_libusb_error;
+ }
+
error = 0;
on_libusb_error: