diff --git a/Makefile b/Makefile index cbea149c..88b6fe36 100644 --- a/Makefile +++ b/Makefile @@ -22,11 +22,13 @@ include $(TWLIPL_ROOT)/build/buildtools/commondefs #---------------------------------------------------------------------------- export TWL_ARCHGEN = ALL -SUBDIRS = $(TWLSDK_ROOT)/add-ins/NitroWireless \ +SUBDIRS = \ + $(TWLSDK_ROOT)/add-ins/NitroWireless \ $(TWLSDK_ROOT)/build/libraries/ese \ $(TWLSDK_ROOT)/build/libraries/nam \ $(TWLSDK_ROOT)/build/libraries/reboot \ $(TWLSDK_ROOT)/build/libraries/aes \ + $(TWLSDK_ROOT)/build/libraries/spi \ $(TWLSDK_ROOT)/build/components/racoon.TWL \ $(TWLSYSTEM_ROOT) \ build diff --git a/Makefile.sysmenu b/Makefile.sysmenu index a4cdf36b..2df7e5e1 100644 --- a/Makefile.sysmenu +++ b/Makefile.sysmenu @@ -28,6 +28,8 @@ SUBDIRS = \ $(TWLSDK_ROOT)/build/libraries/nam \ $(TWLSDK_ROOT)/build/libraries/reboot \ $(TWLSDK_ROOT)/build/libraries/aes \ + $(TWLSDK_ROOT)/build/libraries/rtc \ + $(TWLSDK_ROOT)/build/libraries/spi \ $(TWLSDK_ROOT)/build/components/racoon.TWL \ $(TWLSYSTEM_ROOT) \ build/libraries_sysmenu\ diff --git a/build/components/hyena.TWL/Makefile b/build/components/hyena.TWL/Makefile index 5667d3cf..619e07e4 100644 --- a/build/components/hyena.TWL/Makefile +++ b/build/components/hyena.TWL/Makefile @@ -40,13 +40,24 @@ CRT0_O = crt0.LTD.TWL.o include $(TWLIPL_ROOT)/build/buildtools/commondefs include $(TWLSDK_ROOT)/build/libraries/reboot/commondefs.reboot +ifdef TWLSDK_NOCRYPTO +CCFLAGS += -DSDK_NOCRYPTO +endif + +ifndef TWLSDK_NOCRYPTO +MAKELCF_FLAGS += -DUSE_CRYPTO_LIBS='libaes_sp.TWL$(CODEGEN).a' +endif + #MACRO_FLAGS += -DSDK_ARM7COMP_LTD MAKELCF_FLAGS += -DADDRESS_LTDWRAM='0x037c0000' \ -DADDRESS_FLXMAIN='0x02280000' \ -DADDRESS_BOOTCORE='0x0380f000' \ -DCRT0_O='$(CRT0_O)' -MAKELCF_FLAGS += -DISDBG_LIBS='$(ISDBG_LIBS)' + +MAKELCF_FLAGS += -DISDBG_LIBS_TWL='$(if $(ISDBG_LIBS_TWL),$(ISDBG_LIBS_TWL),libstubsistd_sp$(TWL_LIBSUFFIX).a)' \ + -DISDBG_LIBS_NITRO='libstubsisd_sp$(TWL_LIBSUFFIX).a' + #-------------------------------- # install target @@ -60,6 +71,7 @@ INSTALL_TARGETS = $(BINDIR)/$(TARGET_NAME).tef \ INSTALL_DIR = $(TWL_INSTALL_COMPONENTSDIR)/$(TARGET_NAME)/$(TWL_BUILDTYPE) LINCLUDES = $(ROOT)/build/libraries/spi/ARM7/include +LLIBRARIES += libwl_sp.TWL.LTD.a LDEPENDS_NEF = $(TWL_LIBS) $(LLIBRARIES) do-build: $(TARGETS) diff --git a/build/components/hyena.TWL/hyena.lsf b/build/components/hyena.TWL/hyena.lsf index 9e305dc6..a742a89d 100644 --- a/build/components/hyena.TWL/hyena.lsf +++ b/build/components/hyena.TWL/hyena.lsf @@ -53,24 +53,76 @@ Autoload WRAM libcdc_sp.TWL$(CODEGEN).a \ libtpex_sp.TWL$(CODEGEN).a \ libmicex_sp.TWL$(CODEGEN).a \ - libnvram_sp.TWL$(CODEGEN).a \ - librtc_sp.TWL$(CODEGEN).a \ - libwvr_sp.TWL$(CODEGEN).a \ - libaes_sp.TWL$(CODEGEN).a \ - libboot_sp.TWL$(CODEGEN).a \ - libreboot_sp.TWL$(CODEGEN).a \ - libcardboot_sp.TWL$(CODEGEN).a \ - $(USE_CRYPTO_LIBS) \ - $(ISDBG_LIBS) Library libsdio_hcd_twl.TWL$(CODEGEN).a \ libsdio_busdriver.TWL$(CODEGEN).a \ libsdio_lib.TWL$(CODEGEN).a \ + libARM7athdrv.TWL$(CODEGEN).a Object * (.etable) Object * (.wram) Object * (.ltdwram) Object $(OBJDIR)/main.o + + ##### + # Sub-routines in WL library , that should be on WRAM. + # in TaskMan.o + Object OBJECT( MainTaskRoutine , libwl_sp.TWL$(CODEGEN).a ) (.text) + Object OBJECT( AddTask , libwl_sp.TWL$(CODEGEN).a ) (.text) + Object OBJECT( DeleteTask , libwl_sp.TWL$(CODEGEN).a ) (.text) + Object OBJECT( LowestIdleTask , libwl_sp.TWL$(CODEGEN).a ) (.text) + Object OBJECT( ExecuteMessage , libwl_sp.TWL$(CODEGEN).a ) (.text) + # in BufMan.o + Object OBJECT( NewHeapBuf , libwl_sp.TWL$(CODEGEN).a ) (.text) + Object OBJECT( DeleteHeapBuf , libwl_sp.TWL$(CODEGEN).a ) (.text) + Object OBJECT( AllocateHeapBuf , libwl_sp.TWL$(CODEGEN).a ) (.text) + Object OBJECT( ReleaseHeapBuf , libwl_sp.TWL$(CODEGEN).a ) (.text) + Object OBJECT( MoveHeapBuf , libwl_sp.TWL$(CODEGEN).a ) (.text) + Object OBJECT( AddHeapBuf , libwl_sp.TWL$(CODEGEN).a ) (.text) + Object OBJECT( GetHeapBufNextAdrs , libwl_sp.TWL$(CODEGEN).a ) (.text) + # in WlCmdIf.o + Object OBJECT( RequestCmdTask , libwl_sp.TWL$(CODEGEN).a ) (.text) + Object OBJECT( SendMessageToWmDirect , libwl_sp.TWL$(CODEGEN).a ) (.text) + # in WlNic.o + Object OBJECT( WStart , libwl_sp.TWL$(CODEGEN).a ) (.text) + Object OBJECT( WStop , libwl_sp.TWL$(CODEGEN).a ) (.text) + Object OBJECT( WSetStaState , libwl_sp.TWL$(CODEGEN).a ) (.text) + # in WlIntr.o + Object OBJECT( WlIntr , libwl_sp.TWL$(CODEGEN).a ) (.text) + Object OBJECT( WlIntrPreTbtt , libwl_sp.TWL$(CODEGEN).a ) (.text) + Object OBJECT( WlIntrTbtt , libwl_sp.TWL$(CODEGEN).a ) (.text) + Object OBJECT( WlIntrActEnd , libwl_sp.TWL$(CODEGEN).a ) (.text) +# Object OBJECT( WlIntrAckCntOvf , libwl_sp.TWL$(CODEGEN).a ) (.text) + Object OBJECT( WlIntrCntOvf , libwl_sp.TWL$(CODEGEN).a ) (.text) + Object OBJECT( WlIntrTxErr , libwl_sp.TWL$(CODEGEN).a ) (.text) + Object OBJECT( WlIntrRxCntup , libwl_sp.TWL$(CODEGEN).a ) (.text) + Object OBJECT( WlIntrTxEnd , libwl_sp.TWL$(CODEGEN).a ) (.text) + Object OBJECT( WlIntrRxEnd , libwl_sp.TWL$(CODEGEN).a ) (.text) + Object OBJECT( WlIntrMpEnd , libwl_sp.TWL$(CODEGEN).a ) (.text) + Object OBJECT( WlIntrStartTx , libwl_sp.TWL$(CODEGEN).a ) (.text) + Object OBJECT( WlIntrStartRx , libwl_sp.TWL$(CODEGEN).a ) (.text) + Object OBJECT( SetParentTbttTxq , libwl_sp.TWL$(CODEGEN).a ) (.text) + Object OBJECT( MacBugTxMp , libwl_sp.TWL$(CODEGEN).a ) (.text) + Object OBJECT( AdjustRingPointer , libwl_sp.TWL$(CODEGEN).a ) (.text) + Object OBJECT( CheckKeyTxEnd , libwl_sp.TWL$(CODEGEN).a ) (.text) + # in WlIntrTask.o + Object OBJECT( WlIntrTxBeaconTask , libwl_sp.TWL$(CODEGEN).a ) (.text) + Object OBJECT( WlIntrTxEndTask , libwl_sp.TWL$(CODEGEN).a ) (.text) + Object OBJECT( WlIntrRxEndTask , libwl_sp.TWL$(CODEGEN).a ) (.text) + Object OBJECT( WlIntrMpEndTask , libwl_sp.TWL$(CODEGEN).a ) (.text) + Object OBJECT( SetParentTbttTxqTask , libwl_sp.TWL$(CODEGEN).a ) (.text) + Object OBJECT( TakeoutRxFrame , libwl_sp.TWL$(CODEGEN).a ) (.text) + # in TxCtrl.o + Object OBJECT( InitTxCtrl , libwl_sp.TWL$(CODEGEN).a ) (.text) + # in RxCtrl.o + Object OBJECT( InitRxCtrl , libwl_sp.TWL$(CODEGEN).a ) (.text) + # in WaitLoop.o + Object OBJECT( WaitLoop_Rxpe , libwl_sp.TWL$(CODEGEN).a ) (.text) + Object OBJECT( WaitLoop_Waitus , libwl_sp.TWL$(CODEGEN).a ) (.text) + Object OBJECT( WaitLoop_ClrAid , libwl_sp.TWL$(CODEGEN).a ) (.text) + Object OBJECT( WaitLoop_BbpAccess , libwl_sp.TWL$(CODEGEN).a ) (.text) + Object OBJECT( WaitLoop_RfAccess , libwl_sp.TWL$(CODEGEN).a ) (.text) + } #-------- @@ -79,6 +131,19 @@ Ltdautoload LTDMAIN After $(TARGET_NAME) Object * (.ltdmain) - Library libfatfs_sp.TWL$(CODEGEN).a - Library librompatch_sp.TWL$(CODEGEN).a + Library libnvram_sp.TWL$(CODEGEN).a + Library librtc_sp.TWL$(CODEGEN).a + Library librompatch_sp.TWL$(CODEGEN).a \ + libwm_sp.TWL$(CODEGEN).a \ + libnwm_sp.TWL$(CODEGEN).a \ + libwvr_sp.TWL$(CODEGEN).a \ + libwl_sp.TWL$(CODEGEN).a \ + libboot_sp.TWL$(CODEGEN).a \ + libreboot_sp.TWL$(CODEGEN).a \ + libcardboot_sp.TWL$(CODEGEN).a \ + + Library libfatfs_sp.TWL$(CODEGEN).a \ + $(USE_CRYPTO_LIBS) + Library $(ISDBG_LIBS_TWL) + Library $(ISDBG_LIBS_NITRO) } diff --git a/build/components/hyena.TWL/src/main.c b/build/components/hyena.TWL/src/main.c index 1dbf32f7..352bfa4a 100644 --- a/build/components/hyena.TWL/src/main.c +++ b/build/components/hyena.TWL/src/main.c @@ -39,10 +39,13 @@ #include #include +#include "nvram_sp.h" /*---------------------------------------------------------------------------* 定数定義 *---------------------------------------------------------------------------*/ +/* [TODO] Work around. Should be defined in wm_sp.h */ +#define WM_WL_HEAP_SIZE 0x2100 /* Priorities of each threads */ #define THREAD_PRIO_SPI 2 @@ -52,6 +55,16 @@ #define THREAD_PRIO_FS 15 /* OS_THREAD_LAUNCHER_PRIORITY 16 */ +/* [TODO] 以下は New WM 側に移行するほうが好ましい? */ +#define NWM_DMANO 3 +#define THREAD_PRIO_NWM_COMMMAND 6 +#define THREAD_PRIO_NWM_EVENT 4 +#define THREAD_PRIO_NWM_SDIO 5 +#define THREAD_PRIO_NWM_WPA 7 + +// ROM 内登録エリアの拡張言語コード +#define ROMHEADER_FOR_CHINA_BIT 0x80 +#define ROMHEADER_FOR_KOREA_BIT 0x40 /*---------------------------------------------------------------------------* 内部関数定義 @@ -60,8 +73,10 @@ static void ReadResetParameter( void ); static void PrintDebugInfo(void); static OSHeapHandle InitializeAllocateSystem(void); static void InitializeFatfs(void); +static void InitializeNwm(void); static void InitializeCdc(void); static void DummyThread(void* arg); +static void ReadUserInfo(void); static void VBlankIntr(void); /*---------------------------------------------------------------------------* @@ -89,11 +104,14 @@ TwlSpMain(void) // OS 初期化 OS_Init(); PrintDebugInfo(); - + + // NVRAM からユーザー情報読み出し + ReadUserInfo(); + // Cold/Hotスタート判定 - ReadResetParameter(); - SYSMi_GetWork()->isARM9Start = TRUE; // ※HW_RED_RESERVEDはNANDファームでクリアしておいて欲しい - + ReadResetParameter(); + SYSMi_GetWork()->isARM9Start = TRUE; // ※HW_RED_RESERVEDはNANDファームでクリアしておいて欲しい + // ヒープ領域設定 { void *wram = OS_GetWramSubPrivArenaHi(); @@ -122,7 +140,10 @@ TwlSpMain(void) if (OS_IsRunOnTwl() == TRUE) { InitializeFatfs(); // FATFS 初期化 + InitializeNwm(); // NWM 初期化 +#ifndef SDK_NOCRYPTO AES_Init(); // AES 初期化 +#endif } if (OSi_IsCodecTwlMode() == TRUE) @@ -142,6 +163,9 @@ TwlSpMain(void) // RTC 初期化 RTC_Init(THREAD_PRIO_RTC); + // 旧無線初期化 + WVR_Begin(heapHandle); + // SPI 初期化 SPI_Init(THREAD_PRIO_SPI); @@ -244,6 +268,41 @@ InitializeFatfs(void) } #include +#include +/*---------------------------------------------------------------------------* + Name: InitializeNwm + Description: NWMライブラリを初期化する。 + Arguments: None. + Returns: None. + *---------------------------------------------------------------------------*/ +static void +InitializeNwm(void) +{ + 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; +#ifdef WPA_BUILT_IN /* WPA が組み込まれる場合、以下のメンバが追加される */ + nwmInit.wpaPrio = THREAD_PRIO_NWM_WPA; + nwmInit.wpaHeap.id = OS_ARENA_MAIN_SUBPRIV; /* [TODO] */ + nwmInit.wpaHeap.handle = heapHandle; +#endif + NWMSP_Init(&nwmInit); + +} +#include + #include /*---------------------------------------------------------------------------* Name: InitializeCdc @@ -265,6 +324,7 @@ InitializeCdc(void) // CODEC 初期化 CDC_Init(); + CDC_InitMic(); // CDCi_DumpRegisters(); // ダミースレッド破棄 @@ -441,9 +501,69 @@ InitializeAllocateSystem(void) // カレントヒープに設定 (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; } +#ifdef WM_PRECALC_ALLOWEDCHANNEL +extern u16 WMSP_GetAllowedChannel(u16 bitField); +#endif +/*---------------------------------------------------------------------------* + Name: ReadUserInfo + + Description: NVRAMからユーザー情報を読み出し、共有領域に展開する。 + ミラーリングされているバッファが両方壊れている場合は、 + 共有領域のユーザー情報格納場所をクリアする。 + + Arguments: None. + + Returns: None. + *---------------------------------------------------------------------------*/ +static void ReadUserInfo(void) +{ + u8 *p; + + // 無線MACアドレスをユーザー情報の後ろに展開 + { + u8 wMac[6]; + + // NVRAMからMACアドレスを読み出し + NVRAM_ReadDataBytes(NVRAM_CONFIG_MACADDRESS_ADDRESS, 6, wMac); + // 展開先アドレスを計算 + p = (u8 *)((u32)p + ((sizeof(NVRAMConfig) + 3) & ~0x00000003)); + // 共有領域に展開 + MI_CpuCopy8(wMac, p, 6); + } + +#ifdef WM_PRECALC_ALLOWEDCHANNEL + // 使用可能チャンネルから使用許可チャンネルを計算 + { + u16 enableChannel; + u16 allowedChannel; + + // 使用可能チャンネルを読み出し + NVRAM_ReadDataBytes(NVRAM_CONFIG_ENABLECHANNEL_ADDRESS, 2, (u8 *)(&enableChannel)); + // 使用許可チャンネルを計算 + allowedChannel = WMSP_GetAllowedChannel((u16)(enableChannel >> 1)); + // 展開先アドレスを計算(MACアドレスの後ろの2バイト) + p = (u8 *)((u32)p + 6); + // 共有領域に展開 + *((u16 *)p) = allowedChannel; + } +#endif +} + /*---------------------------------------------------------------------------* Name: VBlankIntr diff --git a/build/systemMenu_RED/Launcher/ARM9/src/launcher.c b/build/systemMenu_RED/Launcher/ARM9/src/launcher.c index 4d38499b..a7b8292b 100644 --- a/build/systemMenu_RED/Launcher/ARM9/src/launcher.c +++ b/build/systemMenu_RED/Launcher/ARM9/src/launcher.c @@ -409,7 +409,7 @@ TitleProperty *LauncherMain( TitleProperty *pTitleList ) if( (pad.trg & PAD_BUTTON_START) || up_bl_trg ) { brightness = TSD_GetBacklightBrightness() + 1; - if( brightness > BACKLIGHT_LEVEL_MAX ) { + if( brightness > TWL_BACKLIGHT_LEVEL_MAX ) { brightness = 0; } SYSM_SetBackLightBrightness( (u8)brightness ); @@ -417,7 +417,7 @@ TitleProperty *LauncherMain( TitleProperty *pTitleList ) if( ( pad.trg & PAD_BUTTON_SELECT) || dw_bl_trg ) { brightness = TSD_GetBacklightBrightness() - 1; if( brightness < 0 ) { - brightness = BACKLIGHT_LEVEL_MAX; + brightness = TWL_BACKLIGHT_LEVEL_MAX; } SYSM_SetBackLightBrightness( (u8)brightness ); } diff --git a/include/sysmenu/settings/common/TWLSettings.h b/include/sysmenu/settings/common/TWLSettings.h index d168c001..80bd6c5f 100644 --- a/include/sysmenu/settings/common/TWLSettings.h +++ b/include/sysmenu/settings/common/TWLSettings.h @@ -38,6 +38,7 @@ extern "C" { #define TWL_COMMENT_LENGTH NTR_COMMENT_LENGTH // コメント長 #define TWL_COMMENT_BUFFERSIZE ( ( TWL_COMMENT_LENGTH + 1 ) * 2 ) // コメントバッファサイズ #define TWL_FAVORITE_COLOR_MAX_NUM NTR_FAVORITE_COLOR_MAX_NUM // 好きな色の最大数 +#define TWL_BACKLIGHT_LEVEL_MAX 22 // TWLバックライト最大輝度レベル #define TSD_TEMP_BUFFER_SIZE ( sizeof(TSDStore) * 2 ) // TSD_ReadTWLSettingsで必要なTempBufferサイズ