PCV services

From Nintendo Switch Brew
Jump to: navigation, search


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+] CreateWakeupTimer
9 [2.0.0+] CancelWakeupTimer
10 [2.0.0+] #EnableWakeupTimerOnDevice
11 [3.0.0+] CreateWakeupTimerEx
12 [3.0.0+] GetLastEnabledWakeupTimerType
13 [3.0.0+] CleanAllWakeupTimers
14 [6.0.0+]


No input, returns a total of 0x10-bytes of output. [3.0.0+] Now returns a total of 0xC-bytes of output.


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

Cmd Name
0 GetRtcTime
1 SetRtcTime
2 GetRtcResetDetected
3 [2.0.0+] ClearRtcResetDetected
4 [3.0.0+] SetUpRtcResetOnShutdown

GetExternalRtcValue / SetExternalRtcValue directly accesses the max77620_rtc0 device.


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 #IsPoweredOn
[6.0.0-7.0.1] 29 #GetVoltage

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


Takes an u32 PowerControlTarget and returns a bool indicating the status of the requested voltage block.


Takes an u32 PowerControlTarget and returns an u32 voltage value for the requested voltage block.


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 ISP - Not an actual block. Used for debug.
19 0x40000014 VI - 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 OWR - 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 SATA - 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 VI_I2C - 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


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.


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

This service no longer exists in [8.0.0+].

Cmd Name
0 ReleaseControl


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


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


Returns 0x1A.


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


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

This was added with [8.0.0+].

Cmd Name
0 #ReleaseControl


Takes an u32 ModuleID. No output.


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

This was added with [8.0.0+].

Cmd Name
0 #OpenSession
1 GetPowerDomainStateTable
2 GetPowerInfoEvent
3 GetPowerModuleNumLimit


Takes an u32 ModuleID and returns an #IRegulatorSession.


Returns 0x3.


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

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


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


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


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


This was added with [8.0.0+].

Cmd Name
0 GetRtcTime
1 SetRtcTime
2 SetRtcClientUnknownBool
3 GetRtcResetDetected
4 ClearRtcResetDetected

Commands 0, 1, 3, 4 call the same internal functions as bpc:r, except they take an extra u32 device code, where bpc:r hardcodes 0x3B000001 (max77620_rtc0).

Command 2 takes a u8 bool and a u32 device code; it opens an i2c session to the device code, and sets *(i2c_session_client_object + 0x38) = bool.

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


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.


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.


This is an u64.


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.


This is an s64 for UTC POSIX time.


This is an 0x20-byte struct.

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


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.


Takes an input s32 LocationName_index and a type-0x6 output buffer for #LocationName, returns an output s32 for total output entries.


This contains a TimeZone location string with a max size of 0x24 bytes.


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.

The files contained under zoneinfo/ directory are Tzif2 files without Tzif1 header and data at the begining of them (see RFC8536 for more information).

The conversion of a Tzif2 file to a TimeZoneRule structure is based on tz database code with some custom modifications (Leap seconds aren't handled, no usage of "posixrules" and Tzif1 support stripped out).

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


This is an 0x10-byte struct. Represent a Time Type Information used in #TimeZoneRule.

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


This is an u128.


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.


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.