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;