Skip to content

Commit 7410233

Browse files
committed
NAK the request that takes us out of TX mode until buffer flushed.
1 parent 5daed4d commit 7410233

3 files changed

Lines changed: 18 additions & 1 deletion

File tree

firmware/hackrf_usb/usb_api_transceiver.c

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -342,6 +342,17 @@ volatile transceiver_request_t transceiver_request = {
342342
.seq = 0,
343343
};
344344

345+
void transceiver_usb_setup_complete(usb_endpoint_t* const endpoint)
346+
{
347+
if (transceiver_request.mode == TRANSCEIVER_MODE_TX &&
348+
endpoint->setup.request == 1) {
349+
// This is a request to leave TX mode. Do so but NAK for now.
350+
request_transceiver_mode(endpoint->setup.value);
351+
} else {
352+
usb_setup_complete(endpoint);
353+
}
354+
}
355+
345356
// Must be called from an atomic context (normally USB ISR)
346357
void request_transceiver_mode(transceiver_mode_t mode)
347358
{
@@ -675,6 +686,9 @@ void tx_mode(uint32_t seq)
675686
;
676687

677688
// All data received from the host has now been transmitted.
689+
// Now we can ACK the control request that took us out of TX mode.
690+
usb_transfer_schedule_ack(usb_endpoint_control_in.in);
691+
678692
transceiver_shutdown();
679693
}
680694

firmware/hackrf_usb/usb_api_transceiver.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,8 @@ typedef struct {
3535

3636
extern volatile transceiver_request_t transceiver_request;
3737

38+
void transceiver_usb_setup_complete(usb_endpoint_t* const endpoint);
39+
3840
void set_hw_sync_mode(const hw_sync_mode_t new_hw_sync_mode);
3941
usb_request_status_t usb_vendor_request_set_transceiver_mode(
4042
usb_endpoint_t* const endpoint,

firmware/hackrf_usb/usb_endpoint.c

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -26,13 +26,14 @@
2626
#include <usb_request.h>
2727

2828
#include "usb_device.h"
29+
#include "usb_api_transceiver.h"
2930

3031
usb_endpoint_t usb_endpoint_control_out = {
3132
.address = 0x00,
3233
.device = &usb_device,
3334
.in = &usb_endpoint_control_in,
3435
.out = &usb_endpoint_control_out,
35-
.setup_complete = usb_setup_complete,
36+
.setup_complete = transceiver_usb_setup_complete,
3637
.transfer_complete = usb_control_out_complete,
3738
};
3839
USB_DEFINE_QUEUE(usb_endpoint_control_out, 4);

0 commit comments

Comments
 (0)