diff --git a/firmware/common/hackrf_core.h b/firmware/common/hackrf_core.h index 8ce6c943..e19829d6 100644 --- a/firmware/common/hackrf_core.h +++ b/firmware/common/hackrf_core.h @@ -345,7 +345,9 @@ extern "C" typedef enum { TRANSCEIVER_MODE_OFF = 0, TRANSCEIVER_MODE_RX = 1, - TRANSCEIVER_MODE_TX = 2 + TRANSCEIVER_MODE_TX = 2, + TRANSCEIVER_MODE_SS = 3, + TRANSCEIVER_MODE_CPLD_UPDATE = 4 } transceiver_mode_t; void delay(uint32_t duration); diff --git a/firmware/hackrf_usb/hackrf_usb.c b/firmware/hackrf_usb/hackrf_usb.c index e842d82b..c5ccb6ad 100644 --- a/firmware/hackrf_usb/hackrf_usb.c +++ b/firmware/hackrf_usb/hackrf_usb.c @@ -99,6 +99,11 @@ usb_request_status_t usb_vendor_request_set_transceiver_mode( set_transceiver_mode(endpoint->setup.value); usb_transfer_schedule_ack(endpoint->in); return USB_REQUEST_STATUS_OK; + case TRANSCEIVER_MODE_CPLD_UPDATE: + usb_endpoint_init(&usb_endpoint_bulk_out); + start_cpld_update = true; + usb_transfer_schedule_ack(endpoint->in); + return USB_REQUEST_STATUS_OK; default: return USB_REQUEST_STATUS_STALL; } diff --git a/host/hackrf-tools/src/hackrf_transfer.c b/host/hackrf-tools/src/hackrf_transfer.c index b76ae631..16e5456c 100644 --- a/host/hackrf-tools/src/hackrf_transfer.c +++ b/host/hackrf-tools/src/hackrf_transfer.c @@ -168,13 +168,6 @@ t_wav_file_hdr wave_file_hdr = } }; -typedef enum { - TRANSCEIVER_MODE_OFF = 0, - TRANSCEIVER_MODE_RX = 1, - TRANSCEIVER_MODE_TX = 2, - TRANSCEIVER_MODE_SS = 3 - -} transceiver_mode_t; static transceiver_mode_t transceiver_mode = TRANSCEIVER_MODE_RX; #define U64TOA_MAX_DIGIT (31) diff --git a/host/libhackrf/src/hackrf.c b/host/libhackrf/src/hackrf.c index 6632fb41..e68c7195 100644 --- a/host/libhackrf/src/hackrf.c +++ b/host/libhackrf/src/hackrf.c @@ -907,23 +907,12 @@ int ADDCALL hackrf_cpld_write(hackrf_device* device, { const unsigned int chunk_size = 512; unsigned int i; - int transferred = 0; - int result = libusb_release_interface(device->usb_device, 0); - if (result != LIBUSB_SUCCESS) { - return HACKRF_ERROR_LIBUSB; - } - - result = set_hackrf_configuration(device->usb_device, USB_CONFIG_CPLD_UPDATE); - if( result != LIBUSB_SUCCESS ) - { + int result, transferred = 0; + + result = hackrf_set_transceiver_mode(device, TRANSCEIVER_MODE_CPLD_UPDATE); + if (result != 0) return result; - } - - result = libusb_claim_interface(device->usb_device, 0); - if (result != LIBUSB_SUCCESS) { - return HACKRF_ERROR_LIBUSB; - } - + for (i = 0; i < total_length; i += chunk_size) { result = libusb_bulk_transfer( diff --git a/host/libhackrf/src/hackrf.h b/host/libhackrf/src/hackrf.h index 6f043444..503e4ec3 100644 --- a/host/libhackrf/src/hackrf.h +++ b/host/libhackrf/src/hackrf.h @@ -81,6 +81,14 @@ enum rf_path_filter { RF_PATH_FILTER_HIGH_PASS = 2, }; +typedef enum { + TRANSCEIVER_MODE_OFF = 0, + TRANSCEIVER_MODE_RX = 1, + TRANSCEIVER_MODE_TX = 2, + TRANSCEIVER_MODE_SS = 3, + TRANSCEIVER_MODE_CPLD_UPDATE = 4 +} transceiver_mode_t; + typedef struct hackrf_device hackrf_device; typedef struct {