From a6eb430830c7c2e189b133c7d06b41840e0bbd28 Mon Sep 17 00:00:00 2001 From: Bernd Herzog Date: Thu, 30 Mar 2023 11:46:36 +0200 Subject: [PATCH] integrated usb stack --- firmware/application/apps/ui_sd_over_usb.cpp | 12 ++++- firmware/baseband/CMakeLists.txt | 21 ++++++++ .../baseband/sd_over_usb/proc_sd_over_usb.cpp | 31 +++++++++-- firmware/baseband/sd_over_usb/sd_over_usb.c | 51 +++++++++++++++++++ firmware/baseband/sd_over_usb/sd_over_usb.h | 3 ++ .../baseband/sd_over_usb/usb_descriptor.c | 20 +++++--- 6 files changed, 128 insertions(+), 10 deletions(-) diff --git a/firmware/application/apps/ui_sd_over_usb.cpp b/firmware/application/apps/ui_sd_over_usb.cpp index 87d195bad..b8d6c9113 100644 --- a/firmware/application/apps/ui_sd_over_usb.cpp +++ b/firmware/application/apps/ui_sd_over_usb.cpp @@ -26,7 +26,17 @@ namespace ui { SdOverUsbView::SdOverUsbView(NavigationView& nav) : nav_ (nav) { - baseband::run_image(portapack::spi_flash::image_tag_usb_sd); + + sdcDisconnect(&SDCD1); + sdcStop(&SDCD1); + + portapack::shutdown(); + m4_init(portapack::spi_flash::image_tag_usb_sd, portapack::memory::map::m4_code, true); + //m4_init(portapack::spi_flash::image_tag_hackrf, portapack::memory::map::m4_code_hackrf, true); + m0_halt(); /* will not return*/ + //baseband::run_image(); + + add_children({ &labels, &button_close diff --git a/firmware/baseband/CMakeLists.txt b/firmware/baseband/CMakeLists.txt index 8c8a61275..cab5fe56c 100644 --- a/firmware/baseband/CMakeLists.txt +++ b/firmware/baseband/CMakeLists.txt @@ -534,8 +534,29 @@ set(MODE_CPPSRC ${HACKRF_PATH}/firmware/common/usb_queue.c ${HACKRF_PATH}/firmware/common/usb_request.c ${HACKRF_PATH}/firmware/common/usb_standard_request.c + ${HACKRF_PATH}/firmware/common/platform_detect.c + ${HACKRF_PATH}/firmware/common/hackrf_core.c + ${HACKRF_PATH}/firmware/common/gpio_lpc.c + ${HACKRF_PATH}/firmware/common/firmware_info.c + ${HACKRF_PATH}/firmware/common/si5351c.c + ${HACKRF_PATH}/firmware/common/i2c_bus.c + ${HACKRF_PATH}/firmware/common/mixer.c + ${HACKRF_PATH}/firmware/common/clkin.c + ${HACKRF_PATH}/firmware/common/spi_bus.c + ${HACKRF_PATH}/firmware/common/sgpio.c + ${HACKRF_PATH}/firmware/common/rf_path.c + ${HACKRF_PATH}/firmware/common/i2c_lpc.c + ${HACKRF_PATH}/firmware/common/spi_ssp.c + ${HACKRF_PATH}/firmware/common/rffc5071_spi.c + ${HACKRF_PATH}/firmware/common/rffc5071.c + ${HACKRF_PATH}/firmware/common/clkin.c + ${HACKRF_PATH}/firmware/common/gpdma.c + ${HACKRF_PATH}/firmware/libopencm3/lib/cm3/nvic.c ${HACKRF_PATH}/firmware/libopencm3/lib/cm3/sync.c + ${HACKRF_PATH}/firmware/libopencm3/lib/lpc43xx/scu.c + ${HACKRF_PATH}/firmware/libopencm3/lib/lpc43xx/timer.c + ${HACKRF_PATH}/firmware/libopencm3/lib/lpc43xx/i2c.c ) DeclareTargets(PUSB sd_over_usb) diff --git a/firmware/baseband/sd_over_usb/proc_sd_over_usb.cpp b/firmware/baseband/sd_over_usb/proc_sd_over_usb.cpp index 075833268..5109dc64f 100644 --- a/firmware/baseband/sd_over_usb/proc_sd_over_usb.cpp +++ b/firmware/baseband/sd_over_usb/proc_sd_over_usb.cpp @@ -40,10 +40,35 @@ CH_IRQ_HANDLER(Vector60) { } int main() { - EventDispatcher event_dispatcher { std::make_unique() }; - HALT_UNTIL_DEBUGGING(); + //EventDispatcher event_dispatcher { std::make_unique() }; + + //HALT_UNTIL_DEBUGGING(); + + //LPC_CGU->PLL0USB_CTRL.PD = 1; + //LPC_CGU->PLL0USB_CTRL.AUTOBLOCK = 1; + //LPC_CGU->PLL0USB_CTRL.CLK_SEL = 0x06; +// + //while (LPC_CGU->PLL0USB_STAT.LOCK) {} + // + //LPC_CGU->PLL0USB_MDIV = 0x06167FFA; // 0x71A7FAA; // + //LPC_CGU->PLL0USB_NP_DIV = 0x00302062; +// + ////LPC_CGU->PLL0USB_CTRL.PD |= 1; + //LPC_CGU->PLL0USB_CTRL.DIRECTI = 1; + //LPC_CGU->PLL0USB_CTRL.DIRECTO = 1; + //LPC_CGU->PLL0USB_CTRL.CLKEN = 1; +// + //LPC_CGU->PLL0USB_CTRL.PD = 0; +// + //while (!(LPC_CGU->PLL0USB_STAT.LOCK)) {} + ////chThdSleepMilliseconds(800); +// + //LPC_CGU->BASE_USB0_CLK.AUTOBLOCK = 1; + //LPC_CGU->BASE_USB0_CLK.CLK_SEL = 0x07; + start_usb(); - event_dispatcher.run(); + //event_dispatcher.run(); + while (true); stop_usb(); return 0; } diff --git a/firmware/baseband/sd_over_usb/sd_over_usb.c b/firmware/baseband/sd_over_usb/sd_over_usb.c index 12a43c8fe..594eb7846 100644 --- a/firmware/baseband/sd_over_usb/sd_over_usb.c +++ b/firmware/baseband/sd_over_usb/sd_over_usb.c @@ -45,8 +45,59 @@ const usb_request_handlers_t usb_request_handlers = { }; +void usb_configuration_changed(usb_device_t* const device) +{ + /* Reset transceiver to idle state until other commands are received */ + // request_transceiver_mode(TRANSCEIVER_MODE_OFF); + // if (device->configuration->number == 1) { + // // transceiver configuration + // led_on(LED1); + // } else { + // /* Configuration number equal 0 means usb bus reset. */ + // led_off(LED1); + // } + usb_endpoint_init(&usb_endpoint_bulk_in); + usb_endpoint_init(&usb_endpoint_bulk_out); +} + void start_usb(void) { + + /* use XTAL_OSC as clock source for PLL0USB */ + // CGU_PLL0USB_CTRL = + // CGU_PLL0USB_CTRL_PD(1) /* PLL0 power down */ | + // CGU_PLL0USB_CTRL_AUTOBLOCK(1) /* Block clock automatically during frequency change */ | + // CGU_PLL0USB_CTRL_CLK_SEL(CGU_SRC_XTAL); /* Clock source selection */ + + // while (CGU_PLL0USB_STAT & CGU_PLL0USB_STAT_LOCK_MASK) {} + + /* configure PLL0USB to produce 480 MHz clock from 12 MHz XTAL_OSC */ + /* Values from User Manual v1.4 Table 94, for 12MHz oscillator. */ + + // CGU_PLL0USB_MDIV = 0x06167FFA; + // CGU_PLL0USB_NP_DIV = 0x00302062; + + // CGU_PLL0USB_CTRL |= + // CGU_PLL0USB_CTRL_PD(1) /* PLL0 power down */ | + // CGU_PLL0USB_CTRL_DIRECTI(1) /* PLL0 direct input */ | + // CGU_PLL0USB_CTRL_DIRECTO(1) /* PLL0 direct output */ | + // CGU_PLL0USB_CTRL_CLKEN(1) /* PLL0 clock enable */; + + // /* power on PLL0USB and wait until stable */ + // CGU_PLL0USB_CTRL &= ~CGU_PLL0USB_CTRL_PD_MASK /* PLL0 power down */ ; + + // while (!(CGU_PLL0USB_STAT & CGU_PLL0USB_STAT_LOCK_MASK)) {} + + /* use PLL0USB as clock source for USB0 */ + // CGU_BASE_USB0_CLK = CGU_BASE_USB0_CLK_AUTOBLOCK(1) | + // CGU_BASE_USB0_CLK_CLK_SEL(CGU_SRC_PLL0USB); + + detect_hardware_platform(); + pin_setup(); + cpu_clock_init(); + + + usb_set_configuration_changed_cb(usb_configuration_changed); usb_peripheral_reset(); usb_device_init(0, &usb_device); diff --git a/firmware/baseband/sd_over_usb/sd_over_usb.h b/firmware/baseband/sd_over_usb/sd_over_usb.h index d953e9072..ecdb0d4dc 100644 --- a/firmware/baseband/sd_over_usb/sd_over_usb.h +++ b/firmware/baseband/sd_over_usb/sd_over_usb.h @@ -30,6 +30,9 @@ #include "usb_device.h" #include "usb_endpoint.h" #include +#include +#include "platform_detect.h" +#include "hackrf_core.h" void start_usb(void); void stop_usb(void); diff --git a/firmware/baseband/sd_over_usb/usb_descriptor.c b/firmware/baseband/sd_over_usb/usb_descriptor.c index ecf094d9d..7f5adc474 100644 --- a/firmware/baseband/sd_over_usb/usb_descriptor.c +++ b/firmware/baseband/sd_over_usb/usb_descriptor.c @@ -186,18 +186,26 @@ uint8_t usb_descriptor_string_manufacturer[] = { uint8_t usb_descriptor_string_product[] = { #ifdef HACKRF_ONE - 22, // bLength + 43, // bLength USB_DESCRIPTOR_TYPE_STRING, // bDescriptorType - 'H', 0x00, + 'P', 0x00, + 'o', 0x00, + 'r', 0x00, + 't', 0x00, + 'a', 0x00, + 'P', 0x00, 'a', 0x00, 'c', 0x00, 'k', 0x00, - 'R', 0x00, - 'F', 0x00, ' ', 0x00, - 'O', 0x00, - 'n', 0x00, + + 'M', 0x00, + 'a', 0x00, + 'y', 0x00, + 'h', 0x00, 'e', 0x00, + 'm', 0x00, + #elif JAWBREAKER 36, // bLength USB_DESCRIPTOR_TYPE_STRING, // bDescriptorType