Hi,

This patch reads the USB endpoints for the jlink adapter from the device 
descriptor
instead of hardcoding them. This is necessary because not all jlink 
implementations
use the same endpoint addresses. The jlink adapter embedded in the IAR 
LPC-P2378-SK
board uses endpoint 5 for input and 2 for output for example.

Cheers,

Peter.

Index: src/jtag/jlink.c
===================================================================
--- src/jtag/jlink.c    (revision 1046)
+++ src/jtag/jlink.c    (working copy)
@@ -49,9 +49,6 @@
 #define VID 0x1366
 #define PID 0x0101
 
-#define JLINK_WRITE_ENDPOINT   0x02
-#define JLINK_READ_ENDPOINT            0x81
-
 #define JLINK_USB_TIMEOUT              100
 
 #define JLINK_IN_BUFFER_SIZE                   8192
@@ -108,6 +105,8 @@
 typedef struct jlink_jtag
 {
        struct usb_dev_handle* usb_handle;
+       uint8_t read_endpoint;
+       uint8_t write_endpoint;
 } jlink_jtag_t;
 
 jlink_jtag_t *jlink_usb_open(void);
@@ -757,6 +756,30 @@
                {
                        if ((dev->descriptor.idVendor == VID) && 
(dev->descriptor.idProduct == PID))
                        {
+                               int i;
+
+                               if (dev->config->interface->num_altsetting != 
1) {
+                                       LOG_INFO("%d configurations found iso 
expected 1",
+                                               
dev->config->interface->num_altsetting);
+                                       continue;
+                               }
+
+                               if      
(dev->config->interface->altsetting->bNumEndpoints !=2) {
+                                       LOG_INFO("%d endpoints found iso 
expected 2",
+                                               
dev->config->interface->altsetting->bNumEndpoints);
+                                       continue;
+                               }
+
+                               for (i=0; i<2; i++) {
+                                       uint8_t endpoint;
+                                       
+                                       endpoint = 
dev->config->interface->altsetting->endpoint[i].bEndpointAddress;
+                                       if (endpoint & USB_ENDPOINT_DIR_MASK)
+                                               result->read_endpoint = 
endpoint & USB_ENDPOINT_ADDRESS_MASK;
+                                       else
+                                               result->write_endpoint = 
endpoint & USB_ENDPOINT_ADDRESS_MASK;
+                               }
+
                                result->usb_handle = usb_open(dev);
                                
                                /* usb_set_configuration required under win32 */
@@ -770,6 +793,8 @@
                                 */
                                usb_set_altinterface(result->usb_handle, 0);
 #endif                         
+
+                               
                                return result;
                        }
                }
@@ -858,7 +883,7 @@
                return -1;
        }
        
-       result = usb_bulk_write(jlink_jtag->usb_handle, JLINK_WRITE_ENDPOINT, \
+       result = usb_bulk_write(jlink_jtag->usb_handle, 
jlink_jtag->write_endpoint, \
                usb_out_buffer, out_length, JLINK_USB_TIMEOUT);
        
        DEBUG_JTAG_IO("jlink_usb_write, out_length = %d, result = %d", 
out_length, result);
@@ -872,7 +897,7 @@
 /* Read data from USB into in_buffer. */
 int jlink_usb_read(jlink_jtag_t *jlink_jtag)
 {
-       int result = usb_bulk_read(jlink_jtag->usb_handle, JLINK_READ_ENDPOINT, 
\
+       int result = usb_bulk_read(jlink_jtag->usb_handle, 
jlink_jtag->read_endpoint, \
                usb_in_buffer, JLINK_IN_BUFFER_SIZE, JLINK_USB_TIMEOUT);
 
        DEBUG_JTAG_IO("jlink_usb_read, result = %d", result);
@@ -886,7 +911,7 @@
 /* Read the result from the previous EMU cmd into result_buffer. */
 int jlink_usb_read_emu_result(jlink_jtag_t *jlink_jtag)
 {
-       int result = usb_bulk_read(jlink_jtag->usb_handle, JLINK_READ_ENDPOINT, 
\
+       int result = usb_bulk_read(jlink_jtag->usb_handle, 
jlink_jtag->read_endpoint, \
                usb_emu_result_buffer, JLINK_EMU_RESULT_BUFFER_SIZE, 
JLINK_USB_TIMEOUT);
 
        DEBUG_JTAG_IO("jlink_usb_read_result, result = %d", result);
_______________________________________________
Openocd-development mailing list
[email protected]
https://lists.berlios.de/mailman/listinfo/openocd-development

Reply via email to