初版 値表示するところまで

git-svn-id: file:///Users/lillianskinner/Downloads/platinum/twl/TwlIPL/trunk@1883 b08762b0-b915-fc4b-9d8c-17b2551a87ff
This commit is contained in:
aoki_ryoma 2008-07-14 12:36:29 +00:00
parent 0e6093aae6
commit 4c5ec38e77
31 changed files with 7300 additions and 0 deletions

View File

@ -0,0 +1,82 @@
#! make -f
#----------------------------------------------------------------------------
# Project: TwlSDK - components - armadillo.TWL
# File: Makefile
#
# Copyright 2008 Nintendo. All rights reserved.
#
# These coded instructions, statements, and computer programs contain
# proprietary information of Nintendo of America Inc. and/or Nintendo
# Company Ltd., and are protected by Federal copyright law. They may
# not be disclosed to third parties or copied or duplicated in any form,
# in whole or in part, without the prior written consent of Nintendo.
#
# $Date:: $
# $Rev$
# $Author$
#----------------------------------------------------------------------------
override TARGET_PLATFORM = TWL
override TWL_PROC = ARM7
override TWL_ARCHGEN = LIMITED
override TWL_PLATFORM = TS
TWL_NO_STD_PCHDR = True
TWL_CODEGEN ?= ALL
#----------------------------------------------------------------------------
SRCS = main.c overwriteRtc.c
TARGET_NAME = armadillo
TARGET_NEF = $(TARGET_NAME).tef
LCFILE_SPEC = $(TARGET_NAME).lsf
LCFILE_TEMPLATE = $(TARGET_NAME).lcf.template
LDRES_TEMPLATE = $(TARGET_NAME).response.template
CRT0_O = crt0.SCR.TWL.o
# スタック不足防止の為、インライン展開せずにコンパイルする
CCFLAGS_OPT = -O4 -inline off
#----------------------------------------------------------------------------
include $(TWLSDK_ROOT)/build/buildtools/commondefs
DISP_INFO = $(TWL_IPL_RED_ROOT)/build/tests/DisplaySystemInformation
MACRO_FLAGS += -DSDK_ARM7COMP_LTD -DSDK_SEA
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'
#--------------------------------
# install target
#--------------------------------
#INSTALL_TARGETS = $(BINDIR)/$(TARGET_NAME).tef \
# $(BINDIR)/$(TARGET_NAME).TWL.FLX.sbin \
# $(BINDIR)/$(TARGET_NAME)_defs.TWL.FLX.sbin \
# $(BINDIR)/$(TARGET_NAME).TWL.LTD.sbin \
# $(BINDIR)/$(TARGET_NAME)_defs.TWL.LTD.sbin
#INSTALL_DIR = $(TWL_INSTALL_COMPONENTSDIR)/$(TARGET_NAME)/$(TWL_BUILDTYPE)
LINCLUDES = $(ROOT)/build/libraries/spi/ARM7/include \
$(DISP_INFO)/common/include
LLIBRARIES += libwl_sp$(TWL_LIBSUFFIX).a \
libsdio_sp$(TWL_LIBSUFFIX).a \
libathdrv_sp$(TWL_LIBSUFFIX).a \
libwpa_sp$(TWL_LIBSUFFIX).a \
libsea_sp$(TWL_LIBSUFFIX).a \
LDEPENDS_NEF = $(TWL_LIBS) $(LLIBRARIES)
do-build: $(TARGETS)
#----------------------------------------------------------------------------
include $(TWLSDK_ROOT)/build/buildtools/modulerules
#----------------------------------------------------------------------------
#===== End of Makefile =====

View File

@ -0,0 +1,400 @@
#---------------------------------------------------------------------------
# Project: TwlSDK - components - armadillo.TWL
# File: armadillo.lcf.template
#
# Copyright 2008 Nintendo. All rights reserved.
#
# These coded instructions, statements, and computer programs contain
# proprietary information of Nintendo of America Inc. and/or Nintendo
# Company Ltd., and are protected by Federal copyright law. They may
# not be disclosed to third parties or copied or duplicated in any form,
# in whole or in part, without the prior written consent of Nintendo.
#
# $Date:: $
# $Rev$
# $Author$
#---------------------------------------------------------------------------
MEMORY
{
<STATIC.NAME> (RWX) : ORIGIN = <STATIC.ADDRESS>, LENGTH = 0x0 > <STATIC.NAME><PROPERTY.FLXSUFFIX>
binary.STATIC_FOOTER (RWX) : ORIGIN = 0, LENGTH = 0x0 >> <STATIC.NAME><PROPERTY.FLXSUFFIX>
<PROPERTY.OVERLAYDEFS>F (RW) : ORIGIN = 0, LENGTH = 0x0 > <PROPERTY.OVERLAYDEFS><PROPERTY.FLXSUFFIX>
binary.LTDAUTOLOAD_TOP (RW) : ORIGIN = 0, LENGTH = 0x0 > <STATIC.NAME><PROPERTY.LTDSUFFIX>
<FOREACH.LTDAUTOLOADS>
<LTDAUTOLOAD.NAME> (RWX) : ORIGIN = <LTDAUTOLOAD.ADDRESS>, LENGTH = 0x0 >> <STATIC.NAME><PROPERTY.LTDSUFFIX>
<END.LTDAUTOLOADS>
binary.LTDAUTOLOAD_INFO (RWX) : ORIGIN = 0, LENGTH = 0x0 >> <STATIC.NAME><PROPERTY.LTDSUFFIX>
<PROPERTY.LTDOVERLAYDEFS>L (RW) : ORIGIN = 0, LENGTH = 0x0 > <PROPERTY.LTDOVERLAYDEFS><PROPERTY.LTDSUFFIX>
check.WORKRAM (RWX) : ORIGIN = 0x03740000, LENGTH = 0xd0000 > workram.check
}
KEEP_SECTION
{
.sinit
}
SECTIONS
{
############################ STATIC #################################
.<STATIC.NAME>:
{
ALIGNALL(4);
. = ALIGN(4);
#
# Definition to refer overlay segment, when same name symbols exist in multiple overlays.
#
<FOREACH.STATIC.SEARCHSYMBOLS>
SEARCH_SYMBOL <STATIC.SEARCHSYMBOL>;
<END.STATIC.SEARCHSYMBOLS>
#
# TEXT BLOCK: READ ONLY
#
SDK_STATIC_START =.;
OBJECT(_start,*)
<FOREACH.STATIC.OBJECTS=.text>
<STATIC.OBJECT=.text:t>
<END.STATIC.OBJECTS>
<FOREACH.STATIC.LIBRARIES=.text>
<STATIC.LIBRARY=.text:t>
<END.STATIC.LIBRARIES>
<FOREACH.STATIC.OBJECTS=.rodata>
<STATIC.OBJECT=.rodata:t>
<END.STATIC.OBJECTS>
<FOREACH.STATIC.LIBRARIES=.rodata>
<STATIC.LIBRARY=.rodata:t>
<END.STATIC.LIBRARIES>
<FOREACH.STATIC.OBJECTS=.init>
<STATIC.OBJECT=.init:t>
<END.STATIC.OBJECTS>
<FOREACH.STATIC.LIBRARIES=.init>
<STATIC.LIBRARY=.init:t>
<END.STATIC.LIBRARIES>
. = ALIGN(4);
SDK_STATIC_SINIT_START =.;
<FOREACH.STATIC.OBJECTS=.ctor>
<STATIC.OBJECT=.ctor:t>
<END.STATIC.OBJECTS>
<FOREACH.STATIC.LIBRARIES=.ctor>
<STATIC.LIBRARY=.ctor:t>
<END.STATIC.LIBRARIES>
<FOREACH.STATIC.OBJECTS=.sinit>
<STATIC.OBJECT=.sinit:t>
<END.STATIC.OBJECTS>
<FOREACH.STATIC.LIBRARIES=.sinit>
<STATIC.LIBRARY=.sinit:t>
<END.STATIC.LIBRARIES>
WRITEW 0;
#
# DATA BLOCK: READ WRITE
#
. = ALIGN(4);
<FOREACH.STATIC.OBJECTS=.sdata>
<STATIC.OBJECT=.sdata:t>
<END.STATIC.OBJECTS>
<FOREACH.STATIC.LIBRARIES=.sdata>
<STATIC.LIBRARY=.sdata:t>
<END.STATIC.LIBRARIES>
<FOREACH.STATIC.OBJECTS=.data>
<STATIC.OBJECT=.data:t>
<END.STATIC.OBJECTS>
<FOREACH.STATIC.LIBRARIES=.data>
<STATIC.LIBRARY=.data:t>
<END.STATIC.LIBRARIES>
. = ALIGN(4);
SDK_STATIC_END =.;
SDK_STATIC_SIZE = SDK_STATIC_END - SDK_STATIC_START;
__sinit__ = SDK_STATIC_SINIT_START; # for static initializer
} > <STATIC.NAME>
.<STATIC.NAME>.bss:
{
ALIGNALL(4);
. = ALIGN(4);
#
# Definition to refer overlay segment, when same name symbols exist in multiple overlays.
#
<FOREACH.STATIC.SEARCHSYMBOLS>
SEARCH_SYMBOL <STATIC.SEARCHSYMBOL>;
<END.STATIC.SEARCHSYMBOLS>
#
# BSS BLOCK
#
SDK_STATIC_BSS_START =.;
<FOREACH.STATIC.OBJECTS=.sbss>
<STATIC.OBJECT=.sbss:t>
<END.STATIC.OBJECTS>
<FOREACH.STATIC.LIBRARIES=.sbss>
<STATIC.LIBRARY=.sbss:t>
<END.STATIC.LIBRARIES>
<FOREACH.STATIC.OBJECTS=.bss>
<STATIC.OBJECT=.bss:t>
<END.STATIC.OBJECTS>
<FOREACH.STATIC.LIBRARIES=.bss>
<STATIC.LIBRARY=.bss:t>
<END.STATIC.LIBRARIES>
. = ALIGN(4);
SDK_STATIC_BSS_END = .;
SDK_STATIC_BSS_SIZE = SDK_STATIC_BSS_END - SDK_STATIC_BSS_START;
} >> <STATIC.NAME>
############################ STATIC_FOOTER ##########################
.binary.STATIC_FOOTER:
{
WRITEW 0xdec00621; # LE(0x2106C0DE) = NITRO CODE
WRITEW _start_ModuleParams - ADDR(.<STATIC.NAME>);
WRITEW 0; # NO DIGEST
WRITEW _start_LtdModuleParams - ADDR(.<STATIC.NAME>);
} > binary.STATIC_FOOTER
############################ OVERLAYDEFS ############################
.<PROPERTY.OVERLAYDEFS>F:
{
### <STATIC.NAME> module information
WRITEW ADDR(.<STATIC.NAME>); # load address
WRITEW _start; # entry address
WRITEW SDK_STATIC_SIZE; # size of module
WRITEW _start_AutoloadDoneCallback; # callback autoload done
} > <PROPERTY.OVERLAYDEFS>F
########################### LTDAUTOLOADS ############################
SDK_LTDAUTOLOAD_TOP_START = 0x02f00000;
SDK_LTDAUTOLOAD_TOP_SIZE = 4; # STATIC 領域が無い代わりに 4 bytes のダミーがバイナリファイルの先頭に入る #
SDK_LTDAUTOLOAD_START = SDK_LTDAUTOLOAD_TOP_START + SDK_LTDAUTOLOAD_TOP_SIZE;
SDK_LTDAUTOLOAD_SIZE = 0;
SDK_LTDAUTOLOAD_BSS_END = 0x03740000;
.binary.LTDAUTOLOAD_TOP:
{
WRITEW 0;
} > binary.LTDAUTOLOAD_TOP
<FOREACH.LTDAUTOLOADS>
.<LTDAUTOLOAD.NAME>:
{
ALIGNALL(4);
. = ALIGN(4);
#
# Definition to refer overlay segment, when same name symbols exist in multiple overlays.
#
<FOREACH.LTDAUTOLOAD.SEARCHSYMBOLS>
SEARCH_SYMBOL <LTDAUTOLOAD.SEARCHSYMBOL>;
<END.LTDAUTOLOAD.SEARCHSYMBOLS>
#
# TEXT BLOCK: READ ONLY
#
SDK_LTDAUTOLOAD.<LTDAUTOLOAD.NAME>.START =.;
<FOREACH.LTDAUTOLOAD.OBJECTS=.text>
<LTDAUTOLOAD.OBJECT=.text:t>
<END.LTDAUTOLOAD.OBJECTS>
<FOREACH.LTDAUTOLOAD.LIBRARIES=.text>
<LTDAUTOLOAD.LIBRARY=.text:t>
<END.LTDAUTOLOAD.LIBRARIES>
<FOREACH.LTDAUTOLOAD.OBJECTS=.etable>
<LTDAUTOLOAD.OBJECT=.exception:t>
. = ALIGN(4);
SDK_STATIC_ETABLE_START =.;
__exception_table_start__ =.;
EXCEPTION
__exception_table_end__ =.;
SDK_STATIC_ETABLE_END =.;
<END.LTDAUTOLOAD.OBJECTS>
<FOREACH.LTDAUTOLOAD.OBJECTS=.rodata>
<LTDAUTOLOAD.OBJECT=.rodata:t>
<END.LTDAUTOLOAD.OBJECTS>
<FOREACH.LTDAUTOLOAD.LIBRARIES=.rodata>
<LTDAUTOLOAD.LIBRARY=.rodata:t>
<END.LTDAUTOLOAD.LIBRARIES>
<FOREACH.LTDAUTOLOAD.OBJECTS=.init>
<LTDAUTOLOAD.OBJECT=.init:t>
<END.LTDAUTOLOAD.OBJECTS>
<FOREACH.LTDAUTOLOAD.LIBRARIES=.init>
<LTDAUTOLOAD.LIBRARY=.init:t>
<END.LTDAUTOLOAD.LIBRARIES>
. = ALIGN(4);
SDK_LTDAUTOLOAD.<LTDAUTOLOAD.NAME>.SINIT_START =.;
<FOREACH.LTDAUTOLOAD.OBJECTS=.ctor>
<LTDAUTOLOAD.OBJECT=.ctor:t>
<END.LTDAUTOLOAD.OBJECTS>
<FOREACH.LTDAUTOLOAD.LIBRARIES=.ctor>
<LTDAUTOLOAD.LIBRARY=.ctor:t>
<END.LTDAUTOLOAD.LIBRARIES>
<FOREACH.LTDAUTOLOAD.OBJECTS=.sinit>
<LTDAUTOLOAD.OBJECT=.sinit:t>
<END.LTDAUTOLOAD.OBJECTS>
<FOREACH.LTDAUTOLOAD.LIBRARIES=.sinit>
<LTDAUTOLOAD.LIBRARY=.sinit:t>
<END.LTDAUTOLOAD.LIBRARIES>
WRITEW 0;
#
# DATA BLOCK: READ WRITE BLOCK
#
. = ALIGN(4);
<FOREACH.LTDAUTOLOAD.OBJECTS=.sdata>
<LTDAUTOLOAD.OBJECT=.sdata:t>
<END.LTDAUTOLOAD.OBJECTS>
<FOREACH.LTDAUTOLOAD.LIBRARIES=.sdata>
<LTDAUTOLOAD.LIBRARY=.sdata:t>
<END.LTDAUTOLOAD.LIBRARIES>
<FOREACH.LTDAUTOLOAD.OBJECTS=.data>
<LTDAUTOLOAD.OBJECT=.data:t>
<END.LTDAUTOLOAD.OBJECTS>
<FOREACH.LTDAUTOLOAD.LIBRARIES=.data>
<LTDAUTOLOAD.LIBRARY=.data:t>
<END.LTDAUTOLOAD.LIBRARIES>
<FOREACH.LTDAUTOLOAD.OBJECTS=.wram>
<LTDAUTOLOAD.OBJECT=.wram:t>
<END.LTDAUTOLOAD.OBJECTS>
<FOREACH.LTDAUTOLOAD.LIBRARIES=.wram>
<LTDAUTOLOAD.LIBRARY=.wram:t>
<END.LTDAUTOLOAD.LIBRARIES>
<FOREACH.LTDAUTOLOAD.OBJECTS=.ltdwram>
<LTDAUTOLOAD.OBJECT=.ltdwram:t>
<END.LTDAUTOLOAD.OBJECTS>
<FOREACH.LTDAUTOLOAD.LIBRARIES=.ltdwram>
<LTDAUTOLOAD.LIBRARY=.ltdwram:t>
<END.LTDAUTOLOAD.LIBRARIES>
<FOREACH.LTDAUTOLOAD.OBJECTS=.rsvwram>
<LTDAUTOLOAD.OBJECT=.rsvwram:t>
<END.LTDAUTOLOAD.OBJECTS>
<FOREACH.LTDAUTOLOAD.LIBRARIES=.rsvwram>
<LTDAUTOLOAD.LIBRARY=.rsvwram:t>
<END.LTDAUTOLOAD.LIBRARIES>
<FOREACH.LTDAUTOLOAD.OBJECTS=.ltdmain>
<LTDAUTOLOAD.OBJECT=.ltdmain:t>
<END.LTDAUTOLOAD.OBJECTS>
<FOREACH.LTDAUTOLOAD.LIBRARIES=.ltdmain>
<LTDAUTOLOAD.LIBRARY=.ltdmain:t>
<END.LTDAUTOLOAD.LIBRARIES>
. = ALIGN(4);
SDK_LTDAUTOLOAD.<LTDAUTOLOAD.NAME>.END =.;
SDK_LTDAUTOLOAD.<LTDAUTOLOAD.NAME>.SIZE = SDK_LTDAUTOLOAD.<LTDAUTOLOAD.NAME>.END - SDK_LTDAUTOLOAD.<LTDAUTOLOAD.NAME>.START;
SDK_LTDAUTOLOAD_SIZE = SDK_LTDAUTOLOAD_SIZE + SDK_LTDAUTOLOAD.<LTDAUTOLOAD.NAME>.SIZE;
} > <LTDAUTOLOAD.NAME>
.<LTDAUTOLOAD.NAME>.bss:
{
ALIGNALL(4);
. = ALIGN(4);
#
# Definition to refer overlay segment, when same name symbols exist in multiple overlays.
#
<FOREACH.LTDAUTOLOAD.SEARCHSYMBOLS>
SEARCH_SYMBOL <LTDAUTOLOAD.SEARCHSYMBOL>;
<END.LTDAUTOLOAD.SEARCHSYMBOLS>
#
# BSS BLOCK
#
SDK_LTDAUTOLOAD.<LTDAUTOLOAD.NAME>.BSS_START =.;
<FOREACH.LTDAUTOLOAD.OBJECTS=.sbss>
<LTDAUTOLOAD.OBJECT=.sbss:t>
<END.LTDAUTOLOAD.OBJECTS>
<FOREACH.LTDAUTOLOAD.LIBRARIES=.sbss>
<LTDAUTOLOAD.LIBRARY=.sbss:t>
<END.LTDAUTOLOAD.LIBRARIES>
<FOREACH.LTDAUTOLOAD.OBJECTS=.bss>
<LTDAUTOLOAD.OBJECT=.bss:t>
<END.LTDAUTOLOAD.OBJECTS>
<FOREACH.LTDAUTOLOAD.LIBRARIES=.bss>
<LTDAUTOLOAD.LIBRARY=.bss:t>
<END.LTDAUTOLOAD.LIBRARIES>
<FOREACH.LTDAUTOLOAD.OBJECTS=.wram>
<LTDAUTOLOAD.OBJECT=.wram.bss:t>
<END.LTDAUTOLOAD.OBJECTS>
<FOREACH.LTDAUTOLOAD.LIBRARIES=.wram>
<LTDAUTOLOAD.LIBRARY=.wram.bss:t>
<END.LTDAUTOLOAD.LIBRARIES>
<FOREACH.LTDAUTOLOAD.OBJECTS=.ltdwram>
<LTDAUTOLOAD.OBJECT=.ltdwram.bss:t>
<END.LTDAUTOLOAD.OBJECTS>
<FOREACH.LTDAUTOLOAD.LIBRARIES=.ltdwram>
<LTDAUTOLOAD.LIBRARY=.ltdwram.bss:t>
<END.LTDAUTOLOAD.LIBRARIES>
<FOREACH.LTDAUTOLOAD.OBJECTS=.rsvwram>
<LTDAUTOLOAD.OBJECT=.rsvwram.bss:t>
<END.LTDAUTOLOAD.OBJECTS>
<FOREACH.LTDAUTOLOAD.LIBRARIES=.rsvwram>
<LTDAUTOLOAD.LIBRARY=.rsvwram.bss:t>
<END.LTDAUTOLOAD.LIBRARIES>
<FOREACH.LTDAUTOLOAD.OBJECTS=.ltdmain>
<LTDAUTOLOAD.OBJECT=.ltdmain.bss:t>
<END.LTDAUTOLOAD.OBJECTS>
<FOREACH.LTDAUTOLOAD.LIBRARIES=.ltdmain>
<LTDAUTOLOAD.LIBRARY=.ltdmain.bss:t>
<END.LTDAUTOLOAD.LIBRARIES>
. = ALIGN(4);
SDK_LTDAUTOLOAD.<LTDAUTOLOAD.NAME>.BSS_END =.;
SDK_LTDAUTOLOAD_BSS_END =.;
SDK_LTDAUTOLOAD.<LTDAUTOLOAD.NAME>.BSS_SIZE = SDK_LTDAUTOLOAD.<LTDAUTOLOAD.NAME>.BSS_END - SDK_LTDAUTOLOAD.<LTDAUTOLOAD.NAME>.BSS_START;
} >> <LTDAUTOLOAD.NAME>
<END.LTDAUTOLOADS>
SDK_MOUNT_INFO_TABLE = SDK_LTDAUTOLOAD_BSS_END;
SDK_LTDAUTOLOAD_BSS_END = SDK_MOUNT_INFO_TABLE + 0x400;
######################### LTDAUTOLOAD_INFO ##########################
.binary.LTDAUTOLOAD_INFO:
{
<FOREACH.LTDAUTOLOADS>
WRITEW ADDR(.<LTDAUTOLOAD.NAME>);
WRITEW SDK_LTDAUTOLOAD.<LTDAUTOLOAD.NAME>.SIZE;
WRITEW SDK_LTDAUTOLOAD.<LTDAUTOLOAD.NAME>.SINIT_START;
WRITEW SDK_LTDAUTOLOAD.<LTDAUTOLOAD.NAME>.BSS_SIZE;
<END.LTDAUTOLOADS>
} > binary.LTDAUTOLOAD_INFO
SDK_LTDAUTOLOAD_LIST = SDK_LTDAUTOLOAD_START + SDK_LTDAUTOLOAD_SIZE;
SDK_LTDAUTOLOAD_LIST_END = SDK_LTDAUTOLOAD_LIST + SIZEOF(.binary.LTDAUTOLOAD_INFO);
SDK_LTDAUTOLOAD_SIZE = SDK_LTDAUTOLOAD_SIZE + SIZEOF(.binary.LTDAUTOLOAD_INFO);
########################## LTDOVERLAYDEFS ###########################
.<PROPERTY.LTDOVERLAYDEFS>L:
{
### TWL limited extended static module information
WRITEW SDK_LTDAUTOLOAD_TOP_START; # load address
WRITEW SDK_MOUNT_INFO_TABLE; # address of the FS mount information table
WRITEW SDK_LTDAUTOLOAD_SIZE + SDK_LTDAUTOLOAD_TOP_SIZE; # size of module
WRITEW 0; # padding
} > <PROPERTY.LTDOVERLAYDEFS>L
############################ OTHERS #################################
SDK_SUBPRIV_ARENA_LO = 0x02ffc000; # メインメモリアリーナはサイズ 0
SDK_SEA_KEY_STORE = SDK_LTDAUTOLOAD_BSS_END;
SDK_WRAM_ARENA_LO = SDK_LTDAUTOLOAD_BSS_END + 0x40;
SDK_IRQ_STACKSIZE = <STATIC.IRQSTACKSIZE>; # allocated in WRAM
SDK_SYS_STACKSIZE = <STATIC.STACKSIZE>; # allocated in WRAM
SDK_SYS_STACKSIZE_SIGN = (SDK_SYS_STACKSIZE < 0x80000000) * 2 - 1;
.check.WORKRAM:
{
. = SDK_WRAM_ARENA_LO + 0x80 + SDK_IRQ_STACKSIZE + SDK_SYS_STACKSIZE * SDK_SYS_STACKSIZE_SIGN;
} > check.WORKRAM
}

View File

@ -0,0 +1,85 @@
#----------------------------------------------------------------------------
# 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:: $
# $Rev$
# $Author$
#----------------------------------------------------------------------------
#
# 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)/overwriteRtc.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$(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
Object * (.wram)
Object * (.ltdwram)
Object * (.rsvwram)
Object * (.main)
Object * (.ltdmain)
}

View File

@ -0,0 +1,22 @@
<FOREACH.STATIC.OBJECTS:f>
<STATIC.OBJECT>
<END.STATIC.OBJECTS>
<FOREACH.STATIC.LIBRARIES:f>
-l<STATIC.LIBRARY>
<END.STATIC.LIBRARIES>
<FOREACH.AUTOLOADS>
<FOREACH.AUTOLOAD.OBJECTS:f>
<AUTOLOAD.OBJECT>
<END.AUTOLOAD.OBJECTS>
<FOREACH.AUTOLOAD.LIBRARIES:f>
-l<AUTOLOAD.LIBRARY>
<END.AUTOLOAD.LIBRARIES>
<END.AUTOLOADS>
<FOREACH.LTDAUTOLOADS>
<FOREACH.LTDAUTOLOAD.OBJECTS:f>
<LTDAUTOLOAD.OBJECT>
<END.LTDAUTOLOAD.OBJECTS>
<FOREACH.LTDAUTOLOAD.LIBRARIES:f>
-l<LTDAUTOLOAD.LIBRARY>
<END.LTDAUTOLOAD.LIBRARIES>
<END.LTDAUTOLOADS>

View File

@ -0,0 +1,632 @@
/*---------------------------------------------------------------------------*
Project: TwlSDK - components - armadillo.TWL
File: main.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:: $
$Rev$
$Author$
*---------------------------------------------------------------------------*/
#include <nitro/types.h>
#include <twl/init/crt0.h>
#include <twl/memorymap_sp.h>
#include <twl/os.h>
#include <twl/os/common/codecmode.h>
#include <nitro/pad.h>
#include <twl/aes.h>
#include <twl/sea.h>
#include <twl/fatfs.h>
#include <twl/nwm.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 "address.h"
/*---------------------------------------------------------------------------*
*---------------------------------------------------------------------------*/
/* 各スレッド優先度 */
#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_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 */
/* 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 NWMSP_DMA_7
/*---------------------------------------------------------------------------*
*---------------------------------------------------------------------------*/
static void PrintDebugInfo(void);
static OSHeapHandle InitializeAllocateSystem(void);
static void InitializeFatfs(void);
static void InitializeNwm(OSHeapHandle hh);
static void DummyThread(void* arg);
static void ReadUserInfo(void);
#ifdef NVRAM_CONFIG_DATA_EX_VERSION
static BOOL IsValidConfigEx(void);
static u16 GetRomValidLanguage(void);
static s32 CheckCorrectNCDEx(NVRAMConfigEx* ncdsp);
#else
static s32 CheckCorrectNCD(NVRAMConfig* ncdsp);
#endif
static void VBlankIntr(void);
/*---------------------------------------------------------------------------*
Name: TwlSpMain
Description:
Arguments: None.
Returns: None.
*---------------------------------------------------------------------------*/
void
TwlSpMain(void)
{
OSHeapHandle heapHandle;
// OS初期化でARM9と同期する前にSCFGの情報を共有メモリに書き出す
// レジスタ情報をコピー
MI_CpuMove16( (void*)REG_ROM_ADDR, DISPINFO_SHARED_SCFG_REG_ADDR, DISPINFO_SHARED_SCFG_REG_SIZE );
// WRAMに退避されてる分もコピー
MI_CpuMove16( (void*)HWi_WSYS04_ADDR, DISPINFO_SHARED_SCFG_WRAM_ADDR, DISPINFO_SHARED_SCFG_WRAM_SIZE );
/* OS 初期化 */
OS_Init();
PrintDebugInfo();
/* NVRAM からユーザー情報読み出し */
ReadUserInfo();
/* ヒープ領域設定 */
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();
/* 各ライブラリ初期化 */
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); // マイコン
CDC_InitLib(); // CODEC
// if (OSi_IsCodecTwlMode() == TRUE)
// {
// CAMERA_Init(); // カメラ
// }
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);
while (TRUE)
{
OS_Halt();
/* ソフトウェアリセット要求は監視しない */
/* AGB カートリッジの挿抜チェックは行わない */
/* DS カードの挿抜チェックは行わない */
}
}
/*---------------------------------------------------------------------------*
Name: PrintDebugInfo
Description: ARM7
Arguments: None.
Returns: None.
*---------------------------------------------------------------------------*/
static void
PrintDebugInfo(void)
{
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;
}
/*---------------------------------------------------------------------------*
Name: InitializeFatfs
Description: FATFSライブラリを初期化するFATFS初期化関数内でスレッド休止
Arguments: None.
Returns: None.
*---------------------------------------------------------------------------*/
static void
InitializeFatfs(void)
{
OSThread thread;
u32 stack[18];
/* ダミースレッド作成 */
OS_CreateThread(&thread, DummyThread, NULL,
(void*)((u32)stack + (sizeof(u32) * 18)), sizeof(u32) * 18, OS_THREAD_PRIORITY_MAX);
OS_WakeupThreadDirect(&thread);
/* FATFS 初期化 */
/* [TODO] DMA は NOT_USE のままで良い? */
if(!FATFS_Init(DMA_NO_FATFS, FATFS_DMA_NOT_USE, THREAD_PRIO_FATFS))
{
/* do nothing */
}
/* ダミースレッド破棄 */
OS_KillThread(&thread, NULL);
}
/*---------------------------------------------------------------------------*
Name: InitializeNwm
Description: NWMライブラリを初期化する
Arguments: hh -
Returns: None.
*---------------------------------------------------------------------------*/
static void
InitializeNwm(OSHeapHandle hh)
{
NwmspInit nwmInit;
/* [TODO] 確保しているヒープ領域が新無線一式が必要としているメモリ量以上かのチェックが必要 */
nwmInit.cmdPrio = THREAD_PRIO_NWM_COMMAND;
nwmInit.evtPrio = THREAD_PRIO_NWM_EVENT;
nwmInit.sdioPrio = THREAD_PRIO_NWM_SDIO;
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);
}
/*---------------------------------------------------------------------------*
Name: DummyThread
Description: FATFSライブラリCDCライブラリを初期化する際に立てるダミーの
Arguments: arg - 使
Returns: None.
*---------------------------------------------------------------------------*/
static void
DummyThread(void* arg)
{
#pragma unused(arg)
while (TRUE)
{
}
}
#ifdef WM_PRECALC_ALLOWEDCHANNEL
extern u16 WMSP_GetAllowedChannel(u16 bitField);
#endif
/*---------------------------------------------------------------------------*
Name: ReadUserInfo
Description: NVRAMからユーザー情報を読み出し
Arguments: None.
Returns: None.
*---------------------------------------------------------------------------*/
static void ReadUserInfo(void)
{
s32 offset;
#ifdef NVRAM_CONFIG_DATA_EX_VERSION
NVRAMConfigEx temp[2];
#else
NVRAMConfig temp[2];
#endif
s32 check;
u8 *p = OS_GetSystemWork()->nvramUserInfo;
// オフセット読み出し
#ifdef NVRAM_CONFIG_CONST_ADDRESS
offset = NVRAM_CONFIG_DATA_ADDRESS_DUMMY;
#else
NVRAM_ReadDataBytes(NVRAM_CONFIG_DATA_OFFSET_ADDRESS, NVRAM_CONFIG_DATA_OFFSET_SIZE,
(u8 *)(&offset));
offset <<= NVRAM_CONFIG_DATA_OFFSET_SHIFT;
#endif
#ifdef NVRAM_CONFIG_DATA_EX_VERSION
// ミラーされた2つのデータを読み出し
NVRAM_ReadDataBytes((u32)offset, sizeof(NVRAMConfigEx), (u8 *)(&temp[0]));
NVRAM_ReadDataBytes((u32)(offset + SPI_NVRAM_PAGE_SIZE), sizeof(NVRAMConfigEx),
(u8 *)(&temp[1]));
// 2つの内どちらを使うか判断
check = CheckCorrectNCDEx(temp);
#else
// ミラーされた2つのデータを読み出し
NVRAM_ReadDataBytes((u32)offset, sizeof(NVRAMConfig), (u8 *)(&temp[0]));
NVRAM_ReadDataBytes((u32)(offset + SPI_NVRAM_PAGE_SIZE), sizeof(NVRAMConfig), (u8 *)(&temp[1]));
// 2つの内どちらを使うか判断
check = CheckCorrectNCD(temp);
#endif
if (check >= 3)
{
// アプリケーションの起動を抑制
MI_CpuFill32(p, 0xffffffff, sizeof(NVRAMConfig));
}
else if (check)
{
s32 i;
// ニックネームを補正
if (temp[check - 1].ncd.owner.nickname.length < NVRAM_CONFIG_NICKNAME_LENGTH)
{
for (i = NVRAM_CONFIG_NICKNAME_LENGTH;
i > temp[check - 1].ncd.owner.nickname.length; i--)
{
temp[check - 1].ncd.owner.nickname.str[i - 1] = 0x0000;
}
}
// コメントを補正
if (temp[check - 1].ncd.owner.comment.length < NVRAM_CONFIG_COMMENT_LENGTH)
{
for (i = NVRAM_CONFIG_COMMENT_LENGTH; i > temp[check - 1].ncd.owner.comment.length;
i--)
{
temp[check - 1].ncd.owner.comment.str[i - 1] = 0x0000;
}
}
// 共有領域にストア
MI_CpuCopy32(&temp[check - 1], p, sizeof(NVRAMConfig));
}
else
{
// 共有領域をクリア
MI_CpuClear32(p, sizeof(NVRAMConfig));
}
// 無線MACアドレスをユーザー情報の後ろに展開
{
u8 wMac[6];
// NVRAMからMACアドレスを読み出し
NVRAM_ReadDataBytes(NVRAM_CONFIG_MACADDRESS_ADDRESS, 6, wMac);
// 展開先アドレスを計算
p = (u8 *)((u32)p + ((sizeof(NVRAMConfig) + 3) & ~0x00000003));
// 共有領域に展開
MI_CpuCopy8(wMac, p, 6);
}
#ifdef WM_PRECALC_ALLOWEDCHANNEL
// 使用可能チャンネルから使用許可チャンネルを計算
{
u16 enableChannel;
u16 allowedChannel;
// 使用可能チャンネルを読み出し
NVRAM_ReadDataBytes(NVRAM_CONFIG_ENABLECHANNEL_ADDRESS, 2, (u8 *)(&enableChannel));
// 使用許可チャンネルを計算
allowedChannel = WMSP_GetAllowedChannel((u16)(enableChannel >> 1));
// 展開先アドレスを計算(MACアドレスの後ろの2バイト)
p = (u8 *)((u32)p + 6);
// 共有領域に展開
*((u16 *)p) = allowedChannel;
}
#endif
}
#ifdef NVRAM_CONFIG_DATA_EX_VERSION
/*---------------------------------------------------------------------------*
Name: IsValidConfigEx
Description: 調
Arguments: None.
Returns: BOOL - TRUEを返す
FALSEを返す
*---------------------------------------------------------------------------*/
static BOOL IsValidConfigEx(void)
{
u8 ipl2_type;
NVRAM_ReadDataBytes(NVRAM_CONFIG_IPL2_TYPE_ADDRESS, NVRAM_CONFIG_IPL2_TYPE_SIZE, &ipl2_type);
if (ipl2_type == NVRAM_CONFIG_IPL2_TYPE_NORMAL)
{
return FALSE;
}
if (ipl2_type & NVRAM_CONFIG_IPL2_TYPE_EX_MASK)
{
return TRUE;
}
return FALSE;
}
/*---------------------------------------------------------------------------*
Name: GetRomValidLanguage
Description: ROM内登録エリアの情報から
Arguments: None.
Returns: u16 - DSカード
DSカードが拡張言語
0
*---------------------------------------------------------------------------*/
static u16 GetRomValidLanguage(void)
{
u16 ret = 0x0000;
u8 langBit = OS_GetSystemWork()->rom_header[0x1d];
// ROM内登録エリアの拡張言語コードを確認
if (langBit == ROMHEADER_FOR_CHINA_BIT)
{
// for CHINA
ret |= (0x0001 << NVRAM_CONFIG_LANG_CHINESE);
}
else if (langBit == ROMHEADER_FOR_KOREA_BIT)
{
// for KOREA
ret |= (0x0001 << NVRAM_CONFIG_LANG_HANGUL);
}
return ret;
}
/*---------------------------------------------------------------------------*
Name: CheckCorrectNCDEx
Description: 使
Arguments: nvdsp -
Returns: s32 - 0:
1: [ 0 ]
2: [ 1 ]
3:
*---------------------------------------------------------------------------*/
static s32 CheckCorrectNCDEx(NVRAMConfigEx * ncdsp)
{
u16 i;
u16 calc_crc;
s32 crc_flag = 0;
u16 saveCount;
// IPLが拡張言語コードに対応しているか
if (IsValidConfigEx())
{
// IPLが拡張言語コードに対応している場合
u16 rom_valid_language = GetRomValidLanguage();
for (i = 0; i < 2; i++)
{
calc_crc = SVC_GetCRC16(0xffff, (void *)(&ncdsp[i].ncd), sizeof(NVRAMConfigData));
if ((ncdsp[i].crc16 == calc_crc) && (ncdsp[i].saveCount < NVRAM_CONFIG_SAVE_COUNT_MAX))
{
// CRC が正しく saveCount 値が 0x80 未満のデータを正当と判断
calc_crc =
SVC_GetCRC16(0xffff, (void *)(&ncdsp[i].ncd_ex), sizeof(NVRAMConfigDataEx));
if ((ncdsp[i].crc16_ex == calc_crc)
&& ((0x0001 << ncdsp[i].ncd_ex.language) &
(ncdsp[i].ncd_ex.valid_language_bitmap)))
{
// 拡張データ用 CRC が正しく、設定言語コードが対応言語コードに含まれる場合に正当と判断
if (rom_valid_language & ncdsp[i].ncd_ex.valid_language_bitmap)
{
// 拡張言語コードで通常言語コードを上書き
ncdsp[i].ncd.option.language = ncdsp[i].ncd_ex.language;
}
if (rom_valid_language & (0x0001 << NVRAM_CONFIG_LANG_CHINESE) & ~ncdsp[i].
ncd_ex.valid_language_bitmap)
{
// ROM 内登録エリアに"中国語"拡張言語コードが設定されているが、
// IPL2の対応言語コードに"中国語"拡張言語コードが含まれない場合は起動を抑制
return 3;
}
crc_flag |= (1 << i);
}
}
}
}
else
{
// IPLが拡張言語コードに対応していない場合
u16 rom_valid_language = GetRomValidLanguage();
if (rom_valid_language & (0x0001 << NVRAM_CONFIG_LANG_CHINESE))
{
// ROM 内登録エリアに"中国語"拡張言語コードが設定されている場合は起動を抑制
return 3;
}
for (i = 0; i < 2; i++)
{
calc_crc = SVC_GetCRC16(0xffff, (void *)(&ncdsp[i].ncd), sizeof(NVRAMConfigData));
if ((ncdsp[i].crc16 == calc_crc) && (ncdsp[i].saveCount < NVRAM_CONFIG_SAVE_COUNT_MAX))
{
// CRC が正しく saveCount 値が 0x80 未満のデータを正当と判断
crc_flag |= (1 << i);
}
}
}
// 正当なデータのうちどのデータが有効かを判定する。
switch (crc_flag)
{
case 1:
case 2:
// 片方のCRCだけ正常
return crc_flag;
case 3:
// 両方ともCRCが正しければどちらが最新のデータか判断する。
saveCount = (u8)((ncdsp[0].saveCount + 1) & NVRAM_CONFIG_SAVE_COUNT_MASK);
if (saveCount == ncdsp[1].saveCount)
{
return 2;
}
return 1;
}
// 両方ともCRCが不正
return 0;
}
#else
/*---------------------------------------------------------------------------*
Name: CheckCorrectNCD
Description: 使
Arguments: nvdsp -
Returns: s32 - 0:
1: [ 0 ]
2: [ 1 ]
*---------------------------------------------------------------------------*/
static s32 CheckCorrectNCD(NVRAMConfig *ncdsp)
{
u16 i;
u16 calc_crc;
s32 crc_flag = 0;
u16 saveCount;
// 各ミラーデータのCRC & saveCount正当性チェック
for (i = 0; i < 2; i++)
{
calc_crc = SVC_GetCRC16(0xffff, (void *)(&ncdsp[i].ncd), sizeof(NVRAMConfigData));
if ((ncdsp[i].crc16 == calc_crc) && (ncdsp[i].saveCount < NVRAM_CONFIG_SAVE_COUNT_MAX))
{
// CRCが正しく、saveCount値が0x80未満のデータを正当と判断。
crc_flag |= (1 << i);
}
}
// 正当なデータのうちどのデータが有効かを判定する。
switch (crc_flag)
{
case 1:
case 2:
// 片方のCRCだけ正常
return crc_flag;
case 3:
// 両方ともCRCが正しければどちらが最新のデータか判断する。
saveCount = (u8)((ncdsp[0].saveCount + 1) & NVRAM_CONFIG_SAVE_COUNT_MASK);
if (saveCount == ncdsp[1].saveCount)
{
return 2;
}
return 1;
}
// 両方ともCRCが不正
return 0;
}
#endif
/*---------------------------------------------------------------------------*
Name: VBlankIntr
Description: V
Arguments: None.
Returns: None.
*---------------------------------------------------------------------------*/
extern BOOL PMi_Initialized;
extern void PM_SelfBlinkProc(void);
static void
VBlankIntr(void)
{
if (PMi_Initialized)
{
PM_SelfBlinkProc();
}
}

View File

@ -0,0 +1,224 @@
/*---------------------------------------------------------------------------*
Project: TwlSDK - components - armadillo.TWL
File: overwriteRtc.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:: $
$Rev$
$Author$
*---------------------------------------------------------------------------*/
#include <twl/types.h>
#include <nitro/rtc/common/fifo.h>
#include <twl/memorymap_sp.h>
#include <twl/hw/common/mmap_wramEnv.h>
#include <twl/code32/j>
extern BOOL RTC_IsAvailablePxiCommand(u16 command);
extern void INIT_InitializeScfg(void);
/*---------------------------------------------------------------------------*
Name: RTC_IsAvailablePxiCommand
Description: PXI RTC 調
Arguments: command - 調
Returns: BOOL - TRUE
FALSE
*---------------------------------------------------------------------------*/
BOOL
RTC_IsAvailablePxiCommand(u16 command)
{
switch (command)
{
case RTC_PXI_COMMAND_RESET:
case RTC_PXI_COMMAND_SET_HOUR_FORMAT:
case RTC_PXI_COMMAND_READ_DATETIME:
case RTC_PXI_COMMAND_READ_DATE:
case RTC_PXI_COMMAND_READ_TIME:
case RTC_PXI_COMMAND_READ_PULSE:
case RTC_PXI_COMMAND_READ_ALARM1:
case RTC_PXI_COMMAND_READ_ALARM2:
case RTC_PXI_COMMAND_READ_STATUS1:
case RTC_PXI_COMMAND_READ_STATUS2:
case RTC_PXI_COMMAND_READ_ADJUST:
case RTC_PXI_COMMAND_READ_FREE:
case RTC_PXI_COMMAND_WRITE_DATETIME:
case RTC_PXI_COMMAND_WRITE_DATE:
case RTC_PXI_COMMAND_WRITE_TIME:
case RTC_PXI_COMMAND_WRITE_PULSE:
case RTC_PXI_COMMAND_WRITE_ALARM1:
case RTC_PXI_COMMAND_WRITE_ALARM2:
case RTC_PXI_COMMAND_WRITE_STATUS1:
case RTC_PXI_COMMAND_WRITE_STATUS2:
case RTC_PXI_COMMAND_WRITE_ADJUST:
case RTC_PXI_COMMAND_WRITE_FREE:
return TRUE;
}
return FALSE;
}
/*---------------------------------------------------------------------------*
Name: INIT_InitializeScfg
Description: SCFG
crt0
Arguments: None.
Returns: None.
*---------------------------------------------------------------------------*/
asm void
INIT_InitializeScfg(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
}

View File

@ -0,0 +1,81 @@
#/*---------------------------------------------------------------------------*
# Project: TwlIPL - tests - DisplaySystemInformation
# File: makefile
#
# Copyright **** Nintendo. All rights reserved.
#
# These coded instructions, statements, and computer programs contain
# proprietary information of Nintendo of America Inc. and/or Nintendo
# Company Ltd., and are protected by Federal copyright law. They may
# not be disclosed to third parties or copied or duplicated in any form,
# in whole or in part, without the prior written consent of Nintendo.
#
# $Date:: $
# $Rev:$
# $Author:$
# *---------------------------------------------------------------------------*/
TARGET_FIRM = SYSTEMMENU
TARGET_PLATFORM = TWL
TWL_ARCHGEN = LIMITED
DISP_INFO = $(TWL_IPL_RED_ROOT)/build/tests/DisplaySystemInformation
SUBDIRS =
MISC_DIR = ../../../systemMenu_RED/misc
SRCS = main.c viewSystemInfo.c drawFunc.c control.c\
strResource.c misc.c \
$(MISC_DIR)/src/cmn.c
LINCLUDES += $(MISC_DIR)/include \
$(DISP_INFO)/common/include
SYSMENU_LIBS = \
liblcfg$(TWL_LIBSUFFIX).a \
libsysmenu$(TWL_LIBSUFFIX).a \
libsysmmcu$(TWL_LIBSUFFIX).a \
libsysmutil$(TWL_LIBSUFFIX).a \
libbanner$(TWL_LIBSUFFIX).a \
libboot$(TWL_LIBSUFFIX).a \
libds$(TWL_LIBSUFFIX).a \
libhotsw$(TWL_LIBSUFFIX).a \
libdht$(TWL_LIBSUFFIX).a \
libreloc_info$(TWL_LIBSUFFIX).a \
libnamut$(TWL_LIBSUFFIX).a \
libsharedfont_launcher$(TWL_LIBSUFFIX).a \
WDS$(TWL_LIBSUFFIX).a
SDK_APPEND_LIBS = \
libes$(TWL_LIBSUFFIX).a \
libboc$(TWL_LIBSUFFIX).a \
libsfs$(TWL_LIBSUFFIX).a \
libnam$(TWL_LIBSUFFIX).a \
libsea$(TWL_LIBSUFFIX).a \
libreboot$(TWL_LIBSUFFIX).a \
LLIBRARIES += $(SYSMENU_LIBS) $(SDK_APPEND_LIBS)
TARGET_BIN = main.srl
ROM_SPEC = main.rsf
include $(TWL_IPL_RED_ROOT)/build/buildtools/commondefs
MAKEROM = $(TWL_TOOLSDIR)/bin/makerom.TWL.secure.exe
DEFAULT_COMP_ARM7 = armadillo
DEFAULT_MAKEROM_ARM7_BASE = ../ARM7/bin/$(TWL_BUILDTYPE_ARM7)/$(DEFAULT_COMP_ARM7)
DEFAULT_MAKEROM_ARM7 = $(DEFAULT_MAKEROM_ARM7_BASE).$(TWL_ELF_EXT)
#----------------------------------------------------------------------------
do-build: $(TARGETS)
#----------------------------------------------------------------------------
include $(TWL_IPL_RED_ROOT)/build/buildtools/modulerules
#include $(TWLSDK_ROOT)/build/buildtools/modulerules
#include $(TWL_IPL_RED_ROOT)/build/tests/RelocateChecker/buildtools/modulerules
#===== End of Makefile =====

View File

@ -0,0 +1,245 @@
#----------------------------------------------------------------------------
# Project: TwlSDK - include
# File: ROM-TS.rsf
#
# 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:: $
# $Rev$
# $Author$
#----------------------------------------------------------------------------
#
# TWL ROM SPEC FILE
#
Arm9
{
Static "$(MAKEROM_ARM9:r).TWL.FLX.sbin$(COMPSUFFIX9)"
OverlayDefs "$(MAKEROM_ARM9:r)_defs.TWL.FLX.sbin$(COMPSUFFIX9)"
OverlayTable "$(MAKEROM_ARM9:r)_table.TWL.FLX.sbin$(COMPSUFFIX9)"
Elf "$(MAKEROM_ARM9:r).tef"
}
Arm7
{
Static "$(MAKEROM_ARM7_BASE:r).TWL.FLX.sbin$(COMPSUFFIX7)"
OverlayDefs "$(MAKEROM_ARM7_BASE:r)_defs.TWL.FLX.sbin$(COMPSUFFIX7)"
OverlayTable "$(MAKEROM_ARM7_BASE:r)_table.TWL.FLX.sbin$(COMPSUFFIX7)"
Elf "$(MAKEROM_ARM7_BASE:r).tef"
}
Arm9.Ltd
{
Static "$(MAKEROM_ARM9:r).TWL.LTD.sbin$(COMPSUFFIX9)"
OverlayDefs "$(MAKEROM_ARM9:r)_defs.TWL.LTD.sbin$(COMPSUFFIX9)"
OverlayTable "$(MAKEROM_ARM9:r)_table.TWL.LTD.sbin$(COMPSUFFIX9)"
}
Arm7.Ltd
{
Static "$(MAKEROM_ARM7_BASE:r).TWL.LTD.sbin$(COMPSUFFIX7)"
OverlayDefs "$(MAKEROM_ARM7_BASE:r)_defs.TWL.LTD.sbin$(COMPSUFFIX7)"
OverlayTable "$(MAKEROM_ARM7_BASE:r)_table.TWL.LTD.sbin$(COMPSUFFIX7)"
}
Property
{
###
### Settings for FinalROM
###
#### BEGIN
#
# TITLE NAME: Your product name within 12bytes
#
#TitleName "YourAppName"
#
# MAKER CODE: Your company ID# in 2 ascii words
# issued by NINTENDO
#
#MakerCode "00"
#
# REMASTER VERSION: Mastering version
#
#RomVersion 0
#
# ROM SPEED TYPE: [MROM/1TROM/UNDEFINED]
#
RomSpeedType $(MAKEROM_ROMSPEED)
#
# ROM SIZE: in bit [64M/128M/256M/512M/1G/2G]
#
#RomSize 128M
#RomSize 256M
#
# ROM PADDING: TRUE if finalrom
#
#RomFootPadding TRUE
#
# ROM HEADER TEMPLATE: Provided to every product by NINTENDO
#
#RomHeaderTemplate ./etc/rom_header.template.sbin
#
# BANNER FILE: generated from Banner Spec File
#
#BannerFile ./etc/myGameBanner.bnr
BannerFile $(TWLSDK_ROOT)/include/twl/specfiles/default.bnr
#
# Permit LandingNormalJump: for TWL "ApplicationJump" function [TRUE/FALSE]
#
#PermitLandingNormalJump FALSE
#
# Permit LandingTmpJump: for TWL "ApplicationJump" function [TRUE/FALSE]
#
#PermitLandingTmpJump FALSE
###
### Setting for TWL
###
#
# ROM HEADER Ltd: Provided to every product by NINTENDO
#
RomHeaderLtd $(TWLSDK_ROOT)/tools/bin/rom_header.LTD.sbin
#
# Digest parameters:
#
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]
# don't have to edit
#
WramMapping MAP_TS_SCR
#
# CardRegion: card region [Japan/America/Europe/Australia/China/Korea]
#
CardRegion Japan
#
# CommonClientKey: launcher deliver common client Key [TRUE/FALSE]
#
#CommonClientKey FALSE
#
# HwAESSlotB: launcher deliver HW AES slot B setting [TRUE/FALSE]
#
#HwAESSlotB FALSE
#
# HwAESSlotC: launcher deliver HW AES slot C setting [TRUE/FALSE]
#
#HwAESSlotC FALSE
#
# SDCardAccess: sd card access control [TRUE/FALSE]
#
#SDCardAccess FALSE
#
# NANDAccess: NAND access control [TRUE/FALSE]
#
#NANDAccess FALSE
NANDAccess TRUE
#
# Codec mode:
# don't have to edit
#
CodecMode $(MAKEROM_CODEC_MODE)
#
# Disp WiFiConnection Icon for Launcher [TRUE/FALSE]
#
#WiFiConnectionIcon FALSE
#
# Disp DSWireless Icon for Launcher [TRUE/FALSE]
#
#DSWirelessIcon FALSE
LockSCFG FALSE
###
#### END
}
AppendProperty
{
#
# Publisher : "Nintendo"
# don't have to edit
Publisher Nintendo
#
# Application type : [USER/SYSTEM]
# don't have to edit
AppType SYSTEM
#
# launch title on the launcher : [TRUE/FALSE]
# don't have to edit
Launch TRUE
#
# Boot allowed Media: [GameCard]
#
Media NAND
#
# Data only title : [TRUE/FALSE]
# don't have to edit
#DataOnly FALSE
#
# Secure title : [TRUE/FALSE]
# don't have to edit
Secure TRUE
#
# GameCode for TitleID : Your GameCode in 4 ascii words
#
GameCode ABCJ
#
# Public save data size: [0K/16K/32K/64K/128K/256K/512K/1M/2M/4M]
#
#PublicSaveDataSize 32K
#
# Private save data size: [0K/16K/32K/64K/128K/256K/512K/1M/2M/4M]
#
#PrivateSaveDataSize 16K
#
# Enable SubBannerFile
#SubBannerFile TRUE
}
RomSpec
{
Offset 0x00000000
Segment ALL
HostRoot ../../../systemMenu_RED/data
Root /data
File NTR_IPL_font_m.NFTR
}

View File

@ -0,0 +1,139 @@
/*---------------------------------------------------------------------------*
Project: TwlIPL - tests - DisplaySystemInformation
File: control.c
Copyright **** Nintendo. All rights reserved.
These coded instructions, statements, and computer programs contain
proprietary information of Nintendo of America Inc. and/or Nintendo
Company Ltd., and are protected by Federal copyright law. They may
not be disclosed to third parties or copied or duplicated in any form,
in whole or in part, without the prior written consent of Nintendo.
$Date:: $
$Rev:$
$Author:$
*---------------------------------------------------------------------------*/
#include <twl.h>
#include "misc.h"
#include "drawFunc.h"
#include "control.h"
#include "strResource.h"
static int selectLine[ROOTMENU_SIZE+1];
BOOL control( int *menu, int *line )
{
int linemax = s_numMenu[*menu]; // 選択中ページの項目数
BOOL controlFlag = FALSE; // 何か操作があったらTRUEになる
// 上下で項目変更
if( pad.trg & PAD_KEY_UP )
{
controlFlag = TRUE;
if( --(*line) < 0 )
{
// ラインをデクリメントした結果マイナスになったら一番最後へ
*line = linemax - 1;
}
}
else if( pad.trg & PAD_KEY_DOWN )
{
controlFlag = TRUE;
if( ++(*line) >= linemax )
{
// ラインをインクリメントした結果、maxlineを超えたら最初へ
*line = 0;
}
}
// 左右でページ送り
if( pad.trg & PAD_KEY_RIGHT )
{
controlFlag = TRUE;
*line += DISP_NUM_LINES - 2;
if( *line >= linemax )
{
*line = linemax - 1;
}
}
else if( pad.trg & PAD_KEY_LEFT )
{
controlFlag = TRUE;
*line -= DISP_NUM_LINES - 2;
if( *line < 0 )
{
*line = 0;
}
}
if( pad.trg & PAD_BUTTON_A )
{
controlFlag = TRUE;
if(*menu == MENU_ROOT)
{
// 今の画面の選択位置を記録
selectLine[ROOTMENU_SIZE] = *line;
// 次のメニュー画面を開く
*menu = *line;
*line = selectLine[*menu];
}
else
{
// !!! 設定可能な項目だったら設定変更画面
}
}
if( pad.trg & PAD_BUTTON_B )
{
if( *menu != MENU_ROOT )
{
// !!! とりあえず今はルートに戻る
// 値設定画面の時はキャンセルするだけにする
controlFlag = TRUE;
selectLine[*menu] = *line;
*menu = MENU_ROOT;
*line = selectLine[ROOTMENU_SIZE];
}
}
return controlFlag;
}
int getMaxPage( int menu )
{
// 表示中メニューのページが何ページあるのか
int i;
if( menu == MENU_ROOT ) return 0;
for(i=0; i<MAXPAGE; i++ )
{
if( s_pageOffset[menu][i] == s_numMenu[menu] )
{
return i;
}
}
return 0;
}
int getMaxLine( int menu , int page )
{
// 表示中メニューにおける現在のページが何項目あるのか
if( menu == MENU_ROOT) return ROOTMENU_SIZE;
return s_pageOffset[menu][page+1] - s_pageOffset[menu][page];
}

View File

@ -0,0 +1,36 @@
/*---------------------------------------------------------------------------*
Project: TwlIPL - tests - DisplaySystemInformation
File: control.h
Copyright **** Nintendo. All rights reserved.
These coded instructions, statements, and computer programs contain
proprietary information of Nintendo of America Inc. and/or Nintendo
Company Ltd., and are protected by Federal copyright law. They may
not be disclosed to third parties or copied or duplicated in any form,
in whole or in part, without the prior written consent of Nintendo.
$Date:: $
$Rev:$
$Author:$
*---------------------------------------------------------------------------*/
#ifndef __DISPLAY_SYSTEM_CONTROL_H__
#define __DISPLAY_SYSTEM_CONTROL_H__
#include <twl.h>
#ifdef __cplusplus
extern "C" {
#endif
BOOL control( int *menu, int *line );
int getMaxPage( int menu );
int getMaxLine( int menu , int page );
#ifdef __cplusplus
}
#endif
#endif

View File

@ -0,0 +1,604 @@
/*---------------------------------------------------------------------------*
Project: TwlIPL - tests - DisplaySystemInformation
File: drawFunc.c
Copyright **** Nintendo. All rights reserved.
These coded instructions, statements, and computer programs contain
proprietary information of Nintendo of America Inc. and/or Nintendo
Company Ltd., and are protected by Federal copyright law. They may
not be disclosed to third parties or copied or duplicated in any form,
in whole or in part, without the prior written consent of Nintendo.
$Date:: $
$Rev:$
$Author:$
*---------------------------------------------------------------------------*/
#include <twl.h>
#include <wchar.h>
#include <string.h>
#include <twl/os/common/ownerInfoEx_private.h>
#include "drawFunc.h"
#include "viewSystemInfo.h"
#include "misc.h"
#include "strResource.h"
#include "myIoreg_SCFG.h"
// 描画関連
#define HEADER_UP 0
#define HEADER_LEFT 10
#define PAGE_LEFT 160
#define FOOTER_UP 140
#define FOOTER_LEFT 10
#define ALLOW_LEFT 0
#define AST_LEFT ( ALLOW_LEFT + LINE_OFFSET )
#define KIND_UP 10 // 項目名の上座標
#define KIND_LEFT ( AST_LEFT + 10 ) // 項目名の左座標
#define VALUE_UP KIND_UP // 項目値の上座標
#define VALUE_LEFT 140 // 項目値の左座標
#define LINE_OFFSET 15 // 1行ごとのオフセット
#define ROW_OFFSET 15 // 長い項目が現れたときの段組用
#define REGISTER_NAME_LEFT 10
#define REGISTER_NAME_UP 15
#define REGISTER_DATA_LEFT 100
#define REGISTER_DATA_UP 15
#define SCROLL_MARGIN 2 // 画面端何行でスクロールするか
#define UNIQUE_BUF 12
#define BINARY_BUF 20
/* global variables -------------------- */
static int gDrawIdx[ROOTMENU_SIZE]; // 今何項目目から下を描画しているのか
static int gMenuLineSize[ROOTMENU_SIZE] = {};// 各メニューの全体行数
int gMenuKindOffset[ROOTMENU_SIZE][MAXITEM];
/* function prototypes -------------------- */
void printData( int x, int y, int color, DispInfoEntry *entry );
void printValue( int menu,int entryLine, int drawOffset, DispInfoEntry *entry );
void printKindName( int menu, int entryLine, int drawOffset, int selected );
void printBinary16( int x, int y, u16 value );
void printBinary32( int x, int y, u32 value );
void drawRegister( int menu, int selected );
void drawOwnerMenu( int page, int linenum, int valueIdx, char** info, int* kindOffset, const int* pageOffset);
void drawParentalMenu( int page, int linenum, int valueIdx, char** info, int* kindOffset, const int* pageOffset);
void drawNormalHWMenu( int page, int linenum, int valueIdx, char** info, int* kindOffset, const int* pageOffset);
void drawSecureHWMenu( int page, int linenum, int valueIdx, char** info, int* kindOffset, const int* pageOffset);
void drawSCFGARM7Menu( int page, int linenum, int valueIdx, char** info, int* kindOffset, const int* pageOffset);
void drawSCFGARM9Menu( int page, int linenum, int valueIdx, char** info, int* kindOffset, const int* pageOffset);
void drawVersionMenu( int page, int linenum, int valueIdx, char** info, int* kindOffset, const int* pageOffset);
void printUniqueID( int drawLineOffset, char *uniqueId );
int getPageNum( int valueIdx, const int* pageOffset );
int countMenuLine( int menu );
void drawHeader( int menu, int line)
// 画面端に簡単な情報を表示する
{
u16 buf[256];
PutStringUTF16Sub( HEADER_LEFT, HEADER_UP, TXT_COLOR_RED, (const u16 *)L"DisplaySystemInfo");
if( menu != MENU_ROOT )
{
swprintf(buf, 256, L"Root > %s", s_strMenuName[menu] );
PutStringUTF16Sub( FOOTER_LEFT, FOOTER_UP + LINE_OFFSET, TXT_COLOR_BLUE, buf );
swprintf(buf, 256, L"%d / %d", line+1 , s_numMenu[menu] );
PutStringUTF16Sub( FOOTER_LEFT, FOOTER_UP + 2*LINE_OFFSET, TXT_COLOR_BLUE, buf );
}
else
{
PutStringUTF16Sub( FOOTER_LEFT, FOOTER_UP + LINE_OFFSET, TXT_COLOR_BLUE, (const u16 *)L"Root" );
swprintf(buf, 256, L"%d / %d", line+1 , ROOTMENU_SIZE );
PutStringUTF16Sub( FOOTER_LEFT, FOOTER_UP + 2*LINE_OFFSET, TXT_COLOR_BLUE, buf );
}
PutStringUTF16Sub( FOOTER_LEFT, FOOTER_UP, TXT_COLOR_BLUE, (const u16 *)L" A: Decide B: Back ");
}
void printData( int x, int y, int color, DispInfoEntry *entry )
{
if( entry->isNumData )
{
// 数値データだったらそのままプリント
PrintfSJIS( x, y, color, "%d", entry->iValue );
}
else if( entry->isSjis )
{
// SJIS文字列
PrintfSJIS( x, y, color, "%s", entry->str.sjis );
}
else
{
// UTF16文字列
PutStringUTF16( x, y, color, entry->str.utf );
}
}
int countMenuLine( int menu )
{
int i;
int sum = 0;
for( i=0; i<s_numMenu[menu]; i++ )
{
sum += gAllInfo[menu][i].numLines;
}
return sum;
}
void printKindName( int menu, int entryLine, int drawOffset, int selected )
{
int kindColor = TXT_COLOR_BLACK;
// 項目名描画
if( entryLine == selected)
{
// 選択項目はいろかえる
kindColor = TXT_COLOR_GREEN;
PutStringUTF16( ALLOW_LEFT, KIND_UP + LINE_OFFSET*drawOffset, TXT_COLOR_BLACK, (const u16 *)L"");
}
if( menu != MENU_ROOT && gAllInfo[menu][entryLine].changable )
{
PutStringUTF16( AST_LEFT, KIND_UP + LINE_OFFSET*drawOffset, kindColor, (const u16 *) L"*");
}
PrintfSJIS( KIND_LEFT, KIND_UP + LINE_OFFSET*drawOffset , kindColor, s_strMetaMenu[menu][entryLine] );
}
void printValue( int menu,int entryLine, int drawOffset, DispInfoEntry *entry )
{
// 特殊描画を行う必要がある場合の処理
if( menu == MENU_OWNER && entryLine == OWNER_COLOR )
{
PrintfSJIS( VALUE_LEFT , VALUE_UP + LINE_OFFSET*drawOffset, TXT_UCOLOR_G0 + entry->iValue , "" );
printData( VALUE_LEFT + LINE_OFFSET , VALUE_UP + LINE_OFFSET*drawOffset, TXT_COLOR_BLACK, entry );
return;
}
if( menu == MENU_SECURE_HW && entryLine == SECURE_HW_UNIQUE_ID )
{
printUniqueID( drawOffset, entry->str.sjis );
entry->numLines = 4;
return;
}
// 通常の値の描画
if( entry->isAligned )
{
printData( VALUE_LEFT, VALUE_UP + LINE_OFFSET*drawOffset, TXT_COLOR_BLACK, entry );
}
else
{
// 項目名が長くて字下げが必要な場合
printData( VALUE_LEFT, VALUE_UP + LINE_OFFSET* ( drawOffset + 1 ), TXT_COLOR_BLACK, entry );
}
}
void drawRegister( int menu, int selected )
{
// SCFGレジスタのバイナリをサブ画面に描画する
u32 regState = 0;
DispInfoEntry *p;
int drawOffset = 0;
if( menu == MENU_SCFG_ARM7 && selected < SCFG_ARM7_MI_SC1_CDET)
{
// ARM7の前半4つ
u32 regRom = 0;
u16 regClk = 0;
u16 regJtag = 0;
u32 regExt = 0;
p = gAllInfo[MENU_SCFG_ARM7];
regRom =(u32)(
p[SCFG_ARM7_ROM_ARM9_SEC].iValue << DISP_REG_SCFG_ROM_ARM9SEL_SHIFT |
p[SCFG_ARM7_ROM_ARM9_RSEL].iValue << DISP_REG_SCFG_ROM_ARM9RSEL_SHIFT |
p[SCFG_ARM7_ROM_ARM9_SEC].iValue << DISP_REG_SCFG_ROM_ARM7SEL_SHIFT |
p[SCFG_ARM7_ROM_ARM7_RSEL].iValue << DISP_REG_SCFG_ROM_ARM7RSEL_SHIFT |
p[SCFG_ARM7_ROM_ARM7_FUSE].iValue << DISP_REG_SCFG_ROM_ARM7FUSE_SHIFT |
p[SCFG_ARM7_ROM_WE].iValue << DISP_REG_SCFG_ROM_ROMWE_SHIFT
);
regClk =(u16)(
p[SCFG_ARM7_CLK_SD1].iValue << DISP_REG_SCFG_CLK_SD1HCLK_SHIFT |
p[SCFG_ARM7_CLK_SD2].iValue << DISP_REG_SCFG_CLK_SD2HCLK_SHIFT |
p[SCFG_ARM7_CLK_AES].iValue << DISP_REG_SCFG_CLK_AESHCLK_SHIFT |
p[SCFG_ARM7_CLK_WRAM].iValue << DISP_REG_SCFG_CLK_WRAMHCLK_SHIFT|
p[SCFG_ARM7_CLK_SND].iValue << DISP_REG_SCFG_CLK_SNDMCLK_SHIFT
);
regJtag =(u16)(
p[SCFG_ARM7_JTAG_A7].iValue << DISP_REG_SCFG_JTAG_ARM7SEL_SHIFT |
p[SCFG_ARM7_JTAG_CPU].iValue << DISP_REG_SCFG_JTAG_CPUJE_SHIFT |
p[SCFG_ARM7_JTAG_DSP].iValue << DISP_REG_SCFG_JTAG_DSPJE_SHIFT
);
regExt =(u32)(
p[SCFG_ARM7_EXT_DMA].iValue << DISP_REG_SCFG_EXT_DMA_SHIFT |
p[SCFG_ARM7_EXT_SDMA].iValue << DISP_REG_SCFG_EXT_SDMA_SHIFT |
p[SCFG_ARM7_EXT_SND].iValue << DISP_REG_SCFG_EXT_SND_SHIFT |
p[SCFG_ARM7_EXT_MC].iValue << DISP_REG_SCFG_EXT_MC_SHIFT |
p[SCFG_ARM7_EXT_INTC].iValue << DISP_REG_SCFG_EXT_INTC_SHIFT |
p[SCFG_ARM7_EXT_SPI].iValue << DISP_REG_SCFG_EXT_SPI_SHIFT |
p[SCFG_ARM7_EXT_DSEL].iValue << DISP_REG_SCFG_EXT_DSEL_SHIFT |
p[SCFG_ARM7_EXT_SIO].iValue << DISP_REG_SCFG_EXT_SIO_SHIFT |
p[SCFG_ARM7_EXT_LCDC].iValue << DISP_REG_SCFG_EXT_LCDC_SHIFT |
p[SCFG_ARM7_EXT_VRAM].iValue << DISP_REG_SCFG_EXT_VRAM_SHIFT |
p[SCFG_ARM7_EXT_PS].iValue << DISP_REG_SCFG_EXT_PSRAM_SHIFT |
p[SCFG_ARM7_EXT_DMAC].iValue << DISP_REG_SCFG_EXT_DMAC_SHIFT |
p[SCFG_ARM7_EXT_AES].iValue << DISP_REG_SCFG_EXT_AES_SHIFT |
p[SCFG_ARM7_EXT_SD1].iValue << DISP_REG_SCFG_EXT_SD1_SHIFT |
p[SCFG_ARM7_EXT_SD2].iValue << DISP_REG_SCFG_EXT_SD2_SHIFT |
p[SCFG_ARM7_EXT_MIC].iValue << DISP_REG_SCFG_EXT_MIC_SHIFT |
p[SCFG_ARM7_EXT_I2S].iValue << DISP_REG_SCFG_EXT_I2S_SHIFT |
p[SCFG_ARM7_EXT_I2C].iValue << DISP_REG_SCFG_EXT_I2C_SHIFT |
p[SCFG_ARM7_EXT_GPIO].iValue << DISP_REG_SCFG_EXT_GPIO_SHIFT |
p[SCFG_ARM7_EXT_MCB].iValue << DISP_REG_SCFG_EXT_MC_B_SHIFT |
p[SCFG_ARM7_EXT_WRAM].iValue << DISP_REG_SCFG_EXT_WRAM_SHIFT |
p[SCFG_ARM7_EXT_PU].iValue << DISP_REG_SCFG_EXT_PUENABLE_SHIFT |
p[SCFG_ARM7_EXT_CFG].iValue << DISP_REG_SCFG_EXT_CFG_SHIFT
);
PutStringUTF16Sub( REGISTER_NAME_LEFT, REGISTER_NAME_UP, TXT_COLOR_BLACK, s_strARM7RegisterName[0] );
printBinary32( REGISTER_DATA_LEFT, REGISTER_DATA_UP, regRom );
PutStringUTF16Sub( REGISTER_NAME_LEFT, REGISTER_NAME_UP + 2*LINE_OFFSET, TXT_COLOR_BLACK, s_strARM7RegisterName[1] );
printBinary16( REGISTER_DATA_LEFT, REGISTER_DATA_UP + 2*LINE_OFFSET, regClk );
PutStringUTF16Sub( REGISTER_NAME_LEFT, REGISTER_NAME_UP + 3*LINE_OFFSET, TXT_COLOR_BLACK, s_strARM7RegisterName[2] );
printBinary16( REGISTER_DATA_LEFT, REGISTER_DATA_UP + 3*LINE_OFFSET, regJtag );
PutStringUTF16Sub( REGISTER_NAME_LEFT, REGISTER_NAME_UP + 4*LINE_OFFSET, TXT_COLOR_BLACK, s_strARM7RegisterName[3] );
printBinary32( REGISTER_DATA_LEFT, REGISTER_DATA_UP + 4*LINE_OFFSET, regExt );
}
else if( menu == MENU_SCFG_ARM7 && selected >= SCFG_ARM7_MI_SC1_CDET )
{
// SCFGの後半4つ
u32 regMcard1;
u16 regMcard2;
u16 regOldWL;
u16 regOption;
}
else if( menu == MENU_SCFG_ARM9 )
{
}
}
void printBinary32( int x, int y, u32 value )
{
printBinary16( x, y, (u16)(value >> 16) );
printBinary16( x, y + LINE_OFFSET, (u16)(value & 0xFF) );
}
void printBinary16( int x, int y, u16 value )
{
int i;
u16 buf[BINARY_BUF] = {0}; // 16bit + 3 space + EOS
u16 mask = 0x8000;
for( i=0; i<BINARY_BUF; i++)
{
if( i%5 == 4 )
{
buf[i] = L' ';
continue;
}
if( value & mask )
{
buf[i] = L'1';
}
else
{
buf[i] = L'0';
}
mask = mask >> 1;
}
buf[20] = L'\0';
PutStringUTF16Sub( x, y, TXT_COLOR_BLACK, buf );
}
void drawMenu( int menu, int line )
// 情報一覧を描画する
{
int lineNum = 0;
int i=0;
if( menu == MENU_ROOT )
{
// ルートメニューは値がないので項目名だけ描画して終わり
for( i=0; i<ROOTMENU_SIZE; i++ )
{
printKindName( menu, i, i,line );
}
return;
}
if( line - gDrawIdx[menu] < SCROLL_MARGIN )
{
gDrawIdx[menu] = line - SCROLL_MARGIN >= 0 ? line - SCROLL_MARGIN : 0;
}
else if( gDrawIdx[menu] + DISP_NUM_LINES - line - 1 <= SCROLL_MARGIN )
{
// 矢印が下に近すぎる場合のスクロール補正
gDrawIdx[menu] = line + SCROLL_MARGIN < s_numMenu[menu] ?
line + SCROLL_MARGIN - DISP_NUM_LINES + 1 : s_numMenu[menu] - DISP_NUM_LINES ;
}
for( i = gDrawIdx[menu] ; i < s_numMenu[menu] && lineNum < DISP_NUM_LINES ; i++ )
{
printKindName( menu, i, lineNum, line );
printValue( menu, i, lineNum, &gAllInfo[menu][i] );
// 描画オフセットの更新
lineNum += gAllInfo[menu][i].numLines;
}
drawRegister( menu, line );
// 全体の行数を把握
if( gMenuLineSize[menu] == 0 )
{
gMenuLineSize[menu] = countMenuLine(menu);
}
// スクロールバーとか出す
}
/*
for( linenum = 0; linenum < nowPageMaxLine; linenum++ )
{
drawMenuSub( menu, line, &gAllInfo[menu][0] );
switch( menu ){
case MENU_ROOT:
break;
case MENU_OWNER:
drawOwnerMenu( page, linenum, valueIdx, &gAllInfo[menu][0], &gMenuKindOffset[menu][0], &s_pageOffset[menu][0] );
break;
case MENU_PARENTAL:
drawParentalMenu( page, linenum, valueIdx, &gAllInfo[menu][0], &gMenuKindOffset[menu][0], &s_pageOffset[menu][0] );
break;
case MENU_NORMAL_HW:
drawNormalHWMenu( page, linenum, valueIdx, &gAllInfo[menu][0], &gMenuKindOffset[menu][0], &s_pageOffset[menu][0] );
break;
case MENU_SECURE_HW:
drawSecureHWMenu( page, linenum, valueIdx, &gAllInfo[menu][0], &gMenuKindOffset[menu][0], &s_pageOffset[menu][0] );
break;
case MENU_SCFG_ARM7:
drawSCFGARM7Menu( page, linenum, valueIdx, &gAllInfo[menu][0], &gMenuKindOffset[menu][0], &s_pageOffset[menu][0] );
break;
case MENU_SCFG_ARM9:
drawSCFGARM9Menu( page, linenum, valueIdx, &gAllInfo[menu][0], &gMenuKindOffset[menu][0], &s_pageOffset[menu][0] );
break;
case MENU_VERSION:
drawVersionMenu( page, linenum, valueIdx, &gAllInfo[menu][0], &gMenuKindOffset[menu][0], &s_pageOffset[menu][0] );
break;
}
*/
/*
void drawKindName( int menu, int page, int line )
// 項目名描画関数
{
int linenum = 0;
int offset = 0;
if( menu == MENU_ROOT )
{
// ルートメニューにはインデクスデータがないので、間隔をあけないことを前提に羅列するだけ
for(linenum = 0; linenum < ROOTMENU_SIZE ; linenum++)
{
if( linenum == line )
{
// 選択中の項目は表示色かえて矢印表示
PutStringUTF16( ALLOW_LEFT, KIND_UP + LINE_OFFSET*linenum, TXT_COLOR_BLACK, (const u16 *)L"" );
PutStringUTF16( KIND_LEFT, KIND_UP + LINE_OFFSET*linenum, TXT_COLOR_GREEN, s_strMetaMenu[MENU_ROOT][linenum]) ;
}
else
{
PutStringUTF16( KIND_LEFT, KIND_UP + LINE_OFFSET*linenum, TXT_COLOR_BLACK, s_strMetaMenu[MENU_ROOT][linenum]) ;
}
}
}
else
{
for(linenum = s_pageOffset[menu][page] ; linenum < s_pageOffset[menu][page+1] ; linenum++)
{
if( linenum == s_pageOffset[menu][page] + line )
{
// 選択中の項目は表示色かえて矢印表示
PutStringUTF16( ALLOW_LEFT, KIND_UP + LINE_OFFSET * gMenuKindOffset[menu][linenum],
TXT_COLOR_BLACK, (const u16 *)L"" );
PutStringUTF16( KIND_LEFT, KIND_UP + LINE_OFFSET * gMenuKindOffset[menu][linenum],
TXT_COLOR_GREEN, s_strMetaMenu[menu][linenum]) ;
}
else
{
PutStringUTF16( KIND_LEFT, KIND_UP + LINE_OFFSET * gMenuKindOffset[menu][linenum],
TXT_COLOR_BLACK, s_strMetaMenu[menu][linenum]) ;
}
}
}
}
void drawOwnerMenu( int page, int linenum, int valueIdx, char** info, int* kindOffset, const int* pageOffset )
{
int drawLineOffset = linenum, drawKindOffset = linenum;
// utf16で描画するものだけ分ける
if( valueIdx == OWNER_NICKNAME )
{
kindOffset[valueIdx] = drawKindOffset;
PutStringUTF16( VALUE_LEFT, VALUE_UP + LINE_OFFSET*drawLineOffset, TXT_COLOR_BLACK, gUserName) ;
}
else if( valueIdx == OWNER_COMMENT )
{
kindOffset[valueIdx] = drawKindOffset;
PutStringUTF16( VALUE_LEFT, VALUE_UP + LINE_OFFSET*drawLineOffset, TXT_COLOR_BLACK, gUserComment) ;
}
else if( valueIdx == OWNER_COLOR )
{
kindOffset[valueIdx] = drawKindOffset;
PrintfSJIS( VALUE_LEFT , VALUE_UP + LINE_OFFSET*drawLineOffset, TXT_UCOLOR_G5, "" );
PrintfSJIS( VALUE_LEFT + LINE_OFFSET , VALUE_UP + LINE_OFFSET*drawLineOffset, TXT_COLOR_BLACK, info[valueIdx] );
}
else
{
// sjisで描画するもの
kindOffset[valueIdx] = drawKindOffset;
PrintfSJIS( VALUE_LEFT , VALUE_UP + LINE_OFFSET*drawLineOffset, TXT_COLOR_BLACK, info[valueIdx] );
}
}
void drawParentalMenu( int page, int linenum, int valueIdx, char** info, int* kindOffset, const int* pageOffset )
{
int drawLineOffset = linenum, drawKindOffset = linenum;
// utf16で描画するものだけ分ける
if(valueIdx == PARENTAL_ANSWER)
{
kindOffset[valueIdx] = drawKindOffset;
PutStringUTF16( VALUE_LEFT, VALUE_UP + LINE_OFFSET*drawLineOffset, TXT_COLOR_BLACK, gSecretAnswer) ;
}
else
{
// sjisで描画するもの
kindOffset[valueIdx] = drawKindOffset;
PrintfSJIS( VALUE_LEFT , VALUE_UP + LINE_OFFSET*drawLineOffset, TXT_COLOR_BLACK, info[valueIdx] );
}
}
void drawNormalHWMenu( int page, int linenum, int valueIdx, char** info, int* kindOffset, const int* pageOffset )
{
int drawLineOffset = linenum, drawKindOffset = linenum;
// 描画してついでにインデクス差分データをいれる
kindOffset[valueIdx] = drawKindOffset;
PrintfSJIS( VALUE_LEFT , VALUE_UP + LINE_OFFSET*drawLineOffset, TXT_COLOR_BLACK, info[valueIdx] );
}
void drawSecureHWMenu( int page, int linenum, int valueIdx, char** info, int* kindOffset, const int* pageOffset )
{
int drawLineOffset = linenum, drawKindOffset = linenum;
// 複数行必要な項目があると描画位置がずれるため
// 描画オフセットを調整する処理が必要
if( valueIdx >= SECURE_HW_FORCE_DISABLE && page == getPageNum( SECURE_HW_FORCE_DISABLE, pageOffset ) )
{
drawLineOffset++;
}
if( valueIdx > SECURE_HW_UNIQUE_ID && page == getPageNum( SECURE_HW_UNIQUE_ID, pageOffset ) )
{
drawLineOffset += OS_TWL_HWINFO_MOVABLE_UNIQUE_ID_LEN*3 / UNIQUE_BUF;
}
// 同じように項目名のオフセットも調整
if( valueIdx > SECURE_HW_FORCE_DISABLE && page == getPageNum( SECURE_HW_FORCE_DISABLE, pageOffset ) )
{
drawKindOffset++;
}
if( valueIdx > SECURE_HW_UNIQUE_ID && page == getPageNum( SECURE_HW_UNIQUE_ID, pageOffset ) )
{
drawKindOffset += OS_TWL_HWINFO_MOVABLE_UNIQUE_ID_LEN*3 / UNIQUE_BUF;
}
// 描画する、ついでにインデクスデータも入れる
if( valueIdx == SECURE_HW_UNIQUE_ID )
{
kindOffset[valueIdx] = drawKindOffset;
printUniqueID(drawLineOffset);
}
else
{
kindOffset[valueIdx] = drawKindOffset;
PrintfSJIS( VALUE_LEFT , VALUE_UP + LINE_OFFSET*drawLineOffset, TXT_COLOR_BLACK, info[valueIdx] );
}
}
void drawSCFGARM7Menu( int page, int linenum, int valueIdx, char** info, int* kindOffset, const int* pageOffset )
{
kindOffset[valueIdx] = linenum;
}
void drawSCFGARM9Menu( int page, int linenum, int valueIdx, char** info, int* kindOffset, const int* pageOffset )
{
int drawLineOffset = linenum, drawKindOffset = linenum;
PrintfSJIS( VALUE_LEFT , VALUE_UP + LINE_OFFSET*drawLineOffset, TXT_COLOR_BLACK, info[valueIdx] );
kindOffset[valueIdx] = drawKindOffset;
}
void drawVersionMenu( int page, int linenum, int valueIdx, char** info, int* kindOffset, const int* pageOffset )
{
int drawLineOffset = linenum, drawKindOffset = linenum;
PrintfSJIS( VALUE_LEFT , VALUE_UP + LINE_OFFSET*drawLineOffset, TXT_COLOR_BLACK, info[valueIdx] );
kindOffset[valueIdx] = drawKindOffset;
}
*/
void printUniqueID( int drawLineOffset, char *uniqueId)
// ユニークIDを整形して出力
{
char buf[UNIQUE_BUF+1];
int i;
for( i=0; i * UNIQUE_BUF < OS_TWL_HWINFO_MOVABLE_UNIQUE_ID_LEN*3 ; i++)
{
strncpy(buf, &uniqueId[i * UNIQUE_BUF], UNIQUE_BUF);
buf[UNIQUE_BUF] = '\0';
PrintfSJIS( VALUE_LEFT , VALUE_UP + LINE_OFFSET * (drawLineOffset + i), TXT_COLOR_BLACK, buf );
}
}
int getPageNum( int valueIdx, const int* pageOffset )
// valueIdxが何ページ目にあるかをpageOffsetから調べる
{
int i;
for( i=0; i < MAXITEM - 1; i++ )
{
if( valueIdx > pageOffset[i] && valueIdx < pageOffset[i+1] )
{
return i;
}
}
return -1;
}

View File

@ -0,0 +1,184 @@
/*---------------------------------------------------------------------------*
Project: TwlIPL - tests - DisplaySystemInformation
File: drawFunc.h
Copyright **** Nintendo. All rights reserved.
These coded instructions, statements, and computer programs contain
proprietary information of Nintendo of America Inc. and/or Nintendo
Company Ltd., and are protected by Federal copyright law. They may
not be disclosed to third parties or copied or duplicated in any form,
in whole or in part, without the prior written consent of Nintendo.
$Date:: $
$Rev:$
$Author:$
*---------------------------------------------------------------------------*/
#ifndef __DRAW_FUNC__
#define __DRAW_FUNC__
#include <twl.h>
#ifdef __cplusplus
extern "C" {
#endif
// 各メニューサイズ
#define DISP_NUM_LINES 11 // 一ページあたりの項目数
#define ROOTMENU_SIZE 7
#define OWNERMENU_SIZE 6
#define PARENTALMENU_SIZE 12
#define NORMAL_HW_MENU_SIZE 4
#define SECURE_HW_MENU_SIZE 6
#define SCFG_ARM7_MENU_SIZE 47
#define SCFG_ARM9_MENU_SIZE 22
#define VERSIONMENU_SIZE 3
// メニューID
#define MENU_ROOT 10
#define MENU_OWNER 0
#define MENU_PARENTAL 1
#define MENU_NORMAL_HW 2
#define MENU_SECURE_HW 3
#define MENU_SCFG_ARM7 4
#define MENU_SCFG_ARM9 5
#define MENU_VERSION 6
// 行番号
#define OWNER_LANGUAGE 0
#define OWNER_COLOR 1
#define OWNER_BIRTHDAY 2
#define OWNER_COUNTRY 3
#define OWNER_NICKNAME 4
#define OWNER_COMMENT 5
#define PARENTAL_FLAG 0
#define PARENTAL_PICTOCHAT 1
#define PARENTAL_DOWNLOAD 2
#define PARENTAL_BROWSER 3
#define PARENTAL_WIIPOINT 4
#define PARENTAL_PHOTO_EXCHANGE 5
#define PARENTAL_UGC 6
#define PARENTAL_ORGANIZATION 7
#define PARENTAL_AGE 8
#define PARENTAL_PASSWORD 9
#define PARENTAL_QUESTION_ID 10
#define PARENTAL_ANSWER 11
#define NORMAL_HW_WIRELESS 0
#define NORMAL_HW_RTC_OFFSET 1
#define NORMAL_HW_AGREE_EULA 2
#define NORMAL_HW_EULA_VERSION 3
#define SECURE_HW_FORCE_DISABLE 0
#define SECURE_HW_REGION 1
#define SECURE_HW_UNIQUE_ID 2
#define SECURE_HW_SERIAL 3
#define SECURE_HW_LANGUAGE 4
#define SECURE_HW_FUSE 5
#define SCFG_ARM9_ROM_STATE 0
#define SCFG_ARM9_CAMERA_CKI 1
#define SCFG_ARM9_WRAM_CLOCK 2
#define SCFG_ARM9_CAMERA_CLOCK 3
#define SCFG_ARM9_DSP_CLOCK 4
#define SCFG_ARM9_CPU_SPEED 5
#define SCFG_ARM9_DSP_RESET 6
#define SCFG_ARM9_CFG_ACCESSIBLE 7
#define SCFG_ARM9_WRAM_ACCESSIBLE 8
#define SCFG_ARM9_DSP_ACCESSIBLE 9
#define SCFG_ARM9_CAMERA_ACCESSIBLE 10
#define SCFG_ARM9_NDMA_ACCESSIBLE 11
#define SCFG_ARM9_PSRAM_BOUNDARY 12
#define SCFG_ARM9_INTC_EXPANSION 13
#define SCFG_ARM9_LCDC_EXPANSION 14
#define SCFG_ARM9_VRAM_EXPANSION 15
#define SCFG_ARM9_FIX_CARD 16
#define SCFG_ARM9_FIX_DIVIDER 17
#define SCFG_ARM9_FIX_2DENGINE 18
#define SCFG_ARM9_FIX_RENDERER 19
#define SCFG_ARM9_FIX_GEOMETRY 20
#define SCFG_ARM9_FIX_DMA 21
#define SCFG_ARM7_ROM_ARM9_SEC 0
#define SCFG_ARM7_ROM_ARM9_RSEL 1
#define SCFG_ARM7_ROM_ARM7_SEC 2
#define SCFG_ARM7_ROM_ARM7_RSEL 3
#define SCFG_ARM7_ROM_ARM7_FUSE 4
#define SCFG_ARM7_ROM_WE 5
#define SCFG_ARM7_CLK_SD1 6
#define SCFG_ARM7_CLK_SD2 7
#define SCFG_ARM7_CLK_AES 8
#define SCFG_ARM7_CLK_WRAM 9
#define SCFG_ARM7_CLK_SND 10
#define SCFG_ARM7_JTAG_A7 11
#define SCFG_ARM7_JTAG_CPU 12
#define SCFG_ARM7_JTAG_DSP 13
#define SCFG_ARM7_EXT_DMA 14
#define SCFG_ARM7_EXT_SDMA 15
#define SCFG_ARM7_EXT_SND 16
#define SCFG_ARM7_EXT_MC 17
#define SCFG_ARM7_EXT_INTC 18
#define SCFG_ARM7_EXT_SPI 19
#define SCFG_ARM7_EXT_DSEL 20
#define SCFG_ARM7_EXT_SIO 21
#define SCFG_ARM7_EXT_LCDC 22
#define SCFG_ARM7_EXT_VRAM 23
#define SCFG_ARM7_EXT_PS 24
#define SCFG_ARM7_EXT_DMAC 25
#define SCFG_ARM7_EXT_AES 26
#define SCFG_ARM7_EXT_SD1 27
#define SCFG_ARM7_EXT_SD2 28
#define SCFG_ARM7_EXT_MIC 29
#define SCFG_ARM7_EXT_I2S 30
#define SCFG_ARM7_EXT_I2C 31
#define SCFG_ARM7_EXT_GPIO 32
#define SCFG_ARM7_EXT_MCB 33
#define SCFG_ARM7_EXT_WRAM 34
#define SCFG_ARM7_EXT_PU 35
#define SCFG_ARM7_EXT_CFG 36
#define SCFG_ARM7_MI_SC1_CDET 37
#define SCFG_ARM7_MI_SC1_MODE 38
#define SCFG_ARM7_MI_SC2_CDET 39
#define SCFG_ARM7_MI_SC2_MODE 40
#define SCFG_ARM7_MI_SWP 41
#define SCFG_ARM7_MI_CC 42
#define SCFG_ARM7_MI_CA 43
#define SCFG_ARM7_WL_OFFB 44
#define SCFG_ARM7_OP_FORM 45
#define SCFG_ARM7_OP_APP 46
#define SCFG_ARM7_WRAM_OFFSET 47
#define VERSION_WIRELESS 0
#define VERSION_FONT 1
#define VERSION_OTHER 2
/* global variables ----------------- */
#define MAXITEM 50
#define MAXPAGE 5
// 各項目を表示するときの行オフセット表
extern int gMenuKindOffset[ROOTMENU_SIZE][MAXITEM];
/* function prototypes ----------------- */
void drawHeader( int menu, int line );
void drawMenu( int menu, int line );
#ifdef __cplusplus
}
#endif
#endif

View File

@ -0,0 +1,237 @@
/*---------------------------------------------------------------------------*
Project: TwlIPL - tests - DisplaySystemInfo
File: viewSystemInfo.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:: $
$Rev$
$Author$
*---------------------------------------------------------------------------*/
#include <twl.h>
#include <wchar.h>
#include <string.h>
#include <twl/os/common/ownerInfoEx_private.h>
#include "drawFunc.h"
#include "viewSystemInfo.h"
#include "misc.h"
#include "strResource.h"
// 描画関連
#define HEADER_UP 0
#define HEADER_LEFT 15
#define FOOTER_UP 160
#define FOOTER_LEFT 10
#define ALLOW_LEFT 10
#define KIND_UP 40 // 項目名の上座標
#define KIND_LEFT 20 // 項目名の左座標
#define VALUE_UP 40 // 項目値の上座標
#define VALUE_LEFT 140 // 項目値の左座標
#define LINE_OFFSET 15 // 1行ごとのオフセット
#define ROW_OFFSET 15 // 長い項目が現れたときの段組用
#define UNIQUE_BUF 12
const int s_pageOffset[][MAXPAGE] = {
{ 0, OWNERMENU_KSIZE }, // owner
{ 0, PARENTALMENU_KSIZE }, // parental
{ 0, 5, OTHERMENU_KSIZE }, // other
{ 0, SCFGMENU_KSIZE }, // scfg
{ 0, FUSEMENU_KSIZE } // fuse
};
void drawKindName( u8 menu, u8 page, u8 line );
void drawRootMenu( u8 page, u8 line );
void drawOwnerMenu( u8 page, u8 line );
void drawParentalMenu( u8 page, u8 line );
void drawOtherMenu( u8 page, u8 line );
void drawSCFGMenu( u8 page, u8 line );
void drawFuseMenu( u8 page, u8 line );
void printUniqueID( u8 drawLineOffset );
void drawHeader( u8 menu, u8 page, u8 line )
// 画面端に簡単な情報を表示する
{
PutStringUTF16( HEADER_LEFT, HEADER_UP, TXT_COLOR_RED, (const u16 *)L"DisplaySystemInfo");
if( menu != MENU_ROOT )
{
u16 buf[256];
swprintf(buf, 256, L"Root>%s page %d / %d", s_strMenuName[menu], page+1 , (s_numMenuK[menu] / NUM_LINES) + 1 );
PutStringUTF16( HEADER_LEFT, HEADER_UP + LINE_OFFSET, TXT_COLOR_BLUE, buf );
}
else
{
PutStringUTF16( HEADER_LEFT, HEADER_UP + LINE_OFFSET, TXT_COLOR_BLUE, (const u16 *)L"Root" );
}
PutStringUTF16( FOOTER_LEFT, FOOTER_UP, TXT_COLOR_BLUE, (const u16 *)L" A: Decide B: Back ");
}
void drawMenu( u8 menu, u8 page, u8 line )
// 情報一覧を描画する
{
switch( menu ){
case MENU_ROOT:
drawRootMenu( page, line );
break;
case MENU_OWNER:
drawOwnerMenu( page, line );
break;
case MENU_PARENTAL:
drawParentalMenu( page, line );
break;
case MENU_OTHER:
drawOtherMenu( page, line );
break;
case MENU_SCFG:
drawSCFGMenu( page, line );
break;
case MENU_FUSE:
drawFuseMenu( page, line );
break;
}
}
void drawKindName( u8 menu, u8 page, u8 line )
// 項目名描画関数
{
u8 linenum = 0;
u8 offset = 0;
for(linenum = NUM_LINES * page ; linenum < s_numMenuK[menu] && linenum < (page+1) * NUM_LINES; linenum++, offset++)
{
if( linenum == NUM_LINES * page + line )
{
// 選択中の項目は表示色かえて矢印表示
PutStringUTF16( ALLOW_LEFT, KIND_UP + LINE_OFFSET*offset, TXT_COLOR_BLACK, (const u16 *)L"" );
PutStringUTF16( KIND_LEFT, KIND_UP + LINE_OFFSET*offset, TXT_COLOR_GREEN, s_strMetaMenu[menu][linenum]) ;
}
else
{
PutStringUTF16( KIND_LEFT, KIND_UP + LINE_OFFSET*offset, TXT_COLOR_BLACK, s_strMetaMenu[menu][linenum]) ;
}
}
}
void drawRootMenu( u8 page, u8 line )
{
drawKindName( MENU_ROOT, page, line);
}
void drawOwnerMenu( u8 page, u8 line )
{
u8 linenum;
drawKindName( MENU_OWNER, page, line);
for(linenum = page * NUM_LINES; linenum < s_numMenuV[MENU_OWNER] && linenum < (page+1) * NUM_LINES; linenum++)
{
// utf16で描画するものだけ分ける
if(linenum == OWNER_NICKNAME)
{
PutStringUTF16( VALUE_LEFT, VALUE_UP + LINE_OFFSET*linenum, TXT_COLOR_BLACK, gUserName) ;
}
else if(linenum == OWNER_COMMENT)
{
PutStringUTF16( VALUE_LEFT + ROW_OFFSET, VALUE_UP + LINE_OFFSET*( linenum+1 ), TXT_COLOR_BLACK, gUserComment) ;
}
else
{
// sjisで描画するもの
PrintfSJIS( VALUE_LEFT , VALUE_UP + LINE_OFFSET*linenum, TXT_COLOR_BLACK, gAllInfo[MENU_OWNER][linenum] );
}
}
}
void drawParentalMenu( u8 page, u8 line )
{
u8 linenum;
drawKindName( MENU_PARENTAL, page, line);
for(linenum = page * NUM_LINES; linenum < s_numMenuV[MENU_PARENTAL] && linenum < (page+1) * NUM_LINES; linenum++)
{
// utf16で描画するものだけ分ける
if(linenum == PARENTAL_ANSWER)
{
PutStringUTF16( VALUE_LEFT, VALUE_UP + LINE_OFFSET*linenum, TXT_COLOR_BLACK, gSecretAnswer) ;
}
else
{
// sjisで描画するもの
PrintfSJIS( VALUE_LEFT , VALUE_UP + LINE_OFFSET*linenum, TXT_COLOR_BLACK, gAllInfo[MENU_PARENTAL][linenum] );
}
}
}
void drawOtherMenu( u8 page, u8 line )
{
u8 linenum, drawLineOffset=0;
u8 nowPageMaxLine = s_pageOffset[MENU_OTHER][page+1] - s_pageOffset[MENU_OTHER][page];
// u8 maxline = s_numMenuV[MENU_OTHER] - page*5 > 5 ? 5 : s_numMenuV[MENU_OTHER] - page*5;
drawKindName( MENU_OTHER, page, line);
for(linenum = 0; linenum < nowPageMaxLine; linenum++)
{
u8 valueIdx = s_pageOffset[MENU_OTHER][page] + linenum;
drawLineOffset = linenum;
// 複数行必要な項目があると描画位置がずれるのでそれの対応
if( valueIdx >= OTHER_FORCE_DISABLE && page == 0)
{
drawLineOffset++;
}
if( valueIdx > OTHER_UNIQUE_ID && page == 1 )
{
drawLineOffset += OS_TWL_HWINFO_MOVABLE_UNIQUE_ID_LEN*3 / UNIQUE_BUF;
}
// 描画する
if( valueIdx == OTHER_UNIQUE_ID )
{
printUniqueID(drawLineOffset);
}
else
{
PrintfSJIS( VALUE_LEFT , VALUE_UP + LINE_OFFSET*drawLineOffset, TXT_COLOR_BLACK, gAllInfo[MENU_OTHER][valueIdx] );
}
}
}
void printUniqueID( u8 drawLineOffset)
// ユニークIDを整形して出力
{
char buf[UNIQUE_BUF+1];
u8 i;
for( i=0; i * UNIQUE_BUF < OS_TWL_HWINFO_MOVABLE_UNIQUE_ID_LEN*3 ; i++)
{
strncpy(buf, &gAllInfo[MENU_OTHER][OTHER_UNIQUE_ID][i * UNIQUE_BUF], UNIQUE_BUF);
buf[UNIQUE_BUF] = '\0';
PrintfSJIS( VALUE_LEFT , VALUE_UP + LINE_OFFSET * (drawLineOffset + i), TXT_COLOR_BLACK, buf );
}
}
void drawSCFGMenu( u8 page, u8 line )
{
drawKindName( MENU_SCFG, page, line);
}
void drawFuseMenu( u8 page, u8 line )
{
drawKindName( MENU_FUSE, page, line);
}

View File

@ -0,0 +1,94 @@
/*---------------------------------------------------------------------------*
Project: TwlIPL - tests - DisplaySystemInfo
File: drawFunc.h
Copyright 2008 Nintendo. All rights reserved.
These coded instructions, statements, and computer programs contain
proprietary information of Nintendo of America Inc. and/or Nintendo
Company Ltd., and are protected by Federal copyright law. They may
not be disclosed to third parties or copied or duplicated in any form,
in whole or in part, without the prior written consent of Nintendo.
$Date:: $
$Rev$
$Author$
*---------------------------------------------------------------------------*/
#ifndef __DRAW_FUNC__
#define __DRAW_FUNC__
#include <twl.h>
#ifdef __cplusplus
extern "C" {
#endif
#define STRING_LINES 10
// 各メニューサイズ
#define NUM_LINES 8 // 一ページあたりの項目数
#define ROOTMENU_SIZE 5
#define OWNERMENU_SIZE 6
#define PARENTALMENU_SIZE 6
#define OTHERMENU_SIZE 7
#define SCFGMENU_SIZE 1
#define FUSEMENU_SIZE 1
// メニューID
#define MENU_ROOT 10
#define MENU_OWNER 0
#define MENU_PARENTAL 1
#define MENU_OTHER 2
#define MENU_SCFG 3
#define MENU_FUSE 4
// 行番号
#define OWNER_LANGUAGE 0
#define OWNER_COLOR 1
#define OWNER_BIRTHDAY 2
#define OWNER_COUNTRY 3
#define OWNER_NICKNAME 4
#define OWNER_COMMENT 5
#define PARENTAL_FLAG 0
#define PARENTAL_ORGANIZATION 1
#define PARENTAL_AGE 2
#define PARENTAL_PASSWORD 3
#define PARENTAL_QUESTION_ID 4
#define PARENTAL_ANSWER 5
#define OTHER_WIRELESS 0
#define OTHER_FORCE_DISABLE 1
#define OTHER_AGREE_EULA 2
#define OTHER_EULA_VERSION 3
#define OTHER_REGION 4
#define OTHER_UNIQUE_ID 5
#define OTHER_SERIAL 6
/* global variables ----------------- */
#define MAXPAGE 10
// 各項目のページごとのオフセット値
extern const int s_pageOffset[][MAXPAGE];
/* function prototypes ----------------- */
void drawHeader( u8 menu, u8 page, u8 line );
void drawMenu( u8 menu, u8 page, u8 line );
#ifdef __cplusplus
}
#endif
#endif

View File

@ -0,0 +1,144 @@
// from main.c
void myDEMOInit( void )
{
DEMOInitCommon();
DEMOInitVRAM();
DEMOInitDisplayBitmap();
DEMOHookConsole();
DEMOSetBitmapTextColor(GX_RGBA(31, 31, 0, 1));
DEMOSetBitmapGroundColor(DEMO_RGB_CLEAR);
DEMOStartDisplay();
}
/*---------------------------------------------------------------------------*
Name: InitScreen
Description: BG
Arguments:
Returns:
*---------------------------------------------------------------------------*/
static void InitScreen(void)
{
GXRgb myPalette[16] =
{
GX_RGB( 0, 0, 0), GX_RGB(31, 31, 31), GX_RGB( 31, 31, 0), GX_RGB(31, 0, 0),
GX_RGB( 0, 0, 0), GX_RGB( 0, 0, 0), GX_RGB( 0, 0, 0), GX_RGB( 0, 0, 0),
GX_RGB( 0, 0, 0), GX_RGB( 0, 0, 0), GX_RGB( 0, 0, 0), GX_RGB( 0, 0, 0),
GX_RGB( 0, 0, 0), GX_RGB( 0, 0, 0), GX_RGB( 0, 0, 0), GX_RGB( 0, 0, 0),
};
// BG 1 を設定
G2S_SetBG1Control(
GX_BG_SCRSIZE_TEXT_256x256, // スクリーンサイズ 256x256
GX_BG_COLORMODE_16, // カラーモード 16色
GX_BG_SCRBASE_0x0000, // スクリーンベース
GX_BG_CHARBASE_0x00000, // キャラクタベース
GX_BG_EXTPLTT_01 // 拡張パレットスロット
);
// BG1 を可視に
GXS_SetVisiblePlane(GX_GetVisiblePlane() & ~GX_PLANEMASK_BG1);
// カラーパレットを設定
GX_LoadBGPltt( myPalette, 0, sizeof(myPalette) );
}
/*---------------------------------------------------------------------------*
Name: InitCanvas
Description:
Arguments:
Returns:
*---------------------------------------------------------------------------*/
static void InitCanvas(void)
{
// BGキャラクタベースへのポインタ
GXCharFmt16* const pCharBase = (GXCharFmt16*)G2_GetBG1CharPtr();
int cOffset = CHARACTER_OFFSET;
TXT_LoadFont(&gFont, FONT_RESOURCE);
// CharCanvas の初期化と BG スクリーンの設定
// CharCanvas 0
NNS_G2dCharCanvasInitForBG(
&gCanvas[0], // CharCanvasへのポインタ
pCharBase + cOffset, // 使用するキャラクタ列先頭へのポインタ
CANVAS0_WIDTH, // CharCanvas幅
CANVAS0_HEIGHT, // CharCanvas高さ
NNS_G2D_CHARA_COLORMODE_16 // カラーモード
);
NNS_G2dMapScrToCharText(
G2S_GetBG1ScrPtr(), // スクリーンベースへのポインタ
CANVAS0_WIDTH, // CharCanvas幅
CANVAS0_HEIGHT, // CharCanvas高さ
CANVAS0_LEFT, // CharCanvas表示位置
CANVAS0_TOP, // CharCanvas表示位置
NNS_G2D_TEXT_BG_WIDTH_256, // スクリーン幅
cOffset, // 使用するキャラクタ列先頭のキャラクタ番号
0 // カラーパレット番号
);
// CharCanvas 0 が使う分のキャラクタ数をオフセットに加算
cOffset += CANVAS0_WIDTH * CANVAS0_HEIGHT;
// CharCanvas 1
NNS_G2dCharCanvasInitForBG(
&gCanvas[1],
pCharBase + cOffset,
CANVAS1_WIDTH,
CANVAS1_HEIGHT,
NNS_G2D_CHARA_COLORMODE_16
);
NNS_G2dMapScrToCharText(
G2S_GetBG1ScrPtr(),
CANVAS1_WIDTH,
CANVAS1_HEIGHT,
CANVAS1_LEFT,
CANVAS1_TOP,
NNS_G2D_TEXT_BG_WIDTH_256,
cOffset,
0
);
// CharCanvas 1 が使う分のキャラクタ数をオフセットに加算
cOffset += CANVAS1_WIDTH * CANVAS1_HEIGHT;
// TextCanvas の初期化
// CharCanvas 毎に TextCanvas を用意することもできますし、
// 複数の TextCanvas で1つの CharCanvas を共有する事もできます。
// 複数の CharCanvas を1つの TextCanvas で使う場合は
// TextCanvas の CharCanvas を置き換えながら使う事になります。
// 1) 複数の TextCanvas で1つの CharCanvas を共有
// CharCanvas 1 を TextCanvas 0, 1 で共有
{
NNS_G2dTextCanvasInit(
&gTextCanvas[0], // TextCanvasへのポインタ
&gCanvas[0], // 描画先のCharCanvasへのポインタ
(NNSG2dFont*)s_pFontBuffer, // 描画に用いるフォントへのポインタ
TEXT_HSPACE, // 文字間
TEXT_VSPACE // 行間
);
}
// 2) CharCanvas 毎に TextCanvas を用意
// CharCanvas 2 を TextCanvas 2 単独で使用
{
NNS_G2dTextCanvasInit(
&gTextCanvas[1],
&gCanvas[1],
(NNSG2dFont*)s_pFontBuffer,
TEXT_HSPACE,
TEXT_VSPACE
);
}
}

View File

@ -0,0 +1,100 @@
/*---------------------------------------------------------------------------*
Project: TwlIPL - tests - DisplaySystemInfo
File: main.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:: $
$Rev$
$Author$
*---------------------------------------------------------------------------*/
#include <twl.h>
#include <sysmenu.h>
#include "misc.h"
#include "viewSystemInfo.h"
#define CANVAS0_WIDTH 15
#define CANVAS0_HEIGHT 10
#define CANVAS0_LEFT 10
#define CANVAS0_TOP 10
#define CANVAS1_WIDTH 10
#define CANVAS1_HEIGHT 10
#define CANVAS1_LEFT 130
#define CANVAS1_TOP 10
#define TEXT_HSPACE 1 // 文字列描画時の文字間 (ピクセル単位)
#define TEXT_VSPACE 1 // 文字列描画時の行間 (ピクセル単位)
#define CHARACTER_OFFSET 1
/////////////////////////////
void VBlankHandler( void );
/////////////////////////////
/*---------------------------------------------------------------------------*
Name: TwlMain
Description: main
Arguments: None
Returns: None
*---------------------------------------------------------------------------*/
void TwlMain( void )
{
OS_Init();
OS_TPrintf("Initialize...");
SYSM_Init(Alloc, Free );
SYSM_SetArena();
RTC_Init();
//---- interrupt setting
OS_EnableIrq();
OS_EnableInterrupts();
OS_SetIrqFunction( OS_IE_V_BLANK, VBlankHandler );
OS_EnableIrqMask( OS_IE_V_BLANK );
GX_VBlankIntr( TRUE );
InitAllocator();
InitBG();
OS_TPrintf("Finished\n");
displayInfoInit();
FS_Init(FS_DMA_NOT_USE);
OS_TPrintf("begin mainloop\n");
// メインループ
while( 1 )
{
OS_WaitIrq(1, OS_IE_V_BLANK); // Vブランク割り込み待ち
ReadKeyPad(); // キー入力の取得
displayInfoMain(); // ビューア更新
}
}
void VBlankHandler(void)
{
OS_SetIrqCheckFlag( OS_IE_V_BLANK ); // Vブランク割込チェックのセット
}

View File

@ -0,0 +1,427 @@
static const u8 s_numMenuK[] = {
OWNERMENU_KSIZE,
PARENTALMENU_KSIZE,
OTHERMENU_KSIZE,
SCFGMENU_KSIZE,
FUSEMENU_KSIZE,
0,
0,
0,
0,
0,
ROOTMENU_KSIZE
// !!! あとで残りの分も追加するよ
};
static const u8 s_numMenuV[] = {
OWNERMENU_VSIZE,
PARENTALMENU_VSIZE,
OTHERMENU_VSIZE,
SCFGMENU_VSIZE,
FUSEMENU_VSIZE,
0,
0,
0,
0,
0,
ROOTMENU_VSIZE
// !!! あとで残りの分も追加するよ
};
static const u16 *s_strRootMenu[] = {
L"Owner",
L"Parental control",
L"Other machine setting",
L"SCFG",
L"Fuse rom"
};
static const char *s_strMenuName[] = {
"Owner",
"Parental control",
"Other machine setting",
"SCFG",
"Fuse rom"
};
static const u16 *s_strOwnerMenu[] = {
L"Language",
L"Favorite color",
L"Birthday",
L"Country",
L"Nickname",
L"Comment"
};
static const u16 *s_strParentalMenu[] = {
L"Parental control",
L"Organization",
L"Age",
L"Password",
L"Quastion id",
L"Answer"
};
static const u16 *s_strOtherMenu[] = {
L"Wireless",
L"Force Disable Wireless",
L"",
L"Agree EULA",
L"Eula Version",
L"Region",
L"",
L"",
L"Unique ID",
L"",
L"",
L"Serial No"
};
static const u16 *s_strSCFGMenu[] = {
L"UNDER CONSTRUCTION"
};
static const u16 *s_strFuseMenu[] = {
L"UNDER CONSTRUCTION"
};
static const u16 **s_strMetaMenu[] = {
s_strOwnerMenu,
s_strParentalMenu,
s_strOtherMenu,
s_strSCFGMenu,
s_strFuseMenu,
NULL,
NULL,
NULL,
NULL,
NULL,
s_strRootMenu
};
static char *s_strEnable[] = {
"DISABLED",
"ENABLED"
};
static char *s_strBool[] = {
"TRUE",
"FALSE"
};
static char *s_strRatingOrg[] = {
"CERO",
"ESRB",
"BBFC",
"USK",
"PEGI general",
"PEGI Finland",
"PEGI Portugal",
"PEGI and BBFC Great Briten",
"OFLC",
"GRB"
};
static char *s_strRegion[] = {
"JAPAN",
"AMERICA",
"EUROPA",
"AUSTRALIA",
"CHINA",
"KOREA",
};
static char *s_strUserColor[] = {
"GRAY ",
"BROWN ",
"RED ",
"PINK ",
"ORANGE ",
"YELLOW ",
"LIME_GREEN",
"GREEN ",
"DARK_GREEN",
"SEA_GREEN ",
"TURQUOISE ",
"BLUE ",
"DARK_BLUE ",
"PURPLE ",
"VIOLET ",
"MAGENTA ",
};
static char *s_strLanguage[] = {
"JAPANESE",
"ENGLISH",
"FRENCH",
"GERMAN",
"ITALIAN",
"SPANISH",
"CHINESE",
"KOREAN",
};
static char *s_strCountry[] = {
"UNDEFINED ", // 未設定
"JAPAN ", // 日本
"UNKNOWN",
"UNKNOWN",
"UNKNOWN",
"UNKNOWN",
"UNKNOWN",
"UNKNOWN",
"Anguilla ", // アンギラ
"ANTIGUA_AND_BARBUDA", // アンティグア・バーブーダ
"ARGENTINA ", // アルゼンチン
"ARUBA", // アルバ
"BAHAMAS", // バハマ
"BARBADOS", // バルバドス
"BELIZE", // ベリーズ
"BOLIVIA", // ボリビア
"BRAZIL", // ブラジル
"BRITISH_VIRGIN_ISLANDS", // 英領ヴァージン諸島
"CANADA", // カナダ
"CAYMAN_ISLANDS", // ケイマン諸島
"CHILE ", // チリ
"COLOMBIA", // コロンビア
"COSTA_RICA", // コスタリカ
"DOMINICA", // ドミニカ国
"DOMINICAN_REPUBLIC", // ドミニカ共和国
"ECUADOR", // エクアドル
"EL_SALVADOR", // エルサルバドル
"FRENCH_GUIANA", // フランス領ギアナ
"GRENADA", // グレナダ
"GUADELOUPE", // グアドループ
"GUATEMALA ", // グアテマラ
"GUYANA", // ガイアナ
"HAITI", // ハイチ
"HONDURAS", // ホンジュラス
"JAMAICA", // ジャマイカ
"MARTINIQUE", // マルティニーク
"MEXICO", // メキシコ
"MONTSERRAT", // モントセラト
"NETHERLANDS_ANTILLES", // オランダ領アンティル
"NICARAGUA", // ニカラグア
"PANAMA ", // パナマ
"PARAGUAY", // パラグアイ
"PERU", // ペルー
"ST_KITTS_AND_NEVIS", // セントキッツ・ネイビス
"ST_LUCIA", // セントルシア
"ST_VINCENT_AND_THE_GRENADINES", // セントビンセント・グレナディーン
"SURINAME", // スリナム
"TRINIDAD_AND_TOBAGO", // トリニダード・トバゴ
"TURKS_AND_CAICOS_ISLANDS", // タークス・カイコス諸島
"UNITED_STATES", // アメリカ
"URUGUAY ", // ウルグアイ
"US_VIRGIN_ISLANDS", // 米領バージン諸島
"VENEZUELA", // ベネズエラ
"UNKNOWN",
"UNKNOWN",
"UNKNOWN",
"UNKNOWN",
"UNKNOWN",
"UNKNOWN",
"UNKNOWN",
"UNKNOWN",
"UNKNOWN",
"UNKNOWN",
"UNKNOWN",
"ALBANIA ", // アルバニア
"AUSTRALIA", // オーストラリア
"AUSTRIA", // オーストリア
"BELGIUM", // ベルギー
"BOSNIA_AND_HERZEGOVINA", // ボスニア・ヘルツェゴビナ
"BOTSWANA", // ボツワナ
"BULGARIA ", // ブルガリア
"CROATIA", // クロアチア
"CYPRUS", // キプロス
"CZECH_REPUBLIC", // チェコ
"DENMARK", // デンマーク
"ESTONIA", // エストニア
"FINLAND", // フィンランド
"FRANCE", // フランス
"GERMANY", // ドイツ
"GREECE", // ギリシャ
"HUNGARY ", // ハンガリー
"ICELAND", // アイスランド
"IRELAND", // アイルランド
"ITALY", // イタリア
"LATVIA", // ラトビア
"LESOTHO", // レソト
"LIECHTENSTEIN", // リヒテンシュタイン
"LITHUANIA", // リトアニア
"LUXEMBOURG", // ルクセンブルク
"MACEDONIA", // マケドニア
"MALTA ", // マルタ
"MONTENEGRO", // モンテネグロ
"MOZAMBIQUE", // モザンビーク
"NAMIBIA", // ナミビア
"NETHERLANDS", // オランダ
"NEW_ZEALAND", // ニュージーランド
"NORWAY", // ノルウェー
"POLAND", // ポーランド
"PORTUGAL", // ポルトガル
"ROMANIA", // ルーマニア
"RUSSIA ", // ロシア
"SERBIA", // セルビア
"SLOVAKIA", // スロバキア
"SLOVENIA", // スロベニア
"SOUTH_AFRICA", // 南アフリカ
"SPAIN", // スペイン
"SWAZILAND", // スワジランド
"SWEDEN", // スウェーデン
"SWITZERLAND", // スイス
"TURKEY", // トルコ
"UNITED_KINGDOM ", // イギリス
"ZAMBIA", // ザンビア
"ZIMBABWE", // ジンバブエ
"UNKNOWN",
"UNKNOWN",
"UNKNOWN",
"UNKNOWN",
"UNKNOWN",
"UNKNOWN",
"UNKNOWN",
"UNKNOWN",
"UNKNOWN",
"UNKNOWN",
"UNKNOWN",
"UNKNOWN",
"UNKNOWN",
"UNKNOWN",
"UNKNOWN",
"TAIWAN ", // 台湾
"UNKNOWN",
"UNKNOWN",
"UNKNOWN",
"UNKNOWN",
"UNKNOWN",
"UNKNOWN",
"UNKNOWN",
"SOUTH_KOREA ", // 韓国
"UNKNOWN",
"UNKNOWN",
"UNKNOWN",
"UNKNOWN",
"UNKNOWN",
"UNKNOWN",
"UNKNOWN",
"HONG_KONG ", // ホンコン
"MACAU", // マカオ
"UNKNOWN",
"UNKNOWN",
"UNKNOWN",
"UNKNOWN",
"UNKNOWN",
"UNKNOWN",
"INDONESIA ", // インドネシア
"SINGAPORE ", // シンガポール
"THAILAND ", // タイ
"PHILIPPINES", // フィリピン
"MALAYSIA", // マレーシア
"UNKNOWN",
"UNKNOWN",
"UNKNOWN",
"CHINA ", // 中国
"UNKNOWN",
"UNKNOWN",
"UNKNOWN",
"UNKNOWN",
"UNKNOWN",
"UNKNOWN",
"UNKNOWN",
"UAE ", // アラブ首長国連邦
"INDIA ", // インド
"EGYPT ", // エジプト
"OMAN", // オマーン
"QATAR", // カタール
"KUWAIT", // クウェート
"SAUDI_ARABIA", // サウジアラビア
"SYRIA", // シリア
"BAHRAIN", // バーレーン
"JORDAN", // ヨルダン
"UNKNOWN",
"UNKNOWN",
"UNKNOWN",
"UNKNOWN",
"UNKNOWN",
"UNKNOWN",
"UNKNOWN",
"UNKNOWN",
"UNKNOWN",
"UNKNOWN",
"UNKNOWN",
"UNKNOWN",
"UNKNOWN",
"UNKNOWN",
"UNKNOWN",
"UNKNOWN",
"UNKNOWN",
"UNKNOWN",
"UNKNOWN",
"UNKNOWN",
"UNKNOWN",
"UNKNOWN",
"UNKNOWN",
"UNKNOWN",
"UNKNOWN",
"UNKNOWN",
"UNKNOWN",
"UNKNOWN",
"UNKNOWN",
"UNKNOWN",
"UNKNOWN",
"UNKNOWN",
"UNKNOWN",
"UNKNOWN",
"UNKNOWN",
"UNKNOWN",
"UNKNOWN",
"UNKNOWN",
"UNKNOWN",
"UNKNOWN",
"UNKNOWN",
"UNKNOWN",
"UNKNOWN",
"UNKNOWN",
"UNKNOWN",
"UNKNOWN",
"UNKNOWN",
"UNKNOWN",
"UNKNOWN",
"UNKNOWN",
"UNKNOWN",
"UNKNOWN",
"UNKNOWN",
"UNKNOWN",
"UNKNOWN",
"UNKNOWN",
"UNKNOWN",
"UNKNOWN",
"UNKNOWN",
"UNKNOWN",
"UNKNOWN",
"UNKNOWN",
"UNKNOWN",
"UNKNOWN",
"UNKNOWN",
"UNKNOWN",
"UNKNOWN",
"UNKNOWN",
"UNKNOWN",
"UNKNOWN",
"UNKNOWN",
"UNKNOWN",
"UNKNOWN",
"UNKNOWN",
"UNKNOWN",
"UNKNOWN",
"OTHERS ",
"UNKNOWN ",
};
static char s_strNA[] = {
""
};

View File

@ -0,0 +1,354 @@
/*---------------------------------------------------------------------------*
Project: TwlIPL - tests - DisplaySystemInfo
File: viewSystemInfo.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:: $
$Rev$
$Author$
*---------------------------------------------------------------------------*/
#include <wchar.h>
#include <twl/os/common/ownerInfoEx_private.h>
#include "misc.h"
#include "viewSystemInfo.h"
#include "strResource.h"
#define ID_BUFSIZE 2
#define AGE_BUFSIZE 4
#define BIRTHDAY_BUFSIZE 6
/* function prototype ----------------------------- */
void getAllInfo( void );
void initInfo( void );
void infoAlloc( char* p, int size, const char *name);
void control( u8 *menu, u8 *page, u8 *line );
void printAllInfo ( void );
/* global variables ----------------------------- */
RTCDrawProperty g_rtcDraw = {
TRUE, RTC_DATE_TOP_X, RTC_DATE_TOP_Y, RTC_TIME_TOP_X, RTC_TIME_TOP_Y
};
char** gAllInfo[ROOTMENU_KSIZE]; // それぞれのメニューごとに項目の中身を"文字列で"持つ配列
u16 gUserName[OS_OWNERINFO_NICKNAME_MAX + 1];
u16 gUserComment[OS_OWNERINFO_COMMENT_MAX + 1];
u16 gSecretAnswer[OS_TWL_PCTL_SECRET_ANSWER_LENGTH_MAX + 1];
static OSOwnerInfoEx gOwnerInfo; // オーナー情報
static BOOL gbWirelessAvailable; // 無線が有効かどうか
static BOOL gbBatteryExtensionAvailable; // バッテリーエクステンションモードが有効か
static BOOL gbAgreeEula; // Eula同意済みか
static u8 gEulaVersion; // 同意Eulaのバージョン
static const OSTWLParentalControl *gpPC; // ペアレンタルコントロール情報
static u8 gUniqueID[OS_TWL_HWINFO_MOVABLE_UNIQUE_ID_LEN]; // ユニークId
static BOOL gbForceDisableWireless; // 無線の強制無効化フラグ
static OSTWLRegion gRegion; // リージョン番号
static u8 gSerialNo[OS_TWL_HWINFO_SERIALNO_LEN_MAX]; // シリアル番号
/* static data ---------------------------------- */
// メニュー項目数
static const u8 s_numMenu[11]; //暫定
// 文字列リソース
/*
static const u16 *s_strRootMenu[ROOTMENU_SIZE];
static const char *s_strMenuName[ROOTMENU_SIZE];
static const u16 *s_strOwnerMenu[OWNERMENU_SIZE];
static const u16 *s_strParentalMenu[PARENTALMENU_SIZE];
static char *s_strCountry[ 256 ];
static char *s_strRegion[ OS_TWL_REGION_MAX ];
static char *s_strUserColor[ OS_FAVORITE_COLOR_MAX ];
static char *s_strLanguage[ OS_LANGUAGE_CODE_MAX ];
static char *s_strBool[2];
static char *s_strRatingOrg[OS_TWL_PCTL_OGN_MAX];
*/
/* function definition -------------------------- */
void displayInfoMain( void )
{
static u8 menu = MENU_ROOT;
static u8 page = 0, line = 0; // 現在選択しているページナンバと行
static BOOL firstCall = TRUE; // 最初の呼び出しか否か
// 初回の呼び出し時は全ての情報を取得しなおす
if( firstCall )
{
firstCall = FALSE;
initInfo();
getAllInfo();
}
// パッド情報で選んでる場所とか情報とか更新
control( &menu, &page, &line );
// 変更可能な項目でAボタン押したら変更モードに移るとか
// Bボタンでジャンルに戻るとかそんなんやる
NNS_G2dCharCanvasClear( &gCanvas, TXT_COLOR_WHITE );
drawHeader(menu, page, line);
drawMenu(menu, page, line); // 情報一覧を描画する
GetAndDrawRTCData( &g_rtcDraw, FALSE ); // RTC更新
}
void initInfo( void )
{
OS_TPrintf("buffer initialize\n");
// 固定文字列で対応できない項目に文字列領域を割り当てる
gAllInfo[MENU_OWNER][OWNER_BIRTHDAY] = (char*) Alloc (sizeof(char) * BIRTHDAY_BUFSIZE);
SDK_ASSERT( gAllInfo[MENU_OWNER][OWNER_BIRTHDAY] );
gAllInfo[MENU_PARENTAL][PARENTAL_AGE] = (char*) Alloc (sizeof(char) * AGE_BUFSIZE);
SDK_ASSERT( gAllInfo[MENU_PARENTAL][PARENTAL_AGE] );
gAllInfo[MENU_PARENTAL][PARENTAL_PASSWORD] = (char*) Alloc (sizeof(char) * OS_TWL_PCTL_PASSWORD_LENGTH+1);
SDK_ASSERT( gAllInfo[MENU_PARENTAL][PARENTAL_PASSWORD] );
gAllInfo[MENU_OTHER][OTHER_EULA_VERSION] = (char*) Alloc (sizeof(char) * AGE_BUFSIZE);
SDK_ASSERT( gAllInfo[MENU_OTHER][OTHER_EULA_VERSION] );
gAllInfo[MENU_OTHER][OTHER_UNIQUE_ID] = (char*) Alloc (sizeof(char) * OS_TWL_HWINFO_MOVABLE_UNIQUE_ID_LEN*3);
SDK_ASSERT( gAllInfo[MENU_OTHER][OTHER_UNIQUE_ID] );
gAllInfo[MENU_OTHER][OTHER_SERIAL] = (char*) Alloc (sizeof(char) * OS_TWL_HWINFO_SERIALNO_LEN_MAX);
SDK_ASSERT( gAllInfo[MENU_OTHER][OTHER_SERIAL] );
OS_TPrintf( "information alloc succeeded\n" );
}
void getAllInfo( void )
//
{
BOOL SCFGAccessable = FALSE;
BOOL fuseRomAccessable = FALSE;
u8 uniqIDBuf[OS_TWL_HWINFO_MOVABLE_UNIQUE_ID_LEN];
OS_TPrintf("reflesh Information\n");
OS_TPrintf( "...Owner Information\n");
// 本体設定まわり
OS_GetOwnerInfoEx( &gOwnerInfo );
// 全体情報につめていく
// 泥臭すぎるやり方なのであとで考える
gAllInfo[MENU_OWNER][OWNER_LANGUAGE] = s_strLanguage[ gOwnerInfo.language ];
gAllInfo[MENU_OWNER][OWNER_COLOR] = s_strUserColor[ gOwnerInfo.favoriteColor ];
snprintf( gAllInfo[MENU_OWNER][OWNER_BIRTHDAY], BIRTHDAY_BUFSIZE, "%02d/%02d", gOwnerInfo.birthday.month, gOwnerInfo.birthday.day);
OS_TPrintf( "language:%s\n", gAllInfo[MENU_OWNER][OWNER_LANGUAGE]);
gAllInfo[MENU_OWNER][OWNER_COUNTRY] = s_strCountry[gOwnerInfo.country];
wcsncpy( gUserName, gOwnerInfo.nickName, OS_OWNERINFO_NICKNAME_MAX + 1);
wcsncpy( gUserComment, gOwnerInfo.comment, OS_OWNERINFO_COMMENT_MAX + 1 ); // !!! なぜかコメントが取得できない 要検証
// wcsncpy( gUserComment, L"うべらべらー", OS_OWNERINFO_COMMENT_MAX + 1 );
OS_TPrintf( "...Parental Control Information\n" );
// ペアレンタルコントロールまわり
gpPC = OS_GetParentalControlInfoPtr();
gAllInfo[MENU_PARENTAL][PARENTAL_FLAG] = s_strBool[ gpPC->flags.isSetParentalControl ];
gAllInfo[MENU_PARENTAL][PARENTAL_ORGANIZATION] = s_strRatingOrg[ gpPC->ogn ];
snprintf( gAllInfo[MENU_PARENTAL][PARENTAL_AGE], AGE_BUFSIZE, "%d", gpPC->ratingAge );
snprintf( gAllInfo[MENU_PARENTAL][PARENTAL_QUESTION_ID], ID_BUFSIZE, "%d", gpPC->secretQuestionID );
wcsncpy( gUserComment, gpPC->secretAnswer, OS_TWL_PCTL_SECRET_ANSWER_LENGTH_MAX + 1);
snprintf( gAllInfo[MENU_PARENTAL][PARENTAL_PASSWORD], OS_TWL_PCTL_PASSWORD_LENGTH + 1, "%d", gpPC->password );
OS_TPrintf( "...Other Machine Setting Information\n" );
// そのほかの本体情報まわり
//gbBatteryExtensionAvailable = OS_IsAvailableBatteryExtension();
gAllInfo[MENU_OTHER][OTHER_WIRELESS] = s_strEnable[ OS_IsAvailableWireless() ];
gAllInfo[MENU_OTHER][OTHER_FORCE_DISABLE] = s_strBool[ OS_IsForceDisableWireless() ];
gAllInfo[MENU_OTHER][OTHER_AGREE_EULA] = s_strBool[ OS_IsAgreeEULA() ];
snprintf( gAllInfo[MENU_OTHER][OTHER_EULA_VERSION], AGE_BUFSIZE, "%d", OS_GetAgreedEULAVersion()) ;
gAllInfo[MENU_OTHER][OTHER_REGION] = s_strRegion[ OS_GetRegion() ];
{
int i;
char ascii[] = "0123456789abcdef";
const u8 *unq = OS_GetMovableUniqueIDPtr();
// 16進で1バイトずつ詰めていく
// バッファが長さの3倍長なのは、データを"%02x-%02x-%02x..."に置換するため
for(i=0; i < OS_TWL_HWINFO_MOVABLE_UNIQUE_ID_LEN*3; i += 3, unq++ )
{
gAllInfo[MENU_OTHER][OTHER_UNIQUE_ID][i] = ascii[(*unq>>4) & 0x0f];
gAllInfo[MENU_OTHER][OTHER_UNIQUE_ID][i+1] = ascii[*unq & 0x0f];
gAllInfo[MENU_OTHER][OTHER_UNIQUE_ID][i+2] =
(i+2) == (OS_TWL_HWINFO_MOVABLE_UNIQUE_ID_LEN*3 - 1) ? '\0' : '-' ;
OS_TPrintf("uniqid: %d\n", *unq);
}
}
{
u8 serialBuf[OS_TWL_HWINFO_SERIALNO_LEN_MAX];
OS_GetSerialNo( serialBuf );
snprintf( gAllInfo[MENU_OTHER][OTHER_SERIAL], OS_TWL_HWINFO_SERIALNO_LEN_MAX, "%s", serialBuf);
}
// ヘッダ情報をチェック
// SecureアプリならfuseROM見える
// Secureアプリか明示的に指定したアプリならSCFGレジスタ見える
/*
if( SCFGAccessable && SCFG_IsSecureRomAccessible())
{
}
if( fuseRomAccessable )
{
}*/
printAllInfo();
OS_TPrintf("reflesh information finished\n");
}
void control( u8 *menu, u8 *page, u8 *line )
{
u8 pagemax = ( s_numMenuK[*menu] / NUM_LINES ) + 1; // 選択中メニューのページ数
u8 linemax = ( s_numMenuK[*menu] - (*page * NUM_LINES)) > NUM_LINES ?
NUM_LINES : s_numMenuK[*menu] - (*page * NUM_LINES); // 選択中ページの項目数
if( pad.trg & PAD_KEY_UP )
{
// 項目名のないところはカーソル飛ばす
do
{
*line = (*line + linemax - 1) % linemax;
}
while( !wcscmp( s_strMetaMenu[*menu][*line], L"") );
}
else if( pad.trg & PAD_KEY_DOWN )
{
do
{
*line = (*line+1) % linemax;
}
while( !wcscmp( s_strMetaMenu[*menu][*line], L"") );
}
if( pad.trg & PAD_KEY_LEFT )
{
// ページ送り
*page = (*page + pagemax - 1) % pagemax;
*line = 0;
}
else if( pad.trg & PAD_KEY_RIGHT )
{
*page = (*page+1) % pagemax;
*line = 0;
}
if( pad.trg & PAD_BUTTON_A )
{
if(*menu == MENU_ROOT)
{
// 次のメニュー画面を開く
*menu = *line;
*line = 0;
*page = 0;
}
else
{
// !!! 設定可能な項目だったら設定変更画面
}
}
if( pad.trg & PAD_BUTTON_B )
{
// !!! とりあえず今はルートに戻る
// 値設定画面の時はキャンセルするだけにする
*menu = MENU_ROOT;
*page = 0;
*line = 0;
}
}
void displayInfoInit( void )
{
int loop1,loop2;
GX_DispOff();
GXS_DispOff();
NNS_G2dCharCanvasClear( &gCanvas, TXT_COLOR_WHITE );
PutStringUTF16( 1 * 8, 0 * 8, TXT_COLOR_BLUE, (const u16 *)L"RomTypeTest");
PutStringUTF16( 4 * 8, 8 * 8, TXT_COLOR_BLACK, (const u16 *)L"Push A To Start Test.");
PutStringUTF16( 4 * 8, 10 * 8, TXT_COLOR_BLACK, (const u16 *)L"Push X To Start Test Quietly.");
GetAndDrawRTCData( &g_rtcDraw, TRUE );
// 全体情報を持つ配列をセット
// 全項目に文字列バッファを持たせるとメモリ書き込みが多くなるので
// 可能なものはstatic文字列へのポインタで対応
// 必要なものだけあとでmallocする
for(loop1=0; loop1<ROOTMENU_KSIZE; loop1++)
{
int loop2;
gAllInfo[loop1] = (char**)Alloc(sizeof(char*) * s_numMenuV[loop1]);
if(gAllInfo[loop1] == NULL ){
OS_TPrintf( "AllInfo malloc failed\n");
return;
}
// とりあえず全部N/Aで埋めておく
for(loop2=0; loop2<s_numMenuV[loop1]; loop2++)
{
gAllInfo[loop1][loop2] = s_strNA;
}
}
GXS_SetVisiblePlane( GX_PLANEMASK_BG0 );
GX_DispOn();
GXS_DispOn();
}
void printAllInfo ( void )
{
int loop1, loop2;
for(loop1=0; loop1 < ROOTMENU_KSIZE; loop1++ )
{
for(loop2=0; loop2 < s_numMenuV[loop1]; loop2++ )
{
// utf16で描画するものだけ分ける
if(loop1 == MENU_OWNER && loop2 == OWNER_NICKNAME)
{
OS_TPrintf("%d %d : %s\n", loop1, loop2, gUserName);
}
else if(loop1 == MENU_OWNER && loop2 == OWNER_COMMENT)
{
OS_TPrintf("%d %d : %s\n", loop1, loop2, gUserComment);
}
else if(loop1 == MENU_PARENTAL && loop2 == PARENTAL_ANSWER)
{
OS_TPrintf("%d %d : %s\n", loop1, loop2, gSecretAnswer);
}
else
{
OS_TPrintf("%d %d : %s\n", loop1, loop2, gAllInfo[loop1][loop2]);
}
}
}
}

View File

@ -0,0 +1,50 @@
/*---------------------------------------------------------------------------*
Project: TwlIPL - tests - DisplaySystemInfo
File: viewSystemInfo.h
Copyright 2008 Nintendo. All rights reserved.
These coded instructions, statements, and computer programs contain
proprietary information of Nintendo of America Inc. and/or Nintendo
Company Ltd., and are protected by Federal copyright law. They may
not be disclosed to third parties or copied or duplicated in any form,
in whole or in part, without the prior written consent of Nintendo.
$Date:: $
$Rev$
$Author$
*---------------------------------------------------------------------------*/
#ifndef __LOAD_VIEW_INFO__
#define __LOAD_VIEW_INFO__
#include <twl.h>
#include "drawFunc.h"
#ifdef __cplusplus
extern "C" {
#endif
////////////////////////////////
// 各種本体、ユーザ情報
extern char** gAllInfo[ROOTMENU_KSIZE]; // それぞれのメニューごとに項目の中身を"文字列で"持つ配列
extern u16 gUserName[OS_OWNERINFO_NICKNAME_MAX + 1];
extern u16 gUserComment[OS_OWNERINFO_COMMENT_MAX + 1];
extern u16 gSecretAnswer[OS_TWL_PCTL_SECRET_ANSWER_LENGTH_MAX + 1];
////////////////////////////////
void displayInfoMain( void );
void displayInfoInit( void );
////////////////////////////////
#ifdef __cplusplus
}
#endif
#endif // __LOAD_VIEW_INFO__

View File

@ -0,0 +1,116 @@
/*---------------------------------------------------------------------------*
Project: TwlIPL - tests - DisplaySystemInformation
File: main.c
Copyright **** Nintendo. All rights reserved.
These coded instructions, statements, and computer programs contain
proprietary information of Nintendo of America Inc. and/or Nintendo
Company Ltd., and are protected by Federal copyright law. They may
not be disclosed to third parties or copied or duplicated in any form,
in whole or in part, without the prior written consent of Nintendo.
$Date:: $
$Rev:$
$Author:$
*---------------------------------------------------------------------------*/
#include <twl.h>
#include <twl/sea.h>
#include "misc.h"
#include "viewSystemInfo.h"
#include "address.h"
#define CANVAS0_WIDTH 15
#define CANVAS0_HEIGHT 10
#define CANVAS0_LEFT 10
#define CANVAS0_TOP 10
#define CANVAS1_WIDTH 10
#define CANVAS1_HEIGHT 10
#define CANVAS1_LEFT 130
#define CANVAS1_TOP 10
#define TEXT_HSPACE 1 // 文字列描画時の文字間 (ピクセル単位)
#define TEXT_VSPACE 1 // 文字列描画時の行間 (ピクセル単位)
#define CHARACTER_OFFSET 1
/////////////////////////////
void VBlankHandler( void );
/////////////////////////////
/*---------------------------------------------------------------------------*
Name: TwlMain
Description: main
Arguments: None
Returns: None
*---------------------------------------------------------------------------*/
void TwlMain( void )
{
OS_Init();
OS_InitTick();
OS_TPrintf("Initialize begin\n");
// ARM7側でメモリ内にセットされたSCFGのデータを確保
MI_CpuMove16( DISPINFO_SHARED_SCFG_REG_ADDR, gArm7SCFGReg, DISPINFO_SHARED_SCFG_REG_SIZE );
// WRAMに退避されてる分もコピー
MI_CpuMove16( DISPINFO_SHARED_SCFG_WRAM_ADDR, gArm7SCFGWram, DISPINFO_SHARED_SCFG_WRAM_SIZE );
//---- interrupt setting
OS_EnableIrq();
OS_EnableInterrupts();
GX_Init();
OS_TPrintf( "File System Initialize...\n");
// FS_Init( FS_DMA_NOT_USE );
OS_SetIrqFunction( OS_IE_V_BLANK, VBlankHandler );
OS_EnableIrqMask( OS_IE_V_BLANK );
GX_VBlankIntr( TRUE );
OS_TPrintf("RTC Initilize...\n");
RTC_Init();
OS_TPrintf("Allocator Initialize...\n");
InitAllocator();
OS_TPrintf("NAM Initialize...\n");
NAM_Init( Alloc, Free );
InitBG();
OS_TPrintf("Initialize Finished\n");
displayInfoInit();
OS_TPrintf("begin mainloop\n");
// メインループ
while( 1 )
{
OS_WaitIrq(1, OS_IE_V_BLANK); // Vブランク割り込み待ち
ReadKeyPad(); // キー入力の取得
displayInfoMain(); // ビューア更新
}
OS_Terminate();
}
void VBlankHandler(void)
{
OS_SetIrqCheckFlag( OS_IE_V_BLANK ); // Vブランク割込チェックのセット
}

View File

@ -0,0 +1,759 @@
/*---------------------------------------------------------------------------*
Project: TwlIPL
File: misc.c
Copyright 2007 Nintendo. All rights reserved.
These coded instructions, statements, and computer programs contain
proprietary information of Nintendo of America Inc. and/or Nintendo
Company Ltd., and are protected by Federal copyright law. They may
not be disclosed to third parties or copied or duplicated in any form,
in whole or in part, without the prior written consent of Nintendo.
$Date:: $
$Rev$
$Author$
*---------------------------------------------------------------------------*/
#include <twl.h>
#include "misc.h"
// define data-----------------------------------------------------------------
#define NTR_IPL_FONT_DATA "data/NTR_IPL_font_m.NFTR"
#define STRING_LENGTH_MAX 256
#define GRAY(x) GX_RGB(x, x, x)
enum
{
TXT_CPALETTE_MAIN,
TXT_CPALETTE_USERCOLOR,
TXT_CPALETTE_USERCOLORSAMPLE,
TXT_CPALETTE_4BPP,
TXT_NUM_CPALEETE
};
// デモ共通のカラーパレット
GXRgb TXTColorPalette[TXT_NUM_CPALEETE * 16] =
{
GX_RGB(31, 31, 31), GX_RGB(31, 31, 31), GX_RGB( 0, 0, 0), GX_RGB(31, 0, 0),// 基本文字色
GX_RGB( 0, 31, 0), GX_RGB( 0, 0, 31), GX_RGB( 0, 31, 31), GX_RGB(31, 0, 31),
GX_RGB(31, 31, 0), GX_RGB( 0, 0, 0), GX_RGB( 0, 0, 0), GX_RGB( 0, 0, 0),
GX_RGB( 0, 0, 0), GX_RGB( 0, 0, 0), GX_RGB( 0, 0, 0), GX_RGB( 0, 0, 0),
GX_RGB( 0, 0, 0), GX_RGB(12, 16, 19), GX_RGB(23, 9, 0), GX_RGB(31, 0, 3),// ユーザーカラー領域
GX_RGB(31, 17, 31), GX_RGB(31, 18, 0), GX_RGB(30, 28, 0), GX_RGB(21, 31, 0),
GX_RGB( 0, 20, 7), GX_RGB( 9, 27, 17), GX_RGB( 6, 23, 30), GX_RGB( 0, 11, 30),
GX_RGB( 0, 0, 18), GX_RGB(17, 0, 26), GX_RGB(26, 0, 29), GX_RGB(31, 0, 18),
GX_RGB(12, 16, 19), GX_RGB(23, 9, 0), GX_RGB(31, 0, 3), GX_RGB(31, 17, 31),// ユーザーカラーのサンプル領域
GX_RGB(31, 18, 0), GX_RGB(30, 28, 0), GX_RGB(21, 31, 0), GX_RGB( 0, 31, 0),
GX_RGB( 0, 20, 7), GX_RGB( 9, 27, 17), GX_RGB( 6, 23, 30), GX_RGB( 0, 11, 30),
GX_RGB( 0, 0, 18), GX_RGB(17, 0, 26), GX_RGB(26, 0, 29), GX_RGB(31, 0, 18),
GRAY(31), GRAY(29), GRAY(27), GRAY(25),
GRAY(23), GRAY(21), GRAY(19), GRAY(17),
GRAY(15), GRAY(14), GRAY(12), GRAY(10),
GRAY( 8), GRAY( 6), GRAY( 3), GRAY( 0),
};
// グラデパレットを作るためのマクロ
#define MAKECOLOR(r,g,b) GX_RGB( 0, 0, 0), GX_RGB(r, g, b), MC(r,g,b,1), MC(r,g,b,2),\
MC(r,g,b,3), MC(r,g,b,4), MC(r,g,b,5), MC(r,g,b,6),\
MC(r,g,b,7), MC(r,g,b,8), MC(r,g,b,9), MC(r,g,b,10),\
MC(r,g,b,11), MC(r,g,b,12), MC(r,g,b,13), GX_RGB(31, 31, 31)
#define MC(r,g,b,i) GX_RGB(r+((31-r)*i)/14, g+((31-g)*i)/14, b+((31-b)*i)/14)
// ユーザーカラーパレット切り替え用
GXRgb TempPalette[16 * 16] =
{
MAKECOLOR(12, 16, 19),
MAKECOLOR(23, 9, 0),
MAKECOLOR(31, 0, 3),
MAKECOLOR(31, 17, 31),
MAKECOLOR(31, 18, 0),
MAKECOLOR(30, 28, 0),
MAKECOLOR(21, 31, 0),
MAKECOLOR( 0, 31, 0),
MAKECOLOR( 0, 20, 7),
MAKECOLOR( 9, 27, 17),
MAKECOLOR( 6, 23, 30),
MAKECOLOR( 0, 11, 30),
MAKECOLOR( 0, 0, 18),
MAKECOLOR(17, 0, 26),
MAKECOLOR(26, 0, 29),
MAKECOLOR(31, 0, 18),
};
// extern data-----------------------------------------------------------------
// define data-----------------------------------------------------------------
#define CANVAS_WIDTH 32 // 文字描画域の幅 (キャラクタ単位)
#define CANVAS_HEIGHT 24 // 文字描画域の高さ (キャラクタ単位)
#define CANVAS_LEFT 0 // 文字描画域の位置X (キャラクタ単位)
#define CANVAS_TOP 0 // 文字描画域の位置Y (キャラクタ単位)
#define TEXT_HSPACE 1 // 文字列描画時の文字間 (ピクセル単位)
#define TEXT_VSPACE 1 // 文字列描画時の行間 (ピクセル単位)
#define CHARACTER_OFFSET 0 // 使用するキャラクタ列の開始番号
// RTCデータ表示位置ワーク
typedef struct RtcDrawPos{
int date_x;
int date_y;
int time_x;
int time_y;
}RtcDrawPos;
// function's prototype-------------------------------------------------------
static BOOL WaitDetachTP( void );
static void StartDetachTP( void );
static void InitScreen( void );
static void InitCanvas( void );
// global variable-------------------------------------------------------------
KeyWork pad; // キーパッド入力データ
TpWork tpd; // タッチパネル入力データ
NNSFndAllocator g_allocator; // メモリアロケータ
NNSG2dFont gFont; // フォント
NNSG2dCharCanvas gCanvas; // CharCanvas
NNSG2dTextCanvas gTextCanvas; // TextCanvas
NNSG2dCharCanvas gCanvasSub; // CharCanvas
NNSG2dTextCanvas gTextCanvasSub; // TextCanvas
// static variable-------------------------------------------------------------
static int s_detach_count;
static RtcDrawPos s_rtcPos;
static RTCDate s_rtcDate;
static RTCTime s_rtcTime;
static u16 s_vcount;
static char s_strBuffer[ STRING_LENGTH_MAX * 2 ] ATTRIBUTE_ALIGN(2);
static u16 s_strBufferUTF16[ STRING_LENGTH_MAX ];
// const data------------------------------------------------------------------
// 曜日データ表示用文字コード
const u8 *const g_strWeek[] ATTRIBUTE_ALIGN(2) = {
(const u8 *)"SUN",
(const u8 *)"MON",
(const u8 *)"TUE",
(const u8 *)"WED",
(const u8 *)"THU",
(const u8 *)"FRI",
(const u8 *)"SAT",
};
// ============================================================================
// メモリ管理
// ============================================================================
// アロケータの初期化
void InitAllocator( void )
{
// ※暫定対策 FS_Init内でハッシュチェック用のヒープを確保しているため、
// ユーザーヒープの確保前にFS_Initを行う必要がある。
// ファイルシステム初期化
FS_Init( FS_DMA_NOT_USE );
{
NNSFndAllocator *pAllocator = &g_allocator;
u32 arenaLow = MATH_ROUNDUP ( (u32)OS_GetMainArenaLo(), 16 );
u32 arenaHigh = MATH_ROUNDDOWN( (u32)OS_GetMainArenaHi(), 16 );
u32 heapSize = arenaHigh - arenaLow;
void* heapMemory = OS_AllocFromMainArenaLo( heapSize, 16 );
NNSFndHeapHandle heapHandle;
SDK_NULL_ASSERT( pAllocator );
heapHandle = NNS_FndCreateExpHeap( heapMemory, heapSize );
SDK_ASSERT( heapHandle != NNS_FND_HEAP_INVALID_HANDLE );
NNS_FndInitAllocatorForExpHeap( pAllocator, heapHandle, 32 );
}
}
// メモリ割り当て
void *Alloc( u32 size )
{
return NNS_FndAllocFromAllocator( &g_allocator, size );
}
// メモリ解放
void Free( void *pBuffer )
{
NNS_FndFreeToAllocator( &g_allocator, pBuffer );
}
// ============================================================================
// 画面設定
// ============================================================================
// BG初期化
void InitBG(void)
{
// 画面OFF
GX_DispOff();
GXS_DispOff();
// VRAMの割り当てを全て解除
GX_DisableBankForBG();
GX_DisableBankForOBJ();
GX_DisableBankForSubBG();
GX_DisableBankForSubOBJ();
// メイン2Dエンジンの出力を下画面に
GX_SetDispSelect( GX_DISP_SELECT_SUB_MAIN );
// メインLCD
{
// VRAM割り当て
GX_SetBankForBG ( GX_VRAM_BG_128_A );
GX_SetBankForOBJ( GX_VRAM_OBJ_128_B );
MI_CpuClearFast( (void *)HW_BG_VRAM, 0x20000 ); // BG -VRAM クリア
MI_CpuClearFast( (void *)HW_OBJ_VRAM, 0x20000 ); // OBJ-VRAM クリア
MI_DmaFill32( 3, (void *)HW_OAM, 192, HW_OAM_SIZE ); // OAM クリア
// カラーパレットを設定
GX_LoadBGPltt( TXTColorPalette, 0, sizeof(TXTColorPalette) );
// BGモード設定
GX_SetGraphicsMode( GX_DISPMODE_GRAPHICS, GX_BGMODE_0, GX_BG0_AS_2D );
GX_SetBGScrOffset ( GX_BGSCROFFSET_0x10000 );
GX_SetBGCharOffset( GX_BGCHAROFFSET_0x00000 );
}
// サブLCD
{
// VRAM割り当て
GX_SetBankForSubBG ( GX_VRAM_SUB_BG_128_C ); // VRAM-C for BGs
GX_SetBankForSubOBJ( GX_VRAM_SUB_OBJ_128_D ); // VRAM-D for BGs
MI_CpuClearFast( (void *)HW_DB_BG_VRAM, 0x20000 ); // BG -VRAM クリア
MI_CpuClearFast( (void *)HW_DB_OBJ_VRAM, 0x20000 ); // OBJ -VRAM クリア
// カラーパレットを設定
GXS_LoadBGPltt( TXTColorPalette, 0, sizeof(TXTColorPalette) );
// BGモード設定
GXS_SetGraphicsMode( GX_BGMODE_0 ); // BGMODE is 0
}
InitScreen();
InitCanvas();
}
// スクリーン初期化
static void InitScreen( void )
{
// メイン画面 BG 0 を設定
G2_SetBG0Control(
GX_BG_SCRSIZE_TEXT_256x256, // スクリーンサイズ 256x256
GX_BG_COLORMODE_256, // カラーモード 256色
GX_BG_SCRBASE_0xf800, // スクリーンベース
GX_BG_CHARBASE_0x00000, // キャラクタベース
GX_BG_EXTPLTT_01 // 拡張パレットスロット
);
G2_SetBG1Control(
GX_BG_SCRSIZE_TEXT_256x256, // 256pix x 256pix text
GX_BG_COLORMODE_16, // use 16 colors mode
GX_BG_SCRBASE_0xe800, // screen base offset + 0x0000 is the address for BG #1 screen
GX_BG_CHARBASE_0x10000, // character base offset + 0x04000 is the address for BG #0 characters
GX_BG_EXTPLTT_01 // use BGExtPltt slot #0 if BGExtPltt is enabled
);
G2_SetBG2ControlText(
GX_BG_SCRSIZE_TEXT_256x256, // 256pix x 256pix text
GX_BG_COLORMODE_16, // use 16 colors mode
GX_BG_SCRBASE_0xd800, // screen base offset + 0x0000 is the address for BG #1 screen
GX_BG_CHARBASE_0x14000 // character base offset + 0x04000 is the address for BG #0 characters
);
GX_SetVisiblePlane( GX_PLANEMASK_BG0 | GX_PLANEMASK_BG1);
G2_SetBG2Priority(0);
G2_SetBG0Priority(1);
G2_SetBG1Priority(2);
// サブ画面 BG 0 を設定
G2S_SetBG0Control(
GX_BG_SCRSIZE_TEXT_256x256, // 256pix x 256pix text
GX_BG_COLORMODE_16, // use 16 colors mode
GX_BG_SCRBASE_0xf800, // screen base offset + 0x0000 is the address for BG #0 screen
GX_BG_CHARBASE_0x00000, // character base offset + 0x04000 is the address for BG #0 characters
GX_BG_EXTPLTT_01 // use BGExtPltt slot #0 if BGExtPltt is enabled
);
GXS_SetVisiblePlane( GX_PLANEMASK_BG0 ); // display only BG #0
}
// 文字列描画の初期化
static void InitCanvas( void )
{
CMN_InitFileSystem( &g_allocator );
// フォントを読み込みます
{
void* pFontFile;
u32 size = CMN_LoadFile( &pFontFile, NTR_IPL_FONT_DATA, &g_allocator);
NNS_G2D_ASSERT( size > 0 );
NNS_G2dFontInitUTF16(&gFont, pFontFile);
// NNS_G2dPrintFont(&gFont);
}
{
// CharCanvas の初期化
NNS_G2dCharCanvasInitForBG(
&gCanvas,
(GXCharFmt256*)G2_GetBG0CharPtr() + CHARACTER_OFFSET,
CANVAS_WIDTH,
CANVAS_HEIGHT,
NNS_G2D_CHARA_COLORMODE_256
);
// TextCanvasの初期化
NNS_G2dTextCanvasInit(
&gTextCanvas,
&gCanvas,
&gFont,
TEXT_HSPACE,
TEXT_VSPACE
);
// スクリーンを設定
NNS_G2dMapScrToCharText(
G2_GetBG0ScrPtr(),
CANVAS_WIDTH,
CANVAS_HEIGHT,
CANVAS_LEFT,
CANVAS_TOP,
NNS_G2D_TEXT_BG_WIDTH_256,
CHARACTER_OFFSET,
TXT_CPALETTE_MAIN
);
}
{
// CharCanvas の初期化
NNS_G2dCharCanvasInitForBG(
&gCanvasSub,
(GXCharFmt16*)G2S_GetBG0CharPtr() + CHARACTER_OFFSET,
CANVAS_WIDTH,
CANVAS_HEIGHT,
NNS_G2D_CHARA_COLORMODE_16
);
// TextCanvasの初期化
NNS_G2dTextCanvasInit(
&gTextCanvasSub,
&gCanvasSub,
&gFont,
TEXT_HSPACE,
TEXT_VSPACE
);
// スクリーンを設定
NNS_G2dMapScrToCharText(
G2S_GetBG0ScrPtr(),
CANVAS_WIDTH,
CANVAS_HEIGHT,
CANVAS_LEFT,
CANVAS_TOP,
NNS_G2D_TEXT_BG_WIDTH_256,
CHARACTER_OFFSET,
TXT_CPALETTE_MAIN
);
}
}
// UTF16での直接文字表示
void PutStringUTF16( int x, int y, int color, const u16 *strUTF16 )
{
NNS_G2dTextCanvasDrawText( &gTextCanvas, x, y, color, TXT_DRAWTEXT_FLAG_DEFAULT,
strUTF16 );
}
void PutStringUTF16Sub( int x, int y, int color, const u16 *strUTF16 )
{
NNS_G2dTextCanvasDrawText( &gTextCanvasSub, x, y, color, TXT_DRAWTEXT_FLAG_DEFAULT,
strUTF16 );
}
// 書式付きで作成した文字列を表示した場合の幅を取得する
int GetPrintfWidth( const NNSG2dTextCanvas *pCanvas, const char *fmt, ... )
{
int srcLen;
int dstLen = sizeof(s_strBufferUTF16);
va_list vlist;
va_start(vlist, fmt);
srcLen = STD_TVSNPrintf( s_strBuffer, sizeof(s_strBuffer), fmt, vlist);
va_end(vlist);
s_strBuffer[ srcLen ] = 0;
(void)STD_ConvertStringSjisToUnicode( s_strBufferUTF16, &dstLen, s_strBuffer, &srcLen, NULL );
s_strBufferUTF16[ dstLen ] = 0;
return NNS_G2dTextCanvasGetTextWidth( pCanvas, s_strBufferUTF16 );
}
// SJISでPrintf形式で文字表示内部でUTF16に変換)
void PrintfSJIS( int x, int y, int color, const char *fmt, ... )
{
int srcLen;
int dstLen = sizeof(s_strBufferUTF16);
va_list vlist;
va_start(vlist, fmt);
srcLen = STD_TVSNPrintf( s_strBuffer, sizeof(s_strBuffer), fmt, vlist);
va_end(vlist);
s_strBuffer[ srcLen ] = 0;
(void)STD_ConvertStringSjisToUnicode( s_strBufferUTF16, &dstLen, s_strBuffer, &srcLen, NULL );
s_strBufferUTF16[ dstLen ] = 0;
NNS_G2dTextCanvasDrawText(&gTextCanvas, x, y, color, TXT_DRAWTEXT_FLAG_DEFAULT,
s_strBufferUTF16 );
}
void PrintfSJISSub( int x, int y, int color, const char *fmt, ... )
{
int srcLen;
int dstLen = sizeof(s_strBufferUTF16);
va_list vlist;
va_start(vlist, fmt);
srcLen = STD_TVSNPrintf( s_strBuffer, sizeof(s_strBuffer), fmt, vlist);
va_end(vlist);
s_strBuffer[ srcLen ] = 0;
(void)STD_ConvertStringSjisToUnicode( s_strBufferUTF16, &dstLen, s_strBuffer, &srcLen, NULL );
s_strBufferUTF16[ dstLen ] = 0;
NNS_G2dTextCanvasDrawText(&gTextCanvasSub, x, y, color, TXT_DRAWTEXT_FLAG_DEFAULT,
s_strBufferUTF16 );
}
// キー入力読み出し--------------------------------
void ReadKeyPad(void)
{
u16 readData = PAD_Read();
pad.trg = (u16)(readData & (readData ^ pad.cont)); // トリガ 入力
pad.cont = readData; // ベタ 入力
}
// タッチパネルデータの取得-----------------------
void ReadTP(void)
{
TP_GetCalibratedPoint( &tpd.last, &tpd.raw ); // 前回のTPデータを退避
if( TP_RequestRawSampling(&tpd.raw) ) { // タッチパネルのサンプリング
SVC_CpuClear(0x0000, &tpd.raw, sizeof(tpd.raw), 16); // SPI-busyでデータ取得に失敗した時は”データなし”でリターン。
return;
}
TP_GetCalibratedPoint( &tpd.disp, &tpd.raw ); // TP座標からLCD座標に変換。
if( !WaitDetachTP() ) { // TPデタッチ待ちを行う。
SVC_CpuClear(0x0000, &tpd.disp, sizeof(tpd.disp), 16); // SPI-busyでデータ取得に失敗した時は”データなし”でリターン。
return;
}
#if 0
if(tpd.disp.touch) { // 現在のTPデータを表示
switch ( tpd.disp.validity ) {
case TP_VALIDITY_VALID:
OS_Printf("( %3d, %3d ) -> ( %3d, %3d )\n", tpd.raw.x, tpd.raw.y, tpd.disp.x, tpd.disp.y);
break;
case TP_VALIDITY_INVALID_X:
OS_Printf("( *%3d, %3d ) -> ( *%3d, %3d )\n", tpd.raw.x, tpd.raw.y, tpd.disp.x, tpd.disp.y);
break;
case TP_VALIDITY_INVALID_Y:
OS_Printf("( %3d, *%3d ) -> ( %3d, *%3d )\n", tpd.raw.x, tpd.raw.y, tpd.disp.x, tpd.disp.y);
break;
case TP_VALIDITY_INVALID_XY:
OS_Printf("( *%3d, *%3d ) -> ( *%3d, *%3d )\n", tpd.raw.x, tpd.raw.y, tpd.disp.x, tpd.disp.y);
break;
}
}
#endif
}
// TPデタッチを待つ
static BOOL WaitDetachTP( void )
{
// s_detach_countが始動していたら、カウント判定。
if(s_detach_count > 0) {
if(tpd.disp.touch == 0) { // TPが押されていなければ、カウント進行し規定値で再入力を受け付ける。
s_detach_count--;
}else {
s_detach_count = TP_CSR_DETACH_COUNT;
}
return FALSE;
}
return TRUE;
}
// TPデタッチ待ちの開始
static void StartDetachTP( void )
{
s_detach_count = TP_CSR_DETACH_COUNT;
}
//======================================================
// メニュー制御
//======================================================
// メニュー描画
void DrawMenu( u16 nowCsr, const MenuParam *pMenu )
{
int i;
int color;
for( i = 0; i < pMenu->num; i++ ) {
if(i == nowCsr) {
if( !pMenu->pos[ i ].enable ) {
color = pMenu->disable_color;
}else {
color = pMenu->select_color;
}
}else {
color = pMenu->normal_color;
}
PutStringUTF16( pMenu->pos[ i ].x, pMenu->pos[ i ].y, color, (pMenu->str_elem)[ i ] );
}
}
// タッチパネルによる選択を行う関数・汎用版。
// 主にチャタリングを吸収する程度の機能を持つ。
// SelectSomethingFunc型の関数ポインタfuncには、次に示す条件を満たす関数を作り、リストにしてセットして使う。
// 要素上でタッチしていればTRUEを返し、そうでなければFALSEを返す。
// 2.第一引数に与えたポインタの指す変数にカーソル位置を入れて返す。
BOOL SelectSomethingByTP( u16 *nowCsr, SelectSomethingFunc func[], int funcnum )
{
int i;
static u16 detach_count = 0;
static u16 csr_old = 0xffff;
static u16 same_csr_count = 0;
// detach_countが始動していたら、カウント判定。
if( detach_count > 0 ) {
if( tpd.disp.touch == 0 ) { // TPが押されていなければ、カウント進行し、TP_CSR_DETACH_COUNTカウントでメニュー選択
if( ++detach_count == TP_CSR_DETACH_COUNT ) {
detach_count = 0;
same_csr_count = 0;
*nowCsr = csr_old;
return TRUE;
}else {
return FALSE;
}
}
}
detach_count=0; // detachカウント値のクリア
for( i = 0; i < funcnum; i++ ) {
if( tpd.disp.touch ) { // タッチパネルがタッチされているなら、
u16 csr;
if( func[i]( &csr, &tpd.disp ) ) { // funcは要素上にタッチされていればTRUEを返し、カーソル位置も返してくれる関数
if( tpd.disp.validity == TP_VALIDITY_VALID ) { // カーソルをその要素に移動
if( csr_old == csr ) {
if( same_csr_count < TP_CSR_TOUCH_COUNT ) {
same_csr_count++;
}
if( same_csr_count == TP_CSR_TOUCH_COUNT ) {
*nowCsr = csr;
}
return FALSE;
}else {
csr_old = csr;
}
break;
}
}else {
}
}else { // touch==0
if( same_csr_count == TP_CSR_TOUCH_COUNT ) {
detach_count = 1;
break;
}
}
}
same_csr_count = 0;
return FALSE;
}
// タッチパネルによるメニュー選択
BOOL SelectMenuByTP( u16 *nowCsr, const MenuParam *pMenu )
{
u16 i;
static u16 detach_count = 0;
static u16 csr_old = 0xff;
static u16 same_csr_count = 0;
// detach_countが始動していたら、カウント判定。
if( detach_count > 0 ) {
if( tpd.disp.touch == 0 ) { // TPが押されていなければ、カウント進行し、カウントでメニュー選択
if( ++detach_count == TP_CSR_DETACH_COUNT ) {
detach_count = 0;
return TRUE;
}else {
return FALSE;
}
}
}
detach_count=0; // detachカウント値のクリア
for( i = 0; i < pMenu->num; i++ ) {
if( tpd.disp.touch ) { // タッチパネルがメニューの要素上でタッチされているなら、
NNSG2dTextRect rect = NNS_G2dTextCanvasGetTextRect( &gTextCanvas, (pMenu->str_elem)[ i ] );
u16 top_x = (u16)( pMenu->pos[ i ].x ); // メニュー要素のLCD座標を算出
u16 top_y = (u16)( pMenu->pos[ i ].y );
u16 bottom_x = (u16)( top_x + rect.width );
u16 bottom_y = (u16)( top_y + rect.height );
if( WithinRangeTP( top_x, top_y, bottom_x, bottom_y, &tpd.disp ) ) {
if( tpd.disp.validity == TP_VALIDITY_VALID ) { // カーソルをその要素に移動
if( csr_old == i ) {
if( same_csr_count < TP_CSR_TOUCH_COUNT ) {
same_csr_count++;
}
if( same_csr_count == TP_CSR_TOUCH_COUNT ) {
*nowCsr = i;
}
return FALSE;
}else {
csr_old = i;
}
break;
}
}else {
}
}else { // touch==0
if( same_csr_count == TP_CSR_TOUCH_COUNT ) {
detach_count = 1;
break;
}
}
}
same_csr_count = 0;
return FALSE;
}
// 現在のタッチパネル座標が指定領域内にあるかどうかを返す。
BOOL WithinRangeTP( int top_x, int top_y, int bottom_x, int bottom_y, TPData *tgt )
{
if( ( tgt->x >= top_x ) &&
( tgt->x <= bottom_x ) &&
( tgt->y >= top_y ) &&
( tgt->y <= bottom_y ) ) {
return TRUE;
}else {
return FALSE;
}
}
// バナーアイコンOBJのロード
void SetBannerIconOBJ( GXOamAttr *pDstOAM, BannerFileV1 *bannerp )
{
GXS_LoadOBJPltt( bannerp->pltt, 15, BANNER_PLTT_SIZE );
MI_CpuCopyFast( bannerp->image, (void *)(HW_DB_OBJ_VRAM + 0x20), BANNER_IMAGE_SIZE );
G2_SetOBJAttr( pDstOAM, // OAM pointer
32, // X position
32, // Y position
0, // Priority
GX_OAM_MODE_NORMAL, // Bitmap mode
FALSE, // mosaic off
GX_OAM_EFFECT_NONE, // affine off
GX_OAM_SHAPE_32x32, // 16x16 size
GX_OAM_COLOR_16, // 16 color
1, // charactor
15, // palette
0); // affine
}
//===============================================
// RTCアクセスルーチン
//===============================================
// RTCデータの取得
BOOL GetRTCData( RTCDrawProperty *pRTCDraw, BOOL forceGetFlag )
{
if( forceGetFlag || ( pRTCDraw->vcount++ == 59 ) ) {
pRTCDraw->vcount = 0;
MI_CpuCopy16( &pRTCDraw->date, &pRTCDraw->date_old, sizeof(RTCDate) );
MI_CpuCopy16( &pRTCDraw->time, &pRTCDraw->time_old, sizeof(RTCTime) );
(void)RTC_GetDateTime( &pRTCDraw->date, &pRTCDraw->time );
return TRUE;
}
return FALSE;
}
// RTCデータの表示
void DrawRTCData( RTCDrawProperty *pRTCDraw )
{
void (*pPrintFunc)( int x, int y, int color, const char *fmt, ... ) =
( pRTCDraw->isTopLCD ) ? PrintfSJISSub : PrintfSJIS;
// 前RTC情報の消去
{
u32 year = pRTCDraw->date_old.year + 2000;
pPrintFunc( pRTCDraw->date_x, pRTCDraw->date_y, TXT_COLOR_WHITE, "%04d/%02d/%02d[%3s]",
year,
pRTCDraw->date_old.month,
pRTCDraw->date_old.day,
g_strWeek[ pRTCDraw->date_old.week ]
);
pPrintFunc( pRTCDraw->time_x, pRTCDraw->time_y, TXT_COLOR_WHITE, "%02d:%02d:%02d",
pRTCDraw->time_old.hour,
pRTCDraw->time_old.minute,
pRTCDraw->time_old.second
);
}
// RTC情報の表示
{
u32 year = pRTCDraw->date.year + 2000;
pPrintFunc( pRTCDraw->date_x, pRTCDraw->date_y, TXT_COLOR_BLACK, "%d/%02d/%02d[%3s]",
year,
pRTCDraw->date.month,
pRTCDraw->date.day,
g_strWeek[ pRTCDraw->date.week ]
);
pPrintFunc( pRTCDraw->time_x, pRTCDraw->time_y, TXT_COLOR_BLACK, "%02d:%02d:%02d",
pRTCDraw->time.hour,
pRTCDraw->time.minute,
pRTCDraw->time.second
);
}
}
// RTCデータの取得&表示
void GetAndDrawRTCData( RTCDrawProperty *pRTCDraw, BOOL forceGetFlag )
{
if( GetRTCData( pRTCDraw, forceGetFlag ) ) {
DrawRTCData( pRTCDraw );
}
}
// ユーザーカラー領域の切り替え
void ChangeUserColor( u8 col )
{
int l;
if(col > 15) return;
for(l=0;l<16;l++)
{
TXTColorPalette[16+l] = TempPalette[16 * col + l];
}
GX_LoadBGPltt( TXTColorPalette, 0, sizeof(TXTColorPalette) );
}

View File

@ -0,0 +1,196 @@
/*---------------------------------------------------------------------------*
Project: TwlIPL
File: misc.h
Copyright 2007 Nintendo. All rights reserved.
These coded instructions, statements, and computer programs contain
proprietary information of Nintendo of America Inc. and/or Nintendo
Company Ltd., and are protected by Federal copyright law. They may
not be disclosed to third parties or copied or duplicated in any form,
in whole or in part, without the prior written consent of Nintendo.
$Date:: $
$Rev$
$Author$
*---------------------------------------------------------------------------*/
#ifndef __MISC_H__
#define __MISC_H__
#include <twl.h>
#include <sysmenu.h>
#define NNS_G2D_UNICODE
#include <nnsys.h>
#include <nnsys/g2d/g2d_Font.h>
#include <nnsys/g2d/g2d_CharCanvas.h>
#include <nnsys/g2d/g2d_TextCanvas.h>
#include "cmn.h"
#ifdef __cplusplus
extern "C" {
#endif
// define data----------------------------------------------------------
#define TP_CSR_TOUCH_COUNT 2 // TPカーソルのチャタリング吸収のためのカウント値
#define TP_CSR_DETACH_COUNT 2 // TPカーソルを「選択」と判定するTPデタッチからのカウント値
// DrawText での左上寄せ
#define TXT_DRAWTEXT_FLAG_DEFAULT (NNS_G2D_VERTICALORIGIN_TOP | NNS_G2D_HORIZONTALORIGIN_LEFT | NNS_G2D_HORIZONTALALIGN_LEFT)
// TXTColorPalette の色名 256色パレットへのロードを想定
enum
{
// パレット0 TXT_CPALETTE_MAIN
TXT_COLOR_NULL=0,
TXT_COLOR_WHITE,
TXT_COLOR_BLACK,
TXT_COLOR_RED,
TXT_COLOR_GREEN,
TXT_COLOR_BLUE,
TXT_COLOR_CYAN,
TXT_COLOR_MAGENTA,
TXT_COLOR_YELLOW,
// ユーザーカラーグラデーションパレット領域
TXT_UCOLOR_GNULL=16,
TXT_UCOLOR_G0,
TXT_UCOLOR_G1,
TXT_UCOLOR_G2,
TXT_UCOLOR_G3,
TXT_UCOLOR_G4,
TXT_UCOLOR_G5,
TXT_UCOLOR_G6,
TXT_UCOLOR_G7,
TXT_UCOLOR_G8,
TXT_UCOLOR_G9,
TXT_UCOLOR_G10,
TXT_UCOLOR_G11,
TXT_UCOLOR_G12,
TXT_UCOLOR_G13,
TXT_UCOLOR_GWHITE,
// ユーザーカラーサンプル領域
TXT_UCOLOR_GRAY=32,
TXT_UCOLOR_BROWN,
TXT_UCOLOR_RED,
TXT_UCOLOR_PINK,
TXT_UCOLOR_ORANGE,
TXT_UCOLOR_YELLOW,
TXT_UCOLOR_LIMEGREEN,
TXT_UCOLOR_GREEN,
TXT_UCOLOR_DARKGREEN,
TXT_UCOLOR_SEAGREEN,
TXT_UCOLOR_TURQUOISE,
TXT_UCOLOR_BLUE,
TXT_UCOLOR_DARKBLUE,
TXT_UCOLOR_PURPLE,
TXT_UCOLOR_VIOLET,
TXT_UCOLOR_MAGENTA,
// パレット TXT_CPALETTE_4BPP
TXT_COLOR_4BPP_NULL=48,
TXT_COLOR_4BPP_BG=49,
TXT_COLOR_4BPP_TEXT=49
};
// 時計表示場所
#define RTC_DATE_TOP_X ( 9 * 8 )
#define RTC_DATE_TOP_Y ( 10 * 8 )
#define RTC_TIME_TOP_X ( 12 * 8 )
#define RTC_TIME_TOP_Y ( 12 * 8 )
// キーデータワーク
typedef struct {
u16 trg; // トリガ入力
u16 cont; // ベタ 入力
}KeyWork;
// タッチパネルワーク
typedef struct {
int detached; // 今回のデータ入力でタッチが離れたことを示す。
TPData disp; // 今回の入力値LCD座標
TPData raw; // 今回の入力値TP 座標)
TPData last; // 前回の入力値LCD座標
}TpWork;
// メニュー要素座標
typedef struct MenuPos {
BOOL enable;
int x;
int y;
}MenuPos;
// メニュー構成パラメータ構造体
typedef struct MenuParam {
int num;
int normal_color;
int select_color;
int disable_color;
MenuPos *pos;
const u16 **str_elem;
}MenuParam;
// RTCデータ表示位置ワーク
typedef struct RTCDrawProperty {
BOOL isTopLCD;
int date_x;
int date_y;
int time_x;
int time_y;
int vcount;
RTCDate date;
RTCTime time;
RTCDate date_old;
RTCTime time_old;
}RTCDrawProperty;
typedef BOOL (*SelectSomethingFunc)( u16 *csr, TPData *tgt );
// global variables--------------------------------------------------
extern TpWork tpd; // タッチパネルデータ
extern KeyWork pad; // キーパッド入力データ
extern const u8 *const g_strWeek[ 7 ]; // 曜日文字列
extern RTCDrawProperty g_rtcDraw;
extern NNSFndAllocator g_allocator; // メモリアロケータ
extern NNSG2dFont gFont; // フォント
extern NNSG2dCharCanvas gCanvas; // CharCanvas
extern NNSG2dTextCanvas gTextCanvas; // TextCanvas
extern NNSG2dCharCanvas gCanvasSub; // CharCanvas
extern NNSG2dTextCanvas gTextCanvasSub; // TextCanvas
// function-------------------------------------------------------------
void InitAllocator( void );
void *Alloc( u32 size );
void Free( void *pBuffer );
void InitBG( void );
int GetPrintfWidth( const NNSG2dTextCanvas *pCanvas, const char *fmt, ... );
void PutStringUTF16 ( int x, int y, int color, const u16 *strUTF16 );
void PutStringUTF16Sub( int x, int y, int color, const u16 *strUTF16 );
void PrintfSJIS ( int x, int y, int color, const char *fmt, ... );
void PrintfSJISSub( int x, int y, int color, const char *fmt, ... );
void ReadKeyPad( void );
void ReadTP( void );
void DrawMenu( u16 nowCsr, const MenuParam *pMenu );
BOOL SelectSomethingByTP( u16 *nowCsr, SelectSomethingFunc func[], int funcnum );
BOOL SelectMenuByTP( u16 *nowCsr, const MenuParam *pMenu );
BOOL WithinRangeTP( int top_x, int top_y, int bottom_x, int bottom_y, TPData *tgt );
void SetBannerIconOBJ( GXOamAttr *pDstOAM, BannerFileV1 *bannerp );
BOOL GetRTCData( RTCDrawProperty *pRTCDraw, BOOL forceGetFlag );
void DrawRTCData( RTCDrawProperty *pRTCDraw );
void GetAndDrawRTCData( RTCDrawProperty *pRTCDraw, BOOL forceGetFlag );
void ChangeUserColor( u8 col );
#ifdef __cplusplus
}
#endif
#endif // __MISC_H__

View File

@ -0,0 +1,491 @@
/*---------------------------------------------------------------------------*
Project: TwlIPL - tests - DisplaySystemInformation
File: myIoreg_SCFG.h
Copyright 2007 Nintendo. All rights reserved.
These coded instructions, statements, and computer programs contain
proprietary information of Nintendo of America Inc. and/or Nintendo
Company Ltd., and are protected by Federal copyright law. They may
not be disclosed to third parties or copied or duplicated in any form,
in whole or in part, without the prior written consent of Nintendo.
*---------------------------------------------------------------------------*/
// ARM9側で受け取ったARM7のSCFGを参照するために
// ARM9側なのにARM7依存のオフセット情報が必要...
// マクロ再定義を防ぐための苦肉の策
#ifndef __MY_IOREG_SCFG_H__
#define __MY_IOREG_SCFG_H__
#ifdef __cplusplus
extern "C" {
#endif
/*
* Definition of Register offsets, addresses and variables.
*/
/* ROM */
#define DISP_REG_ROM_OFFSET 0x4000
#define DISP_REG_ROM_ADDR (HW_REG_BASE + DISP_REG_ROM_OFFSET)
/* A9ROM */
#define DISP_REG_A9ROM_OFFSET 0x4000
#define DISP_REG_A9ROM_ADDR (HW_REG_BASE + DISP_REG_A9ROM_OFFSET)
/* A7ROM */
#define DISP_REG_A7ROM_OFFSET 0x4001
#define DISP_REG_A7ROM_ADDR (HW_REG_BASE + DISP_REG_A7ROM_OFFSET)
/* ROMWE */
#define DISP_REG_ROMWE_OFFSET 0x4002
#define DISP_REG_ROMWE_ADDR (HW_REG_BASE + DISP_REG_ROMWE_OFFSET)
/* CLK */
#define DISP_REG_CLK_OFFSET 0x4004
#define DISP_REG_CLK_ADDR (HW_REG_BASE + DISP_REG_CLK_OFFSET)
/* JTAG */
#define DISP_REG_JTAG_OFFSET 0x4006
#define DISP_REG_JTAG_ADDR (HW_REG_BASE + DISP_REG_JTAG_OFFSET)
/* EXT */
#define DISP_REG_EXT_OFFSET 0x4008
#define DISP_REG_EXT_ADDR (HW_REG_BASE + DISP_REG_EXT_OFFSET)
/* MC */
#define DISP_REG_MC_OFFSET 0x4010
#define DISP_REG_MC_ADDR (HW_REG_BASE + DISP_REG_MC_OFFSET)
/* MCCHAT */
#define DISP_REG_MCCHAT_OFFSET 0x4012
#define DISP_REG_MCCHAT_ADDR (HW_REG_BASE + DISP_REG_MCCHAT_OFFSET)
/* MC2 */
#define DISP_REG_MC2_OFFSET 0x4014
#define DISP_REG_MC2_ADDR (HW_REG_BASE + DISP_REG_MC2_OFFSET)
/* WL */
#define DISP_REG_WL_OFFSET 0x4020
#define DISP_REG_WL_ADDR (HW_REG_BASE + DISP_REG_WL_OFFSET)
/* OP */
#define DISP_REG_OP_OFFSET 0x4024
#define DISP_REG_OP_ADDR (HW_REG_BASE + DISP_REG_OP_OFFSET)
/*
* Definitions of Register fields
*/
/* ROM */
#define DISP_REG_SCFG_ROM_ROMWE_SHIFT 16
#define DISP_REG_SCFG_ROM_ROMWE_SIZE 1
#define DISP_REG_SCFG_ROM_ROMWE_MASK 0x00010000
#define DISP_REG_SCFG_ROM_ARM7FUSE_SHIFT 10
#define DISP_REG_SCFG_ROM_ARM7FUSE_SIZE 1
#define DISP_REG_SCFG_ROM_ARM7FUSE_MASK 0x00000400
#define DISP_REG_SCFG_ROM_ARM7RSEL_SHIFT 9
#define DISP_REG_SCFG_ROM_ARM7RSEL_SIZE 1
#define DISP_REG_SCFG_ROM_ARM7RSEL_MASK 0x00000200
#define DISP_REG_SCFG_ROM_ARM7SEL_SHIFT 8
#define DISP_REG_SCFG_ROM_ARM7SEL_SIZE 1
#define DISP_REG_SCFG_ROM_ARM7SEL_MASK 0x00000100
#define DISP_REG_SCFG_ROM_ARM9RSEL_SHIFT 1
#define DISP_REG_SCFG_ROM_ARM9RSEL_SIZE 1
#define DISP_REG_SCFG_ROM_ARM9RSEL_MASK 0x00000002
#define DISP_REG_SCFG_ROM_ARM9SEL_SHIFT 0
#define DISP_REG_SCFG_ROM_ARM9SEL_SIZE 1
#define DISP_REG_SCFG_ROM_ARM9SEL_MASK 0x00000001
#ifndef SDK_ASM
#define DISP_REG_SCFG_ROM_FIELD( romwe, arm7fuse, arm7rsel, arm7sel, arm9rsel, arm9sel ) \
(u32)( \
((u32)(romwe) << DISP_REG_SCFG_ROM_ROMWE_SHIFT) | \
((u32)(arm7fuse) << DISP_REG_SCFG_ROM_ARM7FUSE_SHIFT) | \
((u32)(arm7rsel) << DISP_REG_SCFG_ROM_ARM7RSEL_SHIFT) | \
((u32)(arm7sel) << DISP_REG_SCFG_ROM_ARM7SEL_SHIFT) | \
((u32)(arm9rsel) << DISP_REG_SCFG_ROM_ARM9RSEL_SHIFT) | \
((u32)(arm9sel) << DISP_REG_SCFG_ROM_ARM9SEL_SHIFT))
#endif
/* A9ROM */
#define DISP_REG_SCFG_A9ROM_RSEL_SHIFT 1
#define DISP_REG_SCFG_A9ROM_RSEL_SIZE 1
#define DISP_REG_SCFG_A9ROM_RSEL_MASK 0x02
#define DISP_REG_SCFG_A9ROM_SEC_SHIFT 0
#define DISP_REG_SCFG_A9ROM_SEC_SIZE 1
#define DISP_REG_SCFG_A9ROM_SEC_MASK 0x01
#ifndef SDK_ASM
#define DISP_REG_SCFG_A9ROM_FIELD( rsel, sec ) \
(u8)( \
((u32)(rsel) << DISP_REG_SCFG_A9ROM_RSEL_SHIFT) | \
((u32)(sec) << DISP_REG_SCFG_A9ROM_SEC_SHIFT))
#endif
/* A7ROM */
#define DISP_REG_SCFG_A7ROM_FUSE_SHIFT 2
#define DISP_REG_SCFG_A7ROM_FUSE_SIZE 1
#define DISP_REG_SCFG_A7ROM_FUSE_MASK 0x04
#define DISP_REG_SCFG_A7ROM_RSEL_SHIFT 1
#define DISP_REG_SCFG_A7ROM_RSEL_SIZE 1
#define DISP_REG_SCFG_A7ROM_RSEL_MASK 0x02
#define DISP_REG_SCFG_A7ROM_SEC_SHIFT 0
#define DISP_REG_SCFG_A7ROM_SEC_SIZE 1
#define DISP_REG_SCFG_A7ROM_SEC_MASK 0x01
#ifndef SDK_ASM
#define DISP_REG_SCFG_A7ROM_FIELD( fuse, rsel, sec ) \
(u8)( \
((u32)(fuse) << DISP_REG_SCFG_A7ROM_FUSE_SHIFT) | \
((u32)(rsel) << DISP_REG_SCFG_A7ROM_RSEL_SHIFT) | \
((u32)(sec) << DISP_REG_SCFG_A7ROM_SEC_SHIFT))
#endif
/* ROMWE */
#define DISP_REG_SCFG_ROMWE_WE_SHIFT 0
#define DISP_REG_SCFG_ROMWE_WE_SIZE 1
#define DISP_REG_SCFG_ROMWE_WE_MASK 0x0001
#ifndef SDK_ASM
#define DISP_REG_SCFG_ROMWE_FIELD( we ) \
(u16)( \
((u32)(we) << DISP_REG_SCFG_ROMWE_WE_SHIFT))
#endif
/* CLK */
#define DISP_REG_SCFG_CLK_SNDMCLK_SHIFT 8
#define DISP_REG_SCFG_CLK_SNDMCLK_SIZE 1
#define DISP_REG_SCFG_CLK_SNDMCLK_MASK 0x0100
#define DISP_REG_SCFG_CLK_WRAMHCLK_SHIFT 7
#define DISP_REG_SCFG_CLK_WRAMHCLK_SIZE 1
#define DISP_REG_SCFG_CLK_WRAMHCLK_MASK 0x0080
#define DISP_REG_SCFG_CLK_AESHCLK_SHIFT 2
#define DISP_REG_SCFG_CLK_AESHCLK_SIZE 1
#define DISP_REG_SCFG_CLK_AESHCLK_MASK 0x0004
#define DISP_REG_SCFG_CLK_SD2HCLK_SHIFT 1
#define DISP_REG_SCFG_CLK_SD2HCLK_SIZE 1
#define DISP_REG_SCFG_CLK_SD2HCLK_MASK 0x0002
#define DISP_REG_SCFG_CLK_SD1HCLK_SHIFT 0
#define DISP_REG_SCFG_CLK_SD1HCLK_SIZE 1
#define DISP_REG_SCFG_CLK_SD1HCLK_MASK 0x0001
#ifndef SDK_ASM
#define DISP_REG_SCFG_CLK_FIELD( sndmclk, wramhclk, aeshclk, sd2hclk, sd1hclk ) \
(u16)( \
((u32)(sndmclk) << DISP_REG_SCFG_CLK_SNDMCLK_SHIFT) | \
((u32)(wramhclk) << DISP_REG_SCFG_CLK_WRAMHCLK_SHIFT) | \
((u32)(aeshclk) << DISP_REG_SCFG_CLK_AESHCLK_SHIFT) | \
((u32)(sd2hclk) << DISP_REG_SCFG_CLK_SD2HCLK_SHIFT) | \
((u32)(sd1hclk) << DISP_REG_SCFG_CLK_SD1HCLK_SHIFT))
#endif
/* JTAG */
#define DISP_REG_SCFG_JTAG_DSPJE_SHIFT 8
#define DISP_REG_SCFG_JTAG_DSPJE_SIZE 1
#define DISP_REG_SCFG_JTAG_DSPJE_MASK 0x0100
#define DISP_REG_SCFG_JTAG_CPUJE_SHIFT 1
#define DISP_REG_SCFG_JTAG_CPUJE_SIZE 1
#define DISP_REG_SCFG_JTAG_CPUJE_MASK 0x0002
#define DISP_REG_SCFG_JTAG_ARM7SEL_SHIFT 0
#define DISP_REG_SCFG_JTAG_ARM7SEL_SIZE 1
#define DISP_REG_SCFG_JTAG_ARM7SEL_MASK 0x0001
#ifndef SDK_ASM
#define DISP_REG_SCFG_JTAG_FIELD( dspje, cpuje, arm7sel ) \
(u16)( \
((u32)(dspje) << DISP_REG_SCFG_JTAG_DSPJE_SHIFT) | \
((u32)(cpuje) << DISP_REG_SCFG_JTAG_CPUJE_SHIFT) | \
((u32)(arm7sel) << DISP_REG_SCFG_JTAG_ARM7SEL_SHIFT))
#endif
/* EXT */
#define DISP_REG_SCFG_EXT_CFG_SHIFT 31
#define DISP_REG_SCFG_EXT_CFG_SIZE 1
#define DISP_REG_SCFG_EXT_CFG_MASK 0x80000000
#define DISP_REG_SCFG_EXT_PUENABLE_SHIFT 28
#define DISP_REG_SCFG_EXT_PUENABLE_SIZE 1
#define DISP_REG_SCFG_EXT_PUENABLE_MASK 0x10000000
#define DISP_REG_SCFG_EXT_SD20_SHIFT 28
#define DISP_REG_SCFG_EXT_SD20_SIZE 1
#define DISP_REG_SCFG_EXT_SD20_MASK 0x10000000
#define DISP_REG_SCFG_EXT_NEWB_ACCESS_E_SHIFT 16
#define DISP_REG_SCFG_EXT_NEWB_ACCESS_E_SIZE 10
#define DISP_REG_SCFG_EXT_NEWB_ACCESS_E_MASK 0x03ff0000
#define DISP_REG_SCFG_EXT_WRAM_SHIFT 25
#define DISP_REG_SCFG_EXT_WRAM_SIZE 1
#define DISP_REG_SCFG_EXT_WRAM_MASK 0x02000000
#define DISP_REG_SCFG_EXT_MC_B_SHIFT 24
#define DISP_REG_SCFG_EXT_MC_B_SIZE 1
#define DISP_REG_SCFG_EXT_MC_B_MASK 0x01000000
#define DISP_REG_SCFG_EXT_GPIO_SHIFT 23
#define DISP_REG_SCFG_EXT_GPIO_SIZE 1
#define DISP_REG_SCFG_EXT_GPIO_MASK 0x00800000
#define DISP_REG_SCFG_EXT_I2C_SHIFT 22
#define DISP_REG_SCFG_EXT_I2C_SIZE 1
#define DISP_REG_SCFG_EXT_I2C_MASK 0x00400000
#define DISP_REG_SCFG_EXT_I2S_SHIFT 21
#define DISP_REG_SCFG_EXT_I2S_SIZE 1
#define DISP_REG_SCFG_EXT_I2S_MASK 0x00200000
#define DISP_REG_SCFG_EXT_MIC_SHIFT 20
#define DISP_REG_SCFG_EXT_MIC_SIZE 1
#define DISP_REG_SCFG_EXT_MIC_MASK 0x00100000
#define DISP_REG_SCFG_EXT_SD2_SHIFT 19
#define DISP_REG_SCFG_EXT_SD2_SIZE 1
#define DISP_REG_SCFG_EXT_SD2_MASK 0x00080000
#define DISP_REG_SCFG_EXT_SD1_SHIFT 18
#define DISP_REG_SCFG_EXT_SD1_SIZE 1
#define DISP_REG_SCFG_EXT_SD1_MASK 0x00040000
#define DISP_REG_SCFG_EXT_AES_SHIFT 17
#define DISP_REG_SCFG_EXT_AES_SIZE 1
#define DISP_REG_SCFG_EXT_AES_MASK 0x00020000
#define DISP_REG_SCFG_EXT_DMAC_SHIFT 16
#define DISP_REG_SCFG_EXT_DMAC_SIZE 1
#define DISP_REG_SCFG_EXT_DMAC_MASK 0x00010000
#define DISP_REG_SCFG_EXT_NITROB_EX_E_SHIFT 8
#define DISP_REG_SCFG_EXT_NITROB_EX_E_SIZE 8
#define DISP_REG_SCFG_EXT_NITROB_EX_E_MASK 0x0000ff00
#define DISP_REG_SCFG_EXT_PSRAM_SHIFT 14
#define DISP_REG_SCFG_EXT_PSRAM_SIZE 2
#define DISP_REG_SCFG_EXT_PSRAM_MASK 0x0000c000
#define DISP_REG_SCFG_EXT_VRAM_SHIFT 13
#define DISP_REG_SCFG_EXT_VRAM_SIZE 1
#define DISP_REG_SCFG_EXT_VRAM_MASK 0x00002000
#define DISP_REG_SCFG_EXT_LCDC_SHIFT 12
#define DISP_REG_SCFG_EXT_LCDC_SIZE 1
#define DISP_REG_SCFG_EXT_LCDC_MASK 0x00001000
#define DISP_REG_SCFG_EXT_SIO_SHIFT 11
#define DISP_REG_SCFG_EXT_SIO_SIZE 1
#define DISP_REG_SCFG_EXT_SIO_MASK 0x00000800
#define DISP_REG_SCFG_EXT_DSEL_SHIFT 10
#define DISP_REG_SCFG_EXT_DSEL_SIZE 1
#define DISP_REG_SCFG_EXT_DSEL_MASK 0x00000400
#define DISP_REG_SCFG_EXT_SPI_SHIFT 9
#define DISP_REG_SCFG_EXT_SPI_SIZE 1
#define DISP_REG_SCFG_EXT_SPI_MASK 0x00000200
#define DISP_REG_SCFG_EXT_INTC_SHIFT 8
#define DISP_REG_SCFG_EXT_INTC_SIZE 1
#define DISP_REG_SCFG_EXT_INTC_MASK 0x00000100
#define DISP_REG_SCFG_EXT_NITROB_MOD_E_SHIFT 0
#define DISP_REG_SCFG_EXT_NITROB_MOD_E_SIZE 8
#define DISP_REG_SCFG_EXT_NITROB_MOD_E_MASK 0x000000ff
#define DISP_REG_SCFG_EXT_MC_SHIFT 7
#define DISP_REG_SCFG_EXT_MC_SIZE 1
#define DISP_REG_SCFG_EXT_MC_MASK 0x00000080
#define DISP_REG_SCFG_EXT_SND_SHIFT 2
#define DISP_REG_SCFG_EXT_SND_SIZE 1
#define DISP_REG_SCFG_EXT_SND_MASK 0x00000004
#define DISP_REG_SCFG_EXT_SDMA_SHIFT 1
#define DISP_REG_SCFG_EXT_SDMA_SIZE 1
#define DISP_REG_SCFG_EXT_SDMA_MASK 0x00000002
#define DISP_REG_SCFG_EXT_DMA_SHIFT 0
#define DISP_REG_SCFG_EXT_DMA_SIZE 1
#define DISP_REG_SCFG_EXT_DMA_MASK 0x00000001
#ifndef SDK_ASM
#define DISP_REG_SCFG_EXT_FIELD( cfg, puenable, sd20, newb_access_e, wram, mc_b, gpio, i2c, i2s, mic, sd2, sd1, aes, dmac, nitrob_ex_e, psram, vram, lcdc, sio, dsel, spi, intc, nitrob_mod_e, mc, snd, sdma, dma ) \
(u32)( \
((u32)(cfg) << DISP_REG_SCFG_EXT_CFG_SHIFT) | \
((u32)(puenable) << DISP_REG_SCFG_EXT_PUENABLE_SHIFT) | \
((u32)(sd20) << DISP_REG_SCFG_EXT_SD20_SHIFT) | \
((u32)(newb_access_e) << DISP_REG_SCFG_EXT_NEWB_ACCESS_E_SHIFT) | \
((u32)(wram) << DISP_REG_SCFG_EXT_WRAM_SHIFT) | \
((u32)(mc_b) << DISP_REG_SCFG_EXT_MC_B_SHIFT) | \
((u32)(gpio) << DISP_REG_SCFG_EXT_GPIO_SHIFT) | \
((u32)(i2c) << DISP_REG_SCFG_EXT_I2C_SHIFT) | \
((u32)(i2s) << DISP_REG_SCFG_EXT_I2S_SHIFT) | \
((u32)(mic) << DISP_REG_SCFG_EXT_MIC_SHIFT) | \
((u32)(sd2) << DISP_REG_SCFG_EXT_SD2_SHIFT) | \
((u32)(sd1) << DISP_REG_SCFG_EXT_SD1_SHIFT) | \
((u32)(aes) << DISP_REG_SCFG_EXT_AES_SHIFT) | \
((u32)(dmac) << DISP_REG_SCFG_EXT_DMAC_SHIFT) | \
((u32)(nitrob_ex_e) << DISP_REG_SCFG_EXT_NITROB_EX_E_SHIFT) | \
((u32)(psram) << DISP_REG_SCFG_EXT_PSRAM_SHIFT) | \
((u32)(vram) << DISP_REG_SCFG_EXT_VRAM_SHIFT) | \
((u32)(lcdc) << DISP_REG_SCFG_EXT_LCDC_SHIFT) | \
((u32)(sio) << DISP_REG_SCFG_EXT_SIO_SHIFT) | \
((u32)(dsel) << DISP_REG_SCFG_EXT_DSEL_SHIFT) | \
((u32)(spi) << DISP_REG_SCFG_EXT_SPI_SHIFT) | \
((u32)(intc) << DISP_REG_SCFG_EXT_INTC_SHIFT) | \
((u32)(nitrob_mod_e) << DISP_REG_SCFG_EXT_NITROB_MOD_E_SHIFT) | \
((u32)(mc) << DISP_REG_SCFG_EXT_MC_SHIFT) | \
((u32)(snd) << DISP_REG_SCFG_EXT_SND_SHIFT) | \
((u32)(sdma) << DISP_REG_SCFG_EXT_SDMA_SHIFT) | \
((u32)(dma) << DISP_REG_SCFG_EXT_DMA_SHIFT))
#endif
/* MC */
#define DISP_REG_MI_MC_SWP_SHIFT 15
#define DISP_REG_MI_MC_SWP_SIZE 1
#define DISP_REG_MI_MC_SWP_MASK 0x8000
#define DISP_REG_MI_MC_SL2_MODE_SHIFT 6
#define DISP_REG_MI_MC_SL2_MODE_SIZE 2
#define DISP_REG_MI_MC_SL2_MODE_MASK 0x00c0
#define DISP_REG_MI_MC_SL2_CDET_SHIFT 4
#define DISP_REG_MI_MC_SL2_CDET_SIZE 1
#define DISP_REG_MI_MC_SL2_CDET_MASK 0x0010
#define DISP_REG_MI_MC_SL1_MODE_SHIFT 2
#define DISP_REG_MI_MC_SL1_MODE_SIZE 2
#define DISP_REG_MI_MC_SL1_MODE_MASK 0x000c
#define DISP_REG_MI_MC_SL1_CDET_SHIFT 0
#define DISP_REG_MI_MC_SL1_CDET_SIZE 1
#define DISP_REG_MI_MC_SL1_CDET_MASK 0x0001
#ifndef SDK_ASM
#define DISP_REG_MI_MC_FIELD( swp, sl2_mode, sl2_cdet, sl1_mode, sl1_cdet ) \
(u16)( \
((u32)(swp) << DISP_REG_MI_MC_SWP_SHIFT) | \
((u32)(sl2_mode) << DISP_REG_MI_MC_SL2_MODE_SHIFT) | \
((u32)(sl2_cdet) << DISP_REG_MI_MC_SL2_CDET_SHIFT) | \
((u32)(sl1_mode) << DISP_REG_MI_MC_SL1_MODE_SHIFT) | \
((u32)(sl1_cdet) << DISP_REG_MI_MC_SL1_CDET_SHIFT))
#endif
/* MCCHAT */
#define DISP_REG_MI_MCCHAT_CC_SHIFT 0
#define DISP_REG_MI_MCCHAT_CC_SIZE 16
#define DISP_REG_MI_MCCHAT_CC_MASK 0xffff
#ifndef SDK_ASM
#define DISP_REG_MI_MCCHAT_FIELD( cc ) \
(u16)( \
((u32)(cc) << DISP_REG_MI_MCCHAT_CC_SHIFT))
#endif
/* MC2 */
#define DISP_REG_MI_MC2_CA_SHIFT 0
#define DISP_REG_MI_MC2_CA_SIZE 16
#define DISP_REG_MI_MC2_CA_MASK 0xffff
#ifndef SDK_ASM
#define DISP_REG_MI_MC2_FIELD( ca ) \
(u16)( \
((u32)(ca) << DISP_REG_MI_MC2_CA_SHIFT))
#endif
/* WL */
#define DISP_REG_SCFG_WL_OFFB_SHIFT 0
#define DISP_REG_SCFG_WL_OFFB_SIZE 1
#define DISP_REG_SCFG_WL_OFFB_MASK 0x0001
#ifndef SDK_ASM
#define DISP_REG_SCFG_WL_FIELD( offb ) \
(u16)( \
((u32)(offb) << DISP_REG_SCFG_WL_OFFB_SHIFT))
#endif
/* OP */
#define DISP_REG_SCFG_OP_OP1_SHIFT 1
#define DISP_REG_SCFG_OP_OP1_SIZE 1
#define DISP_REG_SCFG_OP_OP1_MASK 0x0002
#define DISP_REG_SCFG_OP_OP0_SHIFT 0
#define DISP_REG_SCFG_OP_OP0_SIZE 1
#define DISP_REG_SCFG_OP_OP0_MASK 0x0001
#define DISP_REG_SCFG_OP_OPT_SHIFT 0
#define DISP_REG_SCFG_OP_OPT_SIZE 2
#define DISP_REG_SCFG_OP_OPT_MASK 0x0003
#ifndef SDK_ASM
#define DISP_REG_SCFG_OP_FIELD( op1, op0, opt ) \
(u16)( \
((u32)(op1) << DISP_REG_SCFG_OP_OP1_SHIFT) | \
((u32)(op0) << DISP_REG_SCFG_OP_OP0_SHIFT) | \
((u32)(opt) << DISP_REG_SCFG_OP_OPT_SHIFT))
#endif
#ifdef __cplusplus
} /* extern "C" */
#endif
/* TWL_IOREG_SCFG_H_ */
#endif

View File

@ -0,0 +1,605 @@
/*---------------------------------------------------------------------------*
Project: TwlIPL - tests - DisplaySystemInformation
File: strResource.c
Copyright **** Nintendo. All rights reserved.
These coded instructions, statements, and computer programs contain
proprietary information of Nintendo of America Inc. and/or Nintendo
Company Ltd., and are protected by Federal copyright law. They may
not be disclosed to third parties or copied or duplicated in any form,
in whole or in part, without the prior written consent of Nintendo.
$Date:: $
$Rev:$
$Author:$
*---------------------------------------------------------------------------*/
#include "drawFunc.h"
const int s_pageOffset[ROOTMENU_SIZE][MAXPAGE] = {
{ 0, OWNERMENU_SIZE }, // owner
{ 0, 7, PARENTALMENU_SIZE }, // parental
{ 0, NORMAL_HW_MENU_SIZE }, // normal hw
{ 0, SECURE_HW_MENU_SIZE }, // secure hw
{ 0, SCFG_ARM7_MENU_SIZE }, // scfg arm7
{ 0, SCFG_ARM9_MENU_SIZE }, // scfg arm9
{ 0, VERSIONMENU_SIZE } // fuse
};
const u8 s_numMenu[] = {
OWNERMENU_SIZE,
PARENTALMENU_SIZE,
NORMAL_HW_MENU_SIZE,
SECURE_HW_MENU_SIZE,
SCFG_ARM7_MENU_SIZE,
SCFG_ARM9_MENU_SIZE,
VERSIONMENU_SIZE,
0,
0,
0,
ROOTMENU_SIZE
};
const u16 *s_strARM7RegisterName[] = {
L"ROM State",
L"CLK",
L"JTAG",
L"EXTEND",
L"MC I/F 1",
L"MC I/F 2",
L"DS WL",
L"BONDING",
};
const u16 *s_strARM9RegisterName[] = {
L"ROMステータスレジスタ",
L"新規ブロッククロック制御レジスタ",
L"新規ブロックリセット制御レジスタ",
L"拡張機能制御レジスタ",
L"メモリーカード I/F ステータスレジスタ"
};
const char *s_strRootMenu[] = {
"Owner",
"Parental control",
"Normal Hardware Info",
"Secure Hardware Info",
"SCFG Info (ARM7 side)",
"SCFG Info (ARM9 side)",
"Content Version"
};
const char *s_strMenuName[] = {
"Owner",
"Parental control",
"Normal Hardware Info",
"Secure Hardware Info",
"SCFG Info (ARM7 side)",
"SCFG Info (ARM9 side)",
"Content Version"
};
const char *s_strOwnerMenu[] = {
"Language",
"Favorite color",
"Birthday",
"Country",
"Nickname",
"Comment"
};
const char *s_strParentalMenu[] = {
"Parental control",
"Picto Chat",
"ds Download",
"browser",
"Wii Point",
"Photo Exchange",
"UGC",
"Organization",
"Age",
"Password",
"Quastion id",
"Answer"
};
const char *s_strNormalHWMenu[] = {
"Wireless",
"RTC Offset",
"Agree EULA",
"Eula Version"
};
const char *s_strSecureHWMenu[] = {
"Force Disable Wireless",
"Region",
"Unique ID",
"Serial No",
"Language Bitmap",
"Fuse Data"
};
const char *s_strSCFGArm9Menu[] = {
"Rom Status",
"Camera CKI",
"WRAM Clock",
"Camera Clock",
"DSP Clock",
"CPU Speed",
"DSP Reset Flag",
"CFG Block Access",
"WRAM Access",
"DSP Access",
"Camera Access",
"New DMA Access",
"PSRAM Boundary",
"Expanded INTC",
"Expanded LCDC",
"Expanded VRAM",
"Fixed Card I/F",
"Fixed Divider",
"Fixed 2D Engine",
"Fixed Renderer",
"Fixed Geometry",
"Fixed DMA"
};
const char *s_strSCFGArm7Menu[] = {
// rom制御
"ARM9 SecureROM",
"ARM9 ROM Type",
"ARM7 SecureROM",
"ARM7 ROM Type",
"ARM7 FuseRom",
"Write Rom Area",
// 新規ブロッククロック
"SD1 I/F Clock",
"SD2 I/F Clock",
"AES Clock",
"WRAM Clock",
"SND Clock",
// JTAG
"Chain ARM7 to CPU JTAG",
"CPU JTAG",
"DSP JTAG",
// 拡張機能
"Fixed A7-DMAC1",
"Fixed Sound DMA",
"Fixed Sound",
"Fixed Memory Card",
"Expanded A7-INTC",
"Expanded SPI",
"Expanded Sound DMA",
"Expanded SIO",
"Expanded LCDC",
"Expanded VRAM",
"PSRAM Boundary",
"A7-DMAC2 Block",
"AES Block",
"SD1 I/F Block",
"SD2 I/F Block",
"Mic Block",
"I2S I/F Block",
"I2C I/F Block",
"GPIO Block",
"MemoryCard I/F",
"Shared WRAM",
"PU Resistance",
"ALL SCFG Block",
// メモリカード I/F
"MC Slot1 DET",
"MC Slot1 Mode",
"MC Slot2 DET",
"MC Slot2 Mode",
"Swap MC1 MC2",
"Chatter. Count",
"MC Counter Data",
// 旧無線
"Old Wireless",
// オプション端子読み出し
"Option Form",
"Option App for"
};
const char *s_strVersionMenu[] = {
"Shared Font",
"Wireless Firm",
"Whitelist"
};
const char **s_strMetaMenu[] = {
s_strOwnerMenu,
s_strParentalMenu,
s_strNormalHWMenu,
s_strSecureHWMenu,
s_strSCFGArm7Menu,
s_strSCFGArm9Menu,
s_strVersionMenu,
NULL,
NULL,
NULL,
s_strRootMenu
};
char *s_strAccess[] = {
"Inaccessible",
"Accessible"
};
char *s_strSupply[] = {
"STOPPED",
"SUPPLIED"
};
char *s_strPSRAM[] = {
"4MB",
"16MB",
"32MB"
};
char *s_strRomMode[] = {
"TWL 64KB ROM",
"NITRO 8KB ROM"
};
char *s_strCpuSpeed[] = {
"67.03 MHz",
"134.06 MHz"
};
char *s_strRomForm[] = {
"Included ROM",
"Downloaded PROM"
};
char *s_strRomApp[] = {
"Mass Product",
"Development 1",
"Development 2",
"PROM Download"
};
char *s_strMCMode[] = {
// !!! あとで項目埋める
"00",
"01",
"10",
"11"
};
char *s_strEnable[] = {
"DISABLED",
"ENABLED"
};
char *s_strBool[] = {
"FALSE",
"TRUE"
};
char *s_strRatingOrg[] = {
"CERO",
"ESRB",
"BBFC",
"USK",
"PEGI general",
"PEGI Finland",
"PEGI Portugal",
"PEGI and BBFC Great Briten",
"OFLC",
"GRB"
};
char *s_strRegion[] = {
"JAPAN",
"AMERICA",
"EUROPA",
"AUSTRALIA",
"CHINA",
"KOREA",
};
char *s_strUserColor[] = {
"GRAY ",
"BROWN ",
"RED ",
"PINK ",
"ORANGE ",
"YELLOW ",
"LIME GREEN",
"GREEN ",
"DARK GREEN",
"SEA GREEN ",
"TURQUOISE ",
"BLUE ",
"DARK BLUE ",
"PURPLE ",
"VIOLET ",
"MAGENTA ",
};
char *s_strLanguage[] = {
"JAPANESE",
"ENGLISH",
"FRENCH",
"GERMAN",
"ITALIAN",
"SPANISH",
"CHINESE",
"KOREAN",
};
char *s_strCountry[] = {
"UNDEFINED ", // 未設定
"JAPAN ", // 日本
"UNKNOWN",
"UNKNOWN",
"UNKNOWN",
"UNKNOWN",
"UNKNOWN",
"UNKNOWN",
"Anguilla ", // アンギラ
"ANTIGUA_AND_BARBUDA", // アンティグア・バーブーダ
"ARGENTINA ", // アルゼンチン
"ARUBA", // アルバ
"BAHAMAS", // バハマ
"BARBADOS", // バルバドス
"BELIZE", // ベリーズ
"BOLIVIA", // ボリビア
"BRAZIL", // ブラジル
"BRITISH_VIRGIN_ISLANDS", // 英領ヴァージン諸島
"CANADA", // カナダ
"CAYMAN_ISLANDS", // ケイマン諸島
"CHILE ", // チリ
"COLOMBIA", // コロンビア
"COSTA_RICA", // コスタリカ
"DOMINICA", // ドミニカ国
"DOMINICAN_REPUBLIC", // ドミニカ共和国
"ECUADOR", // エクアドル
"EL_SALVADOR", // エルサルバドル
"FRENCH_GUIANA", // フランス領ギアナ
"GRENADA", // グレナダ
"GUADELOUPE", // グアドループ
"GUATEMALA ", // グアテマラ
"GUYANA", // ガイアナ
"HAITI", // ハイチ
"HONDURAS", // ホンジュラス
"JAMAICA", // ジャマイカ
"MARTINIQUE", // マルティニーク
"MEXICO", // メキシコ
"MONTSERRAT", // モントセラト
"NETHERLANDS_ANTILLES", // オランダ領アンティル
"NICARAGUA", // ニカラグア
"PANAMA ", // パナマ
"PARAGUAY", // パラグアイ
"PERU", // ペルー
"ST_KITTS_AND_NEVIS", // セントキッツ・ネイビス
"ST_LUCIA", // セントルシア
"ST_VINCENT_AND_THE_GRENADINES", // セントビンセント・グレナディーン
"SURINAME", // スリナム
"TRINIDAD_AND_TOBAGO", // トリニダード・トバゴ
"TURKS_AND_CAICOS_ISLANDS", // タークス・カイコス諸島
"UNITED_STATES", // アメリカ
"URUGUAY ", // ウルグアイ
"US_VIRGIN_ISLANDS", // 米領バージン諸島
"VENEZUELA", // ベネズエラ
"UNKNOWN",
"UNKNOWN",
"UNKNOWN",
"UNKNOWN",
"UNKNOWN",
"UNKNOWN",
"UNKNOWN",
"UNKNOWN",
"UNKNOWN",
"UNKNOWN",
"UNKNOWN",
"ALBANIA ", // アルバニア
"AUSTRALIA", // オーストラリア
"AUSTRIA", // オーストリア
"BELGIUM", // ベルギー
"BOSNIA_AND_HERZEGOVINA", // ボスニア・ヘルツェゴビナ
"BOTSWANA", // ボツワナ
"BULGARIA ", // ブルガリア
"CROATIA", // クロアチア
"CYPRUS", // キプロス
"CZECH_REPUBLIC", // チェコ
"DENMARK", // デンマーク
"ESTONIA", // エストニア
"FINLAND", // フィンランド
"FRANCE", // フランス
"GERMANY", // ドイツ
"GREECE", // ギリシャ
"HUNGARY ", // ハンガリー
"ICELAND", // アイスランド
"IRELAND", // アイルランド
"ITALY", // イタリア
"LATVIA", // ラトビア
"LESOTHO", // レソト
"LIECHTENSTEIN", // リヒテンシュタイン
"LITHUANIA", // リトアニア
"LUXEMBOURG", // ルクセンブルク
"MACEDONIA", // マケドニア
"MALTA ", // マルタ
"MONTENEGRO", // モンテネグロ
"MOZAMBIQUE", // モザンビーク
"NAMIBIA", // ナミビア
"NETHERLANDS", // オランダ
"NEW_ZEALAND", // ニュージーランド
"NORWAY", // ノルウェー
"POLAND", // ポーランド
"PORTUGAL", // ポルトガル
"ROMANIA", // ルーマニア
"RUSSIA ", // ロシア
"SERBIA", // セルビア
"SLOVAKIA", // スロバキア
"SLOVENIA", // スロベニア
"SOUTH_AFRICA", // 南アフリカ
"SPAIN", // スペイン
"SWAZILAND", // スワジランド
"SWEDEN", // スウェーデン
"SWITZERLAND", // スイス
"TURKEY", // トルコ
"UNITED_KINGDOM ", // イギリス
"ZAMBIA", // ザンビア
"ZIMBABWE", // ジンバブエ
"UNKNOWN",
"UNKNOWN",
"UNKNOWN",
"UNKNOWN",
"UNKNOWN",
"UNKNOWN",
"UNKNOWN",
"UNKNOWN",
"UNKNOWN",
"UNKNOWN",
"UNKNOWN",
"UNKNOWN",
"UNKNOWN",
"UNKNOWN",
"UNKNOWN",
"TAIWAN ", // 台湾
"UNKNOWN",
"UNKNOWN",
"UNKNOWN",
"UNKNOWN",
"UNKNOWN",
"UNKNOWN",
"UNKNOWN",
"SOUTH_KOREA ", // 韓国
"UNKNOWN",
"UNKNOWN",
"UNKNOWN",
"UNKNOWN",
"UNKNOWN",
"UNKNOWN",
"UNKNOWN",
"HONG_KONG ", // ホンコン
"MACAU", // マカオ
"UNKNOWN",
"UNKNOWN",
"UNKNOWN",
"UNKNOWN",
"UNKNOWN",
"UNKNOWN",
"INDONESIA ", // インドネシア
"SINGAPORE ", // シンガポール
"THAILAND ", // タイ
"PHILIPPINES", // フィリピン
"MALAYSIA", // マレーシア
"UNKNOWN",
"UNKNOWN",
"UNKNOWN",
"CHINA ", // 中国
"UNKNOWN",
"UNKNOWN",
"UNKNOWN",
"UNKNOWN",
"UNKNOWN",
"UNKNOWN",
"UNKNOWN",
"UAE ", // アラブ首長国連邦
"INDIA ", // インド
"EGYPT ", // エジプト
"OMAN", // オマーン
"QATAR", // カタール
"KUWAIT", // クウェート
"SAUDI_ARABIA", // サウジアラビア
"SYRIA", // シリア
"BAHRAIN", // バーレーン
"JORDAN", // ヨルダン
"UNKNOWN",
"UNKNOWN",
"UNKNOWN",
"UNKNOWN",
"UNKNOWN",
"UNKNOWN",
"UNKNOWN",
"UNKNOWN",
"UNKNOWN",
"UNKNOWN",
"UNKNOWN",
"UNKNOWN",
"UNKNOWN",
"UNKNOWN",
"UNKNOWN",
"UNKNOWN",
"UNKNOWN",
"UNKNOWN",
"UNKNOWN",
"UNKNOWN",
"UNKNOWN",
"UNKNOWN",
"UNKNOWN",
"UNKNOWN",
"UNKNOWN",
"UNKNOWN",
"UNKNOWN",
"UNKNOWN",
"UNKNOWN",
"UNKNOWN",
"UNKNOWN",
"UNKNOWN",
"UNKNOWN",
"UNKNOWN",
"UNKNOWN",
"UNKNOWN",
"UNKNOWN",
"UNKNOWN",
"UNKNOWN",
"UNKNOWN",
"UNKNOWN",
"UNKNOWN",
"UNKNOWN",
"UNKNOWN",
"UNKNOWN",
"UNKNOWN",
"UNKNOWN",
"UNKNOWN",
"UNKNOWN",
"UNKNOWN",
"UNKNOWN",
"UNKNOWN",
"UNKNOWN",
"UNKNOWN",
"UNKNOWN",
"UNKNOWN",
"UNKNOWN",
"UNKNOWN",
"UNKNOWN",
"UNKNOWN",
"UNKNOWN",
"UNKNOWN",
"UNKNOWN",
"UNKNOWN",
"UNKNOWN",
"UNKNOWN",
"UNKNOWN",
"UNKNOWN",
"UNKNOWN",
"UNKNOWN",
"UNKNOWN",
"UNKNOWN",
"UNKNOWN",
"UNKNOWN",
"UNKNOWN",
"UNKNOWN",
"OTHERS ",
"UNKNOWN ",
};
char s_strNA[] = {
"N/A"
};

View File

@ -0,0 +1,54 @@
/*---------------------------------------------------------------------------*
Project: TwlIPL - tests - DisplaySystemInformation
File: strResource.h
Copyright **** Nintendo. All rights reserved.
These coded instructions, statements, and computer programs contain
proprietary information of Nintendo of America Inc. and/or Nintendo
Company Ltd., and are protected by Federal copyright law. They may
not be disclosed to third parties or copied or duplicated in any form,
in whole or in part, without the prior written consent of Nintendo.
$Date:: $
$Rev:$
$Author:$
*---------------------------------------------------------------------------*/
#ifndef __DISPLAY_INFO_RESOURCE__
#define __DISPLAY_INFO_RESOURCE__
// 各項目のページごとのオフセット値
extern const int s_pageOffset[ROOTMENU_SIZE][MAXPAGE];
extern const u8 s_numMenu[];
extern const char *s_strRootMenu[];
extern const char *s_strMenuName[];
extern const char *s_strOwnerMenu[];
extern const char *s_strParentalMenu[];
extern const char *s_strNormalHWMenu[];
extern const char *s_strSecureHWMenu[];
extern const char *s_strSCFGARM7Menu[];
extern const char *s_strSCFGARM9Menu[];
extern const char *s_strVersionMenu[];
extern const char **s_strMetaMenu[];
const u16 *s_strARM7RegisterName[];
const u16 *s_strARM9RegisterName[];
extern char *s_strEnable[];
extern char *s_strSupply[];
extern char *s_strRomMode[];
extern char *s_strPSRAM[];
extern char *s_strCpuSpeed[];
extern char *s_strBool[];
extern char *s_strAccess[];
extern char *s_strRomApp[];
extern char *s_strRomForm[];
extern char *s_strMCMode[];
extern char *s_strRatingOrg[];
extern char *s_strRegion[];
extern char *s_strUserColor[];
extern char *s_strLanguage[];
extern char *s_strCountry[];
extern char s_strNA[];
#endif

View File

@ -0,0 +1,756 @@
/*---------------------------------------------------------------------------*
Project: TwlIPL - tests - DisplaySystemInformation
File: viewSystemInfo.c
Copyright **** Nintendo. All rights reserved.
These coded instructions, statements, and computer programs contain
proprietary information of Nintendo of America Inc. and/or Nintendo
Company Ltd., and are protected by Federal copyright law. They may
not be disclosed to third parties or copied or duplicated in any form,
in whole or in part, without the prior written consent of Nintendo.
$Date:: $
$Rev:$
$Author:$
*---------------------------------------------------------------------------*/
#include <wchar.h>
#include <stdlib.h>
#include <twl/os/common/ownerInfoEx_private.h>
#include <twl/os/common/sharedFont.h>
#include "misc.h"
#include "viewSystemInfo.h"
#include "strResource.h"
#include "control.h"
#include "myIoreg_SCFG.h"
#define DISPINFO_BUFSIZE 64
#define WL_TITLEID 0x0003000F484E4341
/* function prototype ----------------------------- */
void getAllInfo( void );
void initInfo( void );
void infoAlloc( DispInfoEntry *p, u8 index, u8 size, BOOL isSjis );
void printAllInfo ( void );
void getOwnerInfo( void );
void getParentalInfo( void );
void getNormalHWInfo( void );
BOOL getSecureHWInfo( void );
void getSCFGARM9Info( void );
void getSCFGARM7Info( void );
void getVersions( void );
void getWirelessVersion( void );
void getContentsVersion( void );
void getSharedFontVersion( void );
/* global variables ----------------------------- */
DispInfoEntry* gAllInfo[ROOTMENU_SIZE]; // それぞれのメニューごとに項目の中身を"文字列で"持つ配列
//u16 gUserName[OS_OWNERINFO_NICKNAME_MAX + 1]; // ユーザ名
//u16 gUserComment[OS_OWNERINFO_COMMENT_MAX + 1]; // ユーザコメント
//u16 gSecretAnswer[OS_TWL_PCTL_SECRET_ANSWER_LENGTH_MAX + 1]; // 秘密の答え
// コンテンツタイトル関係
OSTitleId *gContentsTitle; // コンテンツタイトルの一覧
s32 gNumContents; // gContentsTitleに含まれるタイトルの数
u16 *gContentsVersion; // gContentsTitleそれぞれのバージョン情報
// ARM7側のSCFGデータを保持
u8 gArm7SCFGReg[DISPINFO_SHARED_SCFG_REG_SIZE];
u8 gArm7SCFGWram[DISPINFO_SHARED_SCFG_WRAM_SIZE];
/*
static OSOwnerInfoEx gOwnerInfo; // オーナー情報
static BOOL gbWirelessAvailable; // 無線が有効かどうか
static BOOL gbBatteryExtensionAvailable; // バッテリーエクステンションモードが有効か
static BOOL gbAgreeEula; // Eula同意済みか
static u8 gEulaVersion; // 同意Eulaのバージョン
static const OSTWLParentalControl *gpPC; // ペアレンタルコントロール情報
static u8 gUniqueID[OS_TWL_HWINFO_MOVABLE_UNIQUE_ID_LEN]; // ユニークId
static BOOL gbForceDisableWireless; // 無線の強制無効化フラグ
static OSTWLRegion gRegion; // リージョン番号
static u8 gSerialNo[OS_TWL_HWINFO_SERIALNO_LEN_MAX]; // シリアル番号
*/
/* static data ---------------------------------- */
/* function definition -------------------------- */
void displayInfoMain( void )
{
static int menu = MENU_ROOT;
static int line = 0; // 現在選択しているページナンバと行
static BOOL firstCall = TRUE; // 最初の呼び出しか否か
// 初回の呼び出し時は全ての情報を取得しなおす
if( firstCall )
{
initInfo();
getAllInfo();
}
// パッド情報で選んでる場所とか情報とか更新
if( control( &menu, &line ) || firstCall )
{
// 何か操作があったときはキャンバスクリアして描画しなおし
NNS_G2dCharCanvasClear( &gCanvas, TXT_COLOR_WHITE );
NNS_G2dCharCanvasClear( &gCanvasSub, TXT_COLOR_WHITE );
firstCall = FALSE;
}
drawMenu( menu, line); // 情報一覧を描画する
drawHeader( menu, line );
}
void initInfo( void )
{
OS_TPrintf("buffer initialize\n");
// 固定文字列で対応できない項目に文字列領域を割り当てる
infoAlloc( gAllInfo[MENU_OWNER], OWNER_BIRTHDAY, DISPINFO_BUFSIZE , TRUE );
// infoAlloc( gAllInfo[MENU_PARENTAL], PARENTAL_AGE, DISPINFO_BUFSIZE , TRUE );
// infoAlloc( gAllInfo[MENU_PARENTAL], PARENTAL_QUESTION_ID, DISPINFO_BUFSIZE, TRUE );
// infoAlloc( gAllInfo[MENU_PARENTAL], PARENTAL_PASSWORD, OS_TWL_PCTL_PASSWORD_LENGTH+1, TRUE );
// infoAlloc( gAllInfo[MENU_NORMAL_HW], NORMAL_HW_EULA_VERSION , DISPINFO_BUFSIZE , TRUE );
// infoAlloc( gAllInfo[MENU_NORMAL_HW], NORMAL_HW_RTC_OFFSET, DISPINFO_BUFSIZE, TRUE );
infoAlloc( gAllInfo[MENU_SECURE_HW], SECURE_HW_UNIQUE_ID, OS_TWL_HWINFO_MOVABLE_UNIQUE_ID_LEN*3 , TRUE );
infoAlloc( gAllInfo[MENU_SECURE_HW], SECURE_HW_SERIAL , OS_TWL_HWINFO_SERIALNO_LEN_MAX + 1, TRUE );
infoAlloc( gAllInfo[MENU_SECURE_HW], SECURE_HW_LANGUAGE, DISPINFO_BUFSIZE , TRUE );
infoAlloc( gAllInfo[MENU_SECURE_HW], SECURE_HW_FUSE, DISPINFO_BUFSIZE , TRUE );
infoAlloc( gAllInfo[MENU_SCFG_ARM7], SCFG_ARM7_MI_CC, DISPINFO_BUFSIZE , TRUE );
infoAlloc( gAllInfo[MENU_SCFG_ARM7], SCFG_ARM7_MI_CA, DISPINFO_BUFSIZE , TRUE );
infoAlloc( gAllInfo[MENU_OWNER], OWNER_NICKNAME, OS_OWNERINFO_NICKNAME_MAX + 1 , FALSE );
infoAlloc( gAllInfo[MENU_OWNER], OWNER_COMMENT, OS_OWNERINFO_COMMENT_MAX + 1 , FALSE );
infoAlloc( gAllInfo[MENU_PARENTAL], PARENTAL_ANSWER, OS_TWL_PCTL_SECRET_ANSWER_LENGTH_MAX + 1 , FALSE );
OS_TPrintf( "information alloc succeeded\n" );
}
void infoAlloc( DispInfoEntry *p, u8 index, u8 size, BOOL isSjis )
{
if( isSjis )
{
p[index].str.sjis = (char*) Alloc (sizeof(char) * size);
SDK_ASSERT( p->str.sjis );
p[index].str.sjis[size] = '\0';
}
else
{
p[index].str.utf = (u16*) Alloc (sizeof(u16) * size);
SDK_ASSERT( p->str.utf );
p[index].str.utf[size-1] = '\0';
}
}
void getAllInfo( void )
//
{
BOOL SCFGAccessable = FALSE;
BOOL fuseRomAccessable = FALSE;
OS_TPrintf("reflesh Information\n");
getOwnerInfo();
getParentalInfo();
getNormalHWInfo();
getSecureHWInfo();
getSCFGARM7Info();
getSCFGARM9Info();
getVersions();
/*
if( fuseRomAccessable )
{
}*/
printAllInfo();
OS_TPrintf("reflesh information finished\n");
}
void getOwnerInfo( void )
// オーナー情報周りを取得する
{
OSOwnerInfoEx ownerInfo;
OS_TPrintf( "...Owner Information\n");
// 本体設定まわり
OS_GetOwnerInfoEx( &ownerInfo );
// 全体情報につめていく
// 泥臭すぎるやり方なのであとで考える
gAllInfo[MENU_OWNER][OWNER_LANGUAGE].str.sjis = s_strLanguage[ ownerInfo.language ];
gAllInfo[MENU_OWNER][OWNER_LANGUAGE].iValue = ownerInfo.language;
gAllInfo[MENU_OWNER][OWNER_COLOR].str.sjis = s_strUserColor[ ownerInfo.favoriteColor ];
gAllInfo[MENU_OWNER][OWNER_COLOR].iValue = ownerInfo.favoriteColor;
snprintf( gAllInfo[MENU_OWNER][OWNER_BIRTHDAY].str.sjis, DISPINFO_BUFSIZE-1, "%02d/%02d", ownerInfo.birthday.month, ownerInfo.birthday.day);
gAllInfo[MENU_OWNER][OWNER_BIRTHDAY].iValue = ownerInfo.birthday.month * 100 + ownerInfo.birthday.day;
gAllInfo[MENU_OWNER][OWNER_COUNTRY].str.sjis = s_strCountry[ownerInfo.country];
gAllInfo[MENU_OWNER][OWNER_COUNTRY].iValue = ownerInfo.country;
wcsncpy( gAllInfo[MENU_OWNER][OWNER_NICKNAME].str.utf , ownerInfo.nickName, OS_OWNERINFO_NICKNAME_MAX + 1);
gAllInfo[MENU_OWNER][OWNER_NICKNAME].isSjis = FALSE;
wcsncpy( gAllInfo[MENU_OWNER][OWNER_COMMENT].str.utf , ownerInfo.comment, OS_OWNERINFO_COMMENT_MAX + 1 );
gAllInfo[MENU_OWNER][OWNER_COMMENT].isSjis = FALSE;
}
void getParentalInfo( void )
// ペアレンタルコントロール情報を取得する
{
// ペアレンタルコントロールまわり
const LCFGTWLParentalControl *pPC = (const LCFGTWLParentalControl *) OS_GetParentalControlInfoPtr();
OS_TPrintf( "...Parental Control Information\n" );
gAllInfo[MENU_PARENTAL][PARENTAL_FLAG].str.sjis = s_strBool[ pPC->flags.isSetParentalControl ];
gAllInfo[MENU_PARENTAL][PARENTAL_FLAG].iValue = (int) pPC->flags.isSetParentalControl;
gAllInfo[MENU_PARENTAL][PARENTAL_PICTOCHAT].str.sjis = s_strBool[ pPC->flags.pictoChat ];
gAllInfo[MENU_PARENTAL][PARENTAL_PICTOCHAT].iValue = (int) pPC->flags.pictoChat;
gAllInfo[MENU_PARENTAL][PARENTAL_DOWNLOAD].str.sjis = s_strBool[ pPC->flags.dsDownload ];
gAllInfo[MENU_PARENTAL][PARENTAL_DOWNLOAD].iValue = (int) pPC->flags.dsDownload;
gAllInfo[MENU_PARENTAL][PARENTAL_BROWSER].str.sjis = s_strBool[ pPC->flags.browser ];
gAllInfo[MENU_PARENTAL][PARENTAL_BROWSER].iValue = (int) pPC->flags.browser;
gAllInfo[MENU_PARENTAL][PARENTAL_WIIPOINT].str.sjis = s_strBool[ pPC->flags.wiiPoint ];
gAllInfo[MENU_PARENTAL][PARENTAL_WIIPOINT].iValue = (int) pPC->flags.wiiPoint;
gAllInfo[MENU_PARENTAL][PARENTAL_PHOTO_EXCHANGE].str.sjis = s_strBool[ pPC->flags.photoExchange ];
gAllInfo[MENU_PARENTAL][PARENTAL_PHOTO_EXCHANGE].iValue = (int) pPC->flags.photoExchange;
gAllInfo[MENU_PARENTAL][PARENTAL_UGC].str.sjis = s_strBool[ pPC->flags.ugc ];
gAllInfo[MENU_PARENTAL][PARENTAL_UGC].iValue = (int) pPC->flags.ugc;
gAllInfo[MENU_PARENTAL][PARENTAL_ORGANIZATION].str.sjis = s_strRatingOrg[ pPC->ogn ];
gAllInfo[MENU_PARENTAL][PARENTAL_ORGANIZATION].iValue = (int) pPC->ogn;
gAllInfo[MENU_PARENTAL][PARENTAL_AGE].iValue = pPC->ratingAge;
gAllInfo[MENU_PARENTAL][PARENTAL_AGE].isNumData = TRUE;
gAllInfo[MENU_PARENTAL][PARENTAL_QUESTION_ID].iValue = pPC->secretQuestionID;
gAllInfo[MENU_PARENTAL][PARENTAL_QUESTION_ID].isNumData = TRUE;
gAllInfo[MENU_PARENTAL][PARENTAL_PASSWORD].iValue = atoi( pPC->password ) ;
gAllInfo[MENU_PARENTAL][PARENTAL_PASSWORD].isNumData = TRUE;
wcsncpy( gAllInfo[MENU_PARENTAL][PARENTAL_ANSWER].str.utf , pPC->secretAnswer, OS_TWL_PCTL_SECRET_ANSWER_LENGTH_MAX + 1);
gAllInfo[MENU_PARENTAL][PARENTAL_ANSWER].isSjis = FALSE;
}
void getNormalHWInfo( void )
{
int val;
val = OS_IsAvailableWireless();
gAllInfo[MENU_NORMAL_HW][NORMAL_HW_WIRELESS].iValue = val;
gAllInfo[MENU_NORMAL_HW][NORMAL_HW_WIRELESS].str.sjis = s_strEnable[ val ];
gAllInfo[MENU_NORMAL_HW][NORMAL_HW_RTC_OFFSET].iValue = (int) OS_GetOwnerRtcOffset();
gAllInfo[MENU_NORMAL_HW][NORMAL_HW_RTC_OFFSET].isNumData = TRUE;
val = OS_IsAgreeEULA();
gAllInfo[MENU_NORMAL_HW][NORMAL_HW_AGREE_EULA].iValue = val;
gAllInfo[MENU_NORMAL_HW][NORMAL_HW_AGREE_EULA].str.sjis = s_strBool[ val ];
gAllInfo[MENU_NORMAL_HW][NORMAL_HW_EULA_VERSION].iValue = OS_GetAgreedEULAVersion();
gAllInfo[MENU_NORMAL_HW][NORMAL_HW_EULA_VERSION].isNumData = TRUE;
}
BOOL getSecureHWInfo( void )
{
gAllInfo[MENU_SECURE_HW][SECURE_HW_FORCE_DISABLE].str.sjis = s_strBool[ OS_IsForceDisableWireless() ];
gAllInfo[MENU_SECURE_HW][SECURE_HW_FORCE_DISABLE].isAligned = FALSE;
gAllInfo[MENU_SECURE_HW][SECURE_HW_FORCE_DISABLE].numLines = 2;
gAllInfo[MENU_SECURE_HW][SECURE_HW_REGION].str.sjis = s_strRegion[ OS_GetRegion() ];
{
int i;
char ascii[] = "0123456789abcdef";
const u8 *unq = OS_GetMovableUniqueIDPtr();
// 16進で1バイトずつ詰めていく
// バッファが長さの3倍長なのは、データを"%02x-%02x-%02x..."に置換するため
for(i=0; i < OS_TWL_HWINFO_MOVABLE_UNIQUE_ID_LEN*3; i += 3, unq++ )
{
gAllInfo[MENU_SECURE_HW][SECURE_HW_UNIQUE_ID].str.sjis[i] = ascii[(*unq>>4) & 0x0f];
gAllInfo[MENU_SECURE_HW][SECURE_HW_UNIQUE_ID].str.sjis[i+1] = ascii[*unq & 0x0f];
gAllInfo[MENU_SECURE_HW][SECURE_HW_UNIQUE_ID].str.sjis[i+2] =
(i+2) == (OS_TWL_HWINFO_MOVABLE_UNIQUE_ID_LEN*3 - 1) ? (char)'\0' : (char)'-' ;
OS_TPrintf("uniqid: %d\n", *unq);
}
}
{
u8 serialBuf[OS_TWL_HWINFO_SERIALNO_LEN_MAX];
OS_GetSerialNo( serialBuf );
snprintf( gAllInfo[MENU_SECURE_HW][SECURE_HW_SERIAL].str.sjis , OS_TWL_HWINFO_SERIALNO_LEN_MAX, "%s", serialBuf);
}
{
u64 buf;
buf = OS_GetValidLanguageBitmap();
OS_TPrintf("language bitmap : %lx\n", buf );
snprintf( gAllInfo[MENU_SECURE_HW][SECURE_HW_LANGUAGE].str.sjis ,
DISPINFO_BUFSIZE-1, "%08lx", OS_GetValidLanguageBitmap() );
// fuseRomデータの読み出し
// secureなアプリ以外はハード的に切り離されるのでゼロになる
buf = SCFG_ReadFuseData();
OS_TPrintf("fuse data : %llx\n", buf);
snprintf( gAllInfo[MENU_SECURE_HW][SECURE_HW_FUSE].str.sjis ,
DISPINFO_BUFSIZE-1, "%016llx", SCFG_ReadFuseData() );
// 返り値でセキュアアプリかどうか判定できるように
if( buf )
{
return TRUE;
}
else
{
return FALSE;
}
}
}
void getSCFGARM9Info( void )
// SCFG情報を取得する
{
gAllInfo[MENU_SCFG_ARM9][SCFG_ARM9_ROM_STATE].str.sjis =
SCFG_GetSystemRomType() == SCFG_SYSTEM_ROM_FOR_NITRO ? s_strRomMode[1] : s_strRomMode[0];
gAllInfo[MENU_SCFG_ARM9][SCFG_ARM9_CAMERA_CKI].str.sjis = s_strEnable[ SCFG_IsCameraCKIClockEnable() ];
gAllInfo[MENU_SCFG_ARM9][SCFG_ARM9_WRAM_CLOCK].str.sjis = s_strSupply[ SCFG_IsClockSuppliedToWram() ];
gAllInfo[MENU_SCFG_ARM9][SCFG_ARM9_CAMERA_CLOCK].str.sjis = s_strSupply[ SCFG_IsClockSuppliedToCamera() ];
gAllInfo[MENU_SCFG_ARM9][SCFG_ARM9_DSP_CLOCK].str.sjis = s_strSupply[ SCFG_IsClockSuppliedToDSP() ];
gAllInfo[MENU_SCFG_ARM9][SCFG_ARM9_CPU_SPEED].str.sjis =
SCFG_GetCpuSpeed() == SCFG_CPU_SPEED_1X ? s_strCpuSpeed[0] : s_strCpuSpeed[1];
gAllInfo[MENU_SCFG_ARM9][SCFG_ARM9_DSP_RESET].str.sjis = s_strBool[ SCFG_IsDSPReset() ];
gAllInfo[MENU_SCFG_ARM9][SCFG_ARM9_CFG_ACCESSIBLE].str.sjis = s_strEnable[ SCFG_IsConfigBlockAccessible() ];
gAllInfo[MENU_SCFG_ARM9][SCFG_ARM9_CFG_ACCESSIBLE].isAligned = FALSE;
gAllInfo[MENU_SCFG_ARM9][SCFG_ARM9_CFG_ACCESSIBLE].numLines = 2;
gAllInfo[MENU_SCFG_ARM9][SCFG_ARM9_WRAM_ACCESSIBLE].str.sjis = s_strEnable[ SCFG_IsWramAccessible() ];
gAllInfo[MENU_SCFG_ARM9][SCFG_ARM9_DSP_ACCESSIBLE].str.sjis = s_strEnable[ SCFG_IsDSPAccessible() ];
gAllInfo[MENU_SCFG_ARM9][SCFG_ARM9_CAMERA_ACCESSIBLE].str.sjis = s_strEnable[ SCFG_IsCameraAccessible() ];
gAllInfo[MENU_SCFG_ARM9][SCFG_ARM9_NDMA_ACCESSIBLE].str.sjis = s_strEnable[ SCFG_IsNDmaAccessible() ];
{
u8 idx;
if( SCFG_GetPsramBoundary() == SCFG_PSRAM_BOUNDARY_4MB )
{
idx = 0;
}
else if ( SCFG_GetPsramBoundary() == SCFG_PSRAM_BOUNDARY_16MB )
{
idx = 1;
}
else if ( SCFG_GetPsramBoundary() == SCFG_PSRAM_BOUNDARY_32MB )
{
idx = 2;
}
gAllInfo[MENU_SCFG_ARM9][SCFG_ARM9_PSRAM_BOUNDARY].str.sjis = s_strPSRAM[ idx ];
}
gAllInfo[MENU_SCFG_ARM9][SCFG_ARM9_INTC_EXPANSION].str.sjis = s_strEnable[ SCFG_IsIntcExpanded() ];
gAllInfo[MENU_SCFG_ARM9][SCFG_ARM9_LCDC_EXPANSION].str.sjis = s_strEnable[ SCFG_IsLCDCExpanded() ];
gAllInfo[MENU_SCFG_ARM9][SCFG_ARM9_VRAM_EXPANSION].str.sjis = s_strEnable[ SCFG_IsVramExpanded() ];
gAllInfo[MENU_SCFG_ARM9][SCFG_ARM9_FIX_CARD].str.sjis = s_strEnable[ SCFG_IsCardFixed() ];
gAllInfo[MENU_SCFG_ARM9][SCFG_ARM9_FIX_DIVIDER].str.sjis = s_strEnable[ SCFG_IsDividerFixed() ];
gAllInfo[MENU_SCFG_ARM9][SCFG_ARM9_FIX_2DENGINE].str.sjis = s_strEnable[ SCFG_Is2DEngineFixed() ];
gAllInfo[MENU_SCFG_ARM9][SCFG_ARM9_FIX_RENDERER].str.sjis = s_strEnable[ SCFG_IsRendererFixed() ];
gAllInfo[MENU_SCFG_ARM9][SCFG_ARM9_FIX_GEOMETRY].str.sjis = s_strEnable[ SCFG_IsGeometryFixed() ];
gAllInfo[MENU_SCFG_ARM9][SCFG_ARM9_FIX_DMA].str.sjis = s_strEnable[ SCFG_IsDmacFixed() ];
}
void getSCFGARM7Info( void )
{
// 必要なデータは全てgARM7SCFGReg, gARM7SCFGWramで確保済
// ROM制御レジスタ(L)、(H)
{
// SECフラグはTRUE = 切り離し(アクセス不可), FALSE = 接続(アクセス可)
gAllInfo[MENU_SCFG_ARM7][SCFG_ARM7_ROM_ARM9_SEC].str.sjis =
gArm7SCFGReg[DISP_REG_A9ROM_OFFSET - 0x4000] & DISP_REG_SCFG_A9ROM_SEC_MASK ? s_strAccess[0]: s_strAccess[1];
gAllInfo[MENU_SCFG_ARM7][SCFG_ARM7_ROM_ARM9_RSEL].str.sjis =
gArm7SCFGReg[DISP_REG_A9ROM_OFFSET - 0x4000] & DISP_REG_SCFG_A9ROM_RSEL_MASK ? s_strRomMode[1]: s_strRomMode[0];
// SECフラグはTRUE = 切り離し(アクセス不可), FALSE = 接続(アクセス可)
gAllInfo[MENU_SCFG_ARM7][SCFG_ARM7_ROM_ARM7_SEC].str.sjis =
gArm7SCFGReg[DISP_REG_A7ROM_OFFSET - 0x4000] & DISP_REG_SCFG_A7ROM_SEC_MASK ? s_strAccess[0]: s_strAccess[1];
gAllInfo[MENU_SCFG_ARM7][SCFG_ARM7_ROM_ARM7_RSEL].str.sjis =
gArm7SCFGReg[DISP_REG_A7ROM_OFFSET - 0x4000] & DISP_REG_SCFG_A7ROM_RSEL_MASK ? s_strRomMode[1]: s_strRomMode[0];
// FuseROMフラグはTRUE = 切り離し(アクセス不可), FALSE = 接続(アクセス可)
gAllInfo[MENU_SCFG_ARM7][SCFG_ARM7_ROM_ARM7_FUSE].str.sjis =
gArm7SCFGReg[DISP_REG_A7ROM_OFFSET - 0x4000] & DISP_REG_SCFG_A7ROM_FUSE_MASK ? s_strAccess[0]: s_strAccess[1];
gAllInfo[MENU_SCFG_ARM7][SCFG_ARM7_ROM_WE].str.sjis =
gArm7SCFGReg[DISP_REG_ROMWE_OFFSET - 0x4000] & DISP_REG_SCFG_ROMWE_WE_MASK ? s_strEnable[1]: s_strEnable[0];
}
// 新規ブロッククロック制御レジスタ
{
u16 flag = MI_LoadLE16( &gArm7SCFGReg[DISP_REG_CLK_OFFSET - 0x4000] );
gAllInfo[MENU_SCFG_ARM7][SCFG_ARM7_CLK_SD1].str.sjis =
flag & DISP_REG_SCFG_CLK_SD1HCLK_MASK ? s_strSupply[1]: s_strSupply[0];
gAllInfo[MENU_SCFG_ARM7][SCFG_ARM7_CLK_SD2].str.sjis =
flag & DISP_REG_SCFG_CLK_SD2HCLK_MASK ? s_strSupply[1]: s_strSupply[0];
gAllInfo[MENU_SCFG_ARM7][SCFG_ARM7_CLK_AES].str.sjis =
flag & DISP_REG_SCFG_CLK_AESHCLK_MASK ? s_strSupply[1]: s_strSupply[0];
gAllInfo[MENU_SCFG_ARM7][SCFG_ARM7_CLK_WRAM].str.sjis =
flag & DISP_REG_SCFG_CLK_WRAMHCLK_MASK ? s_strSupply[1]: s_strSupply[0];
gAllInfo[MENU_SCFG_ARM7][SCFG_ARM7_CLK_SND].str.sjis =
flag & DISP_REG_SCFG_CLK_SNDMCLK_MASK ? s_strSupply[1]: s_strSupply[0];
}
// JTAG制御レジスタ
{
u16 flag = MI_LoadLE16( &gArm7SCFGReg[DISP_REG_JTAG_OFFSET - 0x4000] );
gAllInfo[MENU_SCFG_ARM7][SCFG_ARM7_JTAG_A7].str.sjis =
flag & DISP_REG_SCFG_JTAG_ARM7SEL_MASK ? s_strEnable[1]: s_strEnable[0];
gAllInfo[MENU_SCFG_ARM7][SCFG_ARM7_JTAG_A7].isAligned = FALSE;
gAllInfo[MENU_SCFG_ARM7][SCFG_ARM7_JTAG_A7].numLines = 2;
gAllInfo[MENU_SCFG_ARM7][SCFG_ARM7_JTAG_CPU].str.sjis =
flag & DISP_REG_SCFG_JTAG_CPUJE_MASK ? s_strEnable[1]: s_strEnable[0];
gAllInfo[MENU_SCFG_ARM7][SCFG_ARM7_JTAG_DSP].str.sjis =
flag & DISP_REG_SCFG_JTAG_DSPJE_MASK ? s_strEnable[1]: s_strEnable[0];
}
// 拡張機能制御レジスタ
{
u32 flag = MI_LoadLE32( &gArm7SCFGReg[DISP_REG_EXT_OFFSET - 0x4000] );
gAllInfo[MENU_SCFG_ARM7][SCFG_ARM7_EXT_DMA].str.sjis =
flag & DISP_REG_SCFG_EXT_DMA_MASK ? s_strEnable[1]: s_strEnable[0];
gAllInfo[MENU_SCFG_ARM7][SCFG_ARM7_EXT_SDMA].str.sjis =
flag & DISP_REG_SCFG_EXT_SDMA_MASK ? s_strEnable[1]: s_strEnable[0];
gAllInfo[MENU_SCFG_ARM7][SCFG_ARM7_EXT_SND].str.sjis =
flag & DISP_REG_SCFG_EXT_SND_MASK ? s_strEnable[1]: s_strEnable[0];
gAllInfo[MENU_SCFG_ARM7][SCFG_ARM7_EXT_MC].str.sjis =
flag & DISP_REG_SCFG_EXT_MC_MASK ? s_strEnable[1]: s_strEnable[0];
gAllInfo[MENU_SCFG_ARM7][SCFG_ARM7_EXT_MC].isAligned = FALSE;
gAllInfo[MENU_SCFG_ARM7][SCFG_ARM7_EXT_MC].numLines = 2;
gAllInfo[MENU_SCFG_ARM7][SCFG_ARM7_EXT_INTC].str.sjis =
flag & DISP_REG_SCFG_EXT_INTC_MASK ? s_strEnable[1]: s_strEnable[0];
gAllInfo[MENU_SCFG_ARM7][SCFG_ARM7_EXT_INTC].isAligned = FALSE;
gAllInfo[MENU_SCFG_ARM7][SCFG_ARM7_EXT_INTC].numLines = 2;
gAllInfo[MENU_SCFG_ARM7][SCFG_ARM7_EXT_SPI].str.sjis =
flag & DISP_REG_SCFG_EXT_SPI_MASK ? s_strEnable[1]: s_strEnable[0];
gAllInfo[MENU_SCFG_ARM7][SCFG_ARM7_EXT_DSEL].str.sjis =
flag & DISP_REG_SCFG_EXT_DSEL_MASK ? s_strEnable[1]: s_strEnable[0];
gAllInfo[MENU_SCFG_ARM7][SCFG_ARM7_EXT_DSEL].isAligned = FALSE;
gAllInfo[MENU_SCFG_ARM7][SCFG_ARM7_EXT_DSEL].numLines = 2;
gAllInfo[MENU_SCFG_ARM7][SCFG_ARM7_EXT_SIO].str.sjis =
flag & DISP_REG_SCFG_EXT_SIO_MASK ? s_strEnable[1]: s_strEnable[0];
gAllInfo[MENU_SCFG_ARM7][SCFG_ARM7_EXT_LCDC].str.sjis =
flag & DISP_REG_SCFG_EXT_LCDC_MASK ? s_strEnable[1]: s_strEnable[0];
gAllInfo[MENU_SCFG_ARM7][SCFG_ARM7_EXT_VRAM].str.sjis =
flag & DISP_REG_SCFG_EXT_VRAM_MASK ? s_strEnable[1]: s_strEnable[0];
{
u32 psFlag = (flag & DISP_REG_SCFG_EXT_PSRAM_MASK) >> DISP_REG_SCFG_EXT_PSRAM_SHIFT;
u8 idx = 0;
if( psFlag <= 1 )
{
idx = 0;
}
else if ( psFlag == 2 )
{
idx = 1;
}
else if ( psFlag == 3 )
{
idx = 2;
}
gAllInfo[MENU_SCFG_ARM7][SCFG_ARM7_EXT_PS].str.sjis = s_strPSRAM[idx];
}
gAllInfo[MENU_SCFG_ARM7][SCFG_ARM7_EXT_DMAC].str.sjis =
flag & DISP_REG_SCFG_EXT_DMAC_MASK ? s_strEnable[1]: s_strEnable[0];
gAllInfo[MENU_SCFG_ARM7][SCFG_ARM7_EXT_AES].str.sjis =
flag & DISP_REG_SCFG_EXT_AES_MASK ? s_strEnable[1]: s_strEnable[0];
gAllInfo[MENU_SCFG_ARM7][SCFG_ARM7_EXT_SD1].str.sjis =
flag & DISP_REG_SCFG_EXT_SD1_MASK ? s_strEnable[1]: s_strEnable[0];
gAllInfo[MENU_SCFG_ARM7][SCFG_ARM7_EXT_SD2].str.sjis =
flag & DISP_REG_SCFG_EXT_SD2_MASK ? s_strEnable[1]: s_strEnable[0];
gAllInfo[MENU_SCFG_ARM7][SCFG_ARM7_EXT_MIC].str.sjis =
flag & DISP_REG_SCFG_EXT_MIC_MASK ? s_strEnable[1]: s_strEnable[0];
gAllInfo[MENU_SCFG_ARM7][SCFG_ARM7_EXT_I2S].str.sjis =
flag & DISP_REG_SCFG_EXT_I2S_MASK ? s_strEnable[1]: s_strEnable[0];
gAllInfo[MENU_SCFG_ARM7][SCFG_ARM7_EXT_I2C].str.sjis =
flag & DISP_REG_SCFG_EXT_I2C_MASK ? s_strEnable[1]: s_strEnable[0];
gAllInfo[MENU_SCFG_ARM7][SCFG_ARM7_EXT_GPIO].str.sjis =
flag & DISP_REG_SCFG_EXT_GPIO_MASK ? s_strEnable[1]: s_strEnable[0];
gAllInfo[MENU_SCFG_ARM7][SCFG_ARM7_EXT_MCB].str.sjis =
flag & DISP_REG_SCFG_EXT_MC_B_MASK ? s_strEnable[1]: s_strEnable[0];
gAllInfo[MENU_SCFG_ARM7][SCFG_ARM7_EXT_WRAM].str.sjis =
flag & DISP_REG_SCFG_EXT_WRAM_MASK ? s_strEnable[1]: s_strEnable[0];
gAllInfo[MENU_SCFG_ARM7][SCFG_ARM7_EXT_PU].str.sjis =
flag & DISP_REG_SCFG_EXT_PUENABLE_MASK ? s_strEnable[1]: s_strEnable[0];
gAllInfo[MENU_SCFG_ARM7][SCFG_ARM7_EXT_CFG].str.sjis =
flag & DISP_REG_SCFG_EXT_CFG_MASK ? s_strEnable[1]: s_strEnable[0];
}
// メモリカード I/F 制御レジスタ
{
u16 flag = MI_LoadLE16( &gArm7SCFGReg[DISP_REG_MC_OFFSET - 0x4000] );
u8 idx;
OS_TPrintf("mc flag: %04x\n", flag );
OS_TPrintf("flag & SC1 cdet mask: %d\n", flag & DISP_REG_MI_MC_SL1_CDET_MASK );
gAllInfo[MENU_SCFG_ARM7][SCFG_ARM7_MI_SC1_CDET].str.sjis =
flag & DISP_REG_MI_MC_SL1_CDET_MASK ? s_strBool[1]: s_strBool[0];
OS_TPrintf("mi SC1 cdet: %s\n", gAllInfo[MENU_SCFG_ARM7][SCFG_ARM7_MI_SC1_CDET].str.sjis );
gAllInfo[MENU_SCFG_ARM7][SCFG_ARM7_MI_SC2_CDET].str.sjis =
flag & DISP_REG_MI_MC_SL2_CDET_MASK ? s_strBool[1]: s_strBool[0];
gAllInfo[MENU_SCFG_ARM7][SCFG_ARM7_MI_SWP].str.sjis =
flag & DISP_REG_MI_MC_SWP_MASK ? s_strBool[1]: s_strBool[0];
idx = (u8) ( (flag & DISP_REG_MI_MC_SL1_MODE_MASK) >> DISP_REG_MI_MC_SL1_MODE_SHIFT );
gAllInfo[MENU_SCFG_ARM7][SCFG_ARM7_MI_SC1_MODE].str.sjis = s_strMCMode[idx];
idx = (u8) ( (flag & DISP_REG_MI_MC_SL2_MODE_MASK) >> DISP_REG_MI_MC_SL2_MODE_SHIFT );
gAllInfo[MENU_SCFG_ARM7][SCFG_ARM7_MI_SC2_MODE].str.sjis = s_strMCMode[idx];
flag = MI_LoadLE16( &gArm7SCFGReg[DISP_REG_MCCHAT_OFFSET - 0x4000] );
snprintf( gAllInfo[MENU_SCFG_ARM7][SCFG_ARM7_MI_CC].str.sjis , DISPINFO_BUFSIZE-1, "%04x",
flag & DISP_REG_MI_MCCHAT_CC_MASK);
flag = MI_LoadLE16( &gArm7SCFGReg[DISP_REG_MC2_OFFSET - 0x4000] );
snprintf( gAllInfo[MENU_SCFG_ARM7][SCFG_ARM7_MI_CA].str.sjis , DISPINFO_BUFSIZE-1, "%04x",
flag & DISP_REG_MI_MC2_CA_MASK );
}
// 旧無線送受信制御レジスタ
{
u8 flag = gArm7SCFGReg[DISP_REG_WL_OFFSET - 0x4000];
gAllInfo[MENU_SCFG_ARM7][SCFG_ARM7_WL_OFFB].str.sjis =
flag & DISP_REG_SCFG_WL_OFFB_MASK ? s_strEnable[1]: s_strEnable[0];
}
// オプション端子読み出しレジスタ
{
u8 flag = gArm7SCFGReg[DISP_REG_OP_OFFSET - 0x4000];
u8 idx = (u8)(flag & DISP_REG_SCFG_OP_OPT_MASK);
gAllInfo[MENU_SCFG_ARM7][SCFG_ARM7_OP_FORM].str.sjis = idx == 3 ? s_strRomForm[1] : s_strRomForm[0];
gAllInfo[MENU_SCFG_ARM7][SCFG_ARM7_OP_APP].str.sjis = s_strRomApp[idx];
}
}
void getVersions( void )
{
getWirelessVersion();
getSharedFontVersion();
getContentsVersion();
}
void getWirelessVersion( void )
// 無線ファームウェアのバージョンを取得する
{
FSFile file;
char filePath[NAM_PATH_LEN+1];
char filebuf[2]; // FWバージョンはMajor, Minorそれぞれ1バイトずつ
int res;
FS_InitFile( &file );
NAM_GetTitleBootContentPath( filePath , WL_TITLEID); // 無線ファームのファイルパスを取得
res = FS_OpenFileEx( &file, filePath, FS_FILEMODE_R );
// バージョン情報の読み取り
FS_SeekFile( &file, 0xA0, FS_SEEK_SET ); // ファイルの0xA0から2バイトがバージョン情報
res = FS_ReadFile( &file, filebuf, 2 );
SDK_ASSERT( res == 2 );
gAllInfo[MENU_VERSION][VERSION_WIRELESS].iValue = filebuf[0] *100 + filebuf[1];
gAllInfo[MENU_VERSION][VERSION_WIRELESS].isNumData = TRUE;
}
void getSharedFontVersion( void )
{
u32 time = OS_GetSharedFontTimestamp();
gAllInfo[MENU_VERSION][VERSION_FONT].iValue = (int) time;
gAllInfo[MENU_VERSION][VERSION_FONT].isNumData = TRUE;
}
void getContentsVersion( void )
// コンテンツリストをもとに各コンテンツのタイトルIDとバージョンを取得
{
NAMTitleInfo info;
int i;
gNumContents = NAM_GetNumTitles();
if( gContentsTitle == NULL )
{
// 初回処理の時はバッファを確保
gContentsTitle = (NAMTitleId*) Alloc( sizeof(NAMTitleId) * gNumContents );
gContentsVersion = (u16*) Alloc( sizeof(u16) * (u32)gNumContents);
}
NAM_GetTitleList( gContentsTitle, (u32)gNumContents);
SDK_POINTER_ASSERT( gContentsTitle );
for( i=0; i<gNumContents; i++ )
{
NAM_ReadTitleInfo( &info, gContentsTitle[i] );
gContentsTitle[i] = info.titleId;
gContentsVersion[i] = info.version;
}
}
void displayInfoInit( void )
{
int loop1, loop2;
GX_DispOff();
GXS_DispOff();
NNS_G2dCharCanvasClear( &gCanvas, TXT_COLOR_WHITE );
PutStringUTF16( 1 * 8, 0 * 8, TXT_COLOR_BLUE, (const u16 *)L"RomTypeTest");
PutStringUTF16( 4 * 8, 8 * 8, TXT_COLOR_BLACK, (const u16 *)L"Push A To Start Test.");
PutStringUTF16( 4 * 8, 10 * 8, TXT_COLOR_BLACK, (const u16 *)L"Push X To Start Test Quietly.");
// 全体情報を持つ配列をセット
// 全項目に文字列バッファを持たせるとメモリ書き込みが多くなるので
// 可能なものは用意したstatic文字列へのポインタで対応
// 必要なものだけあとでmallocする
for(loop1=0; loop1<ROOTMENU_SIZE; loop1++)
{
gAllInfo[loop1] = (DispInfoEntry*)Alloc(sizeof(DispInfoEntry) * s_numMenu[loop1]);
SDK_ASSERT( gAllInfo[loop1] );
for(loop2=0; loop2<s_numMenu[loop1]; loop2++)
{
// デフォルト値の設定
gAllInfo[loop1][loop2].kind = s_strMetaMenu[loop1][loop2];
gAllInfo[loop1][loop2].iValue = 0;
gAllInfo[loop1][loop2].isNumData = FALSE;
gAllInfo[loop1][loop2].numLines = 1;
gAllInfo[loop1][loop2].isSjis = TRUE;
gAllInfo[loop1][loop2].isAligned = TRUE;
gAllInfo[loop1][loop2].str.sjis = s_strNA;
gAllInfo[loop1][loop2].changable = FALSE;
}
}
GXS_SetVisiblePlane( GX_PLANEMASK_BG0 );
GX_DispOn();
GXS_DispOn();
}
void printAllInfo ( void )
{
int loop1, loop2;
for(loop1=0; loop1 < ROOTMENU_SIZE; loop1++ )
{
for(loop2=0; loop2 < s_numMenu[loop1]; loop2++ )
{
DispInfoEntry *entry = &gAllInfo[loop1][loop2];
if( entry->isNumData )
{
OS_TPrintf("%d %d : %d\n", loop1, loop2, entry->iValue);
}
else if( entry->isSjis )
{
OS_TPrintf("%d %d : %s\n", loop1, loop2, entry->str.sjis);
}
else
{
OS_TPrintf("%d %d : %s\n", loop1, loop2, entry->str.utf);
}
/*
// utf16で描画するものだけ分ける
if(loop1 == MENU_OWNER && loop2 == OWNER_NICKNAME)
{
OS_TPrintf("%d %d : %s\n", loop1, loop2, gUserName);
}
else if(loop1 == MENU_OWNER && loop2 == OWNER_COMMENT)
{
OS_TPrintf("%d %d : %s\n", loop1, loop2, gUserComment);
}
else if(loop1 == MENU_PARENTAL && loop2 == PARENTAL_ANSWER)
{
OS_TPrintf("%d %d : %s\n", loop1, loop2, gSecretAnswer);
}
else
{
OS_TPrintf("%d %d : %s\n", loop1, loop2, gAllInfo[loop1][loop2]);
}
*/
}
}
}

View File

@ -0,0 +1,76 @@
/*---------------------------------------------------------------------------*
Project: TwlIPL - tests - DisplaySystemInformation
File: viewSystemInfo.h
Copyright **** Nintendo. All rights reserved.
These coded instructions, statements, and computer programs contain
proprietary information of Nintendo of America Inc. and/or Nintendo
Company Ltd., and are protected by Federal copyright law. They may
not be disclosed to third parties or copied or duplicated in any form,
in whole or in part, without the prior written consent of Nintendo.
$Date:: $
$Rev:$
$Author:$
*---------------------------------------------------------------------------*/
#ifndef __LOAD_VIEW_INFO__
#define __LOAD_VIEW_INFO__
#include <twl.h>
#include "drawFunc.h"
#include "address.h"
#ifdef __cplusplus
extern "C" {
#endif
////////////////////////////////
typedef struct DispInfoEntry
{
BOOL isNumData; // 表示するときは数値データか文字列データか
BOOL isSjis; // UTF16で描画するデータだけFALSE isNumData=TRUEなら未定義
BOOL isAligned; // 一列に表示できるならTRUE、字下げが必要ならFALSE
int numLines; // 項目名、項目内容を表示するのに必要な行数
const char *kind; // 項目名
union {
char* sjis;
u16* utf;
} str;
int iValue; // データの数値型表現(インデクスとか)
BOOL changable; // その値が変更可能か否か
} DispInfoEntry;
////////////////////////////////
// 各種本体、ユーザ情報
extern DispInfoEntry* gAllInfo[ROOTMENU_SIZE];
extern s32 gNumContents;
extern OSTitleId *gContentsTitle;
extern u16 *gContentsVersion;
extern u8 gArm7SCFGReg[DISPINFO_SHARED_SCFG_REG_SIZE]; // ARM7からのデータ取得用バッファ
extern u8 gArm7SCFGWram[DISPINFO_SHARED_SCFG_WRAM_SIZE]; // ARM7からのデータ取得用バッファ
////////////////////////////////
void displayInfoMain( void );
void displayInfoInit( void );
////////////////////////////////
#ifdef __cplusplus
}
#endif
#endif // __LOAD_VIEW_INFO__

View File

@ -0,0 +1,30 @@
#! make -f
#----------------------------------------------------------------------------
# Project: TwlIPL
# File: Makefile
#
# Copyright 2007 Nintendo. All rights reserved.
#
# These coded instructions, statements, and computer programs contain
# proprietary information of Nintendo of America Inc. and/or Nintendo
# Company Ltd., and are protected by Federal copyright law. They may
# not be disclosed to third parties or copied or duplicated in any form,
# in whole or in part, without the prior written consent of Nintendo.
#
# $Date:: $
# $Rev$
# $Author$
#----------------------------------------------------------------------------
include $(TWLSDK_ROOT)/build/buildtools/commondefs
#----------------------------------------------------------------------------
SUBDIRS = banner ARM7 ARM9
#----------------------------------------------------------------------------
include $(TWLSDK_ROOT)/build/buildtools/modulerules
#===== End of Makefile =====

View File

@ -0,0 +1,49 @@
#! make -f
#----------------------------------------------------------------------------
# Project: TwlIPL
# File: Makefile
#
# Copyright 2007 Nintendo. All rights reserved.
#
# These coded instructions, statements, and computer programs contain
# proprietary information of Nintendo of America Inc. and/or Nintendo
# Company Ltd., and are protected by Federal copyright law. They may
# not be disclosed to third parties or copied or duplicated in any form,
# in whole or in part, without the prior written consent of Nintendo.
#
# $Date:: $
# $Rev$
# $Author$
#----------------------------------------------------------------------------
include $(TWL_IPL_RED_ROOT)/build/buildtools/commondefs
ICON_DIR = ./icon
BANNER_ICON = $(ICON_DIR)/gameIcon.bmp
BANNER_SPEC = banner_v3.bsf
TARGETS = banner.bnr
INSTALL_DIR = ./
INSTALL_TARGETS = $(TARGETS)
BANNER_ICON_NAME = $(basename $(BANNER_ICON))
LDIRT_CLEAN = $(TARGETS) \
$(BANNER_ICON_NAME).nbfs \
$(BANNER_ICON_NAME).nbfc \
$(BANNER_ICON_NAME).nbfp \
$(TARGETS:.bnr=.srl)
include $(TWL_IPL_RED_ROOT)/build/buildtools/modulerules
#----------------------------------------------------------------------------
# build
#----------------------------------------------------------------------------
do-build: $(TARGETS)
$(TARGETS): $(BANNER_SPEC) $(BANNER_ICON)
$(NTEXCONV) -no -bg -bgb -bgnc $(BANNER_ICON) >/dev/null && \
$(MAKEBANNER) -N $(BANNER_ICON_NAME) $(BANNER_SPEC) $(TARGETS)
#

Binary file not shown.

After

Width:  |  Height:  |  Size: 630 B

View File

@ -0,0 +1,28 @@
/*---------------------------------------------------------------------------*
Project: TwlIPL - tests - DisplaySystemInformation
File: main.c
Copyright **** Nintendo. All rights reserved.
These coded instructions, statements, and computer programs contain
proprietary information of Nintendo of America Inc. and/or Nintendo
Company Ltd., and are protected by Federal copyright law. They may
not be disclosed to third parties or copied or duplicated in any form,
in whole or in part, without the prior written consent of Nintendo.
$Date:: $
$Rev:$
$Author:$
*---------------------------------------------------------------------------*/
#ifndef __DISP_INFO_ADDRESS_H__
#define __DISP_INFO_ADDRESS_H__
#include <twl.h>
#define DISPINFO_SHARED_SCFG_REG_ADDR (void*)0x02fff000
#define DISPINFO_SHARED_SCFG_REG_SIZE 0x26U
#define DISPINFO_SHARED_SCFG_WRAM_ADDR (void*)0x02fff030
#define DISPINFO_SHARED_SCFG_WRAM_SIZE 0x06U
#endif