storage 2

This commit is contained in:
Polprzewodnikowy 2021-12-10 17:15:43 +01:00
parent 49bae164bb
commit 0af8989a82
5 changed files with 73 additions and 15 deletions

View File

@ -1,5 +1,5 @@
MEMORY { MEMORY {
rdram (rwx) : org = 0x80300000, len = 1M rdram (rwx) : org = 0x80000400, len = 4M - 0x400
flash (r) : org = 0xB0000000, len = 90k flash (r) : org = 0xB0000000, len = 90k
} }

View File

@ -21,10 +21,11 @@ static const ipl3_crc32_t ipl3_crc32[] = {
{ .crc32 = 0x0B050EE0, .seed = 0x78, .version = 0 }, // CICx103 { .crc32 = 0x0B050EE0, .seed = 0x78, .version = 0 }, // CICx103
{ .crc32 = 0x98BC2C86, .seed = 0x91, .version = 0 }, // CICx105 { .crc32 = 0x98BC2C86, .seed = 0x91, .version = 0 }, // CICx105
{ .crc32 = 0xACC8580A, .seed = 0x85, .version = 0 }, // CICx106 { .crc32 = 0xACC8580A, .seed = 0x85, .version = 0 }, // CICx106
{ .crc32 = 0x0C965795, .seed = 0xDD, .version = 0 }, // JP 64DD { .crc32 = 0x10C68B18, .seed = 0xDD, .version = 0 }, // NDXJ0
{ .crc32 = 0x10C68B18, .seed = 0xDD, .version = 0 }, // JP 64DD dev { .crc32 = 0xBC605D0A, .seed = 0xDD, .version = 0 }, // NDDJ0
{ .crc32 = 0x0E018159, .seed = 0xDD, .version = 0 }, // JP 64DD retail { .crc32 = 0x502C4466, .seed = 0xDD, .version = 0 }, // NDDJ1
{ .crc32 = 0x8FEBA21E, .seed = 0xDE, .version = 0 }, // US 64DD retail { .crc32 = 0x0C965795, .seed = 0xDD, .version = 0 }, // NDDJ2
{ .crc32 = 0x8FEBA21E, .seed = 0xDE, .version = 0 }, // NDDE0
}; };

View File

@ -7,6 +7,8 @@ void main (void) {
boot_info_t boot_info; boot_info_t boot_info;
sc64_info_t sc64_info; sc64_info_t sc64_info;
boot_info.reset_type = OS_INFO->reset_type;
sc64_get_info(&sc64_info); sc64_get_info(&sc64_info);
LOG_I("Bootloader version: %.32s\r\n", sc64_info.bootloader_version); LOG_I("Bootloader version: %.32s\r\n", sc64_info.bootloader_version);
@ -18,17 +20,17 @@ void main (void) {
break; break;
case BOOT_MODE_ROM: case BOOT_MODE_ROM:
boot_info.device_type = BOOT_DEVICE_TYPE_ROM;
LOG_I("Running ROM from SDRAM\r\n"); LOG_I("Running ROM from SDRAM\r\n");
boot_info.device_type = BOOT_DEVICE_TYPE_ROM;
break; break;
case BOOT_MODE_DDIPL: case BOOT_MODE_DDIPL:
boot_info.device_type = BOOT_DEVICE_TYPE_DD;
LOG_I("Running DDIPL from SDRAM\r\n"); LOG_I("Running DDIPL from SDRAM\r\n");
boot_info.device_type = BOOT_DEVICE_TYPE_DD;
break; break;
case BOOT_MODE_DIRECT: case BOOT_MODE_DIRECT:
LOG_I("Running bootloader from SDRAM, running menu from FSD\r\n"); LOG_I("Running bootloader from SDRAM - running menu from FSD\r\n");
storage_run_menu(STORAGE_BACKEND_USB, &boot_info, &sc64_info); storage_run_menu(STORAGE_BACKEND_USB, &boot_info, &sc64_info);
break; break;
@ -37,8 +39,6 @@ void main (void) {
while (1); while (1);
} }
boot_info.reset_type = OS_INFO->reset_type;
if (sc64_info.tv_type != TV_TYPE_UNKNOWN) { if (sc64_info.tv_type != TV_TYPE_UNKNOWN) {
boot_info.tv_type = sc64_info.tv_type; boot_info.tv_type = sc64_info.tv_type;
LOG_I("Using provided TV type: %d\r\n", boot_info.tv_type); LOG_I("Using provided TV type: %d\r\n", boot_info.tv_type);
@ -54,14 +54,14 @@ void main (void) {
if (sc64_info.cic_seed != 0xFFFF) { if (sc64_info.cic_seed != 0xFFFF) {
boot_info.cic_seed = sc64_info.cic_seed & 0xFF; boot_info.cic_seed = sc64_info.cic_seed & 0xFF;
boot_info.version = (sc64_info.cic_seed >> 8) & 0x01; boot_info.version = (sc64_info.cic_seed >> 8) & 0x01;
LOG_I("Using provided CIC seed and version: 0x%02X / %d\r\n", boot_info.cic_seed, boot_info.version); LOG_I("Using provided CIC seed and version: 0x%02X.%d\r\n", boot_info.cic_seed, boot_info.version);
} else { } else {
if (boot_get_cic_seed_version(&boot_info)) { if (boot_get_cic_seed_version(&boot_info)) {
LOG_I("Using CIC seed and version guessed from IPL3: 0x%02X / %d\r\n", boot_info.cic_seed, boot_info.version); LOG_I("Using CIC seed and version guessed from IPL3: 0x%02X.%d\r\n", boot_info.cic_seed, boot_info.version);
} else { } else {
boot_info.cic_seed = 0x3F; boot_info.cic_seed = 0x3F;
boot_info.version = 0; boot_info.version = 0;
LOG_I("Using 6102/7101 CIC seed and version: 0x%02X / %d\r\n", boot_info.cic_seed, boot_info.version); LOG_I("Using 6102/7101 CIC seed and version: 0x%02X.%d\r\n", boot_info.cic_seed, boot_info.version);
} }
} }

View File

@ -1,7 +1,64 @@
#include "storage.h" #include "storage.h"
#include "sc64.h"
#include "fatfs/ff.h"
static const char *fatfs_error_codes[] = {
"(0) Succeeded",
"(1) A hard error occurred in the low level disk I/O layer",
"(2) Assertion failed",
"(3) The physical drive cannot work",
"(4) Could not find the file",
"(5) Could not find the path",
"(6) The path name format is invalid",
"(7) Access denied due to prohibited access or directory full",
"(8) Access denied due to prohibited access",
"(9) The file/directory object is invalid",
"(10) The physical drive is write protected",
"(11) The logical drive number is invalid",
"(12) The volume has no work area",
"(13) There is no valid FAT volume",
"(14) The f_mkfs() aborted due to any problem",
"(15) Could not get a grant to access the volume within defined period",
"(16) The operation is rejected according to the file sharing policy",
"(17) LFN working buffer could not be allocated",
"(18) Number of open files > FF_FS_LOCK",
"(19) Given parameter is invalid",
};
#define FF_CHECK(x) { \
FRESULT fatfs_result = x; \
if (fatfs_result) { \
LOG_E("fatfs error \"%s\" at [%s:%d] in expr: %s\r\n", fatfs_error_codes[fatfs_result], __FILE__, __LINE__, #x); \
while (1); \
} \
}
void storage_run_menu (storage_backend_t storage_backend, boot_info_t *boot_info, sc64_info_t *sc64_info) { void storage_run_menu (storage_backend_t storage_backend, boot_info_t *boot_info, sc64_info_t *sc64_info) {
// TODO: Implement ELF loader here FATFS fs;
FIL fil;
if (storage_backend == STORAGE_BACKEND_SD) {
FF_CHECK(f_mount(&fs, "0:", 1));
FF_CHECK(f_chdrive("0:"));
} else if (storage_backend == STORAGE_BACKEND_USB) {
FF_CHECK(f_mount(&fs, "1:", 1));
FF_CHECK(f_chdrive("1:"));
} else {
LOG_E("Unknown storage backend %d\r\n", storage_backend);
while (1); while (1);
}
FF_CHECK(f_open(&fil, "sc64menu.elf", FA_READ));
// TODO: Implement ELF loader here
FF_CHECK(f_close(&fil));
// TODO: Execute ELF here
// menu(&boot_info, &sc64_info);
boot_info->device_type = BOOT_DEVICE_TYPE_ROM;
} }

View File

@ -15,7 +15,7 @@ SECTIONS {
. = ALIGN(4); . = ALIGN(4);
_stext = .; _stext = .;
*(.text .text.* .gnu.linkonce.t.*) *(.text .text.* .gnu.linkonce.t.*)
*(.rdata .rodata .rodata.* .gnu.linkonce.r.*) *(.rodata .rodata.* .gnu.linkonce.r.*)
. = ALIGN(4); . = ALIGN(4);
_etext = .; _etext = .;
} > ram AT > rom } > ram AT > rom