From b701579906477bf8c276afd79cbd69175dc51e50 Mon Sep 17 00:00:00 2001 From: Dominic Spill Date: Fri, 1 Feb 2019 12:04:40 -0700 Subject: [PATCH] Allow portapack and opera cake to coexist and still enable the PP UI The side effect of this is to disable GPIO mode for OC, but I2C still works Using both addons together is super unlikely --- firmware/common/operacake.c | 9 ++++- firmware/common/operacake.h | 4 +- firmware/hackrf-common.cmake | 7 ++++ firmware/hackrf_usb/hackrf_usb.c | 51 +++--------------------- firmware/hackrf_usb/usb_api_operacake.c | 1 + host/hackrf-tools/src/hackrf_operacake.c | 7 +++- 6 files changed, 28 insertions(+), 51 deletions(-) diff --git a/firmware/common/operacake.c b/firmware/common/operacake.c index 8a047e14..b5033b54 100644 --- a/firmware/common/operacake.c +++ b/firmware/common/operacake.c @@ -23,6 +23,7 @@ #include "hackrf_core.h" #include "gpio.h" #include "gpio_lpc.h" +#include "i2c_bus.h" #include /* @@ -71,6 +72,7 @@ i2c_bus_t* const oc_bus = &i2c0; uint8_t operacake_boards[8] = {0,0,0,0,0,0,0,0}; +bool allow_gpio_mode = true; /* read single register */ uint8_t operacake_read_reg(i2c_bus_t* const bus, uint8_t address, uint8_t reg) { @@ -86,7 +88,7 @@ void operacake_write_reg(i2c_bus_t* const bus, uint8_t address, uint8_t reg, uin i2c_bus_transfer(bus, address, data, 2, NULL, 0); } -uint8_t operacake_init(void) { +uint8_t operacake_init(bool allow_gpio) { uint8_t reg, addr, i, j = 0; /* Find connected operacakes */ for(i=0; i<8; i++) { @@ -99,6 +101,7 @@ uint8_t operacake_init(void) { if(reg==OPERACAKE_CONFIG_ALL_OUTPUT) operacake_boards[j++] = addr; } + allow_gpio_mode = allow_gpio; return 0; } @@ -215,7 +218,9 @@ uint16_t gpio_test(uint8_t address) { uint8_t i, reg, bit_mask, gpio_mask = 0x1F; uint16_t result = 0; - operacake_init(); + if(!allow_gpio_mode) + return 0xFFFF; + scu_pinmux(SCU_PINMUX_GPIO3_8, SCU_GPIO_FAST | SCU_CONF_FUNCTION0); scu_pinmux(SCU_PINMUX_GPIO3_12, SCU_GPIO_FAST | SCU_CONF_FUNCTION0); scu_pinmux(SCU_PINMUX_GPIO3_13, SCU_GPIO_FAST | SCU_CONF_FUNCTION0); diff --git a/firmware/common/operacake.h b/firmware/common/operacake.h index 77acf08f..8d0fba67 100644 --- a/firmware/common/operacake.h +++ b/firmware/common/operacake.h @@ -28,7 +28,7 @@ extern "C" #endif #include -#include "i2c_bus.h" +#include #define OPERACAKE_PA1 0 #define OPERACAKE_PA2 1 @@ -45,7 +45,7 @@ extern "C" /* Up to 8 Operacake boards can be used with one HackRF */ extern uint8_t operacake_boards[8]; -uint8_t operacake_init(void); +uint8_t operacake_init(bool allow_gpio); uint8_t operacake_set_ports(uint8_t address, uint8_t PA, uint8_t PB); uint8_t operacake_add_range(uint16_t freq_min, uint16_t freq_max, uint8_t port); uint8_t operacake_set_range(uint32_t freq_mhz); diff --git a/firmware/hackrf-common.cmake b/firmware/hackrf-common.cmake index 5604ad8b..bc07c24d 100644 --- a/firmware/hackrf-common.cmake +++ b/firmware/hackrf-common.cmake @@ -243,6 +243,13 @@ macro(DeclareTargets) COMMAND rm -f _tmp.dfu _header.bin ) + # Program / flash targets + add_custom_target( + ${PROJECT_NAME}-flash + DEPENDS ${PROJECT_NAME}.bin + COMMAND hackrf_spiflash -Rw ${PROJECT_NAME}.bin + ) + add_custom_target( ${PROJECT_NAME}-program DEPENDS ${PROJECT_NAME}.dfu diff --git a/firmware/hackrf_usb/hackrf_usb.c b/firmware/hackrf_usb/hackrf_usb.c index 8bb8b417..ea116a73 100644 --- a/firmware/hackrf_usb/hackrf_usb.c +++ b/firmware/hackrf_usb/hackrf_usb.c @@ -48,51 +48,6 @@ #include "hackrf-ui.h" -// TODO: Duplicate code/knowledge, copied from /host/libhackrf/src/hackrf.c -// TODO: Factor this into a shared #include so that firmware can use -// the same values. -typedef enum { - HACKRF_VENDOR_REQUEST_SET_TRANSCEIVER_MODE = 1, - HACKRF_VENDOR_REQUEST_MAX2837_WRITE = 2, - HACKRF_VENDOR_REQUEST_MAX2837_READ = 3, - HACKRF_VENDOR_REQUEST_SI5351C_WRITE = 4, - HACKRF_VENDOR_REQUEST_SI5351C_READ = 5, - HACKRF_VENDOR_REQUEST_SAMPLE_RATE_SET = 6, - HACKRF_VENDOR_REQUEST_BASEBAND_FILTER_BANDWIDTH_SET = 7, - HACKRF_VENDOR_REQUEST_RFFC5071_WRITE = 8, - HACKRF_VENDOR_REQUEST_RFFC5071_READ = 9, - HACKRF_VENDOR_REQUEST_SPIFLASH_ERASE = 10, - HACKRF_VENDOR_REQUEST_SPIFLASH_WRITE = 11, - HACKRF_VENDOR_REQUEST_SPIFLASH_READ = 12, - _HACKRF_VENDOR_REQUEST_WRITE_CPLD = 13, - HACKRF_VENDOR_REQUEST_BOARD_ID_READ = 14, - HACKRF_VENDOR_REQUEST_VERSION_STRING_READ = 15, - HACKRF_VENDOR_REQUEST_SET_FREQ = 16, - HACKRF_VENDOR_REQUEST_AMP_ENABLE = 17, - HACKRF_VENDOR_REQUEST_BOARD_PARTID_SERIALNO_READ = 18, - HACKRF_VENDOR_REQUEST_SET_LNA_GAIN = 19, - HACKRF_VENDOR_REQUEST_SET_VGA_GAIN = 20, - HACKRF_VENDOR_REQUEST_SET_TXVGA_GAIN = 21, - _HACKRF_VENDOR_REQUEST_SET_IF_FREQ = 22, - HACKRF_VENDOR_REQUEST_ANTENNA_ENABLE = 23, - HACKRF_VENDOR_REQUEST_SET_FREQ_EXPLICIT = 24, - HACKRF_VENDOR_REQUEST_USB_WCID_VENDOR_REQ = 25, - HACKRF_VENDOR_REQUEST_INIT_SWEEP = 26, - HACKRF_VENDOR_REQUEST_OPERACAKE_GET_BOARDS = 27, - HACKRF_VENDOR_REQUEST_OPERACAKE_SET_PORTS = 28, - 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_SPIFLASH_STATUS = 33, - HACKRF_VENDOR_REQUEST_SPIFLASH_CLEAR_STATUS = 34, - HACKRF_VENDOR_REQUEST_OPERACAKE_GPIO_TEST = 35, - HACKRF_VENDOR_REQUEST_CPLD_CHECKSUM = 36, - - /* Update to be the next integer after the highest-numbered request. */ - _HACKRF_VENDOR_REQUEST_ARRAY_SIZE -} hackrf_vendor_request; - static usb_request_handler_fn vendor_request_handler[] = { NULL, usb_vendor_request_set_transceiver_mode, @@ -210,6 +165,7 @@ void usb_set_descriptor_by_serial_number(void) } int main(void) { + bool operacake_allow_gpio; pin_setup(); enable_1v8_power(); #if (defined HACKRF_ONE || defined RAD1O) @@ -246,8 +202,11 @@ int main(void) { rf_path_init(&rf_path); if( hackrf_ui() == NULL ) { - operacake_init(); + operacake_allow_gpio = true; + } else { + operacake_allow_gpio = false; } + operacake_init(operacake_allow_gpio); unsigned int phase = 0; diff --git a/firmware/hackrf_usb/usb_api_operacake.c b/firmware/hackrf_usb/usb_api_operacake.c index ef49dc6f..e3dcb580 100644 --- a/firmware/hackrf_usb/usb_api_operacake.c +++ b/firmware/hackrf_usb/usb_api_operacake.c @@ -22,6 +22,7 @@ #include "usb_api_operacake.h" #include "usb_queue.h" +#include #include usb_request_status_t usb_vendor_request_operacake_get_boards( diff --git a/host/hackrf-tools/src/hackrf_operacake.c b/host/hackrf-tools/src/hackrf_operacake.c index 53bd754a..fd79f10f 100644 --- a/host/hackrf-tools/src/hackrf_operacake.c +++ b/host/hackrf-tools/src/hackrf_operacake.c @@ -39,6 +39,8 @@ typedef int bool; #define INVALID_ADDRESS 0xFF #define INVALID_PORT 0xFF +#define GPIO_TEST_DISABLED 0xFFFF + static void usage() { printf("\nUsage:\n"); printf("\t-h, --help: this help\n"); @@ -285,7 +287,10 @@ int main(int argc, char** argv) { return EXIT_FAILURE; } - if(test_result) { + if(test_result == GPIO_TEST_DISABLED) { + fprintf(stderr, "GPIO mode diabled.\n"); + fprintf(stderr, "Remove additional addon boards and retry.\n"); + }else if(test_result) { fprintf(stderr, "GPIO test failed\n"); fprintf(stderr, "Pin\tHigh\tShorts\tLow\n"); reg = test_result & mask;