adapter: switch from struct jtag_interface to adapter_driver
[openocd.git] / src / jtag / drivers / ulink.c
index 9a7d8c8e9b8d117b9bc70ceed3c05956d23ea7cc..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
@@ -169,9 +167,9 @@ int ulink_usb_close(struct ulink **device);
 
 /* ULINK MCU (Cypress EZ-USB) specific functions */
 int ulink_cpu_reset(struct ulink *device, unsigned char reset_bit);
-int ulink_load_firmware_and_renumerate(struct ulink **device, char *filename,
+int ulink_load_firmware_and_renumerate(struct ulink **device, const char *filename,
                uint32_t delay);
-int ulink_load_firmware(struct ulink *device, char *filename);
+int ulink_load_firmware(struct ulink *device, const char *filename);
 int ulink_write_firmware_section(struct ulink *device,
                struct image *firmware_image, int section_index);
 
@@ -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);
@@ -362,7 +355,7 @@ int ulink_cpu_reset(struct ulink *device, unsigned char reset_bit)
  * @return on failure: ERROR_FAIL
  */
 int ulink_load_firmware_and_renumerate(struct ulink **device,
-       char *filename, uint32_t delay)
+       const char *filename, uint32_t delay)
 {
        int ret;
 
@@ -397,7 +390,7 @@ int ulink_load_firmware_and_renumerate(struct ulink **device,
  * @return on success: ERROR_OK
  * @return on failure: ERROR_FAIL
  */
-int ulink_load_firmware(struct ulink *device, char *filename)
+int ulink_load_firmware(struct ulink *device, const char *filename)
 {
        struct image ulink_firmware_image;
        int ret, i;
@@ -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,
@@ -2284,7 +2253,7 @@ COMMAND_HANDLER(ulink_download_firmware_handler)
        LOG_INFO("Downloading ULINK firmware image %s", CMD_ARGV[0]);
 
        /* Download firmware image in CMD_ARGV[0] */
-       ret = ulink_load_firmware_and_renumerate(&ulink_handle, (char *)CMD_ARGV[0],
+       ret = ulink_load_firmware_and_renumerate(&ulink_handle, CMD_ARGV[0],
                        ULINK_RENUMERATION_DELAY);
 
        return ret;
@@ -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,
 };

Linking to existing account procedure

If you already have an account and want to add another login method you MUST first sign in with your existing account and then change URL to read https://review.openocd.org/login/?link to get to this page again but this time it'll work for linking. Thank you.

SSH host keys fingerprints

1024 SHA256:YKx8b7u5ZWdcbp7/4AeXNaqElP49m6QrwfXaqQGJAOk gerrit-code-review@openocd.zylin.com (DSA)
384 SHA256:jHIbSQa4REvwCFG4cq5LBlBLxmxSqelQPem/EXIrxjk gerrit-code-review@openocd.org (ECDSA)
521 SHA256:UAOPYkU9Fjtcao0Ul/Rrlnj/OsQvt+pgdYSZ4jOYdgs gerrit-code-review@openocd.org (ECDSA)
256 SHA256:A13M5QlnozFOvTllybRZH6vm7iSt0XLxbA48yfc2yfY gerrit-code-review@openocd.org (ECDSA)
256 SHA256:spYMBqEYoAOtK7yZBrcwE8ZpYt6b68Cfh9yEVetvbXg gerrit-code-review@openocd.org (ED25519)
+--[ED25519 256]--+
|=..              |
|+o..   .         |
|*.o   . .        |
|+B . . .         |
|Bo. = o S        |
|Oo.+ + =         |
|oB=.* = . o      |
| =+=.+   + E     |
|. .=o   . o      |
+----[SHA256]-----+
2048 SHA256:0Onrb7/PHjpo6iVZ7xQX2riKN83FJ3KGU0TvI0TaFG4 gerrit-code-review@openocd.zylin.com (RSA)