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_MINOR 1
#define MY_DATA_VERSION_MINOR 2
typedef struct {
u8 version_major;

View File

@ -1,6 +1,7 @@
#include <twl.h>
#include <nitro/nvram/nvram.h>
#include <nitroWiFi/ncfg.h>
#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ƒAƒhƒŒƒX̎擾 */
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を読み出し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");
bSuccess = FS_CloseFile(&nor_fd);
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",
__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();

View File

@ -22,6 +22,7 @@
#include "ecdl.h"
#include <NitroWiFi/nhttp.h>
#include <NitroWiFi/ncfg.h>
#include </twl/os/common/ownerInfoEx.h>
@ -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();
}
}

View File

@ -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;
}