git-svn-id: file:///Users/lillianskinner/Downloads/platinum/twl/TwlToolsRED@96 7061adef-622a-194b-ae81-725974e89856

This commit is contained in:
miya 2008-12-18 07:38:50 +00:00
parent 9c877e4102
commit 8c56c5a087
5 changed files with 349 additions and 140 deletions

View File

@ -3,7 +3,7 @@
#define MY_DATA_VERSION_MAJOR 1 #define MY_DATA_VERSION_MAJOR 1
#define MY_DATA_VERSION_MINOR 1 #define MY_DATA_VERSION_MINOR 2
typedef struct { typedef struct {
u8 version_major; u8 version_major;

View File

@ -1,6 +1,7 @@
#include <twl.h> #include <twl.h>
#include <nitro/nvram/nvram.h> #include <nitro/nvram/nvram.h>
#include <nitroWiFi/ncfg.h>
#include "font.h" #include "font.h"
#include "text.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 nvram_backup(char *path)
{ {
BOOL bSuccess; BOOL bSuccess;
BOOL ret_flag = TRUE;
FSFile nor_fd; FSFile nor_fd;
u32 offset; u32 offset;
u32 vol;
int len; int len;
#define BUF_SIZE 0x100
u8 nor_buf[BUF_SIZE];
char *nor_file_path = path; 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); FS_InitFile(&nor_fd);
// STD_TSNPrintf(nor_file_path, sizeof(nor_file_path), path ); // STD_TSNPrintf(nor_file_path, sizeof(nor_file_path), path );
@ -167,29 +179,25 @@ BOOL nvram_backup(char *path)
if( offset == 0 ) { if( offset == 0 ) {
OS_TPrintf( "nvram error: offset = 0x%02x\n", offset); OS_TPrintf( "nvram error: offset = 0x%02x\n", offset);
(void)FS_CloseFile(&nor_fd);
return FALSE; return FALSE;
} }
offset *= 8; offset *= 8;
offset -= 0xA00; offset -= 0xA00;
for( vol = 0 ; vol < NVRAM_PERSONAL_DATA_SIZE ; vol += BUF_SIZE ) { if( TRUE != my_nvram_read( offset , NVRAM_PERSONAL_DATA_SIZE, (void* )my_nor_buf) ) {
if( TRUE != my_nvram_read( offset+vol , BUF_SIZE, (void* )nor_buf) ) { OS_TPrintf( "nvram error: %s %s %d\n",__FILE__,__FUNCTION__,__LINE__);
OS_TPrintf( "nvram error: %s %s %d\n",__FILE__,__FUNCTION__,__LINE__); ret_flag = FALSE;
} }
else { else {
#if 0 len = my_fs_crypto_write(&nor_fd, my_nor_buf, NVRAM_PERSONAL_DATA_SIZE);
len = FS_WriteFile(&nor_fd, nor_buf, BUF_SIZE); if (len != NVRAM_PERSONAL_DATA_SIZE) {
#else OS_TPrintf("FS_WriteFile() failed.");
len = my_fs_crypto_write(&nor_fd, nor_buf, BUF_SIZE); ret_flag = FALSE;
#endif
if (len != BUF_SIZE)
{
OS_TPrintf("FS_WriteFile() failed.");
break;
}
} }
} }
OS_TPrintf("\n"); OS_TPrintf("\n");
FS_FlushFile(&nor_fd); FS_FlushFile(&nor_fd);
@ -197,21 +205,34 @@ BOOL nvram_backup(char *path)
bSuccess = FS_CloseFile(&nor_fd); bSuccess = FS_CloseFile(&nor_fd);
// OS_TPrintf( "nvram read completed.\n"); // 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 nvram_restore(char *path)
{ {
BOOL bSuccess; BOOL bSuccess;
BOOL ret_flag = TRUE;
FSFile nor_fd; FSFile nor_fd;
u32 offset; u32 offset;
u32 vol;
int len; int len;
// char nor_file_path[FS_FILE_NAME_MAX]; // char nor_file_path[FS_FILE_NAME_MAX];
char *nor_file_path = path; char *nor_file_path = path;
NCFGConfig *p_ncfgc = NULL;
#define BUF_SIZE 0x100 #if 0
u8 nor_buf[BUF_SIZE]; DWCWiFiInfo buf_content;
DWCWiFiInfo *buf = &buf_content;
u8 Wifi[14];
#endif
u64 id1;
u64 id2;
FS_InitFile(&nor_fd); FS_InitFile(&nor_fd);
// STD_TSNPrintf(nor_file_path, sizeof(nor_file_path), path ); // STD_TSNPrintf(nor_file_path, sizeof(nor_file_path), path );
@ -224,6 +245,7 @@ BOOL nvram_restore(char *path)
/* offsetƒAƒhƒŒƒX̎擾 */ /* offsetƒAƒhƒŒƒX̎擾 */
if( TRUE != my_nvram_read( NVRAM_PERSONAL_DATA_OFFSET , sizeof(u16), (void* )&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__); OS_TPrintf( "nvram error: %s %s %d\n",__FILE__,__FUNCTION__,__LINE__);
ret_flag = FALSE;
} }
else { else {
OS_TPrintf( "nvram success: offset = 0x%02x\n", offset); OS_TPrintf( "nvram success: offset = 0x%02x\n", offset);
@ -234,34 +256,114 @@ BOOL nvram_restore(char *path)
return FALSE; return FALSE;
} }
/* offsetのチェックは */
offset *= 8; offset *= 8;
offset -= 0xA00; offset -= 0xA00;
for( vol = 0 ; vol < NVRAM_PERSONAL_DATA_SIZE ; vol += BUF_SIZE ) { len = my_fs_crypto_read(&nor_fd, my_nor_buf, NVRAM_PERSONAL_DATA_SIZE);
OS_TPrintf("."); 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 #if 0
len = FS_ReadFile(&nor_fd, nor_buf, BUF_SIZE); MI_CpuCopy8(&p_ncfgc->slot[1].wifi[0], Wifi, 14);
#else MI_CpuCopy8(&Wifi[ 0], &buf->attestedUserId, 6);
len = my_fs_crypto_read(&nor_fd, nor_buf, BUF_SIZE); buf->attestedUserId &= 0x07FFFFFFFFFF;
#endif MI_CpuCopy8(&Wifi[ 5], &buf->notAttestedId, 6);
if (len != BUF_SIZE) { buf->notAttestedId >>= 3;
OS_TPrintf("FS_ReadFile() failed."); buf->notAttestedId &= 0x07FFFFFFFFFF;
break; 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__); 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を読み出し80x1fe00
-0x4000x1fa00Wi-Fiユーザー情報の先頭となる
IDが有るか
Wi-Fiユーザー情報の0xf0から14byteがWi-FiコネクションID情報になります
14byteのWi-FiコネクションID情報の後ろ43bitが認証済みユーザーIDが格納される
0IDが無いと見なす事ができます
# 詳細は添付の資料をご確認ください。
# 資料はDSのものですが、Wi-FiコネクションID情報の部分は共通となります。
Wi-FiコネクションID情報に本IDが存在しない場合は
 Wi-Fiユーザー情報全てを移行しない
Wi-Fiユーザー情報の先頭0x1fa00-0x6000x1f400
 0x1000byte
 # -0x600にはTWLで拡張された領域が入ります。
*/
OS_TPrintf("\n"); OS_TPrintf("\n");
bSuccess = FS_CloseFile(&nor_fd); bSuccess = FS_CloseFile(&nor_fd);
OS_TPrintf( "nvram write completed.\n"); OS_TPrintf( "nvram write completed.\n");
return TRUE; return ret_flag;
} }

View File

@ -439,6 +439,34 @@ BOOL WaitEC(ECOpId opId)
miya_log_fprintf(log_fd, "%s Failed to EC_GetProgress, result=%d %s\n", miya_log_fprintf(log_fd, "%s Failed to EC_GetProgress, result=%d %s\n",
__FUNCTION__, result, GetECErrorString(result)); __FUNCTION__, result, GetECErrorString(result));
mprintf("EC_GetProgress failed %d\n %s\n", 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; return FALSE;
} }
@ -686,6 +714,8 @@ int ECDownload(const NAMTitleId* pTitleIds, u32 numTitleIds)
char status; char status;
// BOOL ret_flag; // BOOL ret_flag;
STD_MemSet((void *)challenge,(int)0, EC_CHALLENGE_BUF_SIZE);
mprintf("-check registration.. "); mprintf("-check registration.. ");
miya_log_fprintf(log_fd, "-check registration..."); miya_log_fprintf(log_fd, "-check registration...");
status = CheckRegistration(); status = CheckRegistration();

View File

@ -22,6 +22,7 @@
#include "ecdl.h" #include "ecdl.h"
#include <NitroWiFi/nhttp.h> #include <NitroWiFi/nhttp.h>
#include <NitroWiFi/ncfg.h>
#include </twl/os/common/ownerInfoEx.h> #include </twl/os/common/ownerInfoEx.h>
@ -62,6 +63,11 @@
#define THREAD_COMMAND_USERDATA_AND_WIFI_FUNCTION 3 #define THREAD_COMMAND_USERDATA_AND_WIFI_FUNCTION 3
#define THREAD_COMMAND_REBOOT_FUNCTION 4 #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 // #define MIYA_MCU 1
static BOOL only_wifi_config_data_trans_flag = FALSE; 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 BOOL completed_flag = FALSE;
static FSEventHook sSDHook; static FSEventHook sSDHook;
static BOOL sd_card_flag = FALSE; static BOOL sd_card_flag = FALSE;
//static BOOL reboot_flag = FALSE;
static BOOL ec_download_success_flag = TRUE; static BOOL ec_download_success_flag = TRUE;
@ -81,6 +86,7 @@ static BOOL development_console_flag = FALSE;
static u8 org_region = 0; static u8 org_region = 0;
static u64 org_fuseId = 0; static u64 org_fuseId = 0;
static volatile BOOL reboot_flag; static volatile BOOL reboot_flag;
static BOOL reboot_rtc_adjust_done_flag;
static int miya_debug_level = 0; 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) static BOOL LoadWlanConfig(void)
{ {
u8 buf[256]; u8 buf[256];
@ -313,7 +393,14 @@ static BOOL RestoreFromSDCard1(void)
MydataLoad関数は成功しているものとする MydataLoad関数は成功しているものとする
MyData mydata 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 "); mprintf("RTC data restore ");
if( RTC_RESULT_SUCCESS != RTC_SetDate( &(mydata.rtc_date) ) ) { if( RTC_RESULT_SUCCESS != RTC_SetDate( &(mydata.rtc_date) ) ) {
flag = FALSE; flag = FALSE;
@ -372,9 +459,16 @@ static BOOL RestoreFromSDCard2(void)
static BOOL RestoreFromSDCard3(void) static BOOL RestoreFromSDCard3(void)
{ {
// static BOOL SDBackupToSDCard2(void) // static BOOL SDBackupToSDCard2(void)
BOOL flag;
if( mydata.wireless_lan_param_flag == TRUE ) { if( mydata.wireless_lan_param_flag == TRUE ) {
mprintf("WirelessLAN param. restore "); 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 ); m_set_palette(tc[0], M_TEXT_COLOR_GREEN );
mprintf("OK.\n"); mprintf("OK.\n");
m_set_palette(tc[0], M_TEXT_COLOR_WHITE ); m_set_palette(tc[0], M_TEXT_COLOR_WHITE );
@ -430,7 +524,8 @@ static BOOL RestoreFromSDCard5(void)
if( mydata.num_of_shared2_files > 0 ) { if( mydata.num_of_shared2_files > 0 ) {
mprintf("App. shared files restore "); mprintf("App. shared files restore ");
if( TRUE == RestoreDirEntryList( MyFile_GetAppSharedListFileName(), 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 ); m_set_palette(tc[0], M_TEXT_COLOR_GREEN );
mprintf("OK.\n"); mprintf("OK.\n");
m_set_palette(tc[0], M_TEXT_COLOR_WHITE ); m_set_palette(tc[0], M_TEXT_COLOR_WHITE );
@ -605,7 +700,8 @@ static BOOL RestoreFromSDCard7(void)
ret_flag = FALSE; ret_flag = FALSE;
goto end_log_e; goto end_log_e;
} }
/******** ネットワークにつないだ *************/ /******** ネットワークにつないだ *************/
// 必須HTTP と SSL の初期化 // 必須HTTP と SSL の初期化
@ -861,7 +957,7 @@ static void MyThreadProc(void *arg)
case THREAD_COMMAND_REBOOT_FUNCTION: case THREAD_COMMAND_REBOOT_FUNCTION:
mprintf("%s Power button pressed!\n",__FUNCTION__); mprintf("%s Power button pressed!\n",__FUNCTION__);
OS_TPrintf("%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(); PM_ReadyToExit();
OS_Sleep(100000); OS_Sleep(100000);
break; break;
@ -911,7 +1007,7 @@ static void MyThreadProc(void *arg)
} }
if( pushed_power_button == TRUE ) { if( pushed_power_button == TRUE ) {
OS_TPrintf("%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(); PM_ReadyToExit();
pushed_power_button = FALSE; pushed_power_button = FALSE;
} }
@ -951,7 +1047,7 @@ static void MyThreadProcNuc(void *arg)
m_set_palette(tc[0], M_TEXT_COLOR_WHITE ); m_set_palette(tc[0], M_TEXT_COLOR_WHITE );
mprintf("%s Power button pressed!\n",__FUNCTION__); mprintf("%s Power button pressed!\n",__FUNCTION__);
OS_TPrintf("%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(); PM_ReadyToExit();
pushed_power_button = FALSE; pushed_power_button = FALSE;
} }
@ -989,7 +1085,7 @@ static void MyThreadProcNuc(void *arg)
} }
if( pushed_power_button == TRUE ) { if( pushed_power_button == TRUE ) {
OS_TPrintf("%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(); PM_ReadyToExit();
pushed_power_button = FALSE; pushed_power_button = FALSE;
} }
@ -1004,64 +1100,7 @@ static void MyThreadProcNuc(void *arg)
} }
RTC_NTP_SYNC();
/* 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");
/* NSSL_Init()呼んではダメ! */ /* NSSL_Init()呼んではダメ! */
@ -1085,7 +1124,12 @@ static void MyThreadProcNuc(void *arg)
mprintf("\n"); mprintf("\n");
text_blink_current_line(tc[0]); text_blink_current_line(tc[0]);
mprintf("press A button to start RESTORE\n\n"); 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 ) { while( 1 ) {
keyData = m_get_key_code(); keyData = m_get_key_code();
if ( keyData & (PAD_BUTTON_A | PAD_BUTTON_START) ) { if ( keyData & (PAD_BUTTON_A | PAD_BUTTON_START) ) {
@ -1093,7 +1137,7 @@ static void MyThreadProcNuc(void *arg)
} }
if( pushed_power_button == TRUE ) { if( pushed_power_button == TRUE ) {
OS_TPrintf("%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(); PM_ReadyToExit();
pushed_power_button = FALSE; pushed_power_button = FALSE;
} }
@ -1227,15 +1271,26 @@ void TwlMain(void)
/* OS_IsRebootedなんかおかしい・・ */ /* 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(); MIYA_MCU_Init();
OS_TPrintf("MCU Free Reg. 0x%02x\n", MCU_GetFreeReg()); OS_TPrintf("MCU Free Reg. 0x%02x\n", MCU_GetFreeReg());
free_reg = MCU_GetFreeReg(); free_reg = MCU_GetFreeReg();
if( free_reg == 0x55 ) { if( free_reg == FREE_REG_RESTOREMODE_REBOOT ) {
reboot_flag = TRUE; 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 { else {
reboot_flag = FALSE; reboot_flag = FALSE;
reboot_rtc_adjust_done_flag = FALSE;
} }
development_console_flag = IsThisDevelopmentConsole(); development_console_flag = IsThisDevelopmentConsole();
@ -1693,7 +1748,12 @@ void TwlMain(void)
} }
else if ( keyData & PAD_BUTTON_Y ) { else if ( keyData & PAD_BUTTON_Y ) {
if( FALSE == reboot_flag ) { 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(); OS_RebootSystem();
} }
} }

View File

@ -13,7 +13,7 @@
#define BUFSIZE 256 /* バッファサイズ */ #define BUFSIZE 256 /* バッファサイズ */
#define RECVSIZE 4096 /* 受信バッファサイズ */ #define RECVSIZE 4096 /* 受信バッファサイズ */
#define TIMEOUT 2 /* タイムアウト秒数 */ #define TIMEOUT 3 /* タイムアウト秒数 */
struct NTP_Packet{ /* NTPパケット */ struct NTP_Packet{ /* NTPパケット */
int Control_Word; int Control_Word;
@ -158,26 +158,27 @@ int my_ntp_get_sec(void)
BOOL my_ntp_init(void) BOOL my_ntp_init(void)
{ {
SOCPollFD pfds[1]; SOCPollFD pfds[1];
BOOL ret_flag = TRUE;
if( GetNTPSRV() == NULL ) { if( GetNTPSRV() == NULL ) {
OS_TPrintf("no NTP server entry\n");
mprintf("no NTP server entry\n");
return FALSE; return FALSE;
} }
OS_TPrintf("NTP srv %s\n",GetNTPSRV() ); OS_TPrintf("NTP srv %s\n",GetNTPSRV() );
mprintf("NTP server: %s\n",GetNTPSRV() );
// STD_StrCpy(svName, "ntp.jst.mfeed.ad.jp" ); // STD_StrCpy(svName, "ntp.jst.mfeed.ad.jp" );
STD_StrCpy(svName, GetNTPSRV() ); 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にソケットを作成します */ /* UDPモードでsocにソケットを作成します */
soc = SOC_Socket(SOC_PF_INET, SOC_SOCK_DGRAM, 0); soc = SOC_Socket(SOC_PF_INET, SOC_SOCK_DGRAM, 0);
if(soc < 0 ){ if(soc < 0 ){
OS_TPrintf("Error: create Socket\n"); OS_TPrintf("Error: create Socket\n");
mprintf("Error: create Socket\n");
return FALSE; return FALSE;
} }
@ -188,13 +189,15 @@ BOOL my_ntp_init(void)
// int SOC_Bind(int s, const void* sockAddr); // int SOC_Bind(int s, const void* sockAddr);
// SOC_HtoNs(hostshort) // SOC_HtoNs(hostshort)
sockname.family = SOC_AF_INET; /* インターネットの場合 */ sockname.family = SOC_AF_INET; /* インターネットの場合 */
sockname.addr.addr = SOC_INADDR_ANY; /* 自分のIPアドレスを使うようにする */ sockname.addr.addr = SOC_INADDR_ANY; /* 自分のIPアドレスを使うようにする */
sockname.port = SOC_HtoNs((unsigned short)local_port); /* 受信するポート番号 */ sockname.port = SOC_HtoNs((unsigned short)local_port); /* 受信するポート番号 */
// STD_MemSet((void *)sockname.zero,(int)0,sizeof(sockname.zero)); // STD_MemSet((void *)sockname.zero,(int)0,sizeof(sockname.zero));
if(SOC_Bind(soc, (void *)&sockname) < 0 ){ if(SOC_Bind(soc, (void *)&sockname) < 0 ){
OS_TPrintf("Error: specify recv port\n"); 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); // int SOC_Close(int s);
// serveraddr = (210) | (173 << 8) | (160 << 16) | (57 << 24); // serveraddr = (210) | (173 << 8) | (160 << 16) | (57 << 24);
// Addresses: 210.173.160.57, 210.173.160.87, 210.173.160.27
/* サーバ名(svName)からサーバのホスト情報を取得します */ /* サーバ名(svName)からサーバのホスト情報を取得します */
serverhostent = SOC_GetHostByName(svName); serverhostent = SOC_GetHostByName(svName);
if(serverhostent == NULL) { if(serverhostent == NULL) {
OS_TPrintf("Error: SOC_GetHostByName %s\n",svName); OS_TPrintf("Error: SOC_GetHostByName %s\n",svName);
/* ソケットを破棄する */ mprintf("Error: SOC_GetHostByName %s\n",svName);
(void)SOC_Close(soc); ret_flag = FALSE;
return FALSE; goto exit_label1;
} }
else{ else{
/* サーバのホスト情報からIPアドレスをserveraddrにコピーします */ /* サーバのホスト情報からIPアドレスをserveraddrにコピーします */
@ -240,6 +245,12 @@ BOOL my_ntp_init(void)
((serveraddr >> 8) & 0xff), ((serveraddr >> 8) & 0xff),
((serveraddr >> 16) & 0xff), ((serveraddr >> 16) & 0xff),
((serveraddr >> 24) & 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 #endif
@ -263,15 +274,12 @@ BOOL my_ntp_init(void)
NTP_Send.transmit_timestamp_fractions = 0; NTP_Send.transmit_timestamp_fractions = 0;
// int SOC_SendTo(int s, const void* buf, int len, int flags, const void* sockTo)
/* サーバを指定してNTPパケットを送信する */ /* サーバを指定してNTPパケットを送信する */
if(SOC_SendTo(soc,(const void *)&NTP_Send, sizeof( NTP_Send ),0,(const void *)&serversockaddr) < 0 ) { if(SOC_SendTo(soc,(const void *)&NTP_Send, sizeof( NTP_Send ),0,(const void *)&serversockaddr) < 0 ) {
OS_TPrintf("Error: サーバへの送信失敗\n"); OS_TPrintf("Error: サーバへの送信失敗\n");
/* ソケットを破棄する */ mprintf("Error: SOC_SendTo\n");
(void)SOC_Close(soc); ret_flag = FALSE;
return FALSE; goto exit_label1;
} }
@ -292,19 +300,26 @@ BOOL my_ntp_init(void)
pfds[0].events = SOC_POLLRDNORM; pfds[0].events = SOC_POLLRDNORM;
if( SOC_Poll( pfds, 1, OS_MilliSecondsToTicks( TIMEOUT * 1000 ) ) < 0 ) { if( SOC_Poll( pfds, 1, OS_MilliSecondsToTicks( TIMEOUT * 1000 ) ) < 0 ) {
OS_TPrintf("Error: recv error\n"); OS_TPrintf("Error: recv error\n");
/* ソケットを破棄する */ mprintf("Error: recv error\n");
(void)SOC_Close(soc); ret_flag = FALSE;
return FALSE; goto exit_label1;
} }
switch( pfds[0].revents ) { switch( pfds[0].revents ) {
case SOC_POLLERR: // ソケットにエラーが発生しました。 case SOC_POLLERR: // ソケットにエラーが発生しました。
OS_TPrintf("Error: SOC_POLLERR %s %d\n",__FUNCTION__,__LINE__); 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; break;
case SOC_POLLHUP: // ストリーム・ソケットが未接続です。 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; break;
case SOC_POLLNVAL: // 不正なソケット記述子です。 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; break;
default: default:
break; break;
@ -315,21 +330,21 @@ BOOL my_ntp_init(void)
/* サーバを指定して受信を行う */ /* サーバを指定して受信を行う */
// int SOC_RecvFrom(int s, void* buf, int len, int flags, void* sockFrom); // int SOC_RecvFrom(int s, void* buf, int len, int flags, void* sockFrom);
sockaddr_Size = sizeof(serversockaddr); sockaddr_Size = sizeof(serversockaddr);
if(SOC_RecvFrom(soc, (char *)&NTP_Recv, sizeof(NTP_Recv), 0 ,(void *)&serversockaddr) < 0 ){ if( SOC_RecvFrom(soc, (char *)&NTP_Recv, sizeof(NTP_Recv), SOC_MSG_DONTWAIT ,(void *)&serversockaddr) < 0 ){
OS_TPrintf("Error: サーバからの受信失敗\n"); OS_TPrintf("Error: SOC_RecvFrom\n");
/* ソケットを破棄する */ mprintf("Error: SOC_RecvFrom\n");
(void)SOC_Close(soc); ret_flag = FALSE;
return FALSE; goto exit_label1;
} }
/* NTPサーバから取得した時刻を現地時間に変換する */ /* 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 からの秒数に変換 */ ntp_time = SOC_NtoHl(NTP_Recv.transmit_timestamp_seconds) - 2208988800; /* 1970/01/01 からの秒数に変換 */
OS_TPrintf("ntp_time = %d\n",ntp_time); OS_TPrintf("ntp_time = %d\n",ntp_time);
OS_TPrintf("TimeZone %d\n", GetTimeZone()); OS_TPrintf("TimeZone %d\n", GetTimeZone());
mprintf(" TimeZone : %d:%02d\n", (GetTimeZone()/60), (GetTimeZone()%60));
ntp_time += (60*GetTimeZone()); ntp_time += (60*GetTimeZone());
@ -346,7 +361,9 @@ BOOL my_ntp_init(void)
// tm.tm_yday; // tm.tm_yday;
// tm.tm_isdst; // tm.tm_isdst;
exit_label1:
/* ソケットを破棄する処理 */ /* ソケットを破棄する処理 */
(void)SOC_Close(soc); (void)SOC_Close(soc);
return TRUE;
return ret_flag;
} }