diff options
| author | 2016-06-26 16:15:03 +0200 | |
|---|---|---|
| committer | 2016-06-26 16:15:03 +0200 | |
| commit | c22fb01537f39cc1288b860b24a8ae48e49f06f9 (patch) | |
| tree | d1fad4af5df6f1212d0bb2891ecbffe15ce63bef /src/libirecovery.c | |
| parent | d0129ee911ebbb7a5da7daf496231e23afb305a2 (diff) | |
| download | libirecovery-c22fb01537f39cc1288b860b24a8ae48e49f06f9.tar.gz libirecovery-c22fb01537f39cc1288b860b24a8ae48e49f06f9.tar.bz2 | |
Add DFU error handling
Diffstat (limited to 'src/libirecovery.c')
| -rw-r--r-- | src/libirecovery.c | 19 |
1 files changed, 17 insertions, 2 deletions
diff --git a/src/libirecovery.c b/src/libirecovery.c index 62c675a..33711c2 100644 --- a/src/libirecovery.c +++ b/src/libirecovery.c | |||
| @@ -1693,11 +1693,26 @@ IRECV_API irecv_error_t irecv_send_buffer(irecv_client_t client, unsigned char* | |||
| 1693 | if (recovery_mode) { | 1693 | if (recovery_mode) { |
| 1694 | error = irecv_usb_control_transfer(client, 0x41, 0, 0, 0, NULL, 0, USB_TIMEOUT); | 1694 | error = irecv_usb_control_transfer(client, 0x41, 0, 0, 0, NULL, 0, USB_TIMEOUT); |
| 1695 | } else { | 1695 | } else { |
| 1696 | unsigned char dump[4]; | 1696 | uint8_t state = 0; |
| 1697 | if (irecv_usb_control_transfer(client, 0xa1, 5, 0, 0, dump, 1, USB_TIMEOUT) == 1) { | 1697 | if (irecv_usb_control_transfer(client, 0xa1, 5, 0, 0, (unsigned char*)&state, 1, USB_TIMEOUT) == 1) { |
| 1698 | error = IRECV_E_SUCCESS; | 1698 | error = IRECV_E_SUCCESS; |
| 1699 | } else { | 1699 | } else { |
| 1700 | return IRECV_E_USB_UPLOAD; | ||
| 1701 | } | ||
| 1702 | switch (state) { | ||
| 1703 | case 2: | ||
| 1704 | /* DFU IDLE */ | ||
| 1705 | break; | ||
| 1706 | case 10: | ||
| 1707 | debug("DFU ERROR, issuing CLRSTATUS\n"); | ||
| 1708 | irecv_usb_control_transfer(client, 0x21, 4, 0, 0, NULL, 0, USB_TIMEOUT); | ||
| 1700 | error = IRECV_E_USB_UPLOAD; | 1709 | error = IRECV_E_USB_UPLOAD; |
| 1710 | break; | ||
| 1711 | default: | ||
| 1712 | debug("Unexpected state %d, issuing ABORT\n", state); | ||
| 1713 | irecv_usb_control_transfer(client, 0x21, 6, 0, 0, NULL, 0, USB_TIMEOUT); | ||
| 1714 | error = IRECV_E_USB_UPLOAD; | ||
| 1715 | break; | ||
| 1701 | } | 1716 | } |
| 1702 | } | 1717 | } |
| 1703 | 1718 | ||
