From 98febe591a4c05c01d7de5ddf94d60563072e484 Mon Sep 17 00:00:00 2001 From: Joerg Wunsch Date: Thu, 27 Feb 2014 13:26:15 +0000 Subject: [PATCH] For EDBG protocol, always use 512-byte block I/O. The lower layers will split this according to the EP's maxsize. This makes it work over USB 1.1 connections (albeit very slowly, due to the interrupt transfers used). git-svn-id: svn://svn.savannah.nongnu.org/avrdude/trunk/avrdude@1284 81a1dc3b-b13d-400b-aceb-764788c761c2 --- ChangeLog | 7 +++++++ jtag3.c | 19 +++++++++---------- 2 files changed, 16 insertions(+), 10 deletions(-) diff --git a/ChangeLog b/ChangeLog index a56a3a3e..2a8f8cf1 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,10 @@ +2014-02-27 Joerg Wunsch + + * jtag3.c: For EDBG protocol, always use 512-byte block I/O. The + lower layers will split this according to the EP's maxsize. This + makes it work over USB 1.1 connections (albeit very slowly, due to + the interrupt transfers used). + 2014-02-27 Joerg Wunsch * config_gram.y: Turn the usbpid parameter of the programmer into diff --git a/jtag3.c b/jtag3.c index e7745070..fa092572 100644 --- a/jtag3.c +++ b/jtag3.c @@ -443,15 +443,15 @@ static int jtag3_edbg_send(PROGRAMMER * pgm, unsigned char * data, size_t len) if (verbose >= 4) { - memset(buf, 0, pgm->fd.usb.max_xfer); - memset(status, 0, pgm->fd.usb.max_xfer); + memset(buf, 0, USBDEV_MAX_XFER_3); + memset(status, 0, USBDEV_MAX_XFER_3); } if (verbose >= 3) fprintf(stderr, "\n%s: jtag3_edbg_send(): sending %lu bytes\n", progname, (unsigned long)len); - if (len + 8 > pgm->fd.usb.max_xfer) + if (len + 8 > USBDEV_MAX_XFER_3) { fprintf(stderr, "%s: jtag3_edbg_send(): Fragmentation not (yet) implemented!\n", @@ -467,13 +467,13 @@ static int jtag3_edbg_send(PROGRAMMER * pgm, unsigned char * data, size_t len) u16_to_b2(buf + 6, PDATA(pgm)->command_sequence); memcpy(buf + 8, data, len); - if (serial_send(&pgm->fd, buf, pgm->fd.usb.max_xfer) != 0) { + if (serial_send(&pgm->fd, buf, USBDEV_MAX_XFER_3) != 0) { fprintf(stderr, "%s: jtag3_edbg_send(): failed to send command to serial port\n", progname); return -1; } - rv = serial_recv(&pgm->fd, status, pgm->fd.usb.max_xfer); + rv = serial_recv(&pgm->fd, status, USBDEV_MAX_XFER_3); if (rv < 0) { /* timeout in receive */ @@ -679,7 +679,7 @@ static int jtag3_edbg_recv_frame(PROGRAMMER * pgm, unsigned char **msg) { if (verbose >= 4) fprintf(stderr, "%s: jtag3_edbg_recv():\n", progname); - if ((buf = malloc(pgm->fd.usb.max_xfer)) == NULL) { + if ((buf = malloc(USBDEV_MAX_XFER_3)) == NULL) { fprintf(stderr, "%s: jtag3_edbg_recv(): out of memory\n", progname); return -1; @@ -687,14 +687,14 @@ static int jtag3_edbg_recv_frame(PROGRAMMER * pgm, unsigned char **msg) { buf[0] = EDBG_VENDOR_AVR_RSP; - if (serial_send(&pgm->fd, buf, pgm->fd.usb.max_xfer) != 0) { + if (serial_send(&pgm->fd, buf, USBDEV_MAX_XFER_3) != 0) { fprintf(stderr, "%s: jtag3_edbg_recv(): error sending CMSIS-DAP vendor command\n", progname); return -1; } - rv = serial_recv(&pgm->fd, buf, pgm->fd.usb.max_xfer); + rv = serial_recv(&pgm->fd, buf, USBDEV_MAX_XFER_3); if (rv < 0) { /* timeout in receive */ @@ -966,7 +966,7 @@ static int jtag3_initialize(PROGRAMMER * pgm, AVRPART * p) */ if (jtag3_getparm(pgm, SCOPE_GENERAL, 0, PARM3_FW_MAJOR, parm, 2) < 0) return -1; - if (pgm->fd.usb.max_xfer < USBDEV_MAX_XFER_3) { + if (pgm->fd.usb.max_xfer < USBDEV_MAX_XFER_3 && (pgm->flag & PGM_FL_IS_EDBG) == 0) { fprintf(stderr, "%s: the JTAGICE3's firmware %d.%d is broken on USB 1.1 connections, sorry\n", progname, parm[0], parm[1]); @@ -975,7 +975,6 @@ static int jtag3_initialize(PROGRAMMER * pgm, AVRPART * p) "%s: forced to continue by option -F; THIS PUTS THE DEVICE'S DATA INTEGRITY AT RISK!\n", progname); } else { - serial_close(&pgm->fd); return -1; } }