PSC services: Difference between revisions

No edit summary
 
(3 intermediate revisions by the same user not shown)
Line 1: Line 1:
PSC (Power State Control) provides services related to power state changes in the system.
PSC (Power State Control) provides services related to power state changes in the system.
= 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:c allows a module to the power state controller for the system (in practice, AM is the only client to the controller). IPmControl->DispatchRequest() is used notify all IPmModules of a state change.
For example, FS registers itself as an IPmModule with dependencies on pinmux, gpio, pcv, tma, and initializes the SD card once those dependencies have registered..
It then does (basically) the following pseudocode (actual code located at .text + 0xB2DB0 in 6.0.0 FS):
    while (true) {
        Fs_IPmModule->WaitSignaled();
       
        Fs_IPmModule->GetRequest(&state);
        switch (state) {
            case WakingUp:
                /* hardware devices are woken up here */
            case GoingToSleep:
                /* hardware devices are put to sleep here */
            case ShuttingDown:
                /* hardware devices are turned off here */
        }
       
        Fs_IPmModule->Acknowledge(state);
    }


= psc:c =
= psc:c =
Line 491: Line 466:
! Cmd || Name
! Cmd || Name
|-
|-
| 0 || OpenReceiver
| 0 || [[#OpenReceiver|OpenReceiver]]
|}
|}
== OpenReceiver ==
No input. Returns an [[#IReceiver|IReceiver]].


== IReceiver ==
== IReceiver ==
Line 501: Line 479:
! Cmd || Name
! Cmd || Name
|-
|-
| 0 || AddSource
| 0 || [[#AddSource|AddSource]]
|-
|-
| 1 || RemoveSource
| 1 || [[#RemoveSource|RemoveSource]]
|-
|-
| 2 || GetReceiveEventHandle
| 2 || [[#GetReceiveEventHandle|GetReceiveEventHandle]]
|-
|-
| 3 || Receive
| 3 || [[#Receive|Receive]]
|-
|-
| 4 || ReceiveWithTick
| 4 || [[#ReceiveWithTick|ReceiveWithTick]]
|}
|}
=== AddSource ===
Takes an input [[#SourceName|SourceName]]. No output.
=== RemoveSource ===
Takes an input [[#SourceName|SourceName]]. No output.
=== GetReceiveEventHandle ===
No input. Returns an output Event handle.
=== Receive ===
No input. Returns an output [[#RawMessage|RawMessage]].
=== ReceiveWithTick ===
No input. Returns an output [[#RawMessage|RawMessage]] and an output s64.


= ovln:snd =
= ovln:snd =
Line 519: Line 512:
! Cmd || Name
! Cmd || Name
|-
|-
| 0 || OpenSender
| 0 || [[#OpenSender|OpenSender]]
|}
|}
== OpenSender ==
Takes an input [[#SourceName|SourceName]] and an input [[#QueueAttribute|QueueAttribute]]. Returns an [[#ISender|ISender]].


== ISender ==
== ISender ==
Line 529: Line 525:
! Cmd || Name
! Cmd || Name
|-
|-
| 0 || Send
| 0 || [[#Send|Send]]
|-
|-
| 1 || GetUnreceivedMessageCount
| 1 || [[#GetUnreceivedMessageCount|GetUnreceivedMessageCount]]
|}
|}
=== Send ===
Takes an input [[#RawMessage|RawMessage]] and an input [[#SendOption|SendOption]]. No output.
=== GetUnreceivedMessageCount ===
No input. Returns an output u32.


= time:m =
= time:m =
Line 567: Line 569:
| 20 || [19.0.0+] GetStandardSteadyClockCurrentTimePoint
| 20 || [19.0.0+] GetStandardSteadyClockCurrentTimePoint
|-
|-
| 21 || [22.0.0+]  
| 21 || [22.0.0+] GetStandardNetworkSystemClockCurrentTime
|-
|-
| 50 || GetStandardLocalClockOperationEvent
| 50 || GetStandardLocalClockOperationEvent
Line 768: Line 770:
|-
|-
| 501 || [4.0.0+] CalculateSpanBetween ||  
| 501 || [4.0.0+] CalculateSpanBetween ||  
|-
| 600 || [19.0.0+] GetInitialLaunchEndTime ||
|-
| 601 || [22.0.0+] NotifyInitialLaunchSettingsDone ||
|}
|}


Line 1,390: Line 1,396:
! Description
! Description
|-
|-
| 0x00
| 0x0
| 0x08
| 0x8
| TimeBefore
| TimeBefore
|-
|-
| 0x08
| 0x8
| 0x10
| 0x10
| TimeAfter
| TimeAfter
|-
|-
| 0x10
| 0x10
| 0x04
| 0x4
| Result
| Result
|-
|-
| 0x14
| 0x14
| 0x04
| 0x4
| [[#PmState|StateBefore]]
| [[#PmState|StateBefore]]
|-
|-
| 0x18
| 0x18
| 0x04
| 0x4
| [[#PmState|StateAfter]]
| [[#PmState|StateAfter]]
|-
|-
| 0x1C
| 0x1C
| 0x04
| 0x4
| Reserved
| Reserved
|}
|}
Line 1,424: Line 1,430:
! Description
! Description
|-
|-
| 0x00
| 0x0
| 0x20
| 0x20
| [[#EventId|EventId]]
| [[#EventId|EventId]]
|-
|-
| 0x20
| 0x20
| 0x08
| 0x8
| ApplicationId
| ApplicationId
|-
|-
| 0x28
| 0x28
| 0x04
| 0x4
| Flags
| Flags
|-
|-
| 0x2C
| 0x2C
| 0x01
| 0x1
|  
|  
|-
|-
| 0x2D
| 0x2D
| 0x03
| 0x3
| Reserved
| Reserved
|-
|-
| 0x30
| 0x30
| 0x08
| 0x8
| ReportBufferAddress
| ReportBufferAddress
|-
|-
| 0x38
| 0x38
| 0x08
| 0x8
| ReportBufferTotalSize
| ReportBufferTotalSize
|-
|-
| 0x40
| 0x40
| 0x08
| 0x8
| ReportBufferCurrentSize
| ReportBufferCurrentSize
|}
|}
Line 1,472: Line 1,478:
! Description
! Description
|-
|-
| 0x00
| 0x0
| 0x08
| 0x8
|  
|  
|-
|-
| 0x08
| 0x8
| 0x08
| 0x8
|  
|  
|}
|}
Line 1,486: Line 1,492:
= SfAppletIdentityInfo =
= SfAppletIdentityInfo =
This is "nn::srepo::detail::ipc::SfAppletIdentityInfo". This is a 0x10-byte struct.
This is "nn::srepo::detail::ipc::SfAppletIdentityInfo". This is a 0x10-byte struct.
= SourceName =
This is "nn::ovln::SourceName".
{| class="wikitable" border="1"
|-
! Offset
! Size
! Description
|-
| 0x0
| 0x10
| Name
|}
= RawMessage =
This is "nn::ovln::RawMessage".
{| class="wikitable" border="1"
|-
! Offset
! Size
! Description
|-
| 0x0
| 0x4
| Tag
|-
| 0x4
| 0x4
| DataSize
|-
| 0x8
| 0x78
| Data
|}
= QueueAttribute =
This is "nn::ovln::QueueAttribute".
{| class="wikitable" border="1"
|-
! Offset
! Size
! Description
|-
| 0x0
| 0x4
| QueueLength
|-
| 0x4
| 0x4
| Reserved
|}
= SendOption =
This is "nn::ovln::SendOption".
{| class="wikitable" border="1"
|-
! Offset
! Size
! Description
|-
| 0x0
| 0x1
| EnqueuePosition
|-
| 0x1
| 0x1
| OverflowOption
|-
| 0x2
| 0x6
| Reserved
|}
== EnqueuePosition ==
This is "nn::ovln::EnqueuePosition".
{| class="wikitable" border="1"
|-
! Value
! Description
|-
| 0 || Front
|-
| 1 || Back
|}
== OverflowOption ==
This is "nn::ovln::OverflowOption".
{| class="wikitable" border="1"
|-
! Value
! Description
|-
| 0 || Error
|-
| 1 || RemoveFront
|-
| 2 || RemoveBack
|-
| 3 || Block
|}
= Notes =
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:c allows a module to the power state controller for the system (in practice, AM is the only client to the controller). IPmControl->DispatchRequest() is used notify all IPmModules of a state change.
For example, FS registers itself as an IPmModule with dependencies on pinmux, gpio, pcv, tma, and initializes the SD card once those dependencies have registered..
It then does (basically) the following pseudocode (actual code located at .text + 0xB2DB0 in 6.0.0 FS):
    while (true) {
        Fs_IPmModule->WaitSignaled();
       
        Fs_IPmModule->GetRequest(&state);
        switch (state) {
            case WakingUp:
                /* hardware devices are woken up here */
            case GoingToSleep:
                /* hardware devices are put to sleep here */
            case ShuttingDown:
                /* hardware devices are turned off here */
        }
       
        Fs_IPmModule->Acknowledge(state);
    }


[[Category:Services]]
[[Category:Services]]