From 496c77fe3e77a73b17898269a2a35eb20e8dcbfc Mon Sep 17 00:00:00 2001 From: furrtek Date: Tue, 5 Jan 2016 20:17:55 +0100 Subject: [PATCH] Module loading should work again Modules won't load if already loaded (dirty footprint hack) --- firmware/application/m4_startup.cpp | 7 ++-- firmware/application/ui_lcr.cpp | 7 ++-- firmware/application/ui_loadmodule.cpp | 32 ++++++++++++++++-- firmware/application/ui_loadmodule.hpp | 1 + firmware/application/ui_navigation.cpp | 18 +++++----- firmware/application/ui_xylos.cpp | 5 ++- firmware/application/ui_xylos.hpp | 3 +- firmware/baseband-tx.bin | Bin 25264 -> 33024 bytes firmware/baseband-tx/main.cpp | 15 ++++++-- firmware/baseband-tx/proc_xylos.cpp | 7 ++-- firmware/baseband-tx/proc_xylos.hpp | 4 +-- firmware/baseband.bin | Bin 31992 -> 33024 bytes firmware/baseband/main.cpp | 15 ++++++-- .../GCC/ARMCMx/LPC43xx_M0/ld/LPC43xx_M0.ld | 2 +- .../GCC/ARMCMx/LPC43xx_M4/ld/LPC43xx_M4.ld | 2 +- firmware/common/message.hpp | 12 +++++++ firmware/common/modules.h | 4 +-- firmware/portapack-h1-firmware.bin | Bin 405512 -> 409480 bytes firmware/tools/make_baseband_file.py | 27 +++++++++++++-- 19 files changed, 127 insertions(+), 34 deletions(-) diff --git a/firmware/application/m4_startup.cpp b/firmware/application/m4_startup.cpp index 59fc511a..0e493f1b 100644 --- a/firmware/application/m4_startup.cpp +++ b/firmware/application/m4_startup.cpp @@ -55,6 +55,7 @@ int m4_load_image(void) { uint32_t mod_size; UINT bw; uint8_t i; + uint16_t cnt; char md5sum[16]; FILINFO modinfo; FIL modfile; @@ -77,9 +78,11 @@ int m4_load_image(void) { f_lseek(&modfile, 6); f_read(&modfile, &mod_size, 4, &bw); f_lseek(&modfile, 256); - f_read(&modfile, reinterpret_cast(portapack::memory::map::m4_code.base()), mod_size, &bw); - LPC_RGU->RESET_CTRL[0] = (1 << 13); + // For some reason, f_read > 512 bytes at once crashes everything... :/ + for (cnt=0;cnt<256;cnt++) + f_read(&modfile, reinterpret_cast(portapack::memory::map::m4_code.base()+(cnt*256)), 256, &bw); f_close(&modfile); + LPC_RGU->RESET_CTRL[0] = (1 << 13); return 1; } f_close(&modfile); diff --git a/firmware/application/ui_lcr.cpp b/firmware/application/ui_lcr.cpp index d2d9e64b..098095d0 100644 --- a/firmware/application/ui_lcr.cpp +++ b/firmware/application/ui_lcr.cpp @@ -290,16 +290,17 @@ LCRView::LCRView( memcpy(shared_memory.lcrdata, lcrframe_f, 256); shared_memory.afsk_transmit_done = false; - shared_memory.afsk_repeat = ((portapack::persistent_memory::afsk_config() >> 8) & 0xFF); + shared_memory.afsk_repeat = (portapack::persistent_memory::afsk_config() >> 8) & 0xFF; message_map.register_handler(Message::ID::TXDone, [this,&transmitter_model](Message* const p) { + char str[8]; const auto message = static_cast(p); if (message->n > 0) { - char str[8]; + text_status.set(" "); strcpy(str, to_string_dec_int(message->n).c_str()); strcat(str, "/"); - strcat(str, to_string_dec_int(shared_memory.afsk_repeat).c_str()); + strcat(str, to_string_dec_int((portapack::persistent_memory::afsk_config() >> 8) & 0xFF).c_str()); text_status.set(str); } else { text_status.set("Done ! "); diff --git a/firmware/application/ui_loadmodule.cpp b/firmware/application/ui_loadmodule.cpp index d5dafdab..36569ed9 100644 --- a/firmware/application/ui_loadmodule.cpp +++ b/firmware/application/ui_loadmodule.cpp @@ -26,7 +26,7 @@ #include "ff.h" #include "hackrf_gpio.hpp" #include "portapack.hpp" - +#include "portapack_shared_memory.hpp" #include "hackrf_hal.hpp" #include @@ -50,11 +50,39 @@ void LoadModuleView::on_hide() { } void LoadModuleView::on_show() { + // Ask for MD5 signature and compare + ModuleIDMessage message; + auto& message_map = context().message_map(); + + message_map.unregister_handler(Message::ID::ModuleID); + + message_map.register_handler(Message::ID::ModuleID, + [this](Message* const p) { + uint8_t c; + const auto message = static_cast(p); + if (message->query == false) { // Shouldn't be needed + for (c=0;c<16;c++) { + if (message->md5_signature[c] != _hash[c]) break; + } + if (c == 16) { + text_info.set("Module already loaded :)"); + _mod_loaded = true; + } else { + loadmodule(); + } + } + } + ); + + message.query = true; + shared_memory.baseband_queue.push(message); +} + +void LoadModuleView::loadmodule() { auto& message_map = context().message_map(); message_map.register_handler(Message::ID::ReadyForSwitch, [this](Message* const p) { (void)p; - // const auto message = static_cast(p); if (m4_load_image()) { text_info.set("Module loaded :)"); _mod_loaded = true; diff --git a/firmware/application/ui_loadmodule.hpp b/firmware/application/ui_loadmodule.hpp index f3bc99c3..ab2dfc67 100644 --- a/firmware/application/ui_loadmodule.hpp +++ b/firmware/application/ui_loadmodule.hpp @@ -32,6 +32,7 @@ namespace ui { class LoadModuleView : public View { public: LoadModuleView(NavigationView& nav, const char * hash, View* new_view); + void loadmodule(); void on_show() override; void on_hide() override; diff --git a/firmware/application/ui_navigation.cpp b/firmware/application/ui_navigation.cpp index 49a9a92f..35021536 100644 --- a/firmware/application/ui_navigation.cpp +++ b/firmware/application/ui_navigation.cpp @@ -111,19 +111,19 @@ void NavigationView::focus() { /* SystemMenuView ********************************************************/ SystemMenuView::SystemMenuView(NavigationView& nav) { - add_items<10>({ { + add_items<11>({ { { "Play dead", ui::Color::red(), [&nav](){ nav.push(new PlayDeadView { nav, false }); } }, - { "Receiver", ui::Color::cyan(), [&nav](){ nav.push(new ReceiverView { nav, receiver_model }); } }, + { "Receiver", ui::Color::cyan(), [&nav](){ nav.push(new LoadModuleView { nav, md5_baseband, new ReceiverView { nav, receiver_model }}); } }, //{ "Nordic/BTLE RX", ui::Color::cyan(), [&nav](){ nav.push(new NotImplementedView { nav }); } }, - { "Jammer", ui::Color::white(), [&nav](){ nav.push(new JammerView { nav, transmitter_model }); } }, + { "Jammer", ui::Color::white(), [&nav](){ nav.push(new LoadModuleView { nav, md5_baseband, new JammerView { nav, transmitter_model }}); } }, //{ "Audio file TX", ui::Color::white(), [&nav](){ nav.push(new NotImplementedView { nav }); } }, //{ "Encoder TX", ui::Color::green(), [&nav](){ nav.push(new NotImplementedView { nav }); } }, - { "Whistle", ui::Color::purple(), [&nav](){ nav.push(new WhistleView { nav, transmitter_model }); } }, - //{ "SIGFOX RX", ui::Color::orange(), [&nav](){ nav.push(new SIGFRXView { nav, receiver_model }); } }, - //{ "RDS TX", ui::Color::yellow(), [&nav](){ nav.push(new LoadModuleView { nav, md5_baseband_tx, new RDSView { nav, transmitter_model }}; } }, - { "Xylos TX", ui::Color::orange(), [&nav](){ nav.push(new XylosView { nav, transmitter_model }); } }, - //{ "AFSK RX", ui::Color::cyan(), [&nav](){ nav.push(new AFSKRXView { nav, receiver_model }); } }, - { "TEDI/LCR TX", ui::Color::yellow(), [&nav](){ nav.push(new LCRView { nav, transmitter_model }); } }, + { "Whistle", ui::Color::purple(), [&nav](){ nav.push(new LoadModuleView { nav, md5_baseband, new WhistleView { nav, transmitter_model }}); } }, + //{ "SIGFOX RX", ui::Color::orange(), [&nav](){ nav.push(new LoadModuleView { nav, md5_baseband, new SIGFRXView { nav, receiver_model }}); } }, + { "RDS TX", ui::Color::yellow(), [&nav](){ nav.push(new LoadModuleView { nav, md5_baseband_tx, new RDSView { nav, transmitter_model }}); } }, + { "Xylos TX", ui::Color::orange(), [&nav](){ nav.push(new LoadModuleView { nav, md5_baseband_tx, new XylosView { nav, transmitter_model }}); } }, + //{ "AFSK RX", ui::Color::cyan(), [&nav](){ nav.push(new LoadModuleView { nav, md5_baseband, new AFSKRXView { nav, receiver_model }}); } }, + { "TEDI/LCR TX", ui::Color::yellow(), [&nav](){ nav.push(new LoadModuleView { nav, md5_baseband_tx, new LCRView { nav, transmitter_model }}); } }, { "Setup", ui::Color::white(), [&nav](){ nav.push(new SetupMenuView { nav }); } }, { "About", ui::Color::white(), [&nav](){ nav.push(new AboutView { nav }); } }, { "Debug", ui::Color::white(), [&nav](){ nav.push(new DebugMenuView { nav }); } }, diff --git a/firmware/application/ui_xylos.cpp b/firmware/application/ui_xylos.cpp index 1083b615..ef011df7 100644 --- a/firmware/application/ui_xylos.cpp +++ b/firmware/application/ui_xylos.cpp @@ -1,6 +1,7 @@ /* * Copyright (C) 2015 Jared Boone, ShareBrained Technology, Inc. - * + * Copyright (C) 2016 Furrtek + * * This file is part of PortaPack. * * This program is free software; you can redistribute it and/or modify @@ -106,6 +107,8 @@ void XylosView::upd_message() { else ccirmessage[c] -= 0x30; } + + ccirmessage[20] = 0xFF; } void XylosView::journuit() { diff --git a/firmware/application/ui_xylos.hpp b/firmware/application/ui_xylos.hpp index 93b560c4..59525eae 100644 --- a/firmware/application/ui_xylos.hpp +++ b/firmware/application/ui_xylos.hpp @@ -1,6 +1,7 @@ /* * Copyright (C) 2015 Jared Boone, ShareBrained Technology, Inc. - * + * Copyright (C) 2016 Furrtek + * * This file is part of PortaPack. * * This program is free software; you can redistribute it and/or modify diff --git a/firmware/baseband-tx.bin b/firmware/baseband-tx.bin index cd98095ecc9e822ba6454e955b3d9ce983d81885..8b0ee7fc9b028ef0842536640708d17e4e4ab557 100644 GIT binary patch delta 4219 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�er-6lm)7?!rFb=)RjeMC) zEUSQq0mUKi9otquIUdCopF`S{pd)HqNA65Aq~~4P$|nV1;#;GU3x}YXt9S#SbY}xU z={Ys8WG?X;D!Rga@AXwwFWnK9fnB!ezwRi>lC+gb8#_wUByH=cH%MWUu~>SNp8;wK z@f-MwDTp7$;EA&{|4~$Y@42I*uGaLBuY|y;|B>2K-^!W&Zu!U92u|WZY*`cywBs-F zrj+s)JV78S&|B9MrN%%sUnPastW@Z9Uh}#4bW1xM=0#6{XI`XXm^H|XcF>)u@Zq7w zLN69HM(&D~k8AR|E4z_q1DJZGWh*~91B2m};{0iq9R?gE*D!bMBW~aX} zg3ZlHW)VT$D;`vt%gWlMcqrVp5|3~jpjU${1pOS`>uKF4=bPl_L=`zOdGy#t9$a}H zQV`ma8@P6e%lnOn3^ca1aC6CH$p^I+evwOo#4{z33zSd`%bX14y}e102LQJKm>8z` zLx=ch-<_)w_R44a+)6Tis)}M3lEqVZ53cb^AX8M|&lJ^xOfi2U2~RPG`rLo7?GG8B z`v{qrvQoXj$M62u-(p); + if (message->query == true) { // Shouldn't be needed + memcpy(reply.md5_signature, (const void *)(0x10087FF0), 16); + reply.query = false; + shared_memory.application_queue.push(reply); + } + } + ); message_handlers.register_handler(Message::ID::BasebandConfiguration, [&message_handlers](const Message* const p) { @@ -538,7 +549,7 @@ int main(void) { baseband_thread.baseband_processor = new XylosProcessor(); break; - case 0xFF: + case SWITCH: wait_for_switch(); default: diff --git a/firmware/baseband-tx/proc_xylos.cpp b/firmware/baseband-tx/proc_xylos.cpp index b97089d3..f0528ddb 100644 --- a/firmware/baseband-tx/proc_xylos.cpp +++ b/firmware/baseband-tx/proc_xylos.cpp @@ -1,7 +1,7 @@ /* - * Copyright (C) 2014 Jared Boone, ShareBrained Technology, Inc. + * Copyright (C) 2015 Jared Boone, ShareBrained Technology, Inc. * Copyright (C) 2016 Furrtek - * + * * This file is part of PortaPack. * * This program is free software; you can redistribute it and/or modify @@ -45,11 +45,10 @@ void XylosProcessor::execute(buffer_c8_t buffer) { digit = shared_memory.xylosdata[byte_pos++]; } - if (!digit) { + if (digit == 0xFF) { message.n = 25; // End of message code shared_memory.xylos_transmit_done = true; shared_memory.application_queue.push(message); - digit = 0; } sample_count = 0; diff --git a/firmware/baseband-tx/proc_xylos.hpp b/firmware/baseband-tx/proc_xylos.hpp index a9e2458d..933d3cb4 100644 --- a/firmware/baseband-tx/proc_xylos.hpp +++ b/firmware/baseband-tx/proc_xylos.hpp @@ -1,7 +1,7 @@ /* - * Copyright (C) 2014 Jared Boone, ShareBrained Technology, Inc. + * Copyright (C) 2015 Jared Boone, ShareBrained Technology, Inc. * Copyright (C) 2016 Furrtek - * + * * This file is part of PortaPack. * * This program is free software; you can redistribute it and/or modify diff --git a/firmware/baseband.bin b/firmware/baseband.bin index 99a0ae2d3c5d7977980396d58843822adec4d382..36ce9db2fec7f06088879e3434786cae697e15cb 100644 GIT binary patch delta 4429 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 delta 4254 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 diff --git a/firmware/baseband/main.cpp b/firmware/baseband/main.cpp index bdf520b5..439b3831 100755 --- a/firmware/baseband/main.cpp +++ b/firmware/baseband/main.cpp @@ -348,7 +348,7 @@ private: const auto baseband_buffer = new std::array(); - + char ram_loop[32]; typedef int (*fn_ptr)(void); fn_ptr loop_ptr; @@ -363,7 +363,6 @@ void wait_for_switch(void) { ReadyForSwitchMessage message; shared_memory.application_queue.push(message); (*loop_ptr)(); - return; } int main(void) { @@ -374,6 +373,18 @@ int main(void) { EventDispatcher event_dispatcher; auto& message_handlers = event_dispatcher.message_handlers(); + + message_handlers.register_handler(Message::ID::ModuleID, + [&message_handlers](Message* p) { + ModuleIDMessage reply; + auto message = static_cast(p); + if (message->query == true) { // Shouldn't be needed + memcpy(reply.md5_signature, (const void *)(0x10087FF0), 16); + reply.query = false; + shared_memory.application_queue.push(reply); + } + } + ); message_handlers.register_handler(Message::ID::BasebandConfiguration, [&message_handlers](const Message* const p) { diff --git a/firmware/chibios-portapack/os/ports/GCC/ARMCMx/LPC43xx_M0/ld/LPC43xx_M0.ld b/firmware/chibios-portapack/os/ports/GCC/ARMCMx/LPC43xx_M0/ld/LPC43xx_M0.ld index 6331b9bd..24951182 100755 --- a/firmware/chibios-portapack/os/ports/GCC/ARMCMx/LPC43xx_M0/ld/LPC43xx_M0.ld +++ b/firmware/chibios-portapack/os/ports/GCC/ARMCMx/LPC43xx_M0/ld/LPC43xx_M0.ld @@ -23,7 +23,7 @@ __process_stack_size__ = 0x1000; /* main() stack */ MEMORY { - flash : org = 0x00000000, len = 128k /* SPIFI flash @ 0x140????? */ + flash : org = 0x00000000, len = 256k /* SPIFI flash @ 0x140????? */ ram : org = 0x20000000, len = 64k /* AHB SRAM @ 0x20000000 */ } diff --git a/firmware/chibios-portapack/os/ports/GCC/ARMCMx/LPC43xx_M4/ld/LPC43xx_M4.ld b/firmware/chibios-portapack/os/ports/GCC/ARMCMx/LPC43xx_M4/ld/LPC43xx_M4.ld index df7b22d1..6a9bdea9 100755 --- a/firmware/chibios-portapack/os/ports/GCC/ARMCMx/LPC43xx_M4/ld/LPC43xx_M4.ld +++ b/firmware/chibios-portapack/os/ports/GCC/ARMCMx/LPC43xx_M4/ld/LPC43xx_M4.ld @@ -23,7 +23,7 @@ __process_stack_size__ = 0x1000; /* main() stack */ MEMORY { - flash : org = 0x00000000, len = 32k /* Local SRAM @ 0x10080000 */ + flash : org = 0x00000000, len = 32752 /* Local SRAM @ 0x10080000 */ ram : org = 0x10000000, len = 96k /* Local SRAM @ 0x10000000 */ } diff --git a/firmware/common/message.hpp b/firmware/common/message.hpp index 77181b94..e45512c5 100644 --- a/firmware/common/message.hpp +++ b/firmware/common/message.hpp @@ -51,6 +51,7 @@ public: Retune = 11, ReadyForSwitch = 12, AFSKData = 13, + ModuleID = 14, MAX }; @@ -297,6 +298,17 @@ public: int n = 0; }; +class ModuleIDMessage : public Message { +public: + ModuleIDMessage( + ) : Message { ID::ModuleID } + { + } + + bool query; + char md5_signature[16]; +}; + class ReadyForSwitchMessage : public Message { public: ReadyForSwitchMessage( diff --git a/firmware/common/modules.h b/firmware/common/modules.h index 26dd3977..36889193 100644 --- a/firmware/common/modules.h +++ b/firmware/common/modules.h @@ -1,2 +1,2 @@ -const char md5_baseband[16] = {0x20,0xb7,0x1a,0x68,0x28,0xda,0xc9,0xb8,0x01,0xb0,0xbd,0x68,0x0d,0xd5,0xd6,0xa7,}; -const char md5_baseband_tx[16] = {0xe5,0x29,0xb9,0xf0,0x81,0x50,0x45,0x69,0x24,0xaf,0xdd,0x4e,0xdb,0xaf,0xd8,0x97,}; +const char md5_baseband[16] = {0xef,0xc2,0x85,0x1d,0x83,0x0d,0x5c,0x18,0x55,0x7b,0x80,0x75,0xc9,0x6a,0x54,0xe1,}; +const char md5_baseband_tx[16] = {0xad,0xc6,0x44,0x4e,0xf4,0xe1,0xb8,0xb2,0x29,0x52,0x1d,0x33,0x1f,0xda,0x5d,0xd6,}; diff --git a/firmware/portapack-h1-firmware.bin b/firmware/portapack-h1-firmware.bin index 53acde85f2f98c8402c71b82c942cdad6f7add1c..69c06fdf2ed951371a6cf8d63d5171a5016308e3 100644 GIT binary patch delta 51189 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

w;=B5g&s;N@aKru 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έy>4fbGGeFyAA*}KhZ4`Ck9+lMia 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 16: name = name[0:15] pad_size = 16 - len(name) name += (data_default_byte * pad_size) info += name + + # Module MD5 footprint m.update(data) digest = m.digest() pad_size = 16 - len(digest) digest += (data_default_byte * pad_size) info += digest + + # Module description description = read_image(args + '/description') if len(description) > 214: description = description[0:213] pad_size = 214 - len(description) description += (data_default_byte * pad_size) info += description + + # Padding data = info + data + pad_size = (32768 + 256 - 16) - len(data) + data += (data_default_byte * pad_size) + data += digest write_file(data, args + '.bin') + + # Add to modules.h md5sum = '' for byte in digest: md5sum += '0x' + format(byte, '02x') + ',' h_data += 'const char md5_' + args.replace('-','_') + '[16] = {' + md5sum + '};\n' + + # Update original binary with MD5 footprint + write_file(data[256:(32768+256)], args + '/build/' + args + '.bin') write_file(h_data, 'common/modules.h')