Host I/O を使う方法は FS関数がワイド文字列を扱えないという壁にぶち当たり断念。FS_CreateFileFromRomを使う方法に変更。

git-svn-id: file:///Users/lillianskinner/Downloads/platinum/twl/TwlIPL/trunk@1168 b08762b0-b915-fc4b-9d8c-17b2551a87ff
This commit is contained in:
kamikawa 2008-04-17 02:04:39 +00:00
parent fe3343bc33
commit d3f78a78c3
5 changed files with 120 additions and 42 deletions

View File

@ -0,0 +1,70 @@
/*---------------------------------------------------------------------------*
Project: ImportJump
File: import.h
Copyright 2008 Nintendo. All rights reserved.
These coded instructions, statements, and computer programs contain
proprietary information of Nintendo of America Inc. and/or Nintendo
Company Ltd., and are protected by Federal copyright law. They may
not be disclosed to third parties or copied or duplicated in any form,
in whole or in part, without the prior written consent of Nintendo.
$Date:: $
$Rev$
$Author$
*---------------------------------------------------------------------------*/
#ifndef IMPORT_JUMP_H_
#define IMPORT_JUMP_H_
#ifdef __cplusplus
extern "C" {
#endif
/*===========================================================================*/
#include <nitro.h>
/*---------------------------------------------------------------------------*
*---------------------------------------------------------------------------*/
typedef struct _ImportJumpSetting
{
u32 magicCode; // = TWLD
u32 clearPublicSaveData :1; // publicセーブデータをクリアするデフォルトOFF
u32 clearPrivateSaveData :1; // privareセーブデータをクリアするデフォルトOFF
u32 clearSaveBannerFile:1; // セーブバナーファイルをクリアするデフォルトOFF
u32 importTad:1; // パスで指定されたTADファイルをインポートするかTADの更新有無に依存
u32 rsv :28; // 予約
u32 tadLength; // TADファイルの長さ
} ImportJump;
/*---------------------------------------------------------------------------*
*---------------------------------------------------------------------------*/
// TADファイル配置アドレス
#define IMPORT_TAD_ADDRESS 0x00800000
/*---------------------------------------------------------------------------*
*---------------------------------------------------------------------------*/
inline ImportJump* GetImportJumpSetting(void)
{
return (ImportJump *)0x0dfc0000;
}
/*===========================================================================*/
#ifdef __cplusplus
} /* extern "C" */
#endif
#endif /* IMPORT_JUMP_H_ */
/*---------------------------------------------------------------------------*
End of file
*---------------------------------------------------------------------------*/

View File

@ -34,7 +34,7 @@ extern "C" {
ЉЦђи`
*---------------------------------------------------------------------------*/
BOOL kamiImportTad(char* path, NAMTitleId* pTitleId);
BOOL kamiImportTad(NAMTitleId* pTitleId);
/*===========================================================================*/

View File

@ -78,13 +78,7 @@ Property
#
# ROM SIZE: in bit [64M/128M/256M/512M/1G/2G]
#
#RomSize 128M
#RomSize 256M
# TADの最大サイズがおそらく48MByte = 384Mbitなどになるため
# RomSize はそれ以上にしておく必要がある。そうしないと
# FS_ReadFile で tad ファイルをリードしにいった場合に
# out of range エラーが発生する
RomSize 512M
RomSize 64M
#
# ROM PADDING: TRUE if finalrom

View File

@ -26,7 +26,7 @@
#include "import.h"
#include "TWLHWInfo_api.h"
#include "graphics.h"
#include "ImportJump.h"
/*---------------------------------------------------------------------------*
@ -69,14 +69,25 @@ static void UpdateNandBoxCount( void );
Returns: None.
*---------------------------------------------------------------------------*/
BOOL kamiImportTad(char* path, NAMTitleId* pTitleId)
BOOL kamiImportTad(NAMTitleId* pTitleId)
{
NAMTadInfo tadInfo;
OSThread thread;
s32 nam_result;
FSFile file;
// ファイル初期化
FS_InitFile(&file);
// CARD-ROM 領域を一時的なファイルとみなしそのファイルを開きます。
if (!FS_CreateFileFromRom(&file, IMPORT_TAD_ADDRESS, GetImportJumpSetting()->tadLength))
{
OS_Warning(" Fail : FS_CreateFileFromRom\n");
return FALSE;
}
// tadファイルの情報取得
if (NAM_ReadTadInfo(&tadInfo, path) != NAM_OK)
if (NAM_ReadTadInfoWithFile(&tadInfo, &file) != NAM_OK)
{
OS_Warning(" Fail! : NAM_ReadTadInfo\n");
return FALSE;
@ -84,14 +95,7 @@ BOOL kamiImportTad(char* path, NAMTitleId* pTitleId)
// 後でアプリジャンプするTitleIdをここで読み取っておく
*pTitleId = tadInfo.titleInfo.titleId;
/*
// Not Launch なら失敗
if (tadInfo.titleInfo.titleId & TITLE_ID_NOT_LAUNCH_FLAG_MASK)
{
OS_Warning(" Fail! : NOT_LAUNCH_FLAG is specified in rsf file\n");
return FALSE;
}
*/
// Data Only なら失敗
if (tadInfo.titleInfo.titleId & TITLE_ID_DATA_ONLY_FLAG_MASK)
{
@ -119,7 +123,7 @@ BOOL kamiImportTad(char* path, NAMTitleId* pTitleId)
OS_WakeupThreadDirect(&thread);
// Import開始
nam_result = NAM_ImportTad( path );
nam_result = NAM_ImportTadWithFile( &file );
// 進捗スレッドの自力終了を待つ
while (sNowImport){};

View File

@ -24,33 +24,22 @@
#include "import.h"
#include "graphics.h"
#include "hwi.h"
#define DEBUG_TARGET_TAD_FILE_PATH "hostio:/c:/TwlIPL/build/systemMenu_RED/MachineSettings/ARM9/bin/ARM9-TS.LTD/Release/HNBA.Release.tad"
extern void HWInfoWriterInit( void );
extern void FS_MountHostIO(const char *basepath);
#include "ImportJump.h"
/*---------------------------------------------------------------------------*
*---------------------------------------------------------------------------*/
static NAMTitleId titleId;
char sTadPath[FS_ENTRY_LONGNAME_MAX];
/*---------------------------------------------------------------------------*
*---------------------------------------------------------------------------*/
static void VBlankIntr(void);
static void InitAllocation(void);
// 現時点ではカード割り込みをHIO通知に使用しているようなので
// カード抜け誤検出を無視するようにしてテストを作成している。
static BOOL IgnoreRemoval(void)
{
OS_TWarning("detected CARD-removal!(miss-notification from debugger Host-I/O)\n");
return FALSE;
}
static BOOL IgnoreRemoval(void);
extern void FS_MountHostIO(const char *basepath);
/*---------------------------------------------------------------------------*
Name: TwlMain
@ -64,6 +53,16 @@ static BOOL IgnoreRemoval(void)
void
TwlMain()
{
// OS_Initより前に実行する
{
// SRLの後方に配置したTADファイルにアクセス可能にするために
// カードアクセスのハッシュチェックを無効化する
const CARDRomHeaderTWL *header = (const CARDRomHeaderTWL *)HW_TWL_ROM_HEADER_BUF;
*(u32 *)header->digest_tabel2_digest = 0x00000000;
// デバッガ情報を読み取るため拡張メモリを有効にする
OS_EnableMainExArena();
}
OS_Init();
OS_InitArena();
PXI_Init();
@ -94,12 +93,6 @@ TwlMain()
// initialize file-system
FS_Init(FS_DMA_NOT_USE);
// HostI/Oをマウント。
{
CARD_SetPulledOutCallback(IgnoreRemoval);
FS_MountHostIO("c:");
}
// NAMライブラリ初期化
NAM_Init( OS_AllocFromMain, OS_FreeToMain);
@ -131,12 +124,13 @@ TwlMain()
}
// TADのインポート開始
if (kamiImportTad(DEBUG_TARGET_TAD_FILE_PATH, &titleId))
if (kamiImportTad(&titleId))
{
// インポートに成功したならアプリジャンプ
OS_DoApplicationJump( titleId, OS_APP_JUMP_NORMAL );
}
// アプリジャンプに成功したならここへは到達しない
while(1){};
}
@ -178,3 +172,19 @@ static void InitAllocation(void)
hh = OS_SetCurrentHeap(OS_ARENA_MAIN, hh);
}
/*---------------------------------------------------------------------------*
Name: IgnoreRemoval
Description:
Arguments: None.
Returns: None.
*---------------------------------------------------------------------------*/
// 現時点ではカード割り込みをHIO通知に使用しているようなので
// カード抜け誤検出を無視するようにしてテストを作成している。
static BOOL IgnoreRemoval(void)
{
OS_TWarning("detected CARD-removal!(miss-notification from debugger Host-I/O)\n");
return FALSE;
}