BTM services: Difference between revisions
No edit summary |
|||
(19 intermediate revisions by 2 users not shown) | |||
Line 26: | Line 26: | ||
| 5 || [[#SetSlotMode]] | | 5 || [[#SetSlotMode]] | ||
|- | |- | ||
| 6 || [1.0.0-8.1. | | 6 || [1.0.0-8.1.1] [[#SetBluetoothMode]] | ||
|- | |- | ||
| 7 || [[#SetWlanMode]] | | 7 || [[#SetWlanMode]] | ||
Line 150: | Line 150: | ||
== GetHostDeviceProperty == | == GetHostDeviceProperty == | ||
No input, returns an output [[#HostDeviceProperty]]. | No input, returns an output [[#HostDeviceProperty]]. | ||
This gets the previously initialized [[#HostDeviceProperty]]. | |||
== AcquireDeviceConditionEvent == | == AcquireDeviceConditionEvent == | ||
Line 160: | Line 162: | ||
== SetBurstMode == | == SetBurstMode == | ||
Takes an input [[ | Takes an input [[#BdAddress|BdAddress]] and a bool, no output. | ||
== SetSlotMode == | == SetSlotMode == | ||
Takes a type-0x19 input buffer containing a [[#DeviceSlotModeList]], no output. | 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 == | == SetBluetoothMode == | ||
Line 183: | Line 207: | ||
== RemoveDeviceInfo == | == RemoveDeviceInfo == | ||
Takes an input [[ | Takes an input [[#BdAddress|BdAddress]], no output. | ||
== IncreaseDeviceInfoOrder == | == IncreaseDeviceInfoOrder == | ||
Takes an input [[ | Takes an input [[#BdAddress|BdAddress]], no output. | ||
== LlrNotify == | == LlrNotify == | ||
Takes an input [[ | Takes an input [[#BdAddress|BdAddress]], no output. | ||
[9.0.0+] Takes an input [[ | [9.0.0+] Takes an input [[#BdAddress|BdAddress]] and a s32, no output. | ||
== EnableRadio == | == EnableRadio == | ||
Line 200: | Line 224: | ||
== HidDisconnect == | == HidDisconnect == | ||
Takes an input [[ | Takes an input [[#BdAddress|BdAddress]], no output. | ||
== HidSetRetransmissionMode == | == HidSetRetransmissionMode == | ||
Takes an input [[ | Takes an input [[#BdAddress|BdAddress]] and a type-0x19 input buffer containing a [[#ZeroRetransmissionList]], no output. | ||
== AcquireAwakeReqEvent == | == AcquireAwakeReqEvent == | ||
Line 220: | Line 244: | ||
== ProtectDeviceInfo == | == ProtectDeviceInfo == | ||
Takes an input [[ | Takes an input [[#BdAddress|BdAddress]] and a bool, no output. | ||
== AcquireBleScanEvent == | == AcquireBleScanEvent == | ||
Line 226: | Line 250: | ||
== GetBleScanParameterGeneral == | == GetBleScanParameterGeneral == | ||
Takes an input u16, returns a [[Bluetooth_Driver_services#BleAdvertisePacketParameter|BleAdvertisePacketParameter]]. | Takes an input u16 ParameterId, returns a [[Bluetooth_Driver_services#BleAdvertisePacketParameter|BleAdvertisePacketParameter]]. | ||
The u16 must be value 0x1 or 0xFFFF. | The u16 must be value 0x1 or 0xFFFF. | ||
== GetBleScanParameterSmartDevice == | == GetBleScanParameterSmartDevice == | ||
Takes an input u16, returns a [[Bluetooth_Driver_services#GattAttributeUuid|GattAttributeUuid]]. | 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. | The u16 must be value 0x2. The first 4-bytes of output is always 0 since it's not set. | ||
Line 267: | Line 291: | ||
== BleConnect == | == BleConnect == | ||
Takes an input [[ | Takes an input [[#BdAddress|BdAddress]], no output. | ||
An error is thrown if the [[ | 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 == | == BleOverrideConnection == | ||
Line 277: | Line 301: | ||
== BleDisconnect == | == BleDisconnect == | ||
Takes an input u32, no output. | Takes an input u32 ConnectionHandle, no output. | ||
The u32 must match | The u32 must match a ConnectionHandle in a [[Bluetooth_Driver_services#BleConnectionInfo|BleConnectionInfo]] from [[#BleGetConnectionState]]. [5.1.0+] 0xFFFFFFFF is invalid. | ||
== BleGetConnectionState == | == BleGetConnectionState == | ||
Line 303: | Line 327: | ||
== BleUnpairDevice == | == BleUnpairDevice == | ||
Takes an input [[ | Takes an input [[#BdAddress|BdAddress]] and a [[Bluetooth_Driver_services#BleAdvertisePacketParameter|BleAdvertisePacketParameter]], no output. | ||
== BleGetPairedAddresses == | == BleGetPairedAddresses == | ||
Takes a type-0xA output buffer containing an array of [[ | 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. | The max array entries is 10. | ||
Line 326: | Line 350: | ||
== GetGattIncludedServices == | == GetGattIncludedServices == | ||
Takes a type-0x6 output buffer containing an array of [[#GattService]], an u16, an u32, returns an output u8. | 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. | The u32 is the same as the param for [[#BleDisconnect]]. The max array entries is 100. | ||
Line 335: | Line 359: | ||
== GetBelongingService == | == GetBelongingService == | ||
Takes a type-0x1A output buffer containing a [[#GattService]], an u16, an u32, returns an output bool. | 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. | The u32 is the same as the param for [[#BleDisconnect]]. The output bool indicates whether a [[#GattService]] was returned. | ||
Line 342: | Line 366: | ||
== GetGattCharacteristics == | == GetGattCharacteristics == | ||
Takes a type-0x6 output buffer containing an array of [[#GattCharacteristic]], an u16, an u32, returns an output u8 total_out. | 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 u32 is the same as the param for [[#BleDisconnect]]. The max array entries is 100. | ||
Line 349: | Line 373: | ||
== GetGattDescriptors == | == GetGattDescriptors == | ||
Takes a type-0x6 output buffer containing an array of [[#GattDescriptor]], an u16, an u32, returns an output u8 total_out. | 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 u32 is the same as the param for [[#BleDisconnect]]. The max array entries is 100. | ||
Line 359: | Line 383: | ||
== ConfigureBleMtu == | == ConfigureBleMtu == | ||
Takes an u16, an u32, no output. | Takes an u16 mtu, an u32, no output. | ||
The u32 is the same as the param for [[#BleDisconnect]]. | The u32 is the same as the param for [[#BleDisconnect]]. | ||
== GetBleMtu == | == GetBleMtu == | ||
Takes an u32, returns an output u16. | Takes an u32, returns an output u16 mtu. | ||
The u32 is the same as the param for [[#BleDisconnect]]. | The u32 is the same as the param for [[#BleDisconnect]]. | ||
Line 388: | Line 412: | ||
== Cmd61 == | == Cmd61 == | ||
Takes a 0x44-byte input struct, no output. | 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: | |||
{| class="wikitable" border="1" | |||
|- | |||
! 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: | |||
{| class="wikitable" border="1" | |||
|- | |||
! Offset | |||
! Size | |||
! Description | |||
|- | |||
| 0x0 || 0x6 || [[#BdAddress|BdAddress]] | |||
|- | |||
| 0x6 || 0x6 || Unused | |||
|- | |||
| 0xC || 0x1 || Used to determine data which is then used for [[Bluetooth_Driver_services#BleConnectionParameter|BleConnectionParameter]]. | |||
|- | |||
| 0xD || 0x3 || Padding | |||
|} | |||
== Cmd62 == | == Cmd62 == | ||
Takes an input bool, no output. | Takes an input bool, no output. | ||
Sends a request which is handled as follows: writes the flag into state if needed. | |||
== Cmd63 == | == Cmd63 == | ||
No input, returns an output bool. | No input, returns an output bool. | ||
This gets the flag used by [[#Cmd62]]. | |||
== Cmd64 == | == Cmd64 == | ||
No input/output. | 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 = | ||
Line 402: | Line 465: | ||
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. | |||
{| class="wikitable" border="1" | {| class="wikitable" border="1" | ||
Line 432: | Line 497: | ||
|- | |- | ||
| 12 || [5.1.0+] [[#GetBleConnectionParameterRequest]] | | 12 || [5.1.0+] [[#GetBleConnectionParameterRequest]] | ||
|- | |||
| 13 || [12.0.0+] | |||
|} | |} | ||
Line 449: | Line 516: | ||
== CreateBond == | == CreateBond == | ||
Takes an input [[ | Takes an input [[#BdAddress|BdAddress]], no output. | ||
== CancelBond == | == CancelBond == | ||
Takes an input [[ | Takes an input [[#BdAddress|BdAddress]], no output. | ||
== SetTsiMode == | == SetTsiMode == | ||
Takes an input [[ | 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 == | == GeneralTest == | ||
Line 461: | Line 530: | ||
== HidConnect == | == HidConnect == | ||
Takes an input [[ | Takes an input [[#BdAddress|BdAddress]], no output. | ||
== GeneralGet == | == GeneralGet == | ||
Line 467: | Line 536: | ||
== GetGattClientDisconnectionReason == | == GetGattClientDisconnectionReason == | ||
Takes an input [[ | Takes an input [[#BdAddress|BdAddress]] and an u32, returns an output bool and u16. | ||
The bool indicates whether the cmd is successful. | The bool indicates whether the cmd is successful. | ||
Line 704: | Line 773: | ||
=== BleConnect === | === BleConnect === | ||
Takes a PID, an [[ | Takes a PID, an [[#BdAddress|BdAddress]], an [[Applet_Manager_services#AppletResourceUserId|AppletResourceUserId]], no output. | ||
This is similar to the [[#BleConnect|btm]] cmd. | This is similar to the [[#BleConnect|btm]] cmd. | ||
Line 734: | Line 803: | ||
=== BleUnPairDevice2 === | === BleUnPairDevice2 === | ||
Takes an input [[ | Takes an input [[#BdAddress|BdAddress]] and a [[Bluetooth_Driver_services#BleAdvertisePacketParameter|BleAdvertisePacketParameter]], no output. | ||
This is similar to the [[#BleUnPairDevice|btm]] cmd. | This is similar to the [[#BleUnPairDevice|btm]] cmd. | ||
=== BleGetPairedDevices === | === BleGetPairedDevices === | ||
Takes a type-0xA output buffer containing an array of [[ | 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. | This is the same as the [[#BleGetPairedAddresses|btm]] cmd. | ||
Line 808: | Line 877: | ||
This is similar to the [[#UnregisterBleGattDataPath|btm]] cmd. | 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 = | = BtmState = | ||
This is "nn::btm::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 = | = BluetoothMode = | ||
This is "nn::btm::BluetoothMode". | This is "nn::btm::BluetoothMode". | ||
{| class="wikitable" border="1" | |||
|- | |||
! Value || Description | |||
|- | |||
| 0 || Dynamic2Slot | |||
|- | |||
| 1 || StaticJoy | |||
|} | |||
= WlanMode = | = WlanMode = | ||
This is "nn::btm::WlanMode". | This is "nn::btm::WlanMode". | ||
{| class="wikitable" border="1" | |||
|- | |||
! Value || Description | |||
|- | |||
| 0 || Local4 | |||
|- | |||
| 1 || Local8 | |||
|- | |||
| 2 || None | |||
|} | |||
= TsiMode = | = TsiMode = | ||
This is "nn::btm::TsiMode". This is | 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 | |||
|} | |||
= Profile = | |||
This is "nn::btm::Profile". | |||
{| class="wikitable" border="1" | |||
|- | |||
! Value || Description | |||
|- | |||
| 0 || None | |||
|- | |||
| 1 || Hid | |||
|} | |||
= HidDeviceInfo = | |||
This is "nn::btm::HidDeviceInfo". | |||
{| class="wikitable" border="1" | |||
|- | |||
! Offset | |||
! Size | |||
! Description | |||
|- | |||
| 0x0 || 0x2 || Vid | |||
|- | |||
| 0x2 || 0x2 || Pid | |||
|} | |||
= HostDeviceProperty = | = HostDeviceProperty = | ||
This is "nn::btm::HostDeviceProperty". This is a 0x2A-byte struct. | This is "nn::btm::HostDeviceProperty". This is a 0x2A-byte struct. | ||
{| class="wikitable" border="1" | |||
|- | |||
! Offset | |||
! Size | |||
! Description | |||
|- | |||
| 0x0 || 0x6 || [[#BdAddress|BdAddress]] | |||
|- | |||
| 0x6 || 0x3 || [[#ClassOfDevice|ClassOfDevice]] | |||
|- | |||
| 0x9 || 0x20 || [[#BdName|BdName]] | |||
|- | |||
| 0x29 || 0x1 || FeatureSet | |||
|} | |||
= DeviceSlotMode = | |||
This is "nn::btm::DeviceSlotMode". This is a 0xC-byte struct. | |||
{| class="wikitable" border="1" | |||
|- | |||
! Offset | |||
! Size | |||
! Description | |||
|- | |||
| 0x0 || 0x6 || [[#BdAddress|BdAddress]] | |||
|- | |||
| 0x6 || 0x2 || Reserved | |||
|- | |||
| 0x8 || 0x4 || [[#SlotMode|SlotMode]] | |||
|} | |||
= DeviceSlotModeList = | = DeviceSlotModeList = | ||
This is "nn::btm::DeviceSlotModeList". This is a 0x64-byte struct. | 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]] | |||
|} | |||
= DeviceInfo = | |||
This is "nn::btm::DeviceInfo". This is a 0x60-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 | |||
|} | |||
= DeviceInfoList = | = DeviceInfoList = | ||
This is "nn::btm::DeviceInfoList". This is a 0x3C4-byte struct. | This is "nn::btm::DeviceInfoList". This is a 0x3C4-byte struct. | ||
= DeviceInfo = | {| class="wikitable" border="1" | ||
This is "nn::btm:: | |- | ||
! Offset | |||
! Size | |||
! Description | |||
|- | |||
| 0x0 || 0x1 || DeviceCount | |||
|- | |||
| 0x1 || 0x3 || Reserved | |||
|- | |||
| 0x4 || 0xA * 0x60 || 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 = | = DevicePropertyList = | ||
This is "nn::btm::DevicePropertyList". This is a 0x268-byte struct. | 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]] | |||
|} | |||
= ZeroRetransmissionList = | = ZeroRetransmissionList = | ||
This is "nn::btm::ZeroRetransmissionList". This is a 0x11-byte struct. | 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 = | = GattService = | ||
Line 852: | Line 1,163: | ||
| 0x4 || 0x14 || [[Bluetooth_Driver_services#GattAttributeUuid|GattAttributeUuid]] | | 0x4 || 0x14 || [[Bluetooth_Driver_services#GattAttributeUuid|GattAttributeUuid]] | ||
|- | |- | ||
| 0x18 || 0x2 || | | 0x18 || 0x2 || Handle | ||
|- | |- | ||
| 0x1A || | | 0x1A || 0x2 || | ||
|- | |- | ||
| | | 0x1C || 0x2 || InstanceId | ||
|- | |- | ||
| 0x20 || 0x1 || | | 0x1E || 0x2 || EndGroupHandle | ||
|- | |||
| 0x20 || 0x1 || PrimaryService flag | |||
|- | |- | ||
| 0x21 || 0x3 || Padding | | 0x21 || 0x3 || Padding | ||
Line 865: | Line 1,178: | ||
= GattCharacteristic = | = GattCharacteristic = | ||
This is "nn::btm::user::GattCharacteristic". This is a 0x24-byte struct. | 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 = | = GattDescriptor = | ||
This is "nn::btm::user::GattDescriptor". This is a 0x20-byte struct. | 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 = | = BleDataPath = | ||
Line 884: | Line 1,233: | ||
| 0x4 || 0x14 || [[Bluetooth_Driver_services#GattAttributeUuid|GattAttributeUuid]] | | 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]] |