mirror of
https://github.com/rvtr/TwlIPL.git
synced 2025-10-31 06:01:12 -04:00
・TwlBanner.xlsドキュメント更新。 ・NANDアプリリスト取得時に、TitleID_Hiの値によって取捨選択を行うよう変更。 ・PXIを使ってARM9からHotSWを制御できるようにしようと試み中。 ・SYSM_workのフラグ構成を修正。 git-svn-id: file:///Users/lillianskinner/Downloads/platinum/twl/TwlIPL/trunk@539 b08762b0-b915-fc4b-9d8c-17b2551a87ff
108 lines
3.4 KiB
C
108 lines
3.4 KiB
C
/*---------------------------------------------------------------------------*
|
||
Project: TwlIPL
|
||
File: SYSM_lib.c
|
||
|
||
Copyright 2007 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$
|
||
*---------------------------------------------------------------------------*/
|
||
|
||
#include <twl.h>
|
||
#include <sysmenu.h>
|
||
#include "internal_api.h"
|
||
|
||
// define data-----------------------------------------------------------------
|
||
typedef struct BannerCheckParam {
|
||
u8 *pSrc;
|
||
u32 size;
|
||
}BannerCheckParam;
|
||
|
||
// extern data-----------------------------------------------------------------
|
||
// function's prototype-------------------------------------------------------
|
||
static BOOL SYSMi_CheckBannerFile( NTRBannerFile *pBanner );
|
||
|
||
// global variable-------------------------------------------------------------
|
||
// static variable-------------------------------------------------------------
|
||
|
||
// const data------------------------------------------------------------------
|
||
|
||
// ============================================================================
|
||
//
|
||
// バナー
|
||
//
|
||
// ============================================================================
|
||
|
||
// カードバナーリード(※NTR-IPL2仕様)
|
||
BOOL SYSMi_ReadCardBannerFile( u32 bannerOffset, TWLBannerFile *pBanner )
|
||
{
|
||
#ifndef DEBUG_USED_CARD_SLOT_B_
|
||
// ※スロットAからのリードなら問題ないが、スロットBからは直接読めないので
|
||
BOOL isRead;
|
||
u16 id = (u16)OS_GetLockID();
|
||
|
||
// ROMカードからのバナーデータのリード
|
||
DC_FlushRange( pBanner, sizeof(TWLBannerFile) );
|
||
CARD_LockRom( id );
|
||
CARD_ReadRom( 4, (void *)bannerOffset, pBanner, sizeof(TWLBannerFile) );
|
||
CARD_UnlockRom( id );
|
||
OS_ReleaseLockID( id );
|
||
|
||
isRead = SYSMi_CheckBannerFile( (NTRBannerFile *)pBanner );
|
||
|
||
if( !isRead ) {
|
||
MI_CpuClearFast( pBanner, sizeof(TWLBannerFile) );
|
||
}
|
||
return isRead;
|
||
#else
|
||
#pragma unused(bannerOffset)
|
||
if( SYSMi_GetWork()->flags.common.isValidCardBanner ) {
|
||
DC_InvalidateRange( (void *)SYSM_CARD_BANNER_BUF, 0x3000 );
|
||
MI_CpuCopyFast( (void *)SYSM_CARD_BANNER_BUF, pBanner, sizeof(TWLBannerFile) );
|
||
}
|
||
return (BOOL)SYSMi_GetWork()->flags.common.isValidCardBanner;
|
||
#endif
|
||
}
|
||
|
||
|
||
// バナーデータの正誤チェック
|
||
static BOOL SYSMi_CheckBannerFile( NTRBannerFile *pBanner )
|
||
{
|
||
int i;
|
||
BOOL retval = TRUE;
|
||
u16 calc_crc = 0xffff;
|
||
u16 *pHeaderCRC = (u16 *)&pBanner->h.crc16_v1;
|
||
BannerCheckParam bannerCheckList[ BANNER_VER_NTR_MAX ];
|
||
BannerCheckParam *pChk = &bannerCheckList[ 0 ];
|
||
|
||
bannerCheckList[ 0 ].pSrc = (u8 *)&( pBanner->v1 );
|
||
bannerCheckList[ 0 ].size = sizeof( BannerFileV1 );
|
||
bannerCheckList[ 1 ].pSrc = (u8 *)&( pBanner->v2 );
|
||
bannerCheckList[ 1 ].size = sizeof( BannerFileV2 );
|
||
bannerCheckList[ 2 ].pSrc = (u8 *)&( pBanner->v3 );
|
||
bannerCheckList[ 2 ].size = sizeof( BannerFileV3 );
|
||
|
||
for( i = 0; i < BANNER_VER_NTR_MAX; i++ ) {
|
||
if( i < pBanner->h.version ) {
|
||
calc_crc = SVC_GetCRC16( calc_crc, pChk->pSrc, pChk->size );
|
||
if( calc_crc != *pHeaderCRC++ ) {
|
||
retval = FALSE;
|
||
break;
|
||
}
|
||
}else {
|
||
MI_CpuClear16( pChk->pSrc, pChk->size );
|
||
}
|
||
pChk++;
|
||
}
|
||
|
||
return retval;
|
||
}
|
||
|