diff --git a/build/components/hyena.TWL/Makefile b/build/components/hyena.TWL/Makefile index d98e5618..d465e9e2 100644 --- a/build/components/hyena.TWL/Makefile +++ b/build/components/hyena.TWL/Makefile @@ -39,8 +39,12 @@ LCFILE_SPEC = $(TARGET_NAME).lsf LCFILE_TEMPLATE = $(TARGET_NAME).lcf.template LDRES_TEMPLATE = $(ROOT)/build/components/racoon.TWL/racoon.response.template +# crt0.oは、ランチャー向けに特殊ビルドしたものを使用 CRT0_O = $(OBJDIR)/crt0.LTD.o +# スタック不足防止の為、インライン展開せずにコンパイルする +CCFLAGS_OPT = -O4 -inline off + #---------------------------------------------------------------------------- include $(TWL_IPL_RED_ROOT)/build/buildtools/commondefs include $(TWLSDK_ROOT)/build/libraries/reboot/commondefs.reboot @@ -52,8 +56,7 @@ CCFLAGS += -DSDK_NOCRYPTO endif ifndef TWLSDK_NOCRYPTO -MAKELCF_FLAGS += -DUSE_CRYPTO_LIBS='libsea_sp$(TWL_LIBSUFFIX).a libcrypto_sp$(TWL_LIBSUFFIX).a' -MACRO_FLAGS += -DSDK_SEA +MAKELCF_FLAGS += -DUSE_CRYPTO_LIBS='libaes_sp$(TWL_LIBSUFFIX).a' endif MACRO_FLAGS += -DSDK_SYSMENU_BUILD diff --git a/build/components/hyena.TWL/hyena.lsf b/build/components/hyena.TWL/hyena.lsf index e6272713..62747bf1 100644 --- a/build/components/hyena.TWL/hyena.lsf +++ b/build/components/hyena.TWL/hyena.lsf @@ -44,7 +44,7 @@ Autoload WRAM libspi_sp$(LIBSUFFIX).a \ libpm_sp$(LIBSUFFIX).a \ libmath_sp$(LIBSUFFIX).a \ - libscfg_sp$(LIBSUFFIX).a \ + libscfg_sp$(LIBSUFFIX).a \ libtp_sp$(LIBSUFFIX).a \ libmic_sp$(LIBSUFFIX).a \ libfs_sp$(LIBSUFFIX).a \ @@ -56,21 +56,12 @@ Autoload WRAM libtpex_sp$(LIBSUFFIX).a \ libmicex_sp$(LIBSUFFIX).a \ libmcu_sp$(LIBSUFFIX).a \ - libboot_sp$(LIBSUFFIX).a \ - libreboot_sp$(LIBSUFFIX).a \ - libhotsw_sp$(LIBSUFFIX).a \ - libreloc_info_sp$(LIBSUFFIX).a \ - libsysmenu_sp$(LIBSUFFIX).a \ - libsysmmcu_sp$(LIBSUFFIX).a \ - libaes_sp.firm.LTD.a Library libsdio_sp$(LIBSUFFIX).a Library libnvram_sp$(LIBSUFFIX).a Library librtc_sp$(LIBSUFFIX).a - Library libsea_sp$(LIBSUFFIX).a - Library libcrypto_sp$(LIBSUFFIX).a Object * (.etable) Object * (.wram) @@ -141,52 +132,73 @@ Autoload WRAM Object OBJECT( WaitLoop_BbpAccess , libwl_sp$(LIBSUFFIX).a ) (.text) Object OBJECT( WaitLoop_RfAccess , libwl_sp$(LIBSUFFIX).a ) (.text) -# Object OBJECT( s_ar_cookie_mem , libathdrv_sp$(LIBSUFFIX).a ) (.bss) -# Object OBJECT( nin_ar , libathdrv_sp$(LIBSUFFIX).a ) (.bss) - - Object OBJECT( a_netbuf_alloc_rx , libathdrv_sp$(LIBSUFFIX).a ) (.text) - Object OBJECT( a_netbuf_register_rx_callback , libathdrv_sp$(LIBSUFFIX).a ) (.text) - Object OBJECT( nin_driver_tx , libathdrv_sp$(LIBSUFFIX).a ) (.text) - Object OBJECT( nin_tx_queue_full , libathdrv_sp$(LIBSUFFIX).a ) (.text) - Object OBJECT( nin_tx_complete , libathdrv_sp$(LIBSUFFIX).a ) (.text) - Object OBJECT( nin_rx , libathdrv_sp$(LIBSUFFIX).a ) (.text) - Object OBJECT( ar6000_bitrate_rx , libathdrv_sp$(LIBSUFFIX).a ) (.text) - Object OBJECT( ar6000_channelList_rx , libathdrv_sp$(LIBSUFFIX).a ) (.text) - Object OBJECT( ar6000_txPwr_rx , libathdrv_sp$(LIBSUFFIX).a ) (.text) - Object OBJECT( ar6000_gpio_intr_rx , libathdrv_sp$(LIBSUFFIX).a ) (.text) - Object OBJECT( ar6000_gpio_data_rx , libathdrv_sp$(LIBSUFFIX).a ) (.text) - Object OBJECT( ar6000_gpio_ack_rx , libathdrv_sp$(LIBSUFFIX).a ) (.text) - Object OBJECT( nin_drv_BmiWriteSocReg , libathdrv_sp$(LIBSUFFIX).a ) (.text) - Object OBJECT( ar6000_control_tx , libathdrv_sp$(LIBSUFFIX).a ) (.text) - Object OBJECT( nin_drv_BmiReadMemory , libathdrv_sp$(LIBSUFFIX).a ) (.text) - Object OBJECT( nin_drv_BmiWriteMemory , libathdrv_sp$(LIBSUFFIX).a ) (.text) - Object OBJECT( wmi_dix_2_dot3 , libathdrv_sp$(LIBSUFFIX).a ) (.text) - Object OBJECT( wmi_control_rx_xtnd , libathdrv_sp$(LIBSUFFIX).a ) (.text) - Object OBJECT( wmi_control_rx , libathdrv_sp$(LIBSUFFIX).a ) (.text) - Object OBJECT( wmi_cmd_send , libathdrv_sp$(LIBSUFFIX).a ) (.text) - Object OBJECT( wmi_cmd_send_xtnd , libathdrv_sp$(LIBSUFFIX).a ) (.text) - Object OBJECT( HIFReadWrite , libathdrv_sp$(LIBSUFFIX).a ) (.text) - Object OBJECT( HTCAddReceivePkt , libathdrv_sp$(LIBSUFFIX).a ) (.text) - Object OBJECT( HTCUnblockRecv , libathdrv_sp$(LIBSUFFIX).a ) (.text) - Object OBJECT( HTCFlushRecvBuffers , libathdrv_sp$(LIBSUFFIX).a ) (.text) - Object OBJECT( HTCSendPktCompletionHandler , libathdrv_sp$(LIBSUFFIX).a ) (.text) - Object OBJECT( HTCIssueSend , libathdrv_sp$(LIBSUFFIX).a ) (.text) - Object OBJECT( HTCTrySend , libathdrv_sp$(LIBSUFFIX).a ) (.text) - Object OBJECT( HTC_PACKET_DEQUEUE , libathdrv_sp$(LIBSUFFIX).a ) (.text) - Object OBJECT( HTCSendPkt , libathdrv_sp$(LIBSUFFIX).a ) (.text) - Object OBJECT( HTCFlushSendPkts , libathdrv_sp$(LIBSUFFIX).a ) (.text) - Object OBJECT( HTCControlTxComplete , libathdrv_sp$(LIBSUFFIX).a ) (.text) - Object OBJECT( HTCControlRecv , libathdrv_sp$(LIBSUFFIX).a ) (.text) - Object OBJECT( HTC_ALLOC_CONTROL_TX , libathdrv_sp$(LIBSUFFIX).a ) (.text) - Object OBJECT( _ath_delete_timer , libathdrv_sp$(LIBSUFFIX).a ) (.text) - Object OBJECT( _ath_untimeout , libathdrv_sp$(LIBSUFFIX).a ) (.text) - Object OBJECT( _ath_timeout_ms , libathdrv_sp$(LIBSUFFIX).a ) (.text) - Object OBJECT( _ath_init_timer , libathdrv_sp$(LIBSUFFIX).a ) (.text) - Object OBJECT( ath_timer_task , libathdrv_sp$(LIBSUFFIX).a ) (.text) - Object OBJECT( timer_wakeup_function , libathdrv_sp$(LIBSUFFIX).a ) (.text) + ##### + # Sub-routines in TWL WIRELESS Driver , that should be on WRAM. + Object OBJECT( HTCSendPktCompletionHandler, libathdrv_sp$(LIBSUFFIX).a ) (.text) + Object OBJECT( HTCIssueSend, libathdrv_sp$(LIBSUFFIX).a ) (.text) + Object OBJECT( HTCTrySend, libathdrv_sp$(LIBSUFFIX).a ) (.text) + Object OBJECT( HTCSendPkt, libathdrv_sp$(LIBSUFFIX).a ) (.text) + Object OBJECT( HTCProcessCreditRpt, libathdrv_sp$(LIBSUFFIX).a ) (.text) + Object OBJECT( DevRecvPacket, libathdrv_sp$(LIBSUFFIX).a ) (.text) + Object OBJECT( HTCProcessRecvHeader, libathdrv_sp$(LIBSUFFIX).a ) (.text) + Object OBJECT( HTCRecvCompleteHandler, libathdrv_sp$(LIBSUFFIX).a ) (.text) + Object OBJECT( HTCRecvMessagePendingHandler, libathdrv_sp$(LIBSUFFIX).a ) (.text) + Object OBJECT( HTCAddReceivePkt, libathdrv_sp$(LIBSUFFIX).a ) (.text) + Object OBJECT( AR6KFreeIOPacket, libathdrv_sp$(LIBSUFFIX).a ) (.text) + Object OBJECT( AR6KAllocIOPacket, libathdrv_sp$(LIBSUFFIX).a ) (.text) + Object OBJECT( DevRWCompletionHandler, libathdrv_sp$(LIBSUFFIX).a ) (.text) + Object OBJECT( DevGetEventAsyncHandler, libathdrv_sp$(LIBSUFFIX).a ) (.text) + Object OBJECT( DevCheckPendingRecvMsgsAsync, libathdrv_sp$(LIBSUFFIX).a ) (.text) + Object OBJECT( DevDsrHandler, libathdrv_sp$(LIBSUFFIX).a ) (.text) + Object OBJECT( HIFReadWrite, libathdrv_sp$(LIBSUFFIX).a ) (.text) + Object OBJECT( hifRWCompletionHandler, libathdrv_sp$(LIBSUFFIX).a ) (.text) + Object OBJECT( hifIRQHandler, libathdrv_sp$(LIBSUFFIX).a ) (.text) + Object OBJECT( HIFAckInterrupt, libathdrv_sp$(LIBSUFFIX).a ) (.text) + Object OBJECT( ar6000_credit_distribute, libathdrv_sp$(LIBSUFFIX).a ) (.text) + Object OBJECT( a_netbuf_alloc, libathdrv_sp$(LIBSUFFIX).a ) (.text) + Object OBJECT( a_netbuf_alloc_rx, libathdrv_sp$(LIBSUFFIX).a ) (.text) + Object OBJECT( a_netbuf_put, libathdrv_sp$(LIBSUFFIX).a ) (.text) + Object OBJECT( a_netbuf_push, libathdrv_sp$(LIBSUFFIX).a ) (.text) + Object OBJECT( a_netbuf_pull, libathdrv_sp$(LIBSUFFIX).a ) (.text) + Object OBJECT( a_netbuf_free, libathdrv_sp$(LIBSUFFIX).a ) (.text) + Object OBJECT( a_netbuf_to_data, libathdrv_sp$(LIBSUFFIX).a ) (.text) + Object OBJECT( a_netbuf_to_len, libathdrv_sp$(LIBSUFFIX).a ) (.text) + Object OBJECT( a_netbuf_headroom, libathdrv_sp$(LIBSUFFIX).a ) (.text) + Object OBJECT( nin_drv_return_netbuf, libathdrv_sp$(LIBSUFFIX).a ) (.text) + Object OBJECT( ath_queue_remove_from_head, libathdrv_sp$(LIBSUFFIX).a ) (.text) + Object OBJECT( ath_queue_insert_tail, libathdrv_sp$(LIBSUFFIX).a ) (.text) + Object OBJECT( ar6000_alloc_cookie, libathdrv_sp$(LIBSUFFIX).a ) (.text) + Object OBJECT( nin_driver_tx, libathdrv_sp$(LIBSUFFIX).a ) (.text) + Object OBJECT( nin_tx_complete, libathdrv_sp$(LIBSUFFIX).a ) (.text) + Object OBJECT( wmi_dix_2_dot3, libathdrv_sp$(LIBSUFFIX).a ) (.text) + Object OBJECT( wmi_data_hdr_add, libathdrv_sp$(LIBSUFFIX).a ) (.text) + Object OBJECT( wmi_data_hdr_remove, libathdrv_sp$(LIBSUFFIX).a ) (.text) + Object OBJECT( nin_rx, libathdrv_sp$(LIBSUFFIX).a ) (.text) + Object OBJECT( ar6000_ibss_map_epid, libathdrv_sp$(LIBSUFFIX).a ) (.text) + Object OBJECT( DL_ListInsertTail, libathdrv_sp$(LIBSUFFIX).a ) (.text) + Object OBJECT( DL_ListRemove, libathdrv_sp$(LIBSUFFIX).a ) (.text) + Object OBJECT( wmi_control_rx, libathdrv_sp$(LIBSUFFIX).a ) (.text) + Object OBJECT( wmi_cmd_send, libathdrv_sp$(LIBSUFFIX).a ) (.text) + Object OBJECT( ar6000_control_tx, libathdrv_sp$(LIBSUFFIX).a ) (.text) + Object OBJECT( wmi_implicit_create_pstream, libathdrv_sp$(LIBSUFFIX).a ) (.text) + Object OBJECT( HTCAllocControlBuffer, libathdrv_sp$(LIBSUFFIX).a ) (.text) + Object OBJECT( HTCFreeControlBuffer, libathdrv_sp$(LIBSUFFIX).a ) (.text) + Object OBJECT( BMILZData, libathdrv_sp$(LIBSUFFIX).a ) (.text) + Object OBJECT( bmiBufferSend, libathdrv_sp$(LIBSUFFIX).a ) (.text) + Object OBJECT( BMIWriteMemory, libathdrv_sp$(LIBSUFFIX).a ) (.text) Object OBJECT( wpa_sm_rx_eapol , libwpa_sp$(LIBSUFFIX).a ) (.text) + Library libboot_sp$(LIBSUFFIX).a \ + libreboot_sp$(LIBSUFFIX).a \ + libhotsw_sp$(LIBSUFFIX).a \ + libreloc_info_sp$(LIBSUFFIX).a \ + libsysmenu_sp$(LIBSUFFIX).a \ + libsysmmcu_sp$(LIBSUFFIX).a \ + libaes_sp.firm.LTD.a + + Library libathdrv_sp$(LIBSUFFIX).a (.bss) + Library libathdrv_sp$(LIBSUFFIX).a (.data) } #-------- diff --git a/build/components/hyena.TWL/src/main.c b/build/components/hyena.TWL/src/main.c index 6010212d..4c85733c 100644 --- a/build/components/hyena.TWL/src/main.c +++ b/build/components/hyena.TWL/src/main.c @@ -1,5 +1,5 @@ /*---------------------------------------------------------------------------* - Project: TwlSDK - components - mongoose.TWL + Project: TwlIPL - components - hyena.TWL File: main.c Copyright 2007 Nintendo. All rights reserved. @@ -32,22 +32,27 @@ #include #include #include +#include #include #include #include #include #include #include -#include "nvram_sp.h" #include "pm_pmic.h" #include "internal_api.h" -#include +#include "nvram_sp.h" /*---------------------------------------------------------------------------* 定数定義 *---------------------------------------------------------------------------*/ /* [TODO] Work around. Should be defined in wm_sp.h */ #define WM_WL_HEAP_SIZE 0x2100 +#define ATH_DRV_HEAP_SIZE 0x5800 /* TBD */ +#define WPA_HEAP_SIZE 0x0000 /* TBD */ + +#define MEM_TYPE_WRAM 0 +#define MEM_TYPE_MAIN 1 /* Priorities of each threads */ #define THREAD_PRIO_SPI 2 @@ -78,14 +83,17 @@ static void ResetRTC( void ); static void ReadLauncherParameter( void ); static void PrintDebugInfo(void); -static OSHeapHandle InitializeAllocateSystem(void); -static void InitializeFatfs(void); -static void InitializeNwm(void); -static void InitializeCdc(void); +static OSHeapHandle InitializeAllocateSystem(u8 memType); +static OSHeapHandle InitializeAllocateSystemCore(u8 memType); +#ifdef SDK_TWLHYB +static OSHeapHandle InitializeAllocateSystemCoreEx(u8 memType); +#endif static void DummyThread(void* arg); static void ReadUserInfo(void); static void VBlankIntr(void); - +static void InitializeFatfs(void); +static void InitializeNwm(OSHeapHandle drvHeapHandle, OSHeapHandle wpaHeapHandle); +static void InitializeCdc(void); /*---------------------------------------------------------------------------* 外部シンボル参照 *---------------------------------------------------------------------------*/ @@ -103,7 +111,7 @@ extern void SDK_LTDAUTOLOAD_LTDMAIN_BSS_END(void); void TwlSpMain(void) { - OSHeapHandle heapHandle; + OSHeapHandle wramHeapHandle, mainHeapHandle; // SYSMワークのクリア MI_CpuClear32( SYSMi_GetWork(), sizeof(SYSM_work) ); @@ -116,7 +124,6 @@ TwlSpMain(void) // OS 初期化 OS_Init(); - OS_InitTick(); PrintDebugInfo(); // ランチャーバージョンを格納(今のところ、最低でもマウント情報登録前には格納する必要あり) @@ -139,15 +146,12 @@ TwlSpMain(void) SYSMi_GetWork()->flags.common.isARM9Start = TRUE; // [TODO:] HW_RED_RESERVEDはNANDファームでクリアしておいて欲しい // ヒープ領域設定 - { - void *wram = OS_GetWramSubPrivArenaHi(); - void *mmem = OS_GetSubPrivArenaHi(); - OS_SetSubPrivArenaHi( (void*)SYSM_OWN_ARM7_MMEM_ADDR_END ); // メモリ配置をいじっているので、アリーナHiも変更しないとダメ!! - OS_SetWramSubPrivArenaHi( (void*)(SYSM_OWN_ARM7_WRAM_ADDR_END - HW_FIRM_FROM_FIRM_BUF_SIZE) ); // この時点では鍵をつぶさないように - OS_TPrintf( "MMEM SUBPRV ARENA HI : %08x -> %08x\n", mmem, OS_GetSubPrivArenaHi() ); - OS_TPrintf( "WRAM SUBPRV ARENA HI : %08x -> %08x\n", wram, OS_GetWramSubPrivArenaHi() ); - } - heapHandle = InitializeAllocateSystem(); + OS_SetSubPrivArenaHi( (void*)SYSM_OWN_ARM7_MMEM_ADDR_END ); // メモリ配置をいじっているので、アリーナHiも変更しないとダメ!! + OS_SetWramSubPrivArenaHi( (void*)(SYSM_OWN_ARM7_WRAM_ADDR_END - HW_FIRM_FROM_FIRM_BUF_SIZE) ); // この時点では鍵をつぶさないように + OS_TPrintf( "MMEM SUBPRV ARENA HI : %08x -> %08x\n", OS_GetSubPrivArenaHi(), OS_GetSubPrivArenaHi() ); + OS_TPrintf( "WRAM SUBPRV ARENA HI : %08x -> %08x\n", OS_GetWramSubPrivArenaHi(), OS_GetWramSubPrivArenaHi() ); + wramHeapHandle = InitializeAllocateSystem(MEM_TYPE_WRAM); + mainHeapHandle = InitializeAllocateSystem(MEM_TYPE_MAIN); // ボタン入力サーチ初期化 (void)PAD_InitXYButton(); @@ -168,15 +172,10 @@ TwlSpMain(void) if (OS_IsRunOnTwl() == TRUE) { - OSTick start = OS_GetTick(); InitializeFatfs(); // FATFS 初期化 - OS_TPrintf( "FATFS init time = %dms\n", OS_TicksToMilliSeconds( OS_GetTick() - start ) ); - InitializeNwm(); // NWM 初期化 + InitializeNwm(mainHeapHandle, mainHeapHandle); // NWM 初期化 #ifndef SDK_NOCRYPTO AES_Init(); // AES 初期化 -#ifdef SDK_SEA - SEA_Init(); -#endif // ifdef SDK_SEA #endif MCU_InitIrq(THREAD_PRIO_MCU); // MCU 初期化 } @@ -203,7 +202,7 @@ TwlSpMain(void) RTC_Init(THREAD_PRIO_RTC); // 旧無線初期化 - WVR_Begin(heapHandle); + WVR_Begin(wramHeapHandle); // SPI 初期化 SPI_Init(THREAD_PRIO_SPI); @@ -231,6 +230,7 @@ TwlSpMain(void) while (TRUE) { OS_Halt(); + //---- check reset if (OS_IsResetOccurred()) { @@ -281,7 +281,6 @@ void ReadLauncherParameter( void ) } } - /*---------------------------------------------------------------------------* Name: PrintDebugInfo Description: ARM7 コンポーネントの情報をデバッグ出力する。 @@ -321,9 +320,10 @@ InitializeFatfs(void) (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)) + if(!FATFS_Init( FATFS_DMA_4, FATFS_DMA_5, THREAD_PRIO_FATFS)) #else if (FATFS_Init(FATFS_DMA_NOT_USE, FATFS_DMA_NOT_USE, THREAD_PRIO_FATFS)) #endif @@ -344,27 +344,21 @@ InitializeFatfs(void) Returns: None. *---------------------------------------------------------------------------*/ static void -InitializeNwm(void) +InitializeNwm(OSHeapHandle drvHeapHandle, OSHeapHandle wpaHeapHandle) { NwmspInit nwmInit; - OSHeapHandle heapHandle; - void* Lo = (void*)OS_GetSubPrivArenaLo(); - void* Hi = (void*)OS_GetSubPrivArenaHi(); - heapHandle = OS_CreateHeap(OS_ARENA_MAIN_SUBPRIV, Lo, Hi); - - /* [TODO] 確保したヒープ領域が新無線一式が必要としているメモリ量以上かのチェックが必要 */ - nwmInit.dmaNo = NWM_DMANO; nwmInit.cmdPrio = THREAD_PRIO_NWM_COMMMAND; nwmInit.evtPrio = THREAD_PRIO_NWM_EVENT; nwmInit.sdioPrio = THREAD_PRIO_NWM_SDIO; nwmInit.drvHeap.id = OS_ARENA_MAIN_SUBPRIV; /* [TODO] */ - nwmInit.drvHeap.handle = heapHandle; + nwmInit.drvHeap.handle = drvHeapHandle; #ifdef WPA_BUILT_IN /* WPA が組み込まれる場合、以下のメンバが追加される */ + nwmInit.wpaPrio = THREAD_PRIO_NWM_WPA; nwmInit.wpaHeap.id = OS_ARENA_MAIN_SUBPRIV; /* [TODO] */ - nwmInit.wpaHeap.handle = heapHandle; + nwmInit.wpaHeap.handle = wpaHeapHandle; #endif NWMSP_Init(&nwmInit); @@ -385,6 +379,19 @@ InitializeCdc(void) OSThread thread; u32 stack[18]; + // ※ランチャーでは必要なし +#if 0 + // ランチャー経由で起動した場合はCODECは既に初期化されているため + // コンポーネントがCODECを初期化する必要はありません。 + // 将来的にはバッサリと切る必要がありますが、 + // 暫定的にI2Sが有効かどうかでCODECが初期化済みかどうかを判定します。 + if (reg_SND_SMX_CNT & REG_SND_SMX_CNT_E_MASK) + { + CDC_InitLib(); + return; + } +#endif + // ダミースレッド作成 OS_CreateThread(&thread, DummyThread, NULL, (void*)((u32)stack + (sizeof(u32) * 18)), sizeof(u32) * 18, OS_THREAD_PRIORITY_MAX); @@ -392,7 +399,7 @@ InitializeCdc(void) #if 1 // CODEC 初期化 - CDC_InitForFirstBoot(); + CDC_InitForFirstBoot(); // ※ランチャー特殊処理。 CDC_InitMic(); // CDCi_DumpRegisters(); #else @@ -430,13 +437,147 @@ DummyThread(void* arg) Arguments: None. Returns: OSHeapHandle - WRAM アリーナ上に確保されたヒープのハンドルを返す。 *---------------------------------------------------------------------------*/ -static OSHeapHandle -InitializeAllocateSystem(void) +static OSHeapHandle InitializeAllocateSystem(u8 memType) { + OSHeapHandle hh; #ifdef SDK_TWLHYB - if (OS_IsRunOnTwl() == TRUE) + if( OS_IsRunOnTwl() == TRUE) + { + hh = InitializeAllocateSystemCoreEx(memType); /* Hybrid を TWL で動作させる */ + } + else +#endif + { + hh = InitializeAllocateSystemCore(memType); /* Hybrid を DS で動作させる or Limited */ + } + + return hh; +} + +/*---------------------------------------------------------------------------* + Name: InitializeAllocateSystemCore + Description: メモリ割当てシステムを初期化する。 + Hybrid を DS で動作させた場合、Limited を TWL で動作させた場合に動作 + Arguments: None. + Returns: OSHeapHandle - WRAM アリーナ上に確保されたヒープのハンドルを返す。 + *---------------------------------------------------------------------------*/ +static OSHeapHandle InitializeAllocateSystemCore(u8 memType) +{ + OSHeapHandle hh; + + /* MAIN */ + if(memType == MEM_TYPE_MAIN) + { + { + 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); + + if( heapSize <= 0) /* ヒープ領域の確保に失敗 */ + { + OS_Panic("ARM7: Failed to MAIN create heap.\n"); + } + + #ifdef SDK_TWLLTD + { + if ((ATH_DRV_HEAP_SIZE + WPA_HEAP_SIZE) > heapSize) + { + OS_Panic("Insufficient heap size. (0x%x < 0x%x)\n", heapSize, ATH_DRV_HEAP_SIZE + WPA_HEAP_SIZE); + } + } + #endif + OS_TPrintf("ARM7: MAIN heap size is %d\n", heapSize); + } + } + + /* WRAM */ + if( memType == MEM_TYPE_WRAM) + { + { + void* lo = (void*)OS_GetWramSubPrivArenaLo(); + void* hi = (void*)OS_GetWramSubPrivArenaHi(); + + // アリーナを 0 クリア + MI_CpuClear8(lo, (u32)hi - (u32)lo); + + // メモリ割り当て初期化 + lo = OS_InitAlloc(OS_ARENA_WRAM_SUBPRIV, lo, hi, 1); + // アリーナ下位アドレスを設定 + OS_SetArenaLo(OS_ARENA_WRAM_SUBPRIV, lo); + + // ヒープ作成 + hh = OS_CreateHeap(OS_ARENA_WRAM_SUBPRIV, lo, hi); + + if (hh < 0) + { + OS_Panic("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( heapSize <= 0) /* ヒープ領域の確保に失敗 */ + { + OS_Panic("ARM7: Failed to MAIN create heap.\n"); + } + + 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; +} + +#ifdef SDK_TWLHYB +#include +/*---------------------------------------------------------------------------* + Name: InitializeAllocateSystemCoreEx + Description: メモリ割当てシステムを初期化する。 + Hybrid を TWL で動作させた場合に動作 + Arguments: None. + Returns: OSHeapHandle - WRAM アリーナ上に確保されたヒープのハンドルを返す。 + *---------------------------------------------------------------------------*/ +static OSHeapHandle InitializeAllocateSystemCoreEx(u8 memType) +{ + OSHeapHandle hh; + + if(memType == MEM_TYPE_MAIN) + { { void* basicLo = (void*)OS_GetSubPrivArenaLo(); void* basicHi = (void*)OS_GetSubPrivArenaHi(); @@ -450,7 +591,6 @@ InitializeAllocateSystem(void) 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); @@ -480,38 +620,18 @@ InitializeAllocateSystem(void) u32 heapSize; heapSize = (u32)OS_CheckHeap(OS_ARENA_MAIN_SUBPRIV, hh); - if ((ATH_DRV_HEAP_SIZE + WPA_HEAP_SIZE) > heapSize) + + if( heapSize <= 0) /* ヒープ領域の確保に失敗 */ { - OS_Panic("Insufficient heap size. (0x%x < 0x%x)\n", heapSize, ATH_DRV_HEAP_SIZE + WPA_HEAP_SIZE); + OS_Panic("ARM7: Failed to MAIN create heap.\n"); } + OS_TPrintf("ARM7: MAIN heap size is %d (before AddToHead)\n", heapSize); } // ヒープに拡張ブロックを追加 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); // ヒープサイズの確認 @@ -519,10 +639,22 @@ InitializeAllocateSystem(void) u32 heapSize; heapSize = (u32)OS_CheckHeap(OS_ARENA_MAIN_SUBPRIV, hh); + + if( heapSize <= 0) /* ヒープ領域の確保に失敗 */ + { + OS_Panic("ARM7: Failed to MAIN create heap.\n"); + } + + if ((ATH_DRV_HEAP_SIZE + WPA_HEAP_SIZE) > heapSize) + { + OS_Panic("Insufficient heap size. (0x%x < 0x%x)\n", heapSize, ATH_DRV_HEAP_SIZE + WPA_HEAP_SIZE); + } OS_TPrintf("ARM7: MAIN heap size is %d\n", heapSize); } -#ifdef SDK_TWLHYB - if (OS_IsRunOnTwl() == TRUE) + } + + if(memType == MEM_TYPE_WRAM) + { { void* basicLo = (void*)OS_GetWramSubPrivArenaLo(); void* basicHi = (void*)OS_GetWramSubPrivArenaHi(); @@ -566,6 +698,12 @@ InitializeAllocateSystem(void) u32 heapSize; heapSize = (u32)OS_CheckHeap(OS_ARENA_WRAM_SUBPRIV, hh); + + if( heapSize <= 0) /* ヒープ領域の確保に失敗 */ + { + OS_Panic("ARM7: Failed to WRAM create heap.\n"); + } + if (WM_WL_HEAP_SIZE > heapSize) { OS_Panic("Insufficient heap size. (0x%x < 0x%x)\n", heapSize, WM_WL_HEAP_SIZE); @@ -576,28 +714,6 @@ InitializeAllocateSystem(void) // ヒープに拡張ブロックを追加 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); @@ -607,15 +723,24 @@ InitializeAllocateSystem(void) u32 heapSize; heapSize = (u32)OS_CheckHeap(OS_ARENA_WRAM_SUBPRIV, hh); + + if( heapSize <= 0) /* ヒープ領域の確保に失敗 */ + { + OS_Panic("ARM7: Failed to WRAM create heap.\n"); + } + 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; } +#include +#endif #ifdef WM_PRECALC_ALLOWEDCHANNEL extern u16 WMSP_GetAllowedChannel(u16 bitField); @@ -683,4 +808,3 @@ VBlankIntr(void) PM_SelfBlinkProc(); } } -