CUP不要時にもNUPバージョンをチェックして必要なら強制的にCUPするように

NUPバージョンをromfsから読み出すように
アプリ名の変更

git-svn-id: file:///Volumes/Transfer/gigaleak_20231201/2020-05-23%20-%20ctr.7z%20+%20svn_v1.068.zip/ctr/svn/ctr_Repair@355 385bec56-5757-e545-9c3a-d8741f4650f1
This commit is contained in:
N2614 2011-07-05 02:34:43 +00:00
parent 52efc9fe1e
commit 6b864c9c80
8 changed files with 355 additions and 200 deletions

View File

@ -0,0 +1,59 @@
/*---------------------------------------------------------------------------*
Project: Horizon
File: HeapManager.cpp
Copyright 2009 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.
$Rev$
*---------------------------------------------------------------------------*/
#include "HeapManager.h"
nn::fnd::ThreadSafeExpHeap s_AppHeap;
HeapManager::HeapManager(size_t byteSize, s32 alignment, bit8 groupId, nn::fnd::ExpHeapBase::AllocationMode mode, bool reuse)
{
m_Ptr = s_AppHeap.Allocate(byteSize, alignment, groupId, mode, reuse);
}
HeapManager::~HeapManager()
{
if(m_Ptr != NULL)
{
s_AppHeap.Free(m_Ptr);
}
}
void* HeapManager::GetAddr()
{
return m_Ptr;
}
void InitializeHeap()
{
s_AppHeap.Initialize(nn::os::GetDeviceMemoryAddress(), nn::os::GetDeviceMemorySize(), nn::os::ALLOCATE_OPTION_LINEAR);
}
size_t GetAllocatableSize(s32 alignment)
{
return s_AppHeap.GetAllocatableSize(alignment);
}
void* ForceAllocate(size_t byteSize, s32 alignment, bit8 groupId, nn::fnd::ExpHeapBase::AllocationMode mode, bool reuse)
{
return s_AppHeap.Allocate(byteSize, alignment, groupId, mode, reuse);
}
void ForceFree(void* ptr)
{
if(ptr != NULL)
{
s_AppHeap.Free(ptr);
}
}

View File

@ -0,0 +1,46 @@
/*---------------------------------------------------------------------------*
Project: Horizon
File: HeapManager.h
Copyright 2009 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.
$Rev$
*---------------------------------------------------------------------------*/
#ifndef HEAPMANAGER_H_
#define HEAPMANAGER_H_
#include <nn.h>
#include <nn/fnd.h>
class HeapManager
{
public:
explicit HeapManager(size_t byteSize, s32 alignment = nn::fnd::ExpHeapBase::DEFAULT_ALIGNMENT, bit8 groupId = 0,
nn::fnd::ExpHeapBase::AllocationMode mode = nn::fnd::ExpHeapBase::ALLOCATION_MODE_FIRST_FIT, bool reuse = false);
virtual ~HeapManager();
void* GetAddr();
private:
void* m_Ptr;
};
void InitializeHeap();
size_t GetAllocatableSize(s32 alignment = nn::fnd::ExpHeapBase::DEFAULT_ALIGNMENT);
// HeapManagerを使わず確保する場合のみ
void* ForceAllocate(size_t byteSize, s32 alignment = nn::fnd::ExpHeapBase::DEFAULT_ALIGNMENT, bit8 groupId = 0,
nn::fnd::ExpHeapBase::AllocationMode mode = nn::fnd::ExpHeapBase::ALLOCATION_MODE_FIRST_FIT, bool reuse = false);
// HeapManagerを使わず解放する場合のみ
void ForceFree(void* ptr);
#endif /* HEAPMANAGER_H_ */

View File

@ -23,19 +23,22 @@ INCLUDES += $(SAMPLED_DEMOS_COMMON_INCLUDE_DIR)
SOURCES[] =
main.cpp
scrollBuffer.cpp
VersionDetect.cpp
HeapManager.cpp
LIBS += lib_demo \
libnn_am \
libnn_cup \
libnn_ns \
ROMFS_ROOT = romfiles
DESCRIPTOR = $(HORIZON_ROOT)/resources/specfiles/SelfCup.desc
TARGET_PROGRAM = CardCup
TARGET_PROGRAM = SelfCupTool
TITLE = CardCup
ROM_SPEC_FILE = CardCup.rsf
TITLE = SelfCupTool
ROM_SPEC_FILE = SelfCupTool.rsf
CTR_BANNER_SPEC = $(TARGET_PROGRAM).bsf

Binary file not shown.

View File

@ -1,5 +1,6 @@
BasicInfo:
Title: SelfCup
Title: SelfCupTool
ProductCode: CTR-P-234A
BackupMemoryType: None
Logo: Nintendo
@ -13,6 +14,7 @@ TitleInfo:
SystemControlInfo:
AppType : Application
StackSize : 65536
Dependency:
- nwm
- socket

View File

@ -26,16 +26,18 @@
#include <nn/am.h>
#include <nn/ndm.h>
#include <nn/cfg.h>
#include <nn/ptm_Private.h>
#include <nn/cup.h>
#include "demo.h"
#include "scrollBuffer.h"
#include "VersionDetect.h"
#include "HeapManager.h"
namespace
{
const int s_GxHeapSize=0x800000;
nn::fnd::ExpHeap s_appHeap;
const s32 s_GxHeapSize = 0x800000;
uptr s_GxHeap;
demo::RenderSystemDrawing s_RenderSystem;
@ -47,9 +49,6 @@ namespace
// デモの初期化
void Initialize()
{
// os の初期化
nn::os::Initialize();
// NuiShellの初期化 (CUPに必須)
NN_UTIL_PANIC_IF_FAILED(nn::ns::CTR::InitializeForShell());
@ -74,15 +73,15 @@ namespace
nn::cfg::Initialize();
// デバイスメモリの設定
const int DEVICE_MEMORY_SIZE = 12*1024 * 1024;
const s32 DEVICE_MEMORY_SIZE = 32 * 1024 * 1024;
NN_UTIL_PANIC_IF_FAILED(nn::os::SetDeviceMemorySize(DEVICE_MEMORY_SIZE));
// ヒープの初期化
s_appHeap.Initialize(nn::os::GetDeviceMemoryAddress(), nn::os::GetDeviceMemorySize(), nn::os::ALLOCATE_OPTION_LINEAR);
InitializeHeap();
// 描画インスタンスの初期化
s_GxHeap = reinterpret_cast<uptr>(s_appHeap.Allocate(s_GxHeapSize));
s_RenderSystem.Initialize(s_GxHeap, s_GxHeapSize);
s_GxHeap = reinterpret_cast<uptr>(ForceAllocate(s_GxHeapSize));s_RenderSystem
.Initialize(s_GxHeap, s_GxHeapSize);
// 描画インスタンスの初期化
s_scrollBufferInstance.Initialize(&s_RenderSystem);
@ -107,7 +106,7 @@ namespace
// 動いていることを知らせるための、くるくる画面表示取得用メソッド
const char s_progress[] = "-\\|/";
int s_progressIndex=0;
s32 s_progressIndex = 0;
char GetProgressChar()
{
s_progressIndex = (s_progressIndex + 1) % (sizeof(s_progress) - 1);
@ -126,7 +125,8 @@ namespace
// ステータスがStartedになるまで、プログレスは取得できない
s_scrollBuffer->AppendText("");
do{
do
{
s_scrollBuffer->ReplaceText(" %c Initializing", GetProgressChar())->Render();
result = nn::cup::CTR::GetProgressInfo(&info);
NN_UTIL_RETURN_IF_FAILED(result);
@ -134,7 +134,8 @@ namespace
} while (info.state == nn::cup::CTR::UPDATE_STATE_INITIALIZING);
// 抜けた際のstateがFAILEDかどうか確認
if(info.state==nn::cup::CTR::UPDATE_STATE_FAILED){
if (info.state == nn::cup::CTR::UPDATE_STATE_FAILED)
{
NN_UTIL_RETURN_IF_FAILED(info.lastResult);
}
s_scrollBuffer->ReplaceText(" - Initialized (%lldmsec)", GetConsumedMillisec());
@ -142,18 +143,18 @@ namespace
/********************* アップデート中 ******************/
SetTick();
s_scrollBuffer->AppendText("")->Render();
do{
do
{
result = nn::cup::CTR::GetProgressInfo(&info);
NN_UTIL_RETURN_IF_FAILED(result);
s_scrollBuffer->ReplaceText(" %c Title %d/%d, size %lld/%lld",
GetProgressChar(),
info.numImportedTitles, info.numTotalTitles,
info.importedSize, info.totalSize)->Render();
s_scrollBuffer->ReplaceText(" %c Title %d/%d, size %lld/%lld", GetProgressChar(), info.numImportedTitles,
info.numTotalTitles, info.importedSize, info.totalSize)->Render();
nn::os::Thread::Sleep(nn::fnd::TimeSpan::FromMilliSeconds(40));
} while (info.state == nn::cup::CTR::UPDATE_STATE_STARTED);
// 抜けた際のstateがFAILEDかどうか確認
if(info.state==nn::cup::CTR::UPDATE_STATE_FAILED){
if (info.state == nn::cup::CTR::UPDATE_STATE_FAILED)
{
NN_UTIL_RETURN_IF_FAILED(info.lastResult);
}
s_scrollBuffer->AppendText(" - Imported (%lldmsec)", GetConsumedMillisec())->Render();
@ -161,14 +162,16 @@ namespace
/***************** アップデート終了中 ******************/
SetTick();
s_scrollBuffer->AppendText("")->Render();
do{
do
{
result = nn::cup::CTR::GetProgressInfo(&info);
NN_UTIL_RETURN_IF_FAILED(result);
s_scrollBuffer->ReplaceText(" %c Update Finalizing", GetProgressChar())->Render();
nn::os::Thread::Sleep(nn::fnd::TimeSpan::FromMilliSeconds(40));
} while (info.state == nn::cup::CTR::UPDATE_STATE_FINALIZING);
// 抜けた際のstateがFAILEDかどうか確認
if(info.state==nn::cup::CTR::UPDATE_STATE_FAILED){
if (info.state == nn::cup::CTR::UPDATE_STATE_FAILED)
{
NN_UTIL_RETURN_IF_FAILED(info.lastResult);
}
@ -188,25 +191,27 @@ namespace
s_scrollBuffer->AppendText("Initializing Cup Library")->Render();
SetTick(); // 初期化開始前の時間をセット
result = nn::cup::CTR::Initialize(s_updaterBuffer, sizeof(s_updaterBuffer));
if(result==nn::cup::CTR::ResultUpdatePartitionNotFound()){
if (result == nn::cup::CTR::ResultUpdatePartitionNotFound())
{
s_scrollBuffer->AppendText(" - Update Partition Not Found (%lldmsec)", GetConsumedMillisec())->Render();
s_scrollBuffer->AppendText("")->Render();
*isHandledError = true;
return result;
}
if(result==nn::cup::CTR::ResultUpdateNotRequired()){
if (result == nn::cup::CTR::ResultUpdateNotRequired())
{
s_scrollBuffer->AppendText(" - Already Updated (%lldmsec)", GetConsumedMillisec())->Render();
s_scrollBuffer->AppendText("")->Render();
*isHandledError = true;
return result;
}
if(result==nn::cup::CTR::ResultInvalidUpdatePartitionFormat()){
if (result == nn::cup::CTR::ResultInvalidUpdatePartitionFormat())
{
s_scrollBuffer->AppendText(" - Invalid Update Partition (%lldmsec)", GetConsumedMillisec())->Render();
s_scrollBuffer->AppendText("")->Render();
*isHandledError = true;
return result;
}
NN_UTIL_RETURN_IF_FAILED(result);
}NN_UTIL_RETURN_IF_FAILED(result);
s_scrollBuffer->AppendText(" - Need Update (%lldmsec)", GetConsumedMillisec())->Render();
s_scrollBuffer->AppendText("")->Render();
@ -224,6 +229,23 @@ namespace
}
}
nn::Result ExecuteCup(ScrollBuffer* scrollBuf)
{
nn::Result result;
bool isHandledError = false;
result = UpdateSequence(&isHandledError);
if (isHandledError == false && result.IsFailure())
{
{
// それ以外の場合は、Resultを表示
scrollBuf->AppendText(" - Unhandled Error: 0x%08x", result.GetPrintableBits());
scrollBuf->AppendText("")->Render();
}
}
return result;
}
extern "C" void nnMain()
{
NN_LOG("Start cup demo\n");
@ -255,21 +277,43 @@ extern "C" void nnMain()
break;
}
nn::am::ProgramInfo outInfos;
result = nn::am::GetProgramInfos(&outInfos, nn::fs::MEDIA_TYPE_NAND, &MMEN_PROGRAM_ID, 1);
if (result.IsSuccess())
{
result = ExecuteCup(s_scrollBuffer);
// CUP不要だがNUPバージョンのほうが新しかったら強制的に実行
if (result == nn::cup::CTR::ResultUpdateNotRequired())
{
// バージョンの取得
VerDef versionData;
GetSystemVersion(&versionData, region);
/******************** CUPの実行 *******************/
bool isHandledError = false;
result = UpdateSequence(&isHandledError);
if (isHandledError == false && result.IsFailure())
const size_t ROMFS_BUFFER_SIZE = 1024 * 32;
u8 buffer[ROMFS_BUFFER_SIZE];
result = nn::fs::MountRom(16, 16, buffer, ROMFS_BUFFER_SIZE);
if (result.IsSuccess())
{
nn::fs::FileReader fileReader;
result = fileReader.TryInitialize("rom:/nup_version.bin");
if (result.IsSuccess())
{
// それ以外の場合は、Resultを表示
s_scrollBuffer->AppendText(" - Unhandled Error: 0x%08x", result.GetPrintableBits());
s_scrollBuffer->AppendText("")->Render();
u8 buf[1024];
s32 readSize;
result = fileReader.TryRead(&readSize, buf, sizeof(buf));
if (result.IsSuccess())
{
if (versionData.nup.majorVersion < *reinterpret_cast<u8*>(buf))
{
// CUPバージョンを削除
result = nn::am::DeleteProgram(nn::fs::MEDIA_TYPE_NAND, cCupVerId[region]);
if (result.IsSuccess())
{
result = ExecuteCup(s_scrollBuffer);
}
}
}
}
}
}
}

View File

@ -0,0 +1 @@