BTM services: Difference between revisions
No edit summary |
|||
| (20 intermediate revisions by 2 users not shown) | |||
| Line 6: | Line 6: | ||
This has max_sessions 6. IPC is handled by 2 threads shared with all services. | 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. | 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. | ||
| Line 143: | Line 143: | ||
|- | |- | ||
| 64 || [10.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-14.1.2] | |||
|- | |||
| 113 || [14.0.0-14.1.2] | |||
|- | |||
| 114 || [14.0.0+] | |||
|- | |||
| 115 || [14.0.0+] | |||
|- | |||
| 116 || [15.0.0+] | |||
|- | |||
| 117 || [15.0.0+] | |||
|} | |} | ||
| Line 150: | Line 194: | ||
== GetHostDeviceProperty == | == GetHostDeviceProperty == | ||
No input, returns an output [[#HostDeviceProperty]]. | 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]]. | This gets the previously initialized [[#HostDeviceProperty]]. | ||
| Line 160: | Line 206: | ||
== GetDeviceCondition == | == GetDeviceCondition == | ||
Takes a type-0x1A output buffer containing a 0x368-byte struct. | 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 == | == SetBurstMode == | ||
| Line 182: | Line 230: | ||
** It then goes through various arrays again for updating state. | ** 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: | The SetTsi wrapper func is implemented as follows: | ||
| Line 200: | Line 250: | ||
== GetDeviceInfo == | == GetDeviceInfo == | ||
Takes a type-0x1A output buffer containing a [[#DeviceInfoList]]. | 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 == | == AddDeviceInfo == | ||
Takes an input [[#DeviceInfo]], no output. | Takes an input [[#DeviceInfo]], no output. | ||
[13.0.0+] Takes a type-0x19 input buffer containing a [[#DeviceInfo]], no output. | |||
== RemoveDeviceInfo == | == RemoveDeviceInfo == | ||
| Line 251: | Line 305: | ||
The u16 must be value 0x1 or 0xFFFF. | 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 == | == GetBleScanParameterSmartDevice == | ||
| Line 259: | Line 319: | ||
== StartBleScanForGeneral == | == StartBleScanForGeneral == | ||
Takes a [[Bluetooth_Driver_services#BleAdvertisePacketParameter|BleAdvertisePacketParameter]], no output. | 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 == | == StopBleScanForGeneral == | ||
| Line 270: | Line 334: | ||
== StartBleScanForPaired == | == StartBleScanForPaired == | ||
Takes a [[Bluetooth_Driver_services#BleAdvertisePacketParameter|BleAdvertisePacketParameter]], no output. | 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 == | == StopBleScanForPaired == | ||
| Line 276: | Line 344: | ||
== StartBleScanForSmartDevice == | == StartBleScanForSmartDevice == | ||
Takes a [[Bluetooth_Driver_services#GattAttributeUuid|GattAttributeUuid]], no output. | 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 == | == StopBleScanForSmartDevice == | ||
| Line 463: | Line 537: | ||
This has max_sessions 6. IPC is handled by 2 threads shared with all services. | 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. | |||
{| class="wikitable" border="1" | {| class="wikitable" border="1" | ||
| Line 493: | Line 571: | ||
|- | |- | ||
| 12 || [5.1.0+] [[#GetBleConnectionParameterRequest]] | | 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+] | |||
|} | |} | ||
| Line 578: | Line 666: | ||
| 5 || [[#DisableRadio]] | | 5 || [[#DisableRadio]] | ||
|- | |- | ||
| 6 || [[# | | 6 || [[#IsRadioEnabled]] | ||
|- | |- | ||
| 7 || [3.0.0+] [[#AcquireRadioEvent]] | | 7 || [3.0.0+] [[#AcquireRadioEvent]] | ||
| Line 585: | Line 673: | ||
|- | |- | ||
| 9 || [3.0.0+] [[#IsGamepadPairingStarted]] | | 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 | |||
|} | |} | ||
| Line 605: | Line 721: | ||
No input/output. | No input/output. | ||
=== | === IsRadioEnabled === | ||
No input, returns an output bool. | No input, returns an output bool. | ||
| Line 1,010: | Line 1,126: | ||
= HostDeviceProperty = | = HostDeviceProperty = | ||
This is "nn::btm::HostDeviceProperty". This is a 0x2A-byte struct. | This is "nn::btm::HostDeviceProperty". This is a 0x2A-byte struct. | ||
[13.0.0+] This is a 0x103-byte struct. | |||
{| class="wikitable" border="1" | {| class="wikitable" border="1" | ||
| Line 1,060: | Line 1,178: | ||
= DeviceInfo = | = DeviceInfo = | ||
This is "nn::btm::DeviceInfo". This is a 0x60-byte struct. | This is "nn::btm::DeviceInfo". This is a 0x60-byte struct. | ||
[13.0.0+] This is a 0x13C-byte struct. | |||
{| class="wikitable" border="1" | {| class="wikitable" border="1" | ||
| Line 1,097: | Line 1,217: | ||
| 0x1 || 0x3 || Reserved | | 0x1 || 0x3 || Reserved | ||
|- | |- | ||
| 0x4 || 0xA * | | 0x4 || 0xA * 0x60 || Array of [[#DeviceInfo|DeviceInfo]] | ||
|} | |} | ||