mirror of
https://github.com/rvtr/TwlIPL.git
synced 2025-10-31 06:01:12 -04:00
ランチャー用コンポーネントにコメント追加。
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:
parent
fa82aa1ce4
commit
b27288eaa7
@ -223,3 +223,5 @@ Ltdautoload LTDMAIN
|
||||
Library $(ISDBG_LIBS_TWL)
|
||||
Library $(ISDBG_LIBS_NITRO)
|
||||
}
|
||||
|
||||
# BootROMの鍵データが0x0380c400~にあるので、hyenaのWRAM配置の上限はその値になることに注意。
|
||||
|
||||
@ -181,3 +181,5 @@ Ltdautoload LTDMAIN
|
||||
Library $(ISDBG_LIBS_TWL)
|
||||
Library $(ISDBG_LIBS_NITRO)
|
||||
}
|
||||
|
||||
# BootROMの鍵データが0x0380c400~にあるので、hyenaのWRAM配置の上限はその値になることに注意。
|
||||
|
||||
@ -93,3 +93,5 @@ Ltdautoload SCRWRAM
|
||||
Object * (.main)
|
||||
Object * (.ltdmain)
|
||||
}
|
||||
|
||||
# BootROMの鍵データが0x0380c400~にあるので、jackalのWRAM配置の上限はその値になることに注意。
|
||||
|
||||
121
build/tests/yuv2rgb/Makefile
Normal file
121
build/tests/yuv2rgb/Makefile
Normal 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 =====
|
||||
BIN
build/tests/yuv2rgb/data/camera_shutter.dat
Normal file
BIN
build/tests/yuv2rgb/data/camera_shutter.dat
Normal file
Binary file not shown.
BIN
build/tests/yuv2rgb/data/camera_shutter_MONO.dat
Normal file
BIN
build/tests/yuv2rgb/data/camera_shutter_MONO.dat
Normal file
Binary file not shown.
BIN
build/tests/yuv2rgb/data/wheel.dat
Normal file
BIN
build/tests/yuv2rgb/data/wheel.dat
Normal file
Binary file not shown.
36
build/tests/yuv2rgb/include/const.h
Normal file
36
build/tests/yuv2rgb/include/const.h
Normal 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
|
||||
};
|
||||
|
||||
};
|
||||
}}
|
||||
381
build/tests/yuv2rgb/include/menuCameraManager.h
Normal file
381
build/tests/yuv2rgb/include/menuCameraManager.h
Normal 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
|
||||
45
build/tests/yuv2rgb/include/new.h
Normal file
45
build/tests/yuv2rgb/include/new.h
Normal 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++ƒfƒ‚
|
||||
|
||||
|
||||
$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
|
||||
35
build/tests/yuv2rgb/include/snd_data.h
Normal file
35
build/tests/yuv2rgb/include/snd_data.h
Normal 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_
|
||||
85
build/tests/yuv2rgb/include/yuv2rgb.h
Normal file
85
build/tests/yuv2rgb/include/yuv2rgb.h
Normal 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
|
||||
227
build/tests/yuv2rgb/readme.txt
Normal file
227
build/tests/yuv2rgb/readme.txt
Normal 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バイトアラインメ
|
||||
ントしておけばキャッシュまわりの心配が減るからです。
|
||||
|
||||
14
build/tests/yuv2rgb/redipl_defs_autogen_by_uig
Normal file
14
build/tests/yuv2rgb/redipl_defs_autogen_by_uig
Normal 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
|
||||
|
||||
103
build/tests/yuv2rgb/src/cpu_yuv2rgb.c
Normal file
103
build/tests/yuv2rgb/src/cpu_yuv2rgb.c
Normal 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);
|
||||
}
|
||||
|
||||
308
build/tests/yuv2rgb/src/dsp_yuv2rgb.c
Normal file
308
build/tests/yuv2rgb/src/dsp_yuv2rgb.c
Normal 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();
|
||||
}
|
||||
}
|
||||
|
||||
1809
build/tests/yuv2rgb/src/mainy.cpp
Normal file
1809
build/tests/yuv2rgb/src/mainy.cpp
Normal file
File diff suppressed because it is too large
Load Diff
2453
build/tests/yuv2rgb/src/menuCameraManager.cpp
Normal file
2453
build/tests/yuv2rgb/src/menuCameraManager.cpp
Normal file
File diff suppressed because it is too large
Load Diff
169
build/tests/yuv2rgb/src/menuIrqHandler.c
Normal file
169
build/tests/yuv2rgb/src/menuIrqHandler.c
Normal 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
|
||||
}
|
||||
|
||||
36
build/tests/yuv2rgb/src/menuIrqHandler.h
Normal file
36
build/tests/yuv2rgb/src/menuIrqHandler.h
Normal 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
|
||||
130
build/tests/yuv2rgb/src/new.cpp
Normal file
130
build/tests/yuv2rgb/src/new.cpp
Normal 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 );
|
||||
}
|
||||
10771
build/tests/yuv2rgb/src/snd_data.c
Normal file
10771
build/tests/yuv2rgb/src/snd_data.c
Normal file
File diff suppressed because it is too large
Load Diff
222
build/tests/yuv2rgb/yuv2rgb.rsf.template
Normal file
222
build/tests/yuv2rgb/yuv2rgb.rsf.template
Normal 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)
|
||||
}
|
||||
Binary file not shown.
Loading…
Reference in New Issue
Block a user