PSC services: Difference between revisions

add power management states
 
(92 intermediate revisions by 5 users not shown)
Line 2: Line 2:


= Concept =
= Concept =
psc:m allows a process to register a module that depends on power management in some way. A client calls GetPmModule to receive an IPmModule (Power Managed Module), and then calls IPmModule->Initialize(module_id, module_dependency_list) where module_id is the ModuleId enum member for the client, and the dependency list is an array of module IDs for the modules that this depends on. Initialize() returns an event handle that the client can wait on to be notified of a power state change.
psc:m allows a process to register a module that depends on power management in some way. A client calls GetPmModule to receive an IPmModule (Power Managed Module), and then calls IPmModule->Initialize(module_id, module_dependency_list) where module_id is the ModuleId enum member for the client, and the dependency list is an array of module IDs for the modules that this depends on. Initialize() returns an event handle that the client can wait on to be notified of a power state change.


Line 34: Line 33:
! Cmd || Name
! Cmd || Name
|-
|-
| 0 || Initialize
| 0 || [[#Initialize|Initialize]]
|-
| 1 || [[#DispatchRequest|DispatchRequest]]
|-
| 2 || [[#GetResult|GetResult]]
|-
| 3 || [[#GetState|GetState]]
|-
|-
| 1 || DispatchRequest
| 4 || [[#Cancel|Cancel]]
|-
|-
| 2 || GetResult
| 5 || [1.0.0-6.2.0] [[#PrintModuleInformation|PrintModuleInformation]]
|-
|-
| 3 || GetState
| 6 || [[#GetModuleInformation|GetModuleInformation]]
|-
|-
| 4 || Cancel
| 7 || [17.0.0+] SetRandomDelay
|-
|-
| 5 || PrintModuleInformation
| 10 || [9.0.0+] [[#GetStateLockUpdateEvent|GetStateLockUpdateEvent]]
|-
|-
| 6 || GetModuleInformation
| 11 || [9.0.0+] [[#IsStateLocked|IsStateLocked]]
|}
|}
== Initialize ==
No input. Returns an output readable Event handle.
== DispatchRequest ==
Takes an input [[#PmState]], an input [[#PmTransitionOrder]] and an input u32 '''Flags'''. No output.
== GetResult ==
No input/output.
== GetState ==
No input. Returns an output [[#PmState]].
== Cancel ==
No input/output.
== PrintModuleInformation ==
No input/output.
== GetModuleInformation ==
Takes two type-0x6 output buffers '''DependencyInformationBefore''' and '''DependencyInformationAfter'''. Returns an output [[#PmModuleTransitionInformation]] and two output u32s '''DependencyInformationBeforeCount''' and '''DependencyInformationAfterCount'''.
== GetStateLockUpdateEvent ==
No input. Returns an output readable Event handle.
== IsStateLocked ==
Takes an input [[#PmState]]. Returns an output bool.


= psc:m =
= psc:m =
Line 54: Line 86:
{| class="wikitable" border="1"
{| class="wikitable" border="1"
|-
|-
! Cmd || Name || Notes
! Cmd || Name
|-
|-
| 0 || GetPmModule || Returns an [[#IPmModule]].
| 0 || [[#GetPmModule|GetPmModule]]
|}
|}
== GetPmModule ==
No input. Returns an [[#IPmModule]].


== IPmModule ==
== IPmModule ==
Line 66: Line 101:
! Cmd || Name
! Cmd || Name
|-
|-
| 0 || Initialize
| 0 || [[#Initialize_2|Initialize]]
|-
|-
| 1 || GetRequest
| 1 || [[#GetRequest|GetRequest]]
|-
|-
| 2 || Acknowledge
| 2 || [[#Acknowledge|Acknowledge]]
|-
|-
| 3 || Finalize
| 3 || [[#Finalize|Finalize]]
|-
|-
| 4 || [6.0.0+] AcknowledgeEx
| 4 || [5.1.0+] [[#AcknowledgeEx|AcknowledgeEx]]
|}
|}
=== Initialize ===
Takes an input [[#PmModuleId]] and a type-0x5 input buffer '''Dependencies'''. Returns an output Event handle.
=== GetRequest ===
No input. Returns an output [[#PmState]] and an output u32 '''Flags'''.
=== Acknowledge ===
No input/output.
On newer versions this cmd just Aborts - this was replaced by [[#AcknowledgeEx|AcknowledgeEx]].
=== Finalize ===
No input/output.
=== AcknowledgeEx ===
Takes an input [[#PmState]]. No output.
= psc:l =
This is "nn::psc::sf::IPmStateLock".
This was added with [9.0.0+].
{| class="wikitable" border="1"
|-
! Cmd || Name
|-
| 0 || [[#Initialize_3|Initialize]]
|-
| 1 || [[#Lock|Lock]]
|-
| 2 || [[#Unlock|Unlock]]
|-
| 3 || [[#IsLocked|IsLocked]]
|-
| 4 || [[#GetRelatedState|GetRelatedState]]
|}
== Initialize ==
Takes an input [[#PmState]]. No output.
== Lock ==
No input/output.
== Unlock ==
No input/output.
== IsLocked ==
No input. Returns an output bool.
== GetRelatedState ==
No input. Returns an output [[#PmState]].


= srepo:u, srepo:a =
= srepo:u, srepo:a =
These are "nn::srepo::detail::ipc::ISrepoService".
These are "nn::srepo::detail::ipc::ISrepoService".
These were added with [5.0.0+].
Some commands are only accessible by srepo:a. srepo:a is only accessible by [[BCAT_services|bcat]] on retail.


{| class="wikitable" border="1"
{| class="wikitable" border="1"
Line 84: Line 175:
! Cmd || Name
! Cmd || Name
|-
|-
| 10100 ||
| 10100 || [[#SaveReport]]
|-
| 10101 || [6.0.0+] [[#SaveReportWithUser]]
|-
| 10200 || [6.0.0+] [[#SaveReportForAntiPiracy]]
|-
| 10201 || [6.0.0+] [[#SaveReportWithUserForAntiPiracy]]
|-
| 10300 || [15.0.0+] [[#SendReportWithUser]]
|-
|-
| 10101 || [6.0.0+]
| 11000 || [6.0.0+] [[#NotifyUserList]]
|-
|-
| 10200 || [6.0.0+]
| 11001 || [6.0.0+] [[#NotifyUserDeleted]]
|-
|-
| 10201 || [6.0.0+]
| 11002 || [6.0.0+] [[#NotifyUserRegistered]]
|-
|-
| 11000 || [6.0.0+]
| 11003 || [6.0.0-10.2.0] [[#NotifyUserClosed]]
|-
|-
| 11001 || [6.0.0+]
| 11004 || [6.0.0-10.2.0] [[#NotifyUserOpened]]
|-
|-
| 11002 || [6.0.0+]
| 11005 || [11.0.0+] [[#NotifyUserClosedWithApplicationId]]
|-
|-
| 11003 || [6.0.0+]
| 11006 || [11.0.0+] [[#NotifyUserOpenedWithApplicationId]]
|-
|-
| 11004 || [6.0.0+]
| 11100 || [6.0.0+] [[#NotifyCompletedNetworkRequestChanged]]
|-
|-
| 11100 || [6.0.0+]
| 11200 || [6.0.0+] [[#NotifyFriendPresenceChanged]]
|-
|-
| 11200 || [6.0.0+]
| 11300 || [6.0.0+] [[#NotifyNotificationConnectivityChanged]]
|-
| 11400 || [6.0.0+] [[#NotifyDeviceOperationModeChanged]]
|-
| 11500 || [6.0.0+] [[#NotifySystemPowerStateChanged]]
|-
| 11600 || [6.0.0+] [[#NotifyAppletLaunched]]
|-
| 11601 || [6.0.0+] [[#NotifyAppletExited]]
|-
| 11602 || [6.0.0+] [[#NotifyForegroundAppletChanged]]
|-
| 11700 || [6.0.0+] [[#NotifyControllerCountChanged]]
|-
| 11800 || [6.0.0+] [[#NotifyAudioInStarted]]
|-
| 11801 || [6.0.0+] [[#NotifyAudioInStopped]]
|-
| 11810 || [8.0.0+] [[#NotifyLaunchApplicationStorage]]
|-
| 11811 || [8.0.0+] [[#NotifyApplicationRightsInfo]]
|-
| 12000 || [8.0.0+] [[#RegisterWatchdog]]
|-
| 12001 || [8.0.0+] [[#UnregisterWatchdog]]
|-
| 12010 || [20.0.0+]
|-
| 13000 || [8.0.0+] [[#GetSyslogLogger]]
|-
| 13001 || [8.0.0-19.0.1] [[#SaveSyslogReport]]
|-
| 13002 || [19.0.0+]
|-
| 13003 || [20.0.0+]
|-
| 13004 || [20.0.0+]
|-
| 20100 || [[#PopReport]]
|-
| 20200 || [[#GetPushEventReadableHandle]]
|-
| 20300 || [6.0.0+] [[#Shutdown]]
|-
| 20400 || [6.0.0+] [[#PopLostByBufferShortageInfo]]
|-
| 20401 || [6.0.0+] [[#GetBufferUsageInfo]]
|-
| 20402 || [7.0.0+] [[#SetDurationReportChatteringDetectionThreshold]]
|-
| 20500 || [8.0.0+] [[#GetWatchdogStatistics]]
|-
| 20600 || [15.0.0+] [[#NotifyForegroundTransmissionResult]]
|}
 
[20.0.0+] Cmd13002 now takes a total of 8-bytes of input.
 
== SaveReport ==
Takes a type-0x9 input buffer containing the [[#EventId]], an input u64 '''ApplicationId''' and a type-0x5 input buffer containing the [[#SystemReport]]. No output.
 
<code>nn::srepo::detail::VerifyEventId</code> is then used with the [[#EventId]], throwing error on failure.
 
The [[#SystemReport]] is used with <code>nn::srepo::detail::VerifyReport</code> and with last param = 0x8000, throwing error on failure.
 
Lastly, the actual processing func is called, returning the Result from here. Besides various cmd input being passed to this etc, this also passes the output from <code>nn::util::GenerateUuid()</code> to this.
 
== SaveReportWithUser ==
Takes a type-0x9 input buffer containing the [[#EventId]], an input u64 '''ApplicationId''', a type-0x5 input buffer containing the [[#SystemReport]] and an input [[Account_services#Uid|Uid]]. No output.
 
Same as [[#SaveReport]] except instead of calling the processing func with Uid=all-zero, the input Uid is passed instead (which must be non-zero).
 
== SaveReportForAntiPiracy ==
Takes a type-0x9 input buffer containing the [[#EventId]], an input u64 '''ApplicationId''' and a type-0x5 input buffer containing the [[#SystemReport]]. No output.
 
Same as [[#SaveReport]] except the [[#SystemReport]] Flags field is 1 instead of 0.
 
== SaveReportWithUserForAntiPiracy ==
Takes a type-0x9 input buffer containing the [[#EventId]], an input u64 '''ApplicationId''', a type-0x5 input buffer containing the [[#SystemReport]] and an input [[Account_services#Uid|Uid]]. No output.
 
Same as [[#SaveReportWithUser]] except the [[#SystemReport]] Flags field is 1 instead of 0.
 
== SendReportWithUser ==
Takes an input [[Account_services#Uid|Uid]], an input u64 '''ApplicationId''', an input bool (padded to u64), two input u32s, a type-0x9 input buffer and a TransferMemory handle. Returns an output [[#IAsyncContext]].
 
The mapped TransferMemory buffer is used with <code>nn::srepo::detail::VerifyReport</code>, returning an error on failure.
 
== NotifyUserList ==
Takes a type-0x9 input buffer containing an array of [[Account_services#Uid|Uid]]. No output.
 
The Sf handler code (func which calls the serv obj vfunc) will throw an error if the buffer size is >0x8F (that is, >8 entries).
 
This gets data from a state list, then clears the is_initialized flag for each entry. Lastly when the input array count is non-zero, this loops through the input array writing each entry into the aforementioned state list. If this would run out of space, it would skip writing that entry and still continue - however this shouldn't be possible with the above Sf check. Then this returns 0.
 
== NotifyUserDeleted ==
Takes an input [[Account_services#Uid|Uid]]. No output.
 
This calls the same state-reset func as [[#NotifyUserList]], except this passes the input Uid instead. Then this returns 0.
 
== NotifyUserRegistered ==
Takes an input [[Account_services#Uid|Uid]]. No output.
 
This calls the same state-writing func as [[#NotifyUserList]], except this passes the input Uid instead. Then this returns 0.
 
== NotifyUserClosed ==
Takes an input [[Account_services#Uid|Uid]]. No output.
 
== NotifyUserOpened ==
Takes an input [[Account_services#Uid|Uid]]. No output.
 
== NotifyUserClosedWithApplicationId ==
Takes an input [[Account_services#Uid|Uid]] and an input u64 '''ApplicationId'''. No output.
 
== NotifyUserOpenedWithApplicationId ==
Takes an input [[Account_services#Uid|Uid]] and an input u64 '''ApplicationId'''. No output.
 
== NotifyCompletedNetworkRequestChanged ==
Takes an input s8 and an input bool. No output.
 
== NotifyFriendPresenceChanged ==
Takes an input [[Account_services#Uid|Uid]] and an input s8 (padded to u64). No output.
 
== NotifyNotificationConnectivityChanged ==
Takes an input s8. No output.
 
== NotifyDeviceOperationModeChanged ==
Takes an input s8. No output.
 
== NotifySystemPowerStateChanged ==
Takes an input s8. No output.
 
== NotifyAppletLaunched ==
Takes an input [[#SfAppletIdentityInfo]]. No output.
 
== NotifyAppletExited ==
Takes an input [[#SfAppletIdentityInfo]]. No output.
 
== NotifyForegroundAppletChanged ==
Takes an input [[#SfAppletIdentityInfo]]. No output.
 
== NotifyControllerCountChanged ==
Takes three input s8s. No output.
 
== NotifyAudioInStarted ==
Takes a type-0x5 input buffer and an input u64. No output.
 
== NotifyAudioInStopped ==
Takes a type-0x5 input buffer and an input u64. No output.
 
== NotifyLaunchApplicationStorage ==
Takes an input u64 '''ApplicationId''' and an input u8 (padded to u64). No output.
 
== NotifyApplicationRightsInfo ==
Takes an input u64 '''ApplicationId''' and an input u32 (padded to u64). No output.
 
If the input u32 is 0 or none of the bits are recognized, this just returns 0. Otherwise the lowest set bit is used to determine a value to write to stack (the ApplicationId is also written afterwards), for passing to a func.
 
{| class="wikitable" border="1"
|-
|-
| 11300 || [6.0.0+]
! Bit || Write value
|-
|-
| 11400 || [6.0.0+]
| 0 || 0x2
|-
|-
| 11500 || [6.0.0+]
| 3 || 0x3
|-
|-
| 11600 || [6.0.0+]
| 4 || 0x4
|-
|-
| 11601 || [6.0.0+]
| 5 || [20.1.0+] 0x5
|-
|-
| 11602 || [6.0.0+]
| 6 || [20.1.0+] 0x6
|}
 
== RegisterWatchdog ==
Takes a type-0x9 input buffer, an input [[#TimeSpanType]] and an input u64. Returns an output [[#WatchdogHandle]].
 
== UnregisterWatchdog ==
Takes an input [[#WatchdogHandle]]. No output.
 
== GetSyslogLogger ==
Takes a type-0x5 input buffer. No output.
 
[9.0.0+] No input. Returns three output u32s, an [[#ISyslogLogger]] and a SharedMemory handle.
 
The SharedMemory is mapped with the returned size and with permissions=RW.
 
== SaveSyslogReport ==
Takes an input u128 "nn::util::Uuid". No output.
 
== PopReport ==
Takes a type-0xA output buffer and a type-0x6 output buffer. Returns an output [[Account_services#Uid|Uid]].
 
[6.0.0+] This now returns an additional output u64 '''ApplicationId''' and an output u128 "nn::util::Uuid".
 
[10.0.0+] This now returns an additional output u64 and two output u32s.
 
This is only usable with srepo:a.
 
== GetPushEventReadableHandle ==
No input. Returns an output Event handle.
 
This is only usable with srepo:a.
 
== Shutdown ==
No input/output.
 
== PopLostByBufferShortageInfo ==
Takes an input u32. Returns two output u64s.
 
The input u32 must be <=1. This gets data from a state array with the specified index.
 
== GetBufferUsageInfo ==
No input. Returns two output u64s.
 
The first u64 is a constant value, while the second u64 is from state.
 
== SetDurationReportChatteringDetectionThreshold ==
Takes an input [[#TimeSpanType]] and an input u64. No output.
 
The input s64 must be >=1. The two input fields are written into global state, and various state is also cleared.
 
== GetWatchdogStatistics ==
No input. Returns an output [[#WatchdogStatistics]].
 
This gets two u64s from global state.
 
== NotifyForegroundTransmissionResult ==
Takes an input u128 "nn::util::Uuid" and an input [[#ResultHolder]]. No output.
 
This goes through the global list of [[#IAsyncContext]] looking for an entry with data matching the input struct, then writes the input [[#ResultHolder]] into that [[#IAsyncContext]]. This Result would then be returned by [[#GetResult]] - the Event from [[#GetSystemEvent]] is also signaled.
 
This always returns 0.
 
== ISyslogLogger ==
This is "nn::srepo::detail::ipc::ISyslogLogger".
 
This was added with [9.0.0+].
 
{| class="wikitable" border="1"
|-
|-
| 11700 || [6.0.0+]
! Cmd || Name
|-
|-
| 11800 || [6.0.0+]
| 0 || [[#ReallocateBuffer|ReallocateBuffer]]
|}
 
=== ReallocateBuffer ===
No input. Returns two output u32s.
 
This does the same entry-allocation in sharedmem as [[#GetSyslogLogger]].
 
== IAsyncContext ==
This is "nn::srepo::detail::ipc::IAsyncContext".
 
This was added with [15.0.0+].
 
{| class="wikitable" border="1"
|-
|-
| 11801 || [6.0.0+]
! Cmd || Name
|-
|-
| 20100 ||
| 0 || [[#GetSystemEvent]]
|-
|-
| 20200 ||
| 1 || [[#Cancel]]
|-
|-
| 20300 || [6.0.0+]
| 2 || [[#GetResult]]
|}
 
=== GetSystemEvent ===
No input, returns an output Event.
 
=== Cancel ===
No input/output.
 
This just returns 0.
 
=== GetResult ===
No input/output.
 
This checks if the Event from GetSystemEvent was signaled throwing an error if not, otherwise this returns the Result stored in the context object.
 
= ovln:rcv =
This is "nn::ovln::IReceiverService".
 
{| class="wikitable" border="1"
|-
|-
| 20400 || [6.0.0+]
! Cmd || Name
|-
|-
| 20401 || [6.0.0+]
| 0 || OpenReceiver
|}
|}


= PSC Module IDs =
== IReceiver ==
This is "nn::ovln::IReceiver".


{| class="wikitable" border="1"
{| class="wikitable" border="1"
|-
|-
! ID || Module
! Cmd || Name
|-
|-
| 0x13 || [[PCIe services|PCIe]]
| 0 || AddSource
|-
|-
| 0x1B ||
| 1 || RemoveSource
|-
|-
| 0x1E ||
| 2 || GetReceiveEventHandle
|-
|-
| 0x29 || [[Log services|nn::psc::PmModuleId_Lm]]
| 3 || Receive
|-
| 4 || ReceiveWithTick
|}
|}


[[Category:Services]]
= ovln:snd =
This is "nn::ovln::ISenderService".
 
{| class="wikitable" border="1"
|-
! Cmd || Name
|-
| 0 || OpenSender
|}
 
== ISender ==
This is "nn::ovln::ISender".
 
{| class="wikitable" border="1"
|-
! Cmd || Name
|-
| 0 || Send
|-
| 1 || GetUnreceivedMessageCount
|}
 
= time:m =
This is "nn::timesrv::detail::service::ITimeServiceManager".
 
This was added with [9.0.0+].
 
This service has max_sessions 1.
 
{| class="wikitable" border="1"
|-
! Cmd || Name
|-
| 0 || [[#GetStaticServiceAsUser]]
|-
| 5 || [[#GetStaticServiceAsAdmin]]
|-
| 6 || [[#GetStaticServiceAsRepair]]
|-
| 9 || [[#GetStaticServiceAsServiceManager]]
|-
| 10 || [[#SetupStandardSteadyClockCore]]
|-
| 11 || [[#SetupStandardLocalSystemClockCore]]
|-
| 12 || [[#SetupStandardNetworkSystemClockCore]]
|-
| 13 || [[#SetupStandardUserSystemClockCore]]
|-
| 14 || [[#SetupTimeZoneServiceCore]]
|-
| 15 || [[#SetupEphemeralNetworkSystemClockCore]]
|-
| 20 || [19.0.0+] GetStandardSteadyClockCurrentTimePoint
|-
| 50 || GetStandardLocalClockOperationEvent
|-
| 51 || GetStandardNetworkClockOperationEventForServiceManager
|-
| 52 || GetEphemeralNetworkClockOperationEventForServiceManager
|-
| 60 || GetStandardUserSystemClockAutomaticCorrectionUpdatedEvent
|-
| 100 || [[#SetStandardSteadyClockBaseTime]]
|-
| 200 || GetClosestAlarmUpdatedEvent
|-
| 201 || [[#CheckAndSignalAlarms]]
|-
| 202 || GetClosestAlarmInfo
|}
 
== GetStaticServiceAsUser ==
Returns an [[#IStaticService]].
 
This is used for the wrapped instance of "time:u" in [[Glue_services#time:a.2C_time:r.2C_time:u|glue]].
 
== GetStaticServiceAsAdmin ==
Returns an [[#IStaticService]].
 
This is used for the wrapped instance of "time:a" in [[Glue_services#time:a.2C_time:r.2C_time:u|glue]].
 
== GetStaticServiceAsRepair ==
Returns an [[#IStaticService]].
 
This is used for the wrapped instance of "time:r" in [[Glue_services#time:a.2C_time:r.2C_time:u|glue]].
 
== GetStaticServiceAsServiceManager ==
Returns an [[#IStaticService]].
 
This is used as a wrapper for "time:sm".
 
== SetupStandardSteadyClockCore ==
Takes an input rtc_clock_source UUID, an input rtc_offset s64, an input internal_offset s64, an input test_offset s64 and a is_rtc_reset_detected bool. No output.
 
== SetupStandardLocalSystemClockCore ==
Takes an input [[#SystemClockContext]] and an input [[#PosixTime]]. No output.
 
== SetupStandardNetworkSystemClockCore ==
Takes an input [[#SystemClockContext]] and an input sufficient_accuracy_minutes u64. No output.
 
== SetupStandardUserSystemClockCore ==
Takes an input automatic_correction bool and an input [[#SteadyClockTimePoint]]. No output.
 
== SetupTimeZoneServiceCore ==
Takes an input [[#LocationName]], an input [[#SteadyClockTimePoint]], an input total_location_name_count u32, an input [[#TimeZoneRuleVersion]] and a type-0x21 input buffer containing a TimeZoneBinary. No output.
 
== SetupEphemeralNetworkSystemClockCore ==
No input, no output.
 
== SetStandardSteadyClockBaseTime ==
An input rtc_offset s64, no output.
 
== CheckAndSignalAlarms ==
No input, no output.
 
= time:al =
This is "nn::timesrv::detail::service::IAlarmService".
 
This was added with [9.0.0+].
 
This has max_sessions 4.
 
{| class="wikitable" border="1"
|-
! Cmd || Name
|-
| 0 || [[#CreateWakeupAlarm]]
|-
| 1 || [[#CreateBackgroundTaskAlarm]]
|}
 
== CreateWakeupAlarm ==
No input. Returns an [[#ISteadyClockAlarm]].
 
== CreateBackgroundTaskAlarm ==
No input. Returns an [[#ISteadyClockAlarm]].
 
== ISteadyClockAlarm ==
This is "nn::timesrv::detail::service::ISteadyClockAlarm".
 
This was added with [9.0.0+].
 
{| class="wikitable" border="1"
|-
! Cmd || Name
|-
| 0 || [[#GetAlarmEvent]]
|-
| 1 || [[#Enable]]
|-
| 2 || [[#Disable]]
|-
| 3 || [[#IsEnabled]]
|-
| 10 || [[#CreateWakeLock]]
|-
| 11 || [[#DestroyWakeLock]]
|}
 
=== GetAlarmEvent ===
No input, returns an output Event handle with EventClearMode=0.
 
Official sw uses this during object creation.
 
=== Enable ===
Takes an input u64, no output.
 
The u64 is a nanoseconds value.
 
=== Disable ===
No input/output.
 
Official sw uses [[#IsEnabled]] first, if the output bool is 0 it will skip using the Disable cmd.
 
=== IsEnabled ===
No input, returns an output bool.
 
=== CreateWakeLock ===
Opens a session for [[#psc:l|psc:l]] and returns it's interface.
 
=== DestroyWakeLock ===
No input/output.
 
Close the session opened by [[#CreateWakeLock]] when the alarm is disabled.
 
= time:p =
This is "nn::timesrv::detail::service::IPowerStateRequestHandler".
 
This was added with [9.0.0+].
 
This service has max_sessions 1.
 
{| class="wikitable" border="1"
|-
! Cmd || Name
|-
| 0 || GetPowerStateRequestEventReadableHandle
|-
| 1 || GetAndClearPowerStateRequest
|}
 
= time:su, time:s =
These are "nn::timesrv::detail::service::IStaticService".
 
These were added with [9.0.0+].
 
The time:su service has max_sessions 6, and time:s has max_sessions 4.
 
{| 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 s64.
 
== 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 || [[#GetInputSourceState]]
|-
| 1 || [[#GetTriggerTargetEvent]]
|}
 
== GetInputSourceState ==
Takes an input u32 '''SourceId'''. Returns an output u64 '''EventTime'''.
 
== GetTriggerTargetEvent ==
Takes an input u32 '''SourceId''' and an input u64 (unused, official software passes struct pointer). Returns an output Event handle with autoclear disabled.
 
= ins:s =
This is "nn::ins::ISenderManager".
 
This was added with [9.0.0+].
 
{| class="wikitable" border="1"
|-
! Cmd || Name
|-
| 0 || [[#GetNotifyEvent]]
|}
 
== GetNotifyEvent ==
Takes an input u32 '''SourceId''' and an input u64 (unused, official software passes struct pointer). Returns an output Event handle with autoclear disabled.
 
= hshl:sys =
This is "nn::hshl::IManager".
 
This was added with [11.0.0+].
 
{| class="wikitable" border="1"
|-
! Cmd || Name
|-
| 0 || GetBatteryPercentage
|-
| 1 || GetChargerType
|-
| 2 || [[#OpenChargeSession]]
|-
| 3 || GetRawBatteryPercentage
|-
| 4 || GetBatteryVoltageLevel
|-
| 5 || [[#OpenThermalSession]]
|-
| 6 || GetAbnormalTemperatureSet
|-
| 7 || [[#OpenClockSession]]
|-
| 8 || GetClockRate
|-
| 9 || [17.0.0+] [[#OpenBridgeSession]]
|-
| 10 || [17.0.0+] GetBridgePowerSupply
|-
| 11 || [18.0.0+] [[#OpenVsysVoltageSession]]
|-
| 12 || [18.0.0+] GetIsBatteryEnoughForFullAwake
|-
| 13 || [19.0.0+] GetIsCharging
|-
| 14 || [20.0.0+]
|-
| 15 || [20.0.0+]
|}
 
== OpenChargeSession ==
No input. Returns an [[#IChargeSession]].
 
== OpenThermalSession ==
No input. Returns an [[#IThermalSession]].
 
== OpenClockSession ==
Takes an input u32. Returns an [[#IClockSession]].
 
== OpenBridgeSession ==
No input. Returns an [[#IBridgeSession]].
 
== OpenVsysVoltageSession ==
No input. Returns an [[#IVsysVoltageSession]].
 
== IChargeSession ==
This is "nn::hshl::IChargeSession".
 
{| class="wikitable" border="1"
|-
! Cmd || Name
|-
| 0 || GetStateChangeEvent
|-
| 1 || SetStateChangeSet
|}
 
== IThermalSession ==
This is "nn::hshl::IThermalSession".
 
{| class="wikitable" border="1"
|-
! Cmd || Name
|-
| 0 || GetAbnormalTemperatureEvent
|-
| 1 || SetAbnormalTemperatureEventMask
|}
 
== IClockSession ==
This is "nn::hshl::IClockSession".
 
{| class="wikitable" border="1"
|-
! Cmd || Name
|-
| 0 || GetStateChangeEvent
|}
 
== IBridgeSession ==
This is "nn::hshl::IBridgeSession".
 
{| class="wikitable" border="1"
|-
! Cmd || Name
|-
| 0 || GetStateChangeEvent
|}
 
== IVsysVoltageSession ==
This is "nn::hshl::IVsysVoltageSession".
 
{| class="wikitable" border="1"
|-
! Cmd || Name
|-
| 0 || GetStateChangeEvent
|}
 
= hshl:set =
This is "nn::hshl::ISetterManager".
 
This was added with [11.0.0+].
 
{| class="wikitable" border="1"
|-
! Cmd || Name
|-
| 0 || [[#OpenChargeSession_2|OpenChargeSession]]
|-
| 1 || [[#OpenThermalSession_2|OpenThermalSession]]
|-
| 2 || SetClockRate
|-
| 3 || [17.0.0+] SetBridgePowerSupply
|-
| 4 || [18.0.0+]
|-
| 5 || [18.0.0+]
|}
 
== OpenChargeSession ==
Takes an input u32. Returns an [[#IChargeSetterSession]].
 
== OpenThermalSession ==
Takes an input u32. Returns an [[#IThermalSetterSession]].
 
== IChargeSetterSession ==
This is "nn::hshl::IChargeSetterSession".
 
{| class="wikitable" border="1"
|-
! Cmd || Name
|-
| 0 || SetBatteryPercentage
|-
| 1 || SetRawBatteryPercentage
|-
| 2 || SetChargerType
|-
| 3 || SetBatteryVoltageLevel
|-
| 4 || [18.0.0+]
|-
| 5 || [19.0.0+]
|-
| 6 || [20.0.0+]
|-
| 7 || [20.0.0+]
|}
 
== IThermalSetterSession ==
This is "nn::hshl::IThermalSetterSession".
 
{| class="wikitable" border="1"
|-
! Cmd || Name
|-
| 0 || SetAbnormalTemperatureSet
|}
 
= PmModuleId =
This is "nn::psc::PmModuleId".
 
{| class="wikitable" border="1"
|-
! Name || Module
|-
| 0x00 || Reserved0
|-
| 0x01 || Reserved1
|-
| 0x02 || Reserved2
|-
| 0x03 || [[Sockets_services|Socket]]
|-
| 0x04 || [[USB_services|Usb]]
|-
| 0x05 || [[Ethernet_services|Eth]]
|-
| 0x06 || [[PTM_services|Fgm]]
|-
| 0x07 || [[PCV_services|PcvClock]]
|-
| 0x08 || [[PCV_services|PcvVoltage]]
|-
| 0x09 || [[Bus_services|Gpio]]
|-
| 0x0A || [[Bus_services|Pinmux]]
|-
| 0x0B || [[Bus_services|Uart]]
|-
| 0x0C || [[Bus_services|I2c]]
|-
| 0x0D || [[Bus_services|I2cPowerBus]]
|-
| 0x0E || [[Bus_services|Spi]]
|-
| 0x0F || [[Bus_services|Pwm]]
|-
| 0x10 || [[PTM_services|Psm]]
|-
| 0x11 || [[PTM_services|Tc]]
|-
| 0x12 || [[OMM_services|Omm]]
|-
| 0x13 || [[PCIe_services|Pcie]]
|-
| 0x14 || [[Backlight_services|Lbl]]
|-
| 0x15 || [[Nvnflinger_services|Display]]
|-
| 0x16 || [[Display_services|Multimedia]]
|-
| 0x17 || Time
|-
| 0x18 || [[HID_services|Hid]]
|-
| 0x19 || [[WLAN_services|SocketWlan]]
|-
| 0x1A || [[WLAN_services|Wlan]]
|-
| 0x1B || [[Filesystem_services|Fs]]
|-
| 0x1C || [[Audio_services|Audio]]
|-
| 0x1D || [[TMA_services|Tm]]
|-
| 0x1E || [[TMA_services|TmHostIo]]
|-
| 0x1F || [[Bluetooth_Driver_services|Bluetooth]]
|-
| 0x20 || [[PCV_services|Bpc]]
|-
| 0x21 || [[PTM_services|Fan]]
|-
| 0x22 || [[PTM_services|Pcm]]
|-
| 0x23 || [[NFC_services|Nfc]]
|-
| 0x24 || [[PTM_services|Apm]]
|-
| 0x25 || [[BTM_services|Btm]]
|-
| 0x26 || [[Network_Interface_services|Nifm]]
|-
| 0x27 || [[Bus_services|GpioLow]]
|-
| 0x28 || [[NPNS_services|Npns]]
|-
| 0x29 || [[Log_services|Lm]]
|-
| 0x2A || [[BCAT_services|Bcat]]
|-
| 0x2B || [[Glue_services|Time]]
|-
| 0x2C || [[Parental_Control_services|Pctl]]
|-
| 0x2D || [[Error_Report_services|Erpt]]
|-
| 0x2E || [[Error_Upload_services|Eupld]]
|-
| 0x2F || [[Friend_services|Friends]]
|-
| 0x30 || [[Glue_services|Bgtc]]
|-
| 0x31 || [[Account_services|Account]]
|-
| 0x32 || [[Bus_services|Sasbus]]
|-
| 0x33 || [[NIM_services|Ntc]]
|-
| 0x34 || [[OMM_services|Idle]]
|-
| 0x35 || [[Applet_Manager_services|Tcap]]
|-
| 0x36 || [[PTM_services|PsmLow]]
|-
| 0x37 || [[LDN_services|Ndd]]
|-
| 0x38 || [[OLSC_services|Olsc]]
|-
| 0x39 || [[PCV_services|Rtc]]
|-
| 0x3A || [[PCV_services|Regulator]]
|-
| 0x3B || [[PCV_services|Clkrst]]
|-
| 0x3C || [[Bus_services|Led]]
|-
| 0x3D || [[NS_Services|NuiShell]]
|-
| 0x3E || [[PTM_services|Powctl]]
|-
| 0x3F || [[OMM_services|NotificationPresenter]]
|-
| 0x40 || [[Glue_services|Notification]]
|-
| 0x41 || [[Sockets_services|Dhcpc]]
|-
| 0x42 || [[BCAT_services|Mnpp]]
|-
| 0x43 || [[OLSC_services|Sprofile]]
|-
| 0x65 || [[NV_services|NvHost]]
|-
| 0x69 || NvDbgSvc
|-
| 0x6A || Tspm
|-
| 0x7F || [[OMM_services|Spsm]]
|}
 
= PmState =
This is "nn::psc::PmState".
 
{| class="wikitable" border="1"
|-
! Value || Name || Description
|-
| 0 || FullAwake || Everything is awake.
|-
| 1 || MinimumAwake || Preparing to transition to awake.
|-
| 2 || SleepReady || Preparing to transition to sleep.
|-
| 3 || EssentialServicesSleepReady || Critical services are ready to sleep.
|-
| 4 || EssentialServicesAwake || Critical services are ready to wake up.
|-
| 5 || ShutdownReady || Preparing to transition to shutdown.
|-
| 6 || Invalid || Default state.
|}
 
= PmTransitionOrder =
This is "nn::psc::PmTransitionOrder".
 
{| class="wikitable" border="1"
|-
! Value
! Description
|-
| 0 || ToLowerPowerState
|-
| 1 || ToHigherPowerState
|}
 
= PmModuleTransitionInformation =
{| class="wikitable" border="1"
|-
! Offset
! Size
! Description
|-
| 0x00
| 0x08
| TimeBefore
|-
| 0x08
| 0x10
| TimeAfter
|-
| 0x10
| 0x04
| Result
|-
| 0x14
| 0x04
| [[#PmState|StateBefore]]
|-
| 0x18
| 0x04
| [[#PmState|StateAfter]]
|-
| 0x1C
| 0x04
| Reserved
|}


= Power Management States =
= SystemReport =
This is "nn::srepo::SystemReport".


{| class="wikitable" border="1"
{| class="wikitable" border="1"
|-
|-
! ID || Name || Description
! Offset
! Size
! Description
|-
| 0x00
| 0x20
| [[#EventId|EventId]]
|-
| 0x20
| 0x08
| ApplicationId
|-
| 0x28
| 0x04
| Flags
|-
| 0x2C
| 0x01
|
|-
| 0x2D
| 0x03
| Reserved
|-
|-
| Awake || 0 || Everything is awake.
| 0x30
| 0x08
| ReportBufferAddress
|-
|-
| ReadyAwaken || 1 || Preparing to transition to awake.
| 0x38
| 0x08
| ReportBufferTotalSize
|-
|-
| ReadySleep || 2 || Preparing to transition to sleep.
| 0x40
| 0x08
| ReportBufferCurrentSize
|}
 
= EventId =
This is "nn::srepo::EventId". This is a 0x20-byte string.
 
= WatchdogHandle =
This is "nn::srepo::WatchdogHandle". This is an u64.
 
= WatchdogStatistics =
This is "nn::srepo::WatchdogStatistics".
 
{| class="wikitable" border="1"
|-
|-
| ReadySleepCritical || 3 || Critical services are ready to sleep.
! Offset
! Size
! Description
|-
|-
| ReadyAwakenCritical || 4 || Critical services are ready to wake up.
| 0x00
| 0x08
|  
|-
|-
| ReadyShutdown || 5 || Preparing to transition to shutdown.
| 0x08
| 0x08
|  
|}
|}
= ResultHolder =
This is "nn::srepo::detail::ipc::ResultHolder". This is an u32.
= SfAppletIdentityInfo =
This is "nn::srepo::detail::ipc::SfAppletIdentityInfo". This is a 0x10-byte struct.
[[Category:Services]]