add HW_MAIN_MEM_HI and move HW_MAIN_MEM_SYSTEM.

fix interrupt func.

git-svn-id: file:///Users/lillianskinner/Downloads/platinum/twl/twl_wrapsdk/trunk@10 4ee2a332-4b2b-5046-8439-1ba90f034370
This commit is contained in:
nakasima 2007-04-04 11:58:10 +00:00
parent 4b22fa6465
commit a8f3113969
20 changed files with 3220 additions and 36 deletions

View File

@ -121,8 +121,10 @@ ifeq ($(TWL_CODEGEN_PROC),ARM9)
TWL_LIBS_BASE ?= \
libos \
libpxi \
libmi \
libvlink \
libctrdg \
ifdef TWL_PROFILE_TYPE
TWL_LIBS_BASE += libos.$(TWL_PROFILE_TYPE)
@ -132,6 +134,7 @@ else # ($(TWL_CODEGEN_PROC),ARM7)
TWL_LIBS_BASE ?= \
libos_sp \
libpxi_sp \
libmi_sp \
libvlink_sp \
libnvram_sp \

View File

@ -23,9 +23,11 @@ include $(TWLSDK_ROOT)/build/buildtools/commondefs
SUBDIRS = \
init \
os \
pxi \
mi \
vlink \
spi \
ctrdg \
#----------------------------------------------------------------------------

View File

@ -0,0 +1,61 @@
#! make -f
#----------------------------------------------------------------------------
# Project: TwlSDK - libraries - ctrdg
# File: Makefile
#
# 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.
#
# $Log: $
# $NoKeywords: $
#----------------------------------------------------------------------------
SUBDIRS =
#----------------------------------------------------------------------------
# build ARM & THUMB libraries
TWL_CODEGEN_ALL = True
TWL_PROC = ARM9
SRCDIR = ../common .
SRCDIR += $(TWL_NITROSDK_ROOT)/build/libraries/ctrdg/common/src \
$(TWL_NITROSDK_ROOT)/build/libraries/ctrdg/ARM9/src \
SRCS = \
ctrdg.c \
ctrdg_proc.c \
ctrdg_vib.c \
ctrdg_backup.c \
ctrdg_flash_common.c \
ctrdg_flash_AT29LV512.c \
ctrdg_flash_LE26FV10N1TS-10.c \
ctrdg_flash_LE39FW512.c \
ctrdg_flash_MX29L010.c \
ctrdg_flash_MX29L512.c \
ctrdg_sram.c \
ctrdg_task.c
TARGET_LIB = libctrdg$(TWL_LIBSUFFIX).a
include $(TWLSDK_ROOT)/build/buildtools/commondefs
INSTALL_TARGETS = $(TARGETS)
INSTALL_DIR = $(TWL_INSTALL_LIBDIR)
#----------------------------------------------------------------------------
do-build: $(TARGETS)
include $(TWLSDK_ROOT)/build/buildtools/modulerules
#===== End of Makefile =====

View File

@ -0,0 +1,506 @@
/*---------------------------------------------------------------------------*
Project: NitroSDK - CTRDG
File: ctrdg.c
Copyright 2003-2006 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.
$Log: ctrdg_proc.c,v $
Revision 1.28 2006/05/02 02:04:47 kitase_hirotake
Revision 1.27 2006/05/02 02:03:23 kitase_hirotake
Revision 1.26 2006/05/01 06:04:55 yada
avoid warning
Revision 1.25 2006/04/28 11:04:22 yada
add about PHI Clock setting
Revision 1.24 2006/04/05 10:48:30 okubata_ryoma
AGBバックアップライブラリのSDK収録のための変更
Revision 1.23 2006/02/22 02:27:10 kitase_hirotake
( terminate )
Revision 1.22 2006/02/13 00:25:27 kitase_hirotake
terminate
Revision 1.21 2006/02/10 02:53:18 yosizaki
support memory protection of cartridge access.
Revision 1.20 2006/02/08 00:04:25 kitase_hirotake
Warning
Revision 1.19 2006/02/07 08:13:09 kitase_hirotake
CTRDG_CheckPulledOut
Revision 1.18 2006/01/18 02:11:20 kitase_hirotake
do-indent
Revision 1.17 2005/11/01 02:57:45 okubata_ryoma
CTRDG_SendToARM7の追加
Revision 1.16 2005/06/21 02:46:40 yada
insert calling cache function
Revision 1.15 2005/02/28 05:26:03 yosizaki
do-indent.
Revision 1.14 2005/01/13 01:58:51 yada
number of using DMA changed. DMA0 -> DMA1
Revision 1.13 2005/01/12 11:09:04 takano_makoto
fix copyright header.
Revision 1.12 2005/01/12 00:41:38 yada
change a little, around an auto variable
Revision 1.11 2004/11/24 04:38:18 yada
just fix typo
Revision 1.10 2004/09/28 05:06:15 yada
fix a little
Revision 1.9 2004/09/27 13:46:42 yada
only arrange comments
Revision 1.8 2004/09/17 00:07:27 yada
avoid warning by overriding pxi callback
Revision 1.7 2004/09/16 04:15:24 yada
fix a little
Revision 1.6 2004/09/15 09:50:12 yada
on default, pulling out cartridge doesn't cause terminate.
Revision 1.5 2004/09/15 05:55:46 yada
change include
Revision 1.4 2004/09/14 13:07:26 yada
fix small bug
Revision 1.3 2004/09/14 13:01:50 yada
CallbackForPulledOut->PulledOutCallback
Revision 1.2 2004/09/14 10:52:30 yada
fix address data sent to ARM7 via PXI
Revision 1.1 2004/09/14 09:58:21 yada
initial release
$NoKeywords: $
*---------------------------------------------------------------------------*/
#include <nitro.h>
#include <../include/ctrdg_work.h>
extern void CTRDGi_InitCommon(void);
extern void CTRDGi_SendtoPxi(u32 data);
//---- pxi callbacks
static void CTRDGi_CallbackForInitModuleInfo(PXIFifoTag tag, u32 data, BOOL err);
static void CTRDGi_PulledOutCallback(PXIFifoTag tag, u32 data, BOOL err);
static void CTRDGi_CallbackForSetPhi(PXIFifoTag tag, u32 data, BOOL err);
extern CTRDGWork CTRDGi_Work;
//---- lock for pxi
static int CTRDGi_Lock = FALSE;
//---- user callback
CTRDGPulledOutCallback CTRDG_UserCallback = NULL;
/* カートリッジ抜けコールバックは 2 度呼ばれない */
static BOOL isCartridgePullOut = FALSE;
static BOOL skipCheck = FALSE;
static BOOL ctrdg_already_pullout = FALSE;
//================================================================================
// INIT
//================================================================================
/*---------------------------------------------------------------------------*
Name: CTRDG_Init
Description: initialize cartridge functions
Arguments: None
Returns: None
*---------------------------------------------------------------------------*/
void CTRDG_Init(void)
{
static BOOL isInitialized;
if (isInitialized)
{
return;
}
isInitialized = TRUE;
CTRDGi_InitCommon();
/* カートリッジ抜けコールバックが 2 度以上呼ばれないように */
ctrdg_already_pullout = FALSE;
#ifndef SDK_SMALL_BUILD
//---- setting PXI
PXI_Init();
while (!PXI_IsCallbackReady(PXI_FIFO_TAG_CTRDG, PXI_PROC_ARM7))
{
}
PXI_SetFifoRecvCallback(PXI_FIFO_TAG_CTRDG, CTRDGi_CallbackForInitModuleInfo);
CTRDGi_InitModuleInfo();
PXI_SetFifoRecvCallback(PXI_FIFO_TAG_CTRDG, NULL); // to avoid warning by overriding
PXI_SetFifoRecvCallback(PXI_FIFO_TAG_CTRDG, CTRDGi_PulledOutCallback);
//---- init user callback
CTRDG_UserCallback = NULL;
// AGBBackupアクセス関数の非同期版を使用するためのTaskThread作成
{
static CTRDGiTaskWork CTRDGTaskList;
CTRDGi_InitTaskThread(&CTRDGTaskList);
}
PXI_SetFifoRecvCallback(PXI_FIFO_TAG_CTRDG_PHI, CTRDGi_CallbackForSetPhi );
/*
* enable .
* ()
*/
#if defined(SDK_ARM9)
CTRDG_Enable(FALSE);
#endif
#endif // SDK_SMALL_BUILD
}
/*---------------------------------------------------------------------------*
Name: CTRDGi_InitModuleInfo
Description: initialize the information of peripheral device around cartridge
Because try lock cartridge, in case another processor had locked,
wait till its was released.
To avoid other bus master interrupts,
DMA1 is used for accessing cartridge.
This is a compatibility in future.
Arguments: None
Returns: None
*---------------------------------------------------------------------------*/
static CTRDGHeader headerBuf ATTRIBUTE_ALIGN(32);
void CTRDGi_InitModuleInfo(void)
{
#ifndef SDK_SMALL_BUILD
static BOOL isInitialized;
CTRDGLockByProc lockInfo;
OSIrqMask lastIE;
BOOL lastIME;
CTRDGModuleInfo *cip = CTRDGi_GetModuleInfoAddr();
if (isInitialized)
{
return;
}
isInitialized = TRUE;
if (!(reg_OS_PAUSE & REG_OS_PAUSE_CHK_MASK))
{
return;
}
lastIE = OS_SetIrqMask(OS_IE_SPFIFO_RECV);
lastIME = OS_EnableIrq();
//---- get privilege for accessing cartridge
CTRDGi_LockByProcessor(CTRDGi_Work.lockID, &lockInfo);
//---- read information of peripheral devices
{
MIProcessor proc = MI_GetMainMemoryPriority();
CTRDGRomCycle rc;
// set the latest access cycle
CTRDGi_ChangeLatestAccessCycle(&rc);
// set main memory priority for avoiding DMA stole by ARM7 access
MI_SetMainMemoryPriority(MI_PROCESSOR_ARM9);
// 16bit access in order to have much enough access interval
DC_InvalidateRange(&((u8 *)&headerBuf)[0x80], sizeof(headerBuf) - 0x80);
MI_DmaCopy16(1, (void *)(HW_CTRDG_ROM + 0x80),
&((u8 *)&headerBuf)[0x80], sizeof(headerBuf) - 0x80);
// restore main memory priority
MI_SetMainMemoryPriority(proc);
// restore access cycle
CTRDGi_RestoreAccessCycle(&rc);
}
//---- release privilege for accessing cartridge
CTRDGi_UnlockByProcessor(CTRDGi_Work.lockID, &lockInfo);
//---- copy the information of peripheral devices to system area
{
int i;
CTRDGHeader *chb = &headerBuf;
cip->moduleID.raw = chb->moduleID;
for (i = 0; i < 3; i++)
{
cip->exLsiID[i] = chb->exLsiID[i];
}
cip->makerCode = chb->makerCode;
cip->gameCode = chb->gameCode;
}
//---- copy NINTENDO logo data in the ARM9 system ROM to main memory
MI_CpuCopy32((void *)CTRDG_SYSROM9_NINLOGO_ADR, &headerBuf.nintendoLogo,
sizeof(headerBuf.nintendoLogo));
DC_FlushAll();
//---- send message to ARM7
CTRDGi_SendtoPxi(CTRDG_PXI_COMMAND_INIT_MODULE_INFO |
(((u32)&headerBuf - HW_MAIN_MEM) >> 5) << CTRDG_PXI_COMMAND_PARAM_SHIFT);
//---- wait till ARM7 finish initialize
while (CTRDGi_Work.subpInitialized != TRUE)
{
SVC_WaitByLoop(1);
}
(void)OS_RestoreIrq(lastIME);
(void)OS_SetIrqMask(lastIE);
#endif // SDK_SMALL_BUILD
}
/*---------------------------------------------------------------------------*
Name: CTRDGi_CallbackForInitModuleInfo
Description: callback to receive data from PXI
Arguments: tag : tag from PXI (unused)
data : data from PXI
err : error bit (unused)
Returns: None
*---------------------------------------------------------------------------*/
static void CTRDGi_CallbackForInitModuleInfo(PXIFifoTag tag, u32 data, BOOL err)
{
#pragma unused( tag, err )
if ((data & CTRDG_PXI_COMMAND_MASK) == CTRDG_PXI_COMMAND_INIT_MODULE_INFO)
{
CTRDGi_Work.subpInitialized = TRUE;
}
else
{
#ifndef SDK_FINALROM
OS_Panic("illegal Cartridge pxi command.");
#else
OS_Panic("");
#endif
}
}
//================================================================================
// PULLOUT PROCS
//================================================================================
/*---------------------------------------------------------------------------*
Name: CTRDGi_PulledOutCallback
Description: callback to receive data from PXI
Arguments: tag : tag from PXI (unused)
data : data from PXI
err : error bit (unused)
Returns: None
*---------------------------------------------------------------------------*/
static void CTRDGi_PulledOutCallback(PXIFifoTag tag, u32 data, BOOL err)
{
#pragma unused( tag, err )
//---- receive message 'pulled out'
if ((data & CTRDG_PXI_COMMAND_MASK) == CTRDG_PXI_COMMAND_PULLED_OUT)
{
if (ctrdg_already_pullout == FALSE)
{
BOOL isTerminateImm = FALSE;
//---- call user callback
if (CTRDG_UserCallback)
{
isTerminateImm = CTRDG_UserCallback();
}
//---- terminate
if (isTerminateImm)
{
CTRDG_TerminateForPulledOut();
}
/* 一度呼ばれたら、もう呼ばれない */
ctrdg_already_pullout = TRUE;
}
}
else
{
OS_Printf(">>>tag[%x] data[%x] err[%x]\n", tag, data, err);
#ifndef SDK_FINALROM
OS_Panic("illegal Cartridge pxi command.");
#else
OS_Panic("");
#endif
}
}
/*---------------------------------------------------------------------------*
Name: CTRDG_SetPulledOutCallback
Description: set user callback for being pulled out cartridge
Arguments: callback : callback
Returns: None
*---------------------------------------------------------------------------*/
void CTRDG_SetPulledOutCallback(CTRDGPulledOutCallback callback)
{
CTRDG_UserCallback = callback;
}
/*---------------------------------------------------------------------------*
Name: CTRDG_TerminateForPulledOut
Description: terminate for pulling out cartridge.
send message to do termination to ARM7
Arguments: None
Returns: None
*---------------------------------------------------------------------------*/
void CTRDG_TerminateForPulledOut(void)
{
//---- send 'TERMINATE' command to ARM7, and terminate itself immediately
CTRDGi_SendtoPxi(CTRDG_PXI_COMMAND_TERMINATE);
OS_Terminate();
}
/*---------------------------------------------------------------------------*
Name: CTRDG_SendToARM7
Description: send data to ARM7
Arguments: arg : data to send
Returns: None
*---------------------------------------------------------------------------*/
void CTRDG_SendToARM7(void *arg)
{
(void)PXI_SendWordByFifo(PXI_FIFO_TAG_CTRDG_Ex, (u32)arg, FALSE);
}
/*---------------------------------------------------------------------------*
Name: CTRDG_CheckPulledOut
Description: cartridge is pulled out
Arguments: None
Returns: None
*---------------------------------------------------------------------------*/
void CTRDG_CheckPulledOut(void)
{
//---- if skip flag or cartridge already pulled out.
if (skipCheck || isCartridgePullOut)
{
return;
}
//---------------- check cartridge pulled out
//---- check cartridge
isCartridgePullOut = CTRDG_IsPulledOut();
//---- if no cartridge...
if (!CTRDG_IsExisting())
{
if (!isCartridgePullOut)
{
skipCheck = TRUE;
return;
}
}
//---------------- if cartridge pulled out, tell that to ARM9
if (isCartridgePullOut)
{
/* ARM7 から PXI で呼んでいた関数を同じく呼ぶ */
/* 引数は処理がされる場合の引数に強制的にした */
CTRDGi_PulledOutCallback(PXI_FIFO_TAG_CTRDG, CTRDG_PXI_COMMAND_PULLED_OUT, NULL);
}
}
/*---------------------------------------------------------------------------*
Name: CTRDG_SetPhiClock
Description: set ARM9 and ARM7 PHI output clock
Arguments: clock : PHI clock to set. (MIPhiClock value)
Returns: None.
*---------------------------------------------------------------------------*/
void CTRDG_SetPhiClock(CTRDGPhiClock clock)
{
u32 data = ((u32)clock << CTRDG_PXI_COMMAND_PARAM_SHIFT)| CTRDG_PXI_COMMAND_SET_PHI;
//---- check parameter range
SDK_ASSERT( (u32)clock <= CTRDG_PHI_CLOCK_16MHZ );
//---- set ARM9 PHI output clock
MIi_SetPhiClock( (MIiPhiClock)clock );
//---- send command to set ARM7 phi clock
CTRDGi_Lock = TRUE;
while (PXI_SendWordByFifo(PXI_FIFO_TAG_CTRDG_PHI, data, FALSE) != PXI_FIFO_SUCCESS)
{
SVC_WaitByLoop(1);
}
//---- wait response
while( CTRDGi_Lock )
{
SVC_WaitByLoop(1);
}
}
/*---------------------------------------------------------------------------*
Name: CTRDG_CallbackForSetPhi
Description: callback from ARM7 to receive PHI clock setting
Arguments: tag : tag from PXI (unused)
data : data from PXI
err : error bit (unused)
Returns: None.
*---------------------------------------------------------------------------*/
static void CTRDGi_CallbackForSetPhi(PXIFifoTag tag, u32 data, BOOL err)
{
#pragma unused(tag, data, err)
CTRDGi_Lock = FALSE;
}

View File

@ -0,0 +1,34 @@
#! make -f
#----------------------------------------------------------------------------
# Project: TwlSDK - libraries - ctrdg
# File: Makefile
#
# 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.
#
# $Log: $
# $NoKeywords: $
#----------------------------------------------------------------------------
include $(TWLSDK_ROOT)/build/buildtools/commondefs
#----------------------------------------------------------------------------
SUBDIRS = ARM9
#ifdef TWL_WITH_ARM7
SUBDIRS += # ARM7
#endif
#----------------------------------------------------------------------------
include $(TWLSDK_ROOT)/build/buildtools/modulerules
#===== End of Makefile =====

View File

@ -0,0 +1,918 @@
/*---------------------------------------------------------------------------*
Project: NitroSDK - CTRDG
File: ctrdg.c
Copyright 2003-2006 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.
$Log: ctrdg.c,v $
Revision 1.23 2006/04/24 00:05:09 okubata_ryoma
CW2.0
Revision 1.22 2006/02/22 04:06:44 kitase_hirotake
Revision 1.21 2006/02/10 02:53:18 yosizaki
support memory protection of cartridge access.
Revision 1.20 2006/01/18 02:11:20 kitase_hirotake
do-indent
Revision 1.19 2005/11/30 12:22:42 yosizaki
add CTRDG_IsEnabled(), CTRDG_Enable(), CTRDG_CheckEnabled().
Revision 1.18 2005/04/12 06:22:51 yosizaki
add pulled-out checkers.
Revision 1.17 2005/02/28 05:26:03 yosizaki
do-indent.
Revision 1.16 2005/02/18 14:19:10 seiki_masashi
Copyright
Revision 1.15 2005/02/18 13:17:08 seiki_masashi
warning
Revision 1.14 2004/09/29 02:32:59 yada
consider for exchanging a option cartridge and an AGB cartridge in sleeping
Revision 1.13 2004/09/27 13:46:04 yada
only arrange spacing
Revision 1.12 2004/09/21 01:31:23 yada
in CTRDG_CommonInit(), call SVC_CpuClear instead of MI_CpuClear.
Revision 1.11 2004/09/17 12:25:18 yada
add data forwarding functions
Revision 1.10 2004/09/17 06:43:50 yada
add line in CTRDG_CpuCopy8()
Revision 1.9 2004/09/17 05:11:50 yada
add CTRDG_IsOptionCartridge()
Revision 1.8 2004/09/16 09:22:20 yada
fix a little
Revision 1.7 2004/09/16 04:11:48 yada
OS_IsExisting() skip process after detect pulled out
Revision 1.6 2004/09/14 11:56:49 yada
only write comment about CTRDGi_InitCommon
Revision 1.5 2004/09/14 09:59:17 yada
move ARM9 code to ctrdg_proc.c
Revision 1.4 2004/09/14 08:52:43 yada
separate callback to 2 function
Revision 1.3 2004/09/14 07:23:45 yada
fix a little
Revision 1.2 2004/09/14 06:09:44 yada
check cartridge pulled out in ARM7
Revision 1.1 2004/09/13 10:45:14 yada
initial release.
$NoKeywords: $
*---------------------------------------------------------------------------*/
#include <nitro/ctrdg.h>
#include <../include/ctrdg_work.h>
#include <nitro/os/ARM9/cache.h>
//----------------------------------------------------------------------------
CTRDGWork CTRDGi_Work;
/* cartridge permission */
static BOOL CTRDGi_EnableFlag = FALSE;
/*---------------------------------------------------------------------------*
Name: CTRDGi_InitCommon
Description: common routine called from CTRDG_Init.
keep lockID for cartridge functions.
Arguments: None
Returns: None
*---------------------------------------------------------------------------*/
void CTRDGi_InitCommon(void)
{
SVC_CpuClear(0, &CTRDGi_Work, sizeof(CTRDGi_Work), 32); // use SVC_* intentionally.
CTRDGi_Work.lockID = (u16)OS_GetLockID();
}
/*---------------------------------------------------------------------------*
Name: CTRDG_IsBitID
Description: return whether peripheral device which is specified by bitID exists
in cartridge
Arguments: bitID bit ID
Returns: TRUE if existed
*---------------------------------------------------------------------------*/
BOOL CTRDG_IsBitID(u8 bitID)
{
return (CTRDG_IsExisting() && CTRDGi_IsBitIDAtInit(bitID));
}
/*---------------------------------------------------------------------------*
Name: CTRDGi_IsBitIDAtInit
Description: return whether peripheral device which is specified by bitID existed
in cartridge at boot time
Arguments: bitID bit ID
Returns: TRUE if existed
*---------------------------------------------------------------------------*/
BOOL CTRDGi_IsBitIDAtInit(u8 bitID)
{
BOOL retval = FALSE;
CTRDGModuleInfo *cip = CTRDGi_GetModuleInfoAddr();
if (cip->moduleID.raw != 0xffff && cip->moduleID.raw != 0x0000 && ~cip->moduleID.bitID & bitID)
{
retval = TRUE;
}
return retval;
}
/*---------------------------------------------------------------------------*
Name: CTRDG_IsNumberID
Description: return whether peripheral device which is specified by numberID exists
in cartridge
Arguments: numberID number ID
Returns: TRUE if existed
*---------------------------------------------------------------------------*/
BOOL CTRDG_IsNumberID(u8 numberID)
{
return (CTRDG_IsExisting() && CTRDGi_IsNumberIDAtInit(numberID));
}
/*---------------------------------------------------------------------------*
Name: CTRDGi_IsNumberIDAtInit
Description: return whether peripheral device which is specified by numberID existed
in cartridge at boot time
Arguments: numberID number ID
Returns: TRUE if existed
*---------------------------------------------------------------------------*/
BOOL CTRDGi_IsNumberIDAtInit(u8 numberID)
{
BOOL retval = FALSE;
CTRDGModuleInfo *cip = CTRDGi_GetModuleInfoAddr();
if (cip->moduleID.raw != 0xffff && cip->moduleID.raw != 0x0000)
{
if (cip->moduleID.numberID == numberID)
{
retval = TRUE;
}
else if (!cip->moduleID.disableExLsiID)
{
if (cip->exLsiID[0] == numberID
|| cip->exLsiID[1] == numberID || cip->exLsiID[2] == numberID)
{
retval = TRUE;
}
}
}
return retval;
}
/*---------------------------------------------------------------------------*
Name: CTRDG_IsAgbCartridge
Description: return whether AGB cartridge exists
Arguments: None
Returns: TRUE if existed
*---------------------------------------------------------------------------*/
BOOL CTRDG_IsAgbCartridge(void)
{
return (CTRDG_IsExisting() && CTRDGi_IsAgbCartridgeAtInit());
}
/*---------------------------------------------------------------------------*
Name: CTRDG_IsOptionCartridge
Description: return whether option cartridge exists
Arguments: None
Returns: TRUE if existed
*---------------------------------------------------------------------------*/
BOOL CTRDG_IsOptionCartridge(void)
{
return (CTRDG_IsExisting() && !CTRDGi_IsAgbCartridgeAtInit());
}
/*---------------------------------------------------------------------------*
Name: CTRDGi_IsAgbCartridgeAtInit
Description: return whether AGB cartridge existed at boot time
Arguments: None
Returns: TRUE if existed
*---------------------------------------------------------------------------*/
BOOL CTRDGi_IsAgbCartridgeAtInit(void)
{
CTRDGModuleInfo *cip = CTRDGi_GetModuleInfoAddr();
return cip->isAgbCartridge;
}
/*---------------------------------------------------------------------------*
Name: CTRDG_GetAgbGameCode
Description: get game code in AGB cartridge
Arguments: None
Returns: Game code if exist, FALSE if cartridge not exist
*---------------------------------------------------------------------------*/
u32 CTRDG_GetAgbGameCode(void)
{
u32 retval = FALSE;
if (CTRDG_IsExisting())
{
retval = CTRDGi_GetAgbGameCodeAtInit();
}
return retval;
}
/*---------------------------------------------------------------------------*
Name: CTRDGi_GetAgbGameCodeAtInit
Description: get game code in AGB cartridge read at boot time
Arguments: None
Returns: Game code if exist, FALSE if cartridge did not exist
*---------------------------------------------------------------------------*/
u32 CTRDGi_GetAgbGameCodeAtInit(void)
{
CTRDGModuleInfo *cip = CTRDGi_GetModuleInfoAddr();
u32 retval = FALSE;
if (CTRDGi_IsAgbCartridgeAtInit())
{
retval = cip->gameCode;
}
return retval;
}
/*---------------------------------------------------------------------------*
Name: CTRDG_GetAgbMakerCode
Description: get maker code in AGB cartridge
Arguments: None
Returns: Maker code if exist, FALSE if cartridge not exist
*---------------------------------------------------------------------------*/
u16 CTRDG_GetAgbMakerCode(void)
{
u16 retval = FALSE;
if (CTRDG_IsExisting())
{
retval = CTRDGi_GetAgbMakerCodeAtInit();
}
return retval;
}
/*---------------------------------------------------------------------------*
Name: CTRDGi_GetAgbMakerCodeAtInit
Description: get maker code in AGB cartridge read at boot time
Arguments: None
Returns: Maker code if exist, FALSE if not exist
*---------------------------------------------------------------------------*/
u16 CTRDGi_GetAgbMakerCodeAtInit(void)
{
CTRDGModuleInfo *cip = CTRDGi_GetModuleInfoAddr();
u16 retval = FALSE;
if (CTRDGi_IsAgbCartridgeAtInit())
{
retval = cip->makerCode;
}
return retval;
}
/*---------------------------------------------------------------------------*
Name: CTRDG_IsPulledOut
Description: get whether system has detected pulled out cartridge
Arguments: None
Returns: TRUE if detect pull out
*---------------------------------------------------------------------------*/
BOOL CTRDG_IsPulledOut(void)
{
CTRDGModuleInfo *cip = CTRDGi_GetModuleInfoAddr();
//---- cartridge not exist at boot time
if (cip->moduleID.raw == 0xffff)
{
return FALSE;
}
//---- check existing when not detect pulled out
if (!cip->detectPullOut)
{
(void)CTRDG_IsExisting();
}
return cip->detectPullOut;
}
/*---------------------------------------------------------------------------*
Name: CTRDG_IsAgbCartridgePulledOut
Description: get whether system has detected pulled out AGB cartridge
Arguments: None
Returns: TRUE if detect pull out
*---------------------------------------------------------------------------*/
BOOL CTRDG_IsAgbCartridgePulledOut(void)
{
return (CTRDG_IsPulledOut() && CTRDGi_IsAgbCartridgeAtInit());
}
/*---------------------------------------------------------------------------*
Name: CTRDG_IsOptionCartridgePulledOut
Description: get whether system has detected pulled out option cartridge
Arguments: None
Returns: TRUE if detect pull out
*---------------------------------------------------------------------------*/
BOOL CTRDG_IsOptionCartridgePulledOut(void)
{
return (CTRDG_IsPulledOut() && !CTRDGi_IsAgbCartridgeAtInit());
}
/*---------------------------------------------------------------------------*
Name: CTRDG_IsExisting
Description: get whether cartridge exists
Arguments: None
Returns: TRUE if existing
*---------------------------------------------------------------------------*/
BOOL CTRDG_IsExisting(void)
{
BOOL retval = TRUE;
CTRDGLockByProc lockInfo;
CTRDGHeader *chp = CTRDGi_GetHeaderAddr();
CTRDGModuleInfo *cip = CTRDGi_GetModuleInfoAddr();
//---- if cartridge not exist at boot time.
if (cip->moduleID.raw == 0xffff)
{
return FALSE;
}
//---- if detect cartirdge pulled out
if (cip->detectPullOut == TRUE)
{
return FALSE;
}
#if defined(SDK_ARM7)
//---- get privilege for accessing cartridge
if(CTRDGi_LockByProcessor(CTRDGi_Work.lockID, &lockInfo) == FALSE)
{
(void)OS_RestoreInterrupts(lockInfo.irq);
return TRUE;
}
#else
//---- get privilege for accessing cartridge
CTRDGi_LockByProcessor(CTRDGi_Work.lockID, &lockInfo);
#endif
//---- check if cartridge exists
{
CTRDGRomCycle rc;
u8 isRomCode;
// set the lastest access cycle
CTRDGi_ChangeLatestAccessCycle(&rc);
isRomCode = chp->isRomCode;
// ( please observe comparison order to the following )
if ((isRomCode == CTRDG_IS_ROM_CODE && cip->moduleID.raw != chp->moduleID) // memory loaded
|| (isRomCode != CTRDG_IS_ROM_CODE && cip->moduleID.raw != *CTRDGi_GetModuleIDImageAddr()) // memory not loaded
|| ((cip->gameCode != chp->gameCode) && cip->isAgbCartridge)) // AGB cartridge comparison
{
cip->detectPullOut = TRUE;
retval = FALSE;
}
//---- restore access cycle
CTRDGi_RestoreAccessCycle(&rc);
}
//---- release privilege for accessing cartridge
CTRDGi_UnlockByProcessor(CTRDGi_Work.lockID, &lockInfo);
return retval;
}
/*---------------------------------------------------------------------------*
Name: CTRDGi_ChangeLatestAccessCycle
Description: set access cycle to cartridge to latest setting
Arguments: r : Cartridge ROM access cycle
Returns: None.
*---------------------------------------------------------------------------*/
void CTRDGi_ChangeLatestAccessCycle(CTRDGRomCycle *r)
{
r->c1 = MI_GetCartridgeRomCycle1st();
r->c2 = MI_GetCartridgeRomCycle2nd();
MI_SetCartridgeRomCycle1st(MI_CTRDG_ROMCYCLE1_18);
MI_SetCartridgeRomCycle2nd(MI_CTRDG_ROMCYCLE2_6);
}
/*---------------------------------------------------------------------------*
Name: CTRDGi_RestoreAccessCycle
Description: set access cycle to cartridge to the original setting
Arguments: r : Cartridge ROM access cycle
Returns: None.
*---------------------------------------------------------------------------*/
void CTRDGi_RestoreAccessCycle(CTRDGRomCycle *r)
{
MI_SetCartridgeRomCycle1st(r->c1);
MI_SetCartridgeRomCycle2nd(r->c2);
}
/*---------------------------------------------------------------------------*
Name: CTRDGi_LockByProcessor
Description: get privilege for accessing cartridge to specified processor
Because try lock cartridge, in case another processor had locked,
wait till its was released.
Status of interrupt in return is disable.
Arguments: lockID : lock ID for cartridge
info : info for lock by my processor
Returns: None.
*---------------------------------------------------------------------------*/
#if defined(SDK_ARM7)
BOOL CTRDGi_LockByProcessor(u16 lockID, CTRDGLockByProc *info)
#else
void CTRDGi_LockByProcessor(u16 lockID, CTRDGLockByProc *info)
#endif
{
while (1)
{
info->irq = OS_DisableInterrupts();
if (((info->locked = OS_ReadOwnerOfLockCartridge() & CTRDG_LOCKED_BY_MYPROC_FLAG) != 0)
|| (OS_TryLockCartridge(lockID) == OS_LOCK_SUCCESS))
{
#if defined(SDK_ARM7)
return TRUE;
#else
break;
#endif
}
#if defined(SDK_ARM7)
return FALSE;
#endif
(void)OS_RestoreInterrupts(info->irq);
SVC_WaitByLoop(1);
}
}
/*---------------------------------------------------------------------------*
Name: CTRDGi_UnlockByProcessor
Description: release privilege for accessing cartirige
Arguments: lockID : lock ID for cartridge
info : info for lock by my processor
it must be the value got in CTRDGi_LockCartridgeByProccesser.
Returns: None.
*---------------------------------------------------------------------------*/
void CTRDGi_UnlockByProcessor(u16 lockID, CTRDGLockByProc *info)
{
if (!info->locked)
{
(void)OS_UnLockCartridge(lockID);
}
(void)OS_RestoreInterrupts(info->irq);
}
/*---------------------------------------------------------------------------*
Name: CTRDGi_SendtoPxi
Description: send data via PXI
Arguments: data : data to send
Returns: None
*---------------------------------------------------------------------------*/
void CTRDGi_SendtoPxi(u32 data)
{
while (PXI_SendWordByFifo(PXI_FIFO_TAG_CTRDG, data, FALSE) != PXI_FIFO_SUCCESS)
{
SVC_WaitByLoop(1);
}
}
//================================================================================
// READ DATA FROM CARTRIDGE
//================================================================================
/*---------------------------------------------------------------------------*
Name: CTRDG_DmaCopy16 / 32
Description: read cartridge data via DMA
Arguments: dmaNo : DMA No.
src : source address (in cartridge)
dest : destination address (in memory)
size : forwarding size
Returns: TRUE if success.
FALSE if fail. ( no cartridge )
*---------------------------------------------------------------------------*/
BOOL CTRDG_DmaCopy16(u32 dmaNo, const void *src, void *dest, u32 size)
{
return CTRDGi_CopyCommon(dmaNo, src, dest, size, CTRDGi_FORWARD_DMA16);
}
BOOL CTRDG_DmaCopy32(u32 dmaNo, const void *src, void *dest, u32 size)
{
return CTRDGi_CopyCommon(dmaNo, src, dest, size, CTRDGi_FORWARD_DMA32);
}
/*---------------------------------------------------------------------------*
Name: CTRDG_CpuCopy8 / 16 / 32
Description: read cartridge data by CPU access
Arguments: src : source address (in cartridge)
dest : destination address (in memory)
size : forwarding size
Returns: TRUE if success.
FALSE if fail. ( no cartridge )
*---------------------------------------------------------------------------*/
BOOL CTRDG_CpuCopy8(const void *src, void *dest, u32 size)
{
if (HW_CTRDG_ROM <= (u32)dest && (u32)dest < HW_CTRDG_RAM_END)
{
return CTRDGi_CopyCommon(0 /*dummy */ , (const void *)dest, (void *)src, size,
CTRDGi_FORWARD_CPU8);
}
else
{
return CTRDGi_CopyCommon(0 /*dummy */ , src, dest, size, CTRDGi_FORWARD_CPU8);
}
}
BOOL CTRDG_CpuCopy16(const void *src, void *dest, u32 size)
{
return CTRDGi_CopyCommon(0 /*dummy */ , src, dest, size, CTRDGi_FORWARD_CPU16);
}
BOOL CTRDG_CpuCopy32(const void *src, void *dest, u32 size)
{
return CTRDGi_CopyCommon(0 /*dummy */ , src, dest, size, CTRDGi_FORWARD_CPU32);
}
/*---------------------------------------------------------------------------*
Name: CTRDGi_CopyCommon
Description: read/write cartridge data.
subroutine of CTRDG_CpuCopy*(), CTRDG_DmaCopy*() and CTRDG_WriteStream8().
Arguments: dmaNo : DMA No.
src : source address
dest : destination address
size : forwarding size
forwardType : action flag
Returns: TRUE if success.
FALSE if fail. ( no cartridge )
*---------------------------------------------------------------------------*/
BOOL CTRDGi_CopyCommon(u32 dmaNo, const void *src, void *dest, u32 size, u32 forwardType)
{
//---- check cartridge existence
if (!CTRDG_IsExisting())
{
return FALSE;
}
/* confirm whether application has certainly judged AGB-cartridge */
CTRDG_CheckEnabled();
(void)OS_LockCartridge(CTRDGi_Work.lockID);
if ((forwardType & CTRDGi_FORWARD_TYPE_MASK) == CTRDGi_FORWARD_TYPE_DMA)
{
MI_StopDma(dmaNo);
DC_FlushRange(dest, size);
}
switch (forwardType)
{
case CTRDGi_FORWARD_DMA16:
MI_DmaCopy16(dmaNo, src, dest, size);
break;
case CTRDGi_FORWARD_DMA32:
MI_DmaCopy32(dmaNo, src, dest, size);
break;
case CTRDGi_FORWARD_CPU16:
MI_CpuCopy16(src, dest, size);
break;
case CTRDGi_FORWARD_CPU32:
MI_CpuCopy32(src, dest, size);
break;
case CTRDGi_FORWARD_CPU8:
{
int n;
u8 *dest8 = (u8 *)dest;
u8 *src8 = (u8 *)src;
for (n = 0; n < size; n++)
{
*dest8++ = *src8++;
}
}
break;
}
(void)OS_UnLockCartridge(CTRDGi_Work.lockID);
//---- check to remove cartridge in the middle of reading
if (!CTRDG_IsExisting())
{
return FALSE;
}
return TRUE;
}
/*---------------------------------------------------------------------------*
Name: CTRDG_Read8 / 16 / 32
Description: read cartridge data by CPU access
Arguments: address : source address (in cartridge)
rdata : address to store read data
Returns: TRUE if success.
FALSE if fail. ( no cartridge )
*---------------------------------------------------------------------------*/
BOOL CTRDG_Read8(const u8 *address, u8 *rdata)
{
return CTRDGi_AccessCommon((void *)address, 0 /*dummy */ , rdata, CTRDGi_ACCESS_READ8);
}
BOOL CTRDG_Read16(const u16 *address, u16 *rdata)
{
return CTRDGi_AccessCommon((void *)address, 0 /*dummy */ , rdata, CTRDGi_ACCESS_READ16);
}
BOOL CTRDG_Read32(const u32 *address, u32 *rdata)
{
return CTRDGi_AccessCommon((void *)address, 0 /*dummy */ , rdata, CTRDGi_ACCESS_READ32);
}
/*---------------------------------------------------------------------------*
Name: CTRDG_Write8 / 16 / 32
Description: write data to cartridge
Arguments: address : destination address (in cartridge)
data : data to write
Returns: TRUE if success.
FALSE if fail. ( no cartridge )
*---------------------------------------------------------------------------*/
BOOL CTRDG_Write8(u8 *address, u8 data)
{
return CTRDGi_AccessCommon(address, data, 0 /*dummy */ , CTRDGi_ACCESS_WRITE8);
}
BOOL CTRDG_Write16(u16 *address, u16 data)
{
return CTRDGi_AccessCommon(address, data, 0 /*dummy */ , CTRDGi_ACCESS_WRITE16);
}
BOOL CTRDG_Write32(u32 *address, u32 data)
{
return CTRDGi_AccessCommon(address, data, 0 /*dummy */ , CTRDGi_ACCESS_WRITE32);
}
/*---------------------------------------------------------------------------*
Name: CTRDGi_AccessCommon
Description: read/write cartridge data.
subroutine of CTRDG_Read*() and CTRDG_Write*().
Arguments: address : address to access
data : data to write (in write mode)
rdata : address to store read data (in read mode)
accessType : action flag
Returns: TRUE if success.
FALSE if fail. ( no cartridge )
*---------------------------------------------------------------------------*/
BOOL CTRDGi_AccessCommon(void *address, u32 data, void *rdata, u32 accessType)
{
//---- check cartridge existence
if (!CTRDG_IsExisting())
{
return FALSE;
}
/* confirm whether application has certainly judged AGB-cartridge */
CTRDG_CheckEnabled();
(void)OS_LockCartridge(CTRDGi_Work.lockID);
switch (accessType)
{
case CTRDGi_ACCESS_READ8:
if (rdata)
{
*(u8 *)rdata = *(u8 *)address;
}
break;
case CTRDGi_ACCESS_READ16:
if (rdata)
{
*(u16 *)rdata = *(u16 *)address;
}
break;
case CTRDGi_ACCESS_READ32:
if (rdata)
{
*(u32 *)rdata = *(u32 *)address;
}
break;
case CTRDGi_ACCESS_WRITE8:
*(u8 *)address = (u8)data;
break;
case CTRDGi_ACCESS_WRITE16:
*(u16 *)address = (u16)data;
break;
case CTRDGi_ACCESS_WRITE32:
*(u32 *)address = (u32)data;
break;
}
(void)OS_UnLockCartridge(CTRDGi_Work.lockID);
//---- check to remove cartridge in the middle of reading
if (!CTRDG_IsExisting())
{
return FALSE;
}
return TRUE;
}
/*---------------------------------------------------------------------------*
Name: CTRDG_IsEnabled
Description: check if CTRDG is accessable
Arguments: None.
Returns: Return cartridge access permission.
*---------------------------------------------------------------------------*/
BOOL CTRDG_IsEnabled(void)
{
return CTRDGi_EnableFlag;
}
/*---------------------------------------------------------------------------*
Name: CTRDG_Enable
Description: Set cartridge access permission mode.
Arguments: enable permission mode to be set.
Returns: None.
*---------------------------------------------------------------------------*/
#define SET_PROTECTION_A( id, adr, siz ) ldr r0, =(adr|HW_C6_PR_##siz|HW_C6_PR_ENABLE)
#define SET_PROTECTION_B( id, adr, siz ) mcr p15, 0, r0, c6, id, 0
#define REGION_BIT(a,b,c,d,e,f,g,h) (((a)<<0)|((b)<<1)|((c)<<2)|((d)<<3)|((e)<<4)|((f)<<5)|((g)<<6)|((h)<<7))
#define REGION_ACC(a,b,c,d,e,f,g,h) (((a)<<0)|((b)<<4)|((c)<<8)|((d)<<12)|((e)<<16)|((f)<<20)|((g)<<24)|((h)<<28))
#define NA 0
#define RW 1
#define RO 5
#include <nitro/code32.h>
static asm void CTRDGi_AllocCtrdgPR( void )
{
SET_PROTECTION_A( c3, HW_CTRDG_ROM, 64MB )
SET_PROTECTION_B( c3, HW_CTRDG_ROM, 64MB )
bx lr
}
static asm void CTRDGi_AllocMmemHiPR( void )
{
SET_PROTECTION_A( c3, HW_MAIN_MEM_HI, 32MB )
SET_PROTECTION_B( c3, HW_MAIN_MEM_HI, 32MB )
bx lr
}
#include <nitro/codereset.h>
void CTRDG_Enable(BOOL enable)
{
OSIntrMode bak_cpsr = OS_DisableInterrupts();
CTRDGi_EnableFlag = enable;
#if defined(SDK_ARM9)
// if (!CTRDG_IsOptionCartridge()) <- この条件では不正アクセスの可能性あり
{
u32 iacc = (u32)(enable ? OS_PR3_ACCESS_RW : OS_PR3_ACCESS_NA);
u32 dacc = (u32)(enable ? OS_PR3_ACCESS_RW : OS_PR3_ACCESS_RO);
(void)OS_SetIPermissionsForProtectionRegion(OS_PR3_ACCESS_MASK, iacc);
(void)OS_SetDPermissionsForProtectionRegion(OS_PR3_ACCESS_MASK, dacc);
if ( enable )
{
// for CTRDG
OS_DisableICacheForProtectionRegion(1<<3);
OS_DisableDCacheForProtectionRegion(1<<3);
OS_DisableWriteBufferForProtectionRegion(1<<3);
CTRDGi_AllocCtrdgPR();
}
else
{
// for HW_MAIN_MEM_HI
OS_EnableICacheForProtectionRegion(1<<3);
OS_EnableDCacheForProtectionRegion(1<<3);
OS_EnableWriteBufferForProtectionRegion(1<<3);
CTRDGi_AllocMmemHiPR();
}
}
#endif /* defined(SDK_ARM9) */
(void)OS_RestoreInterrupts(bak_cpsr);
}
/*---------------------------------------------------------------------------*
Name: CTRDG_CheckEnabled
Description: Terminate program if CTRDG is not accessable
Arguments: None.
Returns: None.
*---------------------------------------------------------------------------*/
void CTRDG_CheckEnabled(void)
{
#ifdef SDK_ARM9
if (!CTRDG_IsOptionCartridge() && !CTRDG_IsEnabled())
{
OS_TPanic
("cartridge permission denied. (you must call CTRDG_Enable() under the guideline.)");
}
#endif
}

View File

@ -421,12 +421,13 @@ static asm void init_cp15(void)
/*
; Region G: BACK_GROUND: Base = 0x0, Size = 4GB, I:NC NB / D:NC NB, I:NA / D:NA
; Region 0: IO_VRAM: Base = 0x04000000, Size = 64MB, I:NC NB / D:NC NB, I:RW / D:RW
; Region 1Rel: MAIN_MEM: Base = 0x02000000, Size = 8MB*, I:Cach Buf / D:Cach Buf, I:RW / D:RW
; Region 1Dbg: MAIN_MEM: Base = 0x02000000, Size = 8MB, I:Cach Buf / D:Cach Buf, I:RW / D:RW
; Region 1Rel: MAIN_MEM: Base = 0x02000000, Size = 16MB*, I:Cach Buf / D:Cach Buf, I:RW / D:RW
; Region 1Dbg: MAIN_MEM: Base = 0x02000000, Size = 16MB, I:Cach Buf / D:Cach Buf, I:RW / D:RW
; (* Size will be arranged in OS_InitArena(). )
; Region 2Rel: SOUND_DATA: Base = 0x02380000, Size = 512KB, I:NC NB / D:NC NB, I:NA / D:NA
; Region 2D4M: SOUND_DATA: Base = 0x02300000, Size = 1MB, I:NC NB / D:NC NB, I:NA / D:NA
; Region 2D8M: SOUND_DATA: Base = 0x02600000, Size = 2MB, I:NC NB / D:NC NB, I:NA / D:NA
; Region 3: MAIN_MEM_HI: Base = 0x08000000, Size = 256MB, I:Cach Buf / D:Cach Buf, I:RW / D:RW
; Region 3: CARTRIDGE: Base = 0x08000000, Size = 128MB, I:NC NB / D:NC NB, I:NA / D:RW
; Region 4: DTCM: Base = SOUND_DATA, Size = 16KB, I:NC NB / D:NC NB, I:NA / D:RW
; Region 5: ITCM: Base = 0x01000000, Size = 16MB, I:NC NB / D:NC NB, I:RW / D:RW
@ -452,8 +453,8 @@ static asm void init_cp15(void)
SET_PROTECTION_B( c0, HW_IOREG, 64MB )
//---- メインメモリ
SET_PROTECTION_A( c1, HW_MAIN_MEM_MAIN, 8MB )
SET_PROTECTION_B( c1, HW_MAIN_MEM_MAIN, 8MB )
SET_PROTECTION_A( c1, HW_MAIN_MEM_MAIN, 16MB )
SET_PROTECTION_B( c1, HW_MAIN_MEM_MAIN, 16MB )
//---- サウンドデータ領域
#if HW_MAIN_MEM_SUB_SIZE+HW_MAIN_MEM_SHARED_SIZE == 0x1000
@ -490,10 +491,10 @@ static asm void init_cp15(void)
#pragma message(ERROR: Size unmatch HW_MAIN_MEM_SUB_SIZE)
#endif
//---- カートリッジ又は他の用途
// CPU 内部ワーク RAM 等
SET_PROTECTION_A( c3, HW_CTRDG_ROM, 128MB )
SET_PROTECTION_B( c3, HW_CTRDG_ROM, 128MB )
//---- メインメモリ上位イメージ 又は他の用途
// カートリッジ、CPU 内部ワーク RAM 等
SET_PROTECTION_A( c3, HW_MAIN_MEM_HI, 32MB )
SET_PROTECTION_B( c3, HW_MAIN_MEM_HI, 32MB )
//---- データ TCM
// + CPU 内部ワーク RAM の場合あり
@ -542,7 +543,7 @@ static asm void init_cp15(void)
// 1: MAIN_MEM
// 6: BIOS
//
mov r0, #REGION_BIT(0,1,0,0,0,0,1,0)
mov r0, #REGION_BIT(0,1,0,1,0,0,1,0)
mcr p15, 0, r0, c2, c0, 1
//
@ -550,14 +551,14 @@ static asm void init_cp15(void)
// 1: MAIN_MEM
// 6: BIOS
//
mov r0, #REGION_BIT(0,1,0,0,0,0,1,0)
mov r0, #REGION_BIT(0,1,0,1,0,0,1,0)
mcr p15, 0, r0, c2, c0, 0
//
// ライトバッファ イネーブル(リージョン設定)
// 1: MAIN_MEM
//
mov r0, #REGION_BIT(0,1,0,0,0,0,0,0)
mov r0, #REGION_BIT(0,1,0,1,0,0,0,0)
mcr p15, 0, r0, c3, c0, 0
//
@ -571,7 +572,7 @@ static asm void init_cp15(void)
// BIOS : RO
// SHARED : NA
//
ldr r0, =REGION_ACC(RW,RW,NA,NA,NA,RW,RO,NA)
ldr r0, =REGION_ACC(RW,RW,NA,RW,NA,RW,RO,NA)
mcr p15, 0, r0, c5, c0, 3
//

View File

@ -0,0 +1,273 @@
/*---------------------------------------------------------------------------*
Project: NitroSDK - OS
File: os_emulator.c
Copyright 2003-2006 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.
$Log: os_emulator.c,v $
Revision 1.22 2006/04/25 23:58:19 okubata_ryoma
Revision 1.21 2006/01/18 02:11:30 kitase_hirotake
do-indent
Revision 1.20 2005/02/28 05:26:28 yosizaki
do-indent.
Revision 1.19 2005/02/18 08:51:35 yasu
Revision 1.18 2005/02/18 06:20:18 yasu
Signed/Unsigned
Revision 1.17 2004/09/22 00:25:38 yada
OS_GetConsole() Type returns constant value
if SDK_SMALL_BUILD and SDK_FINALROM are defined
Revision 1.16 2004/08/17 04:10:32 yada
detect debugger correctly
Revision 1.15 2004/08/16 08:15:54 yada
HW_CHECK_DEBUGGER_BUF definition is moved to mmap_shared.h header
Revision 1.14 2004/08/11 13:18:58 yada
change method to detect platform
Revision 1.13 2004/07/23 01:03:03 yada
OS_UnLockCartridge -> OS_UnlockCartridge
Revision 1.12 2004/07/22 08:22:41 yada
fix for changing some lockID's type u32->u16
Revision 1.11 2004/06/08 10:43:26 yada
add information about main memory size
Revision 1.10 2004/06/08 04:34:45 yada
only fix comment
Revision 1.9 2004/06/07 04:29:39 yada
add OS_GetConsoleType()
Revision 1.8 2004/02/13 08:39:30 yasu
OS_IsRunOnEmulator returns by FALSE if ARM7
Revision 1.7 2004/02/13 02:26:56 yada
ARM9とAMR7
Revision 1.6 2004/02/12 11:08:30 yada
ARM9/ARM7
Revision 1.5 2004/02/06 09:29:43 yasu
OS_IsRunEmulator
Revision 1.4 2004/02/05 07:09:02 yasu
change SDK prefix iris -> nitro
Revision 1.3 2003/12/25 07:31:26 yada
Revision 1.2 2003/11/30 04:20:26 yasu
OS_EnableInterrupt/DisableInterrupt
Revision 1.1 2003/11/29 01:25:46 yada
Revision 1.1 2003/11/25 11:17:37 yasu
$NoKeywords: $
*---------------------------------------------------------------------------*/
#include <nitro.h>
//---- current processor lock flag
#ifdef SDK_ARM9
#define OSi_CURPROC_LOCKED_FLAG OS_MAINP_LOCKED_FLAG
#else
#define OSi_CURPROC_LOCKED_FLAG OS_SUBP_LOCKED_FLAG
#endif
static u32 OSi_ConsoleTypeCache = OSi_CONSOLE_NOT_DETECT;
u32 OSi_GetDeviceType(void);
BOOL OSi_IsRunOnDebugger(void);
//================================================================================
/*---------------------------------------------------------------------------*
Name: OS_IsRunOnEmulator
Description: Detect emulator
Arguments: None
Returns: non 0 if emulator
*---------------------------------------------------------------------------*/
BOOL OS_IsRunOnEmulator(void)
{
#ifdef SDK_ARM9
#ifndef SDK_FINALROM
static int onEmu = -1; // Not so good coding style...
u32 val;
OSIntrMode intr;
if (onEmu == -1)
{
intr = OS_DisableInterrupts();
{
// PING magic number to ensata
(*(REGType32v *)REG_CLIPMTX_RESULT_0_ADDR) = 0x2468ace0;
// PONG magic number from ensata
val = *(vu16 *)REG_VCOUNT_ADDR & 0x1ffU;
if (val == 270)
{
// Recognized as ensata, send back ACK signal to ensata
*(vu32 *)0x4fff010 = 0x13579bdf; // ACK Signal 1
*(vu32 *)0x4fff010 = 0xfdb97531; // ACK Signal 2
onEmu = TRUE;
}
else
{
// Unidentified ...
onEmu = FALSE;
}
}
(void)OS_RestoreInterrupts(intr);
}
return (BOOL)onEmu;
#else
return FALSE;
#endif
#else // SDK_ARM7
return FALSE; // always FALSE if ARM7
#endif
}
/*---------------------------------------------------------------------------*
Name: OS_GetConsoleType
Description: Detect console type
Arguments: None
Returns:
*---------------------------------------------------------------------------*/
u32 OS_GetConsoleType(void)
{
#if defined( SDK_FINALROM ) || defined( SDK_SMALL_BUILD )
OSi_ConsoleTypeCache = OS_CONSOLE_NITRO | OS_CONSOLE_DEV_CARD | OS_CONSOLE_SIZE_4MB;
#else // if defined( SDK_FINALROM ) && defined( SDK_SMALL_BUILD )
//---- skip if detect already
if (OSi_ConsoleTypeCache == OSi_CONSOLE_NOT_DETECT)
{
//---- whether device is cartridge?
u32 type = OSi_GetDeviceType();
//---- running on software emulator Ensata?
if (OS_IsRunOnEmulator())
{
type |= OS_CONSOLE_ENSATA;
}
//---- running on debugger?
else if (OSi_IsRunOnDebugger())
{
type |= OS_CONSOLE_ISDEBUGGER;
}
//---- is card device cartridge? so that running on IS-Emulator
else if (type & OS_CONSOLE_DEV_CARTRIDGE)
{
type |= OS_CONSOLE_ISEMULATOR;
}
//---- else, maybe retail NITRO.
else
{
type |= OS_CONSOLE_NITRO;
}
//---- main memory size (maybe ARM7 has already detected)
type |= *(u16 *)HW_MMEMCHECKER_SUB;
OSi_ConsoleTypeCache = type;
}
#endif // if defined( SDK_FINALROM ) && defined( SDK_SMALL_BUILD )
return OSi_ConsoleTypeCache;
}
/*---------------------------------------------------------------------------*
Name: OSi_GetDeviceType
Description: get card device type
(subroutine of OS_GetConsoleType)
Arguments: None
Returns: decided by bus card data loaded
OS_CONSOLE_DEV_CARTRIDGE : via cartridge bus
OS_CONSOLE_DEV_CARD : via card bus
*---------------------------------------------------------------------------*/
u32 OSi_GetDeviceType(void)
{
u32 result = OS_CONSOLE_DEV_CARD;
#if 0
BOOL checked = FALSE;
u16 lockId = (u16)OS_GetLockID(); // treat as success absolutely
do
{
s32 ret = OS_LOCK_ERROR;
OSIntrMode enabled = OS_DisableInterrupts();
//---- cartridge already locked or lock now success
if ((OS_ReadOwnerOfLockCartridge() & OSi_CURPROC_LOCKED_FLAG)
|| ((ret = (s32)OS_TryLockCartridge(lockId)) == OS_LOCK_SUCCESS))
{
//---- check cartridge header
result =
(u32)(((((vu32 *)HW_CTRDG_ROM)[0] == (u32)'TNIN') &&
(((vu32 *)HW_CTRDG_ROM)[1] == (u32)'ODNE')) ?
OS_CONSOLE_DEV_CARTRIDGE : OS_CONSOLE_DEV_CARD);
//---- unlock cartridge
if (ret == OS_LOCK_SUCCESS)
{
(void)OS_UnlockCartridge(lockId);
checked = TRUE;
}
}
(void)OS_RestoreInterrupts(enabled);
}
while (!checked);
#endif
return result;
}
/*---------------------------------------------------------------------------*
Name: OSi_IsRunOnDebugger
Description: Detect Debugger
(subroutine of OS_GetConsoleType)
Arguments: None
Returns: TRUE : debugger
FALSE : not debugger
*---------------------------------------------------------------------------*/
BOOL OSi_IsRunOnDebugger(void)
{
u16 *checkAddress = (u16 *)((*(u16 *)HW_CHECK_DEBUGGER_SW ==
0) ? HW_CHECK_DEBUGGER_BUF1 : HW_CHECK_DEBUGGER_BUF2);
return (*checkAddress == 1) ? TRUE : FALSE;
}

View File

@ -0,0 +1,523 @@
/*---------------------------------------------------------------------------*
Project: NitroSDK - OS
File: os_exception.c
Copyright 2003-2006 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.
$Log: os_exception.c,v $
Revision 1.38 2006/05/24 07:54:06 kitase_hirotake
Revision 1.37 2006/05/08 09:26:16 okubata_ryoma
FINALROMの場合はデバッガ上でもOS_CONSOLE_NITROを返すことに関する修正
Revision 1.36 2006/04/04 06:05:53 yosizaki
8.
Revision 1.35 2006/01/18 02:11:30 kitase_hirotake
do-indent
Revision 1.34 2005/02/28 05:26:28 yosizaki
do-indent.
Revision 1.33 2004/11/02 10:35:45 yada
just fix comment
Revision 1.32 2004/10/03 09:59:16 yasu
Avoid sdkindent in inline-asm{}
Revision 1.31 2004/09/02 02:53:42 yada
only change comment
Revision 1.30 2004/08/26 00:20:10 yada
change method to distinguish running on debugger
Revision 1.29 2004/06/11 06:24:43 yada
close SDK_BB support
Revision 1.28 2004/06/10 06:25:06 yada
consider for occurring exception in THUMB mode
Revision 1.27 2004/06/07 10:56:35 yada
make difference to set handler according to exec environment
Revision 1.26 2004/05/12 11:00:48 yada
OSi_ExPrintf always uses OS_Printf
Revision 1.25 2004/05/12 05:34:29 yada
some fix
Revision 1.24 2004/05/12 05:31:46 yada
modification for DEBUGGER
Revision 1.23 2004/05/07 02:11:06 takano_makoto
Change OSiExContext offset definition.
Revision 1.22 2004/04/16 09:36:19 yada
fix temporary exception vector
0x27fffd9c->0x027ffd9c
Revision 1.21 2004/04/14 12:48:20 yada
IS-NITRO-DEBUGGERへの暫定対応
Revision 1.20 2004/03/30 06:09:29 yada
ldconst lda ldr = 使
Revision 1.19 2004/03/18 12:56:43 yada
Revision 1.18 2004/03/11 09:47:14 yada
FIQ,IRQ割り込み禁止していたのをIRQ割り込み禁止のみにした
Revision 1.17 2004/03/09 02:37:59 yada
debuggerモニタハンドラ呼び出し判定部分修正
Revision 1.16 2004/03/08 02:54:13 yada
Revision 1.15 2004/03/01 11:54:24 yada
comment作成
Revision 1.14 2004/02/19 08:43:05 yada
Revision 1.13 2004/02/17 06:04:38 yada
ARM7への対応
Revision 1.12 2004/02/16 09:40:12 yada
ARM7側の割り込みもフックするようにした
Revision 1.11 2004/02/16 00:49:30 yasu
Don't switch ISD/noISD by SDK_LINK_ISD.
Please use stubs library to resolve it at link time.
Revision 1.10 2004/02/13 04:05:28 yada
ARM9とAMR7
Revision 1.9 2004/02/12 11:08:30 yada
ARM9/ARM7
Revision 1.8 2004/02/09 11:17:22 yasu
include code32.h
Revision 1.7 2004/02/05 10:50:59 yada
Revision 1.6 2004/02/05 07:09:02 yasu
change SDK prefix iris -> nitro
Revision 1.5 2004/02/02 05:34:54 yada
OS_SetIrqMask()OS_EnableIrqMask()
Revision 1.4 2004/01/30 08:05:36 yada
FINALROMでは例外表示をしないように修正
Revision 1.3 2004/01/30 04:31:47 yada
Revision 1.2 2004/01/16 01:18:05 yasu
Support SDK_BB
Revision 1.1 2004/01/14 12:03:05 yada
$NoKeywords: $
*---------------------------------------------------------------------------*/
#include <nitro/hw/common/armArch.h>
#include <nitro/memorymap.h>
#include <nitro/os.h>
//---- displaying function OSi_ExPrintf
#ifdef SDK_ARM9
#define OSi_ExPrintf OS_Printf
//#define OSi_ExPrintf ISDPrintf
//void ISDPrintf( const char *pBuf, ... );
#else
#define OSi_ExPrintf OS_Printf
#endif
static asm void OSi_ExceptionHandler( void );
static asm void OSi_GetAndDisplayContext( void );
static asm void OSi_SetExContext( void );
static void OSi_DisplayExContext( void );
//---- context for exception display
typedef struct
{
OSContext context;
u32 cp15;
u32 spsr;
u32 exinfo;
u32 debug[4];
} OSiExContext;
static OSiExContext OSi_ExContext;
//---- user's exception handler
static OSExceptionHandler OSi_UserExceptionHandler;
static void *OSi_UserExceptionHandlerArg;
//---- debugger's exception handler
static void *OSi_DebuggerHandler = NULL;
//================================================================================
// exception vector
//================================================================================
/*---------------------------------------------------------------------------*
Name: OS_SetExceptionVectorUpper
Description: set exception vector to high address
Arguments: None
Returns: None
*---------------------------------------------------------------------------*/
#include <nitro/code32.h>
asm void OS_SetExceptionVectorUpper( void )
{
mrc p15, 0, r0, c1, c0, 0
orr r0, r0, #HW_C1_EXCEPT_VEC_UPPER
mcr p15, 0, r0, c1, c0, 0
bx lr
}
/*---------------------------------------------------------------------------*
Name: OS_SetExceptionVectorLower
Description: set exception vector to low address
Arguments: None
Returns: None
*---------------------------------------------------------------------------*/
asm void OS_SetExceptionVectorLower( void )
{
mrc p15, 0, r0, c1, c0, 0
bic r0, r0, #HW_C1_EXCEPT_VEC_UPPER
mcr p15, 0, r0, c1, c0, 0
bx lr
}
#include <nitro/codereset.h>
//================================================================================
// exception handling
//================================================================================
/*---------------------------------------------------------------------------*
Name: OS_InitException
Description: Initialize exception handling system
Arguments: None
Returns: None
*---------------------------------------------------------------------------*/
// 将来的には HW_EXCP_VECTOR_BUF をこの値に。
#define HW_EXCP_VECTOR_BUF_FOR_DEBUGGER HW_EXCP_VECTOR_MAIN
void OS_InitException(void)
{
//---- consider for debugger exception handler
if (0x2600000 <= *(u32 *)HW_EXCP_VECTOR_BUF_FOR_DEBUGGER
&& *(u32 *)HW_EXCP_VECTOR_BUF_FOR_DEBUGGER < HW_MAIN_MEM_EX_END)
{
OSi_DebuggerHandler = *(void **)HW_EXCP_VECTOR_BUF_FOR_DEBUGGER;
}
else
{
OSi_DebuggerHandler = NULL;
}
//---- exception hook
if (!OSi_DebuggerHandler)
{
*(u32 *)(HW_EXCP_VECTOR_BUF_FOR_DEBUGGER) = (u32)OSi_ExceptionHandler;
// for not-debugger, store handler address into original hook
*(u32 *)(HW_EXCP_VECTOR_BUF) = (u32)OSi_ExceptionHandler;
}
//---- user's handler
OSi_UserExceptionHandler = NULL;
}
/*---------------------------------------------------------------------------*
Name: OS_SetUserExceptionHandler
Description: set user exception handler and its argument
Arguments: handler exception hander
arg its argument
Returns: None
*---------------------------------------------------------------------------*/
void OS_SetUserExceptionHandler(OSExceptionHandler handler, void *arg)
{
OSi_UserExceptionHandler = handler;
OSi_UserExceptionHandlerArg = arg;
}
/*---------------------------------------------------------------------------*
Name: OSi_ExceptionHandler
Description: system exception handler
user handler is called from here
Arguments: None
Returns: None
*---------------------------------------------------------------------------*/
//
// status of stack is {cp15,spsr,r12,lr}
// LSB = 1 means coming by reset
//
#include <nitro/code32.h>
asm void OSi_ExceptionHandler( void )
{
//---- call debugger monitor handler (if exists)
ldr r12, =OSi_DebuggerHandler // r12のみ破壊可
ldr r12, [r12]
cmp r12, #0
movne lr, pc
bxne r12
//---- setting stack pointer <------------------------- consider later
#ifdef SDK_ARM9
//---- ARM9 stack
ldr r12, =HW_ITCM_END
#else
//---- ARM7 stack
ldr r12, =0x3806000
#endif
stmfd r12!, {r0-r3,sp,lr}
and r0, sp, #1
mov sp, r12
mrs r1, CPSR
and r1, r1, #0x1f
//---- if ABORT exception, stop
teq r1, #0x17
bne @10
bl OSi_GetAndDisplayContext
b usr_return
@10:
//---- if UNDEF exception, stop
teq r1, #0x1b
bne usr_return
bl OSi_GetAndDisplayContext
usr_return:
ldr r12, =OSi_DebuggerHandler
ldr r12, [r12]
cmp r12, #0
@1: beq @1
//( stop now even if debugger )
@2:
mov r0,r0 // nop
b @2
ldmfd sp!, {r0-r3, r12, lr}
mov sp, r12
bx lr
}
/*---------------------------------------------------------------------------*
Name: OSi_GetAndDisplayContext
Description: stop after displaying registers
Arguments: None
Returns: None
*---------------------------------------------------------------------------*/
static asm void OSi_GetAndDisplayContext( void )
{
stmfd sp!, {r0, lr} /* コールスタックを 8 バイト整合 */
//---- set exception context
bl OSi_SetExContext
//---- display exception context (and call user callback)
bl OSi_DisplayExContext
ldmfd sp!, {r0, lr} /* コールスタックを 8 バイト整合 */
bx lr
}
/*---------------------------------------------------------------------------*
Name: OSi_SetExContext
Description: set context when exception occurred
Arguments: None
Returns: None
*---------------------------------------------------------------------------*/
// explanation registers at the top of this function.
//
// in r12, {r0-r3,sp} (sp is exception sp) stored.
// in this sp, {cp15,spsr,r12,lr} (cp15,spsr,r12,lr is registers when exception occurred) stored.
// r4-r11 is registers then exception occurred.
// if you want to know spsr,sp,lr, please switch bank and read.
//
static asm void OSi_SetExContext( void )
{
//---- pointer ExContext structure
ldr r1, =OSi_ExContext;
mrs r2, CPSR
str r2, [r1, #OSiExContext.debug[1] ]
//---- store bit which means which is the reason, reset or exception
str r0, [r1, #OSiExContext.exinfo ]
//---- store r0 - r3
ldr r0, [r12,#0]
str r0, [r1, #OS_CONTEXT_R0]
ldr r0, [r12,#4]
str r0, [r1, #OS_CONTEXT_R1]
ldr r0, [r12,#8]
str r0, [r1, #OS_CONTEXT_R2]
ldr r0, [r12, #12]
str r0, [r1, #OS_CONTEXT_R3]
ldr r2, [r12, #16]
bic r2, r2, #1
//---- store r4 - r11
add r0, r1, #OS_CONTEXT_R4
stmia r0, {r4-r11}
//---- (for debug)
str r12, [r1, #OSiExContext.debug[0] ]
#ifdef SDK_ARM9
//---- get {cp15,cpsr,r12,pc} from stack
ldr r0, [r2, #0]
str r0, [r1, #OSiExContext.cp15 ]
ldr r3, [r2, #4]
str r3, [r1, #OS_CONTEXT_CPSR]
ldr r0, [r2, #8]
str r0, [r1, #OS_CONTEXT_R12]
ldr r0, [r2, #12]
str r0, [r1, #OS_CONTEXT_PC_PLUS4]
#else // ifdef SDK_ARM9
//---- get {cpsr,r12,pc} from stack
mov r0, #0
str r0, [r1, #OSiExContext.cp15]
ldr r3, [r2, #0]
str r3, [r1, #OS_CONTEXT_CPSR]
ldr r0, [r2, #4]
str r0, [r1, #OS_CONTEXT_R12]
ldr r0, [r2, #8]
str r0, [r1, #OS_CONTEXT_PC_PLUS4]
#endif // ifdef SDK_ARM9
//---- set mode to one which exception occurred
// but, disable IRQ
mrs r0, CPSR
orr r3, r3, #0x80
bic r3, r3, #0x20
msr CPSR_cxsf, r3
//---- get sp, lr, spsr
str sp, [r1, #OS_CONTEXT_R13]
str lr, [r1, #OS_CONTEXT_R14]
mrs r2, SPSR
//---- debugger
str r2, [r1, #OSiExContext.debug[3] ]
//---- restore mode
msr CPSR_cxsf, r0
bx lr
}
/*---------------------------------------------------------------------------*
Name: OSi_DisplayExContext
Description: stop after display exception context
Arguments: None
Returns: None
*---------------------------------------------------------------------------*/
static void OSi_DisplayExContext()
{
#ifndef SDK_FINALROM
int i;
OSi_ExPrintf("**** Exception Occurred ****\n");
//---------------- displaying registers
//---- for R0-15 Registers
for (i = 0; i < 13; i++)
{
OSi_ExPrintf("R%02d=%08X %c", i, OSi_ExContext.context.r[i], ((i & 3) == 3) ? '\n' : ' ');
}
OSi_ExPrintf("SP =%08X ", OSi_ExContext.context.sp);
OSi_ExPrintf("LR =%08X ", OSi_ExContext.context.lr);
OSi_ExPrintf("PC =%08X\n", OSi_ExContext.context.pc_plus4);
//---- for status Registers
#ifdef SDK_ARM9
OSi_ExPrintf(" CPSR=%08X SPSR=%08X CP15=%08X\n",
OSi_ExContext.context.cpsr, OSi_ExContext.spsr, OSi_ExContext.cp15);
#else
OSi_ExPrintf(" CPSR=%08X SPSR=%08X\n", OSi_ExContext.context.cpsr, OSi_ExContext.spsr);
#endif
//---- for Debug Values
#if 0
for (i = 0; i < 4; i++)
{
OSi_ExPrintf("DEBUG%02d=%08X ", i, OSi_ExContext.debug[i]);
}
#endif
OSi_ExPrintf("\n\n");
#endif
//---------------- user's callback
if (OSi_UserExceptionHandler)
{
//---- force to become SYS mode
// but, use current stack not SYS mode stack
asm
{
/* *INDENT-OFF* */
mov r0, sp
ldr r1, =0x9f
msr CPSR_cxsf, r1
mov sp, r0
/* *INDENT-ON* */
}
#ifdef SDK_ARM9
OS_EnableProtectionUnit();
#endif
//---- call user handler
((void (*)(u32, void *))OSi_UserExceptionHandler) ((u32)&OSi_ExContext,
OSi_UserExceptionHandlerArg);
#ifdef SDK_ARM9
OS_DisableProtectionUnit();
#endif
}
}
#include <nitro/codereset.h>

View File

@ -206,12 +206,12 @@ OSIrqMask OS_SetIrqMask(OSIrqMask intr)
{
BOOL ime = OS_DisableIrq(); // IME disable
OSIrqMask prep = reg_OS_IE;
reg_OS_IE = intr;
reg_OS_IE = (u32)intr;
#ifdef SDK_ARM7
{
OSIrqMask prep2 = reg_OS_IE2;
prep |= prep2 << 32;
reg_OS_IE2 = intr >> 32;
reg_OS_IE2 = (u32)(intr >> 32);
}
#endif
(void)OS_RestoreIrq(ime);
@ -231,12 +231,12 @@ OSIrqMask OS_EnableIrqMask(OSIrqMask intr)
{
BOOL ime = OS_DisableIrq(); // IME disable
OSIrqMask prep = reg_OS_IE;
reg_OS_IE = prep | intr;
reg_OS_IE = (u32)(prep | intr);
#ifdef SDK_ARM7
{
OSIrqMask prep2 = reg_OS_IE2;
prep |= prep2 << 32;
reg_OS_IE2 = prep2 | intr >> 32;
reg_OS_IE2 = (u32)(prep2 | intr >> 32);
}
#endif
(void)OS_RestoreIrq(ime);
@ -256,12 +256,12 @@ OSIrqMask OS_DisableIrqMask(OSIrqMask intr)
{
BOOL ime = OS_DisableIrq(); // IME disable
OSIrqMask prep = reg_OS_IE;
reg_OS_IE = prep & ~intr;
reg_OS_IE = (u32)(prep & ~intr);
#ifdef SDK_ARM7
{
OSIrqMask prep2 = reg_OS_IE2;
prep |= prep2 << 32;
reg_OS_IE2 = prep2 & ~(intr >> 32);
reg_OS_IE2 = (u32)(prep2 & ~(intr >> 32));
}
#endif
(void)OS_RestoreIrq(ime);
@ -282,12 +282,12 @@ OSIrqMask OS_ResetRequestIrqMask(OSIrqMask intr)
{
BOOL ime = OS_DisableIrq(); // IME disable
OSIrqMask prep = reg_OS_IF;
reg_OS_IF = intr;
reg_OS_IF = (u32)intr;
#ifdef SDK_ARM7
{
OSIrqMask prep2 = reg_OS_IF2;
prep |= prep2 << 32;
reg_OS_IF2 = intr >> 32;
reg_OS_IF2 = (u32)(intr >> 32);
}
#endif
(void)OS_RestoreIrq(ime);

View File

@ -269,7 +269,7 @@ void OS_InitLock(void)
MIi_SetCartridgeProcessor(MI_PROCESSOR_ARM7);
#ifndef SDK_FINALROM
_ISDbgLib_Initialize();
// _ISDbgLib_Initialize();
#endif
(void)OS_UnlockByWord(OS_MAINP_SYSTEM_LOCK_ID - 1, lockp, NULL);
@ -289,7 +289,7 @@ void OS_InitLock(void)
}
#ifndef SDK_FINALROM
_ISDbgLib_Initialize();
// _ISDbgLib_Initialize();
#endif
// ロックIDカウンタ用フラグ 初期化

View File

@ -0,0 +1,59 @@
#! make -f
#----------------------------------------------------------------------------
# Project: TwlSDK - libraries - pxi
# File: Makefile
#
# 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.
#
# $Log: $
# $NoKeywords: $
#----------------------------------------------------------------------------
SUBDIRS =
#----------------------------------------------------------------------------
# build ARM & THUMB libraries
TWL_CODEGEN_ALL ?= True
TWL_PROC = ARM7
SRCDIR = ../common .
SRCDIR += $(TWL_NITROSDK_ROOT)/build/libraries/pxi/common/src \
$(TWL_NITROSDK_ROOT)/build/libraries/pxi/ARM7/src \
SRCS = pxi_init.c pxi_fifo.c
TARGET_LIB = libpxi_sp$(TWL_LIBSUFFIX).a
#----------------------------------------------------------------------------
# DEBUG版ビルドの場合、RELEASE版でビルドして
# DEBUG版のライブラリを装います。
ifdef NITRO_DEBUG
NITRO_BUILD_TYPE = RELEASE
endif
include $(TWLSDK_ROOT)/build/buildtools/commondefs
INSTALL_TARGETS = $(TARGETS)
INSTALL_DIR = $(TWL_INSTALL_LIBDIR)
#----------------------------------------------------------------------------
do-build: $(TARGETS)
include $(TWLSDK_ROOT)/build/buildtools/modulerules
#===== End of Makefile =====

View File

@ -0,0 +1,50 @@
#! make -f
#----------------------------------------------------------------------------
# Project: TwlSDK - libraries - pxi
# File: Makefile
#
# 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.
#
# $Log: $
# $NoKeywords: $
#----------------------------------------------------------------------------
SUBDIRS =
#----------------------------------------------------------------------------
# build ARM & THUMB libraries
TWL_CODEGEN_ALL ?= True
TWL_PROC = ARM9
SRCDIR = ../common .
SRCDIR += $(TWL_NITROSDK_ROOT)/build/libraries/pxi/common/src \
$(TWL_NITROSDK_ROOT)/build/libraries/pxi/ARM9/src \
SRCS = pxi_init.c pxi_fifo.c
TARGET_LIB = libpxi$(TWL_LIBSUFFIX).a
include $(TWLSDK_ROOT)/build/buildtools/commondefs
INSTALL_TARGETS = $(TARGETS)
INSTALL_DIR = $(TWL_INSTALL_LIBDIR)
#----------------------------------------------------------------------------
do-build: $(TARGETS)
include $(TWLSDK_ROOT)/build/buildtools/modulerules
#===== End of Makefile =====

View File

@ -0,0 +1,34 @@
#! make -f
#----------------------------------------------------------------------------
# Project: TwlSDK - libraries - pxi
# File: Makefile
#
# 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.
#
# $Log: $
# $NoKeywords: $
#----------------------------------------------------------------------------
include $(TWLSDK_ROOT)/build/buildtools/commondefs
#----------------------------------------------------------------------------
SUBDIRS = ARM9
#ifdef TWL_WITH_ARM7
SUBDIRS += ARM7
#endif
#----------------------------------------------------------------------------
include $(TWLSDK_ROOT)/build/buildtools/modulerules
#===== End of Makefile =====

View File

@ -21,7 +21,6 @@ SUBDIRS =
#----------------------------------------------------------------------------
#TWL_CODEGEN = THUMB
TWL_CODEGEN = ARM
TWL_PROC = ARM7
TARGET_BIN = main.axf

View File

@ -0,0 +1,162 @@
/*---------------------------------------------------------------------------*
Project: NitroSDK - include/sp - HW
File: mmap_global.h
Copyright 2003-2005 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.
$Log: mmap_global.h,v $
Revision 1.13 2005/02/28 05:26:27 yosizaki
do-indent.
Revision 1.12 2004/06/11 06:17:48 yada
close SDK_BB support
Revision 1.11 2004/04/06 06:38:30 yasu
small fix for WRAM address
Revision 1.10 2004/04/05 10:33:49 takano_makoto
Small modyfy at indent.
Revision 1.9 2004/04/05 10:32:34 takano_makoto
Add HW_EXT_WRAM
Revision 1.8 2004/03/25 01:29:45 yada
only add comment
Revision 1.7 2004/03/23 07:41:29 yada
TEGでないときのARM7専用WRAMを考慮
Revision 1.6 2004/02/17 08:22:07 yada
tab整形
Revision 1.5 2004/02/13 10:40:18 yada
(none)
Revision 1.4 2004/02/12 13:32:25 yasu
change include guards
Revision 1.3 2004/02/05 07:09:03 yasu
change SDK prefix iris -> nitro
Revision 1.2 2003/12/22 14:08:52 yasu
include
Revision 1.1 2003/12/16 10:56:38 yasu
spcode
Revision 1.2 2003/12/16 06:29:41 ida
DTCM
RAMの記述を追加
Revision 1.1 2003/12/11 05:38:05 yasu
ARM9
$NoKeywords: $
*---------------------------------------------------------------------------*/
#ifndef NITRO_ARM7_HW_MMAP_GLOBAL_H_
#define NITRO_ARM7_HW_MMAP_GLOBAL_H_
#ifdef __cplusplus
extern "C" {
#endif
//---------------------------------------------------------------------------
// GLOBAL MEMORY MAP
//---------------------------------------------------------------------------
//------------------------------------------------
// Physical Address
//
//----------------------------- MAIN
#define HW_MAIN_MEM 0x02000000
#define HW_MAIN_MEM_SIZE 0x00400000
#define HW_MAIN_MEM_EX_SIZE 0x01000000
#define HW_MAIN_MEM_END (HW_MAIN_MEM + HW_MAIN_MEM_SIZE)
#define HW_MAIN_MEM_EX_END (HW_MAIN_MEM + HW_MAIN_MEM_EX_SIZE)
//----------------------------- MAIN_HI
#define HW_MAIN_MEM_HI 0x0c000000
#define HW_MAIN_MEM_HI_SIZE 0x01000000
#define HW_MAIN_MEM_HI_EX_SIZE 0x02000000
#define HW_MAIN_MEM_HI_END (HW_MAIN_MEM_HI + HW_MAIN_MEM_HI_SIZE)
#define HW_MAIN_MEM_HI_EX_END (HW_MAIN_MEM_HI + HW_MAIN_MEM_HI_EX_SIZE)
//----------------------------- WRAMs
#define HW_WRAM 0x037f8000
#define HW_WRAM_END 0x03800000
#define HW_WRAM_SIZE (HW_WRAM_END-HW_WRAM)
//----------------------------- PRV-WRAMs
#define HW_PRV_WRAM 0x03800000
// TEG : ARM7 WRAM == 32KB
// TS : ARM7 WRAM == 64KB
#if defined(SDK_TEG)
#define HW_PRV_WRAM_END 0x03808000
#else
#define HW_PRV_WRAM_END 0x03810000
#endif
#define HW_PRV_WRAM_SIZE (HW_PRV_WRAM_END-HW_PRV_WRAM)
//----------------------------- IOs
#define HW_IOREG 0x04000000
#define HW_IOREG_END 0x05000000
#define HW_REG_BASE HW_IOREG // alias
//----------------------------- VRAMs
#define HW_BG_PLTT 0x05000000
#define HW_BG_PLTT_END 0x05000200
#define HW_BG_PLTT_SIZE (HW_BG_PLTT_END-HW_BG_PLTT)
#define HW_OBJ_PLTT 0x05000200
#define HW_OBJ_PLTT_END 0x05000400
#define HW_OBJ_PLTT_SIZE (HW_OBJ_PLTT_END-HW_OBJ_PLTT)
#define HW_PLTT HW_BG_PLTT
#define HW_PLTT_END HW_OBJ_PLTT_END
#define HW_PLTT_SIZE (HW_PLTT_END-HW_PLTT)
#define HW_EXT_WRAM 0x06000000
#define HW_EXT_WRAM_END 0x06040000
#define HW_EXT_WRAM_SIZE (HW_EXT_WRAM_END-HW_EXT_WRAM)
#define HW_BG_VRAM 0x06000000
#define HW_BG_VRAM_END 0x06080000
#define HW_BG_VRAM_SIZE (HW_BG_VRAM_END-HW_BG_VRAM)
#define HW_OBJ_VRAM 0x06400000
#define HW_OBJ_VRAM_END 0x06440000
#define HW_OBJ_VRAM_SIZE (HW_OBJ_VRAM_END-HW_OBJ_VRAM)
#define HW_LCDC_VRAM 0x06800000
#define HW_LCDC_VRAM_END 0x06898000
#define HW_LCDC_VRAM_SIZE (HW_LCDC_VRAM_END-HW_LCDC_VRAM)
#define HW_OAM 0x07000000
#define HW_OAM_END 0x07000400
#define HW_OAM_SIZE (HW_OAM_END-HW_OAM)
//----------------------------- Cartridge Bus
#define HW_CTRDG_ROM 0x08000000
#define HW_CTRDG_ROM_END 0x0a000000
#define HW_CTRDG_RAM 0x0a000000
#define HW_CTRDG_RAM_END 0x0a010000
//----------------------------- System ROM
#define HW_BIOS 0xffff0000
#define HW_BIOS_END 0xffff8000
#define HW_RESET_VECTOR 0xffff0000
#ifdef __cplusplus
} /* extern "C" */
#endif
/* NITRO_ARM7_HW_MMAP_GLOBAL_H_ */
#endif

View File

@ -0,0 +1,173 @@
/*---------------------------------------------------------------------------*
Project: NitroSDK - HW - include
File: mmap_global.h
Copyright 2003-2005 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.
$Log: mmap_global.h,v $
Revision 1.16 2005/02/28 05:26:27 yosizaki
do-indent.
Revision 1.15 2004/08/03 03:16:00 yasu
Fix error when assembler source code includes nitro.h
Revision 1.14 2004/07/23 12:11:27 yada
include types.h
Revision 1.13 2004/07/23 10:59:46 yada
if SDK_TS, DTCM address is given from SDK_AUTOLOAD_DTCM_START
Revision 1.12 2004/05/19 09:06:00 yada
fix HW_LCDC_VRAM_END. separate by TS or other
Revision 1.11 2004/04/07 02:03:17 yada
fix header comment
Revision 1.10 2004/04/06 04:33:31 takano_makoto
Add entry of HW_EXT_WRAM_ARM7.
Revision 1.9 2004/02/17 08:22:07 yada
tab整形
Revision 1.8 2004/02/05 07:09:03 yasu
change SDK prefix iris -> nitro
Revision 1.7 2004/02/02 00:25:37 nishida_kenji
fix HW_DB_BG_PLTT and HW_DB_OBJ_PLTT.
Revision 1.6 2004/01/22 08:40:38 nishida_kenji
for the 2nd display
Revision 1.5 2004/01/15 08:26:09 yada
HW_ITCM_IMAGE
Revision 1.4 2003/12/17 06:05:39 yasu
mmap_reserved.h mmap_tcm.h mmap_shared.h
Revision 1.3 2003/12/09 08:35:26 yasu
Revision 1.2 2003/12/08 12:18:31 yada
Revision 1.1 2003/12/08 09:08:53 yasu
$NoKeywords: $
*---------------------------------------------------------------------------*/
#ifndef NITRO_HW_MMAP_GLOBAL_H_
#define NITRO_HW_MMAP_GLOBAL_H_
#ifdef __cplusplus
extern "C" {
#endif
//---------------------------------------------------------------------------
// GLOBAL MEMORY MAP
//---------------------------------------------------------------------------
//----------------------------- ITCM
#define HW_ITCM_IMAGE 0x01000000
#define HW_ITCM 0x01ff8000
#define HW_ITCM_SIZE 0x8000
#define HW_ITCM_END (HW_ITCM + HW_ITCM_SIZE)
//----------------------------- DTCM
#ifndef SDK_ASM
#include <nitro/types.h>
extern u32 SDK_AUTOLOAD_DTCM_START[];
#define HW_DTCM ((u32)SDK_AUTOLOAD_DTCM_START)
#else
.extern SDK_AUTOLOAD_DTCM_START
#define HW_DTCM SDK_AUTOLOAD_DTCM_START
#endif
#define HW_DTCM_SIZE 0x4000
#define HW_DTCM_END (HW_DTCM + HW_DTCM_SIZE)
//----------------------------- MAIN
#define HW_MAIN_MEM 0x02000000
#define HW_MAIN_MEM_SIZE 0x00400000
#define HW_MAIN_MEM_EX_SIZE 0x01000000
#define HW_MAIN_MEM_END (HW_MAIN_MEM + HW_MAIN_MEM_SIZE)
#define HW_MAIN_MEM_EX_END (HW_MAIN_MEM + HW_MAIN_MEM_EX_SIZE)
//----------------------------- MAIN_HI
#define HW_MAIN_MEM_HI 0x0c000000
#define HW_MAIN_MEM_HI_SIZE 0x01000000
#define HW_MAIN_MEM_HI_EX_SIZE 0x02000000
#define HW_MAIN_MEM_HI_END (HW_MAIN_MEM_HI + HW_MAIN_MEM_HI_SIZE)
#define HW_MAIN_MEM_HI_EX_END (HW_MAIN_MEM_HI + HW_MAIN_MEM_HI_EX_SIZE)
//----------------------------- WRAMs
#define HW_WRAM 0x037f8000
#define HW_WRAM_END 0x03800000
#define HW_WRAM_SIZE (HW_WRAM_END-HW_WRAM)
//----------------------------- IOs
#define HW_IOREG 0x04000000
#define HW_IOREG_END 0x05000000
#define HW_REG_BASE HW_IOREG // alias
//----------------------------- VRAMs
#define HW_BG_PLTT 0x05000000
#define HW_BG_PLTT_END 0x05000200
#define HW_BG_PLTT_SIZE (HW_BG_PLTT_END-HW_BG_PLTT)
#define HW_OBJ_PLTT 0x05000200
#define HW_OBJ_PLTT_END 0x05000400
#define HW_OBJ_PLTT_SIZE (HW_OBJ_PLTT_END-HW_OBJ_PLTT)
#define HW_PLTT HW_BG_PLTT
#define HW_PLTT_END HW_OBJ_PLTT_END
#define HW_PLTT_SIZE (HW_PLTT_END-HW_PLTT)
#define HW_DB_BG_PLTT 0x05000400
#define HW_DB_BG_PLTT_END 0x05000600
#define HW_DB_BG_PLTT_SIZE (HW_DB_BG_PLTT_END-HW_DB_BG_PLTT)
#define HW_DB_OBJ_PLTT 0x05000600
#define HW_DB_OBJ_PLTT_END 0x05000800
#define HW_DB_OBJ_PLTT_SIZE (HW_DB_OBJ_PLTT_END-HW_DB_OBJ_PLTT)
#define HW_DB_PLTT HW_DB_BG_PLTT
#define HW_DB_PLTT_END HW_DB_OBJ_PLTT_END
#define HW_DB_PLTT_SIZE (HW_DB_PLTT_END-HW_DB_PLTT)
#define HW_BG_VRAM 0x06000000
#define HW_BG_VRAM_END 0x06080000
#define HW_BG_VRAM_SIZE (HW_BG_VRAM_END-HW_BG_VRAM)
#define HW_DB_BG_VRAM 0x06200000
#define HW_DB_BG_VRAM_END 0x06220000
#define HW_DB_BG_VRAM_SIZE (HW_DB_BG_VRAM_END-HW_DB_BG_VRAM)
#define HW_OBJ_VRAM 0x06400000
#define HW_OBJ_VRAM_END 0x06440000
#define HW_OBJ_VRAM_SIZE (HW_OBJ_VRAM_END-HW_OBJ_VRAM)
#define HW_DB_OBJ_VRAM 0x06600000
#define HW_DB_OBJ_VRAM_END 0x06620000
#define HW_DB_OBJ_VRAM_SIZE (HW_DB_OBJ_VRAM_END-HW_DB_OBJ_VRAM)
#define HW_LCDC_VRAM 0x06800000
#ifdef SDK_TS
#define HW_LCDC_VRAM_END 0x068A4000
#else
#define HW_LCDC_VRAM_END 0x06898000
#endif
#define HW_LCDC_VRAM_SIZE (HW_LCDC_VRAM_END-HW_LCDC_VRAM)
#define HW_OAM 0x07000000
#define HW_OAM_END 0x07000400
#define HW_OAM_SIZE (HW_OAM_END-HW_OAM)
#define HW_DB_OAM 0x07000400
#define HW_DB_OAM_END 0x07000800
#define HW_DB_OAM_SIZE (HW_DB_OAM_END-HW_DB_OAM)
//----------------------------- Cartridge Bus
#define HW_CTRDG_ROM 0x08000000
#define HW_CTRDG_ROM_END 0x0a000000
#define HW_CTRDG_RAM 0x0a000000
#define HW_CTRDG_RAM_END 0x0a010000
//----------------------------- System ROM
#define HW_BIOS 0xffff0000
#define HW_BIOS_END 0xffff8000
#define HW_RESET_VECTOR 0xffff0000
//----------------------------- for request to ARM7
#define HW_EXT_WRAM_ARM7 0x06000000
#define HW_EXT_WRAM_ARM7_END 0x06040000
#define HW_EXT_WRAM_ARM7_SIZE (HW_EXT_WRAM_ARM7_END-HW_EXT_WRAM_ARM7)
#ifdef __cplusplus
} /* extern "C" */
#endif
/* NITRO_HW_MMAP_GLOBAL_H_ */
#endif

View File

@ -0,0 +1,386 @@
/*---------------------------------------------------------------------------*
Project: NitroSDK - HW - include
File: mmap_shared.h
Copyright 2003-2006 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.
$Log: mmap_shared.h,v $
Revision 1.41 2006/01/18 02:11:30 kitase_hirotake
do-indent
Revision 1.40 2005/09/08 12:28:09 yasu
SDK_FROM_TOOL SDK_WIN32
Revision 1.39 2005/07/27 07:45:30 seiki_masashi
OSSystemWork wm_keyshare_control wm_rssi_pool
Revision 1.38 2005/06/02 10:28:11 terui
OSSystemWork構造体内のfile_control及びis_reservedメンバを統合してrom_headerメンバに変名
Revision 1.37 2005/05/20 03:10:53 yosizaki
add HW_CARD_ROM_HEADER, HW_DOWNLOAD_PARAMETER.
Revision 1.36 2005/02/28 05:26:01 yosizaki
do-indent.
Revision 1.35 2004/12/02 00:26:02 yada
add autoload sync
Revision 1.34 2004/11/22 01:14:51 yada
add HW_ROM_BASE_OFFSET_BUF
Revision 1.33 2004/09/01 04:19:11 yada
add HW_RESET_PARAMETER_BUF
Revision 1.32 2004/08/17 04:09:56 yada
add some definition to detect debugger correctly
Revision 1.31 2004/08/16 08:16:16 yada
HW_CHECK_DEBUGGER_BUF definition is moved to mmap_shared.h header
Revision 1.30 2004/08/16 08:08:06 yada
add HW_BOOT_CHECK_INFO_BUF and HW_CTRDG_MODULE_INFO_BUF
Revision 1.29 2004/08/10 12:12:01 yada
place VBlank count buffer in shared area
Revision 1.28 2004/08/07 00:58:46 terui
wm_controlを削除wm_callback_control wm_keyshare_controlを追加
Revision 1.27 2004/08/03 01:36:27 terui
Add wm_control
Revision 1.26 2004/07/27 05:59:11 yada
fix OSSystemWork structure.
lowest 0x80 (increased in recent release) byte was forgotten.
Revision 1.25 2004/07/22 11:29:23 yada
shared area is expanded 0x80 byte
make HW_WM_BOOT_BUF
Revision 1.24 2004/06/15 02:10:00 yada
only add HW_DMA_CLEAR_DATA_BUF_END
Revision 1.23 2004/06/08 10:41:55 yada
only fix comment
Revision 1.22 2004/06/01 04:24:24 terui
Add mic_sampling_data.
Revision 1.21 2004/05/28 09:40:30 terui
Add mic_last_address
Revision 1.20 2004/05/24 09:54:31 yasu
move RED_RESERVED_END to (HW_MAIN_MEM + 0x007ffa00)
Revision 1.19 2004/05/21 12:11:58 yasu
Reduce the SHARED ARENA because of allocating HW_RED_RESERVED
Revision 1.18 2004/05/21 11:07:26 yada
add HW_RED_RESERVED area
Revision 1.17 2004/05/19 05:19:17 yada
add NVRAM user info area
Revision 1.16 2004/05/14 11:58:24 takano_makoto
Add #ifndef SDK_FROM_TOOL for VC or BCB.
Revision 1.15 2004/05/11 12:08:13 yada
some define names was changed,
HW_BIOS_EXCP_STACK_MAIN, HW_EXCP_VECTOR_MAIN,
HW_IS_RESERVED was deleted.
Revision 1.14 2004/05/11 01:14:33 yasu
Allocate PXI related flags on shared area
Revision 1.13 2004/05/10 08:20:19 yada
ram checker deleted, because put checker for main and sub.
Revision 1.12 2004/05/10 08:15:46 yada
HW_COMPONENT_PARAM
Revision 1.11 2004/05/06 00:38:14 yada
add HW_IS_RESERVED
Revision 1.10 2004/05/06 00:17:13 yada
add HW_REAL_TIME_CLOCK_BUF
Revision 1.9 2004/05/04 04:11:11 terui
Change position of real time clock infromation area.
Revision 1.8 2004/05/04 02:08:50 terui
Add real time clock information area.
Revision 1.7 2004/04/30 07:37:44 yada
HW_LOCKIDFLAG_MAIN/SUB -> HW_LOCK_ID_FLAG_MAIN/SUB
Revision 1.6 2004/04/29 09:34:02 yada
put HW_LOCKID_FLAG_MAIN/SUB
Revision 1.5 2004/04/14 05:05:21 takano_makoto
Add Touch Panel Area.
Revision 1.4 2004/04/07 02:03:17 yada
fix header comment
Revision 1.3 2004/03/15 11:02:15 yada
Revision 1.2 2004/03/12 12:11:10 yada
only arrange tab
Revision 1.1 2004/02/18 07:51:36 yada
mmap_shared.h A7/9
Revision 1.5 2004/02/18 01:24:57 yada
XYボタン情報領域を追加
Revision 1.4 2004/02/17 06:51:02 yada
Revision 1.3 2004/02/14 06:57:48 yasu
add HW_COMPONENT_PARAM
Revision 1.2 2004/02/13 10:39:58 yada
ARENAを個から個にしてインフォエリア拡大
Revision 1.1 2004/02/13 01:52:31 yada
ARM7用に追加 (temporary?)
Revision 1.11 2004/02/12 10:56:04 yasu
new location of include files ARM9/ARM7
Revision 1.10 2004/02/05 07:09:03 yasu
change SDK prefix iris -> nitro
Revision 1.9 2004/01/19 02:29:10 yada
systemWork 0x2000x280
Revision 1.8 2004/01/17 11:43:29 yada
Revision 1.7 2004/01/16 11:49:18 yada
Revision 1.6 2004/01/16 04:13:19 yada
Revision 1.5 2004/01/15 12:14:13 yada
SystemWork
Revision 1.4 2004/01/07 01:41:34 yada
arena用のデフォルトLo/Hi値定義
Revision 1.3 2003/12/25 07:30:42 yada
Revision 1.2 2003/12/22 13:38:04 yasu
OS_GetSystemWrokをマクロに OS_LockWord struct
Revision 1.1 2003/12/17 06:05:39 yasu
mmap_reserved.h mmap_tcm.h mmap_shared.h
$NoKeywords: $
*---------------------------------------------------------------------------*/
#ifndef NITRO_HW_COMMON_MMAP_SHARED_H_
#define NITRO_HW_COMMON_MMAP_SHARED_H_
#ifdef __cplusplus
extern "C" {
#endif
//----------------------------------------------------------------------
// MEMORY MAP of SYSTEM SHARED AREA
//----------------------------------------------------------------------
//
#define HW_RED_RESERVED (HW_MAIN_MEM_EX_END - 0x800) // maybe change later
#define HW_RED_RESERVED_END (HW_RED_RESERVED + HW_RED_RESERVED_SIZE)
#define HW_RED_RESERVED_SIZE 0x200
/* original ROM-header of NITRO-CARD for downloaded program */
#define HW_CARD_ROM_HEADER_SIZE 0x160
/* maximun size of parameters for downloaded program */
#define HW_DOWNLOAD_PARAMETER_SIZE 0x20
//---- default address for shared memory arena
#define HW_SHARED_ARENA_LO_DEFAULT HW_MAIN_MEM_SHARED
#ifdef HW_RED_RESERVED
# define HW_SHARED_ARENA_HI_DEFAULT (HW_RED_RESERVED - HW_CARD_ROM_HEADER_SIZE - HW_DOWNLOAD_PARAMETER_SIZE)
#else
# define HW_SHARED_ARENA_HI_DEFAULT (HW_MAIN_MEM_SYSTEM - HW_CARD_ROM_HEADER_SIZE - HW_DOWNLOAD_PARAMETER_SIZE)
#endif
// 0x027ffa00-0x027ffa7f:(128byte):UNUSED
/* 0x027ffa80-0x027ffbdf:(352byte): original ROM-header */
#define HW_CARD_ROM_HEADER (HW_MAIN_MEM + 0x00fffa80)
/* 0x027ffbe0-0x027ffbff:( 32byte): parameters for downloaded program */
#define HW_DOWNLOAD_PARAMETER (HW_MAIN_MEM + 0x00fffbe0)
//-------------------------------- MainMemory shared area
#define HW_MAIN_MEM_SYSTEM_SIZE 0x400
#define HW_MAIN_MEM_SYSTEM (HW_MAIN_MEM_EX_END - 0x400)
#define HW_BOOT_CHECK_INFO_BUF (HW_MAIN_MEM_SYSTEM + 0x000) // Boot check info (END-0x400)
#define HW_BOOT_CHECK_INFO_BUF_END (HW_MAIN_MEM_SYSTEM + 0x020) // (END-0x3e0)
#define HW_RESET_PARAMETER_BUF (HW_MAIN_MEM_SYSTEM + 0x020) // reset parameter (END-0x3e0)
// 0x027ffc24-0x027ffc2b:(8byte):UNUSED
#define HW_ROM_BASE_OFFSET_BUF (HW_MAIN_MEM_SYSTEM + 0x02c) // ROM offset of own program (END-0x3d4)
#define HW_ROM_BASE_OFFSET_BUF_END (HW_MAIN_MEM_SYSTEM + 0x030) // (END-0x3d0)
#define HW_CTRDG_MODULE_INFO_BUF (HW_MAIN_MEM_SYSTEM + 0x030) // Cartridge module info (END-0x3d0)
#define HW_CTRDG_MODULE_INFO_BUF_END (HW_MAIN_MEM_SYSTEM + 0x03c) // (END-0x3c4)
#define HW_VBLANK_COUNT_BUF (HW_MAIN_MEM_SYSTEM + 0x03c) // VBlank counter (END-0x3c4)
#define HW_WM_BOOT_BUF (HW_MAIN_MEM_SYSTEM + 0x040) // WM buffer for Multi-Boot (END-0x3c0)
#define HW_WM_BOOT_BUF_END (HW_MAIN_MEM_SYSTEM + 0x080) // (END-0x380)
#define HW_NVRAM_USER_INFO (HW_MAIN_MEM_SYSTEM + 0x080) // NVRAM user info (END-0x380)
#define HW_NVRAM_USER_INFO_END (HW_MAIN_MEM_SYSTEM + 0x180) // (END-0x280)
#define HW_BIOS_EXCP_STACK_MAIN (HW_MAIN_MEM_SYSTEM + 0x180) // MAINPデバッガモニタ例外ハンドラ (END-0x280)
#define HW_BIOS_EXCP_STACK_MAIN_END (HW_MAIN_MEM_SYSTEM + 0x19c) // (END-0x264)
#define HW_EXCP_VECTOR_MAIN (HW_MAIN_MEM_SYSTEM + 0x19c) // MAINP用HW_EXCP_VECTOR_BUF (END-0x264)
#define HW_ARENA_INFO_BUF (HW_MAIN_MEM_SYSTEM + 0x1a0) // アリーナ情報構造体(27F_FDA027F_FDE7) (END-0x260)
#define HW_REAL_TIME_CLOCK_BUF (HW_MAIN_MEM_SYSTEM + 0x1e8) // RTC
#define HW_DMA_CLEAR_DATA_BUF (HW_MAIN_MEM_SYSTEM + 0x1f0) // DMAクリアデータ・バッファ (END-0x210)
#define HW_DMA_CLEAR_DATA_BUF_END (HW_MAIN_MEM_SYSTEM + 0x200) // (この領域は ARM9-TEG にのみ使用する)
#define HW_ROM_HEADER_BUF (HW_MAIN_MEM_SYSTEM + 0x200) // ROM内登録エリアデータ・バッファ (END-0x200)
#define HW_ROM_HEADER_BUF_END (HW_MAIN_MEM_SYSTEM + 0x360) // (END-0x0a0)
#define HW_ISD_RESERVED (HW_MAIN_MEM_SYSTEM + 0x360) // IS DEBUGGER Reserved (END-0xa0)
#define HW_ISD_RESERVED_END (HW_MAIN_MEM_SYSTEM + 0x380) // (END-0x80)
#define HW_PXI_SIGNAL_PARAM_ARM9 (HW_MAIN_MEM_SYSTEM + 0x380) // PXI Signal Param for ARM9
#define HW_PXI_SIGNAL_PARAM_ARM7 (HW_MAIN_MEM_SYSTEM + 0x384) // PXI Signal Param for ARM7
#define HW_PXI_HANDLE_CHECKER_ARM9 (HW_MAIN_MEM_SYSTEM + 0x388) // PXI Handle Checker for ARM9
#define HW_PXI_HANDLE_CHECKER_ARM7 (HW_MAIN_MEM_SYSTEM + 0x38c) // PXI Handle Checker for ARM7
#define HW_MIC_LAST_ADDRESS (HW_MAIN_MEM_SYSTEM + 0x390) // MIC 最新サンプリングデータ格納アドレス
#define HW_MIC_SAMPLING_DATA (HW_MAIN_MEM_SYSTEM + 0x394) // MIC 単体サンプリング結果
#define HW_WM_CALLBACK_CONTROL (HW_MAIN_MEM_SYSTEM + 0x396) // WM コールバック同期用パラメータ
#define HW_WM_RSSI_POOL (HW_MAIN_MEM_SYSTEM + 0x398) // WM 受信強度による乱数源
#define HW_COMPONENT_PARAM (HW_MAIN_MEM_SYSTEM + 0x39c) // Component 同期用パラメータ
#define HW_THREADINFO_MAIN (HW_MAIN_MEM_SYSTEM + 0x3a0) // ThreadInfo for Main processor
#define HW_THREADINFO_SUB (HW_MAIN_MEM_SYSTEM + 0x3a4) // ThreadInfo for Sub processor
#define HW_BUTTON_XY_BUF (HW_MAIN_MEM_SYSTEM + 0x3a8) // buffer for X and Y button
#define HW_TOUCHPANEL_BUF (HW_MAIN_MEM_SYSTEM + 0x3aa) // buffer for touch panel
#define HW_AUTOLOAD_SYNC_BUF (HW_MAIN_MEM_SYSTEM + 0x3ae) // buffer for autoload sync
#define HW_LOCK_ID_FLAG_MAIN (HW_MAIN_MEM_SYSTEM + 0x3b0) // lockID flag for Main processor
#define HW_LOCK_ID_FLAG_SUB (HW_MAIN_MEM_SYSTEM + 0x3b8) // lockID flag for Sub processor
// SpinLock Mutex
#define HW_VRAM_C_LOCK_BUF (HW_MAIN_MEM_SYSTEM + 0x3c0) // VRAM-C・ロックバッファ (END-0x40)
#define HW_VRAM_D_LOCK_BUF (HW_MAIN_MEM_SYSTEM + 0x3c8) // VRAM-D・ロックバッファ (END-0x38)
#define HW_WRAM_BLOCK0_LOCK_BUF (HW_MAIN_MEM_SYSTEM + 0x3d0) // CPU内部ワークRAM・ブロック0・ロックバッファ (END-0x30)
#define HW_WRAM_BLOCK1_LOCK_BUF (HW_MAIN_MEM_SYSTEM + 0x3d8) // CPU内部ワークRAM・ブロック1・ロックバッファ (END-0x28)
#define HW_CARD_LOCK_BUF (HW_MAIN_MEM_SYSTEM + 0x3e0) // カード・ロックバッファ (END-0x20)
#define HW_CTRDG_LOCK_BUF (HW_MAIN_MEM_SYSTEM + 0x3e8) // カートリッジ・ロックバッファ (END-0x18)
#define HW_INIT_LOCK_BUF (HW_MAIN_MEM_SYSTEM + 0x3f0) // 初期化ロックバッファ (END-0x10)
#define HW_MMEMCHECKER_MAIN (HW_MAIN_MEM_SYSTEM + 0x3f8) // MainMomory Size Checker for Main processor (END-8)
#define HW_MMEMCHECKER_SUB (HW_MAIN_MEM_SYSTEM + 0x3fa) // MainMomory Size Checker for Sub processor (END-6)
#define HW_CMD_AREA (HW_MAIN_MEM_SYSTEM + 0x3fe) // メインメモリコマンド発行エリア(使用禁止エリア)(END-2)
//--------------------------------------------------------------------
//---- Lock area
#define HW_SHARED_LOCK_BUF (HW_VRAM_C_LOCK_BUF)
#define HW_SHARED_LOCK_BUF_END (HW_INIT_LOCK_BUF + 8)
#define HW_CHECK_DEBUGGER_SW (HW_MAIN_MEM_SYSTEM + 0x010) // (u16)debugger check switch. if 0 check buf1, else buf2.
#define HW_CHECK_DEBUGGER_BUF1 (HW_RED_RESERVED + 0x014) // (u16)debugger checker. 1 if run on debugger.
#define HW_CHECK_DEBUGGER_BUF2 (HW_MAIN_MEM_SYSTEM + 0x014) // (u16)debugger checker. 1 if run on debugger.
/* if include from Other Environment for exsample VC or BCB, */
/* please define SDK_FROM_TOOL */
#if !(defined(SDK_WIN32) || defined(SDK_FROM_TOOL))
//
//--------------------------------------------------------------------
#ifndef SDK_ASM
#include <nitro/types.h>
#include <nitro/os/common/thread.h>
#include <nitro/os/common/spinLock.h>
#include <nitro/os/common/arena.h>
typedef union
{
u32 b32;
u16 b16;
}
OSDmaClearSrc;
typedef struct
{
u8 bootCheckInfo[0x20]; // 000-01f: 32byte boot check info
u32 resetParameter; // 020-023: 4byte reset parameter
u8 padding5[0x8]; // 024-02c: (8byte)
u32 romBaseOffset; // 02c-02f: 4byte ROM offset of own program
u8 cartridgeModuleInfo[12]; // 030-03b: 12byte cartridge module info
u32 vblankCount; // 03c-03f: 4byte Vブランクカウント
u8 wmBootBuf[0x40]; // 040-07f: 64byte WM のマルチブート用バッファ
u8 nvramUserInfo[0x100]; // 080-17f: 256bytes NVRAM user info
u8 isd_reserved1[0x20]; // 180-19f: 32bytes ISDebugger 予約
u8 arenaInfo[0x48]; // 1a0-1e7: 72bytte アリーナ情報
u8 real_time_clock[8]; // 1e8-1ef: 8bytes RTC
u32 dmaClearBuf[4]; // 1f0-1ff: 16bytes DMA クリア情報バッファ (ARM9-TEG用)
u8 rom_header[0x160]; // 200-35f: 352bytes ROM 内登録エリア情報退避バッファ
u8 isd_reserved2[32]; // 360-37f: 32bytes ISDebugger 予約
u32 pxiSignalParam[2]; // 380-387: 8bytes Param for PXI Signal
u32 pxiHandleChecker[2]; // 388-38f: 8bytes Flag for PXI Command Handler Installed
u32 mic_last_address; // 390-393: 4bytes マイク 最新サンプリング結果の格納アドレス
u16 mic_sampling_data; // 394-395: 2bytes マイク 単体サンプリング結果
u16 wm_callback_control; // 396-397: 2bytes WM コールバック同期用パラメータ
u16 wm_rssi_pool; // 398-399: 2bytes WM 受信強度による乱数源
u8 padding3[2]; // 39a-39b: (2bytes)
u32 component_param; // 39c-39f: 4bytes Component 同期用パラメータ
OSThreadInfo *threadinfo_mainp; // 3a0-3a3: 4bytes ARM9 スレッド情報へのポインタ 初期値0であること
OSThreadInfo *threadinfo_subp; // 3a4-3a7: 4bytes ARM7 スレッド情報へのポインタ 初期値0であること
u16 button_XY; // 3a8-3a9: 2bytes XY ボタン情報格納位置
u8 touch_panel[4]; // 3aa-3ad: 4bytes タッチパネル情報格納位置
u16 autoloadSync; // 3ae-3af: 2bytes autoload sync between processors
u32 lockIDFlag_mainp[2]; // 3b0-3b7: 8bytes lockID管理フラグ(ARM9用)
u32 lockIDFlag_subp[2]; // 3b8-3bf: 8bytes lockID管理フラグ(ARM7用)
struct OSLockWord lock_VRAM_C; // 3c0-3c7: 8bytes C・ロックバッファ
struct OSLockWord lock_VRAM_D; // 3c8-3cf: 8bytes VRAM-D・ロックバッファ
struct OSLockWord lock_WRAM_BLOCK0; // 3d0-3d7: 8bytes ブロック0・ロックバッファ
struct OSLockWord lock_WRAM_BLOCK1; // 3d8-3df: 8bytes CPU内部ワークRAM・ブロック1・ロックバッファ
struct OSLockWord lock_CARD; // 3e0-3e7: 8bytes カード・ロックバッファ
struct OSLockWord lock_CARTRIDGE; // 3e8-3ef: 8bytes カートリッジ・ロックバッファ
struct OSLockWord lock_INIT; // 3f0-3f7: 8bytes 初期化ロックバッファ
u16 mmem_checker_mainp; // 3f8-3f9: 2bytes MainMomory Size Checker for Main processor
u16 mmem_checker_subp; // 3fa-3fb: 2bytes MainMomory Size Checker for Sub processor
u8 padding4[2]; // 3fc-3fd: (2bytes)
u16 command_area; // 3fe-3ff: 2bytes Command Area
}
OSSystemWork;
#define OS_GetSystemWork() ((OSSystemWork *)HW_MAIN_MEM_SYSTEM)
#endif
#endif // SDK_FROM_TOOL
#ifdef __cplusplus
} /* extern "C" */
#endif
/* NITRO_HW_COMMON_MMAP_SHARED_H_ */
#endif

View File

@ -137,18 +137,6 @@ void OSi_EnterTimerCallback(u32 timerNo, void (*callback) (void *), void *arg
#define OS_IRQ_MAIN_BUFFER_SIZE (0x200)
//---- interrupt handler type
typedef void (*OSIrqFunction) (void);
//---- for irq callback (internal use)
typedef struct
{
void (*func) (void *);
u32 enable;
void *arg;
}
OSIrqCallbackInfo;
//---- irq factor type define
#ifndef OSi_OSIRQMASK_DEFINED
#ifdef SDK_ARM9
@ -159,6 +147,18 @@ typedef u64 OSIrqMask;
#define OSi_OSIRQMASK_DEFINED
#endif
//---- interrupt handler type
typedef void (*OSIrqFunction) (void);
//---- for irq callback (internal use)
typedef struct
{
void (*func) (void *);
void *arg;
OSIrqMask enable;
}
OSIrqCallbackInfo;
//---- table of irq functions
extern OSIrqFunction OS_IRQTable[];

View File

@ -55,7 +55,7 @@
Static $(TARGET_NAME)
{
Address 0x02380000
Address 0x02f80000
Library crt0.o
StackSize 1024 512
}