Bus services: Difference between revisions

 
(93 intermediate revisions by 6 users not shown)
Line 6: Line 6:
! Cmd || Name
! Cmd || Name
|-
|-
| 0 || [[#OpenSessionForDev]]
| 0 || [5.0.0+] [[#OpenSessionForDevDeprecated|OpenSessionForDevDeprecated]] ([1.0.0-4.1.0] OpenSessionForDev)
|-
|-
| 1 || [[#OpenSession]]
| 1 || [5.0.0+] [[#OpenSessionDeprecated|OpenSessionDeprecated]] ([1.0.0-4.1.0] OpenSession)
|-
|-
| 2 || [[#OpenSessionForTest]]
| 2 || [5.0.0+] [[#OpenSessionForTestDeprecated|OpenSessionForTestDeprecated]] ([1.0.0-4.1.0] OpenSessionForTest)
|-
|-
| 3 || [1.0.0-6.2.0] IsWakeEventActive  
| 3 || [5.0.0-6.2.0] [[#IsWakeEventActiveDeprecated|IsWakeEventActiveDeprecated]] ([1.0.0-4.1.0] IsWakeEventActive)
|-
|-
| 4 || [1.0.0-6.2.0] GetWakeEventActiveFlagSet
| 4 || [5.0.0-6.2.0] [[#GetWakeEventActiveFlagSetDeprecated|GetWakeEventActiveFlagSetDeprecated]] ([1.0.0-4.1.0] GetWakeEventActiveFlagSet)
|-
|-
| 5 || [1.0.0-6.2.0] SetWakeEventActiveFlagSetForDebug
| 5 || [5.0.0-6.2.0] [[#SetWakeEventActiveFlagSetForDebugDeprecated|SetWakeEventActiveFlagSetForDebugDeprecated]] ([1.0.0-4.1.0] SetWakeEventActiveFlagSetForDebug)
|-
|-
| 6 || SetWakePinDebugMode
| 6 || [[#SetWakePinDebugMode|SetWakePinDebugMode]]
|-
|-
| 7 || [5.0.0+] [[#OpenSession2]]
| 7 || [5.0.0+] [[#OpenSession|OpenSession]]
|-
|-
| 8 || [5.0.0+] IsWakeEventActive2
| 8 || [5.0.0+] [[#IsWakeEventActive|IsWakeEventActive]]
|-
|-
| 9 || [5.0.0+] SetWakeEventActiveFlagSetForDebug2
| 9 || [5.0.0+] [[#SetWakeEventActiveFlagSetForDebug|SetWakeEventActiveFlagSetForDebug]]
|-
|-
| 10 || [6.0.0+]
| 10 || [6.0.0+] [[#DumpStateForDebug|DumpStateForDebug]]
|}
|}


== Known Devices ==
== OpenSessionForDevDeprecated ==
{| class="wikitable sortable" border="1"
Takes an input [[#GpioPadDescriptor]]. Returns an [[#IPadSession]].
 
== OpenSessionDeprecated ==
Same as [[#OpenSessionForDevDeprecated]] except it takes a [[#GpioPadName]] which is then converted to a [[#GpioPadDescriptor]]. Returns an [[#IPadSession]].
 
== OpenSessionForTestDeprecated ==
Same as [[#OpenSessionDeprecated]] but panics on failure.
 
== IsWakeEventActiveDeprecated ==
Takes an input [[#GpioPadName]]. Returns a bool '''IsActive'''.
 
== GetWakeEventActiveFlagSetDeprecated ==
No input. Returns an output u128 [[#WakeBitFlag]].
 
== SetWakeEventActiveFlagSetForDebugDeprecated ==
Takes an input [[#GpioPadName]] and an input bool '''IsEnabled'''. No output.
 
== SetWakePinDebugMode ==
Takes an input u32 '''WakePinDebugMode'''. No output.
 
== OpenSession ==
Same as [[#OpenSessionDeprecated]] but takes a [[#GpioPadName|DeviceCode]] and an input [[#OpenMode]].
 
== IsWakeEventActive ==
Same as [[#IsWakeEventActiveDeprecated]] but takes a [[#GpioPadName|DeviceCode]].
 
== SetWakeEventActiveFlagSetForDebug ==
Same as [[#SetWakeEventActiveFlagSetForDebugDeprecated]] but takes a [[#GpioPadName|DeviceCode]].
 
== DumpStateForDebug ==
Stubbed. Returns 0.
 
== IPadSession ==
This is "nn::gpio::IPadSession".
 
{| class="wikitable" border="1"
|-
|-
! GpioPadName || GpioPadDescriptor || DeviceCode || Tegra (port, pin) || Usage || Direction || Used by (services) || Used by (hardware)
! Cmd || Name
|-
|-
| 0x01 || 0xCC || 0x33000002 || Z, 4 || Audio Codec (ALC5639) Power (CODEC_LDO_EN_TEMP) || Out || [[Audio services]], [[Fatal services]] || Icosa, Copper, Hoag, Iowa
| 0 || [12.0.0+] [[#SetDirectionDeprecated|SetDirectionDeprecated]] ([1.0.0-11.0.1] SetDirection)
|-
|-
| 0x02 || 0x24 || 0x3C000001 || E, 4 || SDCard Power (POW_SD_EN) || Out || [[PCV services]] || Icosa, Copper, Hoag, Iowa, Calcio
| 1 || [[#GetDirection|GetDirection]]
|-
|-
| 0x03 || 0x3C || 0x37000002 || H, 4 || Bluetooth Reset (BT_RST_PH4) || Out || [[Bluetooth Driver services]] || Icosa, Copper, Hoag, Iowa, Calcio
| 2 || [[#SetInterruptMode|SetInterruptMode]]
|-
|-
| 0x04 || 0xDA || 0xC9000402 || BB, 2 || Secondary Boot Device Configration (RAM_CODE3) || In || || Icosa, Copper, Iowa
| 3 || [[#GetInterruptMode|GetInterruptMode]]
|-
|-
| 0x05 || 0xDB || 0x3C000402 || BB, 3 || GcAsic Reset (GC_RST) || Out || [[Filesystem services]] || Icosa, Copper, Hoag, Iowa
| 4 || [[#SetInterruptEnable|SetInterruptEnable]]
|-
|-
| 0x06 || 0xDC || 0x33000003 || BB, 4 || Audio Codec (ALC5639) Alert (CODEC_ALERT) || In || [[Audio services]] || Icosa, Copper, Hoag, Iowa
| 5 || [[#GetInterruptEnable|GetInterruptEnable]]
|-
|-
| 0x07 || 0x25 || 0x3C000401 || E, 5 || GcAsic Power (POW_GC) || Out || || Icosa, Copper
| 6 || [1.0.0-16.1.0] [[#GetInterruptStatus|GetInterruptStatus]]
|-
|-
| 0x08 || 0x90 || 0x350000CA || S, 0 || Debug Pad Detect (DEBUG_CONTROLLER_DET) || In || [[HID services]] || Icosa, Copper, Iowa
| 7 || [1.0.0-16.1.0] [[#ClearInterruptStatus|ClearInterruptStatus]]
|-
|-
| 0x09 || 0x91 || 0x39000407 || S, 1 || Battery Charge Status (BATT_CHG_STATUS) || In || || Icosa, Copper, Hoag, Iowa
| 8 || [[#SetValue|SetValue]]
|-
|-
| 0x0A || 0x96 || 0x39000003 || S, 6 || Charger IC (BQ24193) Charge Enable (BATT_CHG_ENABLE_N) || Out || [[PTM services]] || Icosa, Copper, Hoag, Iowa
| 9 || [[#GetValue|GetValue]]
|-
|-
| 0x0B || 0x97 || 0x3D000002 || S, 7 || Fan Tachometer (FAN_TACH) || In || || Icosa, Copper, Hoag, Iowa, Calcio
| 10 || [[#BindInterrupt|BindInterrupt]]
|-
|-
| 0x0C || 0x26 || 0x3500040B || E, 6 || Joy-Con(L) IsAttached (insertion, Joy-Con pin 5/console TX, pulled low on insert) (EXTCON_DET_S) || In || [[HID services]] || Icosa, Copper, Iowa
| 11 || [[#UnbindInterrupt|UnbindInterrupt]]
|-
|-
| 0x0D || 0x05 || 0x39000401 || A, 5 || Fan and Joy-Con Rails Power (Battery - BQ24193 5V) (VDD50A_EN) || Out || [[PTM services]] || Icosa, Copper, Hoag, Iowa
| 12 || [[#SetDebounceEnabled|SetDebounceEnabled]]
|-
|-
| 0x0E || 0x78 || 0xCA000402 || P, 0 || SDEV Coax Select (SDEV_COAX_SEL_1) || In || || Icosa, Copper, Iowa
| 13 || [[#GetDebounceEnabled|GetDebounceEnabled]]
|-
|-
| 0x0F || 0x93 || 0x3C000403 || S, 3 || GcAsic Card Detect (GC_CD) || In || [[Filesystem services]] || Icosa, Copper, Hoag, Iowa
| 14 || [[#SetDebounceTime|SetDebounceTime]]
|-
|-
| 0x10 || 0x7D || 0xC900040B || P, 5 || PROD_TYPE_0 || In || || Icosa, Copper, Iowa
| 15 || [[#GetDebounceTime|GetDebounceTime]]
|-
|-
| 0x11 || 0x7C || 0xC900040C || P, 4 || PROD_TYPE_1 || In || || Icosa, Copper, Iowa
| 16 || [4.0.0+] [[#SetValueForSleepState|SetValueForSleepState]]
|-
|-
| 0x12 || 0x7B || 0xC900040D || P, 3 || PROD_TYPE_2 || In || || Icosa, Copper, Iowa
| 17 || [6.0.0+] [[#GetMaxDebounceTime|GetMaxDebounceTime]]
|-
|-
| 0x13 || 0x7A || 0xC900040E || P, 2 || PROD_TYPE_3 || In || || Icosa, Copper, Iowa
| 18 || [12.0.0+] [[#SetDirectionInput|SetDirectionInput]]
|-
|-
| 0x14 || 0xBC || 0x3E000002 || X, 4 || Temperature Sensor (TEMP_ALERT) || In || || Icosa, Copper, Hoag, Iowa, Calcio
| 19 || [12.0.0+] [[#SetDirectionOutput|SetDirectionOutput]]
|}
 
=== SetDirectionDeprecated ===
Takes an input u32 [[#Direction]]. No output.
 
=== GetDirection ===
No input. Returns an output u32 [[#Direction]].
 
=== SetInterruptMode ===
Takes an input u32 [[#InterruptMode]]. No output.
 
=== GetInterruptMode ===
No input. Returns an output u32 [[#InterruptMode]].
 
=== SetInterruptEnable ===
Takes an input bool '''IsEnable'''. No output.
 
=== GetInterruptEnable ===
No input. Returns an output bool '''IsEnable'''.
 
=== GetInterruptStatus ===
No input. Returns an output u32 [[#InterruptStatus]].
 
=== ClearInterruptStatus ===
No input/output.
 
=== SetValue ===
Takes an input u32 [[#GpioValue]]. No output.
 
=== GetValue ===
No input. Returns an output u32 [[#GpioValue]].
 
=== BindInterrupt ===
No input. Returns an output Event handle.
 
=== UnbindInterrupt ===
No input/output.
 
=== SetDebounceEnabled ===
Takes an input bool '''IsEnable'''. No output.
 
=== GetDebounceEnabled ===
No input. Returns an output bool '''IsEnable'''.
 
=== SetDebounceTime ===
Takes an input s32 '''MsecTime'''. No output.
 
=== GetDebounceTime ===
No input. Returns an output s32 '''MsecTime'''.
 
=== SetValueForSleepState ===
Takes an input u32 '''ValueForSleepState'''. No output.
 
=== GetMaxDebounceTime ===
No input. Returns an output u32 '''MaxDebounceTime'''.
 
=== SetDirectionInput ===
No input/output.
 
=== SetDirectionOutput ===
Takes an input u32 [[#GpioValue]]. No output.
 
= i2c, i2c:pcv =
This is "nn::i2c::IManager".
 
{| class="wikitable" border="1"
|-
|-
| 0x15 || 0xAE || 0x33000004 || V, 6 || Audio Codec (ALC5639) Headphone Detect (CODEC_HP_DET_IRQ) || In || [[Audio services]] || Icosa, Copper, Hoag, Iowa
! Cmd || Name
|-
|-
| 0x16 || 0xBA || 0x35000041 || X, 2 || MOTION_INT_PX2 || In || || Icosa, Copper, Hoag, Iowa
| 0 || [[#OpenSessionForDev_2|OpenSessionForDev]]
|-
|-
| 0x17 || 0xB9 || 0x35000036 || X, 1 || TouchPanel IRQ (TP_IRQ) || In || [[HID services]] || Icosa, Copper, Hoag, Iowa
| 1 || [[#OpenSession_2|OpenSession]]
|-
|-
| 0x18 || 0xBD || 0x35000001 || X, 5 || Power Button (BUTTON_POWER_ON_PX5) || In || || Icosa, Copper, Hoag, Iowa, Calcio
| 2 || [1.0.0-5.1.0] [[#HasDevice|HasDevice]]
|-
|-
| 0x19 || 0xBE || 0x35000002 || X, 6 || Volume Up (BUTTON_VOL_UP_PX6) || In || [[Boot2]], [[Audio services]] || Icosa, Copper, Hoag, Iowa, Calcio
| 3 || [1.0.0-5.1.0] [[#HasDeviceForDev|HasDeviceForDev]]
|-
|-
| 0x1A || 0xBF || 0x35000003 || X, 7 || Volume Down (BUTTON_VOL_DOWN_PX7) || In || [[Boot2]], [[Audio services]] || Icosa, Copper, Hoag, Iowa, Calcio
| 4 || [6.0.0+] [[#OpenSession2_2|OpenSession2]]
|}
 
== OpenSessionForDev ==
Takes an input u16 '''SlaveAddress''' (padded to u32) and 3 input u32s '''BusIdx''', [[#AddressingMode]] and [[#SpeedMode]]. Returns an [[#II2cSession]].
 
== OpenSession ==
Takes an input [[#I2cDevice]]. Returns an output [[#II2cSession]].
 
== HasDevice ==
Takes an input [[#I2cDevice]]. Returns an output boolean success value.
 
== HasDeviceForDev ==
Takes an input u16 '''SlaveAddress''' (padded to u32) and 3 input u32s '''BusIdx''', [[#AddressingMode]] and [[#SpeedMode]]. Returns an output boolean success value.
 
== OpenSession2 ==
Same as [[#OpenSession_2|OpenSession]], but takes an input u32 [[#I2cDevice|DeviceCode]].
 
== II2cSession ==
This is "nn::i2c::ISession".
 
{| class="wikitable" border="1"
|-
|-
| 0x1B || 0xC0 || 0x39000034 || Y, 0 || Fuel Gauge IC (MAX17050) IRQ (BATT_MGIC_IRQ) || In || [[PTM services]] || Icosa, Copper, Hoag, Iowa
! Cmd || Name
|-
|-
| 0x1C || 0xC1 || 0x35000004 || Y, 1 || Recovery Mode Key (BUTTON_HOME_PY1) || In || || Icosa, Copper, Hoag, Iowa, Calcio
| 0 || [1.0.0-5.1.0] SendOld
|-
|-
| 0x1D || 0xA9 || 0x3400003E || V, 1 || Backlight Enable (LCD_BL_EN_PV1) || Out || [[NV services]], [[Backlight services]] || Icosa, Copper, Hoag, Iowa
| 1 || [1.0.0-5.1.0] ReceiveOld
|-
|-
| 0x1E || 0xAA || 0x34000033 || V, 2 || Backlight Reset (LCD_RST_PV2) || Out || [[NV services]] || Icosa, Copper, Hoag, Iowa
| 2 || [1.0.0-5.1.0] ExecuteCommandListOld
|-
|-
| 0x1F || 0x55 || 0x040000CC || K, 5 || USB-PD Controller (RHOM BM92T30MWV) VCONN Power (PD_VCONN_EN) || Out || [[PTM services]], [[USB services]] || Icosa, Copper, Hoag, Iowa
| 10 || [[#Send|Send]]
|-
|-
| 0x20 || 0xAD || 0x040000CA || V, 5 || USB-PD Controller (RHOM BM92T30MWV) Reset (PD_RST) || Out || [[USB services]] || Icosa, Copper, Hoag, Iowa, Calcio
| 11 || [[#Receive|Receive]]
|-
|-
| 0x21 || 0xC8 || 0x39000002 || Z, 0 || Charger IC (BQ24193) IRQ (BQ24193_IRQ) || In || [[PTM services]] || Icosa, Copper, Hoag, Iowa
| 12 || [[#ExecuteCommandList|ExecuteCommandList]]
|-
|-
| 0x22 || 0xCA || 0xCA000401 || Z, 2 || SDEV Coax Select (SDEV_COAX_SEL_0) || In || || Icosa, Copper, Iowa
| 13 || [6.0.0+] [[#SetRetryPolicy_2|SetRetryPolicy]]
|}
 
== Send ==
Takes a type-0x21 input buffer '''InData''' and an input u32 [[#TransactionOption]]. No output.
 
== Receive ==
Takes a type-0x22 output buffer '''OutData''' and an input u32 [[#TransactionOption]]. No output.
 
== ExecuteCommandList ==
Takes a type-0x22 output buffer '''ReceiveBuffer''' and a type-0x9 input buffer '''CommandList'''. No output.
 
=== Commands ===
This is "nn::i2c::I2cCommand".
 
{| class=wikitable
! Bits || Name
|-
|-
| 0x23 || 0xCB || 0x3C000003 || Z, 3 || SDCard Write Protect (SD_WP) || In || || Icosa, Copper, Hoag, Iowa, Calcio
| 0-5 || [[#CommandId]]
|-
|-
| 0x24 || 0x4F || 0x35000035 || J, 7 || TouchPanel Reset (TP_RST) || Out || [[HID services]] || Icosa, Copper, Hoag, Iowa
| 6-7 || [[#TransactionOption]]
|}
 
A send command will write bytes to the device using the format: [u8 cmd_send] [u8 len] <bytes>
 
A receive command will read bytes from the device using the format: [u8 cmd_receive] [u8 len]
 
An extension sleep command will stall the device using the format: [u8 cmd_extension] [u8 ms]
 
== SetRetryPolicy ==
Takes 2 input u32s '''MaxRetries''' and '''RetryIntervalMicroSeconds'''. No output.
 
= uart =
This is "nn::uart::IManager".
 
{| class="wikitable" border="1"
|-
|-
| 0x25 || 0x50 || 0x37000401 || K, 0 || BT_GPIO_2 || In || || Icosa, Copper, Hoag, Iowa, Calcio
! Cmd || Name
|-
|-
| 0x26 || 0x51 || 0x37000402 || K, 1 || BT_GPIO_3 || In || || Icosa, Copper, Hoag, Iowa, Calcio
| 0 || [1.0.0-16.1.0] [[#HasPort|HasPort]]
|-
|-
| 0x27 || 0x52 || 0x37000403 || K, 2 || BT_GPIO_4 || In || || Icosa, Copper, Hoag, Iowa, Calcio
| 1 || [1.0.0-16.1.0] [[#HasPortForDev|HasPortForDev]]
|-
|-
| 0x28 || 0x54 || 0x040000CB || K, 4 || USB-PD Controller (RHOM BM92T30MWV) IRQ (PD_IRQ) || In || [[USB services]] || Icosa, Copper, Hoag, Iowa, Calcio
| 2 || [1.0.0-16.1.0] [[#IsSupportedBaudRate|IsSupportedBaudRate]]
|-
|-
| 0x29 || 0x56 || 0x3E000003 || K, 6 || POW_VCPU_INT || In || ||  Icosa, Copper, Hoag, Iowa, Calcio
| 3 || [1.0.0-16.1.0] [[#IsSupportedBaudRateForDev|IsSupportedBaudRateForDev]]
|-
|-
| 0x2A || 0x57 || 0x3E000004 || K, 7 || MAX77621_GPU_INT || In || || Icosa, Copper
| 4 || [1.0.0-16.1.0] [[#IsSupportedFlowControlMode|IsSupportedFlowControlMode]]
|-
|-
| 0x2B || 0x53 || 0x35000402 || K, 3 || Joy-Con(R) Charge (EXTCON_CHG_U) || Out || [[HID services]] || Icosa, Copper, Iowa
| 5 || [1.0.0-16.1.0] [[#IsSupportedFlowControlModeForDev|IsSupportedFlowControlModeForDev]]
|-
|-
| 0x2C || 0xE3 || 0x3500040C || CC, 3 || Joy-Con(L) Charge (EXTCON_CHG_S) || Out || [[HID services]] || Icosa, Copper, Iowa
| 6 || [[#CreatePortSession|CreatePortSession]]
|-
|-
| 0x2D || 0x38 || 0x38000003 || H, 0 || WIFI_RF_DISABLE || Out || || Icosa, Copper, Hoag, Iowa, Calcio
| 7 || [1.0.0-16.1.0] [[#IsSupportedPortEvent|IsSupportedPortEvent]]
|-
|-
| 0x2E || 0x39 || 0x38000002 || H, 1 || WiFi Reset (WIFI_RST_PH1) || Out || [[WLAN services]], [[PCIe services]] || Icosa, Copper, Hoag, Iowa, Calcio
| 8 || [1.0.0-16.1.0] [[#IsSupportedPortEventForDev|IsSupportedPortEventForDev]]
|-
|-
| 0x2F || 0x3B || 0x37000003 || H, 3 || AP_WAKE_BT_PH3 || Out || [[Bluetooth Driver services]] || Icosa, Copper, Hoag, Iowa, Calcio
| 9 || [7.0.0-16.1.0] [[#IsSupportedDeviceVariation|IsSupportedDeviceVariation]]
|-
|-
| 0x30 || 0x3D || 0x37000004 || H, 5 || BT_WAKE_AP || In || || Icosa, Copper, Hoag, Iowa, Calcio
| 10 || [7.0.0-16.1.0] [[#IsSupportedDeviceVariationForDev|IsSupportedDeviceVariationForDev]]
|}
 
== HasPort ==
Takes an input [[#UartPort]]. Returns an output boolean success value.
 
== HasPortForDev ==
Takes an input [[#UartPortForDev]]. Returns an output boolean success value.
 
== IsSupportedBaudRate ==
Takes 2 input u32s [[#UartPort]] and '''BaudRate'''. Returns an output boolean success value.
 
Supported baud rates are 57600, 115200, 1000000 and 3000000.
 
== IsSupportedBaudRateForDev ==
Takes 2 input u32s [[#UartPortForDev]] and '''BaudRate'''. Returns an output boolean success value.
 
Supported baud rates are 57600, 115200, 1000000 and 3000000.
 
== IsSupportedFlowControlMode ==
Takes 2 input u32s [[#UartPort]] and [[#FlowControlMode]]. Returns an output boolean success value.
 
== IsSupportedFlowControlModeForDev ==
Takes 2 input u32s [[#UartPortForDev]] and [[#FlowControlMode]]. Returns an output boolean success value.
 
== CreatePortSession ==
No input. Returns an output [[#IPortSession]].
 
== IsSupportedPortEvent ==
Takes 2 input u32s [[#UartPort]] and [[#PortEventType]]. Returns an output boolean success value.
 
== IsSupportedPortEventForDev ==
Takes 2 input u32s [[#UartPortForDev]] and [[#PortEventType]]. Returns an output boolean success value.
 
== IsSupportedDeviceVariation ==
Takes 2 input u32s [[#UartPort]] and '''DeviceVariation'''. Returns an output boolean success value.
 
Supported device variations are 0 (Bluetooth) for UART-D, 0 (Joy-Con(R)) for UART-B, 0 (Joy-Con(L)) and 1 (SioMcu) for UART-C.
 
== IsSupportedDeviceVariationForDev ==
Takes 2 input u32s [[#UartPortForDev]] and '''DeviceVariation'''. Returns an output boolean success value.
 
Supported device variations are 0 (Bluetooth) for UART-D, 0 (Joy-Con(R)) for UART-B, 0 (Joy-Con(L)) and 1 (SioMcu) for UART-C.
 
== IPortSession ==
This is "nn::uart::IPortSession".
 
{| class="wikitable" border="1"
|-
|-
| 0x31 || 0x3F || 0x37000404 || H, 7 || BT_GPIO_5 || Out || || Icosa, Copper, Hoag, Iowa, Calcio
! Cmd || Name
|-
|-
| 0x32 || 0x40 || 0x34000034 || I, 0 || Backlight +5V (LCD_VDD_P_EN) || Out || [[NV services]] || Icosa, Copper, Hoag, Iowa
| 0 || [[#OpenPort|OpenPort]]
|-
|-
| 0x33 || 0x41 || 0x34000035 || I, 1 || Backlight -5V (LCD_VDD_N_EN) || Out || [[NV services]] || Icosa, Copper, Hoag, Iowa
| 1 || [[#OpenPortForDev|OpenPortForDev]]
|-
|-
| 0x34 || 0x3E || 0x35000401 || H, 6 || Joy-Con(R) IsAttached (insertion, Joy-Con pin 5/console TX, pulled low on insert) (EXTCON_DET_U) || In || [[HID services]] || Icosa, Copper, Iowa
| 2 || [[#GetWritableLength|GetWritableLength]]
|-
|-
| 0x35 || 0xE2 || 0xC9000401 || CC, 2 || Secondary Boot Device Configration (RAM_CODE2) || In || || Icosa, Copper, Iowa
| 3 || [[#Send_2|Send]]
|-
|-
| 0x36 || 0xE4 || 0x39000402 || CC, 4 || Fan and Joy-Con Rails Power (USB 5V) (VDD50B_EN) || Out || [[PTM services]] || Icosa, Copper, Iowa
| 4 || [[#GetReadableLength|GetReadableLength]]
|-
|-
| 0x37 || 0x3A || 0x38000004 || H, 2 || WIFI_WAKE_HOST || In || || Icosa, Copper, Hoag, Iowa, Calcio
| 5 || [[#Receive_2|Receive]]
|-
|-
| 0x38 || 0xC9 || 0x3C000002 || Z, 1 || SDCard Card Detect (SD_CD) || In || [[Filesystem services]] || Icosa, Copper, Hoag, Iowa, Calcio
| 6 || [[#BindPortEvent|BindPortEvent]]
|-
|-
| 0x39 || 0x4D || 0x39000404 || J, 5 || Charger IC (BQ24193) OTG Charge Select (OTG_FET_1) || Out || [[PTM services]], [[USB services]] || Icosa, Copper, Iowa
| 7 || [[#UnbindPortEvent|UnbindPortEvent]]
|-
|-
| 0x3A || 0x58 || 0x39000405 || L, 0 || Charger IC (BQ24193) OTG Charge Select (OTG_FET_2) || Out || [[PTM services]], [[USB services]] || Icosa, Copper, Iowa
| 8 || [14.0.0+] [[#OpenPort2|OpenPort2]]
|}
 
=== OpenPort ===
Takes 3 input u32s [[#UartPort]], '''BaudRate''' and [[#FlowControlMode]], 2 input u64s '''SendBufferLength''' and '''ReceiveBufferLength''' and 2 input TransferMemory handles '''SendHandle''' and '''ReceiveHandle'''. Returns an output boolean success value.
 
[6.0.0+] Takes 4 input u8s (padded as u32) '''IsInvertTx''', '''IsInvertRx''', '''IsInvertRts''' and '''IsInvertCts''', 3 input u32s [[#UartPort]], '''BaudRate''' and [[#FlowControlMode]], 2 input u64s '''SendBufferLength''' and '''ReceiveBufferLength''' and 2 input TransferMemory handles '''SendHandle''' and '''ReceiveHandle'''. Returns an output boolean success value.
 
[7.0.0+] Takes 4 input u8s (padded as u32) '''IsInvertTx''', '''IsInvertRx''', '''IsInvertRts''' and '''IsInvertCts''', 4 input u32s [[#UartPort]], '''BaudRate''', [[#FlowControlMode]] and '''DeviceVariation''', 2 input u64s '''SendBufferLength''' and '''ReceiveBufferLength''' and 2 input TransferMemory handles '''SendHandle''' and '''ReceiveHandle'''. Returns an output boolean success value.
 
This will Abort when the specified [[#UartPort]] is already being used, due to a [[SVC]] failing.
 
=== OpenPortForDev ===
Same as [[#OpenPort]], but takes an input [[#UartPortForDev]] instead.
 
=== GetWritableLength ===
No input. Returns an output u64 '''WritableLength'''.
 
=== Send ===
Takes a type-0x21 input buffer '''InData'''. Returns an output u64 size.
 
=== GetReadableLength ===
No input. Returns an output u64 '''ReadableLength'''.
 
=== Receive ===
Takes a type-0x22 output buffer '''OutData'''. Returns an output u64 size.
 
=== BindPortEvent ===
Takes an input u32 [[#PortEventType]] and an input s64 '''Threshold'''. Returns an output boolean success value and an Event handle with EventClearMode=0.
 
=== UnbindPortEvent ===
Takes an input u32 [[#PortEventType]]. Returns an output boolean success value.
 
=== OpenPort2 ===
Same as [[#OpenPort]], but takes an input u32 [[#UartPort|DeviceCode]] instead of an [[#UartPort]] and no longer returns an output boolean success value.
 
= pwm =
This is "nn::pwm::IManager".
 
{| class="wikitable" border="1"
|-
|-
| 0x3B || 0x3E || 0x35000403 || H, 6 || Joy-Con(R) Wake Detect (EXTCON_DET_U) || In || || Icosa, Copper, Hoag, Iowa
! Cmd || Name
|-
|-
| 0x3C || 0x26 || 0x3500040D || E, 6 || Joy-Con(L) Wake Detect (EXTCON_DET_S) || In || || Icosa, Copper, Hoag, Iowa
| 0 || OpenSessionForDev
|-
|-
| 0x3D || -1 || 0x39000406 || || || || ||
| 1 || OpenSession
|-
|-
| 0x3E || 0x33 || 0x35000404 || G, 3 || Joy-Con(R) CTS (checked low) (EXT_UART2_CTS) || In || [[HID services]] ||
| 2 || [6.0.0+] [[#OpenSession2_3|OpenSession2]]
|}
 
== OpenSession2 ==
Takes a [[#ChannelName|DeviceCode]] and returns an [[#IChannelSession]].
 
== IChannelSession ==
This is "nn::pwm::IChannelSession".
 
{| class="wikitable" border="1"
|-
|-
| 0x3F || 0x1C || 0x3500040E || D, 4 || Joy-Con(L) CTS (checked low) (EXT_UART3_CTS) || In || [[HID services]] ||  
! Cmd || Name
|-
|-
| 0x40 || 0xD9 || 0x39000408 || BB, 1 || 5V Step-Down Regulator Power (5V_STEPDOWN_EN) || Out || || Copper
| 0 || SetPeriod
|-
|-
| 0x41 || 0x0C || 0x04000401 || B, 4 || USB Root Port 2 Over Current (USB_B2_OC) || In || [[USB services]] || Copper
| 1 || GetPeriod
|-
|-
| 0x42 || 0x0D || 0x39000409 || B, 5 || 5V Step-Down Regulator Power Good Flag (5V_STEPDOWN_PG) || In || || Copper
| 2 || [1.0.0-13.2.1] SetDuty
|-
|-
| 0x43 || 0x21 || 0x04000402 || E, 1 || USB Power (USB_A_EN) || Out || [[USB services]] || Copper
| 3 || [1.0.0-13.2.1] GetDuty
|-
|-
| 0x44 || 0x27 || 0x04000403 || E, 7 || USB Power Flag (USB_A_FLAG) || In || [[USB services]] || Copper
| 4 || SetEnabled
|-
|-
| 0x45 || 0x92 || 0x04000404 || S, 2 || USB Root Port 3 Over Current (USB_B3_OC) || In || [[USB services]] || Copper
| 5 || GetEnabled
|-
|-
| 0x46 || 0x95 || 0x04000405 || S, 5 || USB Root Port 3 Power (USB_B3_EN) || Out || [[USB services]] || Copper
| 6 || [6.0.0+] [[#SetDutyCycle|SetDutyCycle]]
|-
|-
| 0x47 || 0x98 || 0x04000406 || T, 0 || USB Root Port 2 Power (USB_B2_EN) || Out || [[USB services]] || Copper
| 7 || [6.0.0+] [[#GetDutyCycle|GetDutyCycle]]
|}
 
=== SetDutyCycle ===
Takes an input double '''DutyCycle'''. No output.
 
=== GetDutyCycle ===
No input. Returns an output double '''DutyCycle'''.
 
= pinmux =
This is "nn::pinmux::IManager".
 
{| class="wikitable" border="1"
|-
|-
| 0x48 || 0x10 || 0x34000004 || C, 0 || HDMI 5V (HDMI_5V_EN) || Out || [[NV services]] || Copper, Calcio
! Cmd || Name
|-
|-
| 0x49 || 0x11 || 0x04000407 || C, 1 || USB Root Port 1 Power (USB_B1_EN) || Out || [[USB services]] || Copper, Calcio
| 0 || [[#OpenSession_3|OpenSession]]
|}
 
== OpenSession ==
Takes an [[#AssignablePinGroupName]] or an [[#AssignablePinGroupNameForHardwareTest]] and returns an [[#ISession|ISession]].
 
== ISession ==
This is "nn::pinmux::ISession".
 
{| class="wikitable" border="1"
|-
|-
| 0x4A || 0x12 || 0x34000005 || C, 2 || HDMI/Power Delivery Switch (HDMI_PD_TR_EN) || Out || [[NV services]] || Copper, Calcio
! Cmd || Name
|-
|-
| 0x4B || 0x42 || 0x3D000003 || I, 2 || Fan Enable (FAN_EN) || Out || [[PTM services]] ||
| 0 || [[#SetPinAssignment|SetPinAssignment]]
|-
|-
| 0x4C || 0xE6 || 0x04000408 || CC, 6 || USB Root Port 1 Over Current (USB_B1_OC) || In || [[USB services]] || Copper, Calcio
| 1 || [[#GetPinAssignment|GetPinAssignment]]
|-
|-
| [2.0.0+] 0x4D || 0xAC || 0x3D000001 || V, 4 || Pulse-Width Modulation Fan Control (PWM_FAN) || Out || [[PTM services]] ||
| 2 || [[#SetPinAssignmentForHardwareTest|SetPinAssignmentForHardwareTest]]
|-
|-
| [2.0.0+] 0x4E || 0xE1 || 0x34000006 || CC, 1 || HDMI Hot Plug Detect (HDMI_INT_DP_HPD_PCC1) || In || [[NV services]] || Copper, Calcio
| 3 || [17.0.0+] SetSfioConfiguration
|-
|-
| [5.0.0+] 0x4F || 0x56 || 0x3E000003 || K, 6 || MAX77812_IRQ || In || || Icosa, Copper, Hoag, Iowa, Calcio
| 4 || [17.0.0+] GetSfioConfiguration
|-
|-
| [6.0.0+] 0x50 || 0x20 || 0xCA000001 || E, 0 || || Out || || Hoag, Calcio
| 5 || [17.0.0+] SetInputEnableConfiguration
|-
|-
| [6.0.0+] 0x51 || 0x21 || 0xCA000002 || E, 1 || || Out || || Hoag, Calcio
| 6 || [17.0.0+] GetInputEnableConfiguration
|-
|-
| [6.0.0+] 0x52 || 0x22 || 0xCA000003 || E, 2 || || Out || || Hoag, Calcio
| 7 || [17.0.0+] SetPullConfiguration
|-
|-
| [6.0.0+] 0x53 || 0x23 || 0xCA000004 || E, 3 || || Out || || Hoag, Calcio
| 8 || [17.0.0+] GetPullConfiguration
|-
|-
| [6.0.0+] 0x54 || 0x4C || 0x36000004 || J, 4 || NFC_IRQ || In || [[NFC services]] || Hoag
| 9 || [17.0.0+] SetPmConfiguration
|-
|-
| [6.0.0+] 0x55 || 0x57 || 0x36000003 || K, 7 || NFC_RST || Out || [[NFC services]] || Hoag
| 10 || [17.0.0+] GetPmConfiguration
|}
 
=== SetPinAssignment ===
Takes a [[#PinAssignment]]. No output.
 
=== GetPinAssignment ===
No input. Returns a [[#PinAssignment]].
 
=== SetPinAssignmentForHardwareTest ===
Takes a [[#PinAssignmentForHardwareTest]]. No output.
 
= sasbus =
This is "nn::sasbus::IManager".
 
This was added with [3.0.0+].
 
{| class="wikitable" border="1"
|-
|-
| [6.0.0+] 0x56 || 0x27 ([6.0.0-8.0.0] 0x94) || 0x35000415 || S, 4 || MCU_IRQ || In || || Hoag
! Cmd || Name
|-
|-
| [6.0.0+] 0x57 || 0x98 || 0x35000416 || T, 0 || MCU_BOOT || Out || [[HID services]] || Hoag
| 0 || [[#OpenSession_4|OpenSession]]
|}
 
== OpenSession ==
Takes a [[#SasbusPort]] and returns an [[#ISession_2|ISession]].
 
== ISession ==
This is "nn::sasbus::ISession".
 
{| class="wikitable" border="1"
|-
|-
| [6.0.0+] 0x58 || 0x99 || 0x35000417 || T, 1 || MCU_RST || Out || [[HID services]] || Hoag
! Cmd || Name
|-
| [6.0.0+] 0x59 || 0xBB || 0x39000403 || X, 3 || Fan Power (5V3) (VDD5V3_EN) || Out || [[PTM services]] || Hoag, Iowa
|-
| [6.0.0+] 0x5A || 0xE5 || 0x35000418 || CC, 5 || MCU_POR || Out || [[HID services]] || Hoag
|-
| [6.0.0+] 0x5B || 0xAB || 0x35000005 || V, 3 || Led (LCD_GPIO1_PV3) || In || [[HID services]] || Hoag
|-
| [6.0.0+] 0x5C || 0x4E || 0x36000002 || J, 6 || NFC_EN || Out || [[NFC services]] || Hoag
|-
|-
| [7.0.0+] - || 0x32 || 0x35000406 || G, 2 || Joy-Con(R) RTS (EXT_UART2_RTS) || In || ||  
| 0 || [[#Send_3|Send]]
|-
|-
| [7.0.0+] - || 0x1B || 0x35000410 || D, 3 || Joy-Con(L) RTS (EXT_UART3_RTS) || In || ||  
| 1 || [[#Receive_3|Receive]]
|-
|-
| [7.0.0+] - || 0x17 || 0x3500041B || C, 7 || || In || || Hoag
| 2 || [[#StartPeriodicReceiveMode|StartPeriodicReceiveMode]]
|-
|-
| [7.0.0+] - || 0x18 || 0x3500041C || D, 0 || || In || || Hoag
| 3 || [[#StopPeriodicReceiveMode|StopPeriodicReceiveMode]]
|-
|-
| [7.0.0+] - || 0x15 || 0x3500041D || C, 5 || || In || || Hoag
| 4 || [19.0.0+]
|-
|-
| [7.0.0+] - || 0x16 || 0x3500041E || C, 6 || || In || || Hoag
| 5 || [19.0.0+]
|}
|}


== GpioPadDescriptor ==
=== Send ===
Takes a type-0x21 input buffer and an u8 '''SpiCommand'''. No output.
 
=== Receive ===
Takes a type-0x22 output buffer and an u8 '''SpiCommand'''. No output.
 
=== StartPeriodicReceiveMode ===
Takes an u8 '''SpiCommand''' (padded to u32), an u32, two u64s and a TransferMemory handle. No output.
 
[20.0.0+] Data intended for the user-process was [[Switch_System_Flaws|moved]] from tmem+0x8 to +0x0.
 
=== StopPeriodicReceiveMode ===
No input/output.
 
=== Cmd4 ===
Takes a total of 0x10-bytes of input and an input handle. No output.
 
This is similar to [[#StartPeriodicReceiveMode|StartPeriodicReceiveMode]]. This eventually calls an impl func which just writes some input fields into state, then (on NX) Aborts.
 
=== Cmd5 ===
No input/output.
 
This is identical to [[#StopPeriodicReceiveMode|StopPeriodicReceiveMode]].
 
= led =
This is "nn::led::detail::IManager".
 
This was added with [8.1.1+].
 
{| class="wikitable" border="1"
{| class="wikitable" border="1"
|-
|-
! Bits || Description
! Cmd || Name
|-
| 7-5 || Controller index
|-
|-
| 4-3 || Port index
| 0 || [[#OpenController|OpenController]]
|-
| 2-0 || Pin number
|}
|}


== OpenSessionForDev ==
== OpenController ==
Takes a raw [[#GpioPadDescriptor]] and returns a [[#IPadSession]] session for it.
Takes a '''DeviceCode''' (which must be 0x35000065) and returns an [[#IController]] session for it.
 
== OpenSession ==
Same thing as [[#OpenSessionForDev]] except it takes a '''GpioPadName''' which is then converted to a [[#GpioPadDescriptor]]. Returns an [[#IPadSession]] session.


== OpenSessionForTest ==
== IController ==
Same as [[#OpenSession]] but panics on failure.
This is "nn::led::detail::IController".
 
== OpenSession2 ==
Same as [[#OpenSession]] but takes a '''DeviceCode''' instead of a '''GpioPadName''' and an u32 '''DeviceUnk'''.


== IPadSession ==
This was added with [8.1.1+].
This is "nn::gpio::IPadSession".


{| class="wikitable" border="1"
{| class="wikitable" border="1"
Line 262: Line 566:
! Cmd || Name
! Cmd || Name
|-
|-
| 0 || SetDirection
| 0 || StartLighting
|-
| 1 || StopLighting
|-
| 2 || SetLightingMode
|-
| 3 || GetLightingMode
|-
|-
| 1 || GetDirection
| 4 || IsLighting
|-
|-
| 2 || SetInterruptMode
| 5 || SetRisingTime
|-
|-
| 3 || GetInterruptMode
| 6 || GetRisingTime
|-
|-
| 4 || SetInterruptEnable
| 7 || SetFallingTime
|-
|-
| 5 || GetInterruptEnable
| 8 || GetFallingTime
|-
|-
| 6 || GetInterruptStatus
| 9 || SetPeakTime
|-
|-
| 7 || ClearInterruptStatus
| 10 || GetPeakTime
|-
|-
| 8 || SetValue
| 11 || SetPulseInterval
|-
|-
| 9 || GetValue
| 12 || GetPulseInterval
|-
|-
| 10 || BindInterrupt
| 13 || SetPulseCount
|-
|-
| 11 || UnbindInterrupt
| 14 || GetPulseCount
|-
|-
| 12 || SetDebounceEnabled
| 15 || GetMaxPulseCount
|-
|-
| 13 || GetDebounceEnabled
| 16 || SetBreathInterval
|-
|-
| 14 || SetDebounceTime
| 17 || GetBreathInterval
|-
|-
| 15 || GetDebounceTime
| 18 || SetConstantBrightness
|-
|-
| 16 || [4.0.0+] SetValueForSleepState
| 19 || GetConstantBrightness
|-
|-
| 17 || [6.0.0+] GetValueForSleepState
| 20 || [10.0.0+] GetBreathingStatus ([8.1.1-9.2.0] RegisterPwmChannel)
|-
| 21 || [8.1.1-9.2.0] UnregisterPwmChannel
|}
|}


= i2c, i2c:pcv =
= GpioPadName =
This is "nn::i2c::IManager".
This is "nn::gpio::GpioPadName".


{| class="wikitable" border="1"
{| class="wikitable sortable" border="1"
|-
! Value || Name || [[#GpioPadDescriptor|GpioPadDescriptor]] || DeviceCode || Tegra (port, pin) || Description || Direction || Used by (services) || Used by (hardware)
|-
| 0x01 || CodecLdoEnTemp || 0xCC || 0x33000002 || Z, 4 || Audio Codec (ALC5639) Power || Out || [[Audio services]], [[Fatal services]] || Icosa, Hoag, Iowa, Aula
|-
| 0x02 || PowSdEn || 0x24 || 0x3C000001 || E, 4 || SdCard Power || Out || [[PCV services]] || Icosa, Copper, Hoag, Iowa, Calcio, Aula
|-
| 0x03 || BtRst || 0x3C || 0x37000002 || H, 4 || Bluetooth Reset || Out || [[Bluetooth Driver services]] || Icosa, Copper, Hoag, Iowa, Calcio, Aula
|-
| 0x04 || RamCode3 || 0xDA || 0xC9000402 || BB, 2 || Secondary Boot Device Configration || In || || Icosa, Iowa
|-
| 0x05 || GameCardReset || 0xDB || 0x3C000402 || BB, 3 || Gamecard Reset || Out || [[Filesystem services]] || Icosa, Copper, Hoag, Iowa, Aula
|-
| 0x06 || CodecAlert || 0xDC || 0x33000003 || BB, 4 || Audio Codec (ALC5639) Alert || In || [[Audio services]] || Icosa, Hoag, Iowa, Aula
|-
| 0x07 || PowGc || 0x25 || 0x3C000401 || E, 5 || Gamecard Power || Out || || Icosa, Copper
|-
| 0x08 || DebugControllerDet || 0x90 || 0x350000CA || S, 0 || Debug Pad Detect || In || [[HID services]] || Icosa, Iowa
|-
| 0x09 || BattChgStatus || 0x91 || 0x39000407 || S, 1 || Battery Charge Status || In || || Icosa, Hoag, Iowa, Aula
|-
| 0x0A || BattChgEnableN || 0x96 || 0x39000003 || S, 6 || Charger IC (BQ24193) Charge Enable || Out || [[PTM services]] || Icosa, Hoag, Iowa, Aula
|-
| 0x0B || FanTach || 0x97 || 0x3D000002 || S, 7 || Fan Tachometer || In || || Icosa, Hoag, Iowa, Calcio, Aula
|-
| 0x0C || ExtconDetS || 0x26 || 0x3500040B || E, 6 || Joy-Con(L) IsAttached (insertion, Joy-Con pin 5/console TX, pulled low on insert)  || In || [[HID services]], [[AM services]] || Icosa, Iowa, Aula
|-
| 0x0D || Vdd50AEn || 0x05 || 0x39000401 || A, 5 || Fan and Joy-Con 5V Power (Battery) || Out || [[PTM services]] || Icosa, Hoag, Iowa, Aula
|-
| 0x0E || SdevCoaxSel1 || 0x78 || 0xCA000406 ([1.0.0-10.0.0] 0xCA000402) || P, 0 || SDEV Coax Select || In || || Icosa, Iowa
|-
| 0x0F || GameCardCd || 0x93 || 0x3C000403 || S, 3 || Gamecard Card Detect || In || [[Filesystem services]], [[AM services]] || Icosa, Copper, Hoag, Iowa, Aula
|-
| 0x10 || ProdType0 || 0x7D || 0xC900040B || P, 5 || || In || || Icosa, Copper, Iowa
|-
| 0x11 || ProdType1 || 0x7C || 0xC900040C || P, 4 || || In || || Icosa, Copper, Iowa
|-
| 0x12 || ProdType2 || 0x7B || 0xC900040D || P, 3 || || In || || Icosa, Copper, Iowa
|-
| 0x13 || ProdType3 || 0x7A || 0xC900040E || P, 2 || || In || || Icosa, Copper, Iowa
|-
| 0x14 || TempAlert || 0xBC || 0x3E000002 || X, 4 || Temperature Sensor || In || || Icosa, Copper, Hoag, Iowa, Calcio, Aula
|-
| 0x15 || CodecHpDetIrq || 0xAE || 0x33000004 || V, 6 || Audio Codec (ALC5639) Headphone Detect || In || [[Audio services]] || Icosa, Hoag, Iowa, Aula
|-
| 0x16 || MotionInt || 0xBA || 0x35000041 || X, 2 || Built-in IMU IRQ || In || || Icosa, Hoag, Iowa, Aula
|-
| 0x17 || TpIrq || 0xB9 || 0x35000036 || X, 1 || TouchPanel IRQ || In || [[HID services]] || Icosa, Hoag, Iowa, Aula
|-
| 0x18 || ButtonSleep2 || 0xBD || 0x35000001 || X, 5 || Power Button (Connected only on Hoag) || In || || Icosa, Copper, Hoag, Iowa, Calcio, Aula
|-
| 0x19 || ButtonVolUp || 0xBE || 0x35000002 || X, 6 || Volume Up || In || [[Boot2]], [[Audio services]], [[Fatal services]] || Icosa, Copper, Hoag, Iowa, Calcio, Aula
|-
| 0x1A || ButtonVolDn || 0xBF || 0x35000003 || X, 7 || Volume Down || In || [[Boot2]], [[Audio services]] || Icosa, Copper, Hoag, Iowa, Calcio , Aula
|-
| 0x1B || BattMgicIrq || 0xC0 || 0x39000034 || Y, 0 || Fuel Gauge IC (MAX17050) IRQ || In || [[PTM services]], [[AM services]] || Icosa, Hoag, Iowa, Aula
|-
| 0x1C || RecoveryKey || 0xC1 || 0x35000004 || Y, 1 || Recovery Mode Key (HOME Button) || In || || Icosa, Copper, Hoag, Iowa, Calcio, Aula
|-
| 0x1D || PowLcdBlEn || 0xA9 || 0x3400003E || V, 1 || LCD Backlight Power || Out || [[NV services]], [[Backlight services]] || Icosa, Hoag, Iowa
|-
| 0x1E || LcdReset || 0xAA || 0x34000033 || V, 2 || LCD Reset || Out || [[NV services]] || Icosa, Hoag, Iowa, Aula
|-
| 0x1F || PdVconnEn || 0x55 || 0x040000CC || K, 5 || USB-PD Controller (RHOM BM92T30MWV) VCONN Power || Out || [[PTM services]], [[USB services]] || Icosa, Hoag, Iowa, Aula
|-
| 0x20 || PdRstN || 0xAD || 0x040000CA || V, 5 || USB-PD Controller (RHOM BM92T30MWV) ResetN || Out || [[USB services]] || Icosa, Copper, Hoag, Iowa, Calcio, Aula
|-
| 0x21 || Bq24190Irq || 0xC8 || 0x39000002 || Z, 0 || Charger IC (BQ24193) IRQ || In || [[PTM services]], [[AM services]] || Icosa, Hoag, Iowa, Aula
|-
| 0x22 || SdevCoaxSel0 || 0xCA || 0xCA000405 ([1.0.0-10.0.0] 0xCA000401) || Z, 2 || SDEV Coax Select || In || || Icosa, Iowa
|-
| 0x23 || SdWp || 0xCB || 0x3C000003 || Z, 3 || SdCard Write Protect || In || || Icosa, Copper, Hoag, Iowa, Calcio, Aula
|-
| 0x24 || TpReset || 0x4F || 0x35000035 || J, 7 || TouchPanel Reset || Out || [[HID services]] || Icosa, Hoag, Iowa, Aula
|-
| 0x25 || BtGpio2 || 0x50 || 0x37000401 || K, 0 || || In || || Icosa, Copper, Hoag, Iowa, Calcio, Aula
|-
| 0x26 || BtGpio3 || 0x51 || 0x37000402 || K, 1 || || In || || Icosa, Copper, Hoag, Iowa, Calcio, Aula
|-
| 0x27 || BtGpio4 || 0x52 || 0x37000403 || K, 2 || || In || || Icosa, Copper, Hoag, Iowa, Calcio, Aula
|-
| 0x28 || CradleIrq || 0x54 || 0x040000CB || K, 4 || USB-PD Controller (RHOM BM92T30MWV) IRQ || In || [[USB services]], [[AM services]] || Icosa, Copper, Hoag, Iowa, Calcio, Aula
|-
| 0x29 || PowVcpuInt || 0x56 || 0x3E000003 || K, 6 || Sub-PMIC for CPU (MAX77621) IRQ || In || ||  Icosa, Copper, Aula
|-
| 0x2A || Max77621GpuInt || 0x57 || 0x3E000004 || K, 7 || Sub-PMIC for GPU (MAX77621) IRQ || In || || Icosa, Copper
|-
| 0x2B || ExtconChgU || 0x53 || 0x35000402 || K, 3 || Joy-Con(R) Charge || Out || [[HID services]] || Icosa, Iowa, Aula
|-
|-
! Cmd || Name
| 0x2C || ExtconChgS || 0xE3 || 0x3500040C || CC, 3 || Joy-Con(L) Charge || Out || [[HID services]] || Icosa, Iowa, Aula
|-
|-
| 0 || [[#OpenSessionForDev_2|OpenSessionForDev]]
| 0x2D || WifiRfDisable || 0x38 || 0x38000003 || H, 0 || || Out || || Icosa, Copper, Hoag, Iowa, Calcio
|-
|-
| 1 || [[#OpenSession_2|OpenSession]]
| 0x2E || WifiReset || 0x39 || 0x38000002 || H, 1 || WiFi Reset || Out || [[WLAN services]], [[PCIe services]] || Icosa, Copper, Hoag, Iowa, Calcio, Aula
|-
|-
| [1.0.0-5.1.0] 2 || [[#HasDevice|HasDevice]]
| 0x2F || ApWakeBt || 0x3B || 0x37000003 || H, 3 || Wake Bluetooth from Host || Out || [[Bluetooth Driver services]] || Icosa, Copper, Hoag, Iowa, Calcio, Aula
|-
|-
| [1.0.0-5.1.0] 3 || [[#HasDeviceForDev|HasDeviceForDev]]
| 0x30 || BtWakeAp || 0x3D || 0x37000004 || H, 5 || Wake Host from Bluetooth || In || [[AM services]] || Icosa, Copper, Hoag, Iowa, Calcio, Aula
|-
|-
| 4 || [6.0.0+] [[#OpenSession2_2|OpenSession2]]
| 0x31 || BtGpio5 || 0x3F || 0x37000404 || H, 7 || || Out || || Icosa, Copper, Hoag, Iowa, Calcio, Aula
|}
 
== Known Devices ==
{| class="wikitable sortable" border="1"
|-
|-
! Name || DeviceCode || Port:Addr || Is10bit || Speed || Max Retries || Retry Delay || Usage || Used by (services) || Used by (hardware)
| 0x32 || PowLcdVddPEn || 0x40 || 0x34000034 || I, 0 || LCD Backlight PAVDD +5V || Out || [[NV services]] || Icosa, Hoag, Iowa
|-
|-
| 0 || 0x350000C9 || 0:52 || N || 100000 || 0 ||       0 || DebugPadDriver || [[HID services]] || Icosa, Copper, Iowa
| 0x33 || PowLcdVddNEn || 0x41 || 0x34000035 || I, 1 || LCD Backlight NAVDD -5V || Out || [[NV services]] || Icosa, Hoag, Iowa
|-
|-
| 1 || 0x35000033 || 2:49 || N || 400000 || 0 ||      0 || TouchPanel || [[HID services]] || Icosa, Copper, Hoag, Iowa
| 0x34 || ExtconDetU || 0x3E || 0x35000401 || H, 6 || Joy-Con(R) IsAttached (insertion, Joy-Con pin 5/console TX, pulled low on insert)  || In || [[HID services]], [[AM services]] || Icosa, Iowa, Aula
|-
|-
| 2 || 0x3E000001 || 0:4c || N || 100000 || 0 ||       0 || Temperature Sensor (TMP451 or NCT72) || [[PTM services]] || Icosa, Copper, Hoag, Iowa, Calcio
| 0x35 || RamCode2 || 0xE2 || 0xC9000401 || CC, 2 || Secondary Boot Device Configration || In || || Icosa, Iowa
|-
|-
| 3 || 0x3E000001 || 0:4c || N || 100000 || 0 ||       0 || Temperature Sensor (TMP451 or NCT72) (duplicate) || [[PTM services]] || Icosa, Copper, Hoag, Iowa, Calcio
| 0x36 || Vdd50BEn || 0xE4 || 0x39000402 || CC, 4 || Fan and Joy-Con 5V Power (USB) || Out || [[PTM services]] || Icosa, Iowa
|-
|-
| 4 || 0x33000001 || 0:1c || N || 100000 || 0 ||       0 || Audio Codec (ALC5639) || [[Audio services]], [[Fatal services]] || Icosa, Copper, Hoag, Iowa
| 0x37 || WifiWakeHost || 0x3A || 0x38000004 || H, 2 || Wake Host from Wifi || In || [[AM services]] || Icosa, Copper, Hoag, Iowa, Calcio, Aula
|-
|-
| 5 || 0x3B000001 || 4:68 || N || 400000 || 3 || 5000000 || PMIC RTC (max77620_rtc0), max77620_irq0 || [[PCV services]] || Icosa, Copper
| 0x38 || SdCd || 0xC9 || 0x3C000002 || Z, 1 || SdCard Card Detect || In || [[Filesystem services]], [[AM services]] || Icosa, Copper, Hoag, Iowa, Calcio, Aula
|-
|-
| 6 || 0x3A000001 || 4:3c || N || 400000 || 3 || 5000000 || PMIC (MAX77620), max77620_irq0 || [[PCV services]] || Icosa, Copper
| 0x39 || OtgFet1ForSdev || 0x4D || 0x39000404 || J, 5 || Charger IC (BQ24193) OTG Charge Select || Out || [[PTM services]], [[USB services]] || Icosa, Iowa
|-
|-
| 7 || 0x3A000003 || 4:1b || N || 400000 || 3 || 5000000 || Sub-PMIC for CPU (max77621_cpu) || [[PCV services]] || Icosa, Copper
| 0x3A || OtgFet2ForSdev || 0x58 || 0x39000405 || L, 0 || Charger IC (BQ24193) OTG Charge Select || Out || [[PTM services]], [[USB services]] || Icosa, Iowa
|-
|-
| 8 || 0x3A000004 || 4:1c || N || 400000 || 3 || 5000000 || Sub-PMIC for GPU (max77621_gpu) || [[PCV services]] || Icosa, Copper
| 0x3B || ExtConWakeU || 0x3E || 0x35000403 || H, 6 || Joy-Con(R) Wake Detect || In || || Icosa, Hoag, Iowa, Aula
|-
|-
| 9 || 0x39000001 || 0:6b || N || 100000 || 3 || 5000000 || Charger IC (BQ24193) || [[PTM services]] || Icosa, Copper, Hoag, Iowa
| 0x3C || ExtConWakeS || 0x26 || 0x3500040D || E, 6 || Joy-Con(L) Wake Detect || In || || Icosa, Hoag, Iowa, Aula
|-
|-
| 10 || 0x39000033 || 0:36 || N || 100000 || 3 || 5000000 || Fuel Gauge IC (MAX17050) || [[PTM services]], [[PCV services]] || Icosa, Copper, Hoag, Iowa
| 0x3D || PmuIrq || -1 || 0x39000406 || GIC 86 || Main PMIC IRQ (PMU_EXT IRQ) || || ||  
|-
|-
| 11 || 0x040000C9 || 0:18 || N || 100000 || 3 || 5000000 || USB-PD controller (RHOM BM92T30MWV) || [[USB services]] || Icosa, Copper, Hoag, Iowa, Calcio
| 0x3E || ExtUart2Cts || 0x33 || 0x35000404 || G, 3 || Joy-Con(R) CTS (checked low) || In || [[HID services]], [[AM services]] ||  
|-
|-
| 12 || 0x3F000401 || 1:40 || N || 400000 || 3 || 5000000 || Power Monitor (ina226_V_VDD15V0-HB) || || Factory
| 0x3F || ExtUart3Cts || 0x1C || 0x3500040E || D, 4 || Joy-Con(L) CTS (checked low) || In || [[HID services]], [[AM services]] ||  
|-
|-
| 13 || 0x3F000001 || 1:41 || N || 400000 || 3 || 5000000 || Power Monitor (ina226_V_VSYS-CPU-DS) || || Factory
| 0x40 || 5VStepDownEn || 0xD9 || 0x39000408 || BB, 1 || 5V Step-Down Regulator Power || Out || || Copper
|-
|-
| 14 || 0x3F000002 || 1:44 || N || 400000 || 3 || 5000000 || Power Monitor (ina226_V_VSYS-GPU-DS) || || Factory
| 0x41 || UsbSwitchB2Oc || 0x0C || 0x04000401 || B, 4 || USB Root Port 2 Over Current || In || [[USB services]] || Copper
|-
|-
| 15 || 0x3F000003 || 1:45 || N || 400000 || 3 || 5000000 || Power Monitor (ina226_V_VSYS-DDR-DS) || || Factory
| 0x42 || 5VStepDownPg || 0x0D || 0x39000409 || B, 5 || 5V Step-Down Regulator Power Good Flag || In || || Copper
|-
|-
| 16 || 0x3F000402 || 1:46 || N || 400000 || 3 || 5000000 || Power Monitor (ina226_V_VSYS-AP) || || Factory
| 0x43 || UsbSwitchAEn || 0x21 || 0x04000402 || E, 1 || USB Power || Out || [[USB services]] || Copper
|-
|-
| 17 || 0x3F000403 || 1:47 || N || 400000 || 3 || 5000000 || Power Monitor (ina226_V_VSYS-BL-DS) || || Factory
| 0x44 || UsbSwitchAFlag || 0x27 || 0x04000403 || E, 7 || USB Power Flag || In || [[USB services]] || Copper
|-
|-
| 18 || 0x35000047 || 1:29 || N || 400000 || 3 || 5000000 || Ambient Light Sensor (BH1730) || [[Backlight services]] || Icosa, Copper, Hoag, Iowa
| 0x45 || UsbSwitchB3Oc || 0x92 || 0x04000404 || S, 2 || USB Root Port 3 Over Current || In || [[USB services]] || Copper
|-
|-
| 19 || 0x3F000404 || 1:48 || N || 400000 || 3 || 5000000 || Power Monitor (ina226_CORE) || || Factory
| 0x46 || UsbSwitchB3En || 0x95 || 0x04000405 || S, 5 || USB Root Port 3 Power || Out || [[USB services]] || Copper
|-
|-
| 20 || 0x3F000405 || 1:49 || N || 400000 || 3 || 5000000 || Power Monitor (ina226_Soc-1V8) || || Factory
| 0x47 || UsbSwitchB2En || 0x98 || 0x04000406 || T, 0 || USB Root Port 2 Power || Out || [[USB services]] || Copper
|-
|-
| 21 || 0x3F000406 || 1:4a || N || 400000 || 3 || 5000000 || Power Monitor (ina226_LPDDR4-1V8) || || Factory
| 0x48 || Hdmi5VEn || 0x10 || 0x34000004 || C, 0 || HDMI 5V Power || Out || [[NV services]] || Copper, Calcio
|-
|-
| 22 || 0x3F000407 || 1:4b || N || 400000 || 3 || 5000000 || Power Monitor (ina226_REG1V32) || || Factory
| 0x49 || UsbSwitchB1En || 0x11 || 0x04000407 || C, 1 || USB Root Port 1 Power || Out || [[USB services]] || Copper, Calcio
|-
|-
| 23 || 0x3F000408 || 1:4d || N || 400000 || 3 || 5000000 || Power Monitor (ina226_VDD3V3-SYS) || || Factory
| 0x4A || HdmiPdTrEn || 0x12 || 0x34000005 || C, 2 || HDMI/Power Delivery Switch || Out || [[NV services]] || Copper, Calcio
|-
|-
| [2.0.0+] 24 || 0x34000001 || 3:50 || N || 100000 || 0 ||       0 || HDMI DDC || [[NV services]] || Copper, Calcio
| 0x4B || FanEn || 0x42 || 0x3D000003 || I, 2 || Fan Power || Out || [[PTM services]] || Copper
|-
|-
| [2.0.0+] 25 || 0x34000002 || 3:54 || N || 100000 || 0 ||       0 || HDMI SCDC || [[NV services]] || Copper, Calcio
| 0x4C || UsbSwitchB1Oc || 0xE6 || 0x04000408 || CC, 6 || USB Root Port 1 Over Current || In || [[USB services]] || Copper, Calcio
|-
|-
| [2.0.0+] 26 || 0x34000003 || 3:3a || N || 100000 || 0 ||       0 || HDMI HDCP || [[NV services]] || Copper, Calcio
| [2.0.0+] 0x4D || PwmFan || 0xAC || 0x3D000001 || V, 4 || Pulse-Width Modulation Fan Control || Out || [[PTM services]] || Copper
|-
|-
| [4.0.0+] 27 || 0x3A000005 || 4:52 ([4.0.0-8.0.0] 4:a4) || N || 400000 || 0 ||       0 || Buck Regulator (FAN53528) || || Hoag, Iowa, Calcio
| [2.0.0+] 0x4E || HdmiHpd || 0xE1 || 0x34000006 || CC, 1 || HDMI Hot Plug Detect || In || [[NV services]] || Copper, Calcio
|-
|-
| [4.0.0+] 28 || 0x3A000002 || 4:33 ([4.0.0-8.0.0] 4:31) || N || 400000 || 0 ||      0 || PMIC (MAX77812) || [[PCV services]] || Hoag, Iowa, Calcio
| [5.0.0+] 0x4F || Max77812Irq || 0x56 || 0x3E000003 || K, 6 || Sub-PMIC (CPU/GPU/RAM) IRQ || In || || Hoag, Iowa, Calcio
|-
|-
| [4.0.0+] 29 || 0x3A000002 || 4:33 ([4.0.0-8.0.0] 4:31) || N || 400000 || 0 ||       0 || PMIC (MAX77812) || [[PCV services]] || Hoag, Iowa, Calcio
| [6.0.0+] 0x50 || Debug0 || 0x20 || 0xCA000001 || E, 0 || || Out || || Hoag, Calcio, Aula
|-
|-
| [4.0.0+] 30 || 0x3F000409 || 1:4e || N || 400000 || 3 || 5000000 || Power Monitor (ina226_V_VDD-DDR-0V6) || || Factory
| [6.0.0+] 0x51 || Debug1 || 0x21 || 0xCA000002 || E, 1 || || Out || || Hoag, Calcio, Aula
|-
|-
| [8.0.0+] 31 || 0x36000001 || 1:08 || N || 400000 || 3 || 5000000 || NFC IC || || Hoag
| [6.0.0+] 0x52 || Debug2 || 0x22 || 0xCA000003 || E, 2 || || Out || || Hoag, Calcio, Aula
|}
 
== OpenSessionForDev ==
Takes an u32 '''port''', an u16 '''addr''', an '''AddressingMode''' (1 for 10-bit, 0 otherwise) and a '''SpeedMode''' (400000 or 100000). Returns a [[#II2cSession]] session.
 
== OpenSession ==
Takes an '''I2cDevice''' and returns a [[#II2cSession]] session for it.
 
== HasDevice ==
Takes an '''I2cDevice''' and returns true if the device exists or false otherwise.
 
== HasDeviceForDev ==
Takes an u32 '''port''', an u16 '''addr''', an '''AddressingMode''' (1 for 10-bit, 0 otherwise) and a '''SpeedMode''' (400000 or 100000). Returns true if the device exists or false otherwise.
 
== OpenSession2 ==
Same as [[#OpenSession_2|OpenSession]] but takes a '''DeviceCode''' instead of a '''I2cDevice'''.
 
== II2cSession ==
This is "nn::i2c::ISession".
 
{| class="wikitable" border="1"
|-
|-
! Cmd || Name
| [6.0.0+] 0x53 || Debug3 || 0x23 || 0xCA000004 || E, 3 || || Out || || Hoag, Calcio, Aula
|-
|-
| [1.0.0-5.1.0] 0 || Send
| [6.0.0+] 0x54 || NfcIrq || 0x4C || 0x36000004 || J, 4 || NFC Controller IRQ || In || [[NFC services]] || Hoag
|-
|-
| [1.0.0-5.1.0] 1 || Receive
| [6.0.0+] 0x55 || NfcRst || 0x57 || 0x36000003 || K, 7 || NFC Controller Reset || Out || [[NFC services]] || Hoag
|-
|-
| [1.0.0-5.1.0] 2 || ExecuteCommandList
| [6.0.0+] 0x56 || McuIrq || 0x27 ([6.0.0-8.0.0] 0x94) || 0x35000415 || E, 7 || Sio MCU IRQ || In || || Hoag
|-
|-
| 10 || [[#SendAuto]]
| [6.0.0+] 0x57 || McuBoot || 0x98 || 0x35000416 || T, 0 || Sio MCU BOOT0 Select (0: Flash, 1: SRAM) || Out || [[HID services]] || Hoag
|-
|-
| 11 || ReceiveAuto
| [6.0.0+] 0x58 || McuRst || 0x99 || 0x35000417 || T, 1 || Sio MCU ResetN (Output LOW -> Input) || In || [[HID services]] || Hoag
|-
|-
| 12 || [[#ExecuteCommandListAuto]]
| [6.0.0+] 0x59 || Vdd5V3En || 0xBB || 0x39000403 || X, 3 || OTG VBUS Power || Out || [[PTM services]] || Hoag, Iowa, Aula
|-
|-
| 13 || [6.0.0+]
| [6.0.0+] 0x5A || McuPor || 0xE5 || 0x35000418 || CC, 5 || Sio MCU NPOR || Out || [[HID services]] || Hoag
|}
 
== SendAuto ==
Takes bytes to write in either a static buffer or a receive buffer, returns an error code for success
 
== ExecuteCommandListAuto ==
Takes a command list from either a static buffer or a receive buffer, returns data in either a static (or recieve?) buffer.
 
=== Commands ===
* 0x40 [u8 len] <bytes> - Write bytes to device
* 0xC1 [u8 len] - Receive bytes from device
 
= uart =
This is "nn::uart::IManager".
 
{| class="wikitable" border="1"
|-
|-
! Cmd || Name
| [6.0.0+] 0x5B || (McuHome) || 0xAB || 0x35000005 || V, 3 || Sio MCU Home Button || In || [[HID services]], [[AM services]] || Hoag
|-
|-
| 0 || [[#HasPort]]
| [6.0.0+] 0x5C || NfcEn || 0x4E || 0x36000002 || J, 6 || NFC Controller Power || Out || [[NFC services]] || Hoag
|-
|-
| 1 || [[#HasPortForDev]]
| [7.0.0+] - || ExtUart2Rts || 0x32 || 0x35000406 || G, 2 || Joy-Con(R) RTS || In || ||  
|-
|-
| 2 || [[#IsSupportedBaudRate]]
| [7.0.0+] - || ExtUart3Rts || 0x1B || 0x35000410 || D, 3 || Joy-Con(L) RTS || In || ||  
|-
|-
| 3 || [[#IsSupportedBaudRateForDev]]
| [7.0.0+] - || || 0x17 || 0x3500041B || C, 7 || SPI4 MOSI (Built-in IMU, set as gpio-input so Sio can use IMU) || In || || Hoag
|-
|-
| 4 || [[#IsSupportedFlowControlMode]]
| [7.0.0+] - || || 0x18 || 0x3500041C || D, 0 || SPI4 MISO (Built-in IMU, set as gpio-input so Sio can use IMU) || In || || Hoag
|-
|-
| 5 || [[#IsSupportedFlowControlModeForDev]]
| [7.0.0+] - || || 0x15 || 0x3500041D || C, 5 || SPI4 SCLK (Built-in IMU, set as gpio-input so Sio can use IMU) || In || || Hoag
|-
|-
| 6 || [[#CreatePortSession]]
| [7.0.0+] - || || 0x16 || 0x3500041E || C, 6 || SPI4 CS0 (Built-in IMU, set as gpio-input so Sio can use IMU) || In || || Hoag
|-
|-
| 7 || [[#IsSupportedPortEvent]]
| [10.0.0+] - || || 0xC5 || 0x35000065 || Y, 5 || Notification LED PWM (CLK 32K OUT) || Out || || Hoag
|-
|-
| 8 || [[#IsSupportedPortEventForDev]]
| [10.0.0+] - || || 0x29 || 0x04000409 || F, 1 || || Out || || Calcio
|-
|-
| 9 || [7.0.0+] [[#IsSupportedDevice]]
| [10.0.0+] - || || 0x38 || 0x34000401 || H, 0 || OLED Panel IRQ || In || [[Display services]] || Aula
|-
|-
| 10 || [7.0.0+] [[#IsSupportedDeviceForDev]]
| [13.0.0+] - || (BtGpio6) || 0x46 || 0x37000405 || I, 6 || UART-D RTS (Bluetooth) || In || ||
|}
|}


== HasPort ==
= GpioPadDescriptor =
Takes an u32 [[#UartPort]]. Returns a boolean success value.
{| class="wikitable" border="1"
|-
! Bits || Description
|-
| 7-5 || Controller index
|-
| 4-3 || Port index
|-
| 2-0 || Pin number
|}


== HasPortForDev ==
= Direction =
Takes an u32 [[#UartPortForDev]]. Returns a boolean success value.
This is "nn::gpio::Direction".


== IsSupportedBaudRate ==
{| class="wikitable sortable" border="1"
Takes an u32 [[#UartPort]] and an u32 '''BaudRate'''. Returns a boolean success value.
|-
! Value || Name
|-
| 0 || Input
|-
| 1 || Output
|}


Supported baud rates are 57600, 115200, 1000000 and 3000000.
= GpioValue =
This is "nn::gpio::GpioValue".


== IsSupportedBaudRateForDev ==
{| class="wikitable sortable" border="1"
Takes an u32 [[#UartPortForDev]] and an u32 '''BaudRate'''. Returns a boolean success value.
|-
! Value || Name
|-
| 0 || Low
|-
| 1 || High
|}


Supported baud rates are 57600, 115200, 1000000 and 3000000.
= InterruptMode =
This is "nn::gpio::InterruptMode".


== IsSupportedFlowControlMode ==
{| class="wikitable sortable" border="1"
Takes an u32 [[#UartPort]] and an u32 '''FlowControlMode'''. Returns a boolean success value.
|-
! Value || Name
|-
| 0 || LowLevel
|-
| 1 || HighLevel
|-
| 2 || RisingEdge
|-
| 3 || FallingEdge
|-
| 4 || AnyEdge
|}


Supported modes are 0 (RTS) and 1 (CTS).
= InterruptStatus =
This is "nn::gpio::InterruptStatus".


== IsSupportedFlowControlModeForDev ==
{| class="wikitable sortable" border="1"
Takes an u32 [[#UartPortForDev]] and an u32 '''FlowControlMode'''. Returns a boolean success value.
|-
! Value || Name
|-
| 0 || Inactive
|-
| 1 || Active
|}


Supported modes are 0 (RTS) and 1 (CTS).
= WakeBitFlag =
This is "nn::gpio::WakeBitFlag". This is a 128-bit flag.


== CreatePortSession ==
= OpenMode =
No input. Returns an [[#IPortSession]].
This is "nn::gpio::OpenMode".


== IsSupportedPortEvent ==
{| class="wikitable sortable" border="1"
Takes an u32 [[#UartPort]] and an u32 '''PortEvent'''. Returns a boolean success value.
|-
 
! Value || Name
Supported events are 0 (data), 1 (break), 2 (unknown) and 3 (unknown).
|-
| 0 || None
|-
| 1 || Read
|-
| 2 || Write
|-
| 3 || ReadWrite
|}


== IsSupportedPortEventForDev ==
= I2cDevice =
Takes an u32 [[#UartPortForDev]] and an u32 '''PortEvent'''. Returns a boolean success value.
This is "nn::i2c::I2cDevice".


Supported events are 0 (data), 1 (break), 2 (unknown) and 3 (unknown).
== IsSupportedDevice ==
Takes an u32 [[#UartPort]] and an u32 '''Device'''. Returns a boolean success value.
Supported devices are 0 (Bluetooth) for UART-D, 0 (Joy-Con(R)) for UART-B, 0 (Joy-Con(L)) and 1 (MCU) for UART-C.
== IsSupportedDeviceForDev ==
Takes an u32 [[#UartPortForDev]] and an u32 '''Device'''. Returns a boolean success value.
Supported devices are 0 (Bluetooth) for UART-D, 0 (Joy-Con(R)) for UART-B, 0 (Joy-Con(L)) and 1 (MCU) for UART-C.
== UartPort ==
{| class="wikitable sortable" border="1"
{| class="wikitable sortable" border="1"
|-
|-
! Name || DeviceCode (internal) || DeviceCode (mapped) || Port || Usage
! Value || Name || DeviceCode || Port:Addr || Is10bit || Speed || Max Retries || Retry Delay || Description || Used by (services) || Used by (hardware)
|-
|-
| 0 || 0x03000001 || || UART-A || Invalid
| 0 || ClassicController || 0x350000C9 || 0:52 || N || 100000 || 0 ||      0 || DebugPad Driver || [[HID services]] || Icosa, Iowa, Aula
|-
|-
| 1 || 0x03000004 || 0x37000001 || UART-D || Bluetooth
| 1 || Ftm3bd56 || 0x35000033 || 2:49 || N || 400000 || 0 ||      0 || TouchPanel || [[HID services]] || Icosa, Hoag, Iowa, Aula
|-
|-
| 2 || 0x03000002 || 0x35000405 || UART-B || Joy-Con(R)
| 2 || Tmp451 || 0x3E000001 || 0:4C || N || 100000 || 0 ||      0 || Temperature Sensor || [[PTM services]] || Icosa, Copper, Hoag, Iowa, Calcio, Aula
|-
|-
| 3 || 0x03000003 || 0x3500040F || UART-C || Joy-Con(L)
| 3 || Nct72 || 0x3E000001 || 0:4C || N || 100000 || 0 ||      0 || Temperature Sensor || [[PTM services]] || Icosa, Copper, Hoag, Iowa, Calcio, Aula
|-
|-
| 4 || 0x03000003 || 0x35000419 || UART-C || MCU
| 4 || Alc5639 || 0x33000001 || 0:1C || N || 100000 || 0 ||      0 || Audio Codec || [[Audio services]], [[Fatal services]] || Icosa, Hoag, Iowa, Aula
|}
|-
 
|  5 || Max77620Rtc || 0x3B000001 || 4:68 || N || 400000 || 3 || 5000000 || PMIC RTC || [[PCV services]] || Icosa, Copper
== UartPortForDev ==
|-
{| class="wikitable sortable" border="1"
|  6 || Max77620Pmic || 0x3A000001 || 4:3C || N || 400000 || 3 || 5000000 || PMIC || [[PCV services]] || Icosa, Copper
|-
|  7 || Max77621Cpu || 0x3A000003 || 4:1B || N || 400000 || 3 || 5000000 || Sub-PMIC for CPU || [[PCV services]] || Icosa, Copper
|-
|  8 || Max77621Gpu || 0x3A000004 || 4:1C || N || 400000 || 3 || 5000000 || Sub-PMIC for GPU || [[PCV services]] || Icosa, Copper
|-
|  9 || Bq24193 || 0x39000001 || 0:6B || N || 100000 || 3 || 5000000 || Charger IC || [[PTM services]] || Icosa, Hoag, Iowa, Aula
|-
| 10 || Max17050 || 0x39000033 || 0:36 || N || 100000 || 3 || 5000000 || Fuel Gauge IC || [[PTM services]], [[PCV services]] || Icosa, Hoag, Iowa, Aula
|-
| 11 || Bm92t30mwv || 0x040000C9 || 0:18 || N || 100000 || 3 || 5000000 || USB-PD controller || [[USB services]] || Icosa, Copper, Hoag, Iowa, Calcio, Aula
|-
| 12 || Ina226Vdd15v0Hb || 0x3F000401 || 1:40 || N || 400000 || 3 || 5000000 || Power Monitor || nvdbgsvc || Factory
|-
| 13 || Ina226VsysCpuDs or Ina226VddCpuAp (SdevMariko) || 0x3F000001 || 1:41 || N || 400000 || 3 || 5000000 || Power Monitor || nvdbgsvc || Factory
|-
| 14 || Ina226VsysGpuDs or Ina226VddGpuAp (SdevMariko) || 0x3F000002 || 1:44 || N || 400000 || 3 || 5000000 || Power Monitor || nvdbgsvc || Factory
|-
| 15 || Ina226VsysDdrDs or Ina226VddDdr1V1Pmic (SdevMariko) || 0x3F000003 || 1:45 || N || 400000 || 3 || 5000000 || Power Monitor || nvdbgsvc || Factory
|-
| 16 || Ina226VsysAp || 0x3F000402 || 1:46 || N || 400000 || 3 || 5000000 || Power Monitor || nvdbgsvc || Factory
|-
| 17 || Ina226VsysBlDs || 0x3F000403 || 1:47 || N || 400000 || 3 || 5000000 || Power Monitor || nvdbgsvc || Factory
|-
| 18 || Bh1730 || 0x35000047 || 1:29 || N || 400000 || 3 || 5000000 || Ambient Light Sensor || [[Backlight services]] || Icosa, Hoag, Iowa, Aula
|-
|-
! Name || DeviceCode (internal) || DeviceCode (mapped) || Port || Usage
| 19 || Ina226VsysCore or Ina226VddCoreAp (SdevMariko) || 0x3F000404 || 1:48 || N || 400000 || 3 || 5000000 || Power Monitor || nvdbgsvc || Factory
|-
|-
| 0 || 0x03000001 || || UART-A || Invalid
| 20 || Ina226Soc1V8 or Ina226VddSoc1V8 (SdevMariko) || 0x3F000405 || 1:49 || N || 400000 || 3 || 5000000 || Power Monitor || nvdbgsvc || Factory
|-
|-
| 1 || 0x03000002 || 0x35000405 || UART-B || Joy-Con(R)
| 21 || Ina226Lpddr1V8 or Ina226Vdd1V8 (SdevMariko) || 0x3F000406 || 1:4A || N || 400000 || 3 || 5000000 || Power Monitor || nvdbgsvc || Factory
|-
|-
| 2 || 0x03000003 || 0x3500040F || UART-C || Joy-Con(L)
| 22 || Ina226Reg1V32 || 0x3F000407 || 1:4B || N || 400000 || 3 || 5000000 || Power Monitor || nvdbgsvc || Factory
|-
|-
| 3 || 0x03000004 || 0x37000001 || UART-D || Bluetooth
| 23 || Ina226Vdd3V3Sys || 0x3F000408 || 1:4D || N || 400000 || 3 || 5000000 || Power Monitor || nvdbgsvc || Factory
|}
 
== IPortSession ==
This is "nn::uart::IPortSession".
 
{| class="wikitable" border="1"
|-
|-
! Cmd || Name
| [2.0.0+] 24 || HdmiDdc || 0x34000001 || 3:50 || N || 100000 || 0 ||      0 || HDMI DDC || [[NV services]] || Copper, Calcio
|-
|-
| 0 || [[#OpenPort]]
| [2.0.0+] 25 || HdmiScdc || 0x34000002 || 3:54 || N || 100000 || 0 ||      0 || HDMI SCDC || [[NV services]] || Copper, Calcio
|-
|-
| 1 || [[#OpenPortForDev]]
| [2.0.0+] 26 || HdmiHdcp || 0x34000003 || 3:3A || N || 100000 || 0 ||      0 || HDMI HDCP || [[NV services]] || Copper, Calcio
|-
|-
| 2 || GetWritableLength
| [4.0.0+] 27 || Fan53528 || 0x3A000005 || 4:52 ([4.0.0-8.0.0] 4:A4) || N || 400000 || 0 ||      0 || RAM Regulator (tied to Max77812Pmic) || || Hoag, Iowa, Calcio, Aula
|-
|-
| 3 || Send
| [4.0.0+] 28 || Max77812Pmic || 0x3A000002 || 4:31 ([8.0.0-9.2.0] 4:33, [4.0.0-8.0.0] 4:31) || N || 400000 || 0 ||      0 || Sub-PMIC for CPU and GPU (tied to Fan53528) (Phase 31) || [[PCV services]] || Hoag, Iowa, Calcio, Aula
|-
|-
| 4 || GetReadableLength
| [4.0.0+] 29 || Max77812Pmic || 0x3A000006 ([4.0.0-9.2.0] 0x3A000002) || 4:33 ([4.0.0-8.0.0] 4:31) || N || 400000 || 0 ||      0 || Sub-PMIC for GPU, CPU and RAM (Phase 211) || [[PCV services]] || Hoag, Iowa, Calcio, Aula
|-
|-
| 5 || Receive
| [4.0.0+] 30 || Ina226VddDdr0V6 (SdevMariko) || 0x3F000409 || 1:4E || N || 400000 || 3 || 5000000 || Power Monitor || nvdbgsvc || Factory
|-
|-
| 6 || BindPortEvent
| [8.0.0+] 31 || (MillauNfc) || 0x36000001 || 1:08 || N || 400000 || 3 || 5000000 || NFC Controller || [[NFC services]] || Hoag
|-
|-
| 7 || UnbindPortEvent
| [12.0.0+] - || (Max77801) || 0x3A000007 || 4:18 || N || 400000 || 0 ||      0 || Audio Codec (ALC5639) Regulator || [[PCV services]] || Aula
|}
|}


=== OpenPort ===
= AddressingMode =
Takes an u32 [[#UartPort]], 3 u32s, 2 copy handles and 4 u8s (each padded to u32). Returns a boolean success value.
This is "nn::i2c::AddressingMode".


[7.0.0+] Now takes an additional u64.
{| class="wikitable sortable" border="1"
|-
! Value || Name
|-
| 0 || BitWidth7
|-
| 1 || BitWidth10
|}


=== OpenPortForDev ===
= TransactionOption =
Takes an u32 [[#UartPortForDev]], 3 u32s, 2 copy handles and 4 u8s (each padded to u32). Returns a boolean success value.
This is "nn::i2c::TransactionOption".


[7.0.0+] Now takes an additional u64.
{| class="wikitable sortable" border="1"
|-
! Value || Name
|-
| 1 || StartCondition
|-
| 2 || StopCondition
|}


= pwm =
= SpeedMode =
This is "nn::pwm::IManager".
This is "nn::i2c::SpeedMode".


{| class="wikitable" border="1"
{| class="wikitable sortable" border="1"
|-
! Value || Name
|-
|-
! Cmd || Name
| 0x186A0 || Standard
|-
|-
| 0 || OpenSessionForDev
| 0x61A80 || Fast
|-
|-
| 1 || OpenSession
| 0xF4240 || FastPlus
|-
|-
| 2 || [6.0.0+] OpenSession2
| 0x33E140 || HighSpeed
|}
|}


== Known Channels ==
= CommandId =
This is "nn::i2c::detail::CommandId".
 
{| class="wikitable sortable" border="1"
{| class="wikitable sortable" border="1"
|-
|-
! Name || DeviceCode || Interface || Usage || Used by
! Value || Name
|-
|-
| 1 || 0x3D000001 || PWM Channel 1 || Fan || [[PTM services]]
| 0 || Send
|-
|-
| 2 || 0x3400003D || PWM Channel 0 || Backlight || [[Backlight services]], [[NV services]]
| 1 || Receive
|-
|-
| 3 || 0x35000065 || PMC Blinker || ||
| 2 || Extension
|}
|}


== IChannelSession ==
= SubCommandId =
This is "nn::pwm::IChannelSession".
This is "nn::i2c::detail::SubCommandId".


{| class="wikitable" border="1"
{| class="wikitable sortable" border="1"
|-
|-
! Cmd || Name
! Value || Name
|-
|-
| 0 || SetPeriod
| 0 || Sleep
|}
 
= UartPort =
This is "nn::uart::UartPort".
 
{| class="wikitable sortable" border="1"
|-
|-
| 1 || GetPeriod
! Value || Name || DeviceCode (internal) || DeviceCode (mapped) || Description
|-
|-
| 2 || SetDuty
| 0 || UART-A || 0x03000001 || || Invalid
|-
|-
| 3 || GetDuty
| 1 || UART-D || 0x03000004 || 0x37000001 || Bluetooth
|-
|-
| 4 || SetEnabled
| 2 || UART-B || 0x03000002 || 0x35000405 || Joy-Con(R)
|-
|-
| 5 || GetEnabled
| 3 || UART-C || 0x03000003 || 0x3500040F || Joy-Con(L)
|-
|-
| 6 || [6.0.0+]
| 4 || UART-C || 0x03000003 || 0x35000419 || SioMcu
|-
| 7 || [6.0.0+]
|}
|}


= pinmux =
= UartPortForDev =
This is "nn::pinmux::IManager".
This is "nn::uart::UartPortForDev".


{| class="wikitable" border="1"
{| class="wikitable sortable" border="1"
|-
! Value || Name || DeviceCode (internal) || DeviceCode (mapped) || Description
|-
| 0 || UART-A || 0x03000001 || || Invalid
|-
| 1 || UART-B || 0x03000002 || 0x35000405 || Joy-Con(R)
|-
|-
! Cmd || Name
| 2 || UART-C || 0x03000003 || 0x3500040F || Joy-Con(L)
|-
|-
| 0 || OpenSession
| 3 || UART-D || 0x03000004 || 0x37000001 || Bluetooth
|}
|}


== ISession ==
= FlowControlMode =
This is "nn::pinmux::ISession".
This is "nn::uart::FlowControlMode".


{| class="wikitable" border="1"
{| class="wikitable sortable" border="1"
|-
! Cmd || Name
|-
|-
| 0 || SetPinAssignment
! Value || Name
|-
|-
| 1 || GetPinAssignment
| 0 || None
|-
|-
| 2 || SetPinAssignmentForHardwareTest
| 1 || Hardware
|}
|}


= sasbus =
= PortEventType =
This is "nn::sasbus::IManager".
This is "nn::uart::PortEventType".


This was added with [3.0.0+].
{| class="wikitable sortable" border="1"
 
|-
{| class="wikitable" border="1"
! Value || Name
|-
| 0 || SendBufferEmpty
|-
| 1 || SendBufferReady
|-
|-
! Cmd || Name
| 2 || ReceiveBufferReady
|-
|-
| 0 || [[#OpenSession_3|OpenSession]]
| 3 || ReceiveEnd
|}
|}


== OpenSession ==
= ChannelName =
Takes an u32 that must be 0 and returns an [[#ISession_2|ISession]].
This is "nn::pwm::ChannelName".
 
This opens a session for communicating over SPI4. While code exists to support both SPI1 and SPI4 communication, SPI4 is currently hardcoded as the only available interface.


== ISession ==
{| class="wikitable sortable" border="1"
This is "nn::sasbus::ISession".
 
{| class="wikitable" border="1"
|-
|-
! Cmd || Name
! Value || Name || DeviceCode || Description || Used by
|-
|-
| 0 || [[#Write]]
| 0 || Invalid || || ||
|-
|-
| 1 || [[#Read]]
| 1 || CpuFan || 0x3D000001 || PWM Channel 1 || [[PTM_services#fan|PTM services]]
|-
|-
| 2 || [[#StartPeriodicReceiveMode]]
| 2 || LcdBacklight || 0x3400003D || PWM Channel 0 || [[Backlight services]], [[NV services]]
|-
|-
| 3 || [[#StopPeriodicReceiveMode]]
| 3 || Led || 0x35000065 || PMC LED Soft Blink || [[Bus services#led|Bus services]]
|}
|}


=== Write ===
= AssignablePinGroupName =
Takes a type-0x21 input buffer and an u8 '''SpiCommand'''. No output.
This is "nn::pinmux::AssignablePinGroupName".


=== Read ===
{| class="wikitable sortable" border="1"
Takes a type-0x22 output buffer and an u8 '''SpiCommand'''. No output.
|-
 
! Value || Description
=== StartPeriodicReceiveMode ===
|-
Takes an u8 '''SpiCommand''' (padded to u32), an u32, two u64s and a copy handle. No output.
| 0 || ExtConUartB
 
|-
=== StopPeriodicReceiveMode ===
| 1 || ExtConUartC
No input/output.
|-
 
| 2 || Sdmmc1
= led =
This is "nn::led::detail::IManager".
 
This was added with [9.0.0+].
 
{| class="wikitable" border="1"
|-
|-
! Cmd || Name
| 3 || PwmFan
|-
|-
| 0 || OpenController
| 100 || Invalid
|}
|}


== IController ==
= AssignablePinGroupNameForHardwareTest =
This is "nn::led::detail::IController".
This is "nn::pinmux::AssignablePinGroupNameForHardwareTest".


{| class="wikitable" border="1"
{| class="wikitable sortable" border="1"
|-
|-
! Cmd || Name
! Value || Description
|-
|-
| 0 ||  
| 0 || Invalid
|-
|-
| 1 ||  
| 1 || Invalid
|-
|-
| 2 ||  
| 2 || Invalid
|-
|-
| 3 ||  
| 3 || Invalid
|-
|-
| 4 ||
| 100 || UartD
|}
 
= PinAssignment =
This is "nn::pinmux::PinAssignment".
 
{| class="wikitable sortable" border="1"
|-
|-
| 5 ||
! Value || Name
|-
|-
| 6 ||
| 0 || ExtConUartOutputEnable
|-
|-
| 7 ||
| 1 || ExtConUartOutputHiZ
|-
|-
| 8 ||
| 2 || Sdmmc1OutputHigh
|-
|-
| 9 ||
| 3 || Sdmmc1ResetState
|-
|-
| 10 ||
| 4 || Sdmmc1SchmtEnable
|-
|-
| 11 ||
| 5 || Sdmmc1SchmtDisable
|-
|-
| 12 ||
| 6 || PwmFanEnable
|-
|-
| 13 ||
| 7 || PwmFanHiZ
|}
 
= PinAssignmentForHardwareTest =
This is "nn::pinmux::PinAssignmentForHardwareTest".
 
{| class="wikitable sortable" border="1"
|-
|-
| 14 ||
! Value || Name
|-
|-
| 15 ||
| 100 || UartDHiZ
|-
|-
| 16 ||
| 101 || UartDEnable
|-
|}
| 17 ||
 
= SasbusPort =
{| class="wikitable sortable" border="1"
|-
|-
| 18 ||
! Value || Name || DeviceCode || Description
|-
|-
| 19 ||
| 0 || SPI4 || 0x3500003D || Lsm6ds3 (WHOAMI 0x69, 0x6A and 0x6C)
|-
|-
| 20 ||
| [10.0.0+] 1 || SPI4 || 0x3500003D || Icm40607 (WHOAMI 0x38)
|-
|-
| 21 ||
| [13.0.0+] 2 || SPI4 || 0x3500003D || Icm42607p (WHOAMI 0x60)
|}
|}


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