rosalina: ntp: use PTMSYSM_SetRtcTime
This commit is contained in:
parent
704e08dc23
commit
0471002d4c
@ -30,4 +30,4 @@
|
|||||||
#include <time.h>
|
#include <time.h>
|
||||||
|
|
||||||
Result ntpGetTimeStamp(time_t *outTimestamp);
|
Result ntpGetTimeStamp(time_t *outTimestamp);
|
||||||
Result ntpSetTimeDate(const struct tm *localt);
|
Result ntpSetTimeDate(time_t timestamp);
|
||||||
|
@ -341,7 +341,6 @@ void MiscellaneousMenu_SyncTimeDate(void)
|
|||||||
bool isSocURegistered;
|
bool isSocURegistered;
|
||||||
|
|
||||||
time_t t;
|
time_t t;
|
||||||
struct tm localt = {0};
|
|
||||||
|
|
||||||
res = srvIsServiceRegistered(&isSocURegistered, "soc:U");
|
res = srvIsServiceRegistered(&isSocURegistered, "soc:U");
|
||||||
cantStart = R_FAILED(res) || !isSocURegistered;
|
cantStart = R_FAILED(res) || !isSocURegistered;
|
||||||
@ -385,8 +384,7 @@ void MiscellaneousMenu_SyncTimeDate(void)
|
|||||||
{
|
{
|
||||||
t += 3600 * utcOffset;
|
t += 3600 * utcOffset;
|
||||||
t += 60 * utcOffsetMinute;
|
t += 60 * utcOffsetMinute;
|
||||||
gmtime_r(&t, &localt);
|
res = ntpSetTimeDate(t);
|
||||||
res = ntpSetTimeDate(&localt);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -40,18 +40,6 @@
|
|||||||
#define NTP_IP MAKE_IPV4(51, 137, 137, 111) // time.windows.com
|
#define NTP_IP MAKE_IPV4(51, 137, 137, 111) // time.windows.com
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
typedef struct RtcTime {
|
|
||||||
// From 3dbrew
|
|
||||||
u8 seconds;
|
|
||||||
u8 minutes;
|
|
||||||
u8 hours;
|
|
||||||
u8 dayofweek;
|
|
||||||
u8 dayofmonth;
|
|
||||||
u8 month;
|
|
||||||
u8 year;
|
|
||||||
u8 leapcount;
|
|
||||||
} RtcTime;
|
|
||||||
|
|
||||||
// From https://github.com/lettier/ntpclient/blob/master/source/c/main.c
|
// From https://github.com/lettier/ntpclient/blob/master/source/c/main.c
|
||||||
|
|
||||||
typedef struct NtpPacket
|
typedef struct NtpPacket
|
||||||
@ -84,17 +72,6 @@ typedef struct NtpPacket
|
|||||||
|
|
||||||
} NtpPacket; // Total: 384 bits or 48 bytes.
|
} NtpPacket; // Total: 384 bits or 48 bytes.
|
||||||
|
|
||||||
void rtcToBcd(u8 *out, const RtcTime *in)
|
|
||||||
{
|
|
||||||
memcpy(out, in, 8);
|
|
||||||
for (u32 i = 0; i < 8; i++)
|
|
||||||
{
|
|
||||||
u8 units = out[i] % 10;
|
|
||||||
u8 tens = (out[i] - units) / 10;
|
|
||||||
out[i] = (tens << 4) | units;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
Result ntpGetTimeStamp(time_t *outTimestamp)
|
Result ntpGetTimeStamp(time_t *outTimestamp)
|
||||||
{
|
{
|
||||||
Result res = 0;
|
Result res = 0;
|
||||||
@ -162,42 +139,33 @@ cleanup:
|
|||||||
return res;
|
return res;
|
||||||
}
|
}
|
||||||
|
|
||||||
Result ntpSetTimeDate(const struct tm *localt)
|
Result ntpSetTimeDate(time_t timestamp)
|
||||||
{
|
{
|
||||||
Result res = mcuHwcInit();
|
Result res = ptmSysmInit();
|
||||||
if (R_FAILED(res)) return res;
|
if (R_FAILED(res)) return res;
|
||||||
|
|
||||||
|
|
||||||
res = cfguInit();
|
res = cfguInit();
|
||||||
if (R_FAILED(res)) goto cleanup;
|
if (R_FAILED(res))
|
||||||
|
{
|
||||||
|
ptmSysmExit();
|
||||||
|
return res;
|
||||||
|
}
|
||||||
|
|
||||||
// First, set the config RTC offset to 0
|
// First, set the config RTC offset to 0
|
||||||
u8 rtcOff[8] = {0};
|
u8 rtcOff[8] = {0};
|
||||||
res = CFG_SetConfigInfoBlk4(8, 0x30001, rtcOff);
|
res = CFG_SetConfigInfoBlk4(8, 0x30001, rtcOff);
|
||||||
if (R_FAILED(res)) goto cleanup;
|
if (R_FAILED(res)) goto cleanup;
|
||||||
|
|
||||||
u8 yr = (u8)(localt->tm_year - 100);
|
|
||||||
// Update the RTC
|
// Update the RTC
|
||||||
u8 bcd[8];
|
// 946684800 is the timestamp of 01/01/2000 00:00 relative to the Unix Epoch
|
||||||
RtcTime lt = {
|
s64 msY2k = (timestamp - 946684800) * 1000;
|
||||||
.seconds = (u8)localt->tm_sec,
|
res = PTMSYSM_SetRtcTime(msY2k);
|
||||||
.minutes = (u8)localt->tm_min,
|
|
||||||
.hours = (u8)localt->tm_hour,
|
|
||||||
.dayofweek = (u8)localt->tm_wday,
|
|
||||||
.dayofmonth = (u8)localt->tm_mday,
|
|
||||||
.month = (u8)(localt->tm_mon + 1),
|
|
||||||
.year = yr,
|
|
||||||
.leapcount = 0,
|
|
||||||
};
|
|
||||||
rtcToBcd(bcd, <);
|
|
||||||
|
|
||||||
res = MCUHWC_WriteRegister(0x30, bcd, 7);
|
|
||||||
if (R_FAILED(res)) goto cleanup;
|
if (R_FAILED(res)) goto cleanup;
|
||||||
|
|
||||||
// Save the config changes
|
// Save the config changes
|
||||||
res = CFG_UpdateConfigSavegame();
|
res = CFG_UpdateConfigSavegame();
|
||||||
cleanup:
|
cleanup:
|
||||||
mcuHwcExit();
|
ptmSysmExit();
|
||||||
cfguExit();
|
cfguExit();
|
||||||
return res;
|
return res;
|
||||||
}
|
}
|
||||||
|
Reference in New Issue
Block a user