| Index: apps/diskmode/Makefile |
| — | — | @@ -3,6 +3,7 @@ |
| 4 | 4 | COMPRESS := true |
| 5 | 5 | |
| 6 | 6 | EMCOREDIR ?= ../../emcore/trunk/ |
| | 7 | +LIBBOOTDIR ?= ../../libs/boot/ |
| 7 | 8 | |
| 8 | 9 | ifeq ($(shell uname),WindowsNT) |
| 9 | 10 | CCACHE := |
| — | — | @@ -17,7 +18,7 @@ |
| 18 | 19 | OBJCOPY := $(CROSS)objcopy |
| 19 | 20 | ELF2ECA := $(CROSS)elf2emcoreapp |
| 20 | 21 | |
| 21 | | -LIBINCLUDES := |
| | 22 | +LIBINCLUDES := -I$(LIBBOOTDIR)/export |
| 22 | 23 | |
| 23 | 24 | CFLAGS += -Os -fno-pie -fno-stack-protector -fomit-frame-pointer -I. -I$(EMCOREDIR)/export $(LIBINCLUDES) -ffunction-sections -fdata-sections -mcpu=arm940t -DARM_ARCH=4 -marm |
| 24 | 25 | LDFLAGS += "$(shell $(CC) -print-libgcc-file-name)" --emit-relocs --gc-sections |
| Index: apps/diskmode/main.c |
| — | — | @@ -26,6 +26,7 @@ |
| 27 | 27 |
|
| 28 | 28 |
|
| 29 | 29 | #include "emcoreapp.h"
|
| | 30 | +#include "libboot.h"
|
| 30 | 31 |
|
| 31 | 32 |
|
| 32 | 33 | #define SCSI_TEST_UNIT_READY 0x00
|
| — | — | @@ -328,6 +329,16 @@ |
| 329 | 330 | static volatile bool ejected = false;
|
| 330 | 331 | static uint8_t __attribute__((aligned(32))) storage_buffer[0x10000];
|
| 331 | 332 |
|
| | 333 | +struct bootinfo_t
|
| | 334 | +{
|
| | 335 | + bool valid;
|
| | 336 | + void* firmware;
|
| | 337 | + int size;
|
| | 338 | + void* app;
|
| | 339 | + int argc;
|
| | 340 | + const char** argv;
|
| | 341 | +};
|
| | 342 | +
|
| 332 | 343 | static void listen()
|
| 333 | 344 | {
|
| 334 | 345 | usb_start_rx(usb, outep, &cbw, sizeof(cbw));
|
| — | — | @@ -842,8 +853,18 @@ |
| 843 | 854 | &usb_c1,
|
| 844 | 855 | };
|
| 845 | 856 |
|
| | 857 | +struct emcorelib_header* loadlib(uint32_t identifier, uint32_t version, char* filename)
|
| | 858 | +{
|
| | 859 | + struct emcorelib_header* lib = get_library(identifier, version, LIBSOURCE_BOOTFLASH, filename);
|
| | 860 | + if (!lib) panicf(PANIC_KILLTHREAD, "Could not load %s", filename);
|
| | 861 | + return lib;
|
| | 862 | +}
|
| | 863 | +
|
| 846 | 864 | static void main(int argc, const char** argv)
|
| 847 | 865 | {
|
| | 866 | + cprintf(3, "Welcome to Disk mode! Please wait until your device is detected by your operating system. It should not take more than 1-2 minutes. In case of issues, please ask for support.\n\n");
|
| | 867 | + cprintf(3, "When you're done transferring files, please use your operating system's Eject/Unmount option before unplugging the device.\n\n");
|
| | 868 | +
|
| 848 | 869 | storage_get_info(0, &storage_info);
|
| 849 | 870 |
|
| 850 | 871 | if (!storage_info.sector_size) panicf(PANIC_KILLTHREAD, "Sector size is zero!\n");
|
| — | — | @@ -911,7 +932,30 @@ |
| 912 | 933 |
|
| 913 | 934 | usbmanager_uninstall_custom();
|
| 914 | 935 |
|
| | 936 | + cprintf(3, "Disk mode completed successfully. Returning to the bootmenu...\n\n");
|
| | 937 | +
|
| | 938 | + struct bootinfo_t bootinfo =
|
| | 939 | + {
|
| | 940 | + .valid = false,
|
| | 941 | + .firmware = NULL,
|
| | 942 | + .size = 0,
|
| | 943 | + .app = NULL,
|
| | 944 | + .argc = 0,
|
| | 945 | + .argv = NULL
|
| | 946 | + };
|
| | 947 | +
|
| | 948 | + struct emcorelib_header* libboot = loadlib(LIBBOOT_IDENTIFIER,
|
| | 949 | + LIBBOOT_API_VERSION, "libboot ");
|
| | 950 | + struct libboot_api* boot = (struct libboot_api*)libboot->api;
|
| | 951 | +
|
| | 952 | + boot->load_from_flash(&bootinfo.app, &bootinfo.size, false, "bootmenu", 0);
|
| | 953 | +
|
| | 954 | + if (!bootinfo.app) {
|
| | 955 | + panicf(PANIC_KILLTHREAD, "Unable to start the bootmenu! Press MENU+SELECT to reboot your device.\n");
|
| | 956 | + }
|
| | 957 | +
|
| 915 | 958 | disk_mount(0);
|
| | 959 | + execimage(bootinfo.app, false, bootinfo.argc, bootinfo.argv);
|
| 916 | 960 | }
|
| 917 | 961 |
|
| 918 | 962 |
|