From 8c56c5a0872ef92cdf0aa6f6a3ce9b9136c40566 Mon Sep 17 00:00:00 2001 From: miya Date: Thu, 18 Dec 2008 07:38:50 +0000 Subject: [PATCH] git-svn-id: file:///Users/lillianskinner/Downloads/platinum/twl/TwlToolsRED@96 7061adef-622a-194b-ae81-725974e89856 --- build/tools/sctools/common/src/mydata.h | 2 +- build/tools/sctools/common/src/mynvram.c | 176 +++++++++++---- .../sctools/copy_dst/src/hatamotolib.cpp | 30 +++ build/tools/sctools/copy_dst/src/main.c | 202 ++++++++++++------ build/tools/sctools/copy_dst/src/ntp.c | 79 ++++--- 5 files changed, 349 insertions(+), 140 deletions(-) diff --git a/build/tools/sctools/common/src/mydata.h b/build/tools/sctools/common/src/mydata.h index f0135eb..04d52f1 100644 --- a/build/tools/sctools/common/src/mydata.h +++ b/build/tools/sctools/common/src/mydata.h @@ -3,7 +3,7 @@ #define MY_DATA_VERSION_MAJOR 1 -#define MY_DATA_VERSION_MINOR 1 +#define MY_DATA_VERSION_MINOR 2 typedef struct { u8 version_major; diff --git a/build/tools/sctools/common/src/mynvram.c b/build/tools/sctools/common/src/mynvram.c index f668486..01ee560 100644 --- a/build/tools/sctools/common/src/mynvram.c +++ b/build/tools/sctools/common/src/mynvram.c @@ -1,6 +1,7 @@ #include #include +#include #include "font.h" #include "text.h" @@ -133,17 +134,28 @@ static void ReportLastErrorPath(const char *path) } + +static u8 my_nor_buf[NVRAM_PERSONAL_DATA_SIZE] ATTRIBUTE_ALIGN(32); +static u8 work_content[NCFG_CHECKCONFIGEX_WORK_SIZE]; + BOOL nvram_backup(char *path) { BOOL bSuccess; + BOOL ret_flag = TRUE; FSFile nor_fd; u32 offset; - u32 vol; int len; -#define BUF_SIZE 0x100 - u8 nor_buf[BUF_SIZE]; + char *nor_file_path = path; + void *work = (void *)work_content; + + MI_CpuClear8(work, NCFG_CHECKCONFIGEX_WORK_SIZE); + if( NCFG_RESULT_INIT_OK != NCFG_CheckConfigEx( work ) ) { + return FALSE; + } + + FS_InitFile(&nor_fd); // STD_TSNPrintf(nor_file_path, sizeof(nor_file_path), path ); @@ -167,29 +179,25 @@ BOOL nvram_backup(char *path) if( offset == 0 ) { OS_TPrintf( "nvram error: offset = 0x%02x\n", offset); + (void)FS_CloseFile(&nor_fd); return FALSE; } offset *= 8; offset -= 0xA00; - for( vol = 0 ; vol < NVRAM_PERSONAL_DATA_SIZE ; vol += BUF_SIZE ) { - if( TRUE != my_nvram_read( offset+vol , BUF_SIZE, (void* )nor_buf) ) { - OS_TPrintf( "nvram error: %s %s %d\n",__FILE__,__FUNCTION__,__LINE__); - } - else { -#if 0 - len = FS_WriteFile(&nor_fd, nor_buf, BUF_SIZE); -#else - len = my_fs_crypto_write(&nor_fd, nor_buf, BUF_SIZE); -#endif - if (len != BUF_SIZE) - { - OS_TPrintf("FS_WriteFile() failed."); - break; - } + if( TRUE != my_nvram_read( offset , NVRAM_PERSONAL_DATA_SIZE, (void* )my_nor_buf) ) { + OS_TPrintf( "nvram error: %s %s %d\n",__FILE__,__FUNCTION__,__LINE__); + ret_flag = FALSE; + } + else { + len = my_fs_crypto_write(&nor_fd, my_nor_buf, NVRAM_PERSONAL_DATA_SIZE); + if (len != NVRAM_PERSONAL_DATA_SIZE) { + OS_TPrintf("FS_WriteFile() failed."); + ret_flag = FALSE; } } + OS_TPrintf("\n"); FS_FlushFile(&nor_fd); @@ -197,21 +205,34 @@ BOOL nvram_backup(char *path) bSuccess = FS_CloseFile(&nor_fd); // OS_TPrintf( "nvram read completed.\n"); - return TRUE; + return ret_flag; } + +typedef struct tagDWCWiFiInfo { + u64 attestedUserId; // ユーザ ID (認証済み) + u64 notAttestedId; // ユーザ ID (認証前) + u16 pass; // パスワード + u16 randomHistory; // 乱数履歴 +} DWCWiFiInfo; + BOOL nvram_restore(char *path) { BOOL bSuccess; + BOOL ret_flag = TRUE; FSFile nor_fd; u32 offset; - u32 vol; int len; // char nor_file_path[FS_FILE_NAME_MAX]; char *nor_file_path = path; - -#define BUF_SIZE 0x100 - u8 nor_buf[BUF_SIZE]; + NCFGConfig *p_ncfgc = NULL; +#if 0 + DWCWiFiInfo buf_content; + DWCWiFiInfo *buf = &buf_content; + u8 Wifi[14]; +#endif + u64 id1; + u64 id2; FS_InitFile(&nor_fd); // STD_TSNPrintf(nor_file_path, sizeof(nor_file_path), path ); @@ -224,6 +245,7 @@ BOOL nvram_restore(char *path) /* offsetアドレスの取得 */ if( TRUE != my_nvram_read( NVRAM_PERSONAL_DATA_OFFSET , sizeof(u16), (void* )&offset) ) { OS_TPrintf( "nvram error: %s %s %d\n",__FILE__,__FUNCTION__,__LINE__); + ret_flag = FALSE; } else { OS_TPrintf( "nvram success: offset = 0x%02x\n", offset); @@ -234,34 +256,114 @@ BOOL nvram_restore(char *path) return FALSE; } + /* offsetのチェックは? */ offset *= 8; offset -= 0xA00; - for( vol = 0 ; vol < NVRAM_PERSONAL_DATA_SIZE ; vol += BUF_SIZE ) { - OS_TPrintf("."); + len = my_fs_crypto_read(&nor_fd, my_nor_buf, NVRAM_PERSONAL_DATA_SIZE); + if (len != NVRAM_PERSONAL_DATA_SIZE) { + ret_flag = FALSE; + OS_TPrintf("FS_ReadFile() failed."); + } + + + p_ncfgc = (NCFGConfig *)my_nor_buf; + + // DWCWiFiInfo *buf; + // u8 Wifi[14]; + + // > となります。DWCライブラリによる修復を使わない場合は + // > ・0x0f0と0x1f0にあるIDを確認して、両方のIDが同じ、かつ0でない場合にコピーする +#if 0 + MI_CpuCopy8(&p_ncfgc->slot[0].wifi[0], Wifi, 14); + MI_CpuCopy8(&Wifi[ 0], &buf->attestedUserId, 6); + buf->attestedUserId &= 0x07FFFFFFFFFF; + + MI_CpuCopy8(&Wifi[ 5], &buf->notAttestedId, 6); + buf->notAttestedId >>= 3; + buf->notAttestedId &= 0x07FFFFFFFFFF; + MI_CpuCopy8(&Wifi[10], &buf->pass, 2); + buf->pass >>= 6; + buf->pass &= 0x03FF; + MI_CpuCopy8(&Wifi[12], &buf->randomHistory, 2); + + id1 = buf->attestedUserId; +#else + // MI_CpuCopy8(&p_ncfgc->slot[0].wifi[0], &id1, 6); + MI_CpuCopy8(&my_nor_buf[0x600+ 0xf0], &id1, 6); + id1 &= 0x07FFFFFFFFFF; +#endif + #if 0 - len = FS_ReadFile(&nor_fd, nor_buf, BUF_SIZE); -#else - len = my_fs_crypto_read(&nor_fd, nor_buf, BUF_SIZE); -#endif - if (len != BUF_SIZE) { - OS_TPrintf("FS_ReadFile() failed."); - break; - } + MI_CpuCopy8(&p_ncfgc->slot[1].wifi[0], Wifi, 14); + MI_CpuCopy8(&Wifi[ 0], &buf->attestedUserId, 6); + buf->attestedUserId &= 0x07FFFFFFFFFF; + MI_CpuCopy8(&Wifi[ 5], &buf->notAttestedId, 6); + buf->notAttestedId >>= 3; + buf->notAttestedId &= 0x07FFFFFFFFFF; + MI_CpuCopy8(&Wifi[10], &buf->pass, 2); + buf->pass >>= 6; + buf->pass &= 0x03FF; + MI_CpuCopy8(&Wifi[12], &buf->randomHistory, 2); - if( TRUE != my_nvram_write( offset+vol , BUF_SIZE, (void* )nor_buf) ) { + id2 = buf->attestedUserId; +#else + // MI_CpuCopy8(&p_ncfgc->slot[1].wifi[0], &id2, 6); + MI_CpuCopy8(&my_nor_buf[0x600+ 0x1f0], &id2, 6); + id2 &= 0x07FFFFFFFFFF; +#endif + + if( (id1 == id2) && (id1 != 0) ) { + if( TRUE != my_nvram_write( offset , /* size */ NVRAM_PERSONAL_DATA_SIZE, (void* )my_nor_buf) ) { + ret_flag = FALSE; OS_TPrintf( "nvram write error: %s %s %d\n",__FILE__,__FUNCTION__,__LINE__); } - else { - } } + else { + OS_TPrintf( "nvram write id1 id2 - 0 %s %s %d\n",__FILE__,__FUNCTION__,__LINE__); + ret_flag = 3; + } + + /* + #define NVRAM_PERSONAL_DATA_OFFSET 0x20 + + Wifi設定だけなら0x0A00 + #define NVRAM_PERSONAL_DATA_SIZE 0x0A00 + #define NVRAM_INTERNAL_BUF_SIZE 0x100 + + + ・NORの0x20から2byteを読み出し、8倍する(だいたい0x1fe00ぐらいになる) + ・そこから-0x400した値(だいたい0x1fa00)がWi-Fiユーザー情報の先頭となる + + + そして、本IDが有るか、無いかの確認は + Wi-Fiユーザー情報の0xf0から14byteがWi-FiコネクションID情報になります。 + この14byteのWi-FiコネクションID情報の後ろ43bitが認証済みユーザーIDが格納される + 場所となりますので、ここの値がすべて「0」の場合は、本IDが無いと見なす事ができます。 + # 詳細は添付の資料をご確認ください。 + # 資料はDSのものですが、Wi-FiコネクションID情報の部分は共通となります。 + + そして、今回のツールで修正をお願いしたい内容としましては + ・上記のWi-FiコネクションID情報に本IDが存在しない場合は、 +  Wi-Fiユーザー情報全てを移行しない + になります。 + + 移行しない領域は + ・Wi-Fiユーザー情報の先頭(だいたい0x1fa00)から更に-0x600したところ(だいたい0x1f400) +  から0x1000byte +  # -0x600にはTWLで拡張された領域が入ります。 + と、なります。 + */ + + + OS_TPrintf("\n"); bSuccess = FS_CloseFile(&nor_fd); OS_TPrintf( "nvram write completed.\n"); - return TRUE; + return ret_flag; } diff --git a/build/tools/sctools/copy_dst/src/hatamotolib.cpp b/build/tools/sctools/copy_dst/src/hatamotolib.cpp index 1bca0b9..b881533 100644 --- a/build/tools/sctools/copy_dst/src/hatamotolib.cpp +++ b/build/tools/sctools/copy_dst/src/hatamotolib.cpp @@ -439,6 +439,34 @@ BOOL WaitEC(ECOpId opId) miya_log_fprintf(log_fd, "%s Failed to EC_GetProgress, result=%d %s\n", __FUNCTION__, result, GetECErrorString(result)); mprintf("EC_GetProgress failed %d\n %s\n", result, GetECErrorString(result)); + + if( MI_CpuComp8(&progress_prev, &progress, sizeof(progress)) != 0 ) { + miya_log_fprintf(log_fd, "---------\n"); + miya_log_fprintf(log_fd, "progress report\n"); + miya_log_fprintf(log_fd, " status %5d %s\n", progress.status, + GetECErrorString(progress.status)); + miya_log_fprintf(log_fd, " operation %5d %s\n", progress.operation, + GetECOperationString(progress.operation)); + miya_log_fprintf(log_fd, " phase %5d %s\n", progress.phase, + GetECOpPhaseString(progress.phase)); + miya_log_fprintf(log_fd, " isCancelRequested %5d\n", progress.isCancelRequested); + miya_log_fprintf(log_fd, " totalSize %5d\n", progress.totalSize); + miya_log_fprintf(log_fd, " downloadedSize %5d\n", progress.downloadedSize); + miya_log_fprintf(log_fd, " errCode %5d\n", progress.errCode); + miya_log_fprintf(log_fd, " errInfo %s\n", progress.errInfo); + progress_prev = progress; + /* + progress report + status -4015 EC_ERROR_WS_REPORT + operation 12 EC_OP_Transfer + phase 2 EC_PHASE_Done + isCancelRequested 0 + totalSize 0 + downloadedSize 553 + errCode -5986 + errInfo IAS - TWL device unmatched + */ + } return FALSE; } @@ -686,6 +714,8 @@ int ECDownload(const NAMTitleId* pTitleIds, u32 numTitleIds) char status; // BOOL ret_flag; + STD_MemSet((void *)challenge,(int)0, EC_CHALLENGE_BUF_SIZE); + mprintf("-check registration.. "); miya_log_fprintf(log_fd, "-check registration..."); status = CheckRegistration(); diff --git a/build/tools/sctools/copy_dst/src/main.c b/build/tools/sctools/copy_dst/src/main.c index 0089d0f..41989c7 100644 --- a/build/tools/sctools/copy_dst/src/main.c +++ b/build/tools/sctools/copy_dst/src/main.c @@ -22,6 +22,7 @@ #include "ecdl.h" #include +#include #include @@ -62,6 +63,11 @@ #define THREAD_COMMAND_USERDATA_AND_WIFI_FUNCTION 3 #define THREAD_COMMAND_REBOOT_FUNCTION 4 + +#define FREE_REG_POWERON_REBOOT 0x00 +#define FREE_REG_RESTOREMODE_REBOOT 0x55 +#define FREE_REG_RESTOREMODE_AND_RTC_DONE_REBOOT 0x66 + // #define MIYA_MCU 1 static BOOL only_wifi_config_data_trans_flag = FALSE; @@ -70,7 +76,6 @@ static BOOL no_network_flag = FALSE; static BOOL completed_flag = FALSE; static FSEventHook sSDHook; static BOOL sd_card_flag = FALSE; -//static BOOL reboot_flag = FALSE; static BOOL ec_download_success_flag = TRUE; @@ -81,6 +86,7 @@ static BOOL development_console_flag = FALSE; static u8 org_region = 0; static u64 org_fuseId = 0; static volatile BOOL reboot_flag; +static BOOL reboot_rtc_adjust_done_flag; static int miya_debug_level = 0; @@ -196,6 +202,80 @@ static BOOL start_my_thread(u32 command) } +static void RTC_NTP_SYNC(void) +{ + RTCDate rtc_date; + RTCTime rtc_time; + + if( TRUE == my_ntp_init() ) { + rtc_date.year = (u32)( my_ntp_get_year() - 2000 ); + rtc_date.month = (u32)(my_ntp_get_month() + 1 ); + rtc_date.day = (u32)my_ntp_get_day(); + rtc_date.week = (RTCWeek)my_ntp_get_weekday(); + + rtc_time.hour = (u32)my_ntp_get_hour(); + rtc_time.minute = (u32)my_ntp_get_min(); + rtc_time.second = (u32)my_ntp_get_sec(); + + //RTCDate rtc_date; + //RTCTime rtc_time; + /* + typedef enum RTCWeek + { + RTC_WEEK_SUNDAY = 0, // 日曜日 + RTC_WEEK_MONDAY, // 月曜日 + RTC_WEEK_TUESDAY, // 火曜日 + RTC_WEEK_WEDNESDAY, // 水曜日 + RTC_WEEK_THURSDAY, // 木曜日 + RTC_WEEK_FRIDAY, // 金曜日 + RTC_WEEK_SATURDAY, // 土曜日 + RTC_WEEK_MAX + } + RTCWeek; + + typedef struct RTCDate + { + u32 year; // 年 ( 0 ~ 99 ) + u32 month; // 月 ( 1 ~ 12 ) + u32 day; // 日 ( 1 ~ 31 ) + RTCWeek week; // 曜日 + + } + RTCDate; + + // 時刻構造体 + typedef struct RTCTime + { + u32 hour; // 時 ( 0 ~ 23 ) + u32 minute; // 分 ( 0 ~ 59 ) + u32 second; // 秒 ( 0 ~ 59 ) + + } + RTCTime; + */ + + if( RTC_RESULT_SUCCESS != RTC_SetDate( &rtc_date ) ) { + mprintf("RTC data adjust error\n"); + } + else { + mprintf("RTC data adjust success\n"); + } + + if( RTC_RESULT_SUCCESS != RTC_SetTime( &rtc_time ) ) { + mprintf("RTC time adjust error\n"); + } + else { + mprintf("RTC time adjust success\n"); + } + reboot_rtc_adjust_done_flag = TRUE; + } + else { + mprintf("RTC-NTP sync. NG\n"); + } +} + + + static BOOL LoadWlanConfig(void) { u8 buf[256]; @@ -313,7 +393,14 @@ static BOOL RestoreFromSDCard1(void) ちなみにすでにMydataLoad関数は成功しているものとする。 したがって MyData mydata にはデータが入っている。 */ - if( (mydata.rtc_date_flag == TRUE) && (mydata.rtc_time_flag == TRUE) ) { + + if( reboot_rtc_adjust_done_flag == TRUE ) { + mprintf("RTC-NTP sync. already done. "); + m_set_palette(tc[0], M_TEXT_COLOR_GREEN ); /* green */ + mprintf("OK.\n"); + m_set_palette(tc[0], M_TEXT_COLOR_WHITE ); + } + else if( (mydata.rtc_date_flag == TRUE) && (mydata.rtc_time_flag == TRUE) ) { mprintf("RTC data restore "); if( RTC_RESULT_SUCCESS != RTC_SetDate( &(mydata.rtc_date) ) ) { flag = FALSE; @@ -372,9 +459,16 @@ static BOOL RestoreFromSDCard2(void) static BOOL RestoreFromSDCard3(void) { // static BOOL SDBackupToSDCard2(void) + BOOL flag; if( mydata.wireless_lan_param_flag == TRUE ) { mprintf("WirelessLAN param. restore "); - if( TRUE == nvram_restore( MyFile_GetWifiParamFileName() ) ) { + flag = nvram_restore( MyFile_GetWifiParamFileName() ); + if( flag == 3 ) { + m_set_palette(tc[0], M_TEXT_COLOR_GREEN ); + mprintf("OK*\n"); + m_set_palette(tc[0], M_TEXT_COLOR_WHITE ); + } + else if( TRUE == flag ) { m_set_palette(tc[0], M_TEXT_COLOR_GREEN ); mprintf("OK.\n"); m_set_palette(tc[0], M_TEXT_COLOR_WHITE ); @@ -430,7 +524,8 @@ static BOOL RestoreFromSDCard5(void) if( mydata.num_of_shared2_files > 0 ) { mprintf("App. shared files restore "); if( TRUE == RestoreDirEntryList( MyFile_GetAppSharedListFileName(), - MyFile_GetAppSharedRestoreLogFileName(), &list_count, &error_count )) { + MyFile_GetAppSharedRestoreLogFileName(), + &list_count, &error_count )) { m_set_palette(tc[0], M_TEXT_COLOR_GREEN ); mprintf("OK.\n"); m_set_palette(tc[0], M_TEXT_COLOR_WHITE ); @@ -605,7 +700,8 @@ static BOOL RestoreFromSDCard7(void) ret_flag = FALSE; goto end_log_e; } - + + /******** ネットワークにつないだ *************/ // 必須:HTTP と SSL の初期化 @@ -861,7 +957,7 @@ static void MyThreadProc(void *arg) case THREAD_COMMAND_REBOOT_FUNCTION: mprintf("%s Power button pressed!\n",__FUNCTION__); OS_TPrintf("%s Power button pressed!\n",__FUNCTION__); - MCU_SetFreeRegister( 0x00 ); + MCU_SetFreeRegister( FREE_REG_POWERON_REBOOT ); PM_ReadyToExit(); OS_Sleep(100000); break; @@ -911,7 +1007,7 @@ static void MyThreadProc(void *arg) } if( pushed_power_button == TRUE ) { OS_TPrintf("%s Power button pressed!\n",__FUNCTION__); - MCU_SetFreeRegister( 0x00 ); + MCU_SetFreeRegister( FREE_REG_POWERON_REBOOT ); PM_ReadyToExit(); pushed_power_button = FALSE; } @@ -951,7 +1047,7 @@ static void MyThreadProcNuc(void *arg) m_set_palette(tc[0], M_TEXT_COLOR_WHITE ); mprintf("%s Power button pressed!\n",__FUNCTION__); OS_TPrintf("%s Power button pressed!\n",__FUNCTION__); - MCU_SetFreeRegister( 0x00 ); + MCU_SetFreeRegister( FREE_REG_POWERON_REBOOT ); PM_ReadyToExit(); pushed_power_button = FALSE; } @@ -989,7 +1085,7 @@ static void MyThreadProcNuc(void *arg) } if( pushed_power_button == TRUE ) { OS_TPrintf("%s Power button pressed!\n",__FUNCTION__); - MCU_SetFreeRegister( 0x00 ); + MCU_SetFreeRegister( FREE_REG_POWERON_REBOOT ); PM_ReadyToExit(); pushed_power_button = FALSE; } @@ -1004,64 +1100,7 @@ static void MyThreadProcNuc(void *arg) } - - /* miya */ - OS_TPrintf("ntp start\n"); - if( TRUE == my_ntp_init() ) { - RTCDate rtc_date; - RTCTime rtc_time; - rtc_date.year = (u32)( my_ntp_get_year() - 2000 ); - rtc_date.month = (u32)(my_ntp_get_month() + 1 ); - rtc_date.day = (u32)my_ntp_get_day(); - - rtc_time.hour = (u32)my_ntp_get_hour(); - rtc_time.minute = (u32)my_ntp_get_min(); - rtc_time.second = (u32)my_ntp_get_sec(); - - //RTCDate rtc_date; - //RTCTime rtc_time; - /* - typedef enum RTCWeek - { - RTC_WEEK_SUNDAY = 0, // 日曜日 - RTC_WEEK_MONDAY, // 月曜日 - RTC_WEEK_TUESDAY, // 火曜日 - RTC_WEEK_WEDNESDAY, // 水曜日 - RTC_WEEK_THURSDAY, // 木曜日 - RTC_WEEK_FRIDAY, // 金曜日 - RTC_WEEK_SATURDAY, // 土曜日 - RTC_WEEK_MAX - } - RTCWeek; - - - typedef struct RTCDate - { - u32 year; // 年 ( 0 ~ 99 ) - u32 month; // 月 ( 1 ~ 12 ) - u32 day; // 日 ( 1 ~ 31 ) - RTCWeek week; // 曜日 - - } - RTCDate; - - // 時刻構造体 - typedef struct RTCTime - { - u32 hour; // 時 ( 0 ~ 23 ) - u32 minute; // 分 ( 0 ~ 59 ) - u32 second; // 秒 ( 0 ~ 59 ) - - } - RTCTime; - */ - - if( RTC_RESULT_SUCCESS != RTC_SetDate( &rtc_date ) ) { - } - if( RTC_RESULT_SUCCESS != RTC_SetTime( &rtc_time ) ) { - } - } - OS_TPrintf("ntp end\n"); + RTC_NTP_SYNC(); /* NSSL_Init()呼んではダメ! */ @@ -1085,7 +1124,12 @@ static void MyThreadProcNuc(void *arg) mprintf("\n"); text_blink_current_line(tc[0]); mprintf("press A button to start RESTORE\n\n"); - MCU_SetFreeRegister( 0x55 ); + if( reboot_rtc_adjust_done_flag == TRUE ) { + MCU_SetFreeRegister( FREE_REG_RESTOREMODE_AND_RTC_DONE_REBOOT ); + } + else { + MCU_SetFreeRegister( FREE_REG_RESTOREMODE_REBOOT ); + } while( 1 ) { keyData = m_get_key_code(); if ( keyData & (PAD_BUTTON_A | PAD_BUTTON_START) ) { @@ -1093,7 +1137,7 @@ static void MyThreadProcNuc(void *arg) } if( pushed_power_button == TRUE ) { OS_TPrintf("%s Power button pressed!\n",__FUNCTION__); - MCU_SetFreeRegister( 0x00 ); + MCU_SetFreeRegister( FREE_REG_POWERON_REBOOT ); PM_ReadyToExit(); pushed_power_button = FALSE; } @@ -1227,15 +1271,26 @@ void TwlMain(void) /* OS_IsRebootedなんかおかしい・・ */ +#if 1 /* miya */ + OS_TPrintf("NCFGConfig = %d 0x%04x\n", sizeof(NCFGConfig),sizeof(NCFGConfig)); + OS_TPrintf("NCFGConfigEx = %d 0x%04x\n", sizeof(NCFGConfigEx), sizeof(NCFGConfigEx)); +#endif + MIYA_MCU_Init(); OS_TPrintf("MCU Free Reg. 0x%02x\n", MCU_GetFreeReg()); free_reg = MCU_GetFreeReg(); - if( free_reg == 0x55 ) { + if( free_reg == FREE_REG_RESTOREMODE_REBOOT ) { reboot_flag = TRUE; + reboot_rtc_adjust_done_flag = FALSE; } + else if( free_reg == FREE_REG_RESTOREMODE_AND_RTC_DONE_REBOOT ) { + reboot_flag = TRUE; + reboot_rtc_adjust_done_flag = TRUE; + } else { reboot_flag = FALSE; + reboot_rtc_adjust_done_flag = FALSE; } development_console_flag = IsThisDevelopmentConsole(); @@ -1693,7 +1748,12 @@ void TwlMain(void) } else if ( keyData & PAD_BUTTON_Y ) { if( FALSE == reboot_flag ) { - MCU_SetFreeRegister( 0x55 ); + if( reboot_rtc_adjust_done_flag == TRUE ) { + MCU_SetFreeRegister( FREE_REG_RESTOREMODE_AND_RTC_DONE_REBOOT ); + } + else { + MCU_SetFreeRegister( FREE_REG_RESTOREMODE_REBOOT ); + } OS_RebootSystem(); } } diff --git a/build/tools/sctools/copy_dst/src/ntp.c b/build/tools/sctools/copy_dst/src/ntp.c index e953e84..39799b9 100644 --- a/build/tools/sctools/copy_dst/src/ntp.c +++ b/build/tools/sctools/copy_dst/src/ntp.c @@ -13,7 +13,7 @@ #define BUFSIZE 256 /* バッファサイズ */ #define RECVSIZE 4096 /* 受信バッファサイズ */ -#define TIMEOUT 2 /* タイムアウト秒数 */ +#define TIMEOUT 3 /* タイムアウト秒数 */ struct NTP_Packet{ /* NTPパケット */ int Control_Word; @@ -158,26 +158,27 @@ int my_ntp_get_sec(void) BOOL my_ntp_init(void) { - SOCPollFD pfds[1]; + SOCPollFD pfds[1]; + BOOL ret_flag = TRUE; if( GetNTPSRV() == NULL ) { + OS_TPrintf("no NTP server entry\n"); + mprintf("no NTP server entry\n"); return FALSE; } OS_TPrintf("NTP srv %s\n",GetNTPSRV() ); + mprintf("NTP server: %s\n",GetNTPSRV() ); - // STD_StrCpy(svName, "ntp.jst.mfeed.ad.jp" ); STD_StrCpy(svName, GetNTPSRV() ); - //Name: ntp.jst.mfeed.ad.jp - //Addresses: 210.173.160.57, 210.173.160.87, 210.173.160.27 - /* ソケットを作成する処理 */ /* UDPモードでsocにソケットを作成します */ soc = SOC_Socket(SOC_PF_INET, SOC_SOCK_DGRAM, 0); if(soc < 0 ){ OS_TPrintf("Error: create Socket\n"); + mprintf("Error: create Socket\n"); return FALSE; } @@ -188,13 +189,15 @@ BOOL my_ntp_init(void) // int SOC_Bind(int s, const void* sockAddr); // SOC_HtoNs(hostshort) - sockname.family = SOC_AF_INET; /* インターネットの場合 */ - sockname.addr.addr = SOC_INADDR_ANY; /* 自分のIPアドレスを使うようにする */ - sockname.port = SOC_HtoNs((unsigned short)local_port); /* 受信するポート番号 */ + sockname.family = SOC_AF_INET; /* インターネットの場合 */ + sockname.addr.addr = SOC_INADDR_ANY; /* 自分のIPアドレスを使うようにする */ + sockname.port = SOC_HtoNs((unsigned short)local_port); /* 受信するポート番号 */ // STD_MemSet((void *)sockname.zero,(int)0,sizeof(sockname.zero)); if(SOC_Bind(soc, (void *)&sockname) < 0 ){ OS_TPrintf("Error: specify recv port\n"); - return FALSE; + mprintf("Error: invalid recv port %d\n",local_port); + ret_flag = FALSE; + goto exit_label1; } @@ -220,14 +223,16 @@ BOOL my_ntp_init(void) // int SOC_Close(int s); // serveraddr = (210) | (173 << 8) | (160 << 16) | (57 << 24); + // Addresses: 210.173.160.57, 210.173.160.87, 210.173.160.27 + /* サーバ名(svName)からサーバのホスト情報を取得します */ serverhostent = SOC_GetHostByName(svName); if(serverhostent == NULL) { OS_TPrintf("Error: SOC_GetHostByName %s\n",svName); - /* ソケットを破棄する */ - (void)SOC_Close(soc); - return FALSE; + mprintf("Error: SOC_GetHostByName %s\n",svName); + ret_flag = FALSE; + goto exit_label1; } else{ /* サーバのホスト情報からIPアドレスをserveraddrにコピーします */ @@ -240,6 +245,12 @@ BOOL my_ntp_init(void) ((serveraddr >> 8) & 0xff), ((serveraddr >> 16) & 0xff), ((serveraddr >> 24) & 0xff) ); + + mprintf(" IP addr : %d.%d.%d.%d\n", + ((serveraddr >> 0) & 0xff), + ((serveraddr >> 8) & 0xff), + ((serveraddr >> 16) & 0xff), + ((serveraddr >> 24) & 0xff) ); #endif @@ -263,15 +274,12 @@ BOOL my_ntp_init(void) NTP_Send.transmit_timestamp_fractions = 0; - - // int SOC_SendTo(int s, const void* buf, int len, int flags, const void* sockTo) - /* サーバを指定してNTPパケットを送信する */ if(SOC_SendTo(soc,(const void *)&NTP_Send, sizeof( NTP_Send ),0,(const void *)&serversockaddr) < 0 ) { OS_TPrintf("Error: サーバへの送信失敗\n"); - /* ソケットを破棄する */ - (void)SOC_Close(soc); - return FALSE; + mprintf("Error: SOC_SendTo\n"); + ret_flag = FALSE; + goto exit_label1; } @@ -292,19 +300,26 @@ BOOL my_ntp_init(void) pfds[0].events = SOC_POLLRDNORM; if( SOC_Poll( pfds, 1, OS_MilliSecondsToTicks( TIMEOUT * 1000 ) ) < 0 ) { OS_TPrintf("Error: recv error\n"); - /* ソケットを破棄する */ - (void)SOC_Close(soc); - return FALSE; + mprintf("Error: recv error\n"); + ret_flag = FALSE; + goto exit_label1; } switch( pfds[0].revents ) { case SOC_POLLERR: // ソケットにエラーが発生しました。 OS_TPrintf("Error: SOC_POLLERR %s %d\n",__FUNCTION__,__LINE__); + mprintf("Error: SOC_POLLERR %s %d\n",__FUNCTION__,__LINE__); + ret_flag = FALSE; + goto exit_label1; break; case SOC_POLLHUP: // ストリーム・ソケットが未接続です。 - OS_TPrintf("Error: SOC_POLLHUP %s %d\n",__FUNCTION__,__LINE__); + mprintf("Error: SOC_POLLHUP %s %d\n",__FUNCTION__,__LINE__); + ret_flag = FALSE; + goto exit_label1; break; case SOC_POLLNVAL: // 不正なソケット記述子です。 - OS_TPrintf("Error: SOC_POLLNVAL %s %d\n",__FUNCTION__,__LINE__); + mprintf("Error: SOC_POLLNVAL %s %d\n",__FUNCTION__,__LINE__); + ret_flag = FALSE; + goto exit_label1; break; default: break; @@ -315,21 +330,21 @@ BOOL my_ntp_init(void) /* サーバを指定して受信を行う */ // int SOC_RecvFrom(int s, void* buf, int len, int flags, void* sockFrom); sockaddr_Size = sizeof(serversockaddr); - if(SOC_RecvFrom(soc, (char *)&NTP_Recv, sizeof(NTP_Recv), 0 ,(void *)&serversockaddr) < 0 ){ - OS_TPrintf("Error: サーバからの受信失敗\n"); - /* ソケットを破棄する */ - (void)SOC_Close(soc); - return FALSE; + if( SOC_RecvFrom(soc, (char *)&NTP_Recv, sizeof(NTP_Recv), SOC_MSG_DONTWAIT ,(void *)&serversockaddr) < 0 ){ + OS_TPrintf("Error: SOC_RecvFrom\n"); + mprintf("Error: SOC_RecvFrom\n"); + ret_flag = FALSE; + goto exit_label1; } /* NTPサーバから取得した時刻を現地時間に変換する */ - // ntp_time = ntohl(NTP_Recv.transmit_timestamp_seconds) - 2208988800; /* 1970/01/01 からの秒数に変換 */ ntp_time = SOC_NtoHl(NTP_Recv.transmit_timestamp_seconds) - 2208988800; /* 1970/01/01 からの秒数に変換 */ OS_TPrintf("ntp_time = %d\n",ntp_time); OS_TPrintf("TimeZone %d\n", GetTimeZone()); + mprintf(" TimeZone : %d:%02d\n", (GetTimeZone()/60), (GetTimeZone()%60)); ntp_time += (60*GetTimeZone()); @@ -346,7 +361,9 @@ BOOL my_ntp_init(void) // tm.tm_yday; // tm.tm_isdst; + exit_label1: /* ソケットを破棄する処理 */ (void)SOC_Close(soc); - return TRUE; + + return ret_flag; }