* 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:
Joerg Wunsch
2014-01-17 14:00:01 +00:00
parent 74e1b66a67
commit fcb5db7152
4 changed files with 54 additions and 24 deletions

49
dfu.c
View File

@@ -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. */
#include <usb.h>
/* 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_GETSTATUS 3
#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
* is sent to the device.
*/
static u_int16_t wIndex = 0;
static uint16_t wIndex = 0;
/* INTERNAL FUNCTION PROTOTYPES
*/
@@ -118,8 +118,8 @@ struct dfu_dev * dfu_open(char *port_spec)
if(':' == port_spec[3]) {
bus_name = strdup(port_spec + 3 + 1);
if (bus_name == NULL) {
perror(progname);
exit(1);
fprintf(stderr, "%s: Out of memory in strdup\n", progname);
return NULL;
}
dev_name = strchr(bus_name, ':');
@@ -135,12 +135,13 @@ struct dfu_dev * dfu_open(char *port_spec)
if (dfu == NULL)
{
perror(progname);
exit(1);
fprintf(stderr, "%s: out of memory\n", progname);
return 0;
}
dfu->bus_name = bus_name;
dfu->dev_name = dev_name;
dfu->timeout = DFU_TIMEOUT;
/* LibUSB initialization. */
@@ -274,7 +275,7 @@ int dfu_getstatus(struct dfu_dev *dfu, struct dfu_status *status)
result = usb_control_msg(dfu->dev_handle,
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) {
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,
USB_TYPE_CLASS | USB_RECIP_INTERFACE, DFU_CLRSTATUS, 0, 0,
NULL, 0, DFU_TIMEOUT);
NULL, 0, dfu->timeout);
if (result < 0) {
fprintf(stderr, "%s: Error: Failed to clear DFU status: %s\n",
@@ -327,6 +328,28 @@ int dfu_clrstatus(struct dfu_dev *dfu)
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 result;
@@ -338,7 +361,7 @@ int dfu_dnload(struct dfu_dev *dfu, void *ptr, int size)
result = usb_control_msg(dfu->dev_handle,
USB_TYPE_CLASS | USB_RECIP_INTERFACE, DFU_DNLOAD, wIndex++, 0,
ptr, size, DFU_TIMEOUT);
ptr, size, dfu->timeout);
if (result < 0) {
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,
0x80 | USB_TYPE_CLASS | USB_RECIP_INTERFACE, DFU_UPLOAD, wIndex++, 0,
ptr, size, DFU_TIMEOUT);
ptr, size, dfu->timeout);
if (result < 0) {
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);
if (str == NULL) {
perror(progname);
exit(1);
fprintf(stderr, "%s: Out of memory allocating a string\n", progname);
return 0;
}
memcpy(str, buffer, result);