From 89b4c7fdbac7643f49cf56b90c228bc623c9c912 Mon Sep 17 00:00:00 2001 From: N2614 Date: Fri, 4 Feb 2011 04:16:00 +0000 Subject: [PATCH] =?UTF-8?q?RTC=E3=83=87=E3=83=BC=E3=82=BF=E3=82=92?= =?UTF-8?q?=E7=A7=BB=E8=A1=8C=E3=81=99=E3=82=8B=E3=82=88=E3=81=86=E3=81=AB?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit git-svn-id: file:///Volumes/Transfer/gigaleak_20231201/2020-05-23%20-%20ctr.7z%20+%20svn_v1.068.zip/ctr/svn/ctr_Repair@14 385bec56-5757-e545-9c3a-d8741f4650f1 --- .../ConsoleBackup/ConsoleBackup.cpp | 13 +++- .../ConsoleBackup/ConsoleBackup.h | 1 + .../ConsoleBackup/Exporter.cpp | 27 +++++++ .../ConsoleRestore/ConsoleRestore.cpp | 14 ++-- .../ConsoleRestore/ConsoleRestore.h | 1 + .../ConsoleRestore/Controller.cpp | 16 ++++ .../ConsoleRestore/Importer.cpp | 73 +++++++++++++++++++ .../ConsoleRestore/Importer.h | 7 +- trunk/ConsoleDataMigration/common/FileName.h | 2 + 9 files changed, 144 insertions(+), 10 deletions(-) diff --git a/trunk/ConsoleDataMigration/ConsoleBackup/ConsoleBackup.cpp b/trunk/ConsoleDataMigration/ConsoleBackup/ConsoleBackup.cpp index 71f744d..a129e7b 100644 --- a/trunk/ConsoleDataMigration/ConsoleBackup/ConsoleBackup.cpp +++ b/trunk/ConsoleDataMigration/ConsoleBackup/ConsoleBackup.cpp @@ -74,6 +74,7 @@ size_t s_SizeofIvs; // IVSが読めるかどうか bool s_CanReadIvs = false; +nn::Handle s_McuSession; } // namespace @@ -132,6 +133,11 @@ u32 GetRenderTarget(u32 target, bool flip) } } +nn::Handle GetMcuHandle() +{ + return s_McuSession; +} + extern "C" void nnMain(void) { @@ -164,10 +170,9 @@ extern "C" void nnMain(void) result = nn::friends::detail::Initialize(); // mcuの初期化 - nn::Handle mcuSession; - nn::mcu::CTR::InitializeHwCheck(&mcuSession); + nn::mcu::CTR::InitializeHwCheck(&s_McuSession); - nn::mcu::CTR::HwCheck mcu(mcuSession); + nn::mcu::CTR::HwCheck mcu(s_McuSession); // ヒープの確保 common::HeapManager::GetHeap()->Initialize(nn::os::GetDeviceMemoryAddress(), nn::os::GetDeviceMemorySize(), nn::os::ALLOCATE_OPTION_LINEAR); @@ -418,7 +423,7 @@ extern "C" void nnMain(void) nn::fs::Unmount(common::SDMC_ARCHIVE_NAME); s_RenderSystem.Finalize(); - nn::mcu::CTR::FinalizeHwCheck(&mcuSession); + nn::mcu::CTR::FinalizeHwCheck(&s_McuSession); nn::friends::detail::Finalize(); nn::ps::Finalize(); nn::ptm::CTR::FinalizeForSystemMenu(); diff --git a/trunk/ConsoleDataMigration/ConsoleBackup/ConsoleBackup.h b/trunk/ConsoleDataMigration/ConsoleBackup/ConsoleBackup.h index 7258e85..e39aa34 100644 --- a/trunk/ConsoleDataMigration/ConsoleBackup/ConsoleBackup.h +++ b/trunk/ConsoleDataMigration/ConsoleBackup/ConsoleBackup.h @@ -27,6 +27,7 @@ bool CanReadIVS(); bool CanReadSerialNumber(); void GetSerialNumber(u8** serial, size_t* size); void GetIvs(void** ivs, size_t* size); +nn::Handle GetMcuHandle(); const u32 CONSOLE_WIDTH = 38; const u32 CONSOLE_HEIGHT = 24; diff --git a/trunk/ConsoleDataMigration/ConsoleBackup/Exporter.cpp b/trunk/ConsoleDataMigration/ConsoleBackup/Exporter.cpp index e7e2cb7..efbf88f 100644 --- a/trunk/ConsoleDataMigration/ConsoleBackup/Exporter.cpp +++ b/trunk/ConsoleDataMigration/ConsoleBackup/Exporter.cpp @@ -26,6 +26,7 @@ #include #include #include +#include #include "Exporter.h" #include "CommonLogger.h" @@ -337,6 +338,29 @@ void WriteTwlSoundData() WriteTwlData(common::TWL_SOUND); } +void WriteMcuRtcData() +{ + COMMON_LOGGER("Create RTC Backup.\n"); + nn::Result result; + nn::Handle handle = GetMcuHandle(); + + if(handle.IsValid()) + { + nn::mcu::CTR::HwCheck mcu(handle); + + nn::mcu::CTR::RtcData rtc; + result = mcu.GetRtcAll(&rtc); + NN_LOG("RTC = 20%02d/%02d/%02d %02d:%02d:%02d\n", rtc.m_Year, rtc.m_Month, rtc.m_Day, rtc.m_Hour, rtc.m_Minute, rtc.m_Second); + COMMON_LOGGER_RESULT_IF_FAILED_WITH_LINE(result); + + s_SdWriter.WriteBuf(common::MCU_RTC_PATHNAME, &rtc, sizeof(rtc)); + } + else + { + NN_LOG("invalid handle\n"); + } +} + void ExportThreadFunc() { nn::Result result; @@ -449,6 +473,9 @@ void ExportData() // TWLサウンド領域のデータをSDに書き出す WriteTwlSoundData(); + // RTCをSDに書き出す + WriteMcuRtcData(); + // NANDのセーブデータをSDに書き出す WriteSaveData(); diff --git a/trunk/ConsoleDataMigration/ConsoleRestore/ConsoleRestore.cpp b/trunk/ConsoleDataMigration/ConsoleRestore/ConsoleRestore.cpp index 25108c5..11c12e2 100644 --- a/trunk/ConsoleDataMigration/ConsoleRestore/ConsoleRestore.cpp +++ b/trunk/ConsoleDataMigration/ConsoleRestore/ConsoleRestore.cpp @@ -55,7 +55,7 @@ namespace { const size_t s_GxHeapSize = 0x800000; demo::RenderSystemDrawing s_RenderSystem; -nn::Handle mcuSession; +nn::Handle s_McuSession; const u16 PROGRESS_MAX_LINES = 160; @@ -142,7 +142,7 @@ void FinalizeAll() nn::fs::Unmount("sdmc:"); s_RenderSystem.Finalize(); - nn::mcu::CTR::FinalizeHwCheck(&mcuSession); + nn::mcu::CTR::FinalizeHwCheck(&s_McuSession); nn::friends::detail::Finalize(); nn::ps::Finalize(); nn::ptm::CTR::FinalizeForSystemMenu(); @@ -155,6 +155,11 @@ void FinalizeAll() nn::applet::CloseApplication(); } +nn::Handle GetMcuHandle() +{ + return s_McuSession; +} + extern "C" void nnMain(void) { nn::Result result; @@ -186,9 +191,8 @@ extern "C" void nnMain(void) result = nn::friends::detail::Initialize(); // mcuの初期化 - nn::mcu::CTR::InitializeHwCheck(&mcuSession); - - nn::mcu::CTR::HwCheck mcu(mcuSession); + nn::mcu::CTR::InitializeHwCheck(&s_McuSession); + nn::mcu::CTR::HwCheck mcu(s_McuSession); // amの初期化 nn::am::InitializeForSystemMenu(); diff --git a/trunk/ConsoleDataMigration/ConsoleRestore/ConsoleRestore.h b/trunk/ConsoleDataMigration/ConsoleRestore/ConsoleRestore.h index 5ed81ea..59a892f 100644 --- a/trunk/ConsoleDataMigration/ConsoleRestore/ConsoleRestore.h +++ b/trunk/ConsoleDataMigration/ConsoleRestore/ConsoleRestore.h @@ -27,6 +27,7 @@ bool CanReadIVS(); bool CanReadSerialNumber(); void GetSerialNumber(u8** serial, size_t* size); void GetIvs(void** ivs, size_t* size); +nn::Handle GetMcuHandle(); void FinalizeAll(); diff --git a/trunk/ConsoleDataMigration/ConsoleRestore/Controller.cpp b/trunk/ConsoleDataMigration/ConsoleRestore/Controller.cpp index cf625a5..7fceb67 100644 --- a/trunk/ConsoleDataMigration/ConsoleRestore/Controller.cpp +++ b/trunk/ConsoleDataMigration/ConsoleRestore/Controller.cpp @@ -17,6 +17,7 @@ #include #include #include +#include #include "Controller.h" #include "ConsoleRestore.h" @@ -137,6 +138,17 @@ void PutAliveMessage(::std::vector& operationMessage, const char* s i += 4; } +void ExecSyncMcuRtc() +{ + if(!ExistsRtcSyncFinishedFile()) + { + ImportMcuRtc(); + // 時計を無効化する + nn::ptm::CTR::InvalidateSystemTime(); + CreateRtcSyncFinishedFile(); + } +} + void ControlState(::std::vector& operationMessage, bool& nextStep, bool& continueRestore) { // 状態遷移Controller @@ -465,6 +477,10 @@ void ControlState(::std::vector& operationMessage, bool& nextStep, if (nextStep) { + // RTC同期を行う + // RTC書き込み後できるだけ早いタイミングで再起動したいのでここで同期 + ExecSyncMcuRtc(); + s_RestoreState = REBOOTING; } } diff --git a/trunk/ConsoleDataMigration/ConsoleRestore/Importer.cpp b/trunk/ConsoleDataMigration/ConsoleRestore/Importer.cpp index 0d109f5..772e768 100644 --- a/trunk/ConsoleDataMigration/ConsoleRestore/Importer.cpp +++ b/trunk/ConsoleDataMigration/ConsoleRestore/Importer.cpp @@ -30,6 +30,8 @@ #include #include #include +#include +#include #include "FileName.h" #include "Importer.h" @@ -295,6 +297,11 @@ bool ExistsAPSetting() return ExistsFile(EXISTS_AP_SETTING); } +bool ExistsRtcSyncFinishedFile() +{ + return ExistsFile(EXISTS_RTC_SYNC_FINISHED); +} + bool EqualsIVSFileandIVS() { nn::Result result; @@ -435,6 +442,67 @@ void ImportCountryLanguageData() } } +inline u8 DecimalToBcd(u8 param) +{ + u8 theTen, theOne; + theTen = param / 10; + theOne = param - theTen * 10; + return (theTen << 4 | theOne); +} + +void ImportMcuRtc() +{ + COMMON_LOGGER("Import RTC Data.\n"); + nn::Result result; + nn::Handle handle = GetMcuHandle(); + + if(handle.IsValid()) + { + + size_t bufSize = common::HeapManager::GetHeap()->GetAllocatableSize(); + NN_LOG("AllocatableSize = %d\n", bufSize); + + void* buf = common::HeapManager::GetHeap()->Allocate(bufSize); + if (buf != NULL) + { + common::SdReaderWriter sdReader; + + size_t readSize; + result = sdReader.ReadBuf(common::MCU_RTC_PATHNAME, buf, bufSize, &readSize); + if (result.IsSuccess()) + { + // mcuを使ってセットする + nn::mcu::CTR::HwCheck mcu(handle); + nn::mcu::CTR::RtcData* rtc = reinterpret_cast(buf); + NN_LOG("RTC = 20%02d/%02d/%02d %02d:%02d:%02d\n", rtc->m_Year, rtc->m_Month, rtc->m_Day, rtc->m_Hour, rtc->m_Minute, rtc->m_Second); + + // BCD変換が必要 + + size_t RTC_PARAM_SIZE = sizeof(nn::mcu::CTR::RtcData); + u8 bcd[RTC_PARAM_SIZE]; + for (int i = 0; i < RTC_PARAM_SIZE; i++) + { + bcd[i] = DecimalToBcd(reinterpret_cast(rtc)[i]); + } + + result = mcu.WriteBySend(nn::drivers::mcu::CTR::MCU_RTC_SEC_ADDR, bcd, RTC_PARAM_SIZE); + + COMMON_LOGGER_RESULT_IF_FAILED_WITH_LINE(result); + } + else + { + COMMON_LOGGER_RESULT_WITH_LINE(result , __LINE__); + } + + common::HeapManager::GetHeap()->Free(buf); + } + else + { + COMMON_LOGGER("Failed Allocate Heap!!\n"); + } + } +} + void InitializeFileSystem() { nn::Result result; @@ -748,6 +816,11 @@ void CreateUpdateFinishedFile() CreateEmptyFile(common::UPDATE_CHECK_PATHNAME); } +void CreateRtcSyncFinishedFile() +{ + CreateEmptyFile(common::RTC_SYNC_CHECK_PATHNAME); +} + u32 GetImportProgress() { return common::GetProgress(); diff --git a/trunk/ConsoleDataMigration/ConsoleRestore/Importer.h b/trunk/ConsoleDataMigration/ConsoleRestore/Importer.h index 28042e9..757f772 100644 --- a/trunk/ConsoleDataMigration/ConsoleRestore/Importer.h +++ b/trunk/ConsoleDataMigration/ConsoleRestore/Importer.h @@ -31,6 +31,7 @@ typedef enum FILE_EXISTS_CHECK EXISTS_CONSOLE_INTIALIZED, EXISTS_WRITE_FINISHED, EXISTS_AP_SETTING, + EXISTS_RTC_SYNC_FINISHED, EXISTS_MAX } FileExistsCheck; @@ -41,7 +42,8 @@ const wchar_t* const FILENAME_TABLE[EXISTS_MAX] = common::IVS_PATHNAME, common::INITIALIZED_CHECK_PATHNAME, common::WRITE_FINISHED_PATHNAME, - common::AP_SETTING_PATHNAME + common::AP_SETTING_PATHNAME, + common::RTC_SYNC_CHECK_PATHNAME }; bool ExistsUpdateCheckedFile(); @@ -53,12 +55,14 @@ void InitializeFileCheck(); u8* ReadSerialNumber(); bool ExistsWriteFinishedFile(); bool ExistsAPSetting(); +bool ExistsRtcSyncFinishedFile(); bool IsImportFinished(); void ImportData(); void CreateWriteFinishedFile(); void CreateUpdateFinishedFile(); void CreateConsoleInitializedFile(); +void CreateRtcSyncFinishedFile(); u32 GetImportProgress(); // NANDのごみを削除する @@ -87,6 +91,7 @@ struct CheckedNetworkSetting CheckedNetworkSetting* GetTempNetworkSetting(); void ImportCountryLanguageData(); +void ImportMcuRtc(); // TWL写真領域を初期化してから本体初期化を行う void InitializeFileSystem(); diff --git a/trunk/ConsoleDataMigration/common/FileName.h b/trunk/ConsoleDataMigration/common/FileName.h index 939bb33..f43c4ba 100644 --- a/trunk/ConsoleDataMigration/common/FileName.h +++ b/trunk/ConsoleDataMigration/common/FileName.h @@ -34,6 +34,7 @@ const wchar_t* const AP_SETTING_FILENAME = L"APSetting.txt"; const wchar_t* const AP_SETTING_PATHNAME = L"sdmc:/APSetting.txt"; const wchar_t* const NOR_PATHNAME = L"sdmc:/NtrNorSetting.bin"; const wchar_t* const SERIAL_PATHNAME = L"sdmc:/serial.bin"; +const wchar_t* const MCU_RTC_PATHNAME = L"sdmc:/rtc.bin"; const wchar_t* const IVS_NAND_PATHNAME = L"nand:/private/movable.sed"; const wchar_t* const IVS_PATHNAME = L"sdmc:/movable.sed"; const wchar_t* const NAND_DATA_ROOT_PATHNAME_WITH_SLASH = L"nand:/data/"; @@ -43,6 +44,7 @@ const wchar_t* const SDMC_ROOT_DIRECTORY_PATH = L"sdmc:/"; const wchar_t* const WRITE_FINISHED_PATHNAME = L"sdmc:/WriteFinished"; const wchar_t* const UPDATE_CHECK_PATHNAME = L"sdmc:/UpdateFinished"; const wchar_t* const INITIALIZED_CHECK_PATHNAME = L"sdmc:/ConsoleInitialized"; +const wchar_t* const RTC_SYNC_CHECK_PATHNAME = L"sdmc:/RtcSyncFinished"; enum TWL_PATHNAME {