From 3f569a8ad49f8d8903f85d2a5f84e6d3870d2773 Mon Sep 17 00:00:00 2001 From: Dominic Spill Date: Fri, 27 Oct 2017 15:09:26 -0600 Subject: [PATCH] hackrf_clock: Allow CLKOUT to be enabled / disabled hackrf_clock -o 1 / hackrf_clock -o 0 --- firmware/common/hackrf_core.c | 2 - firmware/common/si5351c.c | 57 +++++++++++++++++- firmware/common/si5351c.h | 1 + firmware/hackrf_usb/hackrf_usb.c | 3 +- firmware/hackrf_usb/usb_api_register.c | 11 ++++ firmware/hackrf_usb/usb_api_register.h | 4 ++ host/CMakeLists.txt | 2 + host/hackrf-tools/src/hackrf_clock.c | 80 +++++++++----------------- host/libhackrf/src/hackrf.c | 26 +++++++++ host/libhackrf/src/hackrf.h | 2 + 10 files changed, 131 insertions(+), 57 deletions(-) diff --git a/firmware/common/hackrf_core.c b/firmware/common/hackrf_core.c index 1c05e221..d1e4d71d 100644 --- a/firmware/common/hackrf_core.c +++ b/firmware/common/hackrf_core.c @@ -498,8 +498,6 @@ void cpu_clock_init(void) si5351c_set_clock_source(&clock_gen, PLL_SOURCE_XTAL); // soft reset - // uint8_t resetdata[] = { 177, 0xac }; - // si5351c_write(&clock_gen, resetdata, sizeof(resetdata)); si5351c_reset_pll(&clock_gen); si5351c_enable_clock_outputs(&clock_gen); diff --git a/firmware/common/si5351c.c b/firmware/common/si5351c.c index 3bdefcda..a217d6d5 100644 --- a/firmware/common/si5351c.c +++ b/firmware/common/si5351c.c @@ -197,12 +197,27 @@ void si5351c_configure_clock_control(si5351c_driver_t* const drv, const enum pll si5351c_write(drv, data, sizeof(data)); } +#define SI5351C_CLK_ENABLE(x) (0<setup.value); + usb_transfer_schedule_ack(endpoint->in); + } + return USB_REQUEST_STATUS_OK; +} diff --git a/firmware/hackrf_usb/usb_api_register.h b/firmware/hackrf_usb/usb_api_register.h index 06eb8df7..9fef6eed 100644 --- a/firmware/hackrf_usb/usb_api_register.h +++ b/firmware/hackrf_usb/usb_api_register.h @@ -50,5 +50,9 @@ usb_request_status_t usb_vendor_request_read_rffc5071( usb_endpoint_t* const endpoint, const usb_transfer_stage_t stage ); +usb_request_status_t usb_vendor_request_set_clkout_enable( + usb_endpoint_t* const endpoint, + const usb_transfer_stage_t stage +); #endif /* end of include guard: __USB_API_REGISTER_H__ */ diff --git a/host/CMakeLists.txt b/host/CMakeLists.txt index 34136f09..03e31ee7 100644 --- a/host/CMakeLists.txt +++ b/host/CMakeLists.txt @@ -3,6 +3,8 @@ cmake_minimum_required(VERSION 2.8) project (HackRF) +set(CMAKE_C_FLAGS "$ENV{CFLAGS}" CACHE STRING "C Flags") + add_subdirectory(libhackrf) add_subdirectory(hackrf-tools) diff --git a/host/hackrf-tools/src/hackrf_clock.c b/host/hackrf-tools/src/hackrf_clock.c index 4c2cc8f4..bd3344dd 100644 --- a/host/hackrf-tools/src/hackrf_clock.c +++ b/host/hackrf-tools/src/hackrf_clock.c @@ -32,7 +32,6 @@ typedef int bool; #define false 0 #endif -#define CLOCK_INPUT 0xFE #define CLOCK_UNDEFINED 0xFF #define REGISTER_INVALID 32767 @@ -226,38 +225,33 @@ int si5351c_read_configuration(hackrf_device* device) { } static void usage() { - printf("\nhackrf_clock - HackRF clock configuration utility\n"); + printf("hackrf_clock - HackRF clock configuration utility\n"); printf("Usage:\n"); printf("\t-h, --help: this help\n"); - printf("\t-r, --read: read clock settings\n"); - printf("\t-w, --write : set clock frequnecy to \n"); - printf("\t-c, --clock : select multisynth output clock to configure\n"); - printf("\t-i, --clkin: configure clock in\n"); - printf("\t-o, --clkout: configure clock out\n"); - printf("\t-d, --device : specify a particular device by serial number\n"); + printf("\t-r, --read : read settings for clock_num\n"); + printf("\t-a, --all: read settings for all clocks\n"); + printf("\t-o, --clkout : enable/disable CLKOUT\n"); + printf("\t-d, --device : Serial number of desired HackRF.\n"); printf("\nExamples:\n"); - printf("\thackrf_clock -c 3 -r : prints settings for CLKOUT\n"); - printf("\thackrf_clock -c # \n"); + printf("\thackrf_clock -r 3 : prints settings for CLKOUT\n"); } static struct option long_options[] = { { "help", no_argument, 0, 'h' }, - { "read", no_argument, 0, 'r' }, - { "write", required_argument, 0, 'w' }, - { "clock", required_argument, 0, 'c' }, - { "clkin", no_argument, 0, 'i' }, - { "clkout", no_argument, 0, 'o' }, + { "read", required_argument, 0, 'r' }, + { "all", no_argument, 0, 'a' }, + { "clkout", required_argument, 0, 'o' }, { "device", required_argument, 0, 'd' }, { 0, 0, 0, 0 }, }; int main(int argc, char** argv) { - int opt; hackrf_device* device = NULL; - int option_index = 0; + int opt, option_index = 0; bool read = false; - bool write = false; uint16_t clock = CLOCK_UNDEFINED; + bool clkout = false; + uint16_t clkout_enable; const char* serial_number = NULL; int result = hackrf_init(); @@ -266,27 +260,20 @@ int main(int argc, char** argv) { return EXIT_FAILURE; } - while( (opt = getopt_long(argc, argv, "riod:w:c:h?", long_options, &option_index)) != EOF ) { + while( (opt = getopt_long(argc, argv, "r:ao:d:h?", long_options, &option_index)) != EOF ) { switch( opt ) { case 'r': read = true; - break; - - case 'w': - write = true; result = parse_int(optarg, &clock); break; - case 'c': - result = parse_int(optarg, &clock); - break; - - case 'i': - clock = CLOCK_INPUT; + case 'a': + read = true; break; case 'o': - clock = 3; + clkout = true; + result = parse_int(optarg, &clkout_enable); break; case 'd': @@ -310,20 +297,8 @@ int main(int argc, char** argv) { } } - if(write && read) { - fprintf(stderr, "Read and write options are mutually exclusive.\n"); - usage(); - return EXIT_FAILURE; - } - - if(!write && !read) { - fprintf(stderr, "Either read or write option must be specified.\n"); - usage(); - return EXIT_FAILURE; - } - - if(write && clock==CLOCK_UNDEFINED) { - fprintf(stderr, "A clock must be specified whe using the write option.\n"); + if(!clkout && !read) { + fprintf(stderr, "Either read or enable CLKOUT option must be specified.\n"); usage(); return EXIT_FAILURE; } @@ -334,6 +309,14 @@ int main(int argc, char** argv) { return EXIT_FAILURE; } + if(clkout) { + result = hackrf_set_clkout_enable(device, clkout_enable); + if(result) { + printf("hackrf_set_clkout_enable() failed: %s (%d)\n", hackrf_error_name(result), result); + return EXIT_FAILURE; + } + } + if(read) { if(clock == CLOCK_UNDEFINED) si5351c_read_configuration(device); @@ -343,15 +326,6 @@ int main(int argc, char** argv) { } } - if(write) { - // result = si5351c_write_register(device, register_number, register_value); - if(result) { - printf("si5351c_write_register() failed: %s (%d)\n", hackrf_error_name(result), result); - return EXIT_FAILURE; - } - } - - result = hackrf_close(device); if(result) { printf("hackrf_close() failed: %s (%d)\n", hackrf_error_name(result), result); diff --git a/host/libhackrf/src/hackrf.c b/host/libhackrf/src/hackrf.c index 4fb28406..e0a9f527 100644 --- a/host/libhackrf/src/hackrf.c +++ b/host/libhackrf/src/hackrf.c @@ -79,6 +79,7 @@ typedef enum { HACKRF_VENDOR_REQUEST_SET_HW_SYNC_MODE = 29, HACKRF_VENDOR_REQUEST_RESET = 30, HACKRF_VENDOR_REQUEST_OPERACAKE_SET_RANGES = 31, + HACKRF_VENDOR_REQUEST_CLKOUT_ENABLE = 32, } hackrf_vendor_request; #define USB_CONFIG_STANDARD 0x1 @@ -1991,6 +1992,31 @@ int ADDCALL hackrf_set_operacake_ranges(hackrf_device* device, uint8_t* ranges, return HACKRF_SUCCESS; } } + +int ADDCALL hackrf_set_clkout_enable(hackrf_device* device, const uint8_t value) +{ + USB_API_REQUIRED(device, 0x0103) + int result; + result = libusb_control_transfer( + device->usb_device, + LIBUSB_ENDPOINT_OUT | LIBUSB_REQUEST_TYPE_VENDOR | LIBUSB_RECIPIENT_DEVICE, + HACKRF_VENDOR_REQUEST_CLKOUT_ENABLE, + value, + 0, + NULL, + 0, + 0 + ); + + if (result != 0) + { + last_libusb_error = result; + return HACKRF_ERROR_LIBUSB; + } else { + return HACKRF_SUCCESS; + } +} + #ifdef __cplusplus } // __cplusplus defined. #endif diff --git a/host/libhackrf/src/hackrf.h b/host/libhackrf/src/hackrf.h index c2b28206..2e335c01 100644 --- a/host/libhackrf/src/hackrf.h +++ b/host/libhackrf/src/hackrf.h @@ -246,6 +246,8 @@ extern ADDAPI int ADDCALL hackrf_set_operacake_ranges(hackrf_device* device, uint8_t* ranges, uint8_t num_ranges); +extern ADDAPI int ADDCALL hackrf_set_clkout_enable(hackrf_device* device, const uint8_t value); + #ifdef __cplusplus } // __cplusplus defined. #endif