ランチャー用コンポーネントにコメント追加。

testにjackalコンポーネント負荷確認用のyuv2rgbの追加。

git-svn-id: file:///Users/lillianskinner/Downloads/platinum/twl/TwlIPL/trunk@1901 b08762b0-b915-fc4b-9d8c-17b2551a87ff
This commit is contained in:
yosiokat 2008-07-15 08:47:39 +00:00
parent fa82aa1ce4
commit b27288eaa7
24 changed files with 16951 additions and 0 deletions

View File

@ -223,3 +223,5 @@ Ltdautoload LTDMAIN
Library $(ISDBG_LIBS_TWL)
Library $(ISDBG_LIBS_NITRO)
}
# BootROMの鍵データが0x0380c400にあるので、hyenaのWRAM配置の上限はその値になることに注意。

View File

@ -181,3 +181,5 @@ Ltdautoload LTDMAIN
Library $(ISDBG_LIBS_TWL)
Library $(ISDBG_LIBS_NITRO)
}
# BootROMの鍵データが0x0380c400にあるので、hyenaのWRAM配置の上限はその値になることに注意。

View File

@ -93,3 +93,5 @@ Ltdautoload SCRWRAM
Object * (.main)
Object * (.ltdmain)
}
# BootROMの鍵データが0x0380c400にあるので、jackalのWRAM配置の上限はその値になることに注意。

View File

@ -0,0 +1,121 @@
#! make -f
#---------------------------------------------------------------------------
# Project: TwlSDK - YUV2RGB
# 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:$
#---------------------------------------------------------------------------
ifdef TWL_IPL_RED_ROOT
#コンポーネントを切り替えます。
#コメントアウトするとracoonを、有効化するとjackalを使います。
#下の行を変更したらmake cleanしてください。
TWL_IPL_USE_RED_IPL := TRUE
endif
ifdef TWL_IPL_USE_RED_IPL
TARGET_FIRM = SYSTEMMENU
REBOOT_LIB = libreboot$(TWL_LIBSUFFIX).a
LDEPENDS_NEF += $(REBOOT_LIB)
ADDRESS_DTCM = 0x0e000000
DEFAULT_COMP_ARM7 = jackal
MAKEROM_FLAGS += -F
LCFILE_SPEC = $(SYSMENU_ROOT)/build/systemMenu_RED/Launcher/ARM9/ARM9-TS.lsf
LCFILE_TEMPLATE = $(SYSMENU_ROOT)/build/systemMenu_RED/Launcher/ARM9/ARM9-TS.lcf.template
MACRO_FLAGS += -DTWL_IPL_USE_RED_IPL
MAKELCF_FLAGS += -DREBOOT_LIB='$(REBOOT_LIB)'
endif
TARGET_PLATFORM := TWL
TWL_PROC := ARM9
TWL_ARCHGEN := LIMITED
TARGET_BIN = main.srl
ROM_SPEC_TEMPLATE = yuv2rgb.rsf.template
ROM_SPEC = yuv2rgb.autogen.rsf
SRCS = snd_data.c mainy.cpp new.cpp cpu_yuv2rgb.c menuIrqHandler.c menuCameraManager.cpp #dsp_yuv2rgb.c
DATA_DIR = ./data
EXT_OBJS += $(patsubst $(DATA_DIR)/%.dat,$(OBJDIR)/%.o,$(wildcard $(DATA_DIR)/*.dat))
# DSPファームウェアを定数として静的リンクする。
#DSP_FIRMWARE_DIR = $(ROOT)/build/dspcomponents/build/tests/yuv2rgb/bin
#DATA_DIR = .
#EXT_OBJS += $(patsubst $(DSP_FIRMWARE_DIR)/%.a,$(OBJDIR)/%.o,$(wildcard $(DSP_FIRMWARE_DIR)/*.a))
MACRO_FLAGS += -DTWL_IPL_MENU_CAMERA_MANAGER_FOR_LOCAL_PROJECT
#----------------------------------------------------------------------------
ifdef TWL_IPL_USE_RED_IPL
include $(TWL_IPL_RED_ROOT)/build/buildtools/commondefs
include $(TWLSDK_ROOT)/build/libraries/reboot/commondefs.reboot
MAKEROM := $(TWL_IPL_RED_ROOT)/tools/bin/makerom.TWL.launcher.exe
else
include $(TWLSDK_ROOT)/build/buildtools/commondefs
endif
include $(TWLSDK_ROOT)/build/buildtools/commondefs.gx.demolib
LLIBRARIES += libcpu_jpegEncoder$(TWL_LIBSUFFIX).a
#----------------------------------------------------------------------------
#do-build: $(ROM_SPEC) prepare $(TARGETS)
do-build: $(ROM_SPEC) $(TARGETS)
#SUBDIRS = ../../../dspcomponents/build/tests/yuv2rgb
include $(TWLSDK_ROOT)/build/buildtools/modulerules
# UIGランチャーのソースをそのままコピーします。
.PHONY: prepare
prepare:
cp -p $(TWL_IPL_ROOT)/menu/scene/src/menuCameraManager.cpp src
cp -p $(TWL_IPL_ROOT)/menu/scene/include/menuCameraManager.h include
ifdef TWL_IPL_USE_RED_IPL
# for $(SYSMENU_LIBS)
include redipl_defs_autogen_by_uig
LLIBRARIES += $(SYSMENU_LIBS)
$(ROM_SPEC): $(ROM_SPEC_TEMPLATE) Makefile
grep -v MAKEROM_WRAM_MAPPING $(ROM_SPEC_TEMPLATE) | grep -v NTRJ | grep -v User > $(ROM_SPEC)
else
$(ROM_SPEC): $(ROM_SPEC_TEMPLATE) Makefile
grep -v WramMappingDirect $(ROM_SPEC_TEMPLATE) | grep -v HNAJ | grep -v Secure | grep -v System | grep -v HwAESSlot > $(ROM_SPEC)
endif
LDIRT_CLEAN += $(ROM_SPEC)
#----------------------------------------------------------------------------
$(OBJDIR)/%.o : $(DATA_DIR)/%.dat
$(BIN2OBJ) --compatible $< $@ >/dev/null
$(DATA_DIR)/%.dat : $(call eupath,$(DSP_FIRMWARE_DIR)/%.a)
cp -T $< $@
ZIPDIR=$(notdir $(shell pwd))
ZIPFILE=$(HOME)/$(ZIPDIR)-$(shell date +%y%m%d_%H%M).zip
.PHONY: zip
zip:
@cd .. && find $(ZIPDIR) ! -type d | grep -v -e \~ -e .tmp -e .svn -e .obj -e /bin/ -e /depend/ -e /obj/ | zip $(ZIPFILE) -@
@ls -l $(ZIPFILE)
#===== End of Makefile =====

Binary file not shown.

Binary file not shown.

Binary file not shown.

View File

@ -0,0 +1,36 @@
#define cScreenWidth 256
#define cScreenHeight 192
#define cPhotoWidth 640
#define cPhotoHeight 480
// #define cThreadPriority_LauncherCameraHi (OS_THREAD_LAUNCHER_PRIORITY - 1)
// #define cThreadPriority_LauncherCameraLo (OS_THREAD_LAUNCHER_PRIORITY + 1)
// #define cThreadPriority_LauncherCameraShot (OS_THREAD_LAUNCHER_PRIORITY + 2)
#define IPL_ASSERT(exp) if ( !( exp ) ) IPL_HALT( #exp )
#define IPL_PRINT OS_TPrintf
#define IPL_HALT OS_TPanic
namespace menu { namespace sys {
class Object
{
public:
// // スレッド優先順位。
// enum
// {
// cThreadPriority_LauncherCameraHi = OS_THREAD_LAUNCHER_PRIORITY - 1,
// cThreadPriority_LauncherCameraLo = OS_THREAD_LAUNCHER_PRIORITY + 1,
// cThreadPriority_LauncherCameraShot = OS_THREAD_LAUNCHER_PRIORITY + 2,
// cThreadPriority_UpPicture = OS_THREAD_LAUNCHER_PRIORITY + 3
// };
// 作り直し版 スレッド優先度。
enum
{
// 優先度は検討が必要。
cThreadPriority_CameraI2c = OS_THREAD_LAUNCHER_PRIORITY - 2,
cThreadPriority_CameraLowerHi = OS_THREAD_LAUNCHER_PRIORITY - 1,
cThreadPriority_CameraLowerLo = OS_THREAD_LAUNCHER_PRIORITY + 10
};
};
}}

View File

@ -0,0 +1,381 @@
// 落ち着いたらcmnCameraManager.hへ持っていく。
#ifndef MENU_CAMERA_MANAGER_H_
#define MENU_CAMERA_MANAGER_H_
//#define TWL_IPL_MENU_CAMERA_MANAGER_USE_DSP
#ifdef TWL_IPL_MENU_CAMERA_MANAGER_FOR_LOCAL_PROJECT
#else
// まだDSP版JPEGライブラリを使う。
//#define TWL_IPL_MENU_CAMERA_MANAGER_USE_DSP
#endif
#ifdef TWL_IPL_MENU_CAMERA_MANAGER_FOR_LOCAL_PROJECT
#include "const.h"
#endif
namespace cmn { namespace sys { namespace cmr2
{
// eMode_Texのみ対応。
// カメラモード
enum
{
eMode_BG = 0 ,
eMode_Tex ,
eMode_BGSingle ,
eMode_Max
};
// 定数
enum
{
cDefaultShowWidth = cScreenWidth ,
cDefaultShowHeight = cScreenHeight ,
cDefaultShotWidth = cPhotoWidth ,
cDefaultShotHeight = cPhotoHeight ,
cEncodeResultSizeMax = cPhotoWidth * cPhotoHeight,
cEncodeQuality = 90,
cEncodeSampling = 2,
cBufferCount = 2 ,
cCaptureRetryMax = 20,
cDefaultDmaNo = 1
};
enum
{
cMsgI2c_Destroy = 0,
cMsgI2c_AfterInit,
cMsgI2c_Activate,
// cMsgI2c_ChangeSizeToShot,
// cMsgI2c_ChangeSizeToShow,
cMsgI2c_ChangeLedToOn,
cMsgI2c_ChangeLedToBlink,
cMsgI2c_Max
};
enum
{
// CAMERASelectはビットマスクなので注意。
cCameraIndex_In = 0,
cCameraIndex_Out,
cCameraMax
};
enum
{
// 通常時でも、起動直後に3回出る。
// CAMERA_RESULT_BUSY type 0 retry 0
// CAMERA_RESULT_BUSY type 0 retry 1
// CAMERA_RESULT_BUSY type 0 retry 2
cI2cRetryMax = 30,
cI2cRetryIntervalMsec = 100
};
enum
{
cI2cCommon_Activate = 0,
cI2cCommon_FrameRate,
cI2cCommon_ContextSwitch,
cI2cCommon_LedOn,
cI2cCommon_LedBlink,
cI2cCommon_Max
};
struct dtcmWork {
u32 mShrinkBuf[208*3]; // max(256*2,208*3) * sizeof(u32)
u64 mYuvBuf[12];
};
typedef struct {
CAMERAContext mContext;
CAMERAFrameRate mFrameRate;
} cameraState;
class Manager
{
public:
// サイズはinit()で指定する。
Manager();
~Manager();
void preInit( u32 show_w, u32 show_h, u32 shot_w, u32 shot_h );
void preInit() {
preInit( mShowWdt, mShowHgt, mShotWdt, mShotHgt );
}
void init(
#ifdef TWL_IPL_MENU_CAMERA_MANAGER_FOR_LOCAL_PROJECT
// no Heap
#else
sys::Heap* p_heap ,
#endif
int mode , CAMERASelect sel_cmr , int vram1 , int vram2 ,
cmn::sys::cmr2::dtcmWork* pDtcmWork ,
void (*gx_user_proc)(u8* vramAddr, BOOL shot) ,
u32 show_w, u32 show_h, u32 shot_w, u32 shot_h );
void init(
#ifdef TWL_IPL_MENU_CAMERA_MANAGER_FOR_LOCAL_PROJECT
// no Heap
#else
sys::Heap* p_heap ,
#endif
int mode , CAMERASelect sel_cmr , int vram1 , int vram2 ,
cmn::sys::cmr2::dtcmWork* pDtcmWork ,
void (*gx_user_proc)(u8* vramAddr, BOOL shot) ) {
init(
#ifdef TWL_IPL_MENU_CAMERA_MANAGER_FOR_LOCAL_PROJECT
// no Heap
#else
p_heap ,
#endif
mode, sel_cmr, vram1, vram2,
pDtcmWork, gx_user_proc,
mShowWdt, mShowHgt, mShotWdt, mShotHgt );
}
BOOL tryDestroy();
void activate();
void changeCamera( CAMERASelect sel_cmr ) { mNextCmr = sel_cmr; }
void changeCamera()
{
changeCamera( mNextCmr == CAMERA_SELECT_IN ? CAMERA_SELECT_OUT : CAMERA_SELECT_IN );
}
// 「内(外)カメラに切り替えました」旨のメッセージを表示する場合、
// 厳密に今の瞬間のカメラではなく、
// 最終的にどちらのカメラが有効になるかを返せば良いと思うので
// mNextCmrを返す。
CAMERASelect getCurrentCamera() const { return mNextCmr; }
// でも、切り替えにタイムラグがあるので、切り替え中かどうかを
// 知る方法も用意する。
// mCaptureSkipCountは、他の要因(例えばカメラ解像度切り替え中)でも
// 0でなくなる。その場合にこの関数が一瞬0でなくなるが、
// IN/OUT切り替え中の判定のために呼び出す限りは問題ないはず。
BOOL isCameraChanging() { return ((mSelCmr != mNextCmr) || mCaptureSkipCount); }
void startCapture(CAMERASelect sel_cmr);
void startCapture() {
startCapture(mNextCmr);
}
void stopCapture() { mNextCaptureFlag = FALSE; }
BOOL isCaptureBusy() { return (mCaptureFlag || mNextCaptureFlag); }
BOOL isSaveBusy() { return mEncodeBusyFlag; }
BOOL shoot(BOOL keepCapture = FALSE);
BOOL tryPrepareToSleep();
// void setShutterSnd( const u8* p_wav , u32 size , BOOL stereo );
// #ifdef TWL_IPL_MENU_CAMERA_MANAGER_USE_DSP
// void startShutterSnd();
// void finishShutterSnd();
// BOOL isFinishedShutterSnd() const;
// #endif
virtual void procVBlankIntr();
virtual void procCameraIntr();
virtual u16* procPreCapture();
virtual void procPostCapture();
virtual void procPostConvert(BOOL shot);
virtual void procPostShot();
virtual u16* allocCapBuf();
virtual void freeCapBufByPtr(const u16* pBuf);
BOOL isShotDone() { return mShotDone; }
void clearShotDone() { mShotDone = FALSE; }
void setTexSwap() { mTexSwap = TRUE; }
// int getTexBank() { return mTexBank; }
void setOneShotFlag(BOOL flag) { mOneShotFlag = (u8)flag; }
BOOL getOneShotFlag() { return mOneShotFlag; }
virtual BOOL convert(BOOL shot);
void setCaptureRgbFlag(BOOL useRgb);
BOOL isFirstPictureReady() { return mFirstPictureReady; }
#ifndef TWL_IPL_FINAL
public:
vu32 mDebugPort;
#endif
private:
#ifdef TWL_IPL_MENU_CAMERA_MANAGER_FOR_LOCAL_PROJECT
// no Heap
#else
sys::Heap* mpHeap;
#endif
u8 mLedKeepFlag;
u8 mOneShotFlag;
u8 mCaptureRgbFlag;
vu8 mEncodeBusyFlag;
vu8 mPreInitFlag;
vu8 mInitFlag;
vu8 mPreInitBusyFlag;
vu8 mInitBusyFlag;
u32 mEncodeOption;
static vu8 mCaptureFlag;
static vu8 mNextCaptureFlag;
static vu8 mShotFlag;
static vu8 mNextShotFlag;
vu8 mShotDone;
vu8 mTexSwap;
vu8 mI2cBusy;
#if SDK_VERSION_DATE < 20080630
vu8 mIntrPositiveEdge;
#else
// intr edgeはCAMERAライブラリがハンドリングする。
#endif
vu8 mFirstPictureReady;
vu32 mShotErr;
u32 mCaptureSkipCount;
u32 mCaptureRetryCount;
u8 mIsCapBufUsed[2];
u16* mpCapBuf[2];
vu16* mpCaptureBuf;
vu16* mpConvBuf;
vu16* mpNextConvBuf;
vu16* mpShotBuf;
dtcmWork* mpDtcmWork;
volatile int mTexBank;
volatile int mNextTexBank;
#ifdef TWL_IPL_MENU_CAMERA_MANAGER_USE_DSP
struct encodeWork {
u16 y[cPhotoWidth * cPhotoHeight];
u16 cbcr[(cPhotoWidth * cPhotoHeight / 4) * 2];
} *mpEncodeWork;
#else
u8* mpEncodeWork;
#endif
#ifdef TWL_IPL_MENU_CAMERA_MANAGER_FOR_LOCAL_PROJECT
u8* mpEncodeResult;
#endif
int mTarget;
u32 mShowWdt;
u32 mShowHgt;
u32 mShotWdt;
u32 mShotHgt;
int mShowTransferLines;
int mShotTransferLines;
int mMode;
u32 mGxDma;
int mVramType[ 2 ];
u8* mVramAddr[ 2 ];
#ifdef TWL_IPL_MENU_CAMERA_MANAGER_USE_DSP
const u8* mpShutterSnd;
u32 mShutterSndSize;
BOOL mShutterStereo;
#endif
MINDmaConfig mDmaConfig;
// 手元の実験ではmpTaskが使えないので…
OSThread mLowerThread;
OSThread mI2cThread;
u64 mLowerThreadStack[2048]; // JPEGを使うので、念のため16KBで。
u64 mI2cThreadStack[1024];
OSMessage mI2cMsgBuf[1];
OSMessageQueue mI2cMsgQueue;
enum {
cEventMaskLower_Destroy = 1 << 0,
cEventMaskLower_EnableIntrAndPrepareBuffer = 1 << 1,
cEventMaskLower_DisableIntrAndDestroyBuffer = 1 << 2,
cEventMaskLower_Convert = 1 << 3,
cEventMaskLower_Shot = 1 << 4,
cEventMaskLower_NextConvertAndShot = 1 << 5,
cEventMaskLower_Activate = 1 << 6,
cEventMaskLower_All = 0xffffffff
};
OSEvent mLowerEvent;
void procLower();
void procI2c();
static void procLower_(void* p_arg) {
reinterpret_cast<Manager*>(p_arg)->procLower();
}
static void procI2c_(void* p_arg) {
reinterpret_cast<Manager*>(p_arg)->procI2c();
}
static OSMessage mI2cAsyncMsgBuf[1];
static OSMessageQueue mI2cAsyncMsgQueue;
CAMERAResult i2cCommon(u32 type, CAMERASelect sel_cmr);
CAMERAResult i2cSetupOthers();
CAMERAResult i2cActivate(CAMERASelect sel_cmr);
CAMERAResult i2cFrameRate(CAMERASelect sel_cmr);
CAMERAResult i2cContextSwitch(CAMERASelect sel_cmr);
CAMERAResult i2cLed(BOOL isBlink);
static void i2cCommonAsyncCallback(CAMERAResult result, void *arg);
static void i2cActivateCallback(CAMERAResult result, void *arg);
static void i2cFrameRateCallback(CAMERAResult result, void *arg);
static void i2cContextSwitchCallback(CAMERAResult result, void *arg);
static void i2cLedCallback(CAMERAResult result, void *arg);
CAMERASelect indexToCameraSelect(u32 i) { return (CAMERASelect)(CAMERA_SELECT_IN << i); }
static BOOL isOutCamera(CAMERASelect sel_cmr) { return (sel_cmr == CAMERA_SELECT_OUT); }
static vu8 mCurLedBlink;
static volatile CAMERASelect mSelCmr;
static volatile CAMERASelect mNextCmr;
static volatile cameraState mCmrCurState[cCameraMax];
static volatile cameraState mCmrNextState[cCameraMax];
void prepareBuffer();
void destroyBuffer();
void useNextConvBuf();
void encodeAndSave();
void setInterrupt(BOOL enable);
void (*mpGxUserProc)(u8* vramAddr, BOOL shot);
BOOL writeJpegToSD(const u8* src, u32 size);
#ifdef TWL_IPL_MENU_CAMERA_MANAGER_FOR_LOCAL_PROJECT
#else
BOOL writeJpegToNand(const u8* src, u32 size);
#endif
// if non-static, CW claims:
// Error: 'pDtcm' could not be assigned to a register
// Error: internal compiler error (report to ...)
// while executing in file 'PCodeAssembly.c' line: 468
static void Shrink640Yuv422To208Rgb555( const void* src, void* dst, u32 height, void* pDtcm );
static void Shrink640Yuv422To256Rgb555( const void* src, void* dst, u32 height, void* pDtcm );
static void Convert8bitYuv422To16bitYuv420( const u32* src, u16* pYCbCrBuf, u32 width, u32 height, void* pDtcm_ );
};
}}}
#endif

View File

@ -0,0 +1,45 @@
/*---------------------------------------------------------------------------*
Project: NitroSDK - OS - demos - cplusplus-1
File: new.h
Copyright 2003-2007 Nintendo. All rights reserved.
These coded instructions, statements, and computer programs contain
proprietary information of Nintendo of America Inc. and/or Nintendo
Company Ltd., and are protected by Federal copyright law. They may
not be disclosed to third parties or copied or duplicated in any form,
in whole or in part, without the prior written consent of Nintendo.
$Log: new.h,v $
Revision 1.6 2007/02/20 00:28:10 kitase_hirotake
indent source
Revision 1.5 2006/01/18 02:11:30 kitase_hirotake
do-indent
Revision 1.4 2005/02/28 05:26:27 yosizaki
do-indent.
Revision 1.3 2004/03/08 08:55:47 yada
fix top comment
Revision 1.2 2004/02/20 00:04:05 yasu
add comments
Revision 1.1 2004/02/18 04:19:30 yada
C++ƒ
$NoKeywords: $
*---------------------------------------------------------------------------*/
#ifndef MY_NEW_H_
#define MY_NEW_H_
void *operator new(std::size_t blocksize);
void *operator new[] (std::size_t blocksize);
void operator delete(void *block) throw();
void operator delete[] (void *block)throw();
/* MY_NEW_H_ */
#endif

View File

@ -0,0 +1,35 @@
/*---------------------------------------------------------------------------*
Project: TwlSDK - demos.TWL - snd - extraFunc
File: snd_data.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 SND_DATA_H_
#define SND_DATA_H_
#ifdef __cplusplus
extern "C" {
#endif
/*---------------------------------------------------------------------------*/
#include <twl/types.h>
extern const u8 sound_seq_data[];
extern const u8 sound_bank_data[];
extern const u8 sound_wave_data[];
/*---------------------------------------------------------------------------*/
#ifdef __cplusplus
} // extern "C"
#endif
#endif // SND_DATA_H_

View File

@ -0,0 +1,85 @@
/*---------------------------------------------------------------------------*
Project: TwlSDK - YUV2RGB
File: cpu_yuv2rgb.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 YUV2RGB_H_
#define YUV2RGB_H_
#include <twl.h>
#ifdef __cplusplus
extern "C" {
#endif
#define DSP_DMA_NOT_USE 0xFFFFFFFFUL
/*---------------------------------------------------------------------------*
*---------------------------------------------------------------------------*/
typedef struct YUYV
{
u8 y1;
u8 u;
u8 y2;
u8 v;
} YUYV;
typedef struct RGBX16
{
u16 r:5;
u16 g:5;
u16 b:5;
u16 x:1;
} RGBX16;
typedef void (*YUV2RGBCallback)(void);
typedef enum _MessageYuv2Rgb
{
MESSAGE_YUV2RGB_CONVERT = 1
} MessageYuv2Rgb;
/*---------------------------------------------------------------------------*
Name: DSP_Yuv2RgbInit
Description:
Arguments: ***
Returns: None
*---------------------------------------------------------------------------*/
BOOL DSP_Yuv2RgbInit(u32 dmaNo);
/*---------------------------------------------------------------------------*
Name: DSP_Yuv2RgbConvertAsync
Description: YUV->RGB変換を行います
Arguments: ***
Returns: None
*---------------------------------------------------------------------------*/
BOOL DSP_Yuv2RgbConvertAsync(void* src, void* dest, u32 size, YUV2RGBCallback callback);
// CPU版
u32 CpuYuv2Rgb( const void* src, void* dest, u32 pixels );
#ifdef __cplusplus
} /* extern "C" */
#endif
/* YUV2RGB_H_ */
#endif

View File

@ -0,0 +1,227 @@
このパッケージについて
======================
ARM7コンポーネントを、racoonからjackalにすると、カメラ動作時の
ARM9の処理落ちが多くなることを調べるためのサンプルです。
コンポーネントの切り替えは、Makefileの
ifdef TWL_IPL_RED_ROOT
#コンポーネントを切り替えます。
#コメントアウトするとracoonを、有効化するとjackalを使います。
#下の行を変更したらmake cleanしてください。
TWL_IPL_USE_RED_IPL := TRUE
endif
上記の行をコメントアウトするか有効化するかで行ってください。
変更したらmake cleanしてください。
処理落ちが発生すると、デバッグ出力に
mConvBusy! 0, nextp empty
mConvBusy! 1, nextp empty
:
と表示されます。数字は回数です。この頻度が、racoonとjackalで異な
ります。
画面上部の '*' の動きのスムーズさや、カメラに向かって手を振ったり
すると、カクカクすることでも処理落ちにお気づき頂けると思います。
以上です。
以下は、このパッケージに含まれる関数をSDKのDSP JPEGライブラリに追
加して頂くために提供したときに作成したドキュメントです。
↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓
======================================================================
このパッケージについて
======================
UIGランチャーのカメラ撮影部分(カメラマネージャ)の実装のため、いろ
いろ実験するためのパッケージです。直接カメラやJPEGには関係しない
ファイルが含まれていますがご了承ください。
src/menuCameraManager.cppは、基本的に現状のUIGランチャーと同じも
のです。ここでの実験の成果をUIGランチャーへ反映しています。
YUV422->YUV420変換関数以外は、未完成の部分もあり、雑に作っている
部分もありますので、公開なさらないようにお願いします。
SDカードアクセス部は、UIGランチャー正式仕様ではありません。ただし
現状のUIGランチャーにもこのまま使われています。シャッター音もまだ
鳴りません。
実行方法は、普通にmakeしてmain.tlfをロードして頂くと、上画面にア
ウトカメラの画像が出ます。Aボタンでシャッターを切ります。SDカード
が入っていれば/menu/menu####.jpgを連番で生成します。(SDKのデモを
そのまま頂いています)
YUV422->YUV420変換関数の使用方法
================================
menuCameraManager.cppのConvert8bitYuv422To16bitYuv420()で、
YUV422->YUV420変換を行います。この関数を呼び出している同ファイル
の1074行目から1102行目あたり
frame_y = mpTestEncodeWork->y;
frame_cb = mpTestEncodeWork->cbcr;
frame_cr = frame_cb + (mShotWdt * mShotHgt / 4);
tick = OS_GetTick();
Convert8bitYuv422To16bitYuv420(reinterpret_cast<const u32*>(pBuf),
frame_y,
mShotWdt,
mShotHgt,
mpDtcmWork->mYuvBuf);
// store YUV420 and invalidate encode result
// DC_StoreAll(), DC_FlushAll() is NG?
DC_FlushAll();
IPL_PRINT("procShot: yuv422to420 time %d usec\n", (u32)OS_TicksToMicroSeconds(OS_GetTick() - tick));
tick = OS_GetTick();
// 出力サイズはいかほど必要?
DSP_SetJpegEncoderBuffer(mpTestEncodeWork->result, sizeof(mpTestEncodeWork->result));
// explicit initialization
DSP_SetJpegEncoderThumbnailBuffer(NULL, NULL, NULL);
DSP_SetJpegEncoderAllocator( dspAlloc_, dspFree_ );
u32 size = DSP_StartJpegEncoder( static_cast< s16 > ( mShotWdt ) ,
static_cast< s16 > ( mShotHgt ) ,
DSP_JPEG_THUMBNAIL ,
4 );
// need here too ? sometimes picture breaks...
// DC_StoreAll(), DC_FlushAll() is NG?
DC_InvalidateRange(mpTestEncodeWork->result, size);
について説明します。
- 1078行目の変換関数の引数pBufは、カメラがVGA、YUV422でキャプチャ
した結果を指しています。このバッファは、直前にprocConvert()を通っ
てきており、917行目の
DC_FlushAll();
で、データキャッシュのInvalidateが済んでいます。
変換元データはワード(4バイト)リードされるため、
reinterpret_cast<const u32*>しています。
- 引数frame_yは、SDKのJPEGエンコーダのグローバル変数です。今は11
行目から直接
extern "C" {
// build/libraries/dsp/ARM9.TWL/src/dsp_jpeg_enc.c
extern u16 *frame_y;
extern u16 *frame_cb;
extern u16 *frame_cr;
} /* extern "C" */
で参照していますが、SDKのグローバル変数名としては適切ではないため、
変数名を整えてSet関数を追加して頂いた方が良いと思います。
- SDKのJPEGエンコーダには、frame_cbとframe_crも与える必要がありま
す。frame_cbとframe_crを与えているのは1074行目からの
frame_y = mpTestEncodeWork->y;
frame_cb = mpTestEncodeWork->cbcr;
frame_cr = frame_cb + (mShotWdt * mShotHgt / 4);
になります。
変換関数は、frame_yに隙間無く続けてframe_cb、frame_crを出力します
ので、変換関数の引数はframe_yだけです。
- mShotWdtは640、mShotHgtは480です。
- mpDtcmWork->mYuvBufで、処理高速化用のDTCMワークを与えています。
menuCameraManager.hの43行目にある、12ダブルワード(96バイト)
u64 mYuvBuf[12];
の領域が必要です。strd命令を使用しているので8バイトアラインメント
してください。(その上のmShrinkBufは、縮小用なので変換関数には関係
ありません)
DTCMを使うことについては、SDKとして公開する場合に検討が必要だと思
います。メインメモリやVRAMを割り当てても動作するはずですが、試し
ていません。staticなDTCMワークでなくても、メインスレッドのスタッ
クフレームなら通常はDTCMになるはずですが、そういうことを意識させ
ると敷居が高くなります。
- 変換後の1085行目
DC_FlushAll();
は、JPEGエンコード時に画像が崩れる症状に悩まされ、念のためデータ
キャッシュの内容を実メモリへ吐き出しました。画像が崩れなくなれば、
不要かもしれません。
- 1094行目の
DSP_SetJpegEncoderAllocator( dspAlloc_, dspFree_ );
で指定しているアロケータですが、実体はmainy.cppの1667行目にありま
す。
dspAlloc_()は、実は何もしていません。何もしていないどころか、呼ば
れたらアサートで停止させます。
dspFree_()は、SDKから呼ばれてしまうので、停止はしませんがダミー関
数にしてあります。
このアロケータの使われ方(SDKのdsp_jpeg_enc.c)については、いろいろ
思うところはあるのですが、簡単に言うと
a. 最大で何バイト必要になるのか、できればコンパイル時に知りたいが
その方法が提供されていない
b. pTmp2を最初に確保しているため、pYbuf、pCBbuf、pCRbufを確保した
後に
DSPFree(pTmp2);
するのはフラグメントを生じる可能性がある
c. extra_bytesに関する処理や
Yuv_image_size=(u32)(image_width+32)*(image_height+32);
の+32が意図不明
というところで不安になったのが、私が変換関数を自作したもう一つの
理由です。
- JPEGエンコード後の1102行目
DC_InvalidateRange(mpTestEncodeWork->result, size);
も、JPEGエンコード時の画像崩れ対策テストです。
もしかして、SDへ書き込むFSライブラリに問題があるかもと思い、FSラ
イブラリ用にデータキャッシュをInvalidateしたものです。崩れなくな
れば、これも不要になるでしょう。
YUV422->YUV420変換関数の補足説明
================================
- 793行目から821行目まで、
#if 0
// even line U
:
#else
// even column ave. uv (V0 U0)
:
#endif
ですが、これはYUV422->YUV420に伴って失われるU、V成分を2ラインの
平均値とするか、Wikipediaを鵜呑みした
| YUV420 : 2×2ピクセルのうち、青の色差信号を最初のラインから取り、
| 赤の色差信号を次のラインからとる方式。輝度信号は1ピクセルごとにと
| る。
の方式にするかを試したものです。平均値にした方がノイズが低減され
ているように感じたため、今の#if 0としてあります。#if 1にするとシ
ャープな感じになります。
しかし、そもそもY成分はそのままでU、Vだけ平均化したらおかしい絵に
ならないのか、とはいえ上のラインのVを下のラインから持ってくるのも
おかしな話では?という思いはあります。
JPEGエンコーダの入力データ仕様を詳しく調べていないので、どちらが
良いのか分かっていません。
- 変換関数の引数の制限について、714行目からのコメントを補足します。
// pYCbCrBufも最低4バイトアラインメントですが、各デバイスとの連携に
// 備えて32バイトアラインメントしてください。
↑これは、変換結果がDSPの入力データになるので、32バイトアラインメ
ントしておけばキャッシュまわりの心配が減るからです。

View File

@ -0,0 +1,14 @@
SYSMENU_LIBS = \
liblcfg$(TWL_LIBSUFFIX).a \
libsysmenu$(TWL_LIBSUFFIX).a \
libsysmmcu$(TWL_LIBSUFFIX).a \
libsysmutil$(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

View File

@ -0,0 +1,103 @@
// 中身をいじってある。
/*---------------------------------------------------------------------------*
Project: TwlSDK - YUV2RGB
File: cpu_yuv2rgb.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 "yuv2rgb.h"
/*---------------------------------------------------------------------------*
*---------------------------------------------------------------------------*/
/*---------------------------------------------------------------------------*
*---------------------------------------------------------------------------*/
u32 yuv2rgb16( const void* src, void* dest, u32 pixels );
/*---------------------------------------------------------------------------*
*---------------------------------------------------------------------------*/
static inline int r_diff( u8 v )
{
// return (1402 * ( v - 128 )) / 1000;
return (11760828/*.416*/ * ( v - 128)) >> 23;
}
static inline int g_diff( u8 u, u8 v )
{
// return (-344 * ( u - 128 ) -714 * ( v - 128 )) / 1000;
return (-2885681/*.152*/ * ( u - 128 ) -5989466/*.112*/ * ( v - 128 )) >> 23;
}
static inline int b_diff( u8 u )
{
// return (1772 * ( u - 128 )) / 1000;
return (14864613/*.376*/ * ( u - 128 )) >> 23;
}
static inline int trim( int e )
{
return e < 0 ? 0 : ( e > 255 ? 255 : e);
}
/*---------------------------------------------------------------------------*
Name: CpuYuv2Rgb
Description: YUV->RGB変換を行います(CPUバージョン
Arguments: src : input data adress (YUV)
dest : output data adress (RGB)
pixels : num of pixel
Returns: None
*---------------------------------------------------------------------------*/
u32 CpuYuv2Rgb( const void* src, void* dest, u32 pixels )
{
OSTick begin;
u8* yuyv = (u8*)src;
u32* rgb = (u32*)dest;
u32 limit = pixels >> 1;
u32 i;
begin = OS_GetTick();
for (i = 0; i < limit; i++)
{
u8 y1 = *yuyv++;
u8 u = *yuyv++;
u8 y2 = *yuyv++;
u8 v = *yuyv++;
*rgb++ = (u32)(
0xffffffff
//0x83e083e0 // G only
& (
0x80008000 |
( ( trim( y2 + b_diff( u ) ) & 0xF8 ) << 23) |
( ( trim( y2 + g_diff( u, v ) ) & 0xF8 ) << 18) |
( ( trim( y2 + r_diff( v ) ) & 0xF8 ) << 13) |
( ( trim( y1 + b_diff( u ) ) & 0xF8 ) << 7) |
( ( trim( y1 + g_diff( u, v ) ) & 0xF8 ) << 2) |
( ( trim( y1 + r_diff( v ) ) ) >> 3) ));
}
OS_Printf("total(555) = %d us\n", OS_TicksToMicroSeconds(OS_GetTick() - begin));
return pixels * sizeof(RGBX16);
}

View File

@ -0,0 +1,308 @@
/*---------------------------------------------------------------------------*
Project: TwlSDK - YUV2RGB
File: dsp_yuv2rgb.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 <twl/dsp.h>
#include <twl/dsp/common/pipe.h>
#include "yuv2rgb.h"
/*---------------------------------------------------------------------------*
*---------------------------------------------------------------------------*/
#define THREAD_YUV2RGB_PRIO 10 // メインスレッドより優先
#define STACK_SIZE 1024
#define DSP_BUFFER_SIZE 0x6000 // 24KB
/*---------------------------------------------------------------------------*
*---------------------------------------------------------------------------*/
OSThread threadYUV2RGB; // YUV2RGBスレッド
u64 stack[STACK_SIZE / sizeof(u64)]; // YUV2RGBスレッド用スタック
// メッセージ関連
OSMessage mesgBuffer[10];
OSMessageQueue mesgQueue;
static YUV2RGBCallback sCallback;
static u8* sSrc;
static u8* sDst;
static u32 sSize;
static u32 sDmaNo;
static u8 sBusy;
DSPPipe binout[1];
DSPPipe binin[1];
/*---------------------------------------------------------------------------*
*---------------------------------------------------------------------------*/
BOOL YUV2RGB_Init(void);
static void DSPi_Yuv2RgbThread(void *arg);
static void DSPi_Yuv2RgbLoadProgram();
static void DSPi_Yuv2RgbConvertCore(void);
/*---------------------------------------------------------------------------*
*---------------------------------------------------------------------------*/
/*---------------------------------------------------------------------------*
Name: DSP_Yuv2RgbInit
Description:
Arguments: ***
Returns: None
*---------------------------------------------------------------------------*/
BOOL DSP_Yuv2RgbInit(u32 dmaNo)
{
// DSPファームをロード
DSPi_Yuv2RgbLoadProgram();
// DSPパイプ情報をロードDSP->ARM
(void)DSP_LoadPipe(
binout, // パイプ情報の格納先 (DSP側ではNULLでよい)
DSP_PIPE_BINARY, // パイプのポート番号1
DSP_PIPE_OUTPUT); // DSP_PIPE_INPUT または DSP_PIPE_OUTPUT
(void)DSP_LoadPipe(
binin, // パイプ情報の格納先 (DSP側ではNULLでよい)
DSP_PIPE_BINARY, // パイプのポート番号1
DSP_PIPE_INPUT); // DSP_PIPE_INPUT または DSP_PIPE_OUTPUT
// メッセージキューの初期化
OS_InitMessageQueue(&mesgQueue, &mesgBuffer[0], 10);
// YUV2RGB変換スレッド生成・起動
OS_CreateThread(&threadYUV2RGB, DSPi_Yuv2RgbThread, (void *)0, stack + STACK_SIZE / sizeof(u64), STACK_SIZE, THREAD_YUV2RGB_PRIO);
OS_WakeupThreadDirect(&threadYUV2RGB);
// WRAM-C Slot1 の割り当てを DSP->ARM へ変更
if ( MI_SwitchWramSlot_C( 1, MI_WRAM_SIZE_32KB, MI_WRAM_DSP, MI_WRAM_ARM9 ) != 1 )
{
OS_TPanic("can't allocate WRAM Slot");
}
// 使用するDMA番号を保存
sDmaNo = dmaNo;
return TRUE;
}
/*---------------------------------------------------------------------------*
Name: DSPi_Yuv2RgbLoadProgram
Description: DSPテストプログラムをロード
Arguments: None.
Returns: None.
*---------------------------------------------------------------------------*/
static void DSPi_Yuv2RgbLoadProgram(void)
{
MI_FreeWram_B(MI_WRAM_ARM9);
MI_CancelWram_B(MI_WRAM_ARM9);
MI_FreeWram_C(MI_WRAM_ARM9);
MI_CancelWram_C(MI_WRAM_ARM9);
{
extern const u8 _binary_simple_dat[];
extern const u8 _binary_simple_dat_end[];
if (!DSP_LoadFileAuto(_binary_simple_dat))
{
OS_TPanic("can't allocate WRAM Slot");
}
// 必ずこのタイミングでONしないといけないのかどうかは未確認。
{
static BOOL once = FALSE;
if (!once)
{
DSP_PowerOn();
once = TRUE;
}
}
// DSP_ResetInterface();
DSP_ResetOff();
OS_TPrintf("dsp app run...\n");
DSP_EnableRecvDataInterrupt(0);
DSP_EnableRecvDataInterrupt(1);
DSP_EnableRecvDataInterrupt(2);
}
}
/*---------------------------------------------------------------------------*
Name: DSPi_Yuv2RgbThread
Description: YUV2RGB専用スレッド
Arguments: ***
Returns: None
*---------------------------------------------------------------------------*/
static void DSPi_Yuv2RgbThread(void *arg)
{
#pragma unused( arg )
OSMessage message;
while (1)
{
(void)OS_ReceiveMessage(&mesgQueue, &message, OS_MESSAGE_BLOCK);
switch ((MessageYuv2Rgb)message)
{
case MESSAGE_YUV2RGB_CONVERT:
DSPi_Yuv2RgbConvertCore();
break;
}
}
}
/*---------------------------------------------------------------------------*
Name: DSP_Yuv2RgbConvertAsync
Description: YUV->RGB変換を行います
Arguments: ***
Returns: TRUE
*---------------------------------------------------------------------------*/
BOOL DSP_Yuv2RgbConvertAsync(void* src, void* dest, u32 size, YUV2RGBCallback callback)
{
OSMessage message;
message = (OSMessage)MESSAGE_YUV2RGB_CONVERT;
if (!sBusy)
{
sCallback = callback; // コンバート完了後に呼び出すコールバックを保存
sSrc = src;
sDst = dest;
sSize = size;
return OS_SendMessage(&mesgQueue, message, OS_MESSAGE_NOBLOCK);
}
return FALSE;
}
/*---------------------------------------------------------------------------*
Name: DSPi_Yuv2RgbConvertCore
Description: YUV->RGB変換のためにDSPとのやり取りや
Arguments: ***
Returns: None
*---------------------------------------------------------------------------*/
static void DSPi_Yuv2RgbConvertCore(void)
{
u16 command;
u16 reply;
u32 adress = MI_GetWramMapStart_C() + MI_WRAM_C_SLOT_SIZE; // 暫定的にスロット1固定
OSTick begin, current, tick_copy1, tick_convert, tick_copy2;
u32 offset =0;
// ビジーフラグON
sBusy = TRUE;
tick_copy1=tick_convert=tick_copy2=0;
// 現状DSP側にバッファを24KBしか確保できていないため256x192(96Kbなどの
// 大きいサイズの変換は4回に分けて行っている。
while (sSize > 0)
{
u16 size;
if (sSize > DSP_BUFFER_SIZE) { size = DSP_BUFFER_SIZE; }
else { size = (u16)sSize; }
sSize -= size;
begin = OS_GetTick();
// src -> WRAM-C に書き込む
if (sDmaNo == DSP_DMA_NOT_USE)
{
MI_CpuCopy16(sSrc + offset, (void*)adress, size);
DC_FlushRange((void*)adress, size);
}
else
{
MI_NDmaCopy( 3, sSrc + offset, (void*)adress, size );
}
// WRAM-C Slot1 の割り当てを ARM->DSP へ変更
if ( MI_SwitchWramSlot_C( 1, MI_WRAM_SIZE_32KB, MI_WRAM_ARM9, MI_WRAM_DSP ) != 1 )
{
OS_Printf("====== WRAM Allocation Fail ! =======\n");
}
current = OS_GetTick();
tick_copy1 += (current - begin);
begin = current;
// DSPへコマンド送信
command = (u16)(size>>1); // ピクセル数として渡す
DSP_WritePipe(binout, &command, sizeof(u16));
// DSPからコマンド受信ここでスリープに入り、DSP_HookPipeNotificationで起床
DSP_ReadPipe(binin, &reply, sizeof(u16));
current = OS_GetTick();
tick_convert += (current - begin);
begin = current;
// WRAM-C Slot1 の割り当てを DSP->ARM へ変更
if ( MI_SwitchWramSlot_C( 1, MI_WRAM_SIZE_32KB, MI_WRAM_DSP, MI_WRAM_ARM9 ) != 1 )
{
OS_Printf("====== WRAM Allocation Fail ! =======\n");
}
// WRAM-C -> dst に書き込む
if (sDmaNo == DSP_DMA_NOT_USE)
{
DC_InvalidateRange((void*)adress, size);
MI_CpuCopy16((void*)adress, sDst + offset, size);
}
else
{
MI_NDmaCopy( 3, (void*)adress, sDst + offset, size);
}
current = OS_GetTick();
tick_copy2 += (current - begin);
// オフセット更新
offset += size;
}
OS_Printf("copy to wram = %d us, ", OS_TicksToMicroSeconds(tick_copy1));
OS_Printf("convert = %d us, ", OS_TicksToMicroSeconds(tick_convert));
OS_Printf("from wram = %d us, ", OS_TicksToMicroSeconds(tick_copy2));
OS_Printf("total = %d us\n", OS_TicksToMicroSeconds(tick_copy1+tick_convert+tick_copy2));
// ビジーフラグOFF
sBusy = FALSE;
if (sCallback)
{
sCallback();
}
}

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,169 @@
// This IRQ Handler is for ARM9 only.
#include "menuIrqHandler.h"
// <twl/hw/common/lcd.h> not supplied
#include <nitro/hw/common/lcd.h>
typedef struct MenuIrqHandlerLogControl {
// keep order! {End, Cur, VBlankCount, Top} for ldmia/stmia
MenuIrqHandlerLogBuffer* mpBufferEnd;
MenuIrqHandlerLogBuffer* mpBufferCur;
u32 mVBlankCount;
MenuIrqHandlerLogBuffer* mpBufferTop;
} MenuIrqHandlerLogControl;
extern void MenuIrqHandler( void );
#include <twl/dtcm_begin.h>
#ifndef TWL_IPL_FINAL
static MenuIrqHandlerLogControl MenuIrqHandlerLogCtrl;
#endif
#include <twl/dtcm_end.h>
#include <twl/os/common/interrupt.h>
#include <twl/code32.h>
#include <twl/itcm_begin.h>
#ifndef TWL_IPL_FINAL
// derived from OS_IrqHandler
/*---------------------------------------------------------------------------*
Name: MenuIrqHandler
Description: IRQ handler. call handler according to OS_InterruptTable
Arguments: None
Returns: None
*---------------------------------------------------------------------------*/
asm void MenuIrqHandler( void )
{
stmfd sp!, { lr } // save LR
// get IE address
mov r12, #HW_REG_BASE
add r12, r12, #(REG_IE_OFFSET - 4) // r12: REG_IE address - 4
// get IME
ldrh r0, [ r12, #REG_IME_ADDR - (REG_IE_ADDR - 4) ] // r0: IME
// get IE&IF
ldmib r12!, { r1-r2 } // r1: IE, r2: IF
tst r0, #0x01
andnes r1, r1, r2 // r1: IE & IF
// if (IME==0) || (IE&IF==0) then return (without changing IF)
ldmeqfd sp!, { pc }
//--------------------------------------------------
// IRQ HANDLING CODE for ARCHITECTURE VERSION 5
//--------------------------------------------------
ldr lr, =MenuIrqHandlerLogCtrl
// get lowest 1 bit
rsb r3, r1, #0
and r3, r1, r3
// clear IF
str r3, [ r12 ], #-REG_IF_OFFSET
ldmia lr!, {r0, r1, r2} // mpBufferEnd, mpBufferCur, mVBlankCount
cmp r1, r0
bcs @logSkip // log full or no buffer
@logWrap:
ldrh r0, [r12, #REG_VCOUNT_ADDR - HW_REG_BASE]
add r1, r1, #sizeof(MenuIrqHandlerLogBuffer)
tst r3, #OS_IE_V_BLANK
addne r2, r2, #1
bic r2, r2, #1 << 18 // lower 18bits only
stmdb lr, {r1, r2} // update mpBufferCur, mVBlankCount
orr r2, r2, r0, lsl #23 // mInVLineCount | mInVBlankCount
// get jump vector
ldr r0, =OS_IRQTable + ((OS_IRQ_TABLE_MAX - 1) << 2)
clz r3, r3
ldr r0, [r0, -r3, lsl #2]
orr r2, r2, r3, lsl #18 // mIntr
ldr r3, [r12, #REG_TM0CNT_L_ADDR - HW_REG_BASE]
stmfd sp!, {r1, r2, r3} // mpBufferCur, word0, tick
blx r0
mov r12, #HW_REG_BASE
ldr lr, [r12, #REG_TM0CNT_L_ADDR - HW_REG_BASE]
ldrh r0, [r12, #REG_VCOUNT_ADDR - HW_REG_BASE]
ldmfd sp!, {r1, r2, r3}
subs r12, r0, r2, lsr #23 // mVLineCounts
addmi r12, r12, #HW_LCD_HEIGHT
addmi r12, r12, #HW_LCD_VBLANK
sub r3, lr, r3 // mTicks
orr r3, r12, r3, lsl #16
stmdb r1, {r2, r3} // word0, word1
b OS_IrqHandler_ThreadSwitch
@logSkip:
cmp r1, #0
ldrne r1, [lr] // mpBufferTop
bne @logWrap
// get jump vector
ldr r0, =OS_IRQTable + ((OS_IRQ_TABLE_MAX - 1) << 2)
clz r3, r3
ldr r0, [r0, -r3, lsl #2]
ldr lr, =OS_IrqHandler_ThreadSwitch
bx r0 // set return address for thread rescheduling
}
#endif
#include <twl/itcm_end.h>
#include <twl/codereset.h>
void MenuIrqHandlerStart( MenuIrqHandlerLogBuffer* pBuffer, u32 size )
{
#ifndef TWL_IPL_FINAL
u32 count = size / sizeof(MenuIrqHandlerLogBuffer);
MenuIrqHandlerLogControl* pCtrl = &MenuIrqHandlerLogCtrl;
BOOL enabled = OS_DisableIrq();
*(u32 *)(HW_DTCM + HW_DTCM_SIZE - HW_DTCM_SYSRV_SIZE + HW_DTCM_SYSRV_OFS_INTR_VECTOR)
= (u32)MenuIrqHandler;
if ( pBuffer && count ) {
pCtrl->mpBufferTop =
pCtrl->mpBufferCur = pBuffer;
pCtrl->mpBufferEnd = pBuffer + count;
} else {
pCtrl->mpBufferTop =
pCtrl->mpBufferCur =
pCtrl->mpBufferEnd = NULL;
}
pCtrl->mVBlankCount = 0;
OS_RestoreIrq(enabled);
#else
#pragma unused(pBuffer)
#pragma unused(size)
#endif
}
void MenuIrqHandlerEnd( void )
{
#ifndef TWL_IPL_FINAL
*(u32 *)(HW_DTCM + HW_DTCM_SIZE - HW_DTCM_SYSRV_SIZE + HW_DTCM_SYSRV_OFS_INTR_VECTOR)
= (u32)OS_IrqHandler;
// keep buffer
#endif
}
BOOL MenuIrqHandlerIsUsed( void )
{
#ifndef TWL_IPL_FINAL
return (*(u32 *)(HW_DTCM + HW_DTCM_SIZE - HW_DTCM_SYSRV_SIZE + HW_DTCM_SYSRV_OFS_INTR_VECTOR)
== (u32)MenuIrqHandler);
#else
return FALSE;
#endif
}

View File

@ -0,0 +1,36 @@
#ifndef MENU_IRQ_HANDLER_H_
#define MENU_IRQ_HANDLER_H_
#ifdef __cplusplus
extern "C" {
#endif
#include <twl/types.h>
typedef struct MenuIrqHandlerLogBuffer {
union {
u32 word0;
struct {
u32 mInVLineCount : 9; // d31-d23
u32 mIntr : 5; // d22-d18
u32 mInVBlankCount : 18; // d17-d0
};
};
union {
u32 word1;
struct {
u32 mTicks : 16; // d31-d16
u32 mVLineCounts : 16; // d15-d0
};
};
} MenuIrqHandlerLogBuffer;
extern void MenuIrqHandlerStart( MenuIrqHandlerLogBuffer* pBuffer, u32 size );
extern void MenuIrqHandlerEnd( void );
extern BOOL MenuIrqHandlerIsUsed( void );
#ifdef __cplusplus
} /* extern "C" */
#endif
#endif

View File

@ -0,0 +1,130 @@
/*---------------------------------------------------------------------------*
Project: NitroSDK - OS - demos - cplusplus-1
File: new.cpp
Copyright 2003,2004 Nintendo. All rights reserved.
These coded instructions, statements, and computer programs contain
proprietary information of Nintendo of America Inc. and/or Nintendo
Company Ltd., and are protected by Federal copyright law. They may
not be disclosed to third parties or copied or duplicated in any form,
in whole or in part, without the prior written consent of Nintendo.
$Log: new.cpp,v $
Revision 1.4 2004/04/06 11:35:38 yada
fix header comment
Revision 1.3 2004/02/20 03:32:18 yasu
add comments
Revision 1.2 2004/02/20 00:04:05 yasu
add comments
$NoKeywords: $
*---------------------------------------------------------------------------*/
#include <twl.h>
#ifdef TWL_IPL_USE_RED_IPL
#include <sysmenu.h>
#endif
#define HEAP_ID ((OSHeapHandle)0)
#define ARENA_ID ((OSArenaId)OS_ARENA_MAIN)
#define ROUND(n, a) (((u32) (n) + (a) - 1) & ~((a) - 1))
//----------------------------------------------------------------
//
void* operator new ( std::size_t blocksize )
{
void* p = OS_AllocFromHeap( ARENA_ID, HEAP_ID, blocksize );
if (p) {
// MI_CpuClearFast(p, blocksize);
}
return p;
}
//----------------------------------------------------------------
//
void* operator new[] ( std::size_t blocksize )
{
void* p = OS_AllocFromHeap( ARENA_ID, HEAP_ID, blocksize );
if (p) {
// MI_CpuClearFast(p, blocksize);
}
return p;
}
//----------------------------------------------------------------
//
void operator delete ( void* block ) throw()
{
OS_FreeToHeap( ARENA_ID, HEAP_ID, block );
}
//----------------------------------------------------------------
//
void operator delete[] ( void* block ) throw()
{
OS_FreeToHeap( ARENA_ID, HEAP_ID, block );
}
/*---------------------------------------------------------------------------*
Name: NitroStartUp
Description: startup before NitroMain()
- Initialize memory control system for new()
FYI:
- Startup fuctions called in following order
1) NitroStartUp();
2) Global/Static Constructors
3) NitroMain();
Arguments: None
Returns: None
*---------------------------------------------------------------------------*/
void TwlStartUp(void)
{
void* arenaLo;
void* arenaHi;
#ifdef TWL_IPL_USE_RED_IPL
SYSM_Init(NULL, NULL);
#endif
OS_Init();
OS_InitThread();
GX_Init();
OS_InitTick();
OS_InitAlarm();
TP_Init();
FX_Init();
GX_Init();
RTC_Init();
SNDEX_Init();
OS_EnableIrq();
OS_EnableInterrupts();
FS_Init( FS_DMA_NOT_USE );
MI_InitNDmaConfig();
#ifdef TWL_IPL_USE_RED_IPL
SYSM_SetArena(); // OS_Initの後でコールする必要あり。
SYSM_InitPXI(); // 割り込み許可後にコールする必要あり。
#endif
arenaLo = OS_GetArenaLo( ARENA_ID );
arenaHi = OS_GetArenaHi( ARENA_ID );
// Create a heap
arenaLo = OS_InitAlloc( ARENA_ID, arenaLo, arenaHi, 1 );
OS_SetArenaLo( ARENA_ID, arenaLo );
// Ensure boundaries are 32B aligned
arenaLo = (void*)ROUND( arenaLo, 32 );
arenaHi = (void*)ROUND( arenaHi, 32 );
// The boundaries given to OSCreateHeap should be 32B aligned
(void)OS_SetCurrentHeap( ARENA_ID, OS_CreateHeap( ARENA_ID, arenaLo, arenaHi ) );
// From here on out, OS_Alloc and OS_Free behave like malloc and free respectively
OS_SetArenaLo( ARENA_ID, arenaLo = arenaHi );
}

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,222 @@
#----------------------------------------------------------------------------
# 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 TmpJump: for TWL "ApplicationJump" function
#
#PermitLandingTmpJump $(TWL_IPL_MAKEROM_PERMIT_TMP_JUMP)
###
### 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 $(MAKEROM_WRAM_MAPPING)
WramMappingDirect $(TWL_IPL_RED_ROOT)/build/components/jackal.TWL/wram_regs/wram_regs.rbin
#
# CardRegion: card region [Japan/America/Europe/Australia/China/Korea]
#
CardRegion Japan
#
# Codec mode:
# don't have to edit
#
CodecMode $(MAKEROM_CODEC_MODE)
#
# SCFG: scfg lock [TRUE/FALSE]
#
LockSCFG FALSE
#
# HwAESSlotB: launcher deliver HW AES slot B setting [TRUE/FALSE]
#
HwAESSlotB TRUE
#
# NANDAccess: nand access control [TRUE/FALSE]
#
NANDAccess TRUE
#
# SDCardAccess: sd card access control [TRUE/FALSE]
#
SDCardAccess TRUE
###
#### END
}
AppendProperty
{
#
# Publisher : "Nintendo"
# don't have to edit
Publisher Nintendo
#
# Application type : [USER/SYSTEM]
# don't have to edit
AppType System
AppType User
#
# launch title on the launcher : [TRUE/FALSE]
# don't have to edit
Launch TRUE
#
# Boot allowed Media: [GameCard/NAND]
#
Media GameCard
#
# 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
# use "4NAJ" for hyena
GameCode HNAJ
GameCode NTRJ
#
# Public save data size: [16K/32K/64K/128K/256K/512K/1M/2M/4M/8M]
#
#PublicSaveDataSize 0K
#
# Private save data size: [16K/32K/64K/128K/256K/512K/1M/2M/4M/8M]
#
#PrivateSaveDataSize 0K
#
# Enable SubBannerFile
#SubBannerFile FALSE
}
RomSpec
{
Offset 0x00000000
Segment ALL
HostRoot $(MAKEROM_ROMROOT)
Root /
File $(MAKEROM_ROMFILES)
}