NANDファームを読み込めるように変更

git-svn-id: file:///Users/lillianskinner/Downloads/platinum/twl/TwlIPL/trunk@2892 b08762b0-b915-fc4b-9d8c-17b2551a87ff
This commit is contained in:
(no author) 2009-08-07 05:36:25 +00:00
parent 4dcca854be
commit 10ef23def2
16 changed files with 2168 additions and 1133 deletions

View File

@ -1,9 +1,9 @@
#! make -f
#----------------------------------------------------------------------------
# Project: TwlSDK - components - racoon.TWL
# Project: TwlSDK - components - armadillo.TWL
# File: Makefile
#
# Copyright 2007-2008 Nintendo. All rights reserved.
# Copyright 2008 Nintendo. All rights reserved.
#
# These coded instructions, statements, and computer programs contain
# proprietary information of Nintendo of America Inc. and/or Nintendo
@ -11,31 +11,33 @@
# 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:: 2008-09-18#$
# $Rev: 8573 $
# $Author: okubata_ryoma $
# $Date:: 2008-08-15#$
# $Rev: 2167 $
# $Author: yosiokat $
#----------------------------------------------------------------------------
override TARGET_PLATFORM = TWL
override TWL_PROC = ARM7
override TWL_ARCHGEN = LIMITED
TWL_NO_STD_PCHDR = True
TWL_CODEGEN ?= ALL
override TARGET_PLATFORM = TWL
override TWL_PROC = ARM7
override TWL_ARCHGEN = LIMITED
##override TWL_PLATFORM = TS
TWL_NO_STD_PCHDR = True
override TARGET_CODEGEN = ARM
ifndef TWLSDK_NOCRYPTO
#----------------------------------------------------------------------------
SRCDIR += ./src
SRCS = crt0.SCFG_NOLOCK.c \
main.c \
kami_pxi.c
SRCS = main.c initScfg.c kami_pxi.c
TARGET_NAME = armadillo
TARGET_NAME = racoon
TARGET_NEF = $(TARGET_NAME).tef
LCFILE_SPEC = $(TARGET_NAME).lsf
LCFILE_TEMPLATE = $(ROOT)/build/components/$(TARGET_NAME).TWL/$(TARGET_NAME).lcf.template
LDRES_TEMPLATE = $(ROOT)/build/components/$(TARGET_NAME).TWL/$(TARGET_NAME).response.template
TARGET_NEF = $(TARGET_NAME).tef
LCFILE_SPEC = $(TARGET_NAME).lsf
LCFILE_TEMPLATE = $(ROOT)/build/components/$(TARGET_NAME).TWL/$(TARGET_NAME).lcf.template
LDRES_TEMPLATE = $(ROOT)/build/components/$(TARGET_NAME).TWL/$(TARGET_NAME).response.template
CRT0_O = crt0.LTD.TWL.o
CRT0_O = crt0.SCFG_NOLOCK.o
# スタック不足防止の為、インライン展開せずにコンパイルする
CCFLAGS_OPT = -O4 -inline off
@ -43,30 +45,32 @@ CCFLAGS_OPT = -O4 -inline off
#----------------------------------------------------------------------------
include $(TWLSDK_ROOT)/build/buildtools/commondefs
#MACRO_FLAGS += -DSDK_ARM7COMP_LTD
ifeq ($(TWL_PLATFORM),BB)
MAKELCF_FLAGS += -DADDRESS_LTDWRAM='0x037e0000'
else
MAKELCF_FLAGS += -DADDRESS_LTDWRAM='0x037c0000'
endif
MACRO_FLAGS += -DSDK_ARM7COMP_LTD -DSDK_SEA -DSDK_NOINIT
MAKELCF_FLAGS += -DISDBG_LIBS_TWL='$(if $(ISDBG_LIBS_TWL),$(ISDBG_LIBS_TWL),libstubsistd_sp$(TWL_LIBSUFFIX).a)' \
-DISDBG_LIBS_NITRO='libstubsisd_sp$(TWL_LIBSUFFIX).a'
LLIBRARY_DIRS += $(TWL_IPL_RED_ROOT)/lib/ARM7-TS/$(TWL_BUILD_DIR) \
./obj/ARM7-TS.LTD/$(TWL_BUILD_DIR)
LINCLUDES += $(ROOT)/build/libraries/spi/ARM7/include \
$(ROOT)/build/libraries/os/common/include \
$(TWL_IPL_RED_ROOT)/include \
../common/include \
$(ROOT)/build/libraries/init/common/include \
$(ROOT)/build/libraries/fatfs/ARM7.TWL/include \
$(ROOT)/build/libraries/fatfs/ARM7.TWL/include/fatfs \
$(ROOT)/build/libraries/fatfs/ARM7.TWL/include/twl/fatfs/ARM7 \
../common/include
$(ROOT)/build/libraries/fatfs/ARM7.TWL/include/twl/fatfs/ARM7
LLIBRARIES += libwl_sp.TWL.LTD.a
LLIBRARY_DIRS += $(TWL_IPL_RED_ROOT)/lib/ARM7-TS/$(TWL_BUILD_DIR) \
./obj/ARM7-TS.LTD/$(TWL_BUILD_DIR)
LLIBRARIES += libwl_sp$(TWL_LIBSUFFIX).a \
libsdio_sp$(TWL_LIBSUFFIX).a \
libathdrv_sp$(TWL_LIBSUFFIX).a \
libwpa_sp$(TWL_LIBSUFFIX).a \
libhotsw_sp$(TWL_LIBSUFFIX).a \
libreloc_info_sp$(TWL_LIBSUFFIX).a
LLIBRARIES += libpm_sp.SYSMENU$(TWL_LIBSUFFIX).a
GLIBRARIES := $(filter-out libpm_sp$(TWL_LIBSUFFIX).a,$(GLIBRARIES))
LDEPENDS_NEF = $(TWL_LIBS) $(LLIBRARIES)
@ -75,4 +79,7 @@ do-build: $(TARGETS)
#----------------------------------------------------------------------------
include $(TWLSDK_ROOT)/build/buildtools/modulerules
#----------------------------------------------------------------------------
endif #ifndef TWLSDK_NOCRYPTO
#===== End of Makefile =====

View File

@ -0,0 +1,87 @@
#----------------------------------------------------------------------------
# Project: TwlSDK - components - armadillo.TWL
# File: armadillo.lsf
#
# Copyright 2008 Nintendo. All rights reserved.
#
# These coded insructions, 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:: 2008-07-24#$
# $Rev: 1990 $
# $Author: kamikawa $
#----------------------------------------------------------------------------
#
# Nitro LCF SPEC FILE
#
#--------
Static $(TARGET_NAME)
{
Address 0x02380000
StackSize 1024 1024
Library $(CRT0_O)
}
#--------
Ltdautoload SCRWRAM
{
Address 0x03740000
Library libsubpsyscall.a
Library libsyscall_sp.twl.a
Library $(CW_LIBS)
Library $(ISDBG_LIBS_TWL)
Library $(ISDBG_LIBS_NITRO)
Object * (.etable)
Object $(OBJDIR)/main.o
Object $(OBJDIR)/kami_pxi.o
Library libsea_sp$(LIBSUFFIX).a
Library libcrypto_sp$(LIBSUFFIX).a
Library libos_sp$(LIBSUFFIX).a
Library libmi_sp$(LIBSUFFIX).a
Library libstd_sp$(LIBSUFFIX).a
Library libmath_sp$(LIBSUFFIX).a
Library libpxi_sp$(LIBSUFFIX).a
Library libexi_sp$(LIBSUFFIX).a
Library libi2c_sp$(LIBSUFFIX).a
Library libsdio_sp$(LIBSUFFIX).a
Library libpad_sp$(LIBSUFFIX).a
Library libscfg_sp$(LIBSUFFIX).a
Library libmcu_sp$(LIBSUFFIX).a
Library libcdc_sp$(LIBSUFFIX).a
Library libsnd_sp$(LIBSUFFIX).a
Library libsndex_sp$(LIBSUFFIX).a
Library libspi_sp$(LIBSUFFIX).a
Library libpm_sp.SYSMENU$(LIBSUFFIX).a
Library libtp_sp$(LIBSUFFIX).a
Library libtpex_sp$(LIBSUFFIX).a
Library libmic_sp$(LIBSUFFIX).a
Library libmicex_sp$(LIBSUFFIX).a
Library libnvram_sp$(LIBSUFFIX).a
Library librtc_sp$(LIBSUFFIX).a
Library libfatfs_sp$(LIBSUFFIX).a
Library libwm_sp$(LIBSUFFIX).a
Library libnwm_sp$(LIBSUFFIX).a
Library libwvr_sp$(LIBSUFFIX).a
Library libwl_sp$(LIBSUFFIX).a
Library libwpa_sp$(LIBSUFFIX).a
Library libathdrv_sp$(LIBSUFFIX).a
Library libfs_sp$(LIBSUFFIX).a
Library libcard_sp$(LIBSUFFIX).a
Library libcamera_sp$(LIBSUFFIX).a
Library libhotsw_sp$(LIBSUFFIX).a
Library libreloc_info_sp$(LIBSUFFIX).a
Object * (.wram)
Object * (.ltdwram)
Object * (.rsvwram)
Object * (.main)
Object * (.ltdmain)
}

View File

@ -1,240 +0,0 @@
#----------------------------------------------------------------------------
# Project: TwlSDK - components - racoon.TWL
# File: racoon.lsf
#
# Copyright 2007-2009 Nintendo. All rights reserved.
#
# These coded insructions, 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:: 2009-06-04#$
# $Rev: 10698 $
# $Author: okubata_ryoma $
#----------------------------------------------------------------------------
#
# Nitro LCF SPEC FILE
#
#--------
Static $(TARGET_NAME)
{
Address 0x02380000
Library $(CRT0_O)
Object $(OBJDIR)/initScfg.o
StackSize 1024 1024
}
#--------
Autoload WRAM
{
Address $(ADDRESS_LTDWRAM)
Library libsubpsyscall.a \
libsyscall_sp.twl.a \
$(CW_LIBS) \
libos_sp$(LIBSUFFIX).a \
libmi_sp$(LIBSUFFIX).a \
libpad_sp$(LIBSUFFIX).a \
libpxi_sp$(LIBSUFFIX).a \
libstd_sp$(LIBSUFFIX).a \
libexi_sp$(LIBSUFFIX).a \
libsnd_sp$(LIBSUFFIX).a \
libspi_sp$(LIBSUFFIX).a \
libpm_sp$(LIBSUFFIX).a \
libmath_sp$(LIBSUFFIX).a \
libscfg_sp$(LIBSUFFIX).a \
libtp_sp$(LIBSUFFIX).a \
libmic_sp$(LIBSUFFIX).a \
libfs_sp$(LIBSUFFIX).a \
libcard_sp$(LIBSUFFIX).a \
libi2c_sp$(LIBSUFFIX).a \
libcamera_sp$(LIBSUFFIX).a \
libcdc_sp$(LIBSUFFIX).a \
libsndex_sp$(LIBSUFFIX).a \
libtpex_sp$(LIBSUFFIX).a \
libmicex_sp$(LIBSUFFIX).a \
libmcu_sp$(LIBSUFFIX).a \
Library libsdio_sp$(LIBSUFFIX).a
Library libnvram_sp$(LIBSUFFIX).a
Library librtc_sp$(LIBSUFFIX).a
Object * (.etable)
Object * (.wram)
Object * (.ltdwram)
Object $(OBJDIR)/main.o
Object $(OBJDIR)/kami_pxi.o
# caches in fatfs library, that should be on WRAM.
# 2007/12/11 OBJECT() による .bss シンボルのリンクがうまくいかないので、
# 変数定義箇所に pragma で .ltdwram セクションに含まれるように暫定対策しました。
# Object OBJECT( FATFSi___mem_drives_structures , libfatfs_sp$(LIBSUFFIX).a) (.bss)
#####
# Sub-routines in WL library , that should be on WRAM.
# in TaskMan.o
Object OBJECT( MainTaskRoutine , libwl_sp$(LIBSUFFIX).a ) (.text)
Object OBJECT( AddTask , libwl_sp$(LIBSUFFIX).a ) (.text)
Object OBJECT( DeleteTask , libwl_sp$(LIBSUFFIX).a ) (.text)
Object OBJECT( LowestIdleTask , libwl_sp$(LIBSUFFIX).a ) (.text)
Object OBJECT( ExecuteMessage , libwl_sp$(LIBSUFFIX).a ) (.text)
# in BufMan.o
Object OBJECT( NewHeapBuf , libwl_sp$(LIBSUFFIX).a ) (.text)
Object OBJECT( DeleteHeapBuf , libwl_sp$(LIBSUFFIX).a ) (.text)
Object OBJECT( AllocateHeapBuf , libwl_sp$(LIBSUFFIX).a ) (.text)
Object OBJECT( ReleaseHeapBuf , libwl_sp$(LIBSUFFIX).a ) (.text)
Object OBJECT( MoveHeapBuf , libwl_sp$(LIBSUFFIX).a ) (.text)
Object OBJECT( AddHeapBuf , libwl_sp$(LIBSUFFIX).a ) (.text)
Object OBJECT( GetHeapBufNextAdrs , libwl_sp$(LIBSUFFIX).a ) (.text)
# in WlCmdIf.o
Object OBJECT( RequestCmdTask , libwl_sp$(LIBSUFFIX).a ) (.text)
Object OBJECT( SendMessageToWmDirect , libwl_sp$(LIBSUFFIX).a ) (.text)
# in WlNic.o
Object OBJECT( WStart , libwl_sp$(LIBSUFFIX).a ) (.text)
Object OBJECT( WStop , libwl_sp$(LIBSUFFIX).a ) (.text)
Object OBJECT( WSetStaState , libwl_sp$(LIBSUFFIX).a ) (.text)
# in WlIntr.o
Object OBJECT( WlIntr , libwl_sp$(LIBSUFFIX).a ) (.text)
Object OBJECT( WlIntrPreTbtt , libwl_sp$(LIBSUFFIX).a ) (.text)
Object OBJECT( WlIntrTbtt , libwl_sp$(LIBSUFFIX).a ) (.text)
Object OBJECT( WlIntrActEnd , libwl_sp$(LIBSUFFIX).a ) (.text)
# Object OBJECT( WlIntrAckCntOvf , libwl_sp$(LIBSUFFIX).a ) (.text)
Object OBJECT( WlIntrCntOvf , libwl_sp$(LIBSUFFIX).a ) (.text)
Object OBJECT( WlIntrTxErr , libwl_sp$(LIBSUFFIX).a ) (.text)
Object OBJECT( WlIntrRxCntup , libwl_sp$(LIBSUFFIX).a ) (.text)
Object OBJECT( WlIntrTxEnd , libwl_sp$(LIBSUFFIX).a ) (.text)
Object OBJECT( WlIntrRxEnd , libwl_sp$(LIBSUFFIX).a ) (.text)
Object OBJECT( WlIntrMpEnd , libwl_sp$(LIBSUFFIX).a ) (.text)
Object OBJECT( WlIntrStartTx , libwl_sp$(LIBSUFFIX).a ) (.text)
Object OBJECT( WlIntrStartRx , libwl_sp$(LIBSUFFIX).a ) (.text)
Object OBJECT( SetParentTbttTxq , libwl_sp$(LIBSUFFIX).a ) (.text)
Object OBJECT( MacBugTxMp , libwl_sp$(LIBSUFFIX).a ) (.text)
Object OBJECT( AdjustRingPointer , libwl_sp$(LIBSUFFIX).a ) (.text)
Object OBJECT( CheckKeyTxEnd , libwl_sp$(LIBSUFFIX).a ) (.text)
# in WlIntrTask.o
Object OBJECT( WlIntrTxBeaconTask , libwl_sp$(LIBSUFFIX).a ) (.text)
Object OBJECT( WlIntrTxEndTask , libwl_sp$(LIBSUFFIX).a ) (.text)
Object OBJECT( WlIntrRxEndTask , libwl_sp$(LIBSUFFIX).a ) (.text)
Object OBJECT( WlIntrMpEndTask , libwl_sp$(LIBSUFFIX).a ) (.text)
Object OBJECT( SetParentTbttTxqTask , libwl_sp$(LIBSUFFIX).a ) (.text)
Object OBJECT( TakeoutRxFrame , libwl_sp$(LIBSUFFIX).a ) (.text)
# in TxCtrl.o
Object OBJECT( InitTxCtrl , libwl_sp$(LIBSUFFIX).a ) (.text)
# in RxCtrl.o
Object OBJECT( InitRxCtrl , libwl_sp$(LIBSUFFIX).a ) (.text)
# in WaitLoop.o
Object OBJECT( WaitLoop_Rxpe , libwl_sp$(LIBSUFFIX).a ) (.text)
Object OBJECT( WaitLoop_Waitus , libwl_sp$(LIBSUFFIX).a ) (.text)
Object OBJECT( WaitLoop_ClrAid , libwl_sp$(LIBSUFFIX).a ) (.text)
Object OBJECT( WaitLoop_BbpAccess , libwl_sp$(LIBSUFFIX).a ) (.text)
Object OBJECT( WaitLoop_RfAccess , libwl_sp$(LIBSUFFIX).a ) (.text)
}
#--------
Ltdautoload RSVWRAM
{
Address 0x03040000
Object * (.rsvwram)
Library libathdrv_sp$(LIBSUFFIX).a (.bss)
Library libathdrv_sp$(LIBSUFFIX).a (.data)
#####
# Sub-routines in TWL WIRELESS Driver , that should be on WRAM.
Object OBJECT( HTCSendPktCompletionHandler, libathdrv_sp$(LIBSUFFIX).a ) (.text)
Object OBJECT( HTCIssueSend, libathdrv_sp$(LIBSUFFIX).a ) (.text)
Object OBJECT( HTCTrySend, libathdrv_sp$(LIBSUFFIX).a ) (.text)
Object OBJECT( HTCSendPkt, libathdrv_sp$(LIBSUFFIX).a ) (.text)
Object OBJECT( HTCProcessCreditRpt, libathdrv_sp$(LIBSUFFIX).a ) (.text)
Object OBJECT( DevRecvPacket, libathdrv_sp$(LIBSUFFIX).a ) (.text)
Object OBJECT( HTCProcessRecvHeader, libathdrv_sp$(LIBSUFFIX).a ) (.text)
Object OBJECT( HTCRecvCompleteHandler, libathdrv_sp$(LIBSUFFIX).a ) (.text)
Object OBJECT( HTCRecvMessagePendingHandler, libathdrv_sp$(LIBSUFFIX).a ) (.text)
Object OBJECT( HTCAddReceivePkt, libathdrv_sp$(LIBSUFFIX).a ) (.text)
Object OBJECT( AR6KFreeIOPacket, libathdrv_sp$(LIBSUFFIX).a ) (.text)
Object OBJECT( AR6KAllocIOPacket, libathdrv_sp$(LIBSUFFIX).a ) (.text)
Object OBJECT( DevRWCompletionHandler, libathdrv_sp$(LIBSUFFIX).a ) (.text)
Object OBJECT( DevGetEventAsyncHandler, libathdrv_sp$(LIBSUFFIX).a ) (.text)
Object OBJECT( DevCheckPendingRecvMsgsAsync, libathdrv_sp$(LIBSUFFIX).a ) (.text)
Object OBJECT( DevDsrHandler, libathdrv_sp$(LIBSUFFIX).a ) (.text)
Object OBJECT( HIFReadWrite, libathdrv_sp$(LIBSUFFIX).a ) (.text)
Object OBJECT( hifRWCompletionHandler, libathdrv_sp$(LIBSUFFIX).a ) (.text)
Object OBJECT( hifIRQHandler, libathdrv_sp$(LIBSUFFIX).a ) (.text)
Object OBJECT( HIFAckInterrupt, libathdrv_sp$(LIBSUFFIX).a ) (.text)
Object OBJECT( ar6000_credit_distribute, libathdrv_sp$(LIBSUFFIX).a ) (.text)
Object OBJECT( a_netbuf_alloc, libathdrv_sp$(LIBSUFFIX).a ) (.text)
Object OBJECT( a_netbuf_alloc_rx, libathdrv_sp$(LIBSUFFIX).a ) (.text)
Object OBJECT( a_netbuf_put, libathdrv_sp$(LIBSUFFIX).a ) (.text)
Object OBJECT( a_netbuf_push, libathdrv_sp$(LIBSUFFIX).a ) (.text)
Object OBJECT( a_netbuf_pull, libathdrv_sp$(LIBSUFFIX).a ) (.text)
Object OBJECT( a_netbuf_free, libathdrv_sp$(LIBSUFFIX).a ) (.text)
Object OBJECT( a_netbuf_to_data, libathdrv_sp$(LIBSUFFIX).a ) (.text)
Object OBJECT( a_netbuf_to_len, libathdrv_sp$(LIBSUFFIX).a ) (.text)
Object OBJECT( a_netbuf_headroom, libathdrv_sp$(LIBSUFFIX).a ) (.text)
Object OBJECT( nin_drv_return_netbuf, libathdrv_sp$(LIBSUFFIX).a ) (.text)
Object OBJECT( ath_queue_remove_from_head, libathdrv_sp$(LIBSUFFIX).a ) (.text)
Object OBJECT( ath_queue_insert_tail, libathdrv_sp$(LIBSUFFIX).a ) (.text)
Object OBJECT( ar6000_alloc_cookie, libathdrv_sp$(LIBSUFFIX).a ) (.text)
Object OBJECT( nin_driver_tx, libathdrv_sp$(LIBSUFFIX).a ) (.text)
Object OBJECT( nin_tx_complete, libathdrv_sp$(LIBSUFFIX).a ) (.text)
Object OBJECT( wmi_dix_2_dot3, libathdrv_sp$(LIBSUFFIX).a ) (.text)
Object OBJECT( wmi_data_hdr_add, libathdrv_sp$(LIBSUFFIX).a ) (.text)
Object OBJECT( wmi_data_hdr_remove, libathdrv_sp$(LIBSUFFIX).a ) (.text)
Object OBJECT( nin_rx, libathdrv_sp$(LIBSUFFIX).a ) (.text)
Object OBJECT( ar6000_ibss_map_epid, libathdrv_sp$(LIBSUFFIX).a ) (.text)
Object OBJECT( DL_ListInsertTail, libathdrv_sp$(LIBSUFFIX).a ) (.text)
Object OBJECT( DL_ListRemove, libathdrv_sp$(LIBSUFFIX).a ) (.text)
Object OBJECT( wmi_control_rx, libathdrv_sp$(LIBSUFFIX).a ) (.text)
Object OBJECT( wmi_cmd_send, libathdrv_sp$(LIBSUFFIX).a ) (.text)
Object OBJECT( ar6000_control_tx, libathdrv_sp$(LIBSUFFIX).a ) (.text)
Object OBJECT( wmi_implicit_create_pstream, libathdrv_sp$(LIBSUFFIX).a ) (.text)
Object OBJECT( HTCAllocControlBuffer, libathdrv_sp$(LIBSUFFIX).a ) (.text)
Object OBJECT( HTCFreeControlBuffer, libathdrv_sp$(LIBSUFFIX).a ) (.text)
Object OBJECT( BMILZData, libathdrv_sp$(LIBSUFFIX).a ) (.text)
Object OBJECT( bmiBufferSend, libathdrv_sp$(LIBSUFFIX).a ) (.text)
Object OBJECT( BMIWriteMemory, libathdrv_sp$(LIBSUFFIX).a ) (.text)
# FATFS core symbols
Object OBJECT(FATFSi_lfi2text, libfatfs_sp$(LIBSUFFIX).a) (.text) # 360 BYTEs
Object OBJECT(FATFSi_pc_findin, libfatfs_sp$(LIBSUFFIX).a) (.text) # 904 BYTEs
Object OBJECT(FATFSi_pc_patcmp_vfat, libfatfs_sp$(LIBSUFFIX).a) (.text) # 436 BYTEs
Object OBJECT(FATFSi_pc_ascii_mfile, libfatfs_sp$(LIBSUFFIX).a) (.text) # 160 BYTEs
Object OBJECT(FATFSi_map_ascii_to_unicode, libfatfs_sp$(LIBSUFFIX).a) (.text) # 48 BYTEs
Object OBJECT(SDCARD_Intr_Thread, libfatfs_sp$(LIBSUFFIX).a) (.text) # 520 BYTEs
Object OBJECT(FATFSi_unicode_cmp_to_ascii_char, libfatfs_sp$(LIBSUFFIX).a) (.text) # 40 BYTEs
Object OBJECT(FATFSi_pc_read_blk, libfatfs_sp$(LIBSUFFIX).a) (.text) # 352 BYTEs
Object OBJECT(SDCARDi_WriteCore, libfatfs_sp$(LIBSUFFIX).a) (.text) #
Object OBJECT(SDCARDi_ReadCore, libfatfs_sp$(LIBSUFFIX).a) (.text) #
Object OBJECT(SD_SetFPGA, libfatfs_sp$(LIBSUFFIX).a) (.text) #
Object OBJECT(SD_TransCommand, libfatfs_sp$(LIBSUFFIX).a) (.text) #
Object OBJECT(SD_MultiWriteBlock, libfatfs_sp$(LIBSUFFIX).a) (.text) #
Object OBJECT(SD_MultiReadBlock, libfatfs_sp$(LIBSUFFIX).a) (.text) #
}
#--------
Ltdautoload LTDMAIN
{
Address 0x02f88000
Object * (.ltdmain)
Library libwm_sp$(LIBSUFFIX).a \
libnwm_sp$(LIBSUFFIX).a \
libwvr_sp$(LIBSUFFIX).a \
libwl_sp$(LIBSUFFIX).a
Library libwpa_sp$(LIBSUFFIX).a
Library libathdrv_sp$(LIBSUFFIX).a
Library libfatfs_sp$(LIBSUFFIX).a \
libaes_sp$(LIBSUFFIX).a
Library $(ISDBG_LIBS_TWL)
Library $(ISDBG_LIBS_NITRO)
Object * (.main)
}

View File

@ -0,0 +1,798 @@
/*---------------------------------------------------------------------------*
Project: TwlSDK - libraries - init - ARM7.TWL
File: crt0.SCR.c
Copyright 2008 Nintendo. All rights reserved.
These coded instructions, statements, and computer programs contain
proprietary information of Nintendo of America Inc. and/or Nintendo
Company Ltd., and are protected by Federal copyright law. They may
not be disclosed to third parties or copied or duplicated in any form,
in whole or in part, without the prior written consent of Nintendo.
$Date:: 2008-06-23#$
$Rev: 1672 $
$Author: yosiokat $
*---------------------------------------------------------------------------*/
#include <nitro/types.h>
#include <nitro/hw/common/armArch.h>
#include <twl/init/crt0.h>
#include <twl/memorymap_sp.h>
#include <twl/hw/common/mmap_wramEnv.h>
#include <nitro/os/common/emulator.h>
#ifndef SDK_FINALROM
#include <nitro/os/common/printf.h>
#endif
#include "boot_sync.h"
/*---------------------------------------------------------------------------*/
void _start(void);
void _start_AutoloadDoneCallback(void* argv[]);
/*---------------------------------------------------------------------------*
*---------------------------------------------------------------------------*/
/* リンカスクリプトにより定義されるシンボル参照 */
extern void SDK_AUTOLOAD_LIST(void);
extern void SDK_AUTOLOAD_LIST_END(void);
extern void SDK_AUTOLOAD_START(void);
extern void SDK_STATIC_START(void);
extern void SDK_STATIC_BSS_START(void);
extern void SDK_STATIC_BSS_END(void);
extern void SDK_LTDAUTOLOAD_LIST(void);
extern void SDK_LTDAUTOLOAD_LIST_END(void);
extern void SDK_LTDAUTOLOAD_START(void);
extern void SDK_WRAM_ARENA_LO(void);
/* 外部関数参照 */
extern void OS_IrqHandler(void);
#ifndef SDK_NOINIT
extern void _fp_init(void);
extern void __call_static_initializers(void);
#endif
/*---------------------------------------------------------------------------*
*---------------------------------------------------------------------------*/
#define SDK_NITROCODE_LE 0x2106c0de
#define SDK_NITROCODE_BE 0xdec00621
#define SDK_TWLCODE_LE 0x6314c0de
#define SDK_TWLCODE_BE 0xdec01463
/* .rodata セクションに配置するロードに必要な情報 */
void* const _start_ModuleParams[] =
{
(void*)0,
(void*)0,
(void*)0,
(void*)SDK_STATIC_BSS_START,
(void*)SDK_STATIC_BSS_END,
(void*)0,
(void*)0,
(void*)SDK_NITROCODE_BE,
(void*)SDK_NITROCODE_LE,
};
void* const _start_LtdModuleParams[] =
{
(void*)SDK_LTDAUTOLOAD_LIST,
(void*)SDK_LTDAUTOLOAD_LIST_END,
(void*)SDK_LTDAUTOLOAD_START,
(void*)0,
(void*)SDK_TWLCODE_BE,
(void*)SDK_TWLCODE_LE,
};
/*---------------------------------------------------------------------------*
Name: ShakeHand
Description: ARM9 ShakeHand
Arguments: r0 - ARM9
r1 - ARM7
Returns:
*---------------------------------------------------------------------------*/
static const u32 microcode_ShakeHand[10] =
{
0xe1d020b0, /* ldrh r2, [r0] ; 同期変数9を共有メモリから読む */
0xe1d130b0, /* ldrh r3, [r1] ; 同期変数7を共有メモリから読む */
0xe2833001, /* @1: add r3, r3, #1 ; 同期変数7 ++ */
0xe1c130b0, /* strh r3, [r1] ; 同期変数7を共有メモリに書く */
0xe1d0c0b0, /* ldrh r12, [r0] ; 同期変数9の現状を共有メモリから読む */
0xe152000c, /* cmp r2, r12 ; 同期変数9の変化を判定する */
0x0afffffa, /* beq @1 ; 変化していなければループ */
0xe2833001, /* add r3, r3, #1 ; 同期変数7 ++ */
0xe1c130b0, /* strh r3, [r1] ; 同期変数7を共有メモリに書く */
0xe12fff1e /* bx lr ; ハンドシェイク完了 */
};
/*---------------------------------------------------------------------------*
Name: Stop
Description:
Arguments:
Returns:
*---------------------------------------------------------------------------*/
static const u32 microcode_Stop[2] =
{
0xef000006, /* @1: swi #6 ; SVC_Halt */
0xeafffffd /* b @1 ; ループ */
};
/*---------------------------------------------------------------------------*
Name: GotoMain
Description: ARM9 Main
0
使
Arguments: r0 - 0
4
r1 - 8 bit: ARM9
24 bit: 0
4
r2 -
r3 - Main Main Thumb
bx 1
Returns:
*---------------------------------------------------------------------------*/
static const u32 microcode_GotoMain[10] =
{
0xe59fc01c, /* @1: ldr r12, [pc, #28] ; 下位 24 bit マスクを用意 */
0xe111000c, /* tst r1, r12 ; クリアバッファ残サイズをチェック */
0xe3a0c000, /* mov r12, #0 ; クリア用変数を用意 */
0x1480c004, /* strne r12, [r0], #4 ; 4 バイトクリア */
0x12411004, /* subne r1, r1, #4 ; クリアバッファ残サイズ -= 4 */
0x1afffff9, /* bne @1 ; 残サイズが 0 になるまでループ */
0xe1a01c21, /* mov r1, r1, LSR #24 ; フェーズ管理変数の更新値を用意 */
0xe1c210b0, /* strh r1, [r2] ; フェーズ管理変数を更新 */
0xe12fff13, /* bx r3 ; Main 関数へジャンプ */
0x00fffffc /* <DATA> 0x00fffffc */
};
/*---------------------------------------------------------------------------*
*---------------------------------------------------------------------------*/
static void INITi_CheckSysConfig(void);
static void INITi_DetectMainMemorySize(void);
static void INITi_Stop(void);
static void INITi_DoAutoload(void);
#ifndef SDK_NOINIT
static void INITi_ShelterStaticInitializer(u32* ptr);
static void INITi_CallStaticInitializers(void);
#endif
static void* INITi_Copy32(void* dst, void* src, u32 size);
static void* INITi_Fill32(void* dst, u32 value, u32 size);
/*---------------------------------------------------------------------------*/
#include <twl/code32.h>
/*---------------------------------------------------------------------------*
Name: _start
Description:
Arguments:
Returns:
*---------------------------------------------------------------------------*/
SDK_WEAK_SYMBOL asm void
_start(void)
{
@000:
/* 割込み禁止 */
mov r12, #HW_REG_BASE
str r12, [r12, #REG_IME_OFFSET]
/* SCFG 設定を確認 */
bl INITi_CheckSysConfig
/* プリロードパラメータアドレスが格納されていない場合は、デフォルト値をセット */
ldr r0, =HW_PRELOAD_PARAMETER_ADDR
ldr r1, [r0]
cmp r1, #0
ldreq r1, =HW_PARAM_TWL_SETTINGS_DATA_DEFAULT
streq r1, [r0]
/* ランチャーから渡された情報を退避 */
ldr r3, =SDK_WRAM_ARENA_LO
sub r2, r3, #0x40
ldr r1, =HW_LAUNCHER_DELIVER_PARAM_BUF
@001:
cmp r2, r3
ldrlt r0, [r1], #4
strlt r0, [r2], #4
blt @001
/* ハンドシェイク用マイクロコードを専用 WRAM にコピー */
ldr r1, =microcode_ShakeHand
ldr r2, =HW_PRV_WRAM
add r3, r2, #40 // sizeof(microcode_ShakeHand)
@002: ldr r0, [r1], #4
str r0, [r2], #4
cmp r2, r3
blt @002
/* 専用 WRAM 上のコードで ARM9 とハンドシェイク */
ldr r0, =HW_BOOT_SHAKEHAND_9
ldr r1, =HW_BOOT_SHAKEHAND_7
ldr r2, =HW_PRV_WRAM
mov lr, pc
bx r2
@010:
/* スタックポインタ設定 */
mov r0, #HW_PSR_SVC_MODE // SuperVisor mode
msr cpsr_c, r0
ldr sp, =HW_PRV_WRAM_SVC_STACK_END
mov r0, #HW_PSR_IRQ_MODE // IRQ mode
msr cpsr_c, r0
ldr sp, =HW_PRV_WRAM_IRQ_STACK_END
ldr r1, =SDK_IRQ_STACKSIZE
sub r1, sp, r1
sub sp, sp, #4 // 4 bytes for IRQ stack check code
mov r0, #HW_PSR_SYS_MODE // System mode
msr cpsr_csfx, r0
sub sp, r1, #4 // 4 bytes for SYS stack check code
/* スタック領域をクリア */
ldr r0, =SDK_SYS_STACKSIZE
sub r1, r1, r0
ldr r2, =HW_PRV_WRAM_IRQ_STACK_END
mov r0, #0
@011: cmp r1, r2
strlt r0, [r1], #4
blt @011
/* Autoload を実施 */
bl INITi_DoAutoload
/* STATIC セグメントの .bss セクションを 0 クリア */
mov r1, #0 // r1 = clear value for STATIC bss section
ldr r3, =_start_ModuleParams
ldr r0, [r3, #12] // r0 = start address of STATIC bss section
ldr r2, [r3, #16]
subs r2, r2, r0 // r2 = size of STATIC bss section
blgt INITi_Fill32
/* メインメモリサイズを調査 */
bl INITi_DetectMainMemorySize
#ifndef SDK_FINALROM
/* デバッグ出力ウィンドウを設定 */
ldr r1, =HW_PRINT_OUTPUT_ARM9
mov r0, #OS_PRINT_OUTPUT_DEFAULT_ARM9
orr r0, r0, #(OS_PRINT_OUTPUT_DEFAULT_ARM7 << 8)
strh r0, [r1]
mov r0, #OS_PRINT_OUTPUT_DEFAULT_ARM9ERR
orr r0, r0, #(OS_PRINT_OUTPUT_DEFAULT_ARM7ERR << 8)
strh r0, [r1, #2]
#endif
/* IRQ 割込みベクタ設定 */
ldr r1, =HW_INTR_VECTOR_BUF
ldr r0, =OS_IrqHandler
str r0, [r1]
#ifndef SDK_NOINIT
/* c++ 用初期化 */
bl _fp_init
bl TwlSpStartUp
bl __call_static_initializers
bl INITi_CallStaticInitializers
#endif
@0f0:
/* Main 関数へのジャンプ用マイクロコードをスタックの底にコピー */
ldr r1, =microcode_GotoMain
sub r2, sp, #40
mov r3, sp
@0f1: cmp r2, r3
ldrlt r0, [r1], #4
strlt r0, [r2], #4
blt @0f1
/* マイクロコードを経由して Main 関数へジャンプ */
ldr r0, =SDK_STATIC_START
bic r0, r0, #0x00000003
ldr r1, =SDK_STATIC_BSS_END
sub r1, r1, r0
add r1, r1, #3
bic r1, r1, #0x00000003
bic r1, r1, #0xff000000
mov r2, #BOOT_SYNC_PHASE_4
mov r2, r2, LSL #24
orr r1, r1, r2
ldr r2, =HW_BOOT_SYNC_PHASE
ldr r3, =TwlSpMain
ldr lr, =HW_RESET_VECTOR
sub r12, sp, #40
bx r12
/* never return */
}
/*---------------------------------------------------------------------------*
Name: _start_AutoloadDoneCallback
Description:
Arguments: argv -
argv[0] = SDK_AUTOLOAD_LIST
argv[1] = SDK_AUTOLOAD_LIST_END
argv[2] = SDK_AUTOLOAD_START
argv[3] = SDK_STATIC_BSS_START
argv[4] = SDK_STATIC_BSS_END
Returns:
*---------------------------------------------------------------------------*/
SDK_WEAK_SYMBOL asm void
_start_AutoloadDoneCallback(void* argv[])
{
bx lr
}
/*---------------------------------------------------------------------------*
Name: INITi_CheckSysConfig
Description: SCFG I/O
A7-SCFG
ARM7 WRAM I/O
Arguments:
Returns:
*---------------------------------------------------------------------------*/
static asm void
INITi_CheckSysConfig(void)
{
/* A7-SCFG のアクセス可否判定 */
ldr r1, =REG_EXT_ADDR
ldr r0, [r1]
ldr r2, =HW_PRV_WRAM_SYSRV
tst r0, #REG_SCFG_EXT_CFG_MASK
beq @invalid
@valid:
/* ARM7 Secure-ROM 切り離し */
ldr r1, =REG_A7ROM_ADDR
ldrb r0, [r1]
orr r0, r0, #REG_SCFG_A7ROM_SEC_MASK
strb r0, [r1]
/* ARM9 Secure-ROM 切り離し */
ldr r1, =REG_A9ROM_ADDR
ldrb r0, [r1]
orr r0, r0, #REG_SCFG_A9ROM_SEC_MASK
strb r0, [r1]
/* NITRO 無線を有効化 */
ldr r1, =REG_WL_ADDR
ldrh r0, [r1]
orr r0, r0, #REG_SCFG_WL_OFFB_MASK
strh r0, [r1]
/* ROM 設定、NITRO 無線設定、ボンディングオプション情報を WRAM に展開 */
ldr r3, =REG_OP_ADDR // SCFG-OP
ldrb r1, [r3]
and r0, r1, #(REG_SCFG_OP_OP1_MASK | REG_SCFG_OP_OP0_MASK)
ldr r3, =REG_A9ROM_ADDR // SCFG-ROM:0~7
ldrb r1, [r3]
and r3, r1, #(REG_SCFG_A9ROM_RSEL_MASK | REG_SCFG_A9ROM_SEC_MASK)
orr r0, r0, r3, LSL #(HWi_WSYS08_ROM_ARM9RSEL_SHIFT - REG_SCFG_A9ROM_RSEL_SHIFT)
ldr r3, =REG_A7ROM_ADDR // SCFG-ROM:8~15
ldrb r1, [r3]
and r3, r1, #(REG_SCFG_A7ROM_RSEL_MASK | REG_SCFG_A7ROM_FUSE_MASK)
orr r0, r0, r3, LSL #(HWi_WSYS08_ROM_ARM7RSEL_SHIFT - REG_SCFG_A7ROM_RSEL_SHIFT)
ldr r3, =REG_WL_ADDR // SCFG-WL
ldrb r1, [r3]
and r3, r1, #REG_SCFG_WL_OFFB_MASK
orr r0, r0, r3, LSL #(HWi_WSYS08_WL_OFFB_SHIFT - REG_SCFG_WL_OFFB_SHIFT)
strb r0, [r2, #HWi_WSYS08_WRAMOFFSET]
/* 各新規ブロックへクロックを供給 */
ldr r1, =REG_CLK_ADDR
ldrh r0, [r1]
ldr r3, =REG_SCFG_CLK_SNDMCLK_MASK | REG_SCFG_CLK_WRAMHCLK_MASK | REG_SCFG_CLK_AESHCLK_MASK | REG_SCFG_CLK_SD2HCLK_MASK | REG_SCFG_CLK_SD1HCLK_MASK
orr r0, r0, r3
strh r0, [r1]
/* JTAG 情報を WRAM に展開 */
ldr r3, =REG_JTAG_ADDR // SCFG-JTAG
ldrh r1, [r3]
and r0, r1, #(REG_SCFG_JTAG_CPUJE_MASK | REG_SCFG_JTAG_ARM7SEL_MASK)
and r3, r1, #REG_SCFG_JTAG_DSPJE_MASK
orr r0, r0, r3, LSR #(REG_SCFG_JTAG_DSPJE_SHIFT - HWi_WSYS09_JTAG_DSPJE_SHIFT)
strb r0, [r2, #HWi_WSYS09_WRAMOFFSET]
/* 各拡張機能を有効化 */
ldr r1, =REG_EXT_ADDR // SCFG_EXT
ldr r0, [r1]
ldr r3, =REG_SCFG_EXT_WRAM_MASK | REG_SCFG_EXT_GPIO_MASK | REG_SCFG_EXT_I2C_MASK | REG_SCFG_EXT_I2S_MASK | REG_SCFG_EXT_MIC_MASK | REG_SCFG_EXT_SD2_MASK | REG_SCFG_EXT_SD1_MASK | REG_SCFG_EXT_AES_MASK | REG_SCFG_EXT_DMAC_MASK
orr r0, r0, r3
orr r0, r0, #(REG_SCFG_EXT_DSEL_MASK | REG_SCFG_EXT_INTC_MASK)
bic r0, r0, #REG_SCFG_EXT_MC_B_MASK
str r0, [r1]
/* 各拡張機能の制御設定内容を WRAM に展開 */
str r0, [r2, #HWi_WSYS04_WRAMOFFSET]
/* メモリーカード I/F のスロット選択 */
ldr r1, =REG_MC1_ADDR // SCFG_MC1
ldr r0, [r1]
bic r0, r0, #REG_MI_MC1_SWP_MASK
str r0, [r1]
/* WRAM-A/B/C が ARM7 に割り当たっていることを確認 */
ldr r1, =REG_MBK1_ADDR
ldr r0, [r1]
ldr r3, =0x8d898581
cmp r0, r3
blne INITi_Stop
ldr r1, =REG_MBK2_ADDR
ldr r0, [r1]
ldr r3, =0x8d898581
cmp r0, r3
blne INITi_Stop
ldr r1, =REG_MBK3_ADDR
ldr r0, [r1]
ldr r3, =0x9d999591
cmp r0, r3
blne INITi_Stop
ldr r1, =REG_MBK4_ADDR
ldr r0, [r1]
ldr r3, =0x8d898581
cmp r0, r3
blne INITi_Stop
ldr r1, =REG_MBK5_ADDR
ldr r0, [r1]
ldr r3, =0x9d999591
cmp r0, r3
blne INITi_Stop
/* WRAM-A/B/C のメモリマップを設定 */
ldr r1, =REG_MBK6_ADDR
ldr r0, =0x080037c0
str r0, [r1]
ldr r1, =REG_MBK7_ADDR
ldr r0, =0x07c03780
str r0, [r1]
ldr r1, =REG_MBK8_ADDR
ldr r0, =0x07803740
str r0, [r1]
ldr r1, =REG_MBK9_ADDR
ldr r0, =0x00ffff0f
str r0, [r1]
/* A7-SCFG ブロックへのアクセスを無効化 */
ldr r1, =REG_EXT_ADDR
ldr r0, [r1]
/* bic r0, r0, #REG_SCFG_EXT_CFG_MASK */
str r0, [r1]
@invalid:
/* ROM 設定、NITRO 無線設定内容を確認 */
ldrb r0, [r2, #HWi_WSYS08_WRAMOFFSET]
and r0, r0, #(HWi_WSYS08_ROM_ARM7RSEL_MASK | HWi_WSYS08_ROM_ARM9RSEL_MASK | HWi_WSYS08_ROM_ARM9SEC_MASK)
cmp r0, #HWi_WSYS08_ROM_ARM9SEC_MASK
blne INITi_Stop
/* SCFG レジスタ設定情報を共有領域にコピー */
ldr r2, =HW_PRV_WRAM_SYSRV
ldr r3, =HW_SYS_CONF_BUF
ldr r0, [r2, #HWi_WSYS04_WRAMOFFSET]
str r0, [r3, #HWi_WSYS04_OFFSET]
ldrh r0, [r2, #HWi_WSYS08_WRAMOFFSET]
strh r0, [r3, #HWi_WSYS08_OFFSET]
bx lr
}
/*---------------------------------------------------------------------------*
Name: INITi_DetectMainMemorySize
Description: 調
調 (u16*)HW_MMEMCHECER_SUB
[OS_CONSOLE_SIZE_16MB|OS_CONSOLE_SIZE_32B]
NOTE: NITRO
Arguments:
Returns:
*---------------------------------------------------------------------------*/
#define OSi_IMAGE_DIFFERENCE2 0xb000000
#define OSi_DETECT_NITRO_MASK (REG_SND_SMX_CNT_E_MASK | REG_SND_SMX_CNT_FSEL_MASK)
#define OSi_DETECT_NITRO_VAL (REG_SND_SMX_CNT_E_MASK)
#define OSi_CHECKNUM1 0x55
#define OSi_CHECKNUM2 0xaa
#define OSi_100usWAIT 3352 // 100us = 3351.4cycles(33.514MHz)
static asm void
INITi_DetectMainMemorySize(void)
{
ldr r2, =HW_MMEMCHECKER_SUB
add r3, r2, #OSi_IMAGE_DIFFERENCE2
mov r0, #OS_CONSOLE_SIZE_16MB
/* OSi_CHECKNUM1 (0x55) 書き込みテスト */
mov r1, #OSi_CHECKNUM1
strb r1, [r3]
ldr r2, =OSi_100usWAIT
@1 subs r2, r2, #4
bcs @1
ldrb r1, [r3]
cmp r1, #OSi_CHECKNUM1
bne @check_smix
/* OSi_CHECKNUM2 (0xaa) を 書き込みテスト */
mov r1, #OSi_CHECKNUM2
strb r1, [r3]
ldr r2, =OSi_100usWAIT
@2 subs r2, r2, #4
bcs @2
ldrb r1, [r3]
cmp r1, #OSi_CHECKNUM2
moveq r0, #OS_CONSOLE_SIZE_32MB
@check_smix:
/* SMIX レジスタを調査 */
ldr r3, =REG_SMX_CNT_ADDR
ldrh r1, [r3]
and r1, r1, #OSi_DETECT_NITRO_MASK
cmp r1, #OSi_DETECT_NITRO_VAL
orreq r0, r0, #OS_CHIPTYPE_SMX_MASK
/* 調査結果を格納 */
ldr r2, =HW_MMEMCHECKER_SUB
strb r0, [r2]
bx lr
}
/*---------------------------------------------------------------------------*
Name: INITi_Stop
Description: ARM7 WRAM Halt
Arguments:
Returns:
*---------------------------------------------------------------------------*/
static asm void
INITi_Stop(void)
{
ldr r1, =microcode_Stop
ldr r2, =HW_PRV_WRAM
add r3, r2, #8 // sizeof(microcode_Stop)
@copy_loop:
ldr r0, [r1], #4
str r0, [r2], #4
cmp r2, r3
blt @copy_loop
@stop_loop:
ldr r0, =HW_PRV_WRAM
mov lr, pc
bx r0
b @stop_loop
/* never return */
}
/*---------------------------------------------------------------------------*
Name: INITi_DoAutoload
Description: 沿
0
NITRO TWL
Arguments:
Returns:
*---------------------------------------------------------------------------*/
static asm void
INITi_DoAutoload(void)
{
stmfd sp!, {lr}
/* オートロードを実施 */
@000:
ldr r0, =_start_LtdModuleParams
ldr r12, [r0] // r12 = SDK_LTDAUTOLOAD_LIST
ldr r3, [r0, #4] // r3 = SDK_LTDAUTOLOAD_LIST_END
ldr r1, [r0, #8] // r1 = SDK_LTDAUTOLOAD_START
@001:
cmp r12, r3
bge @010
/* 固定セクション */
ldr r0, [r12], #4 // r0 = start address of destination range of fixed section
ldr r2, [r12], #4 // r2 = size of fixed section
bl INITi_Copy32
stmfd sp!, {r0, r1}
/* static initializer テーブル */
ldr r0, [r12], #4
#ifndef SDK_NOINIT
stmfd sp!, {r3, r12}
bl INITi_ShelterStaticInitializer
ldmfd sp!, {r3, r12}
#endif
/* bss セクション */
ldmfd sp!, {r0} // r0 = start address of destination range of bss section
mov r1, #0 // r1 = clear value for bss section
ldr r2, [r12], #4 // r2 = sizeo of bss section
bl INITi_Fill32
ldmfd sp!, {r1}
b @001
/* オートロードリスト・オートロード元バッファをクリア */
@010:
ldr r1, =_start_LtdModuleParams
ldr r12, [r1] // r12 = SDK_LTDAUTOLOAD_LIST
ldr r3, [r1, #4] // r3 = SDK_LTDAUTOLOAD_LIST_END
ldr r0, [r1, #8] // r0 = SDK_LTDAUTOLOAD_START
@011:
cmp r12, r3
bge @0f0
mov r1, #0 // r1 = clear value
str r1, [r12], #4
ldr r2, [r12] // r2 = size of fixed section
str r1, [r12], #4
str r1, [r12], #4
str r1, [r12], #4
bl INITi_Fill32
b @011
@0f0:
/* オートロード完了コールバック呼び出し */
ldr r0, =_start_ModuleParams
ldr r1, =_start_LtdModuleParams
ldmfd sp!, {lr}
b _start_AutoloadDoneCallback
}
#ifndef SDK_NOINIT
static asm void
/*---------------------------------------------------------------------------*
Name: INITi_ShelterStaticInitializer
Description: static initializer
IRQ 退
Arguments: ptr -
NULL
Returns:
*---------------------------------------------------------------------------*/
static asm void
INITi_ShelterStaticInitializer(u32* ptr)
{
/* 引数確認 */
cmp r0, #0
bxeq lr
/* 退避場所先頭アドレスを計算 */
ldr r1, =HW_PRV_WRAM_IRQ_STACK_END
ldr r2, =SDK_IRQ_STACKSIZE
sub r1, r1, r2
add r1, r1, #4
@001:
/* 退避場所先頭から空き場所を調査 */
ldr r2, [r1]
cmp r2, #0
addne r1, r1, #4
bne @001
@002:
/* 空き場所にテーブルをコピー */
ldr r2, [r0], #4
str r2, [r1], #4
cmp r2, #0
bne @002
bx lr
}
/*---------------------------------------------------------------------------*
Name: INITi_CallStaticInitializers
Description: static initializer
IRQ 退
Arguments:
Returns:
*---------------------------------------------------------------------------*/
static asm void
INITi_CallStaticInitializers(void)
{
stmdb sp!, {lr}
/* テーブル退避場所先頭アドレスを計算 */
ldr r1, =HW_PRV_WRAM_IRQ_STACK_END
ldr r2, =SDK_IRQ_STACKSIZE
sub r1, r1, r2
add r1, r1, #4
@001:
/* テーブルに管理されているポインタを一つずつ呼び出し */
ldr r0, [r1]
cmp r0, #0
beq @002
stmfd sp!, {r1}
mov lr, pc
bx r0
ldmfd sp!, {r1}
/* 一旦呼び出したポインタはゼロクリア (IRQスタックを間借りしている為) */
mov r0, #0
str r0, [r1], #4
b @001
@002:
ldmia sp!, {lr}
bx lr
}
#endif
/*---------------------------------------------------------------------------*
Name: INITi_Copy32
Description: 32 bit 36
r3 - r12
Arguments: r0 - ( 4 )
r1 - ( 4 )
r2 - ( 4 )
Returns: r0 - ( r0 + r2 )
r1 - ( r1 + r2 )
*---------------------------------------------------------------------------*/
static asm void*
INITi_Copy32(void* dst, void* src, u32 size)
{
stmfd sp!, {r3-r11}
bics r3, r2, #0x0000001f
beq @next
add r3, r0, r3
@loop:
ldmia r1!, {r4-r11}
stmia r0!, {r4-r11}
cmp r3, r0
bgt @loop
@next:
tst r2, #0x00000010
ldmneia r1!, {r4-r7}
stmneia r0!, {r4-r7}
tst r2, #0x00000008
ldmneia r1!, {r4-r5}
stmneia r0!, {r4-r5}
tst r2, #0x00000004
ldmneia r1!, {r4}
stmneia r0!, {r4}
ldmfd sp!, {r3-r11}
bx lr
}
/*---------------------------------------------------------------------------*
Name: INITi_Fill32
Description: 32 bit 36
r3 - r12
Arguments: r0 - ( 4 )
r1 - 32 bit
r2 - ( 4 )
Returns: r0 - ( r0 + r2 )
*---------------------------------------------------------------------------*/
static asm void*
INITi_Fill32(void* dst, u32 value, u32 size)
{
stmfd sp!, {r3-r11}
mov r4, r1
mov r5, r1
mov r6, r1
mov r7, r1
mov r8, r1
mov r9, r1
mov r10, r1
mov r11, r1
bics r3, r2, #0x0000001f
beq @next
add r3, r0, r3
@loop:
stmia r0!, {r4-r11}
cmp r3, r0
bgt @loop
@next:
tst r2, #0x00000010
stmneia r0!, {r4-r7}
tst r2, #0x00000008
stmneia r0!, {r4-r5}
tst r2, #0x00000004
stmneia r0!, {r4}
ldmfd sp!, {r3-r11}
bx lr
}
#include <twl/codereset.h>

View File

@ -1,108 +0,0 @@
/*---------------------------------------------------------------------------*
Project: TwlSDK - components - mongoose.TWL
File: initScfg.c
Copyright 2008 Nintendo. All rights reserved.
These coded instructions, statements, and computer programs contain
proprietary information of Nintendo of America Inc. and/or Nintendo
Company Ltd., and are protected by Federal copyright law. They may
not be disclosed to third parties or copied or duplicated in any form,
in whole or in part, without the prior written consent of Nintendo.
$Date:: 2008-04-01#$
$Rev: 5238 $
$Author: nakasima $
*---------------------------------------------------------------------------*/
#include <twl/memorymap_sp.h>
#include <twl/hw/common/mmap_wramEnv.h>
extern void INIT_InitializeScfg(void);
#include <twl/code32.h>
/*---------------------------------------------------------------------------*
Name: INIT_InitializeScfg
Description: SCFG
crt0
Arguments: None.
Returns: None.
*---------------------------------------------------------------------------*/
asm void
INIT_InitializeScfg(void)
{
// SCFG enable?
ldr r2, =REG_EXT_ADDR
ldr r0, [r2]
tst r0, #REG_SCFG_EXT_CFG_MASK
beq @end
/* NITRO 互換無線の送受信機能を動作 */
ldr r1, =REG_WL_ADDR
ldrh r0, [r1]
orr r0, r0, #REG_SCFG_WL_OFFB_MASK
strh r0, [r1]
/* 新規サウンドブロックへのクロック供給 */
ldr r1, =REG_CLK_ADDR
ldrh r0, [r1]
orr r0, r0, #REG_SCFG_CLK_SNDMCLK_MASK
strh r0, [r1]
/* ARM7 側の DMA には新 DMA 回路を採用 */
ldr r1, =REG_EXT_ADDR
ldr r0, [r1]
orr r0, r0, #REG_SCFG_EXT_DMAC_MASK
str r0, [r1]
ldr r2, =HW_PRV_WRAM_SYSRV
//EXT(extentions)
ldr r3, =REG_EXT_ADDR
ldr r0, [r3]
str r0, [r2, #HWi_WSYS04_WRAMOFFSET]
//OPT(bonding option)
ldr r3, =REG_OP_ADDR
ldrb r0, [r3]
//A9ROM(ARM9 ROM)
ldr r3, =REG_A9ROM_ADDR
ldrb r1, [r3]
and r12,r1, #(REG_SCFG_A9ROM_RSEL_MASK | REG_SCFG_A9ROM_SEC_MASK)
orr r0, r0, r12, LSL #(HWi_WSYS08_ROM_ARM9RSEL_SHIFT - REG_SCFG_A9ROM_RSEL_SHIFT)
//A7ROM(ARM7 ROM)
ldr r3, =REG_A7ROM_ADDR
ldrb r1, [r3]
and r12,r1, #(REG_SCFG_A7ROM_RSEL_MASK | REG_SCFG_A7ROM_FUSE_MASK)
orr r0, r0, r12, LSL #(HWi_WSYS08_ROM_ARM7RSEL_SHIFT - REG_SCFG_A7ROM_RSEL_SHIFT)
//DS-WL(DS wireless)
ldr r3, =REG_WL_ADDR
ldrb r1, [r3]
and r12,r1, #REG_SCFG_WL_OFFB_MASK
orr r0, r0, r12, LSL #(HWi_WSYS08_WL_OFFB_SHIFT - REG_SCFG_WL_OFFB_SHIFT)
strb r0, [r2, #HWi_WSYS08_WRAMOFFSET]
//OPT(JTAG info)
ldr r3, =REG_JTAG_ADDR
ldrh r0, [r3]
and r12,r0, #REG_SCFG_JTAG_DSPJE_MASK
orr r0, r0, r12, LSR #(REG_SCFG_JTAG_DSPJE_SHIFT - HWi_WSYS09_JTAG_DSPJE_SHIFT)
//CLK(only wram clock)
ldr r3, =REG_CLK_ADDR
ldrh r1, [r3]
and r12,r1, #(REG_SCFG_CLK_AESHCLK_MASK | REG_SCFG_CLK_SD2HCLK_MASK | REG_SCFG_CLK_SD1HCLK_MASK)
orr r0, r0, r12, LSL #(HWi_WSYS09_CLK_SD1HCLK_SHIFT - REG_SCFG_CLK_SD1HCLK_SHIFT)
and r12,r1, #(REG_SCFG_CLK_SNDMCLK_MASK | REG_SCFG_CLK_WRAMHCLK_MASK)
orr r0, r0, r12, LSR #(REG_SCFG_CLK_WRAMHCLK_SHIFT - HWi_WSYS09_CLK_WRAMHCLK_SHIFT)
strb r0, [r2, #HWi_WSYS09_WRAMOFFSET]
/* A7-SCFG ブロックへのアクセスを無効化 */
ldr r1, =REG_EXT_ADDR
ldr r0, [r1]
bic r0, r0, #REG_SCFG_EXT_CFG_MASK
str r0, [r1]
@end:
bx lr
}
#include <twl/codereset.h>

View File

@ -1,8 +1,8 @@
/*---------------------------------------------------------------------------*
Project: TwlSDK - components - mongoose.TWL
Project: TwlSDK - components - armadillo.TWL
File: main.c
Copyright 2007-2009 Nintendo. All rights reserved.
Copyright 2008 Nintendo. All rights reserved.
These coded instructions, statements, and computer programs contain
proprietary information of Nintendo of America Inc. and/or Nintendo
@ -10,120 +10,84 @@
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:: 2009-06-11#$
$Rev: 10743 $
$Author: okajima_manabu $
$Date:: 2008-08-18#$
$Rev: 2182 $
$Author: kamikawa $
*---------------------------------------------------------------------------*/
#include <nitro/types.h>
#include <twl/init/crt0.h>
#include <twl/memorymap_sp.h>
#include <twl/os.h>
#include <twl/spi.h>
#include <twl/fatfs.h>
#include <nitro/pad.h>
#include <nitro/std.h>
#include <nitro/snd.h>
#ifndef SDK_ARM7COMP_WO_WIRELESS
#include <nitro/wvr.h>
#include <twl/nwm.h>
#endif // SDK_ARM7COMP_WO_WIRELESS
#ifndef SDK_ARM7COMP_WO_CAMERA
#include <twl/camera.h>
#endif
#include <twl/rtc.h>
#include <nitro/hw/common/lcd.h>
#include <nitro/gx.h>
#include <twl/os/common/codecmode.h>
#include <twl/cdc.h>
#include <twl/snd/ARM7/sndex_api.h>
#include <nitro/pad.h>
#include <twl/aes.h>
#include <twl/sea.h>
#include <twl/fatfs.h>
#include <twl/nwm.h>
#include <twl/camera.h>
#include <sysmenu.h>
#include <twl/mcu.h>
#include <twl/cdc.h>
#include <nitro/snd.h>
#include <twl/snd/ARM7/sndex_api.h>
#include <twl/rtc.h>
#include <nitro/wvr.h>
#include <twl/spi.h>
#include "nvram_sp.h"
#include "kami_pxi.h"
#ifdef SDK_SEA
#include <twl/sea.h>
#endif // ifdef SDK_SEA
#include <firm/os/common/system.h>
/*---------------------------------------------------------------------------*
*---------------------------------------------------------------------------*/
#ifndef SDK_ARM7COMP_WO_WIRELESS
#define WM_WL_HEAP_SIZE 0x2100
#define ATH_DRV_HEAP_SIZE 0x5800
#define WPA_HEAP_SIZE 0x1C00
#endif // SDK_ARM7COMP_WO_WIRELESS
#define MEM_TYPE_WRAM 0
#define MEM_TYPE_MAIN 1
/* Priorities of each threads */
#define THREAD_PRIO_MCU 1 //4 /* ハードウェアリセット時に他のスレッドに優先して動く必要アリ */
#define THREAD_PRIO_SPI 2
#define THREAD_PRIO_SND 6
#define THREAD_PRIO_FATFS 8
#define THREAD_PRIO_AES 12
#define THREAD_PRIO_SEA 12
#define THREAD_PRIO_RTC 12
#define THREAD_PRIO_SNDEX 14
#define THREAD_PRIO_FS 15
/* 各スレッド優先度 */
#define THREAD_PRIO_SPI 2
#define THREAD_PRIO_MCU 4 // 暫定
#define THREAD_PRIO_SND 6
#define THREAD_PRIO_NWM_EVENT 7
#define THREAD_PRIO_NWM_SDIO 8
#define THREAD_PRIO_FATFS 8
#define THREAD_PRIO_NWM_COMMAND 9
#define THREAD_PRIO_NWM_WPA 10
#define THREAD_PRIO_HOTSW 11
#define THREAD_PRIO_AES 12
#define THREAD_PRIO_SEA 12
#define THREAD_PRIO_RTC 12
#define THREAD_PRIO_SNDEX 14
#define THREAD_PRIO_FS 15
/* OS_THREAD_LAUNCHER_PRIORITY 16 */
#ifndef SDK_ARM7COMP_WO_WIRELESS
#define NWM_DMANO NWMSP_DMA_7
#define THREAD_PRIO_NWM_COMMAND 9
#define THREAD_PRIO_NWM_EVENT 7
#define THREAD_PRIO_NWM_SDIO 8
#define THREAD_PRIO_NWM_WPA 10
#endif // SDK_ARM7COMP_WO_WIRELESS
/* ROM 内登録エリアの拡張言語コード */
#define ROMHEADER_FOR_CHINA_BIT 0x80
#define ROMHEADER_FOR_KOREA_BIT 0x40
// ROM 内登録エリアの拡張言語コード
#define ROMHEADER_FOR_CHINA_BIT 0x80
#define ROMHEADER_FOR_KOREA_BIT 0x40
/* 使用 DMA 番号 */
#define DMA_NO_FATFS FATFS_DMA_4 // = 0
#define DMA_NO_NWM 3
/* カードチャタリングカウンタ */
#define CHATTERING_COUNTER 0x1988 // 100ms分 (0x1988 * 15.3us = 100000us)
#include <nitro/main_begin.h>
// エラーメッセージ用の文字列(コードサイズ削減のために用意、MAIN に配置するために const にしない)
static char strARM7[] ="ARM7:";
static char strMemMAIN[] ="MAIN";
static char strMemWRAM[] ="WRAM";
static char strFailedCreateHeap[] ="%sFailedToCreateHeap.(%s)\n";
static char strHeapSizeIs[] ="%s_HeapSize=%d (Margin:%d)\n";
static char strInsufficientHeapSize[] ="%sInsufficientHeapSize. (0x%x < 0x%x)\n";
#include <nitro/main_end.h>
#include <twl/ltdmain_begin.h>
static char strWramBeforeAdd[] ="WRAM(BeforeAddToHeap)";
static char strMainBeforeAdd[] ="MAIN(BeforeAddToHeap)";
#include <twl/ltdmain_end.h>
/*---------------------------------------------------------------------------*
*---------------------------------------------------------------------------*/
static void PrintDebugInfo(void);
static OSHeapHandle InitializeAllocateSystem(u8 memType);
static OSHeapHandle InitializeAllocateSystemCore(u8 memType);
#ifdef SDK_TWLHYB
static OSHeapHandle InitializeAllocateSystemCoreEx(u8 memType);
#endif
static void DummyThread(void* arg);
static OSHeapHandle InitializeAllocateSystem(void);
static void InitializeFatfs(void);
static void InitializeNwm(OSHeapHandle hh);
static void InitializeCardPower(void);
static void InitializeCdc(void);
static void ReadUserInfo(void);
#ifdef NVRAM_CONFIG_DATA_EX_VERSION
static BOOL IsValidConfigEx(void);
static u16 GetRomValidLanguage(void);
static s32 CheckCorrectNCDEx(NVRAMConfigEx * ncdsp);
static s32 CheckCorrectNCDEx(NVRAMConfigEx* ncdsp);
#else
static s32 CheckCorrectNCD(NVRAMConfig *ncdsp);
static s32 CheckCorrectNCD(NVRAMConfig* ncdsp);
#endif
static void VBlankIntr(void);
static void InitializeFatfs(void);
#ifndef SDK_ARM7COMP_WO_WIRELESS
static void InitializeNwm(OSHeapHandle drvHeapHandle, OSHeapHandle wpaHeapHandle);
#endif // SDK_ARM7COMP_WO_WIRELESS
/*---------------------------------------------------------------------------*
*---------------------------------------------------------------------------*/
#ifdef SDK_TWLHYB
extern void SDK_LTDAUTOLOAD_LTDWRAM_BSS_END(void);
extern void SDK_LTDAUTOLOAD_LTDMAIN_BSS_END(void);
#endif
/*---------------------------------------------------------------------------*
Name: TwlSpMain
@ -134,143 +98,64 @@ extern void SDK_LTDAUTOLOAD_LTDMAIN_BSS_END(void);
void
TwlSpMain(void)
{
OSHeapHandle wramHeapHandle;
#ifdef SDK_TWLLTD
#ifndef SDK_ARM7_ONLY_WRAM
OSHeapHandle mainHeapHandle;
#endif
#else
OSHeapHandle mainHeapHandle;
#endif
OSHeapHandle heapHandle;
#ifndef SDK_ARM7COMP_WO_WIRELESS
#ifdef SDK_WIRELESS_IN_VRAM
WVR_ShelterExtWram();
#endif
#endif
// OS 初期化
/* OS 初期化 */
OS_Init();
PrintDebugInfo();
// NVRAM からユーザー情報読み出し
/* NVRAM からユーザー情報読み出し */
ReadUserInfo();
// ヒープ領域設定
wramHeapHandle = InitializeAllocateSystem(MEM_TYPE_WRAM);
#ifdef SDK_TWLLTD
#ifndef SDK_ARM7_ONLY_WRAM
mainHeapHandle = InitializeAllocateSystem(MEM_TYPE_MAIN);
#endif
#else
mainHeapHandle = InitializeAllocateSystem(MEM_TYPE_MAIN);
#endif
/* ヒープ領域設定 */
heapHandle = InitializeAllocateSystem();
// ボタン入力サーチ初期化
/* ボタン入力サーチ初期化 */
(void)PAD_InitXYButton();
// 割り込み許可
/* 割込み許可 */
(void)OS_SetIrqFunction(OS_IE_V_BLANK, VBlankIntr);
(void)OS_EnableIrqMask(OS_IE_V_BLANK);
(void)GX_VBlankIntr(TRUE);
(void)OS_EnableIrq();
(void)OS_EnableInterrupts();
KamiPxiInit();
// ファイルシステム初期化
FS_Init(FS_DMA_NOT_USE);
FS_CreateReadServerThread(THREAD_PRIO_FS);
if (OS_IsRunOnTwl() == TRUE)
{
InitializeFatfs(); // FATFS 初期化
#ifndef SDK_ARM7COMP_WO_WIRELESS
#ifndef SDK_SEA // !暫定処置!
// NWM 初期化
#ifdef SDK_TWLLTD
#ifdef SDK_ARM7_ONLY_WRAM
InitializeNwm(wramHeapHandle, wramHeapHandle); // tarsier コンポーネントでは、ヒープは全て WRAM
#else
InitializeNwm(mainHeapHandle, mainHeapHandle); // LIMITED モードでは 無線のヒープを MAIN から確保
#ifndef NAND_INITIALIZER_LIMITED_MODE
KamiPxiInit();
#endif
#else
InitializeNwm(wramHeapHandle, mainHeapHandle); // HYBRID モードでは 無線のヒープを WRAM から確保
#endif
#endif // ifndef SDK_SEA
#endif // SDK_ARM7COMP_WO_WIRELESS
AES_Init(AES_DMA_5, AES_DMA_6, THREAD_PRIO_AES); // AES 初期化
#ifdef SDK_SEA
SEA_Init(THREAD_PRIO_SEA);
#endif // ifdef SDK_SEA
MCU_InitIrq(THREAD_PRIO_MCU); // MCU 初期化
CDC_InitLib(); // CODECライブラリ初期化
}
/* 各ライブラリ初期化 */
AES_Init(THREAD_PRIO_AES); // AES
SEA_Init(THREAD_PRIO_SEA); // SEA
FS_Init(FS_DMA_NOT_USE); // FS for CARD
FS_CreateReadServerThread(THREAD_PRIO_FS); // FS for CARD
InitializeFatfs(); // FAT-FS
InitializeNwm(heapHandle); // TWL 無線
MCU_InitIrq(THREAD_PRIO_MCU); // マイコン
#ifndef SDK_ARM7COMP_WO_CAMERA
if (OSi_IsCodecTwlMode() == TRUE)
{
// カメラ初期化
CAMERA_Init();
/* CODEC が TWL モードでないとシャッター音を強制的に鳴らす
使CODEC TWL
使 */
}
#endif
// サウンド初期化
SND_Init(THREAD_PRIO_SND);
if (OS_IsRunOnTwl() == TRUE)
{
SNDEX_Init(THREAD_PRIO_SNDEX);
InitializeCdc(); // CODEC
CAMERA_Init(); // カメラ
}
// RTC 初期化
RTC_Init(THREAD_PRIO_RTC);
// 旧無線初期化
#ifndef SDK_ARM7COMP_WO_WIRELESS
#ifndef SDK_WIRELESS_IN_VRAM
#ifndef SDK_SEA // !暫定処置!
WVR_Begin(wramHeapHandle);
#endif // ifdef SDK_SEA
#else /* SDK_WIRELESS_IN_VRAM */
WVR_Init(wramHeapHandle);
#endif
#endif // SDK_ARM7COMP_WO_WIRELESS
// SPI 初期化
SND_Init(THREAD_PRIO_SND); // サウンド
SNDEX_Init(THREAD_PRIO_SNDEX); // サウンド拡張
RTC_Init(THREAD_PRIO_RTC); // RTC
WVR_Begin(heapHandle); // NITRO 無線
SPI_Init(THREAD_PRIO_SPI);
InitializeCardPower(); // カード電源ON検査プログラム用
while (TRUE)
{
OS_Halt();
//---- check reset
if (OS_IsResetOccurred())
{
//VIB_STOP
CTRDG_VibPulseEdgeUpdate(NULL);
OS_ResetSystem();
}
//---- check pull out cartridge
CTRDG_CheckPullOut_Polling();
#ifndef SDK_SMALL_BUILD
//---- check pull out card
CARD_CheckPullOut_Polling();
#endif
/* ソフトウェアリセット要求は監視しない */
/* AGB カートリッジの挿抜チェックは行わない */
/* DS カードの挿抜チェックは行わない */
}
}
#include <nitro/main_begin.h>
/*---------------------------------------------------------------------------*
Name: PrintDebugInfo
Description: ARM7
@ -280,47 +165,66 @@ TwlSpMain(void)
static void
PrintDebugInfo(void)
{
if(OS_IsRunOnTwl())
{
OS_TPrintf("%s TWL\n",strARM7);
}
else
{
OS_TPrintf("%s NITRO\n",strARM7);
}
#ifdef SDK_SEA
#ifdef SDK_TWLLTD
OS_TPrintf("%s armadillo.TWL\n",strARM7);
#else /* ifdef SDK_TWLLTD */
#error invalid parameter combination
#endif /* ifdef SDK_TWLLTD else */
#else /* ifdef SDK_SEA */
#ifdef SDK_TWLLTD
#ifdef SDK_ARM7_ONLY_WRAM
OS_TPrintf("%s tarsier.TWL\n",strARM7);
#else
#if defined(SDK_ARM7COMP_WO_WIRELESS) && defined(SDK_ARM7COMP_WO_CAMERA)
OS_TPrintf("%s ferret.TWL\n", strARM7);
#else
OS_TPrintf("%s racoon.TWL\n",strARM7);
#endif
#endif
#else /* ifdef SDK_TWLLTD */
#ifdef SDK_WIRELESS_IN_VRAM
OS_TPrintf("%s ichneumon.TWL\n",strARM7);
#else /* ifdef SDK_WIRELESS_IN_VRAM */
OS_TPrintf("%s mongoose.TWL\n",strARM7);
#endif /* ifdef SDK_WIRELESS_IN_VRAM else */
#endif /* ifdef SDK_TWLLTD else */
#endif /* ifdef SDK_SEA else */
OS_TPrintf("ARM7: This component is running on TWL.\n");
OS_TPrintf("ARM7: This component is \"armadillo.TWL\".\n");
}
/*---------------------------------------------------------------------------*
Name: InitializeAllocateSystem
Description:
Arguments: None.
Returns: OSHeapHandle - WRAM
*---------------------------------------------------------------------------*/
static OSHeapHandle
InitializeAllocateSystem(void)
{
OSHeapHandle hh;
void* subLo = (void*)OS_GetWramSubArenaLo();
void* subHi = (void*)OS_GetWramSubArenaHi();
void* privLo = (void*)OS_GetWramSubPrivArenaLo();
void* privHi = (void*)OS_GetWramSubPrivArenaHi();
if (((u32)privLo == HW_PRV_WRAM) && ((u32)subHi == HW_PRV_WRAM) && ((u32)subLo < HW_PRV_WRAM))
{
/* SUB アリーナを SUBPRIV アリーナに吸収 */
OS_SetWramSubArenaHi(subLo);
OS_SetWramSubPrivArenaLo(subLo);
privLo = subLo;
}
/* アリーナを 0 クリア */
MI_CpuClear8(privLo, (u32)privHi - (u32)privLo);
/* ヒープ作成初期化 */
privLo = OS_InitAlloc(OS_ARENA_WRAM_SUBPRIV, privLo, privHi, 1);
hh = OS_CreateHeap(OS_ARENA_WRAM_SUBPRIV, privLo, privHi);
if (hh < 0)
{
OS_Panic("ARM7: Failed to create heap.\n");
}
/* カレントヒープに設定 */
(void)OS_SetCurrentHeap(OS_ARENA_WRAM_SUBPRIV, hh);
/* ヒープサイズの確認 */
{
u32 heapSize;
heapSize = (u32)OS_CheckHeap(OS_ARENA_WRAM_SUBPRIV, hh);
if (heapSize <= 0)
{
OS_Panic("ARM7: Failed to create heap.\n");
}
OS_TPrintf("ARM7: heap size [%d]\n", heapSize);
}
return hh;
}
#include <nitro/main_end.h>
#include <twl/ltdwram_begin.h>
/*---------------------------------------------------------------------------*
Name: InitializeFatfs
Description: FATFSライブラリを初期化するFATFS初期化関数内でスレッド休止
Description: FATFSライブラリを初期化する
Arguments: None.
Returns: None.
*---------------------------------------------------------------------------*/
@ -333,410 +237,81 @@ InitializeFatfs(void)
// do nothing
}
}
#include <twl/ltdwram_end.h>
#ifndef SDK_ARM7COMP_WO_WIRELESS
#include <twl/ltdwram_begin.h>
/*---------------------------------------------------------------------------*
Name: InitializeNwm
Description: NWMライブラリを初期化する
Arguments: None.
Arguments: hh -
Returns: None.
*---------------------------------------------------------------------------*/
static void
InitializeNwm(OSHeapHandle drvHeapHandle, OSHeapHandle wpaHeapHandle)
InitializeNwm(OSHeapHandle hh)
{
NwmspInit nwmInit;
NwmspInit nwmInit;
nwmInit.dmaNo = NWM_DMANO;
nwmInit.cmdPrio = THREAD_PRIO_NWM_COMMAND;
nwmInit.evtPrio = THREAD_PRIO_NWM_EVENT;
nwmInit.sdioPrio = THREAD_PRIO_NWM_SDIO;
/* [TODO] 確保しているヒープ領域が新無線一式が必要としているメモリ量以上かのチェックが必要 */
#ifdef SDK_TWLLTD
#ifdef SDK_ARM7_ONLY_WRAM
nwmInit.drvHeap.id = OS_ARENA_WRAM_SUBPRIV; /* [TODO] */
#else
nwmInit.drvHeap.id = OS_ARENA_MAIN_SUBPRIV; /* [TODO] */
#endif
#else
nwmInit.drvHeap.id = OS_ARENA_WRAM_SUBPRIV; /* [TODO] */
#endif
nwmInit.drvHeap.handle = drvHeapHandle;
nwmInit.cmdPrio = THREAD_PRIO_NWM_COMMAND;
nwmInit.evtPrio = THREAD_PRIO_NWM_EVENT;
nwmInit.sdioPrio = THREAD_PRIO_NWM_SDIO;
nwmInit.wpaPrio = THREAD_PRIO_NWM_WPA;
#ifdef SDK_TWLLTD
#ifdef SDK_ARM7_ONLY_WRAM
nwmInit.wpaHeap.id = OS_ARENA_WRAM_SUBPRIV; /* [TODO] */
#else
nwmInit.wpaHeap.id = OS_ARENA_MAIN_SUBPRIV; /* [TODO] */
#endif
#else
nwmInit.wpaHeap.id = OS_ARENA_MAIN_SUBPRIV; /* [TODO] */
#endif
nwmInit.wpaHeap.handle = wpaHeapHandle;
nwmInit.dmaNo = DMA_NO_NWM;
nwmInit.drvHeap.id = OS_ARENA_WRAM_SUBPRIV;
nwmInit.drvHeap.handle = hh;
nwmInit.wpaPrio = THREAD_PRIO_NWM_WPA;
nwmInit.wpaHeap.id = OS_ARENA_WRAM_SUBPRIV;
nwmInit.wpaHeap.handle = hh;
NWMSP_Init(&nwmInit);
}
#include <twl/ltdwram_end.h>
#endif // SDK_ARM7COMP_WO_WIRELESS
#include <twl/ltdwram_begin.h>
/*---------------------------------------------------------------------------*
Name: DummyThread
Description: FATFSライブラリCDCライブラリを初期化する際に立てるダミーの
Arguments: arg - 使
Name: InitializeCardPower
Description: ONする
Arguments: None.
Returns: None.
*---------------------------------------------------------------------------*/
static void
DummyThread(void* arg)
InitializeCardPower(void)
{
#pragma unused(arg)
while (TRUE)
{
}
}
#include <twl/ltdwram_end.h>
// チャッタリングカウンタの値を設定
reg_MI_MC1 = (u32)((reg_MI_MC1 & ~REG_MI_MC1_CC_MASK) |
(CHATTERING_COUNTER << REG_MI_MC1_CC_SHIFT));
/*---------------------------------------------------------------------------*
Name: InitializeAllocateSystem
Description:
Arguments: None.
Returns: OSHeapHandle - WRAM
*---------------------------------------------------------------------------*/
static OSHeapHandle InitializeAllocateSystem(u8 memType)
{
// チャタリングカウンタ分待つことによりCDETが0になる
OS_SpinWait( OS_MSEC_TO_CPUCYC(200) );
OSHeapHandle hh;
#ifdef SDK_TWLHYB
if( OS_IsRunOnTwl() == TRUE)
{
hh = InitializeAllocateSystemCoreEx(memType); /* Hybrid を TWL で動作させる */
}
else
#endif
{
hh = InitializeAllocateSystemCore(memType); /* Hybrid を DS で動作させる or Limited */
}
return hh;
// カードスロット電源ON
HOTSWi_TurnCardPowerOn(1);
}
/*---------------------------------------------------------------------------*
Name: InitializeAllocateSystemCore
Description:
Hybrid DS Limited TWL
Name: InitializeCdc
Description: CDCライブラリを初期化する
Arguments: None.
Returns: OSHeapHandle - WRAM
Returns: None.
*---------------------------------------------------------------------------*/
static OSHeapHandle InitializeAllocateSystemCore(u8 memType)
static void
InitializeCdc(void)
{
OSHeapHandle hh;
u32 spiLockId;
/* MAIN */
if(memType == MEM_TYPE_MAIN)
{
{
void* lo = (void*)OS_GetSubPrivArenaLo();
void* hi = (void*)OS_GetSubPrivArenaHi();
spiLockId = (u32)OS_GetLockID();
if (spiLockId == OS_LOCK_ID_ERROR)
{
OS_Warning("OS_GetLockID failed.\n");
}
// アリーナを 0 クリア
MI_CpuClear8(lo, (u32)hi - (u32)lo);
// メモリ割り当て初期化
lo = OS_InitAlloc(OS_ARENA_MAIN_SUBPRIV, lo, hi, 1);
// アリーナ下位アドレスを設定
OS_SetArenaLo(OS_ARENA_MAIN_SUBPRIV, lo);
// ヒープ作成
hh = OS_CreateHeap(OS_ARENA_MAIN_SUBPRIV, lo, hi);
if (hh < 0)
{
OS_Panic(strFailedCreateHeap, strARM7, strMemMAIN);
}
}
// カレントヒープに設定
(void)OS_SetCurrentHeap(OS_ARENA_MAIN_SUBPRIV, hh);
// ヒープサイズの確認
{
u32 heapSize;
heapSize = (u32)OS_CheckHeap(OS_ARENA_MAIN_SUBPRIV, hh);
if( heapSize <= 0) /* ヒープ領域の確保に失敗 */
{
OS_Panic(strFailedCreateHeap, strARM7, strMemMAIN);
}
#ifdef SDK_TWLLTD
#ifndef SDK_ARM7COMP_WO_WIRELESS
{
if ((ATH_DRV_HEAP_SIZE + WPA_HEAP_SIZE) > heapSize)
{
OS_Panic(strInsufficientHeapSize, strARM7, heapSize, ATH_DRV_HEAP_SIZE + WPA_HEAP_SIZE);
}
}
OS_TPrintf(strHeapSizeIs, strMemMAIN, heapSize, heapSize - (ATH_DRV_HEAP_SIZE + WPA_HEAP_SIZE) );
#else
OS_TPrintf(strHeapSizeIs, strMemMAIN, heapSize, heapSize);
#endif
#else
OS_TPrintf(strHeapSizeIs, strMemMAIN, heapSize, heapSize);
#endif
}
}
/* WRAM */
if( memType == MEM_TYPE_WRAM)
{
{
void* lo = (void*)OS_GetWramSubPrivArenaLo();
void* hi = (void*)OS_GetWramSubPrivArenaHi();
// アリーナを 0 クリア
MI_CpuClear8(lo, (u32)hi - (u32)lo);
// メモリ割り当て初期化
lo = OS_InitAlloc(OS_ARENA_WRAM_SUBPRIV, lo, hi, 1);
// アリーナ下位アドレスを設定
OS_SetArenaLo(OS_ARENA_WRAM_SUBPRIV, lo);
// ヒープ作成
hh = OS_CreateHeap(OS_ARENA_WRAM_SUBPRIV, lo, hi);
if (hh < 0)
{
OS_Panic(strFailedCreateHeap, strARM7, strMemWRAM);
}
}
// カレントヒープに設定
(void)OS_SetCurrentHeap(OS_ARENA_WRAM_SUBPRIV, hh);
// ヒープサイズの確認
{
u32 heapSize;
heapSize = (u32)OS_CheckHeap(OS_ARENA_WRAM_SUBPRIV, hh);
if( heapSize <= 0) /* ヒープ領域の確保に失敗 */
{
OS_Panic(strFailedCreateHeap, strARM7, strMemWRAM);
}
#ifndef SDK_ARM7COMP_WO_WIRELESS
if (WM_WL_HEAP_SIZE > heapSize)
{
OS_Panic(strInsufficientHeapSize, strARM7, heapSize, WM_WL_HEAP_SIZE);
}
OS_TPrintf(strHeapSizeIs, strMemWRAM, heapSize, (heapSize-WM_WL_HEAP_SIZE));
#else
OS_TPrintf(strHeapSizeIs, strMemWRAM, heapSize, heapSize);
#endif
}
}
return hh;
/* CODEC 初期化 */
SPI_Lock(spiLockId);
CDC_Init();
SPI_Unlock(spiLockId);
}
#ifdef SDK_TWLHYB
#include <twl/ltdwram_begin.h>
/*---------------------------------------------------------------------------*
Name: InitializeAllocateSystemCoreEx
Description:
Hybrid TWL
Arguments: None.
Returns: OSHeapHandle - WRAM
*---------------------------------------------------------------------------*/
static OSHeapHandle InitializeAllocateSystemCoreEx(u8 memType)
{
OSHeapHandle hh;
if(memType == MEM_TYPE_MAIN)
{
{
void* basicLo = (void*)OS_GetSubPrivArenaLo();
void* basicHi = (void*)OS_GetSubPrivArenaHi();
void* extraLo = (void*)MATH_ROUNDUP((u32)SDK_LTDAUTOLOAD_LTDMAIN_BSS_END, 32);
void* extraHi = (void*)MATH_ROUNDDOWN(HW_MAIN_MEM_SUB, 32);
// メモリ節約のためにコメントアウト
/*
#if SDK_DEBUG
// debug information
OS_TPrintf("ARM7: MAIN arena basicLo = %p\n", basicLo);
OS_TPrintf("ARM7: MAIN arena basicHi = %p\n", basicHi);
OS_TPrintf("ARM7: MAIN arena extraLo = %p\n", extraLo);
OS_TPrintf("ARM7: MAIN arena extraHi = %p\n", extraHi);
#endif
*/
// アリーナを 0 クリア
MI_CpuClear8(basicLo, (u32)basicHi - (u32)basicLo);
MI_CpuClear8(extraLo, (u32)extraHi - (u32)extraLo);
// メモリ割り当て初期化
if ((u32)basicLo < (u32)extraLo)
{
basicLo = OS_InitAlloc(OS_ARENA_MAIN_SUBPRIV, basicLo, extraHi, 1);
// アリーナ下位アドレスを設定
OS_SetArenaLo(OS_ARENA_MAIN_SUBPRIV, basicLo);
}
else
{
extraLo = OS_InitAlloc(OS_ARENA_MAIN_SUBPRIV, extraLo, basicHi, 1);
}
// ヒープ作成
hh = OS_CreateHeap(OS_ARENA_MAIN_SUBPRIV, basicLo, basicHi);
if (hh < 0)
{
OS_Panic(strFailedCreateHeap, strARM7, strMemMAIN);
}
// ヒープサイズの確認
{
u32 heapSize;
heapSize = (u32)OS_CheckHeap(OS_ARENA_MAIN_SUBPRIV, hh);
if( heapSize <= 0) /* ヒープ領域の確保に失敗 */
{
OS_Panic(strFailedCreateHeap, strARM7, strMemMAIN);
}
OS_TPrintf(strHeapSizeIs, strMainBeforeAdd, heapSize, heapSize);
}
// ヒープに拡張ブロックを追加
OS_AddToHeap(OS_ARENA_MAIN_SUBPRIV, hh, extraLo, extraHi);
}
// カレントヒープに設定
(void)OS_SetCurrentHeap(OS_ARENA_MAIN_SUBPRIV, hh);
// ヒープサイズの確認
{
u32 heapSize;
heapSize = (u32)OS_CheckHeap(OS_ARENA_MAIN_SUBPRIV, hh);
if( heapSize <= 0) /* ヒープ領域の確保に失敗 */
{
OS_Panic(strFailedCreateHeap, strARM7, strMemMAIN);
}
#ifndef SDK_ARM7COMP_WO_WIRELESS
if ((WPA_HEAP_SIZE) > heapSize)
{
OS_Panic(strInsufficientHeapSize, strARM7, heapSize, WPA_HEAP_SIZE);
}
OS_TPrintf(strHeapSizeIs, strMemMAIN, heapSize, (heapSize-WPA_HEAP_SIZE));
#else
OS_TPrintf(strHeapSizeIs, strMemMAIN, heapSize, heapSize);
#endif
}
}
if(memType == MEM_TYPE_WRAM)
{
{
void* basicLo = (void*)OS_GetWramSubPrivArenaLo();
void* basicHi = (void*)OS_GetWramSubPrivArenaHi();
void* extraLo = (void*)MATH_ROUNDUP((u32)SDK_LTDAUTOLOAD_LTDWRAM_BSS_END, 32);
void* extraHi = (void*)MATH_ROUNDDOWN(HW_WRAM_A_HYB_END, 32);
// メモリ節約のためにコメントアウト
/*
#if SDK_DEBUG
// debug information
OS_TPrintf("ARM7: WRAM arena basicLo = %p\n", basicLo);
OS_TPrintf("ARM7: WRAM arena basicHi = %p\n", basicHi);
OS_TPrintf("ARM7: WRAM arena extraLo = %p\n", extraLo);
OS_TPrintf("ARM7: WRAM arena extraHi = %p\n", extraHi);
#endif
*/
// アリーナを 0 クリア
MI_CpuClear8(basicLo, (u32)basicHi - (u32)basicLo);
MI_CpuClear8(extraLo, (u32)extraHi - (u32)extraLo);
// メモリ割り当て初期化
if ((u32)basicLo < (u32)extraLo)
{
basicLo = OS_InitAlloc(OS_ARENA_WRAM_SUBPRIV, basicLo, extraHi, 1);
// アリーナ下位アドレスを設定
OS_SetArenaLo(OS_ARENA_WRAM_SUBPRIV, basicLo);
}
else
{
extraLo = OS_InitAlloc(OS_ARENA_WRAM_SUBPRIV, extraLo, basicHi, 1);
}
// ヒープ作成
hh = OS_CreateHeap(OS_ARENA_WRAM_SUBPRIV, basicLo, basicHi);
if (hh < 0)
{
OS_Panic(strFailedCreateHeap, strARM7, strMemWRAM);
}
// ヒープサイズの確認
{
u32 heapSize;
heapSize = (u32)OS_CheckHeap(OS_ARENA_WRAM_SUBPRIV, hh);
if( heapSize <= 0) /* ヒープ領域の確保に失敗 */
{
OS_Panic(strFailedCreateHeap, strARM7, strMemWRAM);
}
if (WM_WL_HEAP_SIZE > heapSize)
{
OS_Panic(strInsufficientHeapSize, strARM7, heapSize, WM_WL_HEAP_SIZE);
}
OS_TPrintf(strHeapSizeIs, strWramBeforeAdd, heapSize, (heapSize - WM_WL_HEAP_SIZE) );
}
// ヒープに拡張ブロックを追加
OS_AddToHeap(OS_ARENA_WRAM_SUBPRIV, hh, extraLo, extraHi);
}
// カレントヒープに設定
(void)OS_SetCurrentHeap(OS_ARENA_WRAM_SUBPRIV, hh);
// ヒープサイズの確認
{
u32 heapSize;
heapSize = (u32)OS_CheckHeap(OS_ARENA_WRAM_SUBPRIV, hh);
if( heapSize <= 0) /* ヒープ領域の確保に失敗 */
{
OS_Panic(strFailedCreateHeap, strARM7, strMemWRAM);
}
#ifndef SDK_ARM7COMP_WO_WIRELESS
if (ATH_DRV_HEAP_SIZE + WM_WL_HEAP_SIZE > heapSize)
{
OS_Panic(strInsufficientHeapSize, strARM7, heapSize, WM_WL_HEAP_SIZE + ATH_DRV_HEAP_SIZE );
}
OS_TPrintf(strHeapSizeIs, strMemWRAM, heapSize, heapSize - (WM_WL_HEAP_SIZE + ATH_DRV_HEAP_SIZE) );
#else
OS_TPrintf(strHeapSizeIs, strMemWRAM, heapSize, (heapSize - WM_WL_HEAP_SIZE) );
#endif
}
}
return hh;
}
#include <twl/ltdwram_end.h>
#endif
#ifdef WM_PRECALC_ALLOWEDCHANNEL
extern u16 WMSP_GetAllowedChannel(u16 bitField);
#endif
//#ifdef WM_PRECALC_ALLOWEDCHANNEL
//extern u16 WMSP_GetAllowedChannel(u16 bitField);
//#endif
/*---------------------------------------------------------------------------*
Name: ReadUserInfo
@ -830,7 +405,7 @@ static void ReadUserInfo(void)
// 共有領域に展開
MI_CpuCopy8(wMac, p, 6);
}
/*
#ifdef WM_PRECALC_ALLOWEDCHANNEL
// 使用可能チャンネルから使用許可チャンネルを計算
{
@ -847,6 +422,7 @@ static void ReadUserInfo(void)
*((u16 *)p) = allowedChannel;
}
#endif
*/
}
#ifdef NVRAM_CONFIG_DATA_EX_VERSION
@ -1066,7 +642,7 @@ static s32 CheckCorrectNCD(NVRAMConfig *ncdsp)
Returns: None.
*---------------------------------------------------------------------------*/
extern BOOL PMi_Initialized;
void PM_SelfBlinkProc(void);
extern void PM_SelfBlinkProc(void);
static void
VBlankIntr(void)

View File

@ -0,0 +1,57 @@
#----------------------------------------------------------------------------
# Project: TwlSDK - include
# File: ARM9-TS.lsf
#
# Copyright 2007 Nintendo. All rights reserved.
#
# These coded insructions, 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:: 2007-12-05#$
# $Rev: 2840 $
# $Author: yosizaki $
#----------------------------------------------------------------------------
#
# TWL LCF SPEC FILE
#
Static $(TARGET_NAME)
{
Address $(ADDRESS_STATIC)
Object $(OBJS_STATIC)
Library $(LLIBS) $(GLIBS) $(CW_LIBS)
StackSize 4096 4096
}
Autoload ITCM
{
Address $(ADDRESS_ITCM)
Object * (.itcm)
Object $(OBJS_AUTOLOAD) (.text)
Object $(OBJS_AUTOLOAD) (.rodata)
Object $(OBJS_AUTOLOAD) (.init)
Object $(OBJS_AUTOLOAD) (.ctor)
Object $(OBJS_AUTOLOAD) (.sinit)
}
Autoload DTCM
{
Address $(ADDRESS_DTCM)
Object * (.dtcm)
Object $(OBJS_AUTOLOAD) (.data)
Object $(OBJS_AUTOLOAD) (.sdata)
Object $(OBJS_AUTOLOAD) (.bss)
Object $(OBJS_AUTOLOAD) (.sbss)
}
Ltdautoload LTDMAIN
{
# NITRO/TWL 共有のオーバーレイが在る場合は、さらにその後ろに配置する必要があります。
After $(TARGET_NAME)
Object * (.ltdmain)
Object $(OBJS_LTDAUTOLOAD)
Library $(LLIBS_EX) $(GLIBS_EX)
}

View File

@ -1,9 +1,9 @@
#! make -f
#----------------------------------------------------------------------------
# Project: TwlSDK - tests - TitleHashChecker
# Project: TwlIPL - systemMenu_RED - NandInitializerRed
# File: Makefile
#
# Copyright 2008 Nintendo. All rights reserved.
# Copyright 2007 Nintendo. All rights reserved.
#
# These coded instructions, statements, and computer programs contain
# proprietary information of Nintendo of America Inc. and/or Nintendo
@ -11,46 +11,75 @@
# 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:
# $Date:: 2009-03-11#$
# $Rev: 2763 $
# $Author: akabane_jumpei $
#----------------------------------------------------------------------------
override TARGET_PLATFORM = TWL
TARGET_BIN = TitleHashChecker.srl
INCDIR = ./include $(ROOT)/build/libraries/os/common/include
SRCDIR = ./src
SRCS = main.c screen.c font.c common.c
LLIBRARIES = liblcfg$(TWL_LIBSUFFIX).a \
libes$(TWL_LIBSUFFIX).a \
libboc$(TWL_LIBSUFFIX).a \
libsfs$(TWL_LIBSUFFIX).a \
libnam$(TWL_LIBSUFFIX).a \
libsea$(TWL_LIBSUFFIX).a \
libna$(TWL_LIBSUFFIX).a
# libnamut$(TWL_LIBSUFFIX).a\
ROM_SPEC = ./ROM-TS_sys.rsf
COMPONENT_NAME = armadillo_SYSMENU
MAKEROM_ARM7_BASE = $(TWL_COMPONENTSDIR)/$(COMPONENT_NAME)/$(TWL_BUILDTYPE_ARM7)/$(COMPONENT_NAME)
MAKEROM_ARM7 = $(MAKEROM_ARM7_BASE).$(TWL_ELF_EXT)
#----------------------------------------------------------------------------
include $(TWLSDK_ROOT)/build/buildtools/commondefs
SYSM_DISABLE_DEBUG = FALSE
MAKEROM := $(TWL_TOOLSDIR)/bin/makerom.TWL.secure.exe
TARGET_FIRM = SYSTEMMENU
TARGET_PLATFORM = TWL
TWL_ARCHGEN = LIMITED
do-build: $(TARGETS)
#TARGET_CODEGEN = THUMB
TITLEID_LO = 0NRA
#TARGET_TAD =
TARGET_BIN = NandFirmWriter.srl
LCFILE_SPEC = ARM9-TS.lsf
ROM_SPEC = main.rsf
MAKEROM_ARM7_BASE = ../ARM7.TWL/bin/$(TWL_BUILDTYPE_ARM7)/armadillo
MAKEROM_ARM7 = $(MAKEROM_ARM7_BASE).$(TWL_ELF_EXT)
SRCS = main.c \
common.c \
font.c \
screen.c \
kami_pxi.c
LINCLUDES = ../common/include \
$(ROOT)/build/libraries/lcfg/ARM9.TWL/include \
../../common/ARM9/include
SRCDIR = src \
../../common/ARM9/src
#LCFILE = # using default
#----------------------------------------------------------------------------
include $(TWLSDK_ROOT)/build/buildtools/commondefs
MAKEROM_FLAGS += -DTITLEID_LO='$(TITLEID_LO)' \
-DDISABLE_DEBUG='$(SYSM_DISABLE_DEBUG)'
MAKETAD_FLAGS += -s
SDK_APPEND_LIBS = \
libes$(TWL_LIBSUFFIX).a \
libboc$(TWL_LIBSUFFIX).a \
libsfs$(TWL_LIBSUFFIX).a \
libnam$(TWL_LIBSUFFIX).a \
libsea$(TWL_LIBSUFFIX).a \
liblcfg$(TWL_LIBSUFFIX).a \
libna$(TWL_LIBSUFFIX).a
LLIBRARIES += $(SYSMENU_LIBS) $(SDK_APPEND_LIBS)
MAKEROM = $(TWL_TOOLSDIR)/bin/makerom.TWL.secure.exe
#LDIRT_CLEAN =
#INSTALL_TARGETS =
INSTALL_DIR = $(SDK_NMENU_DATADIR)
#----------------------------------------------------------------------------
do-build: $(TARGETS)
include $(TWLSDK_ROOT)/build/buildtools/modulerules
#----------------------------------------------------------------------------
#===== End of Makefile =====

View File

@ -0,0 +1,112 @@
/*---------------------------------------------------------------------------*
Project: TwlSDK - NandInitializer
File: kami_pxi.h
Copyright 2008 Nintendo. All rights reserved.
These coded instructions, statements, and computer programs contain
proprietary information of Nintendo of America Inc. and/or Nintendo
Company Ltd., and are protected by Federal copyright law. They may
not be disclosed to third parties or copied or duplicated in any form,
in whole or in part, without the prior written consent of Nintendo.
$Date:: 2008-07-25#$
$Rev: 2003 $
$Author: kamikawa $
*---------------------------------------------------------------------------*/
#ifndef TWL_KAMI_TEST_KAMITEST_H_
#define TWL_KAMI_TEST_KAMITEST_H_
#include "fifo.h"
/*---------------------------------------------------------------------------*
*---------------------------------------------------------------------------*/
#ifdef __cplusplus
extern "C" {
#endif
/*===========================================================================*/
// 処理結果定義
typedef enum KAMIResult
{
KAMI_RESULT_SUCCESS = 0,
KAMI_RESULT_SUCCESS_TRUE = 0,
KAMI_RESULT_SUCCESS_FALSE,
KAMI_RESULT_INVALID_COMMAND,
KAMI_RESULT_INVALID_PARAMETER,
KAMI_RESULT_ILLEGAL_STATUS,
KAMI_RESULT_BUSY,
KAMI_RESULT_FATAL_ERROR,
KAMI_RESULT_SEND_ERROR,
KAMI_RESULT_MAX
}
KAMIResult;
typedef enum {
FORMAT_MODE_QUICK, // Quickフォーマット
FORMAT_MODE_FULL // Fullフォーマット(各パーティション内を0xFFで埋める
} FormatMode;
// コールバック
typedef void (*KAMICallback)(KAMIResult result, void *arg);
void KamiPxiInit( void );
KAMIResult ExeFormatAsync(FormatMode format_mode, KAMICallback callback);
KAMIResult ExeFormat(FormatMode format_mode);
KAMIResult kamiNandIo(u32 block, void* buffer, u32 count, BOOL is_read);
KAMIResult kamiMcuWriteFirm(void* buffer );
KAMIResult kamiMcuIo(u32 reg_no, void* buffer, u32 value, BOOL is_read);
KAMIResult kamiARM7Io(u32 addr, u32* buffer, u32 value, BOOL is_read);
KAMIResult kamiCDC_GoDsMode( void );
KAMIResult kamiClearNandErrorLog( void );
KAMIResult kamiGetCameraModuleTypesAsync( CameraModuleTypes *pTypes, KAMICallback callback, void* arg );
KAMIResult kamiGetCameraModuleTypes( CameraModuleTypes *pTypes );
KAMIResult kamiGetNandCID( void* buffer );
// (重要)
// ARM7が読み書きするためリード前はInvalidate、ライト前はフラッシュしてください。
//
static KAMIResult kamiNandRead(u32 block, void* buffer, u32 count)
{
return kamiNandIo(block, buffer, count, TRUE);
}
static KAMIResult kamiNandWrite(u32 block, void* buffer, u32 count)
{
return kamiNandIo(block, buffer, count, FALSE);
}
static KAMIResult kamiMcuRead(u8 reg_no, void* buffer)
{
return kamiMcuIo((u32)reg_no, buffer, 0, TRUE);
}
static KAMIResult kamiMcuWrite(u8 reg_no, u8 value)
{
return kamiMcuIo((u32)reg_no, NULL, (u32)value, FALSE);
}
static KAMIResult kamiARM7Read(u32 addr, void* buffer)
{
return kamiARM7Io(addr, buffer, 0, TRUE);
}
static KAMIResult kamiARM7Write(u32 addr, u8 value)
{
return kamiARM7Io(addr, NULL, value, FALSE);
}
/*===========================================================================*/
#ifdef __cplusplus
} /* extern "C" */
#endif
#endif /* TWL_KAMI_TEST_KAMITEST_H_ */
/*---------------------------------------------------------------------------*
End of file
*---------------------------------------------------------------------------*/

View File

@ -25,6 +25,24 @@ extern "C" {
/*===========================================================================*/
#include <nitro/types.h>
// フォントの色
#define COLOR_BLACK 0x10
#define COLOR_RED 0x11
#define COLOR_GREEN 0x12
#define COLOR_BLUE 0x13
#define COLOR_YELLOW 0x14
#define COLOR_PURPLE 0x15
#define COLOR_L_BLUE 0x16
#define COLOR_D_RED 0x17
#define COLOR_D_GREEN 0x18
#define COLOR_D_BLUE 0x19
#define COLOR_D_YELLOW 0x1a
#define COLOR_D_PURPLE 0x1b
#define COLOR_D_L_BLUE 0x1c
#define COLOR_GRAY 0x1d
#define COLOR_D_GRAY 0x1e
#define COLOR_WHITE 0x1f
/*---------------------------------------------------------------------------*
ŠÖ<EFBFBD> è`
*---------------------------------------------------------------------------*/

View File

@ -1,6 +1,6 @@
#----------------------------------------------------------------------------
# Project: TwlSDK - include
# File: ROM-TS.rsf
# File: ROM-BB.rsf
#
# Copyright 2007 Nintendo. All rights reserved.
#
@ -10,8 +10,8 @@
# 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:: 2008-07-23#$
# $Rev: 7566 $
# $Date:: 2008-01-07#$
# $Rev: 436 $
# $Author: yosiokat $
#----------------------------------------------------------------------------
#
@ -57,7 +57,7 @@ Property
#
# TITLE NAME: Your product name within 12bytes
#
#TitleName "MY APP NAME"
#TitleName "YourAppName"
#
# MAKER CODE: Your company ID# in 2 ascii words
@ -68,7 +68,7 @@ Property
#
# REMASTER VERSION: Mastering version
#
#RomVersion 0
RomVersion 2
#
# ROM SPEED TYPE: [MROM/1TROM/UNDEFINED]
@ -76,9 +76,9 @@ Property
RomSpeedType $(MAKEROM_ROMSPEED)
#
# ROM SIZE: in bit [64M/128M/256M/512M/1G/2G/4G]
# ROM SIZE: in bit [64M/128M/256M/512M/1G/2G]
#
#RomSize 256M
#RomSize 2G
#
# ROM PADDING: TRUE if finalrom
@ -88,22 +88,12 @@ Property
#
# ROM HEADER TEMPLATE: Provided to every product by NINTENDO
#
#RomHeaderTemplate ./resource/rom_header_0tca.template.sbin
#RomHeaderTemplate ./etc/rom_header.template.sbin
#
# BANNER FILE: generated from Banner Spec File
#
BannerFile $(TWLSDK_ROOT)/include/twl/specfiles/default.bnr
#
# Permit LandingNormalJump: for TWL "ApplicationJump" function [TRUE/FALSE]
#
# PermitLandingNormalJump TRUE
#
# Permit LandingTmpJump: for TWL "ApplicationJump" function [TRUE/FALSE]
#
# PermitLandingTmpJump FALSE
BannerFile ../banner/banner.bnr
###
### Setting for TWL
@ -120,8 +110,7 @@ Property
DigestParam 1024 32
#
# WRAM mapping: [MAP_BB_HYB/MAP_BB_LTD/MAP_TS_HYB/MAP_TS_LTD
# MAP2_BB_HYB/MAP2_BB_LTD/MAP2_TS_HYB/MAP2_TS_LTD]
# WRAM mapping: [MAP_BB_HYB/MAP_BB_LTD/MAP_TS_HYB/MAP_TS_LTD]
# don't have to edit
#
WramMapping MAP_TS_SCR
@ -131,10 +120,25 @@ Property
#
CardRegion ALL
#
# CommonClientKey: launcher deliver common client Key [TRUE/FALSE]
#
CommonClientKey TRUE
#
# HwAESSlotB: launcher deliver HW AES slot B setting [TRUE/FALSE]
#
HwAESSlotB TRUE
#
# HwAESSlotC: launcher deliver HW AES slot C setting [TRUE/FALSE]
#
HwAESSlotC TRUE
#
# SDCardAccess: sd card access control [TRUE/FALSE]
#
#SDCardAccess FALSE
SDCardAccess TRUE
#
# NANDAccess: NAND access control [TRUE/FALSE]
@ -148,40 +152,26 @@ Property
CodecMode $(MAKEROM_CODEC_MODE)
#
# Disp WiFiConnection Icon for Launcher [TRUE/FALSE]
# SCFG: scfg lock [TRUE/FALSE]
#
#WiFiConnectionIcon FALSE
LockSCFG FALSE
#
# Disp DSWireless Icon for Launcher [TRUE/FALSE]
# DisableDebug 最終ROMでは、実行時にデバッグできないようにTRUEにする必要があります。
#
#DSWirelessIcon FALSE
DisableDebug $(DISABLE_DEBUG)
#
# Disable debug [TRUE/FALSE]
#
DisableDebug FALSE
#
# Agree EULA [TRUE/FALSE]
#
#AgreeEULA FALSE
#
# Agree EULA version [1 - 255]
#
#AgreeEULAVersion 1
###
#### END
}
AppendProperty
{
#
# Publisher : "Nintendo"
# don't have to edit
#Publisher Nintendo
Publisher Nintendo
#
# Application type : [USER/SYSTEM]
@ -192,52 +182,43 @@ AppendProperty
# launch title on the launcher : [TRUE/FALSE]
# don't have to edit
Launch TRUE
#
# Boot allowed Media: [GameCard]
#
Media GameCard
#
# Data only title : [TRUE/FALSE]
# don't have to edit
#DataOnly FALSE
DataOnly FALSE
#
# Secure title : [TRUE/FALSE]
# don't have to edit
Secure TRUE
#
# Boot allowed Media: [GameCard/NAND]
#
Media GameCard
#
# GameCode for TitleID : Your GameCode in 4 ascii words
#
#GameCode 0TCA
GameCode $(TITLEID_LO)
#
# Public save data size: [0K/16K/32K/64K/128K/256K/512K/1M/2M/4M]
# Public save data size: [16K/32K/64K/128K/256K/512K/1M/2M/4M/8M]
#
#PublicSaveDataSize 0K
#PublicSaveDataSize 32K
#
# Private save data size: [0K/16K/32K/64K/128K/256K/512K/1M/2M/4M]
# Private save data size: [16K/32K/64K/128K/256K/512K/1M/2M/4M/8M]
#
#PrivateSaveDataSize 0K
#PrivateSaveDataSize 16K
#
# Enable SubBannerFile
#SubBannerFile TRUE
#
# Game card power on: [TRUE/FALSE]
#
#GameCardOn FALSE
#
# Game card transferd to nitro mode: [TRUE/FALSE]
#
#GameCardNitroMode TRUE
#SubBannerFile TRUE
}
RomSpec
{
Offset 0x00000000
@ -246,38 +227,3 @@ RomSpec
Root /
File $(MAKEROM_ROMFILES)
}
Rating
{
#
# Permited age to play for each rating organization
#
# Supported organization
# - CERO (OGN0) : for Japan
# - ESRB (OGN1) : for North America
# - BBFC (OGN2) : obsolete organization
# - USK (OGN3) : for German
# - PEGI_GEN (OGN4) : for Europe
# - PEGI_FINLAND (OGN5) : obsolete organization
# - PEGI_PRT (OGN6) : for Portugal
# - PEGI_BBFC (OGN7) : for UK
# - OFLC (OGN8) : for Australia and NewZealand
# - GRB (OGN9) : for Korea
# - OGN10 : reserved
# - OGN11 : reserved
# - OGN12 : reserved
# - OGN13 : reserved
# - OGN14 : reserved
# - OGN15 : reserved
#
# Available age [ 0 - 31 / PENDING / FREE ]
CERO FREE
# ESRB FREE
# USK FREE
# PEGI_GEN FREE
# PEGI_PRT FREE
# PEGI_BBFC FREE
# OFLC FREE
# GRB FREE
}

View File

@ -36,7 +36,6 @@ void InitCommon(void)
{
OS_Init();
OS_InitTick();
OS_InitAlarm();
GX_Init();
GX_DispOff();

View File

@ -0,0 +1,684 @@
/*---------------------------------------------------------------------------*
Project: TwlSDK - NandInitializer
File: kami_pxi.c
Copyright 2008 Nintendo. All rights reserved.
These coded instructions, statements, and computer programs contain
proprietary information of Nintendo of America Inc. and/or Nintendo
Company Ltd., and are protected by Federal copyright law. They may
not be disclosed to third parties or copied or duplicated in any form,
in whole or in part, without the prior written consent of Nintendo.
$Date:: 2008-07-25#$
$Rev: 2003 $
$Author: kamikawa $
*---------------------------------------------------------------------------*/
#include <twl.h>
#include "kami_pxi.h"
#include "fifo.h"
/*---------------------------------------------------------------------------*
*---------------------------------------------------------------------------*/
// 詰めてコピーする
#define KAMI_PACK_U16(d, s) \
((d)[0] = (u8)((*((u16*)s) >> 0) & 0xFF), \
(d)[1] = (u8)((*((u16*)s) >> 8) & 0xFF))
#define KAMI_PACK_U32(d, s) \
((d)[0] = (u8)((*((u32*)s) >> 0) & 0xFF), \
(d)[1] = (u8)((*((u32*)s) >> 8) & 0xFF), \
(d)[2] = (u8)((*((u32*)s) >> 16) & 0xFF), \
(d)[3] = (u8)((*((u32*)s) >> 24) & 0xFF))
/*---------------------------------------------------------------------------*
*---------------------------------------------------------------------------*/
typedef struct KamiWork
{
BOOL lock;
KamiCommand command;
KAMIPxiResult result;
KAMICallback callback;
void* arg;
u32 total;
u32 current;
u8* data;
}
KamiWork;
/*---------------------------------------------------------------------------*
*---------------------------------------------------------------------------*/
static BOOL kamiInitialized;
static KamiWork kamiWork;
/*---------------------------------------------------------------------------*
*---------------------------------------------------------------------------*/
static BOOL KamiSendPxiCommand(KamiCommand command, u8 size, u8 data);
static void KamiSendPxiData(u8 *pData);
static void KamiPxiCallback(PXIFifoTag tag, u32 data, BOOL err);
static void KamiDone(KAMIResult result);
static void KamiWaitBusy(void);
void KamiPxiInit( void )
{
kamiWork.lock = FALSE;
PXI_Init();
while ( !PXI_IsCallbackReady(PXI_FIFO_TAG_KAMITEST, PXI_PROC_ARM7 ))
{
}
PXI_SetFifoRecvCallback(PXI_FIFO_TAG_KAMITEST, KamiPxiCallback);
if ( 0 > PXI_SendWordByFifo(PXI_FIFO_TAG_KAMITEST, KAMITEST_PXI_START_BIT | (KAMI_TEST_COMMAND << KAMITEST_PXI_COMMAND_SHIFT), 0))
{
return;
}
}
///////////////////////////////////////////////////////////////////
//typedef void (*KAMICallback)(KAMIResult result, void *arg);
/*
void CDC_ReadCallback(KAMIResult result, void* arg);
void CDC_ReadCallback(KAMIResult result, void* arg)
{
}
*/
/*---------------------------------------------------------------------------*
Name:
Description:
Arguments: FormatMode
Returns:
*---------------------------------------------------------------------------*/
KAMIResult ExeFormatAsync(FormatMode format_mode, KAMICallback callback)
{
OSIntrMode enabled;
// ロック
enabled = OS_DisableInterrupts();
if (kamiWork.lock)
{
(void)OS_RestoreInterrupts(enabled);
return KAMI_RESULT_BUSY;
}
kamiWork.lock = TRUE;
(void)OS_RestoreInterrupts(enabled);
kamiWork.callback = callback;
kamiWork.arg = 0;
kamiWork.data = 0;
if (KamiSendPxiCommand(KAMI_EXE_FORMAT, 1, format_mode) == FALSE)
{
return KAMI_RESULT_SEND_ERROR;
}
return KAMI_RESULT_SUCCESS;
}
KAMIResult ExeFormat(FormatMode format_mode)
{
OSIntrMode enabled;
// ロック
enabled = OS_DisableInterrupts();
if (kamiWork.lock)
{
(void)OS_RestoreInterrupts(enabled);
return KAMI_RESULT_BUSY;
}
kamiWork.lock = TRUE;
(void)OS_RestoreInterrupts(enabled);
kamiWork.callback = NULL;
kamiWork.arg = 0;
kamiWork.data = 0;
if (KamiSendPxiCommand(KAMI_EXE_FORMAT, 1, format_mode))
{
KamiWaitBusy();
return (KAMIResult)kamiWork.result;
}
return KAMI_RESULT_SEND_ERROR;
}
/*---------------------------------------------------------------------------*
Name: NANDアクセス関数
Description:
Arguments: None.
Returns:
*---------------------------------------------------------------------------*/
KAMIResult kamiNandIo(u32 block, void* buffer, u32 count, BOOL is_read)
{
OSIntrMode enabled;
u8 data[12];
int i;
MI_CpuClear8( data, sizeof(data));
// ロック
enabled = OS_DisableInterrupts();
if (kamiWork.lock)
{
(void)OS_RestoreInterrupts(enabled);
return KAMI_RESULT_BUSY;
}
kamiWork.lock = TRUE;
(void)OS_RestoreInterrupts(enabled);
kamiWork.callback = NULL;
kamiWork.arg = 0;
kamiWork.data = 0;
// データ作成
KAMI_PACK_U32(&data[0], &block);
KAMI_PACK_U32(&data[4], &buffer);
KAMI_PACK_U32(&data[8], &count);
if (KamiSendPxiCommand(KAMI_NAND_IO, 13, (u8)is_read))
{
for (i = 0; i < 12; i+=3)
{
KamiSendPxiData(&data[i]);
}
KamiWaitBusy();
return (KAMIResult)kamiWork.result;
}
return KAMI_RESULT_SEND_ERROR;
}
/*---------------------------------------------------------------------------*
Name: kamiMcuWriteFirm
Description: MCUファーム更新関数
Arguments: buffer : new mcu data buffer
Returns:
*---------------------------------------------------------------------------*/
KAMIResult kamiMcuWriteFirm(void* buffer )
{
OSIntrMode enabled;
u8 data[4+2]; // 3の倍数
int i;
MI_CpuClear8( data, sizeof(data));
// ロック
enabled = OS_DisableInterrupts();
if (kamiWork.lock)
{
(void)OS_RestoreInterrupts(enabled);
return KAMI_RESULT_BUSY;
}
kamiWork.lock = TRUE;
(void)OS_RestoreInterrupts(enabled);
kamiWork.callback = NULL;
kamiWork.arg = 0;
// データ作成
KAMI_PACK_U32(&data[0], &buffer);
if (KamiSendPxiCommand(KAMI_MCU_WRITE_FIRM, 5, (u8)0))
{
for (i = 0; i < 4; i+=3)
{
KamiSendPxiData(&data[i]);
}
KamiWaitBusy();
return (KAMIResult)kamiWork.result;
}
return KAMI_RESULT_SEND_ERROR;
}
/*---------------------------------------------------------------------------*
Name: MCUアクセス関数
Description:
Arguments: None.
Returns:
*---------------------------------------------------------------------------*/
KAMIResult kamiMcuIo(u32 reg_no, void* buffer, u32 value, BOOL is_read)
{
OSIntrMode enabled;
u8 data[12];
int i;
MI_CpuClear8( data, sizeof(data));
// ロック
enabled = OS_DisableInterrupts();
if (kamiWork.lock)
{
(void)OS_RestoreInterrupts(enabled);
return KAMI_RESULT_BUSY;
}
kamiWork.lock = TRUE;
(void)OS_RestoreInterrupts(enabled);
kamiWork.callback = NULL;
kamiWork.arg = 0;
if (is_read)
{
kamiWork.data = (u8*)buffer;
}
else
{
kamiWork.data = 0;
}
// データ作成
KAMI_PACK_U32(&data[0], &reg_no);
KAMI_PACK_U32(&data[4], &value);
if (KamiSendPxiCommand(KAMI_MCU_IO, 13, (u8)is_read))
{
for (i = 0; i < 12; i+=3)
{
KamiSendPxiData(&data[i]);
}
KamiWaitBusy();
return (KAMIResult)kamiWork.result;
}
return KAMI_RESULT_SEND_ERROR;
}
/*---------------------------------------------------------------------------*
Name: ARM7アクセス関数
Description:
Arguments: None.
Returns:
*---------------------------------------------------------------------------*/
KAMIResult kamiARM7Io(u32 addr, u32* buffer, u32 value, BOOL is_read)
{
OSIntrMode enabled;
u8 data[12];
int i;
MI_CpuClear8( data, sizeof(data));
// ロック
enabled = OS_DisableInterrupts();
if (kamiWork.lock)
{
(void)OS_RestoreInterrupts(enabled);
return KAMI_RESULT_BUSY;
}
kamiWork.lock = TRUE;
(void)OS_RestoreInterrupts(enabled);
kamiWork.callback = NULL;
kamiWork.arg = 0;
if (is_read)
{
kamiWork.data = (u8*)buffer;
}
else
{
kamiWork.data = 0;
}
// データ作成
KAMI_PACK_U32(&data[0], &addr);
KAMI_PACK_U32(&data[4], &value);
if (KamiSendPxiCommand(KAMI_ARM7_IO, 13, (u8)is_read))
{
for (i = 0; i < 12; i+=3)
{
KamiSendPxiData(&data[i]);
}
KamiWaitBusy();
return (KAMIResult)kamiWork.result;
}
return KAMI_RESULT_SEND_ERROR;
}
/*---------------------------------------------------------------------------*
Name: kamiCDC_GoDsMode
Description: CODECをDSモードへ遷移させる関数
Arguments: None.
Returns:
*---------------------------------------------------------------------------*/
KAMIResult kamiCDC_GoDsMode( void )
{
OSIntrMode enabled;
// ロック
enabled = OS_DisableInterrupts();
if (kamiWork.lock)
{
(void)OS_RestoreInterrupts(enabled);
return KAMI_RESULT_BUSY;
}
kamiWork.lock = TRUE;
(void)OS_RestoreInterrupts(enabled);
kamiWork.callback = NULL;
kamiWork.arg = 0;
kamiWork.data = 0;
if (KamiSendPxiCommand(KAMI_CDC_GO_DSMODE, 0, (u8)0))
{
KamiWaitBusy();
return (KAMIResult)kamiWork.result;
}
return KAMI_RESULT_SEND_ERROR;
}
/*---------------------------------------------------------------------------*
Name: kamiClearNandErrorLog
Description: NVRAMのNANDエラー情報をクリアします
Arguments: None.
Returns:
*---------------------------------------------------------------------------*/
KAMIResult kamiClearNandErrorLog( void )
{
OSIntrMode enabled;
// ロック
enabled = OS_DisableInterrupts();
if (kamiWork.lock)
{
(void)OS_RestoreInterrupts(enabled);
return KAMI_RESULT_BUSY;
}
kamiWork.lock = TRUE;
(void)OS_RestoreInterrupts(enabled);
kamiWork.callback = NULL;
kamiWork.arg = 0;
kamiWork.data = 0;
if (KamiSendPxiCommand(KAMI_CLEAR_NAND_ERRORLOG, 0, (u8)0))
{
KamiWaitBusy();
return (KAMIResult)kamiWork.result;
}
return KAMI_RESULT_SEND_ERROR;
}
/*---------------------------------------------------------------------------*
Name: kamiGetCameraModuleTypesAsync
Description:
Arguments: None.
Returns:
*---------------------------------------------------------------------------*/
KAMIResult kamiGetCameraModuleTypesAsync( CameraModuleTypes *pTypes, KAMICallback callback, void* arg )
{
OSIntrMode enabled;
if (pTypes == NULL)
{
return KAMI_RESULT_INVALID_PARAMETER;
}
enabled = OS_DisableInterrupts();
if (kamiWork.lock)
{
(void)OS_RestoreInterrupts(enabled);
return KAMI_RESULT_BUSY;
}
kamiWork.lock = TRUE;
kamiWork.callback = callback;
kamiWork.arg = arg;
kamiWork.data = (u8*)pTypes;
(void)OS_RestoreInterrupts(enabled);
if (KamiSendPxiCommand(KAMI_GET_CAMERA_MODULE_TYPE, 0, 0))
{
return KAMI_RESULT_SUCCESS;
}
return KAMI_RESULT_SEND_ERROR;
}
/*---------------------------------------------------------------------------*
Name: kamiGetCameraModuleTypes
Description:
Arguments: None.
Returns:
*---------------------------------------------------------------------------*/
KAMIResult kamiGetCameraModuleTypes( CameraModuleTypes *pTypes )
{
OSIntrMode enabled;
if (pTypes == NULL)
{
return KAMI_RESULT_INVALID_PARAMETER;
}
enabled = OS_DisableInterrupts();
if (kamiWork.lock)
{
(void)OS_RestoreInterrupts(enabled);
return KAMI_RESULT_BUSY;
}
kamiWork.lock = TRUE;
kamiWork.callback = NULL;
kamiWork.arg = 0;
kamiWork.data = (u8*)pTypes;
(void)OS_RestoreInterrupts(enabled);
if (KamiSendPxiCommand(KAMI_GET_CAMERA_MODULE_TYPE, 0, 0))
{
KamiWaitBusy();
return (KAMIResult)kamiWork.result;
}
return KAMI_RESULT_SEND_ERROR;
}
/*---------------------------------------------------------------------------*
Name: kamiGetNandCID
Description: NANDのCIDを取得します
Arguments: buffer : 16
Returns:
*---------------------------------------------------------------------------*/
KAMIResult kamiGetNandCID(void* buffer )
{
OSIntrMode enabled;
u8 data[4+2]; // 3の倍数
MI_CpuClear8( data, sizeof(data));
// ロック
enabled = OS_DisableInterrupts();
if (kamiWork.lock)
{
(void)OS_RestoreInterrupts(enabled);
return KAMI_RESULT_BUSY;
}
kamiWork.lock = TRUE;
(void)OS_RestoreInterrupts(enabled);
kamiWork.callback = NULL;
kamiWork.arg = 0;
kamiWork.data = (u8*)buffer;
if (KamiSendPxiCommand(KAMI_GET_NAND_CID, 0, 0))
{
KamiWaitBusy();
return (KAMIResult)kamiWork.result;
}
return KAMI_RESULT_SEND_ERROR;
}
/*---------------------------------------------------------------------------*
PXI関連
*---------------------------------------------------------------------------*/
static BOOL KamiSendPxiCommand(KamiCommand command, u8 size, u8 data)
{
u32 pxiData = (u32)(KAMITEST_PXI_START_BIT |
((command << KAMITEST_PXI_COMMAND_SHIFT) & KAMITEST_PXI_COMMAND_MASK) |
((size << KAMITEST_PXI_DATA_NUMS_SHIFT) & KAMITEST_PXI_DATA_NUMS_MASK) |
((data << KAMITEST_PXI_1ST_DATA_SHIFT) & KAMITEST_PXI_1ST_DATA_MASK));
if (0 > PXI_SendWordByFifo(PXI_FIFO_TAG_KAMITEST, pxiData, 0))
{
return FALSE;
}
return TRUE;
}
static void KamiSendPxiData(u8 *pData)
{
u32 pxiData = (u32)((pData[0] << 16) | (pData[1] << 8) | pData[2]);
while (0 > PXI_SendWordByFifo(PXI_FIFO_TAG_KAMITEST, pxiData, 0))
{
}
}
static void KamiPxiCallback(PXIFifoTag tag, u32 data, BOOL err)
{
#pragma unused( tag )
if (err)
{
KamiDone(KAMI_RESULT_FATAL_ERROR);
return;
}
if (data & KAMITEST_PXI_START_BIT) // 先頭データ
{
if (data & KAMITEST_PXI_RESULT_BIT)
{
kamiWork.total = (u8)((data & KAMITEST_PXI_DATA_NUMS_MASK) >> KAMITEST_PXI_DATA_NUMS_SHIFT);
kamiWork.current = 0;
kamiWork.command = (KamiCommand)((data & KAMITEST_PXI_COMMAND_MASK) >> KAMITEST_PXI_COMMAND_SHIFT);
kamiWork.result = (KAMIPxiResult)((data & KAMITEST_PXI_1ST_DATA_MASK) >> KAMITEST_PXI_1ST_DATA_SHIFT);
}
else // 未知のデータ
{
KamiDone(KAMI_RESULT_FATAL_ERROR);
return;
}
}
else // 後続データ
{
if (kamiWork.data == NULL)
{
KamiDone(KAMI_RESULT_FATAL_ERROR);
return;
}
if (kamiWork.current < kamiWork.total-1)
{
kamiWork.data[kamiWork.current++] = (u8)((data & 0xFF0000) >> 16);
}
if (kamiWork.current < kamiWork.total-1)
{
kamiWork.data[kamiWork.current++] = (u8)((data & 0x00FF00) >> 8);
}
if (kamiWork.current < kamiWork.total-1)
{
kamiWork.data[kamiWork.current++] = (u8)((data & 0x0000FF) >> 0);
}
}
if (kamiWork.current == kamiWork.total-1)
{
KAMIResult result;
switch (kamiWork.result)
{
case KAMI_PXI_RESULT_SUCCESS: // alias KAMI_PXI_RESULT_SUCCESS_TRUE
result = KAMI_RESULT_SUCCESS; // alias KAMI_RESULT_SUCCESS_TRUE
break;
case KAMI_PXI_RESULT_SUCCESS_FALSE:
result = KAMI_RESULT_SUCCESS_FALSE;
break;
case KAMI_PXI_RESULT_INVALID_COMMAND:
result = KAMI_RESULT_INVALID_COMMAND;
break;
case KAMI_PXI_RESULT_INVALID_PARAMETER:
result = KAMI_RESULT_INVALID_PARAMETER;
break;
case KAMI_PXI_RESULT_ILLEGAL_STATUS:
result = KAMI_RESULT_ILLEGAL_STATUS;
break;
case KAMI_PXI_RESULT_BUSY:
result = KAMI_RESULT_BUSY;
break;
default:
result = KAMI_RESULT_FATAL_ERROR;
}
KamiDone(result);
return;
}
}
extern void PXIi_HandlerRecvFifoNotEmpty(void);
static void KamiWaitBusy(void)
{
volatile BOOL *p = &kamiWork.lock;
while (*p)
{
if (OS_GetCpsrIrq() == OS_INTRMODE_IRQ_DISABLE)
{
PXIi_HandlerRecvFifoNotEmpty();
}
}
}
static void KamiDone(KAMIResult result)
{
KAMICallback callback = kamiWork.callback;
void* arg = kamiWork.arg;
kamiWork.callback = NULL;
kamiWork.arg = NULL;
if (kamiWork.lock)
{
kamiWork.lock = FALSE;
}
if (callback)
{
callback(result, arg);
}
}

View File

@ -23,6 +23,7 @@
#include "common.h"
#include "screen.h"
#include "kami_pxi.h"
#define TITLE_SHOW_BASE_Y 5
#define TITLE_MAX_SHOW 0x10
@ -43,6 +44,9 @@
#define NAND_FIRM_INFO_OFS 1
#define SHARED_FONT_INFO_OFS 2
#define NAND_BLOCK_BYTE 0x200
#define NAND_FIRM_START_OFFSET 0x200
#define NAND_FIRM_START_OFFSET_IN_FILE 0x200
/*---------------------------------------------------------------------------*
@ -155,8 +159,9 @@ static void FreeForNAM(void* ptr);
static BOOL ProcessTitleHashCheck(void);
static BOOL GetAppPath(DataStruct* list, char* path_buf);
BOOL CulcuHash(DataStruct* list, char* full_path);
BOOL CulcuFontDataHash(DataStruct* list);
BOOL CulcuNandAppHash(DataStruct* list, char* full_path);
BOOL CulcuFontDataHash(DataStruct* list);
BOOL CulcuNandFirmHash(DataStruct* list);
u16 newGetCRC(u16 start, u16 *datap, u32 size);
static void inittable(unsigned short *table);
@ -179,6 +184,10 @@ void TwlMain(void)
BOOL errorFlg = FALSE;
InitCommon();
KamiPxiInit();
FS_Init(FS_DMA_NOT_USE);
InitScreen();
GX_DispOn();
@ -199,7 +208,7 @@ void TwlMain(void)
ClearScreen();
// hash Check
(void)ProcessTitleHashCheck();
ProcessTitleHashCheck();
// Disable Debug Check
CheckDisableDebugFlg();
@ -615,7 +624,7 @@ BOOL ProcessTitleHashCheck( void )
}
// Hash, CRC16の計算
if ( !CulcuHash(list, full_path) )
if ( !CulcuNandAppHash(list, full_path) )
{
gErrorFlg = TRUE;
}
@ -623,8 +632,12 @@ BOOL ProcessTitleHashCheck( void )
// SharedフォントとNandファームの値用の2つ
gNandAppNum += 2;
// SharedフォントのSha1値を求める
CulcuFontDataHash(gDataList);
// NandFirmのSha1値を求める
CulcuNandFirmHash(gDataList);
OS_PutString("ProcessTitleHashCheck Finish!!\n");
@ -748,19 +761,18 @@ static BOOL GetAppPath(DataStruct* list, char* path_buf)
/*---------------------------------------------------------------------------*
Name: CulcuHash
Name: CulcuNandAppHash
Description:
Arguments:
Returns:
*---------------------------------------------------------------------------*/
#define READ_SIZE 0x1000 // MasterEditorでのCRC計算にあわせるためこの値を使う
BOOL CulcuHash(DataStruct* list, char* full_path)
BOOL CulcuNandAppHash(DataStruct* list, char* full_path)
{
FSFile file;
BOOL open_is_ok;
@ -836,7 +848,6 @@ BOOL CulcuHash(DataStruct* list, char* full_path)
// CRC16計算
crc = newGetCRC(crc, (u16 *)pTempBuf, READ_SIZE); // 本来ならばここは data_size分の計算をすればよいが、
// MasterEditorのCRC計算にあわせるため、READ_SIZE分計算する
// Hash値 UpDate
SVC_SHA1Update( &hash, pTempBuf, data_size );
@ -880,7 +891,17 @@ BOOL CulcuHash(DataStruct* list, char* full_path)
}
BOOL CulcuFontDataHash(DataStruct* list)
/*---------------------------------------------------------------------------*
Name: CulcuFontDataHash
Description:
Arguments:
Returns:
*---------------------------------------------------------------------------*/
BOOL CulcuFontDataHash(DataStruct* list)
{
FSFile file;
BOOL open_is_ok;
@ -892,7 +913,7 @@ BOOL CulcuFontDataHash(DataStruct* list)
FSResult result;
// ケツから2個目をSharedFont用のデータにする
DataStruct *data = &list[gNandAppNum-SHARED_FONT_INFO_OFS];
DataStruct *data = &list[gNandAppNum - SHARED_FONT_INFO_OFS];
// ハッシュ初期化
SVC_SHA1Init( &hash );
@ -944,6 +965,55 @@ BOOL CulcuFontDataHash(DataStruct* list)
}
/*---------------------------------------------------------------------------*
Name: CulcuNandFirmHash
Description:
Arguments:
Returns:
*---------------------------------------------------------------------------*/
BOOL CulcuNandFirmHash(DataStruct* list)
{
u8* pTempBuf;
u32 alloc_size;
// ケツから1個目をSharedFont用のデータにする
DataStruct *data = &list[gNandAppNum - NAND_FIRM_INFO_OFS];
// nandfirm_size = file_size - NAND_FIRM_START_OFFSET_IN_FILE;
// バッファ確保
// 書き込みがブロック単位(512byte)であることを考慮し512アライメントを確保
alloc_size = 0x200; // MATH_ROUNDUP(file_size, 512);
pTempBuf = spAllocFunc( alloc_size );
if (pTempBuf == NULL)
{
OS_Warning("Failure! Alloc Buffer");
return FALSE;
}
MI_CpuClear8( pTempBuf, alloc_size );
// Nandからリード
if (kamiNandRead(NAND_FIRM_START_OFFSET/NAND_BLOCK_BYTE, pTempBuf, alloc_size ) == KAMI_RESULT_SEND_ERROR)
{
OS_Warning("Failure! Read NandFirm");
}
DC_FlushRange(pTempBuf, alloc_size);
// Hash値 UpDate
SVC_CalcSHA1( data->Sha1_digest, pTempBuf, alloc_size );
// メモリ解放
spFreeFunc(pTempBuf);
return TRUE;
}
/*---------------------------------------------------------------------------*
Name: newGetCRC

Binary file not shown.

Before

Width:  |  Height:  |  Size: 630 B

After

Width:  |  Height:  |  Size: 630 B