From 89b878d3bb6d91b2c4bc68e7ac96ad7c542600ca Mon Sep 17 00:00:00 2001 From: "E.T." Date: Sat, 7 Feb 2026 15:45:26 +0100 Subject: [PATCH] Better hackrf board detection for the serial info command (#2967) --- firmware/application/CMakeLists.txt | 5 +++ firmware/application/hackrf_core_mini.c | 56 +++++++++++++++++++++++++ firmware/application/shell.cpp | 44 ++++++++++++++++++- 3 files changed, 104 insertions(+), 1 deletion(-) create mode 100644 firmware/application/hackrf_core_mini.c diff --git a/firmware/application/CMakeLists.txt b/firmware/application/CMakeLists.txt index 3eb1b6703..3a52630d0 100644 --- a/firmware/application/CMakeLists.txt +++ b/firmware/application/CMakeLists.txt @@ -118,11 +118,16 @@ set(CSRC usb_serial_endpoints.c usb_serial_device_to_host.c i2c_device_to_host.c + hackrf_core_mini.c + ${HACKRF_PATH}/firmware/common/adc.c ${HACKRF_PATH}/firmware/common/usb.c ${HACKRF_PATH}/firmware/common/usb_queue.c ${HACKRF_PATH}/firmware/hackrf_usb/usb_device.c ${HACKRF_PATH}/firmware/common/usb_request.c ${HACKRF_PATH}/firmware/common/usb_standard_request.c + ${HACKRF_PATH}/firmware/libopencm3/lib/lpc43xx/scu.c + ${HACKRF_PATH}/firmware/common/gpio_lpc.c + ${HACKRF_PATH}/firmware/common/platform_detect.c ${CHIBIOS}/os/various/chprintf.c ) diff --git a/firmware/application/hackrf_core_mini.c b/firmware/application/hackrf_core_mini.c new file mode 100644 index 000000000..980a96cf9 --- /dev/null +++ b/firmware/application/hackrf_core_mini.c @@ -0,0 +1,56 @@ +#include "gpio_lpc.h" + +typedef enum { + LED1 = 0, + LED2 = 1, + LED3 = 2, + LED4 = 3, +} led_t; + +/* GPIO Output PinMux */ +static struct gpio_t gpio_led[] = { + GPIO(2, 1), + GPIO(2, 2), + GPIO(2, 8), +#ifdef RAD1O + GPIO(5, 26), +#endif +}; + +void delay(uint32_t duration) { + while (duration--) { + /* cannot be optimized out */ + __asm__ volatile("nop"); + } +} + +void delay_us_at_mhz(uint32_t us, uint32_t mhz) { + /* overflow-safe multiply */ + uint64_t cycles64 = (uint64_t)us * (uint64_t)mhz; + if (cycles64 > UINT32_MAX) { + cycles64 = UINT32_MAX; + } + delay((uint32_t)cycles64); +} + +void led_on(const led_t led) { + gpio_set(&gpio_led[led]); +} + +void led_off(const led_t led) { + gpio_clear(&gpio_led[led]); +} + +void halt_and_flash(const uint32_t duration) { + /* blink LED1, LED2, and LED3 */ + while (1) { + led_on(LED1); + led_on(LED2); + led_on(LED3); + delay(duration); + led_off(LED1); + led_off(LED2); + led_off(LED3); + delay(duration); + } +} diff --git a/firmware/application/shell.cpp b/firmware/application/shell.cpp index 96779307b..b671ae03f 100644 --- a/firmware/application/shell.cpp +++ b/firmware/application/shell.cpp @@ -32,6 +32,10 @@ #include "chprintf.h" #include "portapack.hpp" +extern "C" { +#include "platform_detect.h" +} + /** * @brief Shell termination event source. */ @@ -65,8 +69,42 @@ static void list_commands(BaseSequentialStream* chp, const ShellCommand* scp) { } } +static const char* get_board_revision_string(board_rev_t rev) { + switch (rev) { + case BOARD_REV_HACKRF1_OLD: + return "HackRF R1-R5"; + case BOARD_REV_HACKRF1_R6: + return "HackRF R6"; + case BOARD_REV_HACKRF1_R7: + return "HackRF R7"; + case BOARD_REV_HACKRF1_R8: + return "HackRF R8"; + case BOARD_REV_HACKRF1_R9: + return "HackRF R9"; + case BOARD_REV_HACKRF1_R10: + return "HackRF R10"; + case BOARD_REV_GSG_HACKRF1_R6: + return "GSG HackRF R6"; + case BOARD_REV_GSG_HACKRF1_R7: + return "GSG HackRF R7"; + case BOARD_REV_GSG_HACKRF1_R8: + return "GSG HackRF R8"; + case BOARD_REV_GSG_HACKRF1_R9: + return "GSG HackRF R9"; + case BOARD_REV_GSG_HACKRF1_R10: + return "GSG HackRF R10"; + case BOARD_REV_UNRECOGNIZED: + return "Unrecognized"; + case BOARD_REV_UNDETECTED: + return "Undetected"; + default: + return "Unknown"; + } +} + static void cmd_info(BaseSequentialStream* chp, int argc, char* argv[]) { (void)argv; + if (argc > 0) { usage(chp, const_cast("info")); return; @@ -92,7 +130,11 @@ static void cmd_info(BaseSequentialStream* chp, int argc, char* argv[]) { #ifdef VERSION_STRING chprintf(chp, "Mayhem Version: %s\r\n", VERSION_STRING); #endif - chprintf(chp, "HackRF Board Rev: %s\r\n", hackrf_r9 ? "R9" : "R1-R8"); + + detect_hardware_platform(); + board_rev_t revision = detected_revision(); + const char* revision_string = get_board_revision_string(revision); + chprintf(chp, "HackRF Board Rev: %s\r\n", revision_string); chprintf(chp, "Reference Source: %s\r\n", portapack::clock_manager.get_source().c_str()); chprintf(chp, "Reference Freq: %s\r\n", portapack::clock_manager.get_freq().c_str()); #ifdef __DATE__