From 97ba19af24b566f7cf71f20e8c7ca7b38ae0eb51 Mon Sep 17 00:00:00 2001 From: Jared Boone Date: Fri, 1 Jul 2016 10:37:22 -0700 Subject: [PATCH] Change M4 loader to use image tags. Also finish moving HackRF binary to tagged image region. --- firmware/CMakeLists.txt | 2 +- firmware/application/ais_app.cpp | 2 +- firmware/application/analog_audio_app.cpp | 14 ++++++++++-- firmware/application/baseband_api.cpp | 4 ++-- firmware/application/baseband_api.hpp | 2 +- firmware/application/capture_app.cpp | 2 +- firmware/application/core_control.cpp | 28 +++++++++++++++-------- firmware/application/core_control.hpp | 2 +- firmware/application/ert_app.cpp | 2 +- firmware/application/main.cpp | 2 +- firmware/application/tpms_app.cpp | 2 +- firmware/common/spi_image.hpp | 9 ++------ firmware/tools/make_spi_image.py | 23 +++++-------------- 13 files changed, 49 insertions(+), 45 deletions(-) diff --git a/firmware/CMakeLists.txt b/firmware/CMakeLists.txt index 8d33aec56..68c1e2e24 100644 --- a/firmware/CMakeLists.txt +++ b/firmware/CMakeLists.txt @@ -36,7 +36,7 @@ add_subdirectory(bootstrap) add_custom_target( ${PROJECT_NAME}.bin - COMMAND ${MAKE_SPI_IMAGE} ${bootstrap_BINARY_DIR}/bootstrap.bin ${HACKRF_FIRMWARE_IMAGE} ${baseband_BINARY_DIR}/baseband.img ${application_BINARY_DIR}/application.bin ${PROJECT_NAME}.bin + COMMAND ${MAKE_SPI_IMAGE} ${bootstrap_BINARY_DIR}/bootstrap.bin ${baseband_BINARY_DIR}/baseband.img ${application_BINARY_DIR}/application.bin ${PROJECT_NAME}.bin DEPENDS bootstrap.bin baseband.img application.bin ) diff --git a/firmware/application/ais_app.cpp b/firmware/application/ais_app.cpp index 47da4bbda..39cc0e14b 100644 --- a/firmware/application/ais_app.cpp +++ b/firmware/application/ais_app.cpp @@ -286,7 +286,7 @@ void AISRecentEntryDetailView::set_entry(const AISRecentEntry& entry) { } AISAppView::AISAppView(NavigationView&) { - baseband::run_image(portapack::spi_flash::baseband); + baseband::run_image(portapack::spi_flash::image_tag_ais); add_children({ { &label_channel, diff --git a/firmware/application/analog_audio_app.cpp b/firmware/application/analog_audio_app.cpp index a7304aca7..fa2ba2e4e 100644 --- a/firmware/application/analog_audio_app.cpp +++ b/firmware/application/analog_audio_app.cpp @@ -79,8 +79,6 @@ NBFMOptionsView::NBFMOptionsView( AnalogAudioView::AnalogAudioView( NavigationView& nav ) { - baseband::run_image(portapack::spi_flash::baseband); - add_children({ { &rssi, &channel, @@ -273,6 +271,18 @@ void AnalogAudioView::update_modulation(const ReceiverModel::Mode modulation) { audio::output::mute(); record_view.stop(); + portapack::spi_flash::image_tag_t image_tag; + switch(modulation) { + case ReceiverModel::Mode::AMAudio: image_tag = portapack::spi_flash::image_tag_am_audio; break; + case ReceiverModel::Mode::NarrowbandFMAudio: image_tag = portapack::spi_flash::image_tag_nfm_audio; break; + case ReceiverModel::Mode::WidebandFMAudio: image_tag = portapack::spi_flash::image_tag_wfm_audio; break; + case ReceiverModel::Mode::SpectrumAnalysis: image_tag = portapack::spi_flash::image_tag_wideband_spectrum; break; + default: + return; + } + + baseband::run_image(image_tag); + const auto is_wideband_spectrum_mode = (modulation == ReceiverModel::Mode::SpectrumAnalysis); receiver_model.set_baseband_configuration({ .mode = toUType(modulation), diff --git a/firmware/application/baseband_api.cpp b/firmware/application/baseband_api.cpp index 93dd0180f..599a31b8a 100644 --- a/firmware/application/baseband_api.cpp +++ b/firmware/application/baseband_api.cpp @@ -90,8 +90,8 @@ void stop() { send_message(&message); } -void run_image(const portapack::spi_flash::region_t image_region) { - m4_init(image_region, portapack::memory::map::m4_code); +void run_image(const portapack::spi_flash::image_tag_t image_tag) { + m4_init(image_tag, portapack::memory::map::m4_code); creg::m4txevent::enable(); } diff --git a/firmware/application/baseband_api.hpp b/firmware/application/baseband_api.hpp index f909b1a63..c12b08fdb 100644 --- a/firmware/application/baseband_api.hpp +++ b/firmware/application/baseband_api.hpp @@ -55,7 +55,7 @@ struct WFMConfig { void start(BasebandConfiguration configuration); void stop(); -void run_image(const portapack::spi_flash::region_t image_region); +void run_image(const portapack::spi_flash::image_tag_t image_tag); void shutdown(); void spectrum_streaming_start(); diff --git a/firmware/application/capture_app.cpp b/firmware/application/capture_app.cpp index 58af2526a..9d1761a2d 100644 --- a/firmware/application/capture_app.cpp +++ b/firmware/application/capture_app.cpp @@ -32,7 +32,7 @@ using namespace portapack; namespace ui { CaptureAppView::CaptureAppView(NavigationView& nav) { - baseband::run_image(portapack::spi_flash::baseband); + baseband::run_image(portapack::spi_flash::image_tag_capture); add_children({ { &rssi, diff --git a/firmware/application/core_control.cpp b/firmware/application/core_control.cpp index ebaca90d2..a0fcccc8a 100644 --- a/firmware/application/core_control.cpp +++ b/firmware/application/core_control.cpp @@ -38,17 +38,27 @@ using namespace lpc43xx; * I suppose I could force M4MEMMAP to an invalid memory reason which would * cause an exception and effectively halt the M4. But that feels gross. */ -void m4_init(const portapack::spi_flash::region_t from, const portapack::memory::region_t to) { - /* Initialize M4 code RAM */ - std::memcpy(reinterpret_cast(to.base()), from.base(), from.size); +void m4_init(const portapack::spi_flash::image_tag_t image_tag, const portapack::memory::region_t to) { + const portapack::spi_flash::chunk_t* chunk = reinterpret_cast(portapack::spi_flash::images.base()); + while(chunk->tag) { + if( chunk->tag == image_tag ) { + /* Initialize M4 code RAM */ + std::memcpy(reinterpret_cast(to.base()), &chunk->data[0], chunk->length); - /* M4 core is assumed to be sleeping with interrupts off, so we can mess - * with its address space and RAM without concern. - */ - LPC_CREG->M4MEMMAP = to.base(); + /* M4 core is assumed to be sleeping with interrupts off, so we can mess + * with its address space and RAM without concern. + */ + LPC_CREG->M4MEMMAP = to.base(); - /* Reset M4 core */ - LPC_RGU->RESET_CTRL[0] = (1 << 13); + /* Reset M4 core */ + LPC_RGU->RESET_CTRL[0] = (1 << 13); + + return; + } + chunk = chunk->next(); + } + + chDbgPanic("NoImg"); } void m4_request_shutdown() { diff --git a/firmware/application/core_control.hpp b/firmware/application/core_control.hpp index 3ec373fa7..09737705d 100644 --- a/firmware/application/core_control.hpp +++ b/firmware/application/core_control.hpp @@ -27,7 +27,7 @@ #include "memory_map.hpp" #include "spi_image.hpp" -void m4_init(const portapack::spi_flash::region_t from, const portapack::memory::region_t to); +void m4_init(const portapack::spi_flash::image_tag_t image_tag, const portapack::memory::region_t to); void m4_request_shutdown(); void m0_halt(); diff --git a/firmware/application/ert_app.cpp b/firmware/application/ert_app.cpp index 467dbbc24..711f1284b 100644 --- a/firmware/application/ert_app.cpp +++ b/firmware/application/ert_app.cpp @@ -121,7 +121,7 @@ void RecentEntriesView::draw( } ERTAppView::ERTAppView(NavigationView&) { - baseband::run_image(portapack::spi_flash::baseband); + baseband::run_image(portapack::spi_flash::image_tag_ert); add_children({ { &recent_entries_view, diff --git a/firmware/application/main.cpp b/firmware/application/main.cpp index 5e52ee7e0..93d496d33 100755 --- a/firmware/application/main.cpp +++ b/firmware/application/main.cpp @@ -91,7 +91,7 @@ int main(void) { sdcStop(&SDCD1); portapack::shutdown(); - m4_init(portapack::spi_flash::hackrf, portapack::memory::map::m4_code_hackrf); + m4_init(portapack::spi_flash::image_tag_hackrf, portapack::memory::map::m4_code_hackrf); m0_halt(); return 0; diff --git a/firmware/application/tpms_app.cpp b/firmware/application/tpms_app.cpp index f46b1549f..a56c97e86 100644 --- a/firmware/application/tpms_app.cpp +++ b/firmware/application/tpms_app.cpp @@ -164,7 +164,7 @@ void RecentEntriesView::draw( } TPMSAppView::TPMSAppView(NavigationView&) { - baseband::run_image(portapack::spi_flash::baseband); + baseband::run_image(portapack::spi_flash::image_tag_tpms); add_children({ { &rssi, diff --git a/firmware/common/spi_image.hpp b/firmware/common/spi_image.hpp index a09c593cc..e11437127 100644 --- a/firmware/common/spi_image.hpp +++ b/firmware/common/spi_image.hpp @@ -96,14 +96,9 @@ constexpr region_t bootstrap { .size = 0x10000, }; -constexpr region_t hackrf { +constexpr region_t images { .offset = 0x10000, - .size = 0x8000, -}; - -constexpr region_t baseband { - .offset = 0x20000, - .size = 0x8000, + .size = 0x30000, }; constexpr region_t application { diff --git a/firmware/tools/make_spi_image.py b/firmware/tools/make_spi_image.py index 646fa59ed..d5d98328a 100755 --- a/firmware/tools/make_spi_image.py +++ b/firmware/tools/make_spi_image.py @@ -26,7 +26,7 @@ import sys usage_message = """ PortaPack SPI flash image generator -Usage: +Usage: Where paths refer to the .bin files for each component project. """ @@ -36,25 +36,19 @@ def read_image(path): f.close() return data -def read_image_from_dfu(path): - data = read_image(path) - # Strip DFU header from file to get binary image. - return data[16:] - def write_image(data, path): f = open(path, 'wb') f.write(data) f.close() -if len(sys.argv) != 6: +if len(sys.argv) != 5: print(usage_message) sys.exit(-1) bootstrap_image = read_image(sys.argv[1]) -hackrf_image = read_image_from_dfu(sys.argv[2]) -baseband_image = read_image(sys.argv[3]) -application_image = read_image(sys.argv[4]) -output_path = sys.argv[5] +baseband_image = read_image(sys.argv[2]) +application_image = read_image(sys.argv[3]) +output_path = sys.argv[4] spi_size = 1048576 @@ -64,15 +58,10 @@ images = ( 'data': bootstrap_image, 'size': 0x10000, }, - { - 'name': 'hackrf', - 'data': hackrf_image, - 'size': 0x10000, - }, { 'name': 'baseband', 'data': baseband_image, - 'size': 0x20000, + 'size': 0x30000, }, { 'name': 'application',