Difference between revisions of "BTM services"
(→Cmd61) |
|||
Line 485: | Line 485: | ||
== SetTsiMode == | == SetTsiMode == | ||
Takes an input [[Bluetooth_Driver_services#Address|Address]] and a [[#TsiMode]], no output. | Takes an input [[Bluetooth_Driver_services#Address|Address]] 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 == |
Revision as of 05:14, 29 January 2021
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.
These btm services with BLE only allow connecting to devices which have a #GattService with a certain custom UUID present.
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.
GetState
No input, returns an output #BtmState.
GetHostDeviceProperty
No input, returns an output #HostDeviceProperty.
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.
SetBurstMode
Takes an input Address and a bool, no output.
SetSlotMode
Takes a type-0x19 input buffer containing a #DeviceSlotModeList, no output.
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.
AddDeviceInfo
Takes an input #DeviceInfo, no output.
RemoveDeviceInfo
Takes an input Address, no output.
IncreaseDeviceInfoOrder
Takes an input Address, no output.
LlrNotify
Takes an input Address, no output.
[9.0.0+] Takes an input Address and a s32, no output.
EnableRadio
No input/output.
DisableRadio
No input/output.
HidDisconnect
Takes an input Address, no output.
HidSetRetransmissionMode
Takes an input Address 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 Address 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.
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.
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.
StopBleScanForPaired
No input/output.
StartBleScanForSmartDevice
Takes a GattAttributeUuid, no output.
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 Address, no output.
An error is thrown if the Address 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 Address and a BleAdvertisePacketParameter, no output.
BleGetPairedAddresses
Takes a type-0xA output buffer containing an array of Address, 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.
This is used by hid at some point when there's new hid connections, leaving "Change Grip/Order" in the Controller_Applet with new connections also triggers it via hid at some point.
Sends a request which is then handled as follows:
- Goes through multiple arrays of Address.
- First array:
- Validates the Address with state, skipping it if not found.
- Calls the SetTsi wrapper func described below, with the above Address and tsi=0xFF (Exit). If this returns false, CloseHidConnection is used with the Address.
- Second array:
- Validates the Address with state, skipping it if not found.
- Uses 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 Address 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 Address and the above Tsi value. If this returns false, CloseHidConnection is used with the Address.
- It then goes through various arrays again for updating state.
- {...}
- First array:
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.
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.
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 |
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 Address, no output.
CancelBond
Takes an input Address, no output.
SetTsiMode
Takes an input Address 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 Address, no output.
GeneralGet
Takes an input u32 and a type-0x1A output buffer containing a 0x11-byte struct.
GetGattClientDisconnectionReason
Takes an input Address 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 | #GetRadioOnOff |
7 | [3.0.0+] #AcquireRadioEvent |
8 | [3.0.0+] #AcquireGamepadPairingEvent |
9 | [3.0.0+] #IsGamepadPairingStarted |
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.
GetRadioOnOff
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".
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 Address, 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 Address and a BleAdvertisePacketParameter, no output.
This is similar to the btm cmd.
BleGetPairedDevices
Takes a type-0xA output buffer containing an array of Address, 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.
BtmState
This is "nn::btm::BtmState". This is an u32 enum.
BluetoothMode
This is "nn::btm::BluetoothMode". This is an u32 enum.
WlanMode
This is "nn::btm::WlanMode". This is an u32 enum.
TsiMode
This is "nn::btm::TsiMode". This is an u32 enum.
HostDeviceProperty
This is "nn::btm::HostDeviceProperty". This is a 0x2A-byte struct.
Offset | Size | Description |
---|---|---|
0x0 | 0x9 | Same as AdapterProperty+0x0. |
0x9 | 0x1F | Same as AdapterProperty+0x9. |
0x28 | 0x1 | Always zero. |
0x29 | 0x1 | Same as AdapterProperty+0x102. |
DeviceSlotModeList
This is "nn::btm::DeviceSlotModeList". This is a 0x64-byte struct.
DeviceInfoList
This is "nn::btm::DeviceInfoList". This is a 0x3C4-byte struct.
Offset | Size | Description |
---|---|---|
0x0 | 0x1 | Total entries. |
0x1 | 0x3 | Padding |
0x4 | 0xA*60(0x3C0) | Array of #DeviceInfo. |
DeviceInfo
This is "nn::btm::DeviceInfo". This is a 0x60-byte struct.
DevicePropertyList
This is "nn::btm::DevicePropertyList". This is a 0x268-byte struct.
ZeroRetransmissionList
This is "nn::btm::ZeroRetransmissionList". This is a 0x11-byte struct.
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 |