diff options
Diffstat (limited to 'firmware/target')
-rw-r--r-- | firmware/target/hosted/rolo.c | 102 |
1 files changed, 102 insertions, 0 deletions
diff --git a/firmware/target/hosted/rolo.c b/firmware/target/hosted/rolo.c new file mode 100644 index 0000000000..432d69c86e --- /dev/null +++ b/firmware/target/hosted/rolo.c @@ -0,0 +1,102 @@ +/*************************************************************************** + * __________ __ ___. + * Open \______ \ ____ ____ | | _\_ |__ _______ ___ + * Source | _// _ \_/ ___\| |/ /| __ \ / _ \ \/ / + * Jukebox | | ( <_> ) \___| < | \_\ ( <_> > < < + * Firmware |____|_ /\____/ \___ >__|_ \|___ /\____/__/\_ \ + * \/ \/ \/ \/ \/ + * + * Copyright (C) 2020 Solomon Peachy + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY + * KIND, either express or implied. + * + ****************************************************************************/ + +#include "config.h" +#include "lcd.h" +#ifdef HAVE_REMOTE_LCD +#include "lcd-remote.h" +#endif +#include "audio.h" +#include "button.h" +#include "scroll_engine.h" +#include "storage.h" +#include "rolo.h" +#include "rbpaths.h" + +#include <unistd.h> +#include <stdio.h> + +#if defined(HAVE_BOOTDATA) && !defined(SIMULATOR) +#include "bootdata.h" +#include "crc32.h" +extern int write_bootdata(unsigned char* buf, int len, unsigned int boot_volume); /*rb-loader.c*/ +#endif + +static void rolo_error(const char *text, const char *text2) +{ + lcd_clear_display(); + lcd_puts(0, 0, "ROLO error:"); + lcd_puts_scroll(0, 1, text); + if (text2) + lcd_puts_scroll(0, 2, text2); + lcd_update(); + button_get(true); + button_get(true); + button_get(true); + lcd_scroll_stop(); +} + +int rolo_load(const char* filename) +{ + lcd_clear_display(); + lcd_puts(0, 0, "ROLO..."); + lcd_puts(0, 1, "Loading"); + lcd_update(); +#ifdef HAVE_REMOTE_LCD + lcd_remote_clear_display(); + lcd_remote_puts(0, 0, "ROLO..."); + lcd_remote_puts(0, 1, "Loading"); + lcd_remote_update(); +#endif + + audio_stop(); + +#if defined(HAVE_BOOTDATA) && !defined(SIMULATOR) + /* write the bootdata as if rolo were the bootloader */ + unsigned int crc = 0; + if (strcmp(filename, BOOTDIR "/" BOOTFILE) == 0) + crc = crc_32(boot_data.payload, boot_data.length, 0xffffffff); + + if(crc > 0 && crc == boot_data.crc) + write_bootdata(filebuf, filebuf_size, boot_data.boot_volume); /* rb-loader.c */ +#endif + +#ifdef HAVE_STORAGE_FLUSH + lcd_puts(0, 1, "Flushing storage buffers"); + lcd_update(); + storage_flush(); +#endif + + lcd_puts(0, 1, "Executing"); + lcd_update(); +#ifdef HAVE_REMOTE_LCD + lcd_remote_puts(0, 1, "Executing"); + lcd_remote_update(); +#endif + + char buf[256]; + snprintf(buf, sizeof(buf), "%s/%s", HOME_DIR, filename); + execl(buf, BOOTFILE, NULL); + + rolo_error("Failed to launch!", strerror(errno)); + + /* never reached */ + return 0; +} |