jtag_libusb_bulk_read|write: return error code instead of size
[fw/openocd] / src / jtag / drivers / ulink.c
index d93150d641e1d24fef071d77f2eaa1c933de0aef..77fbe61933b6d9dd21c20bcb36cbbc6165b93c53 100644 (file)
@@ -13,9 +13,7 @@
  *   GNU General Public License for more details.                          *
  *                                                                         *
  *   You should have received a copy of the GNU General Public License     *
- *   along with this program; if not, write to the                         *
- *   Free Software Foundation, Inc.,                                       *
- *   51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.           *
+ *   along with this program.  If not, see <http://www.gnu.org/licenses/>. *
  ***************************************************************************/
 
 #ifdef HAVE_CONFIG_H
@@ -26,7 +24,7 @@
 #include <jtag/interface.h>
 #include <jtag/commands.h>
 #include <target/image.h>
-#include <libusb-1.0/libusb.h>
+#include <libusb.h>
 #include "OpenULINK/include/msgtypes.h"
 
 /** USB Vendor ID of ULINK device in unconfigured state (no firmware loaded
@@ -189,11 +187,7 @@ void ulink_clear_queue(struct ulink *device);
 int ulink_append_queue(struct ulink *device, struct ulink_cmd *ulink_cmd);
 int ulink_execute_queued_commands(struct ulink *device, int timeout);
 
-#ifdef _DEBUG_JTAG_IO_
-const char *ulink_cmd_id_string(uint8_t id);
-void ulink_print_command(struct ulink_cmd *ulink_cmd);
-void ulink_print_queue(struct ulink *device);
-#endif
+static void ulink_print_queue(struct ulink *device);
 
 int ulink_append_scan_cmd(struct ulink *device,
                enum scan_type scan_type,
@@ -225,7 +219,6 @@ int ulink_append_test_cmd(struct ulink *device);
 
 /* OpenULINK TCK frequency helper functions */
 int ulink_calculate_delay(enum ulink_delay_type type, long f, int *delay);
-int ulink_calculate_frequency(enum ulink_delay_type type, int delay, long *f);
 
 /* Interface between OpenULINK and OpenOCD */
 static void ulink_set_end_state(tap_state_t endstate);
@@ -242,7 +235,7 @@ int ulink_queue_stableclocks(struct ulink *device, struct jtag_command *cmd);
 int ulink_post_process_scan(struct ulink_cmd *ulink_cmd);
 int ulink_post_process_queue(struct ulink *device);
 
-/* JTAG driver functions (registered in struct jtag_interface) */
+/* adapter driver functions */
 static int ulink_execute_queue(void);
 static int ulink_khz(int khz, int *jtag_speed);
 static int ulink_speed(int speed);
@@ -461,9 +454,6 @@ int ulink_write_firmware_section(struct ulink *device,
        LOG_DEBUG("section %02i at addr 0x%04x (size 0x%04x)", section_index, addr,
                size);
 
-       if (data == NULL)
-               return ERROR_FAIL;
-
        /* Copy section contents to local buffer */
        ret = image_read_section(firmware_image, section_index, 0, size, data,
                        &size_read);
@@ -713,9 +703,8 @@ int ulink_execute_queued_commands(struct ulink *device, int timeout)
        int ret, i, index_out, index_in, count_out, count_in, transferred;
        uint8_t buffer[64];
 
-#ifdef _DEBUG_JTAG_IO_
-       ulink_print_queue(device);
-#endif
+       if (LOG_LEVEL_IS(LOG_LVL_DEBUG_IO))
+               ulink_print_queue(device);
 
        index_out = 0;
        count_out = 0;
@@ -764,71 +753,69 @@ int ulink_execute_queued_commands(struct ulink *device, int timeout)
        return ERROR_OK;
 }
 
-#ifdef _DEBUG_JTAG_IO_
-
 /**
  * Convert an OpenULINK command ID (\a id) to a human-readable string.
  *
  * @param id the OpenULINK command ID.
  * @return the corresponding human-readable string.
  */
-const char *ulink_cmd_id_string(uint8_t id)
+static const char *ulink_cmd_id_string(uint8_t id)
 {
        switch (id) {
-           case CMD_SCAN_IN:
-                   return "CMD_SCAN_IN";
-                   break;
-           case CMD_SLOW_SCAN_IN:
-                   return "CMD_SLOW_SCAN_IN";
-                   break;
-           case CMD_SCAN_OUT:
-                   return "CMD_SCAN_OUT";
-                   break;
-           case CMD_SLOW_SCAN_OUT:
-                   return "CMD_SLOW_SCAN_OUT";
-                   break;
-           case CMD_SCAN_IO:
-                   return "CMD_SCAN_IO";
-                   break;
-           case CMD_SLOW_SCAN_IO:
-                   return "CMD_SLOW_SCAN_IO";
-                   break;
-           case CMD_CLOCK_TMS:
-                   return "CMD_CLOCK_TMS";
-                   break;
-           case CMD_SLOW_CLOCK_TMS:
-                   return "CMD_SLOW_CLOCK_TMS";
-                   break;
-           case CMD_CLOCK_TCK:
-                   return "CMD_CLOCK_TCK";
-                   break;
-           case CMD_SLOW_CLOCK_TCK:
-                   return "CMD_SLOW_CLOCK_TCK";
-                   break;
-           case CMD_SLEEP_US:
-                   return "CMD_SLEEP_US";
-                   break;
-           case CMD_SLEEP_MS:
-                   return "CMD_SLEEP_MS";
-                   break;
-           case CMD_GET_SIGNALS:
-                   return "CMD_GET_SIGNALS";
-                   break;
-           case CMD_SET_SIGNALS:
-                   return "CMD_SET_SIGNALS";
-                   break;
-           case CMD_CONFIGURE_TCK_FREQ:
-                   return "CMD_CONFIGURE_TCK_FREQ";
-                   break;
-           case CMD_SET_LEDS:
-                   return "CMD_SET_LEDS";
-                   break;
-           case CMD_TEST:
-                   return "CMD_TEST";
-                   break;
-           default:
-                   return "CMD_UNKNOWN";
-                   break;
+       case CMD_SCAN_IN:
+               return "CMD_SCAN_IN";
+               break;
+       case CMD_SLOW_SCAN_IN:
+               return "CMD_SLOW_SCAN_IN";
+               break;
+       case CMD_SCAN_OUT:
+               return "CMD_SCAN_OUT";
+               break;
+       case CMD_SLOW_SCAN_OUT:
+               return "CMD_SLOW_SCAN_OUT";
+               break;
+       case CMD_SCAN_IO:
+               return "CMD_SCAN_IO";
+               break;
+       case CMD_SLOW_SCAN_IO:
+               return "CMD_SLOW_SCAN_IO";
+               break;
+       case CMD_CLOCK_TMS:
+               return "CMD_CLOCK_TMS";
+               break;
+       case CMD_SLOW_CLOCK_TMS:
+               return "CMD_SLOW_CLOCK_TMS";
+               break;
+       case CMD_CLOCK_TCK:
+               return "CMD_CLOCK_TCK";
+               break;
+       case CMD_SLOW_CLOCK_TCK:
+               return "CMD_SLOW_CLOCK_TCK";
+               break;
+       case CMD_SLEEP_US:
+               return "CMD_SLEEP_US";
+               break;
+       case CMD_SLEEP_MS:
+               return "CMD_SLEEP_MS";
+               break;
+       case CMD_GET_SIGNALS:
+               return "CMD_GET_SIGNALS";
+               break;
+       case CMD_SET_SIGNALS:
+               return "CMD_SET_SIGNALS";
+               break;
+       case CMD_CONFIGURE_TCK_FREQ:
+               return "CMD_CONFIGURE_TCK_FREQ";
+               break;
+       case CMD_SET_LEDS:
+               return "CMD_SET_LEDS";
+               break;
+       case CMD_TEST:
+               return "CMD_TEST";
+               break;
+       default:
+               return "CMD_UNKNOWN";
+               break;
        }
 }
 
@@ -837,7 +824,7 @@ const char *ulink_cmd_id_string(uint8_t id)
  *
  * @param ulink_cmd pointer to OpenULINK command.
  */
-void ulink_print_command(struct ulink_cmd *ulink_cmd)
+static void ulink_print_command(struct ulink_cmd *ulink_cmd)
 {
        int i;
 
@@ -855,7 +842,7 @@ void ulink_print_command(struct ulink_cmd *ulink_cmd)
  *
  * @param device pointer to struct ulink identifying ULINK driver instance.
  */
-void ulink_print_queue(struct ulink *device)
+static void ulink_print_queue(struct ulink *device)
 {
        struct ulink_cmd *current;
 
@@ -865,8 +852,6 @@ void ulink_print_queue(struct ulink *device)
                ulink_print_command(current);
 }
 
-#endif /* _DEBUG_JTAG_IO_ */
-
 /**
  * Perform JTAG scan
  *
@@ -1382,16 +1367,14 @@ int ulink_calculate_delay(enum ulink_delay_type type, long f, int *delay)
  *
  * @param type for which command to calculate the delay value.
  * @param delay delay value for which to calculate the resulting TCK frequency.
- * @param f where to store the resulting TCK frequency.
- * @return on success: ERROR_OK
- * @return on failure: ERROR_FAIL
+ * @return the resulting TCK frequency
  */
-int ulink_calculate_frequency(enum ulink_delay_type type, int delay, long *f)
+static long ulink_calculate_frequency(enum ulink_delay_type type, int delay)
 {
-       float t, f_float, f_rounded;
+       float t, f_float;
 
        if (delay > 255)
-               return ERROR_FAIL;
+               return 0;
 
        switch (type) {
            case DELAY_CLOCK_TCK:
@@ -1425,15 +1408,11 @@ int ulink_calculate_frequency(enum ulink_delay_type type, int delay, long *f)
                            t = (float)(4E-6) * (float)(delay) + (float)(1.3132E-5);
                    break;
            default:
-                   return ERROR_FAIL;
-                   break;
+                   return 0;
        }
 
        f_float = 1.0 / t;
-       f_rounded = roundf(f_float);
-       *f = (long)f_rounded;
-
-       return ERROR_OK;
+       return roundf(f_float);
 }
 
 /******************* Interface between OpenULINK and OpenOCD ******************/
@@ -2068,31 +2047,21 @@ static int ulink_khz(int khz, int *jtag_speed)
                        return ret;
        }
 
-#ifdef _DEBUG_JTAG_IO_
-       long f_tck, f_tms, f_scan_in, f_scan_out, f_scan_io;
-
-       ulink_calculate_frequency(DELAY_CLOCK_TCK, ulink_handle->delay_clock_tck,
-               &f_tck);
-       ulink_calculate_frequency(DELAY_CLOCK_TMS, ulink_handle->delay_clock_tms,
-               &f_tms);
-       ulink_calculate_frequency(DELAY_SCAN_IN, ulink_handle->delay_scan_in,
-               &f_scan_in);
-       ulink_calculate_frequency(DELAY_SCAN_OUT, ulink_handle->delay_scan_out,
-               &f_scan_out);
-       ulink_calculate_frequency(DELAY_SCAN_IO, ulink_handle->delay_scan_io,
-               &f_scan_io);
-
-       DEBUG_JTAG_IO("ULINK TCK setup: delay_tck      = %i (%li Hz),",
-               ulink_handle->delay_clock_tck, f_tck);
-       DEBUG_JTAG_IO("                 delay_tms      = %i (%li Hz),",
-               ulink_handle->delay_clock_tms, f_tms);
-       DEBUG_JTAG_IO("                 delay_scan_in  = %i (%li Hz),",
-               ulink_handle->delay_scan_in, f_scan_in);
-       DEBUG_JTAG_IO("                 delay_scan_out = %i (%li Hz),",
-               ulink_handle->delay_scan_out, f_scan_out);
-       DEBUG_JTAG_IO("                 delay_scan_io  = %i (%li Hz),",
-               ulink_handle->delay_scan_io, f_scan_io);
-#endif
+       LOG_DEBUG_IO("ULINK TCK setup: delay_tck      = %i (%li Hz),",
+               ulink_handle->delay_clock_tck,
+               ulink_calculate_frequency(DELAY_CLOCK_TCK, ulink_handle->delay_clock_tck));
+       LOG_DEBUG_IO("                 delay_tms      = %i (%li Hz),",
+               ulink_handle->delay_clock_tms,
+               ulink_calculate_frequency(DELAY_CLOCK_TMS, ulink_handle->delay_clock_tms));
+       LOG_DEBUG_IO("                 delay_scan_in  = %i (%li Hz),",
+               ulink_handle->delay_scan_in,
+               ulink_calculate_frequency(DELAY_SCAN_IN, ulink_handle->delay_scan_in));
+       LOG_DEBUG_IO("                 delay_scan_out = %i (%li Hz),",
+               ulink_handle->delay_scan_out,
+               ulink_calculate_frequency(DELAY_SCAN_OUT, ulink_handle->delay_scan_out));
+       LOG_DEBUG_IO("                 delay_scan_io  = %i (%li Hz),",
+               ulink_handle->delay_scan_io,
+               ulink_calculate_frequency(DELAY_SCAN_IO, ulink_handle->delay_scan_io));
 
        /* Configure the ULINK device with the new delay values */
        ret = ulink_append_configure_tck_cmd(ulink_handle,
@@ -2303,17 +2272,20 @@ static const struct command_registration ulink_command_handlers[] = {
        COMMAND_REGISTRATION_DONE,
 };
 
-struct jtag_interface ulink_interface = {
-       .name = "ulink",
+static struct jtag_interface ulink_interface = {
+       .execute_queue = ulink_execute_queue,
+};
 
-       .commands = ulink_command_handlers,
+struct adapter_driver ulink_adapter_driver = {
+       .name = "ulink",
        .transports = jtag_only,
+       .commands = ulink_command_handlers,
 
-       .execute_queue = ulink_execute_queue,
-       .khz = ulink_khz,
+       .init = ulink_init,
+       .quit = ulink_quit,
        .speed = ulink_speed,
+       .khz = ulink_khz,
        .speed_div = ulink_speed_div,
 
-       .init = ulink_init,
-       .quit = ulink_quit
+       .jtag_ops = &ulink_interface,
 };