Merge pull request #347 from jauler/master
[fw/stlink] / src / stlink-usb.c
index 8e910bcf289b20432512116df2731e50e85a8d0e..d8b6c4673318a889147e6c8d76fcdac5de701f98 100644 (file)
@@ -5,28 +5,23 @@
 #include <sys/time.h>
 #include <sys/types.h>
 #include <libusb.h>
+#include <errno.h>
 
 #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;
 }