olimex: add experimental support for V2 debug tool.

Tested with:

    - MSP430FG4618 (JTAG)
    - Firmware version 1270003010
This commit is contained in:
Daniel Beer 2011-06-06 11:28:13 +12:00
parent 167af0953a
commit 620570691e
2 changed files with 37 additions and 15 deletions

View File

@ -1,5 +1,5 @@
/* MSPDebug - debugging tool for the eZ430 /* MSPDebug - debugging tool for the eZ430
* Copyright (C) 2009, 2010 Daniel Beer * Copyright (C) 2009-2011 Daniel Beer
* Copyright (C) 2010 Peter Jansen * Copyright (C) 2010 Peter Jansen
* *
* This program is free software; you can redistribute it and/or modify * This program is free software; you can redistribute it and/or modify
@ -32,6 +32,9 @@ struct olimex_transport {
int int_number; int int_number;
struct usb_dev_handle *handle; struct usb_dev_handle *handle;
int in_ep;
int out_ep;
uint8_t buf[64]; uint8_t buf[64];
int len; int len;
int offset; int offset;
@ -49,11 +52,16 @@ struct olimex_transport {
*/ */
#define USB_FET_VENDOR 0x15ba #define USB_FET_VENDOR 0x15ba
#define USB_FET_PRODUCT 0x0002
#define USB_FET_INTERFACE_CLASS 255
#define USB_FET_IN_EP 0x81 #define V1_PRODUCT 0x0002
#define USB_FET_OUT_EP 0x01 #define V1_INTERFACE_CLASS 255
#define V1_IN_EP 0x81
#define V1_OUT_EP 0x01
#define V2_PRODUCT 0x0031
#define V2_INTERFACE_CLASS 10
#define V2_IN_EP 0x82
#define V2_OUT_EP 0x02
#define CP210x_REQTYPE_HOST_TO_DEVICE 0x41 #define CP210x_REQTYPE_HOST_TO_DEVICE 0x41
@ -61,7 +69,7 @@ struct olimex_transport {
#define CP210X_SET_BAUDDIV 0x01 #define CP210X_SET_BAUDDIV 0x01
#define CP210X_SET_MHS 0x07 #define CP210X_SET_MHS 0x07
#define TIMEOUT 1000 #define TIMEOUT 10000
static int open_interface(struct olimex_transport *tr, static int open_interface(struct olimex_transport *tr,
struct usb_device *dev, int ino) struct usb_device *dev, int ino)
@ -135,9 +143,19 @@ static int open_device(struct olimex_transport *tr, struct usb_device *dev)
struct usb_interface *intf = &c->interface[i]; struct usb_interface *intf = &c->interface[i];
struct usb_interface_descriptor *desc = &intf->altsetting[0]; struct usb_interface_descriptor *desc = &intf->altsetting[0];
if (desc->bInterfaceClass == USB_FET_INTERFACE_CLASS && if (desc->bInterfaceClass == V1_INTERFACE_CLASS &&
!open_interface(tr, dev, desc->bInterfaceNumber)) !open_interface(tr, dev, desc->bInterfaceNumber)) {
printc_dbg("olimex: rev 1 device\n");
tr->in_ep = V1_IN_EP;
tr->out_ep = V1_OUT_EP;
return 0; return 0;
} else if (desc->bInterfaceClass == V2_INTERFACE_CLASS &&
!open_interface(tr, dev, desc->bInterfaceNumber)) {
printc_dbg("olimex: rev 2 device\n");
tr->in_ep = V2_IN_EP;
tr->out_ep = V2_OUT_EP;
return 0;
}
} }
return -1; return -1;
@ -153,7 +171,7 @@ static int usbtr_send(transport_t tr_base, const uint8_t *data, int len)
#ifdef DEBUG_OLIMEX #ifdef DEBUG_OLIMEX
debug_hexdump(__FILE__": USB transfer out", data, len); debug_hexdump(__FILE__": USB transfer out", data, len);
#endif #endif
sent = usb_bulk_write(tr->handle, USB_FET_OUT_EP, sent = usb_bulk_write(tr->handle, tr->out_ep,
(char *)data, len, TIMEOUT); (char *)data, len, TIMEOUT);
if (sent < 0) { if (sent < 0) {
pr_error(__FILE__": can't send data"); pr_error(__FILE__": can't send data");
@ -175,7 +193,7 @@ static int usbtr_recv(transport_t tr_base, uint8_t *databuf, int max_len)
printc(__FILE__": %s : read max %d\n", __FUNCTION__, max_len); printc(__FILE__": %s : read max %d\n", __FUNCTION__, max_len);
#endif #endif
rlen = usb_bulk_read(tr->handle, USB_FET_IN_EP, (char *)databuf, rlen = usb_bulk_read(tr->handle, tr->in_ep, (char *)databuf,
max_len, TIMEOUT); max_len, TIMEOUT);
#ifdef DEBUG_OLIMEX #ifdef DEBUG_OLIMEX
@ -222,10 +240,13 @@ transport_t olimex_open(const char *devpath)
usb_find_busses(); usb_find_busses();
usb_find_devices(); usb_find_devices();
if (devpath) if (devpath) {
dev = usbutil_find_by_loc(devpath); dev = usbutil_find_by_loc(devpath);
else } else {
dev = usbutil_find_by_id(USB_FET_VENDOR, USB_FET_PRODUCT); dev = usbutil_find_by_id(USB_FET_VENDOR, V1_PRODUCT);
if (!dev)
dev = usbutil_find_by_id(USB_FET_VENDOR, V2_PRODUCT);
}
if (!dev) { if (!dev) {
free(tr); free(tr);
@ -238,7 +259,7 @@ transport_t olimex_open(const char *devpath)
} }
/* Flush out lingering data */ /* Flush out lingering data */
while (usb_bulk_read(tr->handle, USB_FET_IN_EP, while (usb_bulk_read(tr->handle, tr->in_ep,
buf, sizeof(buf), buf, sizeof(buf),
100) >= 0); 100) >= 0);

View File

@ -30,7 +30,8 @@ static const char *device_help(const struct usb_device *dev)
const char *help; const char *help;
} info[] = { } info[] = {
{0x0451, 0xf432, "eZ430-RF2500"}, {0x0451, 0xf432, "eZ430-RF2500"},
{0x15ba, 0x0002, "Olimex MSP-JTAG-TINY"} {0x15ba, 0x0002, "Olimex MSP-JTAG-TINY (v1)"},
{0x15ba, 0x0031, "Olimex MSP-JTAG-TINY (v2)"}
}; };
int i; int i;