PCV services

Revision as of 19:19, 24 April 2019 by Hexkyz (talk | contribs)

bpc

This is "nn::bpc::IBoardPowerControlManager".

Cmd Name
0 ShutdownSystem
1 RebootSystem
2 GetWakeupReason
3 GetShutdownReason
4 GetAcOk
5 GetBoardPowerControlEvent
6 [2.0.0+] GetSleepButtonState
7 [2.0.0+] GetPowerEvent
8 [2.0.0+]
9 [2.0.0+]
10 [2.0.0+]
11 [3.0.0+]
12 [3.0.0+]
13 [3.0.0+]
14 [6.0.0+]

bpc:r

This is "nn::bpc::IRtcManager".

Cmd Name
0 GetExternalRtcValue
1 SetExternalRtcValue
2 ReadExternalRtcResetFlag
3 [2.0.0+] ClearExternalRtcResetFlag
4 [3.0.0+]

GetExternalRtcValue / SetExternalRtcValue directly accesses the max77620_rtc0 device.

pcv

This is "nn::pcv::detail::IPcvService".

Cmd Name
[1.0.0-7.0.1] 0 SetPowerEnabled
[1.0.0-7.0.1] 1 SetClockEnabled
[1.0.0-7.0.1] 2 SetClockRate
[1.0.0-7.0.1] 3 GetClockRate
[1.0.0-7.0.1] 4 GetState
[1.0.0-7.0.1] 5 GetPossibleClockRates
[1.0.0-7.0.1] 6 SetMinVClockRate
[1.0.0-7.0.1] 7 SetReset
[1.0.0-7.0.1] 8 SetVoltageEnabled
[1.0.0-7.0.1] 9 GetVoltageEnabled
[1.0.0-7.0.1] 10 GetVoltageRange
[1.0.0-7.0.1] 11 SetVoltageValue
[1.0.0-7.0.1] 12 GetVoltageValue
[1.0.0-7.0.1] 13 GetTemperatureThresholds
[1.0.0-7.0.1] 14 SetTemperature
[1.0.0-5.1.0] 15 Initialize
[1.0.0-5.1.0] 16 IsInitialized
[1.0.0-5.1.0] 17 Finalize
[3.0.0-7.0.1] 18 PowerOn
[3.0.0-7.0.1] 19 PowerOff
[3.0.0-7.0.1] 20 ChangeVoltage
[3.0.0-7.0.1] 21 GetPowerClockInfoEvent
[3.0.0-7.0.1] 22 GetOscillatorClock
[3.0.0-7.0.1] 23 GetDvfsTable
[3.0.0-7.0.1] 24 GetModuleStateTable
[3.0.0-7.0.1] 25 GetPowerDomainStateTable
26 [3.0.0+] GetFuseInfo
27 [5.0.0+] GetDramId
[6.0.0-7.0.1] 28
[6.0.0-7.0.1] 29

[7.0.0+] The type-0xA output buffers were replaced with type-0x22 output buffers, for the following: GetDvfsTable, GetModuleStateTable, and GetPowerDomainStateTable.

Modules

These are "nn::pcv::Module_X" where X is the power, clock and reset block name.

[8.0.0+] Every module name is now mapped to an ID.

Power Switch / Clocking / Reset

Name ID Block Rail Notes
0 0x40000001 CpuBus vdd_cpu
1 0x40000002 GPU vdd_gpu
2 0x40000003 I2S1 vdd_soc
3 0x40000004 I2S2 vdd_soc
4 0x40000005 I2S3 vdd_soc
5 0x40000006 PWM vdd_soc
6 0x02000001 I2C1 vdd_soc
7 0x02000002 I2C2 vdd_soc
8 0x02000003 I2C3 vdd_soc
9 0x02000004 I2C4 vdd_soc
10 0x02000005 I2C5 vdd_soc
11 0x02000006 I2C6 vdd_soc
12 0x07000000 SPI1 vdd_soc
13 0x07000001 SPI2 vdd_soc
14 0x07000002 SPI3 vdd_soc
15 0x07000003 SPI4 vdd_soc
16 0x40000011 DISP1 vdd_soc
17 0x40000012 DISP2 vdd_soc
18 0x40000013 - - Not an actual block. Used for debug.
19 0x40000014 - - Not an actual block. Used for debug.
20 0x40000015 SDMMC1 vdd_soc
21 0x40000016 SDMMC2 vdd_soc
22 0x40000017 SDMMC3 vdd_soc
23 0x40000018 SDMMC4 vdd_soc
24 0x40000019 - - Not an actual block. Used for debug.
25 0x4000001A CSITE vdd_soc
26 0x4000001B TSEC vdd_soc
27 0x4000001C MSELECT vdd_soc
28 0x4000001D HDA2CODEC_2X vdd_soc
29 0x4000001E ACTMON vdd_soc
30 0x4000001F I2C_SLOW vdd_soc
31 0x40000020 SOR1 vdd_soc
32 0x40000021 - - Not an actual block. Used for debug.
33 0x40000022 HDA vdd_soc
34 0x40000023 XUSB_CORE_HOST vdd_soc
35 0x40000024 XUSB_FALCON vdd_soc
36 0x40000025 XUSB_FS vdd_soc
37 0x40000026 XUSB_CORE_DEV vdd_soc
38 0x40000027 XUSB_SS_HOSTDEV vdd_soc
39 0x03000001 UARTA vdd_soc
40 0x35000405 UARTB vdd_soc
41 0x3500040F UARTC vdd_soc
42 0x37000001 UARTD vdd_soc
43 0x4000002C HOST1X vdd_soc
44 0x4000002D ENTROPY vdd_soc
45 0x4000002E SOC_THERM vdd_soc
46 0x4000002F VIC vdd_soc
47 0x40000030 NVENC vdd_soc
48 0x40000031 NVJPG vdd_soc
49 0x40000032 NVDEC vdd_soc
50 0x40000033 QSPI vdd_soc
51 0x40000034 - - Not an actual block. Used for debug.
52 0x40000035 TSECB vdd_soc
53 0x40000036 APE vdd_soc
54 0x40000037 ACLK vdd_soc
55 0x40000038 UARTAPE vdd_soc
56 0x40000039 EMC vdd_soc
57 0x4000003A PLLE0 vdd_soc
58 0x4000003B PLLE0 vdd_soc
59 0x4000003C DSI vdd_soc
60 0x4000003D MAUD vdd_soc
61 0x4000003E DPAUX1 vdd_soc
62 0x4000003F MIPI_CAL vdd_soc
63 0x40000040 UART_FST_MIPI_CAL vdd_soc
64 0x40000041 OSC vdd_soc
65 0x40000042 SCLK vdd_soc
66 0x40000043 SOR_SAFE vdd_soc
67 0x40000044 XUSB_SS vdd_soc
68 0x40000045 XUSB_HOST vdd_soc
69 0x40000046 XUSB_DEV vdd_soc
70 0x40000047 EXTPERIPH1 vdd_soc
71 0x40000048 AHUB vdd_soc
72 0x40000049 HDA2HDMICODEC vdd_soc
73 0x4000004A PLLP5 vdd_soc
74 0x4000004B USBD vdd_soc
75 0x4000004C USB2 vdd_soc
76 0x4000004D PCIE vdd_soc
77 0x4000004E AFI vdd_soc
78 0x4000004F PCIEXCLK vdd_soc
79 0x40000050 PEX_USB_UPHY vdd_soc
80 0x40000051 XUSB_PADCTL vdd_soc
81 0x40000052 APBDMA vdd_soc
82 0x40000053 USB2_TRK vdd_soc
83 0x40000054 PLLE0 vdd_soc
84 0x40000055 PLLE0 vdd_soc
85 0x40000056 CEC vdd_soc
[6.0.0+] 86 0x40000057 EXTPERIPH2 vdd_soc

Voltage

Name Block Notes
0 max77620_sd0
1 max77620_sd1
2 max77620_sd2
3 max77620_sd3
4 max77620_ldo0 1.2v
5 max77620_ldo1
6 max77620_ldo2 SDcard power, 1.8v - 3.3v
7 max77620_ldo3 GC ASIC 3.1v
8 max77620_ldo4 RTC power, 0.85v
9 max77620_ldo5 GC ASIC 1.8v
10 max77620_ldo6 AVDD touchscreen, 2.9v
11 max77620_ldo7
12 max77620_ldo8 DisplayPort, 1.05v
13 max77621_cpu
14 max77621_gpu
[6.0.0+] 15 max77812_cpu
[6.0.0+] 16 max77812_gpu
[6.0.0+] 17 max77812_dram

Note: max77620 GPIOs are only used internally by the driver during init, and not exposed via an API.

pcv:arb

This is "nn::pcv::IArbitrationManager".

This service no longer exists in [8.0.0+].

Cmd Name
0 ReleaseControl

pcv:imm

This is "nn::pcv::IImmediateManager".

This service no longer exists in [8.0.0+].

Cmd Name
0 SetClockRate

clkrst, clkrst:i

These are "nn::clkrst::IClkrstManager" and "nn::clkrst::IImmediateManager".

These were added with [8.0.0+].

Cmd Name
0 #OpenSession
1 GetTemperatureThresholds
2 SetTemperature
3 GetPossibleClockRates
4 GetClockInfoEvent
5 GetClockModuleNumLimit

OpenSession

Takes an u32 ModuleID, an u32 ModuleUnk and returns an #IClkrstSession.

GetClockModuleNumLimit

Returns 0x1A.

IClkrstSession

This is "nn::clkrst::IClkrstSession".

Cmd Name
0 SetClockEnabled
1 SetClockDisabled
2 SetResetAsserted
3 SetResetDeasserted
4 SetPowerEnabled
5 SetPowerDisabled
6 GetState
7 SetClockRate
8 GetClockRate
9 SetMinVClockRate
10 GetPossibleClockRates
11 GetDvfsTable

clkrst:a

This is "nn::clkrst::IArbitrationManager".

This was added with [8.0.0+].

Cmd Name
0 #ReleaseControl

ReleaseControl

Takes an u32 ModuleID. No output.

rgltr

This is "nn::regulator::IRegulatorManager".

This was added with [8.0.0+].

Cmd Name
0 #OpenSession
1 GetPowerDomainStateTable
2 GetPowerInfoEvent
3 GetPowerModuleNumLimit

OpenSession

Takes an u32 ModuleID and returns an #IRegulatorSession.

GetPowerModuleNumLimit

Returns 0x3.

IRegulatorSession

This is "nn::regulator::IRegulatorSession".

Cmd Name
0 #SetVoltageEnabled
1
2 #GetVoltageEnabled
3 GetVoltageRange
4 GetVoltageValue
5 #SetVoltageValue
6 ChangeVoltage

SetVoltageEnabled

Takes a bool. Enables/disables the LDO this session was opened for.

GetVoltageEnabled

Returns a bool. True if voltage is enabled, false if not.

SetVoltageValue

Takes in a voltage in microvolts and sets the LDO to this voltage.

rtc

This was added with [8.0.0+].

Cmd Name
0
1
2
3
4

time:u, time:a, time:s

This is "nn::timesrv::detail::service::IStaticService".

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+] GetStandardNetworkClockOperationEventReadableHandle
31 [6.0.0+] GetEphemeralNetworkClockOperationEventReadableHandle
50 [4.0.0+] SetStandardSteadyClockInternalOffset
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".

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

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".

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.

PosixTime

This is an u64 for UTC POSIX time.

SystemClockContext

This is an 0x20-byte struct.

Offset Size Description
0x0 0x8 a #PosixTime representing the system clock epoch.
0x8 0x18 a #SteadyClockTimePoint

ITimeZoneService

This is "nn::timesrv::detail::service::ITimeZoneService".

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
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 TimeZoneBinary title with the specified LocationName under the zoneinfo/ directory, the content is then converted into this TimeZoneRule structure.

TimeZoneRuleVersion

This is an u128.

CalendarTime

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

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.