PSC services: Difference between revisions

No edit summary
Line 43: Line 43:
| 4 || Cancel
| 4 || Cancel
|-
|-
| [1.0.0-6.2.0] 5 || PrintModuleInformation
| 5 || [1.0.0-6.2.0] PrintModuleInformation
|-
|-
| 6 || GetModuleInformation
| 6 || GetModuleInformation
|-
| 10 || [9.0.0+]
|-
| 11 || [9.0.0+]
|}
|}


Line 74: Line 78:
|-
|-
| 4 || [5.1.0+] AcknowledgeEx
| 4 || [5.1.0+] AcknowledgeEx
|}
= psc:l =
This was added with [9.0.0+].
{| class="wikitable" border="1"
|-
! Cmd || Name
|-
| 0 ||
|-
| 1 ||
|-
| 2 ||
|-
| 3 ||
|-
| 4 ||
|}
|}


Line 198: Line 220:
|-
|-
| 1 || GetUnreceivedMessageCount
| 1 || GetUnreceivedMessageCount
|}
= time:su =
This is "nn::timesrv::detail::service::ITimeServiceManager".
This was added with [9.0.0+].
{| class="wikitable" border="1"
|-
! Cmd || Name
|-
| 0 ||
|-
| 5 ||
|-
| 6 ||
|-
| 9 ||
|-
| 10 ||
|-
| 11 ||
|-
| 12 ||
|-
| 13 ||
|-
| 14 ||
|-
| 15 ||
|-
| 50 ||
|-
| 51 ||
|-
| 52 ||
|-
| 60 ||
|-
| 100 ||
|-
| 200 ||
|-
| 201 ||
|-
| 202 ||
|}
= time:al =
This is "nn::timesrv::detail::service::IAlarmService".
This was added with [9.0.0+].
{| class="wikitable" border="1"
|-
! Cmd || Name
|-
| 0 ||
|-
| 1 ||
|}
== ISteadyClockAlarm ==
This is "nn::timesrv::detail::service::ISteadyClockAlarm".
{| class="wikitable" border="1"
|-
! Cmd || Name
|-
| 0 ||
|-
| 1 ||
|-
| 2 ||
|-
| 3 ||
|-
| 10 ||
|-
| 11 ||
|}
= time:m =
This is "nn::timesrv::detail::service::IPowerStateRequestHandler".
This was added with [9.0.0+].
{| class="wikitable" border="1"
|-
! Cmd || Name
|-
| 0 ||
|-
| 1 ||
|}
= time:s, time:p =
These are "nn::timesrv::detail::service::IStaticService".
These were added with [9.0.0+].
{| class="wikitable" border="1"
|-
! Cmd || Name || Notes
|-
| 0 || GetStandardUserSystemClock || Returns an [[#ISystemClock]].
|-
| 1 || GetStandardNetworkSystemClock || Returns an [[#ISystemClock]].
|-
| 2 || GetStandardSteadyClock || Returns an [[#ISteadyClock]].
|-
| 3 || GetTimeZoneService || Returns an [[#ITimeZoneService]].
|-
| 4 || GetStandardLocalSystemClock || Returns an [[#ISystemClock]].
|-
| 5 || [4.0.0+] GetEphemeralNetworkSystemClock || Returns an [[#ISystemClock]].
|-
| 20 || [6.0.0+] GetSharedMemoryNativeHandle ||
|-
| 30 || [6.0.0-8.1.0] GetStandardNetworkClockOperationEventReadableHandle ||
|-
| 31 || [6.0.0-8.1.0] GetEphemeralNetworkClockOperationEventReadableHandle ||
|-
| 50 || [4.0.0+] SetStandardSteadyClockInternalOffset ||
|-
| 51 || [9.0.0+] GetStandardSteadyClockRtcValue ||
|-
| 100 || IsStandardUserSystemClockAutomaticCorrectionEnabled ||
|-
| 101 || SetStandardUserSystemClockAutomaticCorrectionEnabled ||
|-
| 102 || [5.0.0+] GetStandardUserSystemClockInitialYear ||
|-
| 200 || [3.0.0+] IsStandardNetworkSystemClockAccuracySufficient ||
|-
| 201 || [6.0.0+] GetStandardUserSystemClockAutomaticCorrectionUpdatedTime ||
|-
| 300 || [4.0.0+] CalculateMonotonicSystemClockBaseTimePoint ||
|-
| 400 || [4.0.0+] GetClockSnapshot ||
|-
| 401 || [4.0.0+] GetClockSnapshotFromSystemClockContext ||
|-
| 500 || [4.0.0+] CalculateStandardUserSystemClockDifferenceByUser ||
|-
| 501 || [4.0.0+] CalculateSpanBetween ||
|}
== ISteadyClock ==
This is "nn::timesrv::detail::service::ISteadyClock".
{| class="wikitable" border="1"
|-
! Cmd || Name || Notes
|-
| 0 || GetCurrentTimePoint || No input, returns an output [[#SteadyClockTimePoint]].
|-
| 2 || GetTestOffset || No input, returns an output [[#TimeSpanType]].
|-
| 3 || SetTestOffset || Takes an input [[#TimeSpanType]], no output.
|-
| 100 || [2.0.0+] GetRtcValue || No input, returns an output s64.
|-
| 101 || [2.0.0+] IsRtcResetDetected || No input, returns an output u8 bool.
|-
| 102 || [2.0.0+] GetSetupResultValue || No input, returns an output u32.
|-
| 200 || [3.0.0+] GetInternalOffset || No input, returns an output [[#TimeSpanType]].
|-
| 201 || [3.0.0-3.0.2] SetInternalOffset || Takes an input [[#TimeSpanType]], no output.
|}
=== SteadyClockTimePoint ===
{| class="wikitable" border="1"
|-
! Offset || Size || Description
|-
| 0x0 || 0x8|| A u64 representing a point in time.
|-
| 0x8 || 0x10 || An ID representing the clock source.
|}
This is a 0x18-byte struct.
=== TimeSpanType ===
This is an u64.
== ISystemClock ==
This is "nn::timesrv::detail::service::ISystemClock".
{| class="wikitable" border="1"
|-
! Cmd || Name || Notes
|-
| 0 || GetCurrentTime || Returns an output [[#PosixTime]].
|-
| 1 || SetCurrentTime || Takes an input [[#PosixTime]].
|-
| 2 || GetSystemClockContext || Returns an output [[#SystemClockContext]].
|-
| 3 || SetSystemClockContext || Takes an input [[#SystemClockContext]].
|-
| 4 || [9.0.0+] GetOperationEventReadableHandle ||
|}
=== PosixTime ===
This is an s64 for UTC POSIX time.
=== SystemClockContext ===
This is an 0x20-byte struct.
{| class="wikitable" border="1"
|-
! Offset || Size || Description
|-
| 0x0 || 0x8|| a [[#PosixTime]] representing the system clock epoch.
|-
| 0x8 || 0x18 || a [[#SteadyClockTimePoint]]
|}
== ITimeZoneService ==
This is "nn::timesrv::detail::service::ITimeZoneService".
{| class="wikitable" border="1"
|-
! Cmd || Name || Notes
|-
| 0 || GetDeviceLocationName || No input, returns an output [[#LocationName]].
|-
| 1 || SetDeviceLocationName || Takes an input [[#LocationName]], no output.
|-
| 2 || GetTotalLocationNameCount || No input, returns an output s32.
|-
| 3 || LoadLocationNameList ||
|-
| 4 || LoadTimeZoneRule || Takes an input [[#LocationName]] and a type-0x16 output buffer for [[#TimeZoneRule]], no output.
|-
| 5 || [2.0.0+] GetTimeZoneRuleVersion ||  No input, returns an output [[#TimeZoneRuleVersion]].
|-
| 6 || [5.0.0+] GetDeviceLocationNameAndUpdatedTime ||
|-
| 7 || [9.0.0+] SetDeviceLocationNameWithTimeZoneRule ||
|-
| 8 || [9.0.0+] ParseTimeZoneBinary ||
|-
| 20 || [9.0.0+] GetDeviceLocationNameOperationEventReadableHandle ||
|-
| 100 || ToCalendarTime || Takes an input [[#PosixTime]] and a type-0x15 input buffer for [[#TimeZoneRule]], returns an output [[#CalendarTime]] and [[#CalendarAdditionalInfo]].
|-
| 101 || ToCalendarTimeWithMyRule || Takes an input [[#PosixTime]], returns an output [[#CalendarTime]] and [[#CalendarAdditionalInfo]].
|-
| 201 || ToPosixTime || Takes an input [[#CalendarTime]], a type-0x15 input buffer for [[#TimeZoneRule]], an type-0xA output buffer for [[#PosixTime]] array, and returns an output s32.
|-
| 202 || ToPosixTimeWithMyRule || Takes an input [[#CalendarTime]], an type-0xA output buffer for [[#PosixTime]] array, and returns an output s32.
|}
=== LoadLocationNameList ===
Takes an input s32 LocationName_index and a type-0x6 output buffer for [[#LocationName]], returns an output s32 for total output entries.
=== LocationName ===
This contains a TimeZone location string with a max size of 0x24 bytes.
=== TimeZoneRule ===
This is an 0x4000-byte struct. Official sw uses fixed-size 0x4000 for the buffer size with the above commands.
This is loaded from the [[Title_list|TimeZoneBinary]] title with the specified LocationName under the zoneinfo/ directory, the content is then converted into this TimeZoneRule structure.
The files contained under zoneinfo/ directory are Tzif2 files without Tzif1 header and data at the begining of them (see [https://tools.ietf.org/html/rfc8536 RFC8536] for more information).
The conversion of a Tzif2 file to a TimeZoneRule structure is based on [https://github.com/eggert/tz/blob/master/localtime.c tz database code] with some custom modifications (Leap seconds aren't handled, no usage of "posixrules" and Tzif1 support stripped out).
{| class="wikitable" border="1"
|-
! Offset || Size || Description
|-
| 0x0 || 0x4 || timecnt
|-
| 0x4 || 0x4 || typecnt
|-
| 0x8 || 0x4 || charcnt
|-
| 0xC || 0x1 || goback
|-
| 0xD || 0x1 || goahead
|-
| 0xE || 0x2 || Padding
|-
| 0x10 || 0x8 * 1000 || ats
|-
| 0x1f50 || 0x1 * 1000 || types
|-
| 0x2338 || 0x10 * 128 || ttis (time type information), struct ttinfo[1000]
|-
| 0x2b38 || 0x1 * 512 || chars
|-
| 0x2d38 || 0x4 || defaulttype
|-
| 0x2d3c || 0x12c4 || Reserved / Unused
|}
=== ttinfo ===
This is an 0x10-byte struct.
Represent a Time Type Information used in [[#TimeZoneRule]].
{| class="wikitable" border="1"
|-
! Offset || Size || Description
|-
| 0x0 || 0x4 || tt_gmtoff
|-
| 0x4 || 0x1 || tt_isdst
|-
| 0x5 || 0x3 || Padding
|-
| 0x8 || 0x4 || tt_abbrind
|-
| 0xC || 0x1 || tt_ttisstd
|-
| 0xD || 0x1 || tt_ttisgmt
|-
| 0xE || 0x2 || Padding
|}
=== TimeZoneRuleVersion ===
This is an u128.
=== CalendarTime ===
{| class="wikitable" border="1"
|-
! Offset || Size || Description
|-
| 0x0 || 0x2 || Year
|-
| 0x2 || 0x1 || Month
|-
| 0x3 || 0x1 || Day
|-
| 0x4 || 0x1 || Hour
|-
| 0x5 || 0x1 || Minute
|-
| 0x6 || 0x1 || Second
|-
| 0x7 || 0x1 || Padding / unknown?
|}
This is an 0x8-byte struct.
=== CalendarAdditionalInfo ===
{| class="wikitable" border="1"
|-
! Offset || Size || Description
|-
| 0x0 || 0x4 || 0-based day-of-week.
|-
| 0x4 || 0x4 || 0-based day-of-year.
|-
| 0x8 || 0x8 || Timezone name string.
|-
| 0x10 || 0x4 || 0 = no DST, 1 = DST.
|-
| 0x14 || 0x4 || s32 seconds relative to UTC for this timezone.
|}
This is an 0x18-byte struct. This stores timezone info.
= ins:r =
This is "nn::ins::IReceiverManager".
This was added with [9.0.0+].
{| class="wikitable" border="1"
|-
! Cmd || Name
|-
| 0 ||
|-
| 1 ||
|}
= ins:s =
This is "nn::ins::IReceiverManager".
This was added with [9.0.0+].
{| class="wikitable" border="1"
|-
! Cmd || Name
|-
| 0 ||
|}
|}


Line 283: Line 695:
| 0x65 || [[NV services|NV]]
| 0x65 || [[NV services|NV]]
|}
|}
[[Category:Services]]


= Power Management States =
= Power Management States =
{| class="wikitable" border="1"
{| class="wikitable" border="1"
|-
|-
Line 304: Line 713:
| ReadyShutdown || 5 || Preparing to transition to shutdown.
| ReadyShutdown || 5 || Preparing to transition to shutdown.
|}
|}
[[Category:Services]]