Difference between revisions of "BTM services"

From Nintendo Switch Brew
Jump to navigation Jump to search
Line 183: Line 183:
 
|-
 
|-
 
| 115 || [14.0.0+]  
 
| 115 || [14.0.0+]  
 +
|-
 +
| 116 || [15.0.0+]
 +
|-
 +
| 117 || [15.0.0+]
 
|}
 
|}
  
Line 569: Line 573:
 
|-
 
|-
 
| 13 || [12.0.0+]
 
| 13 || [12.0.0+]
 +
|-
 +
| 14 || [15.0.0+]
 +
|-
 +
| 15 || [15.0.0+]
 +
|-
 +
| 16 || [15.0.0+]
 +
|-
 +
| 17 || [15.0.0+]
 
|}
 
|}
  

Revision as of 15:30, 11 October 2022

btm

This is "nn::btm::IBtm".

Support for "nn::btm::*" was added to sdknso with 6.x.

This has max_sessions 6. IPC is handled by 2 threads shared with all services.

With BLE connections, the remote device may receive ATT_READ_BY_GROUP_TYPE_REQ before the BLE connection-complete HCI event. One workaround for this is manually sending the response with HCI, after the connection is ready.

The output bool from all of these btm* service get-event cmds indicates whether the Event was successfully returned, user-processes will Abort when this is 0.

Cmd Name
0 #GetState
1 #GetHostDeviceProperty
2 #AcquireDeviceConditionEvent
3 #GetDeviceCondition
4 #SetBurstMode
5 #SetSlotMode
6 [1.0.0-8.1.1] #SetBluetoothMode
7 #SetWlanMode
8 #AcquireDeviceInfoEvent
9 #GetDeviceInfo
10 #AddDeviceInfo
11 #RemoveDeviceInfo
12 #IncreaseDeviceInfoOrder
13 #LlrNotify
14 #EnableRadio
15 #DisableRadio
16 #HidDisconnect
17 #HidSetRetransmissionMode
18 [2.0.0+] #AcquireAwakeReqEvent
19 [4.0.0+] #AcquireLlrStateEvent
20 [4.0.0+] #IsLlrStarted
21 [4.0.0+] #EnableSlotSaving
22 [5.0.0+] #ProtectDeviceInfo
23 [5.0.0+] #AcquireBleScanEvent
24 [5.1.0+] #GetBleScanParameterGeneral
25 [5.1.0+] #GetBleScanParameterSmartDevice
26 [5.1.0+] #StartBleScanForGeneral
27 [5.1.0+] #StopBleScanForGeneral
28 [5.1.0+] #GetBleScanResultsForGeneral
29 [5.1.0+] #StartBleScanForPairedDevice
30 [5.1.0+] #StopBleScanForPairedDevice
31 [5.1.0+] #StartBleScanForSmartDevice
32 [5.1.0+] #StopBleScanForSmartDevice
33 [5.1.0+] #GetBleScanResultsForSmartDevice
34 [5.1.0+] #AcquireBleConnectionEvent
35 ([5.0.0-5.0.2] 24) [5.0.0+] #BleConnect
36 [5.1.0+] #BleOverrideConnection
37 ([5.0.0-5.0.2] 25) [5.0.0+] #BleDisconnect
38 ([5.0.0-5.0.2] 26) [5.0.0+] #BleGetConnectionState
39 ([5.0.0-5.0.2] 27) [5.0.0+] #BleGetGattClientConditionList
40 ([5.0.0-5.0.2] 28) [5.0.0+] #AcquireBlePairingEvent
41 [5.1.0+] #BlePairDevice
42 [5.1.0+] #BleUnpairDeviceOnBoth
43 [5.1.0+] #BleUnpairDevice
44 [5.1.0+] #BleGetPairedAddresses
45 [5.1.0+] #AcquireBleServiceDiscoveryEvent
46 ([5.0.0-5.0.2] 29) [5.0.0+] #GetGattServices
47 ([5.0.0-5.0.2] 30) [5.0.0+] #GetGattService
48 ([5.0.0-5.0.2] 31) [5.0.0+] #GetGattIncludedServices
49 ([5.0.0-5.0.2] 32) [5.0.0+] #GetBelongingService
50 ([5.0.0-5.0.2] 33) [5.0.0+] #GetGattCharacteristics
51 ([5.0.0-5.0.2] 34) [5.0.0+] #GetGattDescriptors
52 ([5.0.0-5.0.2] 35) [5.0.0+] #AcquireBleMtuConfigEvent
53 ([5.0.0-5.0.2] 36) [5.0.0+] #ConfigureBleMtu
54 ([5.0.0-5.0.2] 37) [5.0.0+] #GetBleMtu
55 ([5.0.0-5.0.2] 38) [5.0.0+] #RegisterBleGattDataPath
56 ([5.0.0-5.0.2] 39) [5.0.0+] #UnregisterBleGattDataPath
57 ([5.0.0-5.0.2] 40) [5.0.0+] #RegisterAppletResourceUserId
58 ([5.0.0-5.0.2] 41) [5.0.0+] #UnregisterAppletResourceUserId
59 ([5.0.0-5.0.2] 42) [5.0.0+] #SetAppletResourceUserId
60 [8.0.0+]
61 [8.0.0+]
62 [9.0.0+]
63 [9.0.0+]
64 [10.0.0+]
65 [13.0.0+]
66 [13.0.0+]
67 [13.0.0+]
68 [13.0.0+]
69 [13.0.0+]
70 [13.0.0+]
71 [13.0.0+]
72 [13.0.0+]
73 [13.0.0+]
74 [13.0.0+]
75 [13.0.0+]
76 [13.1.0+]
100 [13.0.0+]
101 [13.0.0+]
110 [13.0.0+]
111 [13.0.0+]
112 [14.0.0+]
113 [14.0.0+]
114 [14.0.0+]
115 [14.0.0+]
116 [15.0.0+]
117 [15.0.0+]

GetState

No input, returns an output #BtmState.

GetHostDeviceProperty

No input, returns an output #HostDeviceProperty.

[13.0.0+] Takes a type-0x1A output buffer containing a #HostDeviceProperty, no output.

This gets the previously initialized #HostDeviceProperty.

AcquireDeviceConditionEvent

No input, returns an output Event handle with EventClearMode=1.

[3.0.0+] Now returns an additional output bool.

GetDeviceCondition

Takes a type-0x1A output buffer containing a 0x368-byte struct.

[13.0.0+] Takes an input u32 #Profile, a type-0xA output buffer containing an array of a 0x148-byte struct, returns a s32 for total output entries. When #Profile is non-zero, entries are only returned with a matching #Profile.

SetBurstMode

Takes an input BdAddress and a bool, no output.

SetSlotMode

Takes a type-0x19 input buffer containing a #DeviceSlotModeList, no output.

Sends a request which is then handled as follows:

  • Calls a func for getting the data from #DeviceSlotModeList etc for passing to another func, that func then does the following:
  • Goes through multiple arrays of BdAddress.
    • First array:
    • Second array:
    • Then it goes through the first array again, except here it does the following:
      • Calls the same func for validating the BdAddress with state, skipping it if not found. It is also skipped if the u32 at Address+0x8 is value 0x3.
      • Determines what Tsi value to use, on failure CloseHidConnection is used and the loop is continued.
      • Calls the SetTsi wrapper func described below, with the BdAddress and the above Tsi value. If this returns false, CloseHidConnection is used with the BdAddress.
    • It then goes through various arrays again for updating state.
    • {...}

Note that the above func is also called from various other funcs as well. An event for opening a hid connection also triggers it in some cases.

The SetTsi wrapper func is implemented as follows:

  • Uses SetTsi, on failure true is returned.
  • Gets the required EventInfo, returning false if a match wasn't found / EventInfo status indicates failure. True is returned for success.

SetBluetoothMode

Takes an input #BluetoothMode, no output.

SetWlanMode

Takes an input #WlanMode, no output.

AcquireDeviceInfoEvent

No input, returns an output Event handle with EventClearMode=1.

[3.0.0+] Now returns an additional output bool.

GetDeviceInfo

Takes a type-0x1A output buffer containing a #DeviceInfoList.

[13.0.0+] Takes an input u32 #Profile, a type-0xA output buffer containing an array of #DeviceInfo, returns a s32 for total output entries. When #Profile is non-zero, entries are only returned with a matching #Profile.

AddDeviceInfo

Takes an input #DeviceInfo, no output.

[13.0.0+] Takes a type-0x19 input buffer containing a #DeviceInfo, no output.

RemoveDeviceInfo

Takes an input BdAddress, no output.

IncreaseDeviceInfoOrder

Takes an input BdAddress, no output.

LlrNotify

Takes an input BdAddress, no output.

[9.0.0+] Takes an input BdAddress and a s32, no output.

EnableRadio

No input/output.

DisableRadio

No input/output.

HidDisconnect

Takes an input BdAddress, no output.

HidSetRetransmissionMode

Takes an input BdAddress and a type-0x19 input buffer containing a #ZeroRetransmissionList, no output.

AcquireAwakeReqEvent

No input, returns an output Event handle with EventClearMode=1.

[3.0.0+] Now returns an additional output bool.

AcquireLlrStateEvent

No input, returns an output bool and an Event handle with EventClearMode=1.

IsLlrStarted

No input, returns an output bool.

EnableSlotSaving

Takes an input bool, no output.

ProtectDeviceInfo

Takes an input BdAddress and a bool, no output.

AcquireBleScanEvent

No input, returns an output bool and an Event handle with EventClearMode=1.

GetBleScanParameterGeneral

Takes an input u16 ParameterId, returns a BleAdvertisePacketParameter.

The u16 must be value 0x1 or 0xFFFF.

hid uses value 0x1 for Palma.

The output BleAdvertisePacketParameter starting at +0x2 contains (CompanyId is 0x0553 for Nintendo for both of these):

  • ParameterId 0x1: 000100000100
  • ParameterId 0xFFFF: ADDE00EFBE00

GetBleScanParameterSmartDevice

Takes an input u16 ParameterId, returns a GattAttributeUuid.

The u16 must be value 0x2. The first 4-bytes of output is always 0 since it's not set.

StartBleScanForGeneral

Takes a BleAdvertisePacketParameter, no output.

This eventually uses AddBleScanFilterCondition, where the the passed BleAdvertiseFilter is generated from the input BleAdvertisePacketParameter.

This also uses SetBleScanParameter.

StopBleScanForGeneral

No input/output.

GetBleScanResultsForGeneral

Takes a type-0x6 output buffer containing an array of BleScanResult, returns an output u8 total_out.

The max array entries is 10.

StartBleScanForPaired

Takes a BleAdvertisePacketParameter, no output.

This eventually uses AddBleScanFilterCondition, where the the passed BleAdvertiseFilter is generated from the input BleAdvertisePacketParameter.

This also uses SetBleScanParameter.

StopBleScanForPaired

No input/output.

StartBleScanForSmartDevice

Takes a GattAttributeUuid, no output.

This eventually uses AddBleScanFilterCondition, where the the passed BleAdvertiseFilter is generated from the input GattAttributeUuid.

This also uses SetBleScanParameter.

The BleAdvertiseFilter is generated as follows: CondType = 7(ServiceUuid128), CondDataSize = 0x11. CondData: {128bit UUID copied from the GattAttributeUuid (size field ignored), then an u8 with value 0x0 (unused)}. MaskSize = 0x10, Mask = {all 0xFF}.

StopBleScanForSmartDevice

No input/output.

GetBleScanResultsForSmartDevice

Takes a type-0x6 output buffer containing an array of BleScanResult, returns an output u8 total_out.

The max array entries is 10.

AcquireBleConnectionEvent

No input, returns an output bool and an Event handle with EventClearMode=1.

BleConnect

Takes an input BdAddress, no output.

An error is thrown if the BdAddress is already connected (listed in the BleConnectionInfo from #BleGetConnectionState). An error is thrown if 4 devices are already connected.

BleOverrideConnection

Takes an input u32, no output.

The u32 is the same as the param for #BleDisconnect.

BleDisconnect

Takes an input u32 ConnectionHandle, no output.

The u32 must match a ConnectionHandle in a BleConnectionInfo from #BleGetConnectionState. [5.1.0+] 0xFFFFFFFF is invalid.

BleGetConnectionState

Takes a type-0xA output buffer containing an array of BleConnectionInfo, returns an output u8 total_out.

Other cmds which use this internally use arraycount=4.

BleGetGattClientConditionList

Takes a type-0x1A output buffer containing a 0x74-byte struct.

AcquireBlePairingEvent

No input, returns an output bool and an Event handle with EventClearMode=1.

BlePairDevice

Takes an input BleAdvertisePacketParameter and an u32, no output.

The u32 is the same as the param for #BleDisconnect.

BleUnpairDeviceOnBoth

Takes an input BleAdvertisePacketParameter and an u32, no output.

The u32 is the same as the param for #BleDisconnect.

BleUnpairDevice

Takes an input BdAddress and a BleAdvertisePacketParameter, no output.

BleGetPairedAddresses

Takes a type-0xA output buffer containing an array of BdAddress, a BleAdvertisePacketParameter, returns an output u8 total_out.

The max array entries is 10.

AcquireBleServiceDiscoveryEvent

No input, returns an output bool and an Event handle with EventClearMode=1.

GetGattServices

Takes a type-0x6 output buffer containing an array of #GattService, an u32, returns an output u8 total_out.

The u32 is the same as the param for #BleDisconnect. The max array entries is 100.

GetGattService

Takes a type-0x1A output buffer containing a #GattService, an u32, a GattAttributeUuid, returns an output bool.

The u32 is the same as the param for #BleDisconnect. The output bool indicates whether a #GattService was returned.

Same as #GetGattServices except this only returns the #GattService which matches the input GattAttributeUuid.

GetGattIncludedServices

Takes a type-0x6 output buffer containing an array of #GattService, an u16 ServiceHandle, an u32, returns an output u8.

The u32 is the same as the param for #BleDisconnect. The max array entries is 100.

Same as #GetGattServices except this only returns #GattService entries where various checks pass with u16 fields.

The param for the output u8 is unused by the sysmodule, hence the output is always 0.

GetBelongingService

Takes a type-0x1A output buffer containing a #GattService, an u16 AttributeHandle, an u32, returns an output bool.

The u32 is the same as the param for #BleDisconnect. The output bool indicates whether a #GattService was returned.

This is similar to #GetGattIncludedServices except this only returns 1 #GattService.

GetGattCharacteristics

Takes a type-0x6 output buffer containing an array of #GattCharacteristic, an u16 ServiceHandle, an u32, returns an output u8 total_out.

The u32 is the same as the param for #BleDisconnect. The max array entries is 100.

The u16 controls which #GattCharacteristic entries to return.

GetGattDescriptors

Takes a type-0x6 output buffer containing an array of #GattDescriptor, an u16 CharHandle, an u32, returns an output u8 total_out.

The u32 is the same as the param for #BleDisconnect. The max array entries is 100.

The u16 controls which #GattDescriptor entries to return.

AcquireBleMtuConfigEvent

No input, returns an output bool and an Event handle with EventClearMode=1.

ConfigureBleMtu

Takes an u16 mtu, an u32, no output.

The u32 is the same as the param for #BleDisconnect.

GetBleMtu

Takes an u32, returns an output u16 mtu.

The u32 is the same as the param for #BleDisconnect.

RegisterBleGattDataPath

Takes a #BleDataPath, no output.

UnregisterBleGattDataPath

Takes a #BleDataPath, no output.

RegisterAppletResourceUserId

Takes an input u32 and an AppletResourceUserId, no output.

UnregisterAppletResourceUserId

Takes an input AppletResourceUserId, no output.

SetAppletResourceUserId

Takes an input AppletResourceUserId, no output.

Cmd60

No input, returns an output Event handle with EventClearMode=1.

Cmd61

Takes a 0x44-byte input struct, no output.

Sends a request which is then handled as follows:

  • Calls a func for getting the data from the input struct etc for passing to another func, that func is the same one called by #SetSlotMode.

The input struct has the following structure:

Offset Size Description
0x0 0x10 * 4 Array of the below struct.
0x40 0x4 s32 count, for the array at +0.

Struct for the above array:

Offset Size Description
0x0 0x6 BdAddress
0x6 0x6 Unused
0xC 0x1 Used to determine data which is then used for BleConnectionParameter.
0xD 0x3 Padding

Cmd62

Takes an input bool, no output.

Sends a request which is handled as follows: writes the flag into state if needed.

Cmd63

No input, returns an output bool.

This gets the flag used by #Cmd62.

Cmd64

No input/output.

Sends a request which is handled as follows: if a state field is set, another state field is set to value 1.

btm:dbg

This is "nn::btm::IBtmDebug".

This has max_sessions 6. IPC is handled by 2 threads shared with all services.

[12.0.0+] Cmds input/output were changed / cmdids were moved around.

[13.0.0+] Cmd4 now takes a type-0xA output buffer, returns a total of 4-bytes of output.

Cmd Name
0 #AcquireDiscoveryEvent
1 #StartDiscovery
2 #CancelDiscovery
3 #GetDeviceProperty
4 #CreateBond
5 #CancelBond
6 #SetTsiMode
7 #GeneralTest
8 #HidConnect
9 [5.0.0+] #GeneralGet
10 [5.1.0+] #GetGattClientDisconnectionReason
11 [5.1.0+] #GetBleConnectionParameter
12 [5.1.0+] #GetBleConnectionParameterRequest
13 [12.0.0+]
14 [15.0.0+]
15 [15.0.0+]
16 [15.0.0+]
17 [15.0.0+]

AcquireDiscoveryEvent

No input, returns output an Event handle with EventClearMode=1.

[3.0.0+] Now returns an additional output bool.

StartDiscovery

No input/output.

CancelDiscovery

No input/output.

GetDeviceProperty

Takes a type-0x1A output buffer containing a #DevicePropertyList.

CreateBond

Takes an input BdAddress, no output.

CancelBond

Takes an input BdAddress, no output.

SetTsiMode

Takes an input BdAddress and a #TsiMode, no output.

Sends a request which is handled as follows: uses SetTsi directly with the specified params.

GeneralTest

Takes an input s32, no output.

HidConnect

Takes an input BdAddress, no output.

GeneralGet

Takes an input u32 and a type-0x1A output buffer containing a 0x11-byte struct.

GetGattClientDisconnectionReason

Takes an input BdAddress and an u32, returns an output bool and u16.

The bool indicates whether the cmd is successful.

GetBleConnectionParameter

Takes an input u32, returns an output bool and 3 u16s.

The bool indicates whether the cmd is successful, the output u16s are only set when this bool is set.

GetBleConnectionParameterRequest

Takes an input u32, returns an output bool and 4 u16s.

The bool indicates whether the cmd is successful, the output u16s are only set when this bool is set.

btm:sys

This is "nn::btm::IBtmSystem".

This has max_sessions 6. IPC is handled by 2 threads shared with all services.

Cmd Name
0 #GetCore

GetCore

No input, returns an output #IBtmSystemCore.

IBtmSystemCore

This is "nn::btm::IBtmSystemCore".

Cmd Name
0 #StartGamepadPairing
1 #CancelGamepadPairing
2 #ClearGamepadPairingDatabase
3 #GetPairedGamepadCount
4 #EnableRadio
5 #DisableRadio
6 #IsRadioEnabled
7 [3.0.0+] #AcquireRadioEvent
8 [3.0.0+] #AcquireGamepadPairingEvent
9 [3.0.0+] #IsGamepadPairingStarted
10 [13.0.0+] StartAudioDeviceDiscovery
11 [13.0.0+] StopAudioDeviceDiscovery
12 [13.0.0+] IsDiscoveryingAudioDevice
13 [13.0.0+] GetDiscoveredAudioDevice
14 [13.0.0+] AcquireAudioDeviceConnectionEvent
15 [13.0.0+] ConnectAudioDevice
16 [13.0.0+] IsConnectingAudioDevice
17 [13.0.0+] GetConnectedAudioDevices
18 [13.0.0+] DisconnectAudioDevice
19 [13.0.0+] AcquirePairedAudioDeviceInfoChangedEvent
20 [13.0.0+] GetPairedAudioDevices
21 [13.0.0+] RemoveAudioDevicePairing
22 [13.0.0+] RequestAudioDeviceConnectionRejection
23 [13.0.0+] CancelAudioDeviceConnectionRejection

StartGamepadPairing

No input/output.

CancelGamepadPairing

No input/output.

ClearGamepadPairingDatabase

No input/output.

GetPairedGamepadCount

No input, returns an output u8.

EnableRadio

No input/output.

DisableRadio

No input/output.

IsRadioEnabled

No input, returns an output bool.

AcquireRadioEvent

No input, returns an output bool and an Event handle with EventClearMode=1.

AcquireGamepadPairingEvent

No input, returns an output bool and an Event handle with EventClearMode=1.

IsGamepadPairingStarted

No input, returns an output bool.

btm:u

This is "nn::btm::IBtmUser".

This was added with [5.0.0+].

This has max_sessions 6. IPC is handled by 2 threads shared with all services.

Cmd Name
0 GetCore

GetCore

No input, returns an output #IBtmUserCore.

IBtmUserCore

This is "nn::btm::IBtmUserCore".

Cmd Name
0 AcquireBleScanEvent
1 #GetBleScanFilterParameter
2 #GetBleScanFilterParameter2
3 StartBleScanForGeneral
4 StopBleScanForGeneral
5 GetBleScanResultsForGeneral
6 StartBleScanForPaired
7 StopBleScanForPaired
8 StartBleScanForSmartDevice
9 StopBleScanForSmartDevice
10 GetBleScanResultsForSmartDevice
17 AcquireBleConnectionEvent
18 BleConnect
19 BleDisconnect
20 BleGetConnectionState
21 AcquireBlePairingEvent
22 BlePairDevice
23 BleUnPairDevice
24 #BleUnPairDevice2
25 #BleGetPairedDevices
26 AcquireBleServiceDiscoveryEvent
27 GetGattServices
28 GetGattService
29 GetGattIncludedServices
30 #GetBelongingGattService
31 GetGattCharacteristics
32 GetGattDescriptors
33 AcquireBleMtuConfigEvent
34 ConfigureBleMtu
35 GetBleMtu
36 RegisterBleGattDataPath
37 UnregisterBleGattDataPath

AcquireBleScanEvent

No input, returns an output bool and an Event handle with EventClearMode=1.

This is similar to the btm cmd.

GetBleScanFilterParameter

Takes an input u16, returns a BleAdvertisePacketParameter.

This is the same as #GetBleScanParameterGeneral.

GetBleScanFilterParameter2

Takes an input u16, returns a GattAttributeUuid.

This is the same as #GetBleScanParameterSmartDevice.

StartBleScanForGeneral

Takes a PID, a BleAdvertisePacketParameter, an AppletResourceUserId, no output.

This is similar to the btm cmd.

StopBleScanForGeneral

No input/output.

This is similar to the btm cmd.

GetBleScanResultsForGeneral

Takes a PID, a type-0x6 output buffer containing an array of BleScanResult, an AppletResourceUserId, returns an output u8 total_out.

This is similar to the btm cmd.

StartBleScanForPaired

Takes a PID, a BleAdvertisePacketParameter, an AppletResourceUserId, no output.

This is similar to the btm cmd.

StopBleScanForPaired

No input/output.

This is similar to the btm cmd.

StartBleScanForSmartDevice

Takes a PID, a GattAttributeUuid, an AppletResourceUserId, no output.

This is similar to the btm cmd.

StopBleScanForSmartDevice

No input/output.

This is similar to the btm cmd.

GetBleScanResultsForSmartDevice

Takes a PID, a type-0x6 output buffer containing an array of BleScanResult, an AppletResourceUserId, returns an output u8 total_out.

This is similar to the btm cmd.

AcquireBleConnectionEvent

No input, returns an output bool and an Event handle with EventClearMode=1.

This is similar to the btm cmd.

BleConnect

Takes a PID, an BdAddress, an AppletResourceUserId, no output.

This is similar to the btm cmd.

BleDisconnect

Takes an input u32, no output.

This is similar to the btm cmd.

BleGetConnectionState

Takes a PID, a type-0xA output buffer containing an array of BleConnectionInfo, an AppletResourceUserId, returns an output u8 total_out.

This is similar to the btm cmd.

AcquireBlePairingEvent

No input, returns an output bool and an Event handle with EventClearMode=1.

This is similar to the btm cmd.

BlePairDevice

Takes an input BleAdvertisePacketParameter and an u32, no output.

This is similar to the btm cmd.

BleUnPairDevice

Takes an input BleAdvertisePacketParameter and an u32, no output.

This is similar to the btm cmd.

BleUnPairDevice2

Takes an input BdAddress and a BleAdvertisePacketParameter, no output.

This is similar to the btm cmd.

BleGetPairedDevices

Takes a type-0xA output buffer containing an array of BdAddress, a BleAdvertisePacketParameter, returns an output u8 total_out.

This is the same as the btm cmd.

AcquireBleServiceDiscoveryEvent

No input, returns an output bool and an Event handle with EventClearMode=1.

This is similar to the btm cmd.

sdknso will Abort if the output u8 is value 0.

GetGattServices

Takes a PID, a type-0x6 output buffer containing an array of #GattService, an u32, an AppletResourceUserId, returns an output u8 total_out.

This is similar to the btm cmd.

GetGattService

Takes a PID, a type-0x1A output buffer containing a #GattService, an u32, a GattAttributeUuid, an AppletResourceUserId, returns an output bool.

This is similar to the btm cmd.

GetGattIncludedServices

Takes a PID, a type-0x6 output buffer containing an array of #GattService, an u16, an u32, an AppletResourceUserId, returns an output u8.

This is similar to the btm cmd.

The param for the output u8 is unused by the sysmodule, hence the output is always 0. However, a sdknso func which calls the nn::btm::* func for this expects this u8 to be set.

GetBelongingGattService

Takes a PID, a type-0x1A output buffer containing a #GattService, an u16, an u32, an AppletResourceUserId, returns an output bool.

This is similar to the btm cmd.

GetGattCharacteristics

Takes a PID, a type-0x6 output buffer containing an array of #GattCharacteristic, an u16, an u32, an AppletResourceUserId, returns an output u8 total_out.

This is similar to the btm cmd.

GetGattDescriptors

Takes a PID, a type-0x6 output buffer containing an array of #GattDescriptor, an u16, an u32, an AppletResourceUserId, returns an output u8 total_out.

This is similar to the btm cmd.

AcquireBleMtuConfigEvent

No input, returns an output bool and an Event handle with EventClearMode=1.

This is similar to the btm cmd.

ConfigureBleMtu

Takes a PID, an u16, an u32, an AppletResourceUserId, no output.

This is similar to the btm cmd.

sdknso will Abort if the user-specified u16 is <0x18 or >0x200 (this doesn't apply to the btm cmd).

GetBleMtu

Takes a PID, an u32, an AppletResourceUserId, returns an output u16.

This is similar to the btm cmd.

RegisterBleGattDataPath

Takes a PID, a #BleDataPath, an AppletResourceUserId, no output.

This is similar to the btm cmd.

UnregisterBleGattDataPath

Takes a PID, a #BleDataPath, an AppletResourceUserId, no output.

This is similar to the btm cmd.

BdAddress

This is "nn::btm::BdAddress". This is a 0x6-byte struct with 1-byte alignment.

BdName

This is "nn::btm::BdName". This is a 0x20-byte struct with 1-byte alignment.

ClassOfDevice

This is "nn::btm::ClassOfDevice". This is a 0x3-byte struct with 1-byte alignment.

LinkKey

This is "nn::btm::LinkKey". This is a 0x10-byte struct with 1-byte alignment.

BtmState

This is "nn::btm::BtmState".

Value Description
0 NotInitialized
1 RadioOff
2 MinorSlept
3 RadioOffMinorSlept
4 Slept
5 RadioOffSlept
6 Initialized
7 Working

BluetoothMode

This is "nn::btm::BluetoothMode".

Value Description
0 Dynamic2Slot
1 StaticJoy

WlanMode

This is "nn::btm::WlanMode".

Value Description
0 Local4
1 Local8
2 None

TsiMode

This is "nn::btm::TsiMode".

Value Description
0 0Fd3Td3Si10
1 1Fd1Td1Si5
2 2Fd1Td3Si10
3 3Fd1Td5Si15
4 4Fd3Td1Si10
5 5Fd3Td3Si15
6 6Fd5Td1Si15
7 7Fd1Td3Si15
8 8Fd3Td1Si15
9 9Fd1Td1Si10
10 10Fd1Td1Si15
255 Active

SlotMode

This is "nn::btm::SlotMode".

Value Description
0 2
1 4
2 6
3 Active

Profile

This is "nn::btm::Profile".

Value Description
0 None
1 Hid

HidDeviceInfo

This is "nn::btm::HidDeviceInfo".

Offset Size Description
0x0 0x2 Vid
0x2 0x2 Pid

HostDeviceProperty

This is "nn::btm::HostDeviceProperty". This is a 0x2A-byte struct.

[13.0.0+] This is a 0x103-byte struct.

Offset Size Description
0x0 0x6 BdAddress
0x6 0x3 ClassOfDevice
0x9 0x20 BdName
0x29 0x1 FeatureSet

DeviceSlotMode

This is "nn::btm::DeviceSlotMode". This is a 0xC-byte struct.

Offset Size Description
0x0 0x6 BdAddress
0x6 0x2 Reserved
0x8 0x4 SlotMode

DeviceSlotModeList

This is "nn::btm::DeviceSlotModeList". This is a 0x64-byte struct.

Offset Size Description
0x0 0x1 DeviceCount
0x1 0x3 Reserved
0x4 0xC * 8 Array of DeviceSlotMode

DeviceInfo

This is "nn::btm::DeviceInfo". This is a 0x60-byte struct.

[13.0.0+] This is a 0x13C-byte struct.

Offset Size Description
0x0 0x6 BdAddress
0x6 0x3 ClassOfDevice
0x9 0x20 BdName
0x29 0x10 LinkKey
0x39 0x3 Reserved
0x3C 0x4 Profile
0x40 0x4 Empty (Profile = None) or HidDeviceInfo (Profile = Hid)
0x44 0x1C Reserved

DeviceInfoList

This is "nn::btm::DeviceInfoList". This is a 0x3C4-byte struct.

Offset Size Description
0x0 0x1 DeviceCount
0x1 0x3 Reserved
0x4 0xA * 0x60 Array of DeviceInfo

DeviceProperty

This is "nn::btm::DeviceProperty". This is a 0x29-byte struct.

Offset Size Description
0x0 0x6 BdAddress
0x6 0x3 ClassOfDevice
0x9 0x20 BdName

DevicePropertyList

This is "nn::btm::DevicePropertyList". This is a 0x268-byte struct.

Offset Size Description
0x0 0x1 DeviceCount
0x1 0x29 * 15 Array of DeviceProperty

ZeroRetransmissionList

This is "nn::btm::ZeroRetransmissionList". This is a 0x11-byte struct.

Offset Size Description
0x0 0x1 EnabledReportIdCount
0x1 0x1 * 16 Array of EnabledReportId

GattService

This is "nn::btm::user::GattService". This is a 0x24-byte struct.

Offset Size Description
0x0 0x4
0x4 0x14 GattAttributeUuid
0x18 0x2 Handle
0x1A 0x2
0x1C 0x2 InstanceId
0x1E 0x2 EndGroupHandle
0x20 0x1 PrimaryService flag
0x21 0x3 Padding

GattCharacteristic

This is "nn::btm::user::GattCharacteristic". This is a 0x24-byte struct.

Offset Size Description
0x0 0x4
0x4 0x14 GattAttributeUuid
0x18 0x2 Handle
0x1A 0x2
0x1C 0x2 InstanceId
0x1E 0x1 Properties
0x1F 0x5

GattDescriptor

This is "nn::btm::user::GattDescriptor". This is a 0x20-byte struct.

Offset Size Description
0x0 0x4
0x4 0x14 GattAttributeUuid
0x18 0x2 Handle
0x1A 0x6

BleDataPath

This is "nn::btm::user::BleDataPath". This is a 0x18-byte struct with 4-byte alignment.

Offset Size Description
0x0 0x1
0x1 0x3 Padding
0x4 0x14 GattAttributeUuid

Logging

A func which uses srepo is called in certain conditions (access to srepo:u was added to btm with [7.0.0+]). This is implemented as follows (as of 11.0.0):

  • Loads the data for the below fields.
  • Creates the report with EventId "bluetooth_crash". The ApplicationId is set to {btm ProgramId}.
  • The following fields are added to the report:
    • "reason": Set to an input param for this func.
    • "radio"
    • "gamepad_pairing"
    • "llr_notify"
    • "ble_scan"
    • "bluetooth_mode": Set to hard-coded value 0.
    • "wlan_mode"
    • "classic_device_count"
    • "slot_mode_active_count"
    • "slot_mode_4_count"
    • "slot_mode_6_count"
    • "sniff_mode"
    • "ble_device_count"
    • "ce_length_2_count"
    • "ce_length_4_count"
    • "ce_length_8_count"
  • Saves the report and returns.