mirror of
https://github.com/rvtr/TwlIPL.git
synced 2025-10-31 06:01:12 -04:00
git-svn-id: file:///Users/lillianskinner/Downloads/platinum/twl/TwlIPL/trunk@783 b08762b0-b915-fc4b-9d8c-17b2551a87ff
421 lines
12 KiB
C
421 lines
12 KiB
C
/*---------------------------------------------------------------------------*
|
||
Project: TwlSDK - NandInitializer
|
||
File: main.c
|
||
|
||
Copyright 2008 Nintendo. All rights reserved.
|
||
|
||
These coded instructions, statements, and computer programs contain
|
||
proprietary information of Nintendo of America Inc. and/or Nintendo
|
||
Company Ltd., and are protected by Federal copyright law. They may
|
||
not be disclosed to third parties or copied or duplicated in any form,
|
||
in whole or in part, without the prior written consent of Nintendo.
|
||
|
||
$Date:: $
|
||
$Rev$
|
||
$Author$
|
||
*---------------------------------------------------------------------------*/
|
||
|
||
#include <twl_sp.h>
|
||
#include <twl/spi.h>
|
||
#include <twl/camera.h>
|
||
#include <twl/rtc.h>
|
||
#include <twl/fatfs.h>
|
||
#include <twl/os/common/codecmode.h>
|
||
#include <twl/cdc.h>
|
||
#include <twl/exi/ARM7/genPort2.h>
|
||
#include <twl/aes.h>
|
||
#include "kami_pxi.h"
|
||
#include "formatter.h"
|
||
#ifdef SDK_SEA
|
||
#include <twl/sea.h>
|
||
#endif // ifdef SDK_SEA
|
||
|
||
/* Priorities of each threads */
|
||
#define THREAD_PRIO_SPI 2
|
||
#define THREAD_PRIO_SND 6
|
||
#define THREAD_PRIO_FATFS 8
|
||
#define THREAD_PRIO_RTC 12
|
||
#define THREAD_PRIO_SNDEX 14
|
||
#define THREAD_PRIO_FS 15
|
||
/* OS_THREAD_LAUNCHER_PRIORITY 16 */
|
||
|
||
extern void PMi_InitShutdownControl(void);
|
||
|
||
/*---------------------------------------------------------------------------*
|
||
内部関数定義
|
||
*---------------------------------------------------------------------------*/
|
||
static OSHeapHandle InitializeAllocateSystem(void);
|
||
static void VBlankIntr(void);
|
||
static void InitializeFatfs(void);
|
||
static void InitializeCdc(void);
|
||
static void DummyThread(void* arg);
|
||
|
||
/*---------------------------------------------------------------------------*
|
||
外部シンボル参照
|
||
*---------------------------------------------------------------------------*/
|
||
#ifdef SDK_TWLHYB
|
||
extern void SDK_LTDAUTOLOAD_LTDWRAM_BSS_END(void);
|
||
extern void SDK_LTDAUTOLOAD_LTDMAIN_BSS_END(void);
|
||
#endif
|
||
|
||
/*---------------------------------------------------------------------------*
|
||
Name: TwlSpMain
|
||
|
||
Description: Initialize and do main
|
||
|
||
Arguments: None.
|
||
|
||
Returns: None.
|
||
*---------------------------------------------------------------------------*/
|
||
void TwlSpMain(void)
|
||
{
|
||
OSThread thread;
|
||
u32 stack[18];
|
||
|
||
// OS初期化
|
||
OS_Init();
|
||
SPI_Init(2);
|
||
OS_InitTick();
|
||
OS_InitAlarm();
|
||
OS_InitThread();
|
||
// (void)PAD_InitXYButton();
|
||
|
||
// ヒープ領域設定
|
||
InitializeAllocateSystem();
|
||
|
||
// ボタン入力サーチ初期化
|
||
(void)PAD_InitXYButton();
|
||
|
||
// 割り込み許可
|
||
(void)OS_SetIrqFunction(OS_IE_V_BLANK, VBlankIntr);
|
||
(void)OS_EnableIrqMask(OS_IE_V_BLANK);
|
||
(void)GX_VBlankIntr(TRUE);
|
||
(void)OS_EnableIrq();
|
||
(void)OS_EnableInterrupts();
|
||
|
||
// ダミースレッド作成(CDC_InitとFS_InitでOS_Sleepが使用されているため)
|
||
OS_CreateThread(&thread, DummyThread, NULL,
|
||
(void*)((u32)stack + (sizeof(u32) * 18)), sizeof(u32) * 18, OS_THREAD_PRIORITY_MAX);
|
||
OS_WakeupThreadDirect(&thread);
|
||
|
||
// ファイルシステム初期化
|
||
FS_Init(FS_DMA_NOT_USE);
|
||
FS_CreateReadServerThread(THREAD_PRIO_FS);
|
||
|
||
if (OS_IsRunOnTwl() == TRUE)
|
||
{
|
||
InitializeFatfs(); // FATFS 初期化
|
||
//InitializeNwm(); // NWM 初期化
|
||
#ifndef SDK_NOCRYPTO
|
||
AES_Init(); // AES 初期化
|
||
#ifdef SDK_SEA
|
||
SEA_Init();
|
||
#endif // ifdef SDK_SEA
|
||
#endif
|
||
}
|
||
|
||
if (OSi_IsCodecTwlMode() == TRUE)
|
||
{
|
||
// CODEC 初期化
|
||
InitializeCdc();
|
||
// カメラ初期化
|
||
//CAMERA_Init();
|
||
/* CODEC が TWL モードでないとシャッター音を強制的に鳴らす
|
||
機能が使用できません。この為、CODEC が TWL モードの場合
|
||
にのみカメラライブラリを使用可能な状態にします。 */
|
||
}
|
||
|
||
// サウンド初期化
|
||
SND_Init(THREAD_PRIO_SND);
|
||
if (OS_IsRunOnTwl() == TRUE)
|
||
{
|
||
SNDEX_Init(THREAD_PRIO_SNDEX);
|
||
}
|
||
|
||
// RTC 初期化
|
||
RTC_Init(THREAD_PRIO_RTC);
|
||
|
||
// 旧無線初期化
|
||
//WVR_Begin(heapHandle);
|
||
|
||
// SPI 初期化
|
||
SPI_Init(THREAD_PRIO_SPI);
|
||
|
||
|
||
KamiPxiInit();
|
||
|
||
// ダミースレッド破棄
|
||
OS_KillThread(&thread, NULL);
|
||
|
||
while (TRUE)
|
||
{
|
||
OS_Halt();
|
||
//---- check reset
|
||
if (OS_IsResetOccurred())
|
||
{
|
||
OS_ResetSystem();
|
||
}
|
||
}
|
||
|
||
|
||
}
|
||
#include <twl/ltdwram_begin.h>
|
||
/*---------------------------------------------------------------------------*
|
||
Name: InitializeFatfs
|
||
Description: FATFSライブラリを初期化する。
|
||
Arguments: None.
|
||
Returns: None.
|
||
*---------------------------------------------------------------------------*/
|
||
static void
|
||
InitializeFatfs(void)
|
||
{
|
||
OSThread thread;
|
||
u32 stack[18];
|
||
|
||
// ダミースレッド作成
|
||
OS_CreateThread(&thread, DummyThread, NULL,
|
||
(void*)((u32)stack + (sizeof(u32) * 18)), sizeof(u32) * 18, OS_THREAD_PRIORITY_MAX);
|
||
OS_WakeupThreadDirect(&thread);
|
||
|
||
// FATFSライブラリの初期化
|
||
#ifndef SDK_NOCRYPTO
|
||
if(!FATFS_Init( FATFS_DMA_4, FATFS_DMA_NOT_USE, THREAD_PRIO_FATFS))
|
||
#else
|
||
if (FATFS_Init(FATFS_DMA_NOT_USE, FATFS_DMA_NOT_USE, THREAD_PRIO_FATFS))
|
||
#endif
|
||
{
|
||
// do nothing
|
||
}
|
||
|
||
// ダミースレッド破棄
|
||
OS_KillThread(&thread, NULL);
|
||
}
|
||
#include <twl/ltdwram_end.h>
|
||
|
||
#include <twl/ltdwram_begin.h>
|
||
/*---------------------------------------------------------------------------*
|
||
Name: InitializeCdc
|
||
Description: CDCライブラリを初期化する。CDC初期化関数内でスレッド休止する
|
||
為、休止中動作するダミーのスレッドを立てる。
|
||
Arguments: None.
|
||
Returns: None.
|
||
*---------------------------------------------------------------------------*/
|
||
static void
|
||
InitializeCdc(void)
|
||
{
|
||
#if 1
|
||
// CODEC 初期化
|
||
CDC_Init();
|
||
CDC_InitMic();
|
||
// CDCi_DumpRegisters();
|
||
#else
|
||
/* [Debug] CODEC を DS モードで初期化 */
|
||
*((u8*)(HW_TWL_ROM_HEADER_BUF + 0x01bf)) &= ~(0x01);
|
||
CDC_Init();
|
||
CDC_GoDsMode();
|
||
OS_TPrintf("Codec mode changed to DS mode for debug.\n");
|
||
#endif
|
||
}
|
||
|
||
/*---------------------------------------------------------------------------*
|
||
Name: DummyThread
|
||
Description: CDCライブラリを初期化する際に立てるダミーのスレッド。
|
||
Arguments: arg - 使用しない。
|
||
Returns: None.
|
||
*---------------------------------------------------------------------------*/
|
||
static void
|
||
DummyThread(void* arg)
|
||
{
|
||
#pragma unused(arg)
|
||
while (TRUE)
|
||
{
|
||
}
|
||
}
|
||
#include <twl/ltdwram_end.h>
|
||
|
||
/*---------------------------------------------------------------------------*
|
||
Name: InitializeAllocateSystem
|
||
Description: メモリ割当てシステムを初期化する。
|
||
Arguments: None.
|
||
Returns: OSHeapHandle - WRAM アリーナ上に確保されたヒープのハンドルを返す。
|
||
*---------------------------------------------------------------------------*/
|
||
static OSHeapHandle
|
||
InitializeAllocateSystem(void){
|
||
OSHeapHandle hh;
|
||
|
||
#ifdef SDK_TWLHYB
|
||
if (OS_IsRunOnTwl() == TRUE)
|
||
{
|
||
void* basicLo = (void*)OS_GetSubPrivArenaLo();
|
||
void* basicHi = (void*)OS_GetSubPrivArenaHi();
|
||
void* extraLo = (void*)MATH_ROUNDUP((u32)SDK_LTDAUTOLOAD_LTDMAIN_BSS_END, 32);
|
||
void* extraHi = (void*)MATH_ROUNDDOWN(HW_MAIN_MEM_SUB, 32);
|
||
|
||
#if SDK_DEBUG
|
||
// debug information
|
||
OS_TPrintf("ARM7: MAIN arena basicLo = %p\n", basicLo);
|
||
OS_TPrintf("ARM7: MAIN arena basicHi = %p\n", basicHi);
|
||
OS_TPrintf("ARM7: MAIN arena extraLo = %p\n", extraLo);
|
||
OS_TPrintf("ARM7: MAIN arena extraHi = %p\n", extraHi);
|
||
#endif
|
||
|
||
// アリーナを 0 クリア
|
||
MI_CpuClear8(basicLo, (u32)basicHi - (u32)basicLo);
|
||
MI_CpuClear8(extraLo, (u32)extraHi - (u32)extraLo);
|
||
|
||
// メモリ割り当て初期化
|
||
if ((u32)basicLo < (u32)extraLo)
|
||
{
|
||
basicLo = OS_InitAlloc(OS_ARENA_MAIN_SUBPRIV, basicLo, extraHi, 1);
|
||
// アリーナ下位アドレスを設定
|
||
OS_SetArenaLo(OS_ARENA_MAIN_SUBPRIV, basicLo);
|
||
}
|
||
else
|
||
{
|
||
extraLo = OS_InitAlloc(OS_ARENA_MAIN_SUBPRIV, extraLo, basicHi, 1);
|
||
}
|
||
|
||
// ヒープ作成
|
||
hh = OS_CreateHeap(OS_ARENA_MAIN_SUBPRIV, basicLo, basicHi);
|
||
|
||
if (hh < 0)
|
||
{
|
||
OS_Panic("ARM7: Failed to create MAIN heap.\n");
|
||
}
|
||
|
||
// ヒープに拡張ブロックを追加
|
||
OS_AddToHeap(OS_ARENA_MAIN_SUBPRIV, hh, extraLo, extraHi);
|
||
}
|
||
else
|
||
#endif
|
||
{
|
||
void* lo = (void*)OS_GetSubPrivArenaLo();
|
||
void* hi = (void*)OS_GetSubPrivArenaHi();
|
||
|
||
// アリーナを 0 クリア
|
||
MI_CpuClear8(lo, (u32)hi - (u32)lo);
|
||
|
||
// メモリ割り当て初期化
|
||
lo = OS_InitAlloc(OS_ARENA_MAIN_SUBPRIV, lo, hi, 1);
|
||
// アリーナ下位アドレスを設定
|
||
OS_SetArenaLo(OS_ARENA_MAIN_SUBPRIV, lo);
|
||
|
||
// ヒープ作成
|
||
hh = OS_CreateHeap(OS_ARENA_MAIN_SUBPRIV, lo, hi);
|
||
|
||
if (hh < 0)
|
||
{
|
||
OS_Panic("ARM7: Failed to MAIN create heap.\n");
|
||
}
|
||
}
|
||
// カレントヒープに設定
|
||
(void)OS_SetCurrentHeap(OS_ARENA_MAIN_SUBPRIV, hh);
|
||
// ヒープサイズの確認
|
||
{
|
||
u32 heapSize;
|
||
|
||
heapSize = (u32)OS_CheckHeap(OS_ARENA_MAIN_SUBPRIV, hh);
|
||
OS_TPrintf("ARM7: MAIN heap size is %d\n", heapSize);
|
||
}
|
||
#ifdef SDK_TWLHYB
|
||
if (OS_IsRunOnTwl() == TRUE)
|
||
{
|
||
void* basicLo = (void*)OS_GetWramSubPrivArenaLo();
|
||
void* basicHi = (void*)OS_GetWramSubPrivArenaHi();
|
||
void* extraLo = (void*)MATH_ROUNDUP((u32)SDK_LTDAUTOLOAD_LTDWRAM_BSS_END, 32);
|
||
void* extraHi = (void*)MATH_ROUNDDOWN(HW_WRAM_A_HYB_END, 32);
|
||
|
||
#if SDK_DEBUG
|
||
// debug information
|
||
OS_TPrintf("ARM7: WRAM arena basicLo = %p\n", basicLo);
|
||
OS_TPrintf("ARM7: WRAM arena basicHi = %p\n", basicHi);
|
||
OS_TPrintf("ARM7: WRAM arena extraLo = %p\n", extraLo);
|
||
OS_TPrintf("ARM7: WRAM arena extraHi = %p\n", extraHi);
|
||
#endif
|
||
|
||
// アリーナを 0 クリア
|
||
MI_CpuClear8(basicLo, (u32)basicHi - (u32)basicLo);
|
||
MI_CpuClear8(extraLo, (u32)extraHi - (u32)extraLo);
|
||
|
||
// メモリ割り当て初期化
|
||
if ((u32)basicLo < (u32)extraLo)
|
||
{
|
||
basicLo = OS_InitAlloc(OS_ARENA_WRAM_SUBPRIV, basicLo, extraHi, 1);
|
||
// アリーナ下位アドレスを設定
|
||
OS_SetArenaLo(OS_ARENA_WRAM_SUBPRIV, basicLo);
|
||
}
|
||
else
|
||
{
|
||
extraLo = OS_InitAlloc(OS_ARENA_WRAM_SUBPRIV, extraLo, basicHi, 1);
|
||
}
|
||
|
||
// ヒープ作成
|
||
hh = OS_CreateHeap(OS_ARENA_WRAM_SUBPRIV, basicLo, basicHi);
|
||
|
||
if (hh < 0)
|
||
{
|
||
OS_Panic("ARM7: Failed to WRAM create heap.\n");
|
||
}
|
||
|
||
// ヒープに拡張ブロックを追加
|
||
OS_AddToHeap(OS_ARENA_WRAM_SUBPRIV, hh, extraLo, extraHi);
|
||
}
|
||
else
|
||
#endif
|
||
{
|
||
void* lo = (void*)OS_GetWramSubPrivArenaLo();
|
||
void* hi = (void*)OS_GetWramSubPrivArenaHi();
|
||
|
||
// アリーナを 0 クリア
|
||
MI_CpuClear8(lo, (u32)hi - (u32)lo);
|
||
|
||
// メモリ割り当て初期化
|
||
lo = OS_InitAlloc(OS_ARENA_WRAM_SUBPRIV, lo, hi, 1);
|
||
// アリーナ下位アドレスを設定
|
||
OS_SetArenaLo(OS_ARENA_WRAM_SUBPRIV, lo);
|
||
|
||
// ヒープ作成
|
||
hh = OS_CreateHeap(OS_ARENA_WRAM_SUBPRIV, lo, hi);
|
||
|
||
if (hh < 0)
|
||
{
|
||
OS_Panic("ARM7: Failed to WRAM create heap.\n");
|
||
}
|
||
}
|
||
|
||
// カレントヒープに設定
|
||
(void)OS_SetCurrentHeap(OS_ARENA_WRAM_SUBPRIV, hh);
|
||
|
||
// ヒープサイズの確認
|
||
{
|
||
u32 heapSize;
|
||
|
||
heapSize = (u32)OS_CheckHeap(OS_ARENA_WRAM_SUBPRIV, hh);
|
||
if (WM_WL_HEAP_SIZE > heapSize)
|
||
{
|
||
OS_Panic("Insufficient heap size. (0x%x < 0x%x)\n", heapSize, WM_WL_HEAP_SIZE);
|
||
}
|
||
OS_TPrintf("ARM7: WRAM heap size is %d\n", heapSize);
|
||
}
|
||
|
||
return hh;
|
||
}
|
||
|
||
/*---------------------------------------------------------------------------*
|
||
Name: VBlankIntr
|
||
Description: V ブランク割り込みベクタ。
|
||
Arguments: None.
|
||
Returns: None.
|
||
*---------------------------------------------------------------------------*/
|
||
extern BOOL PMi_Initialized;
|
||
void PM_SelfBlinkProc(void);
|
||
|
||
static void
|
||
VBlankIntr(void)
|
||
{
|
||
if (PMi_Initialized)
|
||
{
|
||
PM_SelfBlinkProc();
|
||
}
|
||
}
|