* flip2.c (flip2_page_erase): Remove unimplemented function.
* dfu.h: Correctly conditionalize <usb.h> vs. <lusb0_usb.h>; add adjustable timeout (struct dfu_dev); add dfu_abort() * dfu.c (dfu_abort): New function; implement adjustable timeout. git-svn-id: svn://svn.savannah.nongnu.org/avrdude/trunk/avrdude@1268 81a1dc3b-b13d-400b-aceb-764788c761c2
This commit is contained in:
parent
b46a86284d
commit
774c46b860
|
@ -1,3 +1,10 @@
|
||||||
|
2014-01-17 Joerg Wunsch <j.gnu@uriah.heep.sax.de>
|
||||||
|
|
||||||
|
* flip2.c (flip2_page_erase): Remove unimplemented function.
|
||||||
|
* dfu.h: Correctly conditionalize <usb.h> vs. <lusb0_usb.h>;
|
||||||
|
add adjustable timeout (struct dfu_dev); add dfu_abort()
|
||||||
|
* dfu.c (dfu_abort): New function; implement adjustable timeout.
|
||||||
|
|
||||||
2014-01-17 Joerg Wunsch <j.gnu@uriah.heep.sax.de>
|
2014-01-17 Joerg Wunsch <j.gnu@uriah.heep.sax.de>
|
||||||
|
|
||||||
* configure.ac (libhid): Turn from AC_TRY_RUN into
|
* configure.ac (libhid): Turn from AC_TRY_RUN into
|
||||||
|
|
49
dfu.c
49
dfu.c
|
@ -70,8 +70,6 @@ int dfu_upload(struct dfu_dev *dfu, void * ptr, int size) {
|
||||||
|
|
||||||
/* If we DO have LibUSB, we can define the real functions. */
|
/* If we DO have LibUSB, we can define the real functions. */
|
||||||
|
|
||||||
#include <usb.h>
|
|
||||||
|
|
||||||
/* DFU data structures and constants.
|
/* DFU data structures and constants.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
@ -81,12 +79,14 @@ int dfu_upload(struct dfu_dev *dfu, void * ptr, int size) {
|
||||||
#define DFU_UPLOAD 2
|
#define DFU_UPLOAD 2
|
||||||
#define DFU_GETSTATUS 3
|
#define DFU_GETSTATUS 3
|
||||||
#define DFU_CLRSTATUS 4
|
#define DFU_CLRSTATUS 4
|
||||||
|
#define DFU_GETSTATE 5 /* FLIPv1 only; not used */
|
||||||
|
#define DFU_ABORT 6 /* FLIPv1 only */
|
||||||
|
|
||||||
/* Block counter global variable. Incremented each time a DFU_DNLOAD command
|
/* Block counter global variable. Incremented each time a DFU_DNLOAD command
|
||||||
* is sent to the device.
|
* is sent to the device.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
static u_int16_t wIndex = 0;
|
static uint16_t wIndex = 0;
|
||||||
|
|
||||||
/* INTERNAL FUNCTION PROTOTYPES
|
/* INTERNAL FUNCTION PROTOTYPES
|
||||||
*/
|
*/
|
||||||
|
@ -118,8 +118,8 @@ struct dfu_dev * dfu_open(char *port_spec)
|
||||||
if(':' == port_spec[3]) {
|
if(':' == port_spec[3]) {
|
||||||
bus_name = strdup(port_spec + 3 + 1);
|
bus_name = strdup(port_spec + 3 + 1);
|
||||||
if (bus_name == NULL) {
|
if (bus_name == NULL) {
|
||||||
perror(progname);
|
fprintf(stderr, "%s: Out of memory in strdup\n", progname);
|
||||||
exit(1);
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
dev_name = strchr(bus_name, ':');
|
dev_name = strchr(bus_name, ':');
|
||||||
|
@ -135,12 +135,13 @@ struct dfu_dev * dfu_open(char *port_spec)
|
||||||
|
|
||||||
if (dfu == NULL)
|
if (dfu == NULL)
|
||||||
{
|
{
|
||||||
perror(progname);
|
fprintf(stderr, "%s: out of memory\n", progname);
|
||||||
exit(1);
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
dfu->bus_name = bus_name;
|
dfu->bus_name = bus_name;
|
||||||
dfu->dev_name = dev_name;
|
dfu->dev_name = dev_name;
|
||||||
|
dfu->timeout = DFU_TIMEOUT;
|
||||||
|
|
||||||
/* LibUSB initialization. */
|
/* LibUSB initialization. */
|
||||||
|
|
||||||
|
@ -274,7 +275,7 @@ int dfu_getstatus(struct dfu_dev *dfu, struct dfu_status *status)
|
||||||
|
|
||||||
result = usb_control_msg(dfu->dev_handle,
|
result = usb_control_msg(dfu->dev_handle,
|
||||||
0x80 | USB_TYPE_CLASS | USB_RECIP_INTERFACE, DFU_GETSTATUS, 0, 0,
|
0x80 | USB_TYPE_CLASS | USB_RECIP_INTERFACE, DFU_GETSTATUS, 0, 0,
|
||||||
(char*) status, sizeof(struct dfu_status), DFU_TIMEOUT);
|
(char*) status, sizeof(struct dfu_status), dfu->timeout);
|
||||||
|
|
||||||
if (result < 0) {
|
if (result < 0) {
|
||||||
fprintf(stderr, "%s: Error: Failed to get DFU status: %s\n",
|
fprintf(stderr, "%s: Error: Failed to get DFU status: %s\n",
|
||||||
|
@ -316,7 +317,7 @@ int dfu_clrstatus(struct dfu_dev *dfu)
|
||||||
|
|
||||||
result = usb_control_msg(dfu->dev_handle,
|
result = usb_control_msg(dfu->dev_handle,
|
||||||
USB_TYPE_CLASS | USB_RECIP_INTERFACE, DFU_CLRSTATUS, 0, 0,
|
USB_TYPE_CLASS | USB_RECIP_INTERFACE, DFU_CLRSTATUS, 0, 0,
|
||||||
NULL, 0, DFU_TIMEOUT);
|
NULL, 0, dfu->timeout);
|
||||||
|
|
||||||
if (result < 0) {
|
if (result < 0) {
|
||||||
fprintf(stderr, "%s: Error: Failed to clear DFU status: %s\n",
|
fprintf(stderr, "%s: Error: Failed to clear DFU status: %s\n",
|
||||||
|
@ -327,6 +328,28 @@ int dfu_clrstatus(struct dfu_dev *dfu)
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int dfu_abort(struct dfu_dev *dfu)
|
||||||
|
{
|
||||||
|
int result;
|
||||||
|
|
||||||
|
if (verbose > 3)
|
||||||
|
fprintf(stderr, "%s: dfu_abort(): issuing control OUT message\n",
|
||||||
|
progname);
|
||||||
|
|
||||||
|
result = usb_control_msg(dfu->dev_handle,
|
||||||
|
USB_TYPE_CLASS | USB_RECIP_INTERFACE, DFU_ABORT, 0, 0,
|
||||||
|
NULL, 0, dfu->timeout);
|
||||||
|
|
||||||
|
if (result < 0) {
|
||||||
|
fprintf(stderr, "%s: Error: Failed to reset DFU state: %s\n",
|
||||||
|
progname, usb_strerror());
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
int dfu_dnload(struct dfu_dev *dfu, void *ptr, int size)
|
int dfu_dnload(struct dfu_dev *dfu, void *ptr, int size)
|
||||||
{
|
{
|
||||||
int result;
|
int result;
|
||||||
|
@ -338,7 +361,7 @@ int dfu_dnload(struct dfu_dev *dfu, void *ptr, int size)
|
||||||
|
|
||||||
result = usb_control_msg(dfu->dev_handle,
|
result = usb_control_msg(dfu->dev_handle,
|
||||||
USB_TYPE_CLASS | USB_RECIP_INTERFACE, DFU_DNLOAD, wIndex++, 0,
|
USB_TYPE_CLASS | USB_RECIP_INTERFACE, DFU_DNLOAD, wIndex++, 0,
|
||||||
ptr, size, DFU_TIMEOUT);
|
ptr, size, dfu->timeout);
|
||||||
|
|
||||||
if (result < 0) {
|
if (result < 0) {
|
||||||
fprintf(stderr, "%s: Error: DFU_DNLOAD failed: %s\n",
|
fprintf(stderr, "%s: Error: DFU_DNLOAD failed: %s\n",
|
||||||
|
@ -372,7 +395,7 @@ int dfu_upload(struct dfu_dev *dfu, void *ptr, int size)
|
||||||
|
|
||||||
result = usb_control_msg(dfu->dev_handle,
|
result = usb_control_msg(dfu->dev_handle,
|
||||||
0x80 | USB_TYPE_CLASS | USB_RECIP_INTERFACE, DFU_UPLOAD, wIndex++, 0,
|
0x80 | USB_TYPE_CLASS | USB_RECIP_INTERFACE, DFU_UPLOAD, wIndex++, 0,
|
||||||
ptr, size, DFU_TIMEOUT);
|
ptr, size, dfu->timeout);
|
||||||
|
|
||||||
if (result < 0) {
|
if (result < 0) {
|
||||||
fprintf(stderr, "%s: Error: DFU_UPLOAD failed: %s\n",
|
fprintf(stderr, "%s: Error: DFU_UPLOAD failed: %s\n",
|
||||||
|
@ -442,8 +465,8 @@ char * get_usb_string(usb_dev_handle * dev_handle, int index) {
|
||||||
str = malloc(result+1);
|
str = malloc(result+1);
|
||||||
|
|
||||||
if (str == NULL) {
|
if (str == NULL) {
|
||||||
perror(progname);
|
fprintf(stderr, "%s: Out of memory allocating a string\n", progname);
|
||||||
exit(1);
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
memcpy(str, buffer, result);
|
memcpy(str, buffer, result);
|
||||||
|
|
10
dfu.h
10
dfu.h
|
@ -24,7 +24,13 @@
|
||||||
#include "ac_cfg.h"
|
#include "ac_cfg.h"
|
||||||
|
|
||||||
#ifdef HAVE_LIBUSB
|
#ifdef HAVE_LIBUSB
|
||||||
#include <usb.h>
|
#if defined(HAVE_USB_H)
|
||||||
|
# include <usb.h>
|
||||||
|
#elif defined(HAVE_LUSB0_USB_H)
|
||||||
|
# include <lusb0_usb.h>
|
||||||
|
#else
|
||||||
|
# error "libusb needs either <usb.h> or <lusb0_usb.h>"
|
||||||
|
#endif
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#include <limits.h>
|
#include <limits.h>
|
||||||
|
@ -49,6 +55,7 @@ struct dfu_dev
|
||||||
struct usb_interface_descriptor intf_desc;
|
struct usb_interface_descriptor intf_desc;
|
||||||
struct usb_endpoint_descriptor endp_desc;
|
struct usb_endpoint_descriptor endp_desc;
|
||||||
char *manf_str, *prod_str, *serno_str;
|
char *manf_str, *prod_str, *serno_str;
|
||||||
|
unsigned int timeout;
|
||||||
};
|
};
|
||||||
|
|
||||||
#else
|
#else
|
||||||
|
@ -116,6 +123,7 @@ extern int dfu_getstatus(struct dfu_dev *dfu, struct dfu_status *status);
|
||||||
extern int dfu_clrstatus(struct dfu_dev *dfu);
|
extern int dfu_clrstatus(struct dfu_dev *dfu);
|
||||||
extern int dfu_dnload(struct dfu_dev *dfu, void *ptr, int size);
|
extern int dfu_dnload(struct dfu_dev *dfu, void *ptr, int size);
|
||||||
extern int dfu_upload(struct dfu_dev *dfu, void *ptr, int size);
|
extern int dfu_upload(struct dfu_dev *dfu, void *ptr, int size);
|
||||||
|
extern int dfu_abort(struct dfu_dev *dfu);
|
||||||
|
|
||||||
extern void dfu_show_info(struct dfu_dev *dfu);
|
extern void dfu_show_info(struct dfu_dev *dfu);
|
||||||
|
|
||||||
|
|
12
flip2.c
12
flip2.c
|
@ -142,8 +142,6 @@ static int flip2_read_byte(PROGRAMMER* pgm, AVRPART *part, AVRMEM *mem,
|
||||||
unsigned long addr, unsigned char *value);
|
unsigned long addr, unsigned char *value);
|
||||||
static int flip2_write_byte(PROGRAMMER* pgm, AVRPART *part, AVRMEM *mem,
|
static int flip2_write_byte(PROGRAMMER* pgm, AVRPART *part, AVRMEM *mem,
|
||||||
unsigned long addr, unsigned char value);
|
unsigned long addr, unsigned char value);
|
||||||
static int flip2_page_erase(PROGRAMMER* pgm, AVRPART *part, AVRMEM *mem,
|
|
||||||
unsigned int base_addr);
|
|
||||||
static int flip2_paged_load(PROGRAMMER* pgm, AVRPART *part, AVRMEM *mem,
|
static int flip2_paged_load(PROGRAMMER* pgm, AVRPART *part, AVRMEM *mem,
|
||||||
unsigned int page_size, unsigned int addr, unsigned int n_bytes);
|
unsigned int page_size, unsigned int addr, unsigned int n_bytes);
|
||||||
static int flip2_paged_write(PROGRAMMER* pgm, AVRPART *part, AVRMEM *mem,
|
static int flip2_paged_write(PROGRAMMER* pgm, AVRPART *part, AVRMEM *mem,
|
||||||
|
@ -188,7 +186,6 @@ void flip2_initpgm(PROGRAMMER *pgm)
|
||||||
pgm->chip_erase = flip2_chip_erase;
|
pgm->chip_erase = flip2_chip_erase;
|
||||||
pgm->open = flip2_open;
|
pgm->open = flip2_open;
|
||||||
pgm->close = flip2_close;
|
pgm->close = flip2_close;
|
||||||
pgm->page_erase = flip2_page_erase;
|
|
||||||
pgm->paged_load = flip2_paged_load;
|
pgm->paged_load = flip2_paged_load;
|
||||||
pgm->paged_write = flip2_paged_write;
|
pgm->paged_write = flip2_paged_write;
|
||||||
pgm->read_byte = flip2_read_byte;
|
pgm->read_byte = flip2_read_byte;
|
||||||
|
@ -428,12 +425,6 @@ int flip2_write_byte(PROGRAMMER* pgm, AVRPART *part, AVRMEM *mem,
|
||||||
return flip2_write_memory(FLIP2(pgm)->dfu, mem_unit, addr, &value, 1);
|
return flip2_write_memory(FLIP2(pgm)->dfu, mem_unit, addr, &value, 1);
|
||||||
}
|
}
|
||||||
|
|
||||||
int flip2_page_erase(PROGRAMMER* pgm, AVRPART *part, AVRMEM *mem,
|
|
||||||
unsigned int base_addr)
|
|
||||||
{
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
int flip2_paged_load(PROGRAMMER* pgm, AVRPART *part, AVRMEM *mem,
|
int flip2_paged_load(PROGRAMMER* pgm, AVRPART *part, AVRMEM *mem,
|
||||||
unsigned int page_size, unsigned int addr, unsigned int n_bytes)
|
unsigned int page_size, unsigned int addr, unsigned int n_bytes)
|
||||||
{
|
{
|
||||||
|
@ -522,7 +513,8 @@ void flip2_setup(PROGRAMMER * pgm)
|
||||||
pgm->cookie = calloc(1, sizeof(struct flip2));
|
pgm->cookie = calloc(1, sizeof(struct flip2));
|
||||||
|
|
||||||
if (pgm->cookie == NULL) {
|
if (pgm->cookie == NULL) {
|
||||||
perror(progname);
|
fprintf(stderr, "%s: Out of memory allocating private data structure\n",
|
||||||
|
progname);
|
||||||
exit(1);
|
exit(1);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue