BTM services: Difference between revisions
No edit summary |
No edit summary |
||
(87 intermediate revisions by 3 users not shown) | |||
Line 1: | Line 1: | ||
= btm = | = btm = | ||
This is "nn::btm::IBtm". | 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. | |||
{| class="wikitable" border="1" | {| class="wikitable" border="1" | ||
Line 6: | Line 14: | ||
! Cmd || Name | ! Cmd || Name | ||
|- | |- | ||
| 0 || | | 0 || [[#GetState]] | ||
|- | |- | ||
| 1 || | | 1 || [[#GetHostDeviceProperty]] | ||
|- | |- | ||
| 2 || | | 2 || [[#AcquireDeviceConditionEvent]] | ||
|- | |- | ||
| 3 || | | 3 || [[#GetDeviceCondition]] | ||
|- | |- | ||
| 4 || | | 4 || [[#SetBurstMode]] | ||
|- | |- | ||
| 5 || | | 5 || [[#SetSlotMode]] | ||
|- | |- | ||
| 6 || | | 6 || [1.0.0-8.1.1] [[#SetBluetoothMode]] | ||
|- | |- | ||
| 7 || | | 7 || [[#SetWlanMode]] | ||
|- | |- | ||
| 8 || | | 8 || [[#AcquireDeviceInfoEvent]] | ||
|- | |- | ||
| 9 || | | 9 || [[#GetDeviceInfo]] | ||
|- | |- | ||
| 10 || | | 10 || [[#AddDeviceInfo]] | ||
|- | |- | ||
| 11 || | | 11 || [[#RemoveDeviceInfo]] | ||
|- | |- | ||
| 12 || | | 12 || [[#IncreaseDeviceInfoOrder]] | ||
|- | |- | ||
| 13 || | | 13 || [9.0.0+] TriggerConnection ([1.0.0-8.1.1] [[#LlrNotify]]) | ||
|- | |- | ||
| 14 || EnableRadio | | 14 || [[#EnableRadio]] | ||
|- | |- | ||
| 15 || DisableRadio | | 15 || [[#DisableRadio]] | ||
|- | |- | ||
| 16 || | | 16 || [[#HidDisconnect]] | ||
|- | |- | ||
| 17 || | | 17 || [[#HidSetRetransmissionMode]] | ||
|- | |- | ||
| 18 || [2.0.0+] | | 18 || [2.0.0+] [[#AcquireAwakeReqEvent]] | ||
|- | |- | ||
| 19 || [4.0.0 | | 19 || [9.0.0+] AcquireConnectionTriggerEvent ([4.0.0-8.1.1] [[#AcquireLlrStateEvent]]) | ||
|- | |- | ||
| 20 || [4.0.0 | | 20 || [9.0.0+] IsConnectionTriggered ([4.0.0-8.1.1] [[#IsLlrStarted]]) | ||
|- | |- | ||
| 21 || [4.0.0+] | | 21 || [4.0.0+] [[#EnableSlotSaving]] | ||
|- | |- | ||
| 22 || [5.0.0+] | | 22 || [5.0.0+] [[#ProtectDeviceInfo]] | ||
|- | |- | ||
| 23 || [5.0.0+] | | 23 || [5.0.0+] [[#AcquireBleScanEvent]] | ||
|- | |- | ||
| 24 || [5. | | 24 || [5.1.0+] [[#GetBleScanParameterGeneral]] | ||
|- | |- | ||
| 25 || [5. | | 25 || [5.1.0+] [[#GetBleScanParameterSmartDevice]] | ||
|- | |- | ||
| 26 || [5. | | 26 || [5.1.0+] [[#StartBleScanForGeneral]] | ||
|- | |- | ||
| 27 || [5. | | 27 || [5.1.0+] [[#StopBleScanForGeneral]] | ||
|- | |- | ||
| 28 || [5. | | 28 || [5.1.0+] [[#GetBleScanResultsForGeneral]] | ||
|- | |- | ||
| 29 || [5. | | 29 || [5.1.0+] [[#StartBleScanForPairedDevice]] | ||
|- | |- | ||
| 30 || [5. | | 30 || [5.1.0+] [[#StopBleScanForPairedDevice]] | ||
|- | |- | ||
| 31 || [5. | | 31 || [5.1.0+] [[#StartBleScanForSmartDevice]] | ||
|- | |- | ||
| 32 || [5. | | 32 || [5.1.0+] [[#StopBleScanForSmartDevice]] | ||
|- | |- | ||
| 33 || [5. | | 33 || [5.1.0+] [[#GetBleScanResultsForSmartDevice]] | ||
|- | |- | ||
| 34 || [5. | | 34 || [5.1.0+] [[#AcquireBleConnectionEvent]] | ||
|- | |- | ||
| 35 || [5.0.0+] | | 35 ([5.0.0-5.0.2] 24) || [5.0.0+] [[#BleConnect]] | ||
|- | |- | ||
| 36 || [5. | | 36 || [5.1.0+] [[#BleOverrideConnection]] | ||
|- | |- | ||
| 37 || [5.0.0+] | | 37 ([5.0.0-5.0.2] 25) || [5.0.0+] [[#BleDisconnect]] | ||
|- | |- | ||
| 38 || [5.0.0+] | | 38 ([5.0.0-5.0.2] 26) || [5.0.0+] [[#BleGetConnectionState]] | ||
|- | |- | ||
| 39 || [5.0.0+] | | 39 ([5.0.0-5.0.2] 27) || [5.0.0+] [[#BleGetGattClientConditionList]] | ||
|- | |- | ||
| 40 || [5.0.0+] | | 40 ([5.0.0-5.0.2] 28) || [5.0.0+] [[#AcquireBlePairingEvent]] | ||
|- | |- | ||
| 41 || [5. | | 41 || [5.1.0+] [[#BlePairDevice]] | ||
|- | |- | ||
| 42 || [5. | | 42 || [5.1.0+] [[#BleUnpairDeviceOnBoth]] | ||
|- | |- | ||
| 43 || [5.1.0+] | | 43 || [5.1.0+] [[#BleUnpairDevice]] | ||
|- | |- | ||
| 44 || [5.1.0+] | | 44 || [5.1.0+] [[#BleGetPairedAddresses]] | ||
|- | |- | ||
| 45 || [5.1.0+] | | 45 || [5.1.0+] [[#AcquireBleServiceDiscoveryEvent]] | ||
|- | |- | ||
| 46 || [5. | | 46 ([5.0.0-5.0.2] 29) || [5.0.0+] [[#GetGattServices]] | ||
|- | |- | ||
| 47 || [5. | | 47 ([5.0.0-5.0.2] 30) || [5.0.0+] [[#GetGattService]] | ||
|- | |- | ||
| 48 || [5. | | 48 ([5.0.0-5.0.2] 31) || [5.0.0+] [[#GetGattIncludedServices]] | ||
|- | |- | ||
| 49 || [5. | | 49 ([5.0.0-5.0.2] 32) || [5.0.0+] [[#GetBelongingService]] | ||
|- | |- | ||
| 50 || [5. | | 50 ([5.0.0-5.0.2] 33) || [5.0.0+] [[#GetGattCharacteristics]] | ||
|- | |- | ||
| 51 || [5. | | 51 ([5.0.0-5.0.2] 34) || [5.0.0+] [[#GetGattDescriptors]] | ||
|- | |- | ||
| 52 || [5. | | 52 ([5.0.0-5.0.2] 35) || [5.0.0+] [[#AcquireBleMtuConfigEvent]] | ||
|- | |- | ||
| 53 || [5. | | 53 ([5.0.0-5.0.2] 36) || [5.0.0+] [[#ConfigureBleMtu]] | ||
|- | |- | ||
| 54 || [5. | | 54 ([5.0.0-5.0.2] 37) || [5.0.0+] [[#GetBleMtu]] | ||
|- | |- | ||
| 55 || [5. | | 55 ([5.0.0-5.0.2] 38) || [5.0.0+] [[#RegisterBleGattDataPath]] | ||
|- | |- | ||
| 56 || [5. | | 56 ([5.0.0-5.0.2] 39) || [5.0.0+] [[#UnregisterBleGattDataPath]] | ||
|- | |- | ||
| 57 || [5. | | 57 ([5.0.0-5.0.2] 40) || [5.0.0+] [[#RegisterAppletResourceUserId]] | ||
|- | |- | ||
| 58 || [5. | | 58 ([5.0.0-5.0.2] 41) || [5.0.0+] [[#UnregisterAppletResourceUserId]] | ||
|- | |- | ||
| 59 || [5.1.0+] | | 59 ([5.0.0-5.0.2] 42) || [5.0.0+] [[#SetAppletResourceUserId]] | ||
|- | |||
| 60 || [8.0.0+] [[#AcquireBleConnectionParameterUpdateEvent]] | |||
|- | |||
| 61 || [8.0.0+] [[#SetCeLength]] | |||
|- | |||
| 62 || [9.0.0+] [[#EnsureSlotExpansion]] | |||
|- | |||
| 63 || [9.0.0+] [[#IsSlotExpansionEnsured]] | |||
|- | |||
| 64 || [10.0.0+] [[#CancelConnectionTrigger]] | |||
|- | |||
| 65 || [13.0.0+] GetConnectionCapacity | |||
|- | |||
| 66 || [13.0.0+] GetWlanMode | |||
|- | |||
| 67 || [13.0.0+] IsSlotSavingEnabled | |||
|- | |||
| 68 || [13.0.0+] IsSlotSavingForPairingEnabled | |||
|- | |||
| 69 || [13.0.0+] AcquireAudioDeviceConnectionEvent | |||
|- | |||
| 70 || [13.0.0+] GetConnectedAudioDevices | |||
|- | |||
| 71 || [13.0.0+] SetAudioSourceVolume | |||
|- | |||
| 72 || [13.0.0+] GetAudioSourceVolume | |||
|- | |||
| 73 || [13.0.0+] RequestAudioDeviceConnectionRejection | |||
|- | |||
| 74 || [13.0.0+] CancelAudioDeviceConnectionRejection | |||
|- | |||
| 75 || [13.0.0+] GetPairedAudioDevices | |||
|- | |||
| 76 || [13.1.0+] SetWlanModeWithOption | |||
|- | |||
| 100 || [13.0.0+] AcquireConnectionDisallowedEvent | |||
|- | |||
| 101 || [13.0.0+] GetUsecaseViolationFactor | |||
|- | |||
| 110 || [13.0.0+] GetShortenedDeviceInfo | |||
|- | |||
| 111 || [13.0.0+] AcquirePairingCountUpdateEvent | |||
|- | |||
| 112 || [14.0.0-14.1.2] | |||
|- | |||
| 113 || [14.0.0-14.1.2] | |||
|- | |||
| 114 || [14.0.0+] IsFirstAudioControlConnection | |||
|- | |||
| 115 || [14.0.0+] GetShortenedDeviceCondition | |||
|- | |||
| 116 || [15.0.0+] SetAudioSinkVolume | |||
|- | |||
| 117 || [15.0.0+] GetAudioSinkVolume | |||
|} | |} | ||
== 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 [[#DeviceConditionList]]. No output. | |||
[13.0.0+] Takes an input u32 [[#Profile]], a type-0xA output buffer containing an array of [[#DeviceCondition]], 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|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|BdAddress]]. | |||
** First array: | |||
*** Validates the [[#BdAddress|BdAddress]] with state, skipping it if not found. | |||
*** Calls the SetTsi wrapper func described below, with the above [[#BdAddress|BdAddress]] and tsi=0xFF (Exit). If this returns false, [[Bluetooth_Driver_services#CloseHidConnection|CloseHidConnection]] is used with the [[#BdAddress|BdAddress]]. | |||
** Second array: | |||
*** Validates the [[#BdAddress|BdAddress]] with state, skipping it if not found. | |||
*** Uses [[Bluetooth_Driver_services#SetBleConnectionParameter|SetBleConnectionParameter]] with bool=true. Then the required EventInfo is loaded, {...}. | |||
** Then it goes through the first array again, except here it does the following: | |||
*** Calls the same func for validating the [[#BdAddress|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 [[Bluetooth_Driver_services#CloseHidConnection|CloseHidConnection]] is used and the loop is continued. | |||
*** Calls the SetTsi wrapper func described below, with the [[#BdAddress|BdAddress]] and the above Tsi value. If this returns false, [[Bluetooth_Driver_services#CloseHidConnection|CloseHidConnection]] is used with the [[#BdAddress|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 [[Bluetooth_Driver_services#HidEventType|event]] for opening a hid connection also triggers it in some cases. | |||
The SetTsi wrapper func is implemented as follows: | |||
* Uses [[Bluetooth_Driver_services#SetTsi|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]]. No output. | |||
[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|BdAddress]]. No output. | |||
== IncreaseDeviceInfoOrder == | |||
Takes an input [[#BdAddress|BdAddress]]. No output. | |||
== LlrNotify == | |||
Takes an input [[#BdAddress|BdAddress]]. No output. | |||
[9.0.0+] Takes an input [[#BdAddress|BdAddress]] and a s32, no output. | |||
== EnableRadio == | |||
No input/output. | |||
== DisableRadio == | |||
No input/output. | |||
== HidDisconnect == | |||
Takes an input [[#BdAddress|BdAddress]]. No output. | |||
== HidSetRetransmissionMode == | |||
Takes an input [[#BdAddress|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|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 [[Bluetooth_Driver_services#BleAdvertisePacketParameter|BleAdvertisePacketParameter]]. | |||
The u16 must be value 0x1 or 0xFFFF. | |||
[[HID_services|hid]] uses value 0x1 for Palma. | |||
The output BleAdvertisePacketParameter starting at +0x2 contains (CompanyId is 0x0553 for Nintendo for both of these): | |||
* ParameterId 0x1: <code>000100000100</code> | |||
* ParameterId 0xFFFF: <code>ADDE00EFBE00</code> | |||
== GetBleScanParameterSmartDevice == | |||
Takes an input u16 ParameterId. Returns a [[Bluetooth_Driver_services#GattAttributeUuid|GattAttributeUuid]]. | |||
The u16 must be value 0x2. The first 4-bytes of output is always 0 since it's not set. | |||
== StartBleScanForGeneral == | |||
Takes a [[Bluetooth_Driver_services#BleAdvertisePacketParameter|BleAdvertisePacketParameter]]. No output. | |||
This eventually uses [[Bluetooth_Driver_services#AddBleScanFilterCondition|AddBleScanFilterCondition]], where the the passed BleAdvertiseFilter is generated from the input BleAdvertisePacketParameter. | |||
This also uses [[Bluetooth_Driver_services#SetBleScanParameter|SetBleScanParameter]]. | |||
== StopBleScanForGeneral == | |||
No input/output. | |||
== GetBleScanResultsForGeneral == | |||
Takes a type-0x6 output buffer containing an array of [[Bluetooth_Driver_services#BleScanResult|BleScanResult]]. Returns an output u8 total_out. | |||
The max array entries is 10. | |||
== StartBleScanForPaired == | |||
Takes a [[Bluetooth_Driver_services#BleAdvertisePacketParameter|BleAdvertisePacketParameter]]. No output. | |||
This eventually uses [[Bluetooth_Driver_services#AddBleScanFilterCondition|AddBleScanFilterCondition]], where the the passed BleAdvertiseFilter is generated from the input BleAdvertisePacketParameter. | |||
This also uses [[Bluetooth_Driver_services#SetBleScanParameter|SetBleScanParameter]]. | |||
== StopBleScanForPaired == | |||
No input/output. | |||
== StartBleScanForSmartDevice == | |||
Takes a [[Bluetooth_Driver_services#GattAttributeUuid|GattAttributeUuid]]. No output. | |||
This eventually uses [[Bluetooth_Driver_services#AddBleScanFilterCondition|AddBleScanFilterCondition]], where the the passed BleAdvertiseFilter is generated from the input GattAttributeUuid. | |||
This also uses [[Bluetooth_Driver_services#SetBleScanParameter|SetBleScanParameter]]. | |||
The [[Bluetooth_Driver_services#BleAdvertiseFilter|BleAdvertiseFilter]] is generated as follows: CondType = 7(ServiceUuid128), CondDataSize = 0x11. CondData: {128bit UUID copied from the [[Bluetooth_Driver_services#GattAttributeUuid|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 [[Bluetooth_Driver_services#BleScanResult|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|BdAddress]]. No output. | |||
An error is thrown if the [[#BdAddress|BdAddress]] is already connected (listed in the [[Bluetooth_Driver_services#BleConnectionInfo|BleConnectionInfo]] from [[#BleGetConnectionState]]). An error is thrown if 4 [[#BleGetConnectionState|devices]] are already connected. | |||
== BleOverrideConnection == | |||
Takes an input u32 ConnectionHandle. 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 [[Bluetooth_Driver_services#BleConnectionInfo|BleConnectionInfo]] from [[#BleGetConnectionState]]. [5.1.0+] 0xFFFFFFFF is invalid. | |||
== BleGetConnectionState == | |||
Takes a type-0xA output buffer containing an array of [[Bluetooth_Driver_services#BleConnectionInfo|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 [[Bluetooth_Driver_services#BleAdvertisePacketParameter|BleAdvertisePacketParameter]] and an input u32 ConnectionHandle. No output. | |||
The u32 is the same as the param for [[#BleDisconnect]]. | |||
== BleUnpairDeviceOnBoth == | |||
Takes an input [[Bluetooth_Driver_services#BleAdvertisePacketParameter|BleAdvertisePacketParameter]] an input u32 ConnectionHandle. No output. | |||
The u32 is the same as the param for [[#BleDisconnect]]. | |||
== BleUnpairDevice == | |||
Takes an input [[#BdAddress|BdAddress]] and a [[Bluetooth_Driver_services#BleAdvertisePacketParameter|BleAdvertisePacketParameter]]. No output. | |||
== BleGetPairedAddresses == | |||
Takes a type-0xA output buffer containing an array of [[#BdAddress|BdAddress]], a [[Bluetooth_Driver_services#BleAdvertisePacketParameter|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]] and an input u32 ConnectionHandle. 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 input u32 ConnectionHandle and a [[Bluetooth_Driver_services#GattAttributeUuid|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 [[Bluetooth_Driver_services#GattAttributeUuid|GattAttributeUuid]]. | |||
== GetGattIncludedServices == | |||
Takes a type-0x6 output buffer containing an array of [[#GattService]], an u16 ServiceHandle and an input u32 ConnectionHandle. 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 and an input u32 ConnectionHandle. 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 and an input u32 ConnectionHandle. 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 and an input u32 ConnectionHandle. 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 and an input u32 ConnectionHandle. No output. | |||
The u32 is the same as the param for [[#BleDisconnect]]. | |||
== GetBleMtu == | |||
Takes an input u32 ConnectionHandle. 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 [[Applet_Manager_services#AppletResourceUserId|AppletResourceUserId]]. No output. | |||
== UnregisterAppletResourceUserId == | |||
Takes an input [[Applet_Manager_services#AppletResourceUserId|AppletResourceUserId]]. No output. | |||
== SetAppletResourceUserId == | |||
Takes an input [[Applet_Manager_services#AppletResourceUserId|AppletResourceUserId]]. No output. | |||
== AcquireBleConnectionParameterUpdateEvent == | |||
No input. Returns an output Event handle with EventClearMode=1. | |||
== SetCeLength == | |||
Takes an input [[#DeviceCeLengthList|DeviceCeLengthList]]. 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]]. | |||
== EnsureSlotExpansion == | |||
Takes an input bool. No output. | |||
Sends a request which is handled as follows: writes the flag into state if needed. | |||
== IsSlotExpansionEnsured == | |||
No input. Returns an output bool. | |||
This gets the flag used by [[#EnsureSlotExpansion]]. | |||
== CancelConnectionTrigger == | |||
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 = | = btm:dbg = | ||
This is "nn::btm::IBtmDebug". | This is "nn::btm::IBtmDebug". | ||
This has max_sessions 6. IPC is handled by 2 threads shared with all services. | |||
{| class="wikitable" border="1" | {| class="wikitable" border="1" | ||
Line 134: | Line 512: | ||
! Cmd || Name | ! Cmd || Name | ||
|- | |- | ||
| 0 || | | 0 || [[#AcquireDiscoveryEvent]] | ||
|- | |- | ||
| 1 || | | 1 || [[#StartDiscovery]] | ||
|- | |- | ||
| 2 || | | 2 || [[#CancelDiscovery]] | ||
|- | |- | ||
| 3 || | | 3 || [12.0.0+] IsDiscoveryEnabled ([1.0.0-11.0.1] [[#GetDeviceProperty]]) | ||
|- | |- | ||
| 4 || | | 4 || [[#CreateBond]] | ||
|- | |- | ||
| 5 || | | 5 || [[#CancelBond]] | ||
|- | |- | ||
| 6 || | | 6 || [[#SetTsiMode]] | ||
|- | |- | ||
| 7 || | | 7 || [[#GeneralTest]] | ||
|- | |- | ||
| 8 || | | 8 || [[#HidConnect]] | ||
|- | |- | ||
| 9 || [5.0.0+] | | 9 || [5.0.0+] [[#GeneralGet]] | ||
|- | |- | ||
| 10 || [5.1.0+] | | 10 || [5.1.0+] [[#GetGattClientDisconnectionReason]] | ||
|- | |- | ||
| 11 || [5.1.0+] | | 11 || [5.1.0+] [[#GetBleConnectionParameter]] | ||
|- | |- | ||
| 12 || [5.1.0+] | | 12 || [5.1.0+] [[#GetBleConnectionParameterRequest]] | ||
|- | |||
| 13 || [12.0.0+] GetDiscoveredDevice | |||
|- | |||
| 14 || [15.0.0+] SleepAwakeLoopTest | |||
|- | |||
| 15 || [15.0.0+] SleepTest | |||
|- | |||
| 16 || [15.0.0+] MinimumAwakeTest | |||
|- | |||
| 17 || [15.0.0+] ForceEnableBtm | |||
|} | |} | ||
== 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]]. No output. | |||
== CreateBond == | |||
Takes an input [[#BdAddress|BdAddress]]. No output. | |||
[13.0.0+] Now takes a type-0xA output buffer, returns a total of 4-bytes of output. | |||
== CancelBond == | |||
Takes an input [[#BdAddress|BdAddress]]. No output. | |||
== SetTsiMode == | |||
Takes an input [[#BdAddress|BdAddress]] and a [[#TsiMode]]. No output. | |||
Sends a request which is handled as follows: uses [[Bluetooth_Driver_services#SetTsi|SetTsi]] directly with the specified params. | |||
== GeneralTest == | |||
Takes an input s32. No output. | |||
== HidConnect == | |||
Takes an input [[#BdAddress|BdAddress]]. No output. | |||
== GeneralGet == | |||
Takes an input u32 and a type-0x1A output buffer containing a 0x11-byte struct. No output. | |||
== GetGattClientDisconnectionReason == | |||
Takes an input [[#BdAddress|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 = | = btm:sys = | ||
This is "nn::btm::IBtmSystem". | This is "nn::btm::IBtmSystem". | ||
This has max_sessions 6. IPC is handled by 2 threads shared with all services. | |||
{| class="wikitable" border="1" | {| class="wikitable" border="1" | ||
Line 168: | Line 609: | ||
! Cmd || Name | ! Cmd || Name | ||
|- | |- | ||
| 0 || GetCore | | 0 || [[#GetCore]] | ||
|} | |} | ||
== GetCore == | |||
No input. Returns an output [[#IBtmSystemCore]]. | |||
== IBtmSystemCore == | == IBtmSystemCore == | ||
Line 178: | Line 622: | ||
! Cmd || Name | ! Cmd || Name | ||
|- | |- | ||
| 0 || StartGamepadPairing | | 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 = | = btm:u = | ||
This is "nn::btm::IBtmUser". | 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. | |||
{| class="wikitable" border="1" | {| class="wikitable" border="1" | ||
Line 206: | Line 712: | ||
! Cmd || Name | ! Cmd || Name | ||
|- | |- | ||
| 0 || GetCore | | 0 || [[#GetCore_2|GetCore]] | ||
|} | |} | ||
== GetCore == | |||
No input. Returns an output [[#IBtmUserCore]]. | |||
== IBtmUserCore == | == IBtmUserCore == | ||
Line 216: | Line 725: | ||
! Cmd || Name | ! Cmd || Name | ||
|- | |- | ||
| 0 || AcquireBleScanEvent | | 0 || [[#AcquireBleScanEvent_2|AcquireBleScanEvent]] | ||
|- | |||
| 1 || [[#GetBleScanFilterParameter|GetBleScanFilterParameter]] | |||
|- | |||
| 2 || [[#GetBleScanFilterParameter2|GetBleScanFilterParameter2]] | |||
|- | |||
| 3 || [[#StartBleScanForGeneral_2|StartBleScanForGeneral]] | |||
|- | |||
| 4 || [[#StopBleScanForGeneral_2|StopBleScanForGeneral]] | |||
|- | |||
| 5 || [[#GetBleScanResultsForGeneral_2|GetBleScanResultsForGeneral]] | |||
|- | |||
| 6 || [[#StartBleScanForPaired_2|StartBleScanForPaired]] | |||
|- | |||
| 7 || [[#StopBleScanForPaired_2|StopBleScanForPaired]] | |||
|- | |||
| 8 || [[#StartBleScanForSmartDevice_2|StartBleScanForSmartDevice]] | |||
|- | |||
| 9 || [[#StopBleScanForSmartDevice_2|StopBleScanForSmartDevice]] | |||
|- | |||
| 10 || [[#GetBleScanResultsForSmartDevice_2|GetBleScanResultsForSmartDevice]] | |||
|- | |||
| 17 || [[#AcquireBleConnectionEvent_2|AcquireBleConnectionEvent]] | |||
|- | |||
| 18 || [[#BleConnect_2|BleConnect]] | |||
|- | |||
| 19 || [[#BleDisconnect_2|BleDisconnect]] | |||
|- | |||
| 20 || [[#BleGetConnectionState_2|BleGetConnectionState]] | |||
|- | |||
| 21 || [[#AcquireBlePairingEvent_2|AcquireBlePairingEvent]] | |||
|- | |||
| 22 || [[#BlePairDevice_2|BlePairDevice]] | |||
|- | |||
| 23 || [[#BleUnPairDevice_2|BleUnPairDevice]] | |||
|- | |||
| 24 || [[#BleUnPairDevice2|BleUnPairDevice2]] | |||
|- | |||
| 25 || [[#BleGetPairedDevices|BleGetPairedDevices]] | |||
|- | |||
| 26 || [[#AcquireBleServiceDiscoveryEvent_2|AcquireBleServiceDiscoveryEvent]] | |||
|- | |||
| 27 || [[#GetGattServices_2|GetGattServices]] | |||
|- | |||
| 28 || [[#GetGattService_2|GetGattService]] | |||
|- | |||
| 29 || [[#GetGattIncludedServices_2|GetGattIncludedServices]] | |||
|- | |||
| 30 || [[#GetBelongingGattService|GetBelongingGattService]] | |||
|- | |||
| 31 || [[#GetGattCharacteristics_2|GetGattCharacteristics]] | |||
|- | |||
| 32 || [[#GetGattDescriptors_2|GetGattDescriptors]] | |||
|- | |||
| 33 || [[#AcquireBleMtuConfigEvent_2|AcquireBleMtuConfigEvent]] | |||
|- | |||
| 34 || [[#ConfigureBleMtu_2|ConfigureBleMtu]] | |||
|- | |||
| 35 || [[#GetBleMtu_2|GetBleMtu]] | |||
|- | |||
| 36 || [[#RegisterBleGattDataPath_2|RegisterBleGattDataPath]] | |||
|- | |||
| 37 || [[#UnregisterBleGattDataPath_2|UnregisterBleGattDataPath]] | |||
|} | |||
=== AcquireBleScanEvent === | |||
No input. Returns an output bool and an Event handle with EventClearMode=1. | |||
This is similar to the [[#AcquireBleScanEvent|btm]] cmd. | |||
=== GetBleScanFilterParameter === | |||
Takes an input u16. Returns a [[Bluetooth_Driver_services#BleAdvertisePacketParameter|BleAdvertisePacketParameter]]. | |||
This is the same as [[#GetBleScanParameterGeneral]]. | |||
=== GetBleScanFilterParameter2 === | |||
Takes an input u16. Returns a [[Bluetooth_Driver_services#GattAttributeUuid|GattAttributeUuid]]. | |||
This is the same as [[#GetBleScanParameterSmartDevice]]. | |||
=== StartBleScanForGeneral === | |||
Takes a PID, a [[Bluetooth_Driver_services#BleAdvertisePacketParameter|BleAdvertisePacketParameter]], an [[Applet_Manager_services#AppletResourceUserId|AppletResourceUserId]]. No output. | |||
This is similar to the [[#StartBleScanForGeneral|btm]] cmd. | |||
=== StopBleScanForGeneral === | |||
No input/output. | |||
This is similar to the [[#StopBleScanForGeneral|btm]] cmd. | |||
=== GetBleScanResultsForGeneral === | |||
Takes a PID, a type-0x6 output buffer containing an array of [[Bluetooth_Driver_services#BleScanResult|BleScanResult]], an [[Applet_Manager_services#AppletResourceUserId|AppletResourceUserId]]. Returns an output u8 total_out. | |||
This is similar to the [[#GetBleScanResultsForGeneral|btm]] cmd. | |||
=== StartBleScanForPaired === | |||
Takes a PID, a [[Bluetooth_Driver_services#BleAdvertisePacketParameter|BleAdvertisePacketParameter]], an [[Applet_Manager_services#AppletResourceUserId|AppletResourceUserId]]. No output. | |||
This is similar to the [[#StartBleScanForPaired|btm]] cmd. | |||
=== StopBleScanForPaired === | |||
No input/output. | |||
This is similar to the [[#StopBleScanForPaired|btm]] cmd. | |||
=== StartBleScanForSmartDevice === | |||
Takes a PID, a [[Bluetooth_Driver_services#GattAttributeUuid|GattAttributeUuid]], an [[Applet_Manager_services#AppletResourceUserId|AppletResourceUserId]]. No output. | |||
This is similar to the [[#StartBleScanForSmartDevice|btm]] cmd. | |||
=== StopBleScanForSmartDevice === | |||
No input/output. | |||
This is similar to the [[#StopBleScanForSmartDevice|btm]] cmd. | |||
=== GetBleScanResultsForSmartDevice === | |||
Takes a PID, a type-0x6 output buffer containing an array of [[Bluetooth_Driver_services#BleScanResult|BleScanResult]], an [[Applet_Manager_services#AppletResourceUserId|AppletResourceUserId]]. Returns an output u8 total_out. | |||
This is similar to the [[#GetBleScanResultsForSmartDevice|btm]] cmd. | |||
=== AcquireBleConnectionEvent === | |||
No input. Returns an output bool and an Event handle with EventClearMode=1. | |||
This is similar to the [[#AcquireBleConnectionEvent|btm]] cmd. | |||
=== BleConnect === | |||
Takes a PID, an [[#BdAddress|BdAddress]], an [[Applet_Manager_services#AppletResourceUserId|AppletResourceUserId]]. No output. | |||
This is similar to the [[#BleConnect|btm]] cmd. | |||
=== BleDisconnect === | |||
Takes an input u32. No output. | |||
This is similar to the [[#BleDisconnect|btm]] cmd. | |||
=== BleGetConnectionState === | |||
Takes a PID, a type-0xA output buffer containing an array of [[Bluetooth_Driver_services#BleConnectionInfo|BleConnectionInfo]], an [[Applet_Manager_services#AppletResourceUserId|AppletResourceUserId]]. Returns an output u8 total_out. | |||
This is similar to the [[#BleGetConnectionState|btm]] cmd. | |||
=== AcquireBlePairingEvent === | |||
No input. Returns an output bool and an Event handle with EventClearMode=1. | |||
This is similar to the [[#AcquireBlePairingEvent|btm]] cmd. | |||
=== BlePairDevice === | |||
Takes an input [[Bluetooth_Driver_services#BleAdvertisePacketParameter|BleAdvertisePacketParameter]] and an u32. No output. | |||
This is similar to the [[#BlePairDevice|btm]] cmd. | |||
=== BleUnPairDevice === | |||
Takes an input [[Bluetooth_Driver_services#BleAdvertisePacketParameter|BleAdvertisePacketParameter]] and an u32. No output. | |||
This is similar to the [[#BleUnpairDeviceOnBoth|btm]] cmd. | |||
=== BleUnPairDevice2 === | |||
Takes an input [[#BdAddress|BdAddress]] and a [[Bluetooth_Driver_services#BleAdvertisePacketParameter|BleAdvertisePacketParameter]]. No output. | |||
This is similar to the [[#BleUnPairDevice|btm]] cmd. | |||
=== BleGetPairedDevices === | |||
Takes a type-0xA output buffer containing an array of [[#BdAddress|BdAddress]], a [[Bluetooth_Driver_services#BleAdvertisePacketParameter|BleAdvertisePacketParameter]]. Returns an output u8 total_out. | |||
This is the same as the [[#BleGetPairedAddresses|btm]] cmd. | |||
=== AcquireBleServiceDiscoveryEvent === | |||
No input. Returns an output bool and an Event handle with EventClearMode=1. | |||
This is similar to the [[#AcquireBleServiceDiscoveryEvent|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 [[Applet_Manager_services#AppletResourceUserId|AppletResourceUserId]]. Returns an output u8 total_out. | |||
This is similar to the [[#GetGattServices|btm]] cmd. | |||
=== GetGattService === | |||
Takes a PID, a type-0x1A output buffer containing a [[#GattService]], an u32, a [[Bluetooth_Driver_services#GattAttributeUuid|GattAttributeUuid]], an [[Applet_Manager_services#AppletResourceUserId|AppletResourceUserId]]. Returns an output bool. | |||
This is similar to the [[#GetGattService|btm]] cmd. | |||
=== GetGattIncludedServices === | |||
Takes a PID, a type-0x6 output buffer containing an array of [[#GattService]], an u16, an u32, an [[Applet_Manager_services#AppletResourceUserId|AppletResourceUserId]]. Returns an output u8. | |||
This is similar to the [[#GetGattIncludedServices|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 [[Applet_Manager_services#AppletResourceUserId|AppletResourceUserId]]. Returns an output bool. | |||
This is similar to the [[#GetBelongingService|btm]] cmd. | |||
=== GetGattCharacteristics === | |||
Takes a PID, a type-0x6 output buffer containing an array of [[#GattCharacteristic]], an u16, an u32, an [[Applet_Manager_services#AppletResourceUserId|AppletResourceUserId]]. Returns an output u8 total_out. | |||
This is similar to the [[#GetGattCharacteristics|btm]] cmd. | |||
=== GetGattDescriptors === | |||
Takes a PID, a type-0x6 output buffer containing an array of [[#GattDescriptor]], an u16, an u32, an [[Applet_Manager_services#AppletResourceUserId|AppletResourceUserId]]. Returns an output u8 total_out. | |||
This is similar to the [[#GetGattDescriptors|btm]] cmd. | |||
=== AcquireBleMtuConfigEvent === | |||
No input. Returns an output bool and an Event handle with EventClearMode=1. | |||
This is similar to the [[#AcquireBleMtuConfigEvent|btm]] cmd. | |||
=== ConfigureBleMtu === | |||
Takes a PID, an u16, an u32, an [[Applet_Manager_services#AppletResourceUserId|AppletResourceUserId]]. No output. | |||
This is similar to the [[#ConfigureBleMtu|btm]] cmd. | |||
sdknso will Abort if the user-specified u16 is <0x18 or >0x200 (this doesn't apply to the [[#ConfigureBleMtu|btm]] cmd). | |||
=== GetBleMtu === | |||
Takes a PID, an u32, an [[Applet_Manager_services#AppletResourceUserId|AppletResourceUserId]]. Returns an output u16. | |||
This is similar to the [[#GetBleMtu|btm]] cmd. | |||
=== RegisterBleGattDataPath === | |||
Takes a PID, a [[#BleDataPath]], an [[Applet_Manager_services#AppletResourceUserId|AppletResourceUserId]]. No output. | |||
This is similar to the [[#RegisterBleGattDataPath|btm]] cmd. | |||
=== UnregisterBleGattDataPath === | |||
Takes a PID, a [[#BleDataPath]], an [[Applet_Manager_services#AppletResourceUserId|AppletResourceUserId]]. No output. | |||
This is similar to the [[#UnregisterBleGattDataPath|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". | |||
{| class="wikitable" border="1" | |||
|- | |||
! Value || Description | |||
|- | |||
| 0 || NotInitialized | |||
|- | |||
| 1 || RadioOff | |||
|- | |||
| 2 || MinorSlept | |||
|- | |||
| 3 || RadioOffMinorSlept | |||
|- | |||
| 4 || Slept | |||
|- | |||
| 5 || RadioOffSlept | |||
|- | |||
| 6 || Initialized | |||
|- | |||
| 7 || Working | |||
|} | |||
= BluetoothMode = | |||
This is "nn::btm::BluetoothMode". | |||
{| class="wikitable" border="1" | |||
|- | |||
! Value || Description | |||
|- | |||
| 0 || Dynamic2Slot | |||
|- | |||
| 1 || StaticJoy | |||
|} | |||
= WlanMode = | |||
This is "nn::btm::WlanMode". | |||
{| class="wikitable" border="1" | |||
|- | |||
! Value || Description | |||
|- | |- | ||
| | | 0 || Local4 | ||
|- | |- | ||
| | | 1 || Local8 | ||
|- | |- | ||
| | | 2 || None | ||
|} | |||
= TsiMode = | |||
This is "nn::btm::TsiMode". | |||
{| class="wikitable" border="1" | |||
|- | |- | ||
| | ! 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". | |||
{| class="wikitable" border="1" | |||
|- | |- | ||
| | ! Value || Description | ||
|- | |- | ||
| | | 0 || 2 | ||
|- | |- | ||
| | | 1 || 4 | ||
|- | |- | ||
| | | 2 || 6 | ||
|- | |- | ||
| | | 3 || Active | ||
|} | |||
= SniffMode = | |||
This is "nn::btm::SniffMode". | |||
{| class="wikitable" border="1" | |||
|- | |- | ||
| | ! Value || Description | ||
|- | |- | ||
| | | 0 || 5ms | ||
|- | |- | ||
| | | 1 || 10ms | ||
|- | |- | ||
| | | 2 || 15ms | ||
|- | |- | ||
| | | 3 || Active | ||
|} | |||
= Profile = | |||
This is "nn::btm::Profile". | |||
{| class="wikitable" border="1" | |||
|- | |||
! Value || Description | |||
|- | |||
| 0 || None | |||
|- | |- | ||
| | | 1 || Hid | ||
|- | |- | ||
| | | 2 || [13.0.0+] Audio | ||
|} | |||
= HidDeviceInfo = | |||
This is "nn::btm::HidDeviceInfo". | |||
{| class="wikitable" border="1" | |||
|- | |- | ||
! Offset | |||
! Size | |||
! Description | |||
|- | |- | ||
| | | 0x0 || 0x2 || Vid | ||
|- | |- | ||
| | | 0x2 || 0x2 || Pid | ||
|} | |} | ||
= HidDeviceCondition = | |||
This is "nn::btm::HidDeviceCondition". | |||
{| class="wikitable" border="1" | |||
|- | |||
! Offset | |||
! Size | |||
! Description | |||
|- | |||
| 0x0 || 0x4 || [[#SniffMode|SniffMode]] | |||
|- | |||
| 0x4 || 0x4 || [[#SlotMode|SlotMode]] | |||
|- | |||
| 0x8 || 0x1 || IsBurstMode | |||
|- | |||
| 0x9 || 0x11 || [[#ZeroRetransmissionList|ZeroRetransmissionList]] | |||
|- | |||
| 0x1A || 0x2 || Vid | |||
|- | |||
| 0x1C || 0x2 || Pid | |||
|} | |||
= HostDeviceProperty = | |||
This is "nn::btm::HostDeviceProperty". This is a 0x2A-byte struct. | |||
[13.0.0+] This is a 0x103-byte struct. | |||
{| class="wikitable" border="1" | |||
|- | |||
! Offset | |||
! Size | |||
! Description | |||
|- | |||
| 0x0 || 0x6 || [[#BdAddress|BdAddress]] | |||
|- | |||
| 0x6 || 0x3 || [[#ClassOfDevice|ClassOfDevice]] | |||
|- | |||
| 0x9 || 0x20 || [[#BdName|BdName]] | |||
|- | |||
| 0x29 || 0x1 || FeatureSet | |||
|- | |||
| 0x2A || 0xD9 || [13.0.0+] | |||
|} | |||
= DeviceSlotMode = | |||
This is "nn::btm::DeviceSlotMode". | |||
{| class="wikitable" border="1" | |||
|- | |||
! Offset | |||
! Size | |||
! Description | |||
|- | |||
| 0x0 || 0x6 || [[#BdAddress|BdAddress]] | |||
|- | |||
| 0x6 || 0x2 || Reserved | |||
|- | |||
| 0x8 || 0x4 || [[#SlotMode|SlotMode]] | |||
|} | |||
= DeviceSlotModeList = | |||
This is "nn::btm::DeviceSlotModeList". This is a 0x64-byte struct. | |||
{| class="wikitable" border="1" | |||
|- | |||
! Offset | |||
! Size | |||
! Description | |||
|- | |||
| 0x0 || 0x1 || DeviceCount | |||
|- | |||
| 0x1 || 0x3 || Reserved | |||
|- | |||
| 0x4 || 0xC * 8 || Array of [[#DeviceSlotMode|DeviceSlotMode]] | |||
|} | |||
= DeviceCondition = | |||
This is "nn::btm::DeviceCondition". This is a 0x6C-byte struct. | |||
[13.0.0+] This is a 0x148-byte struct. | |||
{| class="wikitable" border="1" | |||
|- | |||
! Offset | |||
! Size | |||
! Description | |||
|- | |||
| 0x0 || 0x6 || [[#BdAddress|BdAddress]] | |||
|- | |||
| 0x6 || 0x2 || Reserved | |||
|- | |||
| 0x8 || 0x4 || [[#Profile|Profile]] | |||
|- | |||
| 0xC || 0x20 || [[#BdName|BdName]] | |||
|- | |||
| 0x2C || 0x20 || Empty (Profile = None) or [[#HidDeviceCondition|HidDeviceCondition]] (Profile = Hid) | |||
|- | |||
| 0x4C || 0x20 || Reserved | |||
|- | |||
| 0x6C || 0xDC || [13.0.0+] | |||
|} | |||
= DeviceConditionList = | |||
This is "nn::btm::DeviceConditionList". This is a 0x36C-byte struct. | |||
[13.0.0+] This is a 0xA4C-byte struct. | |||
{| class="wikitable" border="1" | |||
|- | |||
! Offset | |||
! Size | |||
! Description | |||
|- | |||
| 0x0 || 0x4 || [[#BluetoothMode|BluetoothMode]] | |||
|- | |||
| 0x4 || 0x4 || [[#WlanMode|WlanMode]] | |||
|- | |||
| 0x8 || 0x1 || IsSlotSavingForPairing | |||
|- | |||
| 0x9 || 0x1 || DeviceCount | |||
|- | |||
| 0xA || 0x2 || Reserved | |||
|- | |||
| 0xC || 0x148 * 8 ([1.0.0-12.1.0] 0x6C * 8) || Array of [[#DeviceCondition|DeviceCondition]] | |||
|} | |||
= DeviceInfo = | |||
This is "nn::btm::DeviceInfo". This is a 0x60-byte struct. | |||
[13.0.0+] This is a 0x13C-byte struct. | |||
{| class="wikitable" border="1" | |||
|- | |||
! Offset | |||
! Size | |||
! Description | |||
|- | |||
| 0x0 || 0x6 || [[#BdAddress|BdAddress]] | |||
|- | |||
| 0x6 || 0x3 || [[#ClassOfDevice|ClassOfDevice]] | |||
|- | |||
| 0x9 || 0x20 || [[#BdName|BdName]] | |||
|- | |||
| 0x29 || 0x10 || [[#LinkKey|LinkKey]] | |||
|- | |||
| 0x39 || 0x3 || Reserved | |||
|- | |||
| 0x3C || 0x4 || [[#Profile|Profile]] | |||
|- | |||
| 0x40 || 0x4 || Empty (Profile = None) or [[#HidDeviceInfo|HidDeviceInfo]] (Profile = Hid) | |||
|- | |||
| 0x44 || 0x1C || Reserved | |||
|- | |||
| 0x60 || 0xDC || [13.0.0+] | |||
|} | |||
= DeviceInfoList = | |||
This is "nn::btm::DeviceInfoList". This is a 0x3C4-byte struct. | |||
[13.0.0+] This is a 0xC5C-byte struct. | |||
{| class="wikitable" border="1" | |||
|- | |||
! Offset | |||
! Size | |||
! Description | |||
|- | |||
| 0x0 || 0x1 || DeviceCount | |||
|- | |||
| 0x1 || 0x3 || Reserved | |||
|- | |||
| 0x4 || 0x13C * 10 ([1.0.0-12.1.0] 0x60 * 10) || Array of [[#DeviceInfo|DeviceInfo]] | |||
|} | |||
= DeviceProperty = | |||
This is "nn::btm::DeviceProperty". This is a 0x29-byte struct. | |||
{| class="wikitable" border="1" | |||
|- | |||
! Offset | |||
! Size | |||
! Description | |||
|- | |||
| 0x0 || 0x6 || [[#BdAddress|BdAddress]] | |||
|- | |||
| 0x6 || 0x3 || [[#ClassOfDevice|ClassOfDevice]] | |||
|- | |||
| 0x9 || 0x20 || [[#BdName|BdName]] | |||
|} | |||
= DevicePropertyList = | |||
This is "nn::btm::DevicePropertyList". This is a 0x268-byte struct. | |||
{| class="wikitable" border="1" | |||
|- | |||
! Offset | |||
! Size | |||
! Description | |||
|- | |||
| 0x0 || 0x1 || DeviceCount | |||
|- | |||
| 0x1 || 0x29 * 15 || Array of [[#DeviceProperty|DeviceProperty]] | |||
|} | |||
= DeviceCeLength = | |||
This is "nn::btm::DeviceCeLength". This is a 0x10-byte struct. | |||
{| class="wikitable" border="1" | |||
|- | |||
! Offset | |||
! Size | |||
! Description | |||
|- | |||
| 0x0 || 0x6 || [[#BdAddress|BdAddress]] | |||
|- | |||
| 0x6 || 0x6 || Reserved | |||
|- | |||
| 0xC || 0x1 || CeLength (used for [[Bluetooth_Driver_services#BleConnectionParameter|BleConnectionParameter]]) | |||
|- | |||
| 0xD || 0x3 || Reserved | |||
|} | |||
= DeviceCeLengthList = | |||
This is "nn::btm::DeviceCeLengthList". This is a 0x44-byte struct. | |||
{| class="wikitable" border="1" | |||
|- | |||
! Offset | |||
! Size | |||
! Description | |||
|- | |||
| 0x0 || 0x10 * 4 || Array of [[#DeviceCeLength|DeviceCeLength]] | |||
|- | |||
| 0x40 || 0x4 || DeviceCount | |||
|} | |||
= ZeroRetransmissionList = | |||
This is "nn::btm::ZeroRetransmissionList". This is a 0x11-byte struct. | |||
{| class="wikitable" border="1" | |||
|- | |||
! 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. | |||
{| class="wikitable" border="1" | |||
|- | |||
! Offset | |||
! Size | |||
! Description | |||
|- | |||
| 0x0 || 0x4 || | |||
|- | |||
| 0x4 || 0x14 || [[Bluetooth_Driver_services#GattAttributeUuid|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. | |||
{| class="wikitable" border="1" | |||
|- | |||
! Offset | |||
! Size | |||
! Description | |||
|- | |||
| 0x0 || 0x4 || | |||
|- | |||
| 0x4 || 0x14 || [[Bluetooth_Driver_services#GattAttributeUuid|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. | |||
{| class="wikitable" border="1" | |||
|- | |||
! Offset | |||
! Size | |||
! Description | |||
|- | |||
| 0x0 || 0x4 || | |||
|- | |||
| 0x4 || 0x14 || [[Bluetooth_Driver_services#GattAttributeUuid|GattAttributeUuid]] | |||
|- | |||
| 0x18 || 0x2 || Handle | |||
|- | |||
| 0x1A || 0x6 || | |||
|} | |||
= BleDataPath = | |||
This is "nn::btm::user::BleDataPath". This is a 0x18-byte struct with 4-byte alignment. | |||
{| class="wikitable" border="1" | |||
|- | |||
! Offset | |||
! Size | |||
! Description | |||
|- | |||
| 0x0 || 0x1 || | |||
|- | |||
| 0x1 || 0x3 || Padding | |||
|- | |||
| 0x4 || 0x14 || [[Bluetooth_Driver_services#GattAttributeUuid|GattAttributeUuid]] | |||
|} | |||
= Logging = | |||
A func which uses [[PSC_services|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. | |||
[[Category:Services]] | [[Category:Services]] |