mirror of
https://github.com/rvtr/TwlIPL.git
synced 2025-10-31 06:01:12 -04:00
OSi_Bootの引数をROMヘッダのポインタにした
*_Loader()を公開した git-svn-id: file:///Users/lillianskinner/Downloads/platinum/twl/TwlIPL/trunk@122 b08762b0-b915-fc4b-9d8c-17b2551a87ff
This commit is contained in:
parent
6961a271d9
commit
5f227a2270
@ -100,6 +100,22 @@ BOOL FATFS_OpenSpecifiedSrl( const char* menufile )
|
|||||||
return TRUE;
|
return TRUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*---------------------------------------------------------------------------*
|
||||||
|
Name: FATFS_GetSrlDescriptor
|
||||||
|
|
||||||
|
Description: open specified menu file
|
||||||
|
|
||||||
|
任意のファイルをオープンし、ファイルIDをmenu_fdにセットします。
|
||||||
|
|
||||||
|
Arguments: None
|
||||||
|
|
||||||
|
Returns: int
|
||||||
|
*---------------------------------------------------------------------------*/
|
||||||
|
int FATFS_GetSrlDescriptor( void )
|
||||||
|
{
|
||||||
|
return menu_fd;
|
||||||
|
}
|
||||||
|
|
||||||
#define HEADER_SIZE 0x1000
|
#define HEADER_SIZE 0x1000
|
||||||
#define AUTH_SIZE ROM_HEADER_SIGN_TARGET_SIZE
|
#define AUTH_SIZE ROM_HEADER_SIGN_TARGET_SIZE
|
||||||
|
|
||||||
@ -136,12 +152,17 @@ BOOL FATFS_OpenSpecifiedSrl( const char* menufile )
|
|||||||
destとsizeを通知するという形でOKではないか?
|
destとsizeを通知するという形でOKではないか?
|
||||||
(で完了したら返事を返す)
|
(で完了したら返事を返す)
|
||||||
|
|
||||||
|
補足2:
|
||||||
|
一度に複数スロットを使えそうな場合は、一気にpo_readした方が速い。
|
||||||
|
ARM9からデータ内容を触る予定がないなら、本APIを使わず、普通に
|
||||||
|
直接メインメモリに転送した方が速い。
|
||||||
|
|
||||||
Arguments: offset offset of the file to load (512 bytes alignment)
|
Arguments: offset offset of the file to load (512 bytes alignment)
|
||||||
size size to load
|
size size to load
|
||||||
|
|
||||||
Returns: None
|
Returns: None
|
||||||
*---------------------------------------------------------------------------*/
|
*---------------------------------------------------------------------------*/
|
||||||
static BOOL FATFS_LoadBuffer(u32 offset, u32 size)
|
BOOL FATFS_LoadBuffer(u32 offset, u32 size)
|
||||||
{
|
{
|
||||||
u8* base = (u8*)HW_FIRM_LOAD_BUFFER_BASE;
|
u8* base = (u8*)HW_FIRM_LOAD_BUFFER_BASE;
|
||||||
static int count = 0;
|
static int count = 0;
|
||||||
@ -487,5 +508,5 @@ BOOL FATFS_LoadStatic( void )
|
|||||||
*---------------------------------------------------------------------------*/
|
*---------------------------------------------------------------------------*/
|
||||||
void FATFS_Boot( void )
|
void FATFS_Boot( void )
|
||||||
{
|
{
|
||||||
OSi_Boot( rh->s.sub_entry_address, (MIHeader_WramRegs*)rh->s.main_wram_config_data );
|
OSi_Boot( rh );
|
||||||
}
|
}
|
||||||
|
|||||||
@ -159,7 +159,7 @@ static BOOL CheckRomCertificate( SVCSignHeapContext* pool, const RomCertificate
|
|||||||
|
|
||||||
Returns: TRUE if success
|
Returns: TRUE if success
|
||||||
*---------------------------------------------------------------------------*/
|
*---------------------------------------------------------------------------*/
|
||||||
static BOOL MIi_LoadBuffer(u8* dest, u32 size, SVCSHA1Context *ctx)
|
BOOL MI_LoadBuffer(u8* dest, u32 size, SVCSHA1Context *ctx)
|
||||||
{
|
{
|
||||||
u8* base = (u8*)HW_FIRM_LOAD_BUFFER_BASE;
|
u8* base = (u8*)HW_FIRM_LOAD_BUFFER_BASE;
|
||||||
static int count = 0;
|
static int count = 0;
|
||||||
@ -247,7 +247,7 @@ BOOL MI_LoadHeader( SVCSignHeapContext* pool, const void* rsa_key )
|
|||||||
((profile[pf_cnt++] = PROFILE_PXI_RECV | FIRM_PXI_ID_LOAD_HEADER), FALSE) ||
|
((profile[pf_cnt++] = PROFILE_PXI_RECV | FIRM_PXI_ID_LOAD_HEADER), FALSE) ||
|
||||||
((profile[pf_cnt++] = (u32)OS_TicksToMicroSeconds(OS_GetTick())), FALSE) ||
|
((profile[pf_cnt++] = (u32)OS_TicksToMicroSeconds(OS_GetTick())), FALSE) ||
|
||||||
#endif
|
#endif
|
||||||
!MIi_LoadBuffer( (u8*)rh, AUTH_SIZE, &ctx ) )
|
!MI_LoadBuffer( (u8*)rh, AUTH_SIZE, &ctx ) )
|
||||||
{
|
{
|
||||||
return FALSE;
|
return FALSE;
|
||||||
}
|
}
|
||||||
@ -258,7 +258,7 @@ BOOL MI_LoadHeader( SVCSignHeapContext* pool, const void* rsa_key )
|
|||||||
profile[pf_cnt++] = (u32)OS_TicksToMicroSeconds(OS_GetTick());
|
profile[pf_cnt++] = (u32)OS_TicksToMicroSeconds(OS_GetTick());
|
||||||
#endif
|
#endif
|
||||||
// load header (remain)
|
// load header (remain)
|
||||||
if ( !MIi_LoadBuffer( (u8*)rh + AUTH_SIZE, HEADER_SIZE - AUTH_SIZE, NULL ) )
|
if ( !MI_LoadBuffer( (u8*)rh + AUTH_SIZE, HEADER_SIZE - AUTH_SIZE, NULL ) )
|
||||||
{
|
{
|
||||||
return FALSE;
|
return FALSE;
|
||||||
}
|
}
|
||||||
@ -347,7 +347,7 @@ static u32 MIi_GetTransferSize( u32 offset, u32 size )
|
|||||||
|
|
||||||
Description: receive module from ARM7 and store(move) via WRAM[B]
|
Description: receive module from ARM7 and store(move) via WRAM[B]
|
||||||
|
|
||||||
MIi_LoadBufferの上位APIです。
|
MI_LoadBufferの上位APIです。
|
||||||
|
|
||||||
AES境界をまたぐ場合は、2回のLoadBufferに分割します。
|
AES境界をまたぐ場合は、2回のLoadBufferに分割します。
|
||||||
|
|
||||||
@ -372,7 +372,7 @@ static /*inline*/ BOOL MIi_LoadModule(void* dest, u32 offset, u32 size, const u8
|
|||||||
while ( size > 0 )
|
while ( size > 0 )
|
||||||
{
|
{
|
||||||
u32 unit = MIi_GetTransferSize( offset, size );
|
u32 unit = MIi_GetTransferSize( offset, size );
|
||||||
if ( !MIi_LoadBuffer( dest, unit, &ctx.sha1_ctx ) ) // UpdateはSHA1と同じ処理
|
if ( !MI_LoadBuffer( dest, unit, &ctx.sha1_ctx ) ) // UpdateはSHA1と同じ処理
|
||||||
{
|
{
|
||||||
return FALSE;
|
return FALSE;
|
||||||
}
|
}
|
||||||
@ -505,5 +505,5 @@ BOOL MI_LoadStatic( void )
|
|||||||
*---------------------------------------------------------------------------*/
|
*---------------------------------------------------------------------------*/
|
||||||
void MI_Boot( void )
|
void MI_Boot( void )
|
||||||
{
|
{
|
||||||
OSi_Boot( rh->s.main_entry_address, (MIHeader_WramRegs*)rh->s.main_wram_config_data );
|
OSi_Boot( rh );
|
||||||
}
|
}
|
||||||
|
|||||||
@ -31,35 +31,27 @@
|
|||||||
なので、OSi_BootCoreは次のプログラムですぐに壊されそうなところを使う
|
なので、OSi_BootCoreは次のプログラムですぐに壊されそうなところを使う
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
void OSi_BootCore( OSEntryPoint p, MIHeader_WramRegs* w );
|
void OSi_BootCore( ROM_Header* rom_header );
|
||||||
|
|
||||||
/*---------------------------------------------------------------------------*
|
/*---------------------------------------------------------------------------*
|
||||||
Name: OSi_Boot
|
Name: OSi_Boot
|
||||||
|
|
||||||
Description: boot firm
|
Description: boot firm
|
||||||
|
|
||||||
Arguments: entry : entry point
|
Arguments: rom_header : ROM header
|
||||||
w : wram settings
|
|
||||||
|
|
||||||
Returns: None
|
Returns: None
|
||||||
*---------------------------------------------------------------------------*/
|
*---------------------------------------------------------------------------*/
|
||||||
void OSi_Boot( void* entry, MIHeader_WramRegs* w )
|
void OSi_Boot( ROM_Header* rom_header )
|
||||||
{
|
{
|
||||||
OSEntryPoint p = (OSEntryPoint)entry;
|
void (*OSBootCore)( ROM_Header* rom_header );
|
||||||
void (*OSBootCore)( OSEntryPoint p, MIHeader_WramRegs* w );
|
|
||||||
|
|
||||||
(void)OS_DisableInterrupts();
|
(void)OS_DisableInterrupts();
|
||||||
OSi_Finalize();
|
OSi_Finalize();
|
||||||
|
OSBootCore = (void*)HW_FIRM_BOOT_CORE;
|
||||||
|
MI_CpuCopyFast( OSi_BootCore, OSBootCore, HW_FIRM_BOOT_CORE_SIZE );
|
||||||
|
|
||||||
#ifdef SDK_ARM9
|
OSBootCore(rom_header);
|
||||||
OSBootCore = (void*)HW_ITCM;
|
|
||||||
#else // SDK_ARM7
|
|
||||||
OSBootCore = (void*)(HW_PRV_WRAM_SVC_STACK - 0x200);
|
|
||||||
#endif // SDK_ARM7
|
|
||||||
|
|
||||||
MI_CpuCopyFast( OSi_BootCore, OSBootCore, 0x200 );
|
|
||||||
|
|
||||||
OSBootCore(p, w);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/*---------------------------------------------------------------------------*
|
/*---------------------------------------------------------------------------*
|
||||||
@ -103,39 +95,17 @@ void OSi_Finalize(void)
|
|||||||
#endif // SDK_ARM9
|
#endif // SDK_ARM9
|
||||||
}
|
}
|
||||||
|
|
||||||
extern void SDK_STATIC_DATA_START(void); // static data start address
|
extern void SDK_STATIC_START(void); // static start address
|
||||||
extern void SDK_STATIC_BSS_END(void); // static bss end address
|
extern void SDK_STATIC_END(void); // static end address
|
||||||
|
|
||||||
/*---------------------------------------------------------------------------*
|
#include <twl/code32.h>
|
||||||
Name: OSi_ClearWorkArea
|
|
||||||
|
|
||||||
Description: clear work area
|
asm void OSi_BootCore( ROM_Header* rom_header )
|
||||||
|
|
||||||
Arguments: None
|
|
||||||
|
|
||||||
Returns: None
|
|
||||||
*---------------------------------------------------------------------------*/
|
|
||||||
#include <nitro/code32.h>
|
|
||||||
asm void OSi_ClearWorkArea( void )
|
|
||||||
{
|
{
|
||||||
mov r11, lr
|
|
||||||
|
|
||||||
// clear stack with r4-r9
|
|
||||||
mov r0, #0
|
|
||||||
ldr r1, =SDK_STATIC_DATA_START
|
|
||||||
ldr r2, =SDK_STATIC_BSS_END
|
|
||||||
sub r2, r2, r1
|
|
||||||
bl MIi_CpuClearFast
|
|
||||||
|
|
||||||
bx r11
|
|
||||||
}
|
|
||||||
|
|
||||||
asm void OSi_BootCore( OSEntryPoint p, MIHeader_WramRegs* w )
|
|
||||||
{
|
|
||||||
mov r11, r0
|
|
||||||
mov r10, r1
|
|
||||||
|
|
||||||
#ifdef SDK_ARM9
|
#ifdef SDK_ARM9
|
||||||
|
add r10, r0, #0x180 // rom_header->s.main_wram_config_data
|
||||||
|
ldr r11, [r0, #0x24] // rom_header->s.main_entry_address
|
||||||
|
|
||||||
// wait for request of wram map
|
// wait for request of wram map
|
||||||
ldr r3, =REG_SUBPINTF_ADDR
|
ldr r3, =REG_SUBPINTF_ADDR
|
||||||
@ -171,6 +141,8 @@ asm void OSi_BootCore( OSEntryPoint p, MIHeader_WramRegs* w )
|
|||||||
str r0, [r3]
|
str r0, [r3]
|
||||||
|
|
||||||
#else // ARM7
|
#else // ARM7
|
||||||
|
add r10, r0, #0x1a0 // rom_header->s.sub_wram_config_data
|
||||||
|
ldr r11, [r0, #0x34] // rom_header->s.sub_entry_address
|
||||||
|
|
||||||
// request wram map
|
// request wram map
|
||||||
ldr r3, =REG_MAINPINTF_ADDR
|
ldr r3, =REG_MAINPINTF_ADDR
|
||||||
@ -188,7 +160,6 @@ asm void OSi_BootCore( OSEntryPoint p, MIHeader_WramRegs* w )
|
|||||||
str r0, [r3]
|
str r0, [r3]
|
||||||
|
|
||||||
// r10- => r9-r2
|
// r10- => r9-r2
|
||||||
add r10, r10, #32
|
|
||||||
ldr r9, =REG_MBK6_ADDR
|
ldr r9, =REG_MBK6_ADDR
|
||||||
add r2, r9, #15
|
add r2, r9, #15
|
||||||
@1:
|
@1:
|
||||||
@ -199,12 +170,22 @@ asm void OSi_BootCore( OSEntryPoint p, MIHeader_WramRegs* w )
|
|||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
// clear stack with r4-r9
|
// clear something all
|
||||||
mov r0, #0
|
mov r0, #0
|
||||||
#if 0
|
#if 0
|
||||||
|
// clear stack
|
||||||
ldr r1, =HW_FIRM_STACK
|
ldr r1, =HW_FIRM_STACK
|
||||||
ldr r2, =HW_FIRM_STACK_SIZE
|
ldr r2, =HW_FIRM_STACK_SIZE
|
||||||
bl MIi_CpuClearFast
|
@10: cmp r1, r2
|
||||||
|
strcc r0, [r1], #4
|
||||||
|
bcc @10
|
||||||
|
|
||||||
|
// clear static text, data, and bss
|
||||||
|
ldr r1, =SDK_STATIC_START
|
||||||
|
ldr r2, =SDK_STATIC_END
|
||||||
|
@20: cmp r1, r2
|
||||||
|
strcc r0, [r1], #4
|
||||||
|
bcc @20
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
mov lr, r11
|
mov lr, r11
|
||||||
|
|||||||
@ -46,6 +46,64 @@ BOOL FATFS_OpenRecentMenu( int driveno );
|
|||||||
*---------------------------------------------------------------------------*/
|
*---------------------------------------------------------------------------*/
|
||||||
BOOL FATFS_OpenSpecifiedSrl( const char* menufile );
|
BOOL FATFS_OpenSpecifiedSrl( const char* menufile );
|
||||||
|
|
||||||
|
/*---------------------------------------------------------------------------*
|
||||||
|
Name: FATFS_GetSrlDescriptor
|
||||||
|
|
||||||
|
Description: open specified menu file
|
||||||
|
|
||||||
|
任意のファイルをオープンし、ファイルIDをmenu_fdにセットします。
|
||||||
|
|
||||||
|
Arguments: None
|
||||||
|
|
||||||
|
Returns: int
|
||||||
|
*---------------------------------------------------------------------------*/
|
||||||
|
int FATFS_GetSrlDescriptor( void );
|
||||||
|
|
||||||
|
/*---------------------------------------------------------------------------*
|
||||||
|
Name: FATFS_LoadBuffer
|
||||||
|
|
||||||
|
Description: load data and pass to ARM9 via WRAM[B]
|
||||||
|
|
||||||
|
LoadBufferメカニズムで、FAT中のファイルの内容をARM9に転送します。
|
||||||
|
|
||||||
|
[LoadBufferメカニズム]
|
||||||
|
WRAM[B]を利用して、ARM7,ARM9間のデータ転送を行います。
|
||||||
|
WRAM[B]の各スロットをバケツリレー方式で渡します。
|
||||||
|
1スロット分のデータまたは全データが格納できたとき、ARM9へ
|
||||||
|
FIRM_PXI_ID_LOAD_PIRIODを送信します。
|
||||||
|
データ残がある場合は次のスロットの処理に移ります。
|
||||||
|
2回目以降の呼び出しでは、前回最後のスロットの続きから使用します。
|
||||||
|
使用したいスロットがARM9側に割り当てられているときは、ARM7側に
|
||||||
|
なるまでストールします。
|
||||||
|
|
||||||
|
[使用条件]
|
||||||
|
WRAM[B]をロックせず、初期状態としてARM7側に倒しておくこと。
|
||||||
|
|
||||||
|
[注意点]
|
||||||
|
offsetとsizeはARM9に通知されません。別の経路で同期を取ってください。
|
||||||
|
SRLファイルを読み込む場合は、互いにROMヘッダを参照できれば十分です。
|
||||||
|
(ROMヘッダ部分は元から知っているはず)
|
||||||
|
|
||||||
|
補足:
|
||||||
|
ここでは、あるライブラリ内でARM7/ARM9側で歩調を合わせられることを
|
||||||
|
前提にしているが、汎用的にするには(独立ライブラリ化するなら)、
|
||||||
|
送受信でスロットを半分ずつとし、それぞれに受信側のPXIコールバック
|
||||||
|
&スレッドを用意し、送信側APIがデータをWRAMに格納した後、他方に
|
||||||
|
destとsizeを通知するという形でOKではないか?
|
||||||
|
(で完了したら返事を返す)
|
||||||
|
|
||||||
|
補足2:
|
||||||
|
一度に複数スロットを使えそうな場合は、一気にpo_readした方が速い。
|
||||||
|
ARM9からデータ内容を触る予定がないなら、本APIを使わず、普通に
|
||||||
|
直接メインメモリに転送した方が速い。
|
||||||
|
|
||||||
|
Arguments: offset offset of the file to load (512 bytes alignment)
|
||||||
|
size size to load
|
||||||
|
|
||||||
|
Returns: None
|
||||||
|
*---------------------------------------------------------------------------*/
|
||||||
|
BOOL FATFS_LoadBuffer(u32 offset, u32 size);
|
||||||
|
|
||||||
/*---------------------------------------------------------------------------*
|
/*---------------------------------------------------------------------------*
|
||||||
Name: FATFS_LoadHeader
|
Name: FATFS_LoadHeader
|
||||||
|
|
||||||
|
|||||||
@ -26,11 +26,6 @@ extern "C" {
|
|||||||
#define HW_FIRM_END (HW_FIRM + HW_FIRM_SIZE)
|
#define HW_FIRM_END (HW_FIRM + HW_FIRM_SIZE)
|
||||||
#define HW_FIRM_SIZE (HW_WRAM_0_SIZE + HW_WRAM_1_SIZE + HW_WRAM_A_SIZE_MAX + HW_WRAM_B_SIZE_MAX)
|
#define HW_FIRM_SIZE (HW_WRAM_0_SIZE + HW_WRAM_1_SIZE + HW_WRAM_A_SIZE_MAX + HW_WRAM_B_SIZE_MAX)
|
||||||
|
|
||||||
//------------------------------------- FIRM_WRAM_ABC
|
|
||||||
#define HW_FIRM_WRAM_A_MAP_END (HW_WRAM_AREA_END - HW_PRV_WRAM_SIZE)
|
|
||||||
#define HW_FIRM_WRAM_B_MAP_END HW_FIRM_WRAM_A_MAP_END
|
|
||||||
#define HW_FIRM_WRAM_C_MAP_END HW_FIRM_WRAM_A_MAP_END
|
|
||||||
|
|
||||||
//------------------------------------- HW_FIRM_FROM_BROM_BUF
|
//------------------------------------- HW_FIRM_FROM_BROM_BUF
|
||||||
#define HW_FIRM_FROM_BROM_BUF (HW_FIRM_FROM_BROM_BUF_END - HW_FIRM_FROM_BROM_BUF_SIZE)
|
#define HW_FIRM_FROM_BROM_BUF (HW_FIRM_FROM_BROM_BUF_END - HW_FIRM_FROM_BROM_BUF_SIZE)
|
||||||
#define HW_FIRM_FROM_BROM_BUF_END (HW_WRAM_AREA_END - 0x1000) // END - 4KB
|
#define HW_FIRM_FROM_BROM_BUF_END (HW_WRAM_AREA_END - 0x1000) // END - 4KB
|
||||||
@ -42,7 +37,7 @@ extern "C" {
|
|||||||
#define HW_FIRM_APP_BUF_SIZE 0x00800000 // 8MB
|
#define HW_FIRM_APP_BUF_SIZE 0x00800000 // 8MB
|
||||||
|
|
||||||
//------------------------------------- HW_FIRM_BOOT_CORE
|
//------------------------------------- HW_FIRM_BOOT_CORE
|
||||||
#define HW_FIRM_BOOT_CORE HW_EXT_WRAM
|
#define HW_FIRM_BOOT_CORE HW_FIRM_FROM_BROM_BUF_END
|
||||||
#define HW_FIRM_BOOT_CORE_END (HW_FIRM_BOOT_CORE + HW_FIRM_BOOT_CORE_SIZE)
|
#define HW_FIRM_BOOT_CORE_END (HW_FIRM_BOOT_CORE + HW_FIRM_BOOT_CORE_SIZE)
|
||||||
#define HW_FIRM_BOOT_CORE_SIZE 0x200 // 512B
|
#define HW_FIRM_BOOT_CORE_SIZE 0x200 // 512B
|
||||||
|
|
||||||
|
|||||||
@ -26,11 +26,6 @@ extern "C" {
|
|||||||
#define HW_FIRM_END (HW_FIRM + HW_FIRM_SIZE)
|
#define HW_FIRM_END (HW_FIRM + HW_FIRM_SIZE)
|
||||||
#define HW_FIRM_SIZE HW_WRAM_C_SIZE_MAX
|
#define HW_FIRM_SIZE HW_WRAM_C_SIZE_MAX
|
||||||
|
|
||||||
//------------------------------------- FIRM_WRAM_ABC
|
|
||||||
#define HW_FIRM_WRAM_A_MAP_END HW_WRAM_AREA_END
|
|
||||||
#define HW_FIRM_WRAM_B_MAP_END HW_FIRM_WRAM_A_MAP_END
|
|
||||||
#define HW_FIRM_WRAM_C_MAP_END HW_FIRM_WRAM_A_MAP_END
|
|
||||||
|
|
||||||
//------------------------------------- HW_FIRM_FROM_BROM_BUF
|
//------------------------------------- HW_FIRM_FROM_BROM_BUF
|
||||||
#define HW_FIRM_FROM_BROM_BUF (HW_FIRM_FROM_BROM_BUF_END - HW_FIRM_FROM_BROM_BUF_SIZE)
|
#define HW_FIRM_FROM_BROM_BUF (HW_FIRM_FROM_BROM_BUF_END - HW_FIRM_FROM_BROM_BUF_SIZE)
|
||||||
#define HW_FIRM_FROM_BROM_BUF_END (HW_ITCM_END - 0x1000) // END - 4KB
|
#define HW_FIRM_FROM_BROM_BUF_END (HW_ITCM_END - 0x1000) // END - 4KB
|
||||||
@ -46,6 +41,7 @@ extern "C" {
|
|||||||
#define HW_FIRM_BOOT_CORE_END (HW_FIRM_BOOT_CORE + HW_FIRM_BOOT_CORE_SIZE)
|
#define HW_FIRM_BOOT_CORE_END (HW_FIRM_BOOT_CORE + HW_FIRM_BOOT_CORE_SIZE)
|
||||||
#define HW_FIRM_BOOT_CORE_SIZE 0x200 // 512B
|
#define HW_FIRM_BOOT_CORE_SIZE 0x200 // 512B
|
||||||
|
|
||||||
|
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
} /* extern "C" */
|
} /* extern "C" */
|
||||||
#endif
|
#endif
|
||||||
|
|||||||
@ -24,6 +24,48 @@
|
|||||||
extern "C" {
|
extern "C" {
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
/*---------------------------------------------------------------------------*
|
||||||
|
Name: MIi_LoadBuffer
|
||||||
|
|
||||||
|
Description: receive data from ARM7 and store(move) via WRAM[B]
|
||||||
|
|
||||||
|
LoadBufferメカニズムで、ファイルの内容をARM7から受け取ります。
|
||||||
|
引数でSVCSHA1Contextを指定していた場合、コピーのついでにSHA1の
|
||||||
|
計算も行います。
|
||||||
|
|
||||||
|
[LoadBufferメカニズム]
|
||||||
|
WRAM[B]を利用して、ARM7,ARM9間のデータ転送を行います。
|
||||||
|
WRAM[B]の各スロットをバケツリレー方式で渡します。
|
||||||
|
1スロット分のデータまたは全データが格納されたとき、ARM7から
|
||||||
|
FIRM_PXI_ID_LOAD_PIRIODを受信します。
|
||||||
|
ARM9は受信後にそのスロットの使用権をARM9に変更してデータを
|
||||||
|
取り出し、完了後にメモリをクリアして(セキュリティ)、使用権を
|
||||||
|
ARM7に戻します。
|
||||||
|
|
||||||
|
[使用条件]
|
||||||
|
WRAM[B]をロックせず、初期状態としてARM7側に倒しておくこと。
|
||||||
|
|
||||||
|
[注意点]
|
||||||
|
offsetとsizeはARM7から通知されません。別の経路で同期を取ってください。
|
||||||
|
SRLファイルを読み込む場合は、互いにROMヘッダを参照できれば十分です。
|
||||||
|
(ROMヘッダ部分は元から知っているはず)
|
||||||
|
|
||||||
|
補足:
|
||||||
|
ここでは、あるライブラリ内でARM7/ARM9側で歩調を合わせられることを
|
||||||
|
前提にしているが、汎用的にするには(独立ライブラリ化するなら)、
|
||||||
|
送受信でスロットを半分ずつとし、それぞれに受信側のPXIコールバック
|
||||||
|
&スレッドを用意し、送信側APIがデータをWRAMに格納した後、他方に
|
||||||
|
destとsizeを通知するという形でOKではないか?
|
||||||
|
(で完了したら返事を返す)
|
||||||
|
|
||||||
|
Arguments: dest destination address for received data
|
||||||
|
size size to load
|
||||||
|
ctx context for SHA1 if execute SVC_SHA1Update
|
||||||
|
|
||||||
|
Returns: TRUE if success
|
||||||
|
*---------------------------------------------------------------------------*/
|
||||||
|
BOOL MI_LoadBuffer(u8* dest, u32 size, SVCSHA1Context *ctx);
|
||||||
|
|
||||||
/*---------------------------------------------------------------------------*
|
/*---------------------------------------------------------------------------*
|
||||||
Name: MI_LoadHeader
|
Name: MI_LoadHeader
|
||||||
|
|
||||||
|
|||||||
@ -19,6 +19,7 @@
|
|||||||
|
|
||||||
#include <firm.h>
|
#include <firm.h>
|
||||||
#include <firm/format/from_brom.h>
|
#include <firm/format/from_brom.h>
|
||||||
|
#include <firm/format/format_rom.h>
|
||||||
|
|
||||||
#include <nitro/hw/common/armArch.h>
|
#include <nitro/hw/common/armArch.h>
|
||||||
|
|
||||||
@ -34,12 +35,11 @@ typedef void (*OSEntryPoint) (void);
|
|||||||
|
|
||||||
Description: boot firm
|
Description: boot firm
|
||||||
|
|
||||||
Arguments: entry : entry point
|
Arguments: rom_header : ROM header
|
||||||
w : wram settings
|
|
||||||
|
|
||||||
Returns: None
|
Returns: None
|
||||||
*---------------------------------------------------------------------------*/
|
*---------------------------------------------------------------------------*/
|
||||||
void OSi_Boot( void* entry, MIHeader_WramRegs* w );
|
void OSi_Boot( ROM_Header* rom_header );
|
||||||
|
|
||||||
/*---------------------------------------------------------------------------*
|
/*---------------------------------------------------------------------------*
|
||||||
Name: OSi_Finalize
|
Name: OSi_Finalize
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user