Change M4 loader to use image tags.

Also finish moving HackRF binary to tagged image region.
This commit is contained in:
Jared Boone 2016-07-01 10:37:22 -07:00
parent 0e62876578
commit 97ba19af24
13 changed files with 49 additions and 45 deletions

View File

@ -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
)

View File

@ -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,

View File

@ -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),

View File

@ -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();
}

View File

@ -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();

View File

@ -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,

View File

@ -38,9 +38,12 @@ 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) {
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<const portapack::spi_flash::chunk_t*>(portapack::spi_flash::images.base());
while(chunk->tag) {
if( chunk->tag == image_tag ) {
/* Initialize M4 code RAM */
std::memcpy(reinterpret_cast<void*>(to.base()), from.base(), from.size);
std::memcpy(reinterpret_cast<void*>(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.
@ -49,6 +52,13 @@ void m4_init(const portapack::spi_flash::region_t from, const portapack::memory:
/* Reset M4 core */
LPC_RGU->RESET_CTRL[0] = (1 << 13);
return;
}
chunk = chunk->next();
}
chDbgPanic("NoImg");
}
void m4_request_shutdown() {

View File

@ -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();

View File

@ -121,7 +121,7 @@ void RecentEntriesView<ERTRecentEntries>::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,

View File

@ -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;

View File

@ -164,7 +164,7 @@ void RecentEntriesView<TPMSRecentEntries>::draw(
}
TPMSAppView::TPMSAppView(NavigationView&) {
baseband::run_image(portapack::spi_flash::baseband);
baseband::run_image(portapack::spi_flash::image_tag_tpms);
add_children({ {
&rssi,

View File

@ -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 {

View File

@ -26,7 +26,7 @@ import sys
usage_message = """
PortaPack SPI flash image generator
Usage: <command> <bootstrap_path> <hackrf_path> <baseband_path> <application_path> <output_path>
Usage: <command> <bootstrap_path> <baseband_path> <application_path> <output_path>
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',