Add vendor request for enabling/disabling gpio-based sync

This commit is contained in:
Mike Davis
2017-01-22 22:28:11 +02:00
parent 738781c17c
commit ddb19a86fe
7 changed files with 91 additions and 11 deletions

1
.gitignore vendored
View File

@ -5,6 +5,7 @@
*.hex
*.srec
host/build/
host/**/build
# Operating system spew
.DS_Store

View File

@ -225,6 +225,11 @@ typedef enum {
TRANSCEIVER_MODE_CPLD_UPDATE = 4
} transceiver_mode_t;
typedef enum {
HW_SYNC_MODE_OFF = 0,
HW_SYNC_MODE_ON = 1,
} hw_sync_mode_t;
void delay(uint32_t duration);
/* TODO: Hide these configurations */

View File

@ -46,6 +46,11 @@
#include "usb_bulk_buffer.h"
static volatile transceiver_mode_t _transceiver_mode = TRANSCEIVER_MODE_OFF;
static volatile hw_sync_mode_t _hw_sync_mode = HW_SYNC_MODE_OFF;
void set_hw_sync_mode(const hw_sync_mode_t new_hw_sync_mode) {
_hw_sync_mode = new_hw_sync_mode;
}
void set_transceiver_mode(const transceiver_mode_t new_transceiver_mode) {
baseband_streaming_disable(&sgpio_config);
@ -76,11 +81,16 @@ void set_transceiver_mode(const transceiver_mode_t new_transceiver_mode) {
hw_sync_stop();
}
hw_sync_stop();
if( _transceiver_mode != TRANSCEIVER_MODE_OFF ) {
si5351c_activate_best_clock_source(&clock_gen);
hw_sync_stop();
hw_sync_syn();
if( _hw_sync_mode != HW_SYNC_MODE_OFF) {
hw_sync_syn();
} else {
baseband_streaming_enable(&sgpio_config);
}
}
}
@ -88,6 +98,19 @@ transceiver_mode_t transceiver_mode(void) {
return _transceiver_mode;
}
usb_request_status_t usb_vendor_request_set_hw_sync_mode(
usb_endpoint_t* const endpoint,
const usb_transfer_stage_t stage
) {
if( stage == USB_TRANSFER_STAGE_SETUP ) {
set_hw_sync_mode(endpoint->setup.value);
usb_transfer_schedule_ack(endpoint->in);
return USB_REQUEST_STATUS_OK;
} else {
return USB_REQUEST_STATUS_OK;
}
}
usb_request_status_t usb_vendor_request_set_transceiver_mode(
usb_endpoint_t* const endpoint,
const usb_transfer_stage_t stage
@ -144,6 +167,7 @@ static const usb_request_handler_fn vendor_request_handler[] = {
#endif
usb_vendor_request_set_freq_explicit,
usb_vendor_request_read_wcid, // USB_WCID_VENDOR_REQ
usb_vendor_request_set_hw_sync_mode,
};
static const uint32_t vendor_request_handler_count =
@ -260,15 +284,14 @@ int main(void) {
cpld_update();
while(true) {
if(hw_sync_ready()) {
hw_sync_ack();
led_on(LED3);
if( _hw_sync_mode != HW_SYNC_MODE_OFF) {
while(!hw_sync_ready()) { }
hw_sync_ack();
led_on(LED3);
baseband_streaming_enable(&sgpio_config);
}
baseband_streaming_enable(&sgpio_config);
break;
}
}
// Set up IN transfer of buffer 0.
if ( usb_bulk_buffer_offset >= 16384

View File

@ -52,5 +52,7 @@ usb_request_status_t usb_vendor_request_set_antenna_enable(
usb_endpoint_t* const endpoint, const usb_transfer_stage_t stage);
usb_request_status_t usb_vendor_request_set_freq_explicit(
usb_endpoint_t* const endpoint, const usb_transfer_stage_t stage);
usb_request_status_t usb_vendor_request_set_hw_sync_mode(
usb_endpoint_t* const endpoint, const usb_transfer_stage_t stage);
#endif/*__USB_API_TRANSCEIVER_H__*/

View File

@ -114,6 +114,11 @@ typedef enum {
TRANSCEIVER_MODE_SS = 3,
} transceiver_mode_t;
typedef enum {
HW_SYNC_MODE_OFF = 0,
HW_SYNC_MODE_ON = 1,
} hw_sync_mode_t;
/* WAVE or RIFF WAVE file format containing IQ 2x8bits data for HackRF compatible with SDR# Wav IQ file */
typedef struct
{
@ -303,6 +308,8 @@ volatile uint32_t byte_count = 0;
bool signalsource = false;
uint32_t amplitude = 0;
bool hw_sync = false;
bool receive = false;
bool receive_wav = false;
@ -463,6 +470,7 @@ static void usage() {
printf("\t[-R] # Repeat TX mode (default is off) \n");
printf("\t[-b baseband_filter_bw_hz] # Set baseband filter bandwidth in Hz.\n\tPossible values: 1.75/2.5/3.5/5/5.5/6/7/8/9/10/12/14/15/20/24/28MHz, default < sample_rate_hz.\n" );
printf("\t[-C ppm] # Set Internal crystal clock error in ppm.\n");
printf("\t[-H] # Synchronise USB transfer using GPIO pins.\n");
}
static hackrf_device* device = NULL;
@ -506,11 +514,14 @@ int main(int argc, char** argv) {
float time_diff;
unsigned int lna_gain=8, vga_gain=20, txvga_gain=0;
while( (opt = getopt(argc, argv, "wr:t:f:i:o:m:a:p:s:n:b:l:g:x:c:d:C:R")) != EOF )
while( (opt = getopt(argc, argv, "Hwr:t:f:i:o:m:a:p:s:n:b:l:g:x:c:d:C:R")) != EOF )
{
result = HACKRF_SUCCESS;
switch( opt )
{
case 'H':
hw_sync = true;
break;
case 'w':
receive_wav = true;
break;
@ -917,6 +928,15 @@ int main(int argc, char** argv) {
return EXIT_FAILURE;
}
fprintf(stderr, "call hackrf_set_hw_sync_mode(%d)\n",
hw_sync);
result = hackrf_set_hw_sync_mode(device, hw_sync ? HW_SYNC_MODE_ON : HW_SYNC_MODE_OFF);
if( result != HACKRF_SUCCESS ) {
fprintf(stderr, "hackrf_set_hw_sync_mode() failed: %s (%d)\n", hackrf_error_name(result), result);
usage();
return EXIT_FAILURE;
}
if( transceiver_mode == TRANSCEIVER_MODE_RX ) {
result = hackrf_set_vga_gain(device, vga_gain);
result |= hackrf_set_lna_gain(device, lna_gain);

View File

@ -67,6 +67,7 @@ typedef enum {
HACKRF_VENDOR_REQUEST_SET_TXVGA_GAIN = 21,
HACKRF_VENDOR_REQUEST_ANTENNA_ENABLE = 23,
HACKRF_VENDOR_REQUEST_SET_FREQ_EXPLICIT = 24,
HACKRF_VENDOR_REQUEST_SET_HW_SYNC_MODE = 26,
} hackrf_vendor_request;
typedef enum {
@ -82,6 +83,11 @@ typedef enum {
TRANSCEIVER_MODE_CPLD_UPDATE = 4,
} hackrf_transceiver_mode;
typedef enum {
HACKRF_HW_SYNC_MODE_OFF = 0,
HACKRF_HW_SYNC_MODE_ON = 1,
} hackrf_hw_sync_mode;
struct hackrf_device {
libusb_device_handle* usb_device;
struct libusb_transfer** transfers;
@ -1548,6 +1554,26 @@ int ADDCALL hackrf_close(hackrf_device* device)
return result1;
}
int ADDCALL hackrf_set_hw_sync_mode(hackrf_device* device, const uint8_t value) {
int result = libusb_control_transfer(
device->usb_device,
LIBUSB_ENDPOINT_OUT | LIBUSB_REQUEST_TYPE_VENDOR | LIBUSB_RECIPIENT_DEVICE,
HACKRF_VENDOR_REQUEST_SET_HW_SYNC_MODE,
value,
0,
NULL,
0,
0
);
if( result != 0 )
{
return HACKRF_ERROR_LIBUSB;
} else {
return HACKRF_SUCCESS;
}
}
const char* ADDCALL hackrf_error_name(enum hackrf_error errcode)
{
switch(errcode)

View File

@ -187,6 +187,9 @@ extern ADDAPI int ADDCALL hackrf_set_txvga_gain(hackrf_device* device, uint32_t
/* antenna port power control */
extern ADDAPI int ADDCALL hackrf_set_antenna_enable(hackrf_device* device, const uint8_t value);
/* set hardware sync mode */
extern ADDAPI int ADDCALL hackrf_set_hw_sync_mode(hackrf_device* device, const uint8_t value);
extern ADDAPI const char* ADDCALL hackrf_error_name(enum hackrf_error errcode);
extern ADDAPI const char* ADDCALL hackrf_board_id_name(enum hackrf_board_id board_id);
extern ADDAPI const char* ADDCALL hackrf_usb_board_id_name(enum hackrf_usb_board_id usb_board_id);