3636#include <usb_queue.h>
3737
3838#include <stddef.h>
39+ #include <string.h>
3940
4041#include "usb_endpoint.h"
42+ #include "usb_api_sweep.h"
4143
4244typedef struct {
4345 uint32_t freq_mhz ;
@@ -251,17 +253,22 @@ void set_transceiver_mode(const transceiver_mode_t new_transceiver_mode) {
251253
252254 _transceiver_mode = new_transceiver_mode ;
253255
254- if ( _transceiver_mode == TRANSCEIVER_MODE_RX ) {
256+ switch (_transceiver_mode ) {
257+ case TRANSCEIVER_MODE_RX_SWEEP :
258+ case TRANSCEIVER_MODE_RX :
255259 led_off (LED3 );
256260 led_on (LED2 );
257261 rf_path_set_direction (& rf_path , RF_PATH_DIRECTION_RX );
258262 usb_bulk_buffer_tx = false;
259- } else if (_transceiver_mode == TRANSCEIVER_MODE_TX ) {
263+ break ;
264+ case TRANSCEIVER_MODE_TX :
260265 led_off (LED2 );
261266 led_on (LED3 );
262267 rf_path_set_direction (& rf_path , RF_PATH_DIRECTION_TX );
263268 usb_bulk_buffer_tx = true;
264- } else {
269+ break ;
270+ case TRANSCEIVER_MODE_OFF :
271+ default :
265272 led_off (LED2 );
266273 led_off (LED3 );
267274 rf_path_set_direction (& rf_path , RF_PATH_DIRECTION_OFF );
@@ -274,7 +281,7 @@ void set_transceiver_mode(const transceiver_mode_t new_transceiver_mode) {
274281
275282 hw_sync_enable (_hw_sync_mode );
276283
277- baseband_streaming_enable ( & sgpio_config ) ;
284+ usb_bulk_buffer_offset = 0 ;
278285 }
279286}
280287
@@ -287,11 +294,9 @@ usb_request_status_t usb_vendor_request_set_transceiver_mode(
287294 case TRANSCEIVER_MODE_OFF :
288295 case TRANSCEIVER_MODE_RX :
289296 case TRANSCEIVER_MODE_TX :
290- set_transceiver_mode (endpoint -> setup .value );
291- usb_transfer_schedule_ack (endpoint -> in );
292- return USB_REQUEST_STATUS_OK ;
297+ case TRANSCEIVER_MODE_RX_SWEEP :
293298 case TRANSCEIVER_MODE_CPLD_UPDATE :
294- start_cpld_update = true ;
299+ set_transceiver_mode ( endpoint -> setup . value ) ;
295300 usb_transfer_schedule_ack (endpoint -> in );
296301 return USB_REQUEST_STATUS_OK ;
297302 default :
@@ -314,3 +319,70 @@ usb_request_status_t usb_vendor_request_set_hw_sync_mode(
314319 return USB_REQUEST_STATUS_OK ;
315320 }
316321}
322+
323+ void rx_mode (void ) {
324+ unsigned int phase = 1 ;
325+
326+ baseband_streaming_enable (& sgpio_config );
327+
328+ while (TRANSCEIVER_MODE_RX == _transceiver_mode ) {
329+ // Set up IN transfer of buffer 0.
330+ if (16384 <= usb_bulk_buffer_offset && 1 == phase ) {
331+ usb_transfer_schedule_block (
332+ & usb_endpoint_bulk_in ,
333+ & usb_bulk_buffer [0x0000 ],
334+ 0x4000 ,
335+ NULL , NULL
336+ );
337+ phase = 0 ;
338+ }
339+ // Set up IN transfer of buffer 1.
340+ if (16384 > usb_bulk_buffer_offset && 0 == phase ) {
341+ usb_transfer_schedule_block (
342+ & usb_endpoint_bulk_in ,
343+ & usb_bulk_buffer [0x4000 ],
344+ 0x4000 ,
345+ NULL , NULL
346+ );
347+ phase = 1 ;
348+ }
349+ }
350+ }
351+
352+ void tx_mode (void ) {
353+ unsigned int phase = 1 ;
354+
355+ memset (& usb_bulk_buffer [0x0000 ], 0 , 0x8000 );
356+ // Set up OUT transfer of buffer 1.
357+ usb_transfer_schedule_block (
358+ & usb_endpoint_bulk_out ,
359+ & usb_bulk_buffer [0x4000 ],
360+ 0x4000 ,
361+ NULL , NULL
362+ );
363+ // Start transmitting zeros while the host fills buffer 1.
364+ baseband_streaming_enable (& sgpio_config );
365+
366+ while (TRANSCEIVER_MODE_TX == _transceiver_mode ) {
367+ // Set up OUT transfer of buffer 0.
368+ if (16384 <= usb_bulk_buffer_offset && 1 == phase ) {
369+ usb_transfer_schedule_block (
370+ & usb_endpoint_bulk_out ,
371+ & usb_bulk_buffer [0x0000 ],
372+ 0x4000 ,
373+ NULL , NULL
374+ );
375+ phase = 0 ;
376+ }
377+ // Set up OUT transfer of buffer 1.
378+ if (16384 > usb_bulk_buffer_offset && 0 == phase ) {
379+ usb_transfer_schedule_block (
380+ & usb_endpoint_bulk_out ,
381+ & usb_bulk_buffer [0x4000 ],
382+ 0x4000 ,
383+ NULL , NULL
384+ );
385+ phase = 1 ;
386+ }
387+ }
388+ }
0 commit comments