X-Git-Url: https://git.gag.com/?a=blobdiff_plain;f=src%2Fstlink-usb.c;h=d8b6c4673318a889147e6c8d76fcdac5de701f98;hb=972ed48924fc1f118939b013e0b15f0faed1f26a;hp=8e910bcf289b20432512116df2731e50e85a8d0e;hpb=41ebd21d7a73b24f986643ad4f9d36278cc40c45;p=fw%2Fstlink diff --git a/src/stlink-usb.c b/src/stlink-usb.c index 8e910bc..d8b6c46 100644 --- a/src/stlink-usb.c +++ b/src/stlink-usb.c @@ -5,28 +5,23 @@ #include #include #include +#include #include "stlink-common.h" #include "stlink-usb.h" #include "uglylogging.h" -#define LOG_TAG __FILE__ -#define DLOG(format, args...) ugly_log(UDEBUG, LOG_TAG, format, ## args) -#define ILOG(format, args...) ugly_log(UINFO, LOG_TAG, format, ## args) -#define WLOG(format, args...) ugly_log(UWARN, LOG_TAG, format, ## args) -#define fatal(format, args...) ugly_log(UFATAL, LOG_TAG, format, ## args) - -/* code from bsd timersub.h +/* code from bsd timersub.h http://www.gnu-darwin.org/www001/src/ports/net/libevnet/work/libevnet-0.3.8/libnostd/bsd/sys/time/timersub.h.html */ #if !defined timersub #define timersub(a, b, r) do { \ - (r)->tv_sec = (a)->tv_sec - (b)->tv_sec; \ - (r)->tv_usec = (a)->tv_usec - (b)->tv_usec; \ - if ((r)->tv_usec < 0) { \ - --(r)->tv_sec; \ - (r)->tv_usec += 1000000; \ - } \ + (r)->tv_sec = (a)->tv_sec - (b)->tv_sec; \ + (r)->tv_usec = (a)->tv_usec - (b)->tv_usec; \ + if ((r)->tv_usec < 0) { \ + --(r)->tv_sec; \ + (r)->tv_usec += 1000000; \ + } \ } while (0) #endif @@ -135,14 +130,14 @@ ssize_t send_recv(struct stlink_libusb* handle, int terminate, if (rxsize != 0) { /* read the response */ - + libusb_fill_bulk_transfer(handle->rep_trans, handle->usb_handle, - handle->ep_rep, rxbuf, rxsize, NULL, NULL, 0); - + handle->ep_rep, rxbuf, rxsize, NULL, NULL, 0); + if (submit_wait(handle, handle->rep_trans)) return -1; res = handle->rep_trans->actual_length; } - + if ((handle->protocoll == 1) && terminate) { /* Read the SG reply */ unsigned char sg_buf[13]; @@ -237,7 +232,7 @@ uint32_t _stlink_usb_read_debug32(stlink_t *sl, uint32_t addr) { unsigned char* const cmd = sl->c_buf; ssize_t size; const int rep_len = 8; - + int i = fill_command(sl, SG_DXFER_FROM_DEV, rep_len); cmd[i++] = STLINK_DEBUG_COMMAND; cmd[i++] = STLINK_JTAG_READDEBUG_32BIT; @@ -256,7 +251,7 @@ void _stlink_usb_write_debug32(stlink_t *sl, uint32_t addr, uint32_t data) { unsigned char* const cmd = sl->c_buf; ssize_t size; const int rep_len = 2; - + int i = fill_command(sl, SG_DXFER_FROM_DEV, rep_len); cmd[i++] = STLINK_DEBUG_COMMAND; cmd[i++] = STLINK_JTAG_WRITEDEBUG_32BIT; @@ -306,7 +301,7 @@ int _stlink_usb_current_mode(stlink_t * sl) { ssize_t size; int rep_len = 2; int i = fill_command(sl, SG_DXFER_FROM_DEV, rep_len); - + cmd[i++] = STLINK_GET_CURRENT_MODE; size = send_recv(slu, 1, cmd, slu->cmd_len, data, rep_len); if (size == -1) { @@ -438,7 +433,7 @@ void _stlink_usb_jtag_reset(stlink_t * sl, int value) { cmd[i++] = STLINK_DEBUG_COMMAND; cmd[i++] = STLINK_JTAG_DRIVE_NRST; - cmd[i++] = (value)?0:1; + cmd[i++] = value; size = send_recv(slu, 1, cmd, slu->cmd_len, data, rep_len); if (size == -1) { @@ -582,7 +577,7 @@ void _stlink_usb_read_reg(stlink_t *sl, int r_idx, reg *regp) { stlink_print_data(sl); r = read_uint32(sl->q_buf, 0); DLOG("r_idx (%2d) = 0x%08x\n", r_idx, r); - + switch (r_idx) { case 16: regp->xpsr = r; @@ -620,18 +615,18 @@ void _stlink_usb_read_unsupported_reg(stlink_t *sl, int r_idx, reg *regp) { DLOG("r_idx (%2d) = 0x%08x\n", r_idx, r); switch (r_idx) { - case 0x14: - regp->primask = (uint8_t) (r & 0xFF); - regp->basepri = (uint8_t) ((r>>8) & 0xFF); - regp->faultmask = (uint8_t) ((r>>16) & 0xFF); - regp->control = (uint8_t) ((r>>24) & 0xFF); - break; - case 0x21: - regp->fpscr = r; - break; - default: - regp->s[r_idx - 0x40] = r; - break; + case 0x14: + regp->primask = (uint8_t) (r & 0xFF); + regp->basepri = (uint8_t) ((r>>8) & 0xFF); + regp->faultmask = (uint8_t) ((r>>16) & 0xFF); + regp->control = (uint8_t) ((r>>24) & 0xFF); + break; + case 0x21: + regp->fpscr = r; + break; + default: + regp->s[r_idx - 0x40] = r; + break; } } @@ -653,18 +648,18 @@ void _stlink_usb_write_unsupported_reg(stlink_t *sl, uint32_t val, int r_idx, re val = (uint8_t) (val>>24); switch (r_idx) { - case 0x1C: /* control */ - val = (((uint32_t) val) << 24) | (((uint32_t) regp->faultmask) << 16) | (((uint32_t) regp->basepri) << 8) | ((uint32_t) regp->primask); - break; - case 0x1D: /* faultmask */ - val = (((uint32_t) regp->control) << 24) | (((uint32_t) val) << 16) | (((uint32_t) regp->basepri) << 8) | ((uint32_t) regp->primask); - break; - case 0x1E: /* basepri */ - val = (((uint32_t) regp->control) << 24) | (((uint32_t) regp->faultmask) << 16) | (((uint32_t) val) << 8) | ((uint32_t) regp->primask); - break; - case 0x1F: /* primask */ - val = (((uint32_t) regp->control) << 24) | (((uint32_t) regp->faultmask) << 16) | (((uint32_t) regp->basepri) << 8) | ((uint32_t) val); - break; + case 0x1C: /* control */ + val = (((uint32_t) val) << 24) | (((uint32_t) regp->faultmask) << 16) | (((uint32_t) regp->basepri) << 8) | ((uint32_t) regp->primask); + break; + case 0x1D: /* faultmask */ + val = (((uint32_t) regp->control) << 24) | (((uint32_t) val) << 16) | (((uint32_t) regp->basepri) << 8) | ((uint32_t) regp->primask); + break; + case 0x1E: /* basepri */ + val = (((uint32_t) regp->control) << 24) | (((uint32_t) regp->faultmask) << 16) | (((uint32_t) val) << 8) | ((uint32_t) regp->primask); + break; + case 0x1F: /* primask */ + val = (((uint32_t) regp->control) << 24) | (((uint32_t) regp->faultmask) << 16) | (((uint32_t) regp->basepri) << 8) | ((uint32_t) val); + break; } r_idx = 0x14; @@ -750,20 +745,20 @@ stlink_t* stlink_open_usb(const int verbose, int reset) { ugly_init(verbose); sl->backend = &_stlink_usb_backend; sl->backend_data = slu; - + sl->core_stat = STLINK_CORE_STAT_UNKNOWN; if (libusb_init(&(slu->libusb_ctx))) { WLOG("failed to init libusb context, wrong version of libraries?\n"); goto on_error; } - + libusb_device **list; int cnt = libusb_get_device_list(slu->libusb_ctx, &list); struct libusb_device_descriptor desc; int devBus =0; int devAddr=0; - + char *device = getenv("STLINK_DEVICE"); if (device) { char *c = strchr(device,':'); @@ -776,8 +771,7 @@ stlink_t* stlink_open_usb(const int verbose, int reset) { devAddr=atoi(c); ILOG("bus %03d dev %03d\n",devBus, devAddr); } - while (cnt){ - cnt--; + while (cnt--){ libusb_get_device_descriptor( list[cnt], &desc ); if (desc.idVendor!=USB_ST_VID) continue; if (devBus && devAddr) @@ -788,24 +782,25 @@ stlink_t* stlink_open_usb(const int verbose, int reset) { break; } } - + if (cnt < 0) { WLOG ("Couldn't find %s ST-Link/V2 devices\n",(devBus && devAddr)?"matched":"any"); goto on_error; } else { int error = libusb_open(list[cnt], &slu->usb_handle); if( error !=0 ) { - WLOG("Error %d opening ST-Link/V2 device %03d:%03d\n", error, libusb_get_bus_number(list[cnt]), libusb_get_device_address(list[cnt])); + WLOG("Error %d (%s) opening ST-Link/V2 device %03d:%03d\n", + error, strerror (errno), libusb_get_bus_number(list[cnt]), libusb_get_device_address(list[cnt])); goto on_error; } } - + libusb_free_device_list(list, 1); - + if (libusb_kernel_driver_active(slu->usb_handle, 0) == 1) { int r; - + r = libusb_detach_kernel_driver(slu->usb_handle, 0); if (r<0) { WLOG("libusb_detach_kernel_driver(() error %s\n", strerror(-r)); @@ -848,9 +843,9 @@ stlink_t* stlink_open_usb(const int verbose, int reset) { // TODO - could use the scanning techniq from stm8 code here... slu->ep_rep = 1 /* ep rep */ | LIBUSB_ENDPOINT_IN; if (desc.idProduct == USB_STLINK_NUCLEO_PID) { - slu->ep_req = 1 /* ep req */ | LIBUSB_ENDPOINT_OUT; + slu->ep_req = 1 /* ep req */ | LIBUSB_ENDPOINT_OUT; } else { - slu->ep_req = 2 /* ep req */ | LIBUSB_ENDPOINT_OUT; + slu->ep_req = 2 /* ep req */ | LIBUSB_ENDPOINT_OUT; } slu->sg_transfer_idx = 0; @@ -860,21 +855,19 @@ stlink_t* stlink_open_usb(const int verbose, int reset) { /* success */ if (stlink_current_mode(sl) == STLINK_DEV_DFU_MODE) { - ILOG("-- exit_dfu_mode\n"); - stlink_exit_dfu_mode(sl); + ILOG("-- exit_dfu_mode\n"); + stlink_exit_dfu_mode(sl); } if (stlink_current_mode(sl) != STLINK_DEV_DEBUG_MODE) { - stlink_enter_swd_mode(sl); + stlink_enter_swd_mode(sl); } if (reset) { stlink_reset(sl); } - stlink_load_device_params(sl); stlink_version(sl); - - error = 0; + error = stlink_load_device_params(sl); on_libusb_error: if (devs != NULL) { @@ -891,9 +884,9 @@ on_libusb_error: on_error: if( slu->libusb_ctx) - libusb_exit(slu->libusb_ctx); + libusb_exit(slu->libusb_ctx); if (sl != NULL) free(sl); if (slu != NULL) free(slu); - return 0; + return NULL; }