diff --git a/build/libraries/fatfs/ARM7/src/fatfs_loader.c b/build/libraries/fatfs/ARM7/src/fatfs_loader.c index 53161334..dcf917cd 100644 --- a/build/libraries/fatfs/ARM7/src/fatfs_loader.c +++ b/build/libraries/fatfs/ARM7/src/fatfs_loader.c @@ -65,7 +65,7 @@ static int menu_fd = -1; *---------------------------------------------------------------------------*/ BOOL FATFS_OpenRecentMenu( int driveno ) { - char *menufile = (char*)L"A:\\title\\00010001\\4d454e55\\content\\12123434.app"; + char *menufile = (char*)L"A:\\title\\00010001\\52434e4c\\content\\12123434.app"; if (driveno < 0 || driveno >= 26) { return FALSE; @@ -76,6 +76,7 @@ BOOL FATFS_OpenRecentMenu( int driveno ) { return FALSE; } + FATFS_SaveSrlFilename(FATFS_MEDIA_TYPE_NAND, menufile); return TRUE; } @@ -100,6 +101,71 @@ BOOL FATFS_OpenSpecifiedSrl( const char* menufile ) return TRUE; } +/*---------------------------------------------------------------------------* + Name: FATFS_SaveSrlFilename + + Description: store filename to HW_TWL_FS_BOOT_SRL_PATH_BUF + + ファイル名をHW_TWL_FS_BOOT_SRL_PATH_BUFに書き込みます。 + + Arguments: media media type + filename target filename + + Returns: None + *---------------------------------------------------------------------------*/ +BOOL FATFS_SaveSrlFilename( FATFSMediaType media, const char* filename ) +{ + char* dest = (char*)HW_TWL_FS_BOOT_SRL_PATH_BUF; + const char nandStr[] = "nand:/"; + const char sdmcStr[] = "sdmc:/"; + + if ( filename[2] == ':' ) // ドライブレターは削除 + { + filename += 4; + } + if ( filename[0] == '\\' ) // 先頭のパス記号は削除 + { + filename += 2; + } + switch( media ) + { + case FATFS_MEDIA_TYPE_NAND: + MI_CpuCopy8(nandStr, dest, sizeof(nandStr)-1); + dest += sizeof(nandStr)-1; + break; + case FATFS_MEDIA_TYPE_SD: + MI_CpuCopy8(sdmcStr, dest, sizeof(sdmcStr)-1); + dest += sizeof(sdmcStr)-1; + break; + default: + return FALSE; + } + // unicode詰め (ASCII only) + while ( dest < (char*)HW_TWL_ROM_HEADER_BUF ) + { + if ( *filename == '\\' ) // パス記号変換 + { + *dest++ = '/'; + filename++; + } + else if ( *filename != 0 ) // 通常コピー + { + *dest++ = *filename++; + } + else if ( *(filename + 1) != 0 ) // \0が連続していないならunicodeの詰めるべき隙間 + { + filename++; // omit + } + else // \0が連続しているなら終端 + { + MI_CpuClear8( dest, HW_TWL_ROM_HEADER_BUF - (u32)dest ); // 残りバッファのクリア + break; + } + } + OS_TPrintf("Stored: %s\n", (char*)HW_TWL_FS_BOOT_SRL_PATH_BUF); + return TRUE; +} + /*---------------------------------------------------------------------------* Name: FATFS_GetSrlDescriptor diff --git a/build/libraries/mi/ARM9/mi_loader.c b/build/libraries/mi/ARM9/mi_loader.c index 9758ba8a..6160f075 100644 --- a/build/libraries/mi/ARM9/mi_loader.c +++ b/build/libraries/mi/ARM9/mi_loader.c @@ -290,7 +290,7 @@ BOOL MI_LoadHeader( SVCSignHeapContext* pool, const void* rsa_key ) #endif if ( result ) { - DC_FlushRange( rh, HW_TWL_ROM_HEADER_BUF_SIZE ); + DC_StoreRange( rh, HW_TWL_ROM_HEADER_BUF_SIZE ); PXI_NotifyID( FIRM_PXI_ID_AUTH_HEADER ); PXI_SendDataByFifo( PXI_FIFO_TAG_DATA, sd.aes_key_seed, AES_BLOCK_SIZE ); // DS互換ヘッダコピー diff --git a/build/libraries/os/common/os_boot.c b/build/libraries/os/common/os_boot.c index 44985ba9..8bfc6b85 100644 --- a/build/libraries/os/common/os_boot.c +++ b/build/libraries/os/common/os_boot.c @@ -54,14 +54,29 @@ void OS_BootWithRomHeaderFromFIRM( ROM_Header* rom_header ) /* ITCM全クリア */ clr_list[i++] = (u32)HW_ITCM; clr_list[i++] = (u32)HW_ITCM_SIZE; -#else - /* CODEとSTACKの隙間をクリア */ + /* FS Parameters領域のクリア (暫定) */ +// clr_list[i++] = (u32)HW_TWL_FS_MOUNT_INFO_BUF; // 0x02ffdc00 - 0x02ffddff +// clr_list[i++] = (u32)HW_TWL_ROM_HEADER_BUF - (u32)HW_TWL_FS_MOUNT_INFO_BUF; + /* PSEG1/RED Reserved領域のクリア (暫定) */ + clr_list[i++] = (u32)HW_MAIN_MEM_SHARED; // 0x02fff000 - 0x02fffa7f + clr_list[i++] = (u32)HW_PSEG1_RESERVED_1_END - (u32)HW_MAIN_MEM_SHARED; + /* System Shared領域のクリア (暫定) */ + clr_list[i++] = (u32)HW_BOOT_CHECK_INFO_BUF; // 0x02fffc00 - 0x02fffc1f + clr_list[i++] = (u32)HW_BOOT_CHECK_INFO_BUF_END - (u32)HW_BOOT_CHECK_INFO_BUF; + clr_list[i++] = (u32)HW_BOOT_SHAKEHAND_9; // 0x02fffc24 - 0x02fffd7f + clr_list[i++] = (u32)HW_NVRAM_USER_INFO_END - (u32)HW_BOOT_SHAKEHAND_9; + clr_list[i++] = (u32)HW_ARENA_INFO_BUF; // 0x02fffda0 - 0x02fffdff + clr_list[i++] = (u32)HW_ROM_HEADER_BUF - (u32)HW_ARENA_INFO_BUF; + clr_list[i++] = (u32)HW_PXI_SIGNAL_PARAM_ARM9; // 0x02ffff80 - 0x02fffffd + clr_list[i++] = (u32)HW_CMD_AREA - (u32)HW_PXI_SIGNAL_PARAM_ARM9; +#else // SDK_ARM7 + /* REBOOT_ExecuteのCODEとSTACKの隙間をクリア */ if ((u32)stack_top > (u32)OS_BOOT_CODE_BUF - OS_BOOT_CODE_SIZE - OS_BOOT_STACK_SIZE_MIN - sizeof(clr_list)) { - clr_list[i++] = (u32)OS_BOOT_CODE_BUF + (u32)OS_BOOT_CODE_SIZE; - clr_list[i++] = (u32)stack_top - (u32)OS_BOOT_CODE_BUF - OS_BOOT_CODE_SIZE - OS_BOOT_STACK_SIZE_MIN - sizeof(clr_list); + clr_list[i++] = (u32)OS_BOOT_CODE_BUF + OS_BOOT_CODE_SIZE; + clr_list[i++] = (u32)stack_top - OS_BOOT_STACK_SIZE_MIN - sizeof(clr_list) - (u32)OS_BOOT_CODE_BUF - OS_BOOT_CODE_SIZE; } -#endif +#endif // SDK_ARM7 clr_list[i++] = NULL; REBOOT_Execute(entry, wram_reg, clr_list, code_buf, stack_top, scfg, jtag); OS_Terminate(); diff --git a/build/nandfirm/sdmc-launcher/ARM7/main.c b/build/nandfirm/sdmc-launcher/ARM7/main.c index 64b13b58..6f3a2b90 100644 --- a/build/nandfirm/sdmc-launcher/ARM7/main.c +++ b/build/nandfirm/sdmc-launcher/ARM7/main.c @@ -136,19 +136,19 @@ static BOOL Fatfs4sdmcInit(void) switch ( PAD_Read() & PAD_KEYPORT_MASK ) { case 0: - result = FATFS_OpenSpecifiedSrl( MENU_FILE ); + result = FATFS_OpenSpecifiedSrl( MENU_FILE ) && FATFS_SaveSrlFilename( BOOT_DEVICE, MENU_FILE ); break; case PAD_BUTTON_A: - result = FATFS_OpenSpecifiedSrl( MENU_FILE_A ); + result = FATFS_OpenSpecifiedSrl( MENU_FILE_A ) && FATFS_SaveSrlFilename( BOOT_DEVICE, MENU_FILE_A ); break; case PAD_BUTTON_B: - result = FATFS_OpenSpecifiedSrl( MENU_FILE_B ); + result = FATFS_OpenSpecifiedSrl( MENU_FILE_B ) && FATFS_SaveSrlFilename( BOOT_DEVICE, MENU_FILE_B ); break; case PAD_BUTTON_L: - result = FATFS_OpenSpecifiedSrl( MENU_FILE_L ); + result = FATFS_OpenSpecifiedSrl( MENU_FILE_L ) && FATFS_SaveSrlFilename( BOOT_DEVICE, MENU_FILE_L ); break; case PAD_BUTTON_R: - result = FATFS_OpenSpecifiedSrl( MENU_FILE_R ); + result = FATFS_OpenSpecifiedSrl( MENU_FILE_R ) && FATFS_SaveSrlFilename( BOOT_DEVICE, MENU_FILE_R ); break; default: OS_SetDebugLED( (u8)(PAD_Read() & PAD_KEYPORT_MASK) ); diff --git a/include/firm/fatfs/ARM7/fatfs_loader.h b/include/firm/fatfs/ARM7/fatfs_loader.h index 64553d12..bb9c44a3 100644 --- a/include/firm/fatfs/ARM7/fatfs_loader.h +++ b/include/firm/fatfs/ARM7/fatfs_loader.h @@ -19,6 +19,7 @@ #define FIRM_FATFS_FATFS_LOADER_H_ #include +#include #ifdef __cplusplus extern "C" { @@ -46,6 +47,20 @@ BOOL FATFS_OpenRecentMenu( int driveno ); *---------------------------------------------------------------------------*/ BOOL FATFS_OpenSpecifiedSrl( const char* menufile ); +/*---------------------------------------------------------------------------* + Name: FATFS_SaveSrlFilename + + Description: store filename to HW_TWL_FS_BOOT_SRL_PATH_BUF + + ファイル名をHW_TWL_FS_BOOT_SRL_PATH_BUFに書き込みます。 + + Arguments: media media type + filename target filename + + Returns: None + *---------------------------------------------------------------------------*/ +BOOL FATFS_SaveSrlFilename( FATFSMediaType media, const char* filename ); + /*---------------------------------------------------------------------------* Name: FATFS_GetSrlDescriptor