Difference between revisions of "Bluetooth Driver services"

From Nintendo Switch Brew
Jump to navigation Jump to search
Line 10: Line 10:
 
Support for "nn::bluetooth::*" was added to sdknso with 6.x.
 
Support for "nn::bluetooth::*" was added to sdknso with 6.x.
  
btdrv appears to be designed to only be used by the two sysmodules which use it, hid and btm. This service uses global state, nothing service-session-specific.
+
btdrv appears to be designed to only be used by the two sysmodules which use it, [[HID_services|hid]] and [[BTM_services|btm]]. This service uses global state, nothing service-session-specific.
  
 
This has max_sessions 30. IPC handling is done by the main-thread.
 
This has max_sessions 30. IPC handling is done by the main-thread.
Line 237: Line 237:
 
No input, returns an output Event handle with EventClearMode=1.
 
No input, returns an output Event handle with EventClearMode=1.
  
This is used by btm, this should not be used by other processes.
+
This is used by [[BTM_services|btm]], this should not be used by other processes.
  
 
== EnableBluetooth ==
 
== EnableBluetooth ==
 
No input/output.
 
No input/output.
 +
 +
This is used by [[BTM_services|btm]].
  
 
== DisableBluetooth ==
 
== DisableBluetooth ==
 
No input/output.
 
No input/output.
 +
 +
This is used by [[BTM_services|btm]].
  
 
== FinalizeBluetooth ==
 
== FinalizeBluetooth ==
 
No input/output.
 
No input/output.
  
Not used by btm, other processes should not use this.
+
Not used by [[BTM_services|btm]], other processes should not use this.
  
 
== GetAdapterProperties ==
 
== GetAdapterProperties ==
 
Takes a type-0x1A output buffer containing an [[#AdapterProperty]].
 
Takes a type-0x1A output buffer containing an [[#AdapterProperty]].
 +
 +
This is used by [[BTM_services|btm]].
  
 
== GetAdapterProperty ==
 
== GetAdapterProperty ==
Line 261: Line 267:
 
== StartInquiry ==
 
== StartInquiry ==
 
No input/output.
 
No input/output.
 +
 +
This is used by [[BTM_services|btm]].
  
 
== StopInquiry ==
 
== StopInquiry ==
 
No input/output.
 
No input/output.
 +
 +
This is used by [[BTM_services|btm]].
  
 
== CreateBond ==
 
== CreateBond ==
Line 269: Line 279:
  
 
[9.0.0+] Now only takes an [[#Address]] and a [[#TransportType]] without a buffer, no output.
 
[9.0.0+] Now only takes an [[#Address]] and a [[#TransportType]] without a buffer, no output.
 +
 +
This is used by [[BTM_services|btm]].
  
 
== RemoveBond ==
 
== RemoveBond ==
 
Takes an input [[#Address]], no output.
 
Takes an input [[#Address]], no output.
 +
 +
This is used by [[BTM_services|btm]].
  
 
== CancelBond ==
 
== CancelBond ==
 
Takes an input [[#Address]], no output.
 
Takes an input [[#Address]], no output.
 +
 +
This is used by [[BTM_services|btm]].
  
 
== RespondToPinRequest ==
 
== RespondToPinRequest ==
Line 283: Line 299:
 
== RespondToSspRequest ==
 
== RespondToSspRequest ==
 
Takes an input [[#Address]], a [[#BluetoothSspVariant]], a bool, an u32, no output.
 
Takes an input [[#Address]], a [[#BluetoothSspVariant]], a bool, an u32, no output.
 +
 +
This is used by [[BTM_services|btm]].
  
 
== GetEventInfo ==
 
== GetEventInfo ==
Line 289: Line 307:
 
This copies 0x400-bytes from state to the output buffer, copies the [[#EventType]] from state to output, and signals an event.
 
This copies 0x400-bytes from state to the output buffer, copies the [[#EventType]] from state to output, and signals an event.
  
This is used by btm.
+
This is used by [[BTM_services|btm]].
  
 
== InitializeHid ==
 
== InitializeHid ==
Line 296: Line 314:
 
Originally sdknso used an user-specified value for the u16, however with [9.0.0+] it uses hard-coded value 0x1 instead.
 
Originally sdknso used an user-specified value for the u16, however with [9.0.0+] it uses hard-coded value 0x1 instead.
  
This is used by btm, this should not be used by other processes.
+
This is used by [[BTM_services|btm]], this should not be used by other processes.
  
 
== OpenHidConnection ==
 
== OpenHidConnection ==
Line 302: Line 320:
  
 
This just returns 0.
 
This just returns 0.
 +
 +
This is used by [[BTM_services|btm]].
  
 
== CloseHidConnection ==
 
== CloseHidConnection ==
 
Takes an input [[#Address]], no output.
 
Takes an input [[#Address]], no output.
 +
 +
This is used by [[BTM_services|btm]].
  
 
== HidSendData ==
 
== HidSendData ==
Line 311: Line 333:
 
== WriteHidData ==
 
== WriteHidData ==
 
Takes an input [[#Address]] and a type-0x19 input buffer containing a [[#HidReport]], no output.
 
Takes an input [[#Address]] and a type-0x19 input buffer containing a [[#HidReport]], no output.
 +
 +
This is used by [[HID_services|hid]].
  
 
== WriteHidData2 ==
 
== WriteHidData2 ==
Line 322: Line 346:
 
== SetHidReport ==
 
== SetHidReport ==
 
Takes an input [[#Address]], a [[#BluetoothHhReportType]], a type-0x19 input buffer containing a [[#HidReport]], no output.
 
Takes an input [[#Address]], a [[#BluetoothHhReportType]], a type-0x19 input buffer containing a [[#HidReport]], no output.
 +
 +
This is used by [[HID_services|hid]].
  
 
== GetHidReport ==
 
== GetHidReport ==
 
Takes an input [[#Address]], an u8, a [[#BluetoothHhReportType]], no output.
 
Takes an input [[#Address]], an u8, a [[#BluetoothHhReportType]], no output.
 +
 +
This is used by [[HID_services|hid]].
  
 
== HidWakeController ==
 
== HidWakeController ==
Line 331: Line 359:
 
== TriggerConnection ==
 
== TriggerConnection ==
 
Takes an input [[#Address]] and an u16, no output.
 
Takes an input [[#Address]] and an u16, no output.
 +
 +
This is used by [[BTM_services|btm]].
  
 
== AddPairedDeviceInfo ==
 
== AddPairedDeviceInfo ==
 
Takes a type-0x19 input buffer containing [[Settings_services#BluetoothDevicesSettings|BluetoothDevicesSettings]], no output.
 
Takes a type-0x19 input buffer containing [[Settings_services#BluetoothDevicesSettings|BluetoothDevicesSettings]], no output.
 +
 +
This is used by [[BTM_services|btm]].
  
 
== GetPairedDeviceInfo ==
 
== GetPairedDeviceInfo ==
 
Takes an input [[#Address]] and a type-0x1A output buffer containing [[Settings_services#BluetoothDevicesSettings|BluetoothDevicesSettings]].
 
Takes an input [[#Address]] and a type-0x1A output buffer containing [[Settings_services#BluetoothDevicesSettings|BluetoothDevicesSettings]].
 +
 +
This is used by [[BTM_services|btm]].
  
 
== FinalizeHid ==
 
== FinalizeHid ==
 
No input/output.
 
No input/output.
  
Not used by btm, other processes should not use this.
+
Not used by [[BTM_services|btm]], other processes should not use this.
  
 
== GetHidEventInfo ==
 
== GetHidEventInfo ==
Line 347: Line 381:
  
 
This copies 0x480-bytes from state to the output buffer. [[#HidEventType]] is set to: stateval!=0 ? 7 : 0. Once finished, this signals an event.
 
This copies 0x480-bytes from state to the output buffer. [[#HidEventType]] is set to: stateval!=0 ? 7 : 0. Once finished, this signals an event.
 +
 +
This is used by [[BTM_services|btm]].
  
 
== SetTsi ==
 
== SetTsi ==
 
Takes an input [[#Address]] and an u8, no output.
 
Takes an input [[#Address]] and an u8, no output.
 +
 +
This is used by [[BTM_services|btm]].
  
 
== EnableBurstMode ==
 
== EnableBurstMode ==
 
Takes an input [[#Address]] and a bool, no output.
 
Takes an input [[#Address]] and a bool, no output.
 +
 +
This is used by [[BTM_services|btm]].
  
 
== SetZeroRetransmission ==
 
== SetZeroRetransmission ==
Line 359: Line 399:
 
The entry-count is clamped to a maximum of 5, the count can be 0.
 
The entry-count is clamped to a maximum of 5, the count can be 0.
  
This is used by btm.
+
This is used by [[BTM_services|btm]].
  
 
== EnableMcMode ==
 
== EnableMcMode ==
 
Takes an input bool, no output.
 
Takes an input bool, no output.
 +
 +
This is used by [[BTM_services|btm]].
  
 
== EnableLlrScan ==
 
== EnableLlrScan ==
 
No input/output.
 
No input/output.
 +
 +
This is used by [[BTM_services|btm]].
  
 
== DisableLlrScan ==
 
== DisableLlrScan ==
 
No input/output.
 
No input/output.
 +
 +
This is used by [[BTM_services|btm]].
  
 
== EnableRadio ==
 
== EnableRadio ==
 
Takes an input bool, no output.
 
Takes an input bool, no output.
 +
 +
This is used by [[BTM_services|btm]].
  
 
== SetVisibility ==
 
== SetVisibility ==
 
Takes two input bools, no output.
 
Takes two input bools, no output.
 +
 +
This is used by [[BTM_services|btm]].
  
 
== EnableTbfcScan ==
 
== EnableTbfcScan ==
 
Takes an input bool, no output.
 
Takes an input bool, no output.
 +
 +
This is used by [[BTM_services|btm]].
  
 
== RegisterHidReportEvent ==
 
== RegisterHidReportEvent ==
Line 383: Line 435:
  
 
This gets the Event handle for a previously created Event.
 
This gets the Event handle for a previously created Event.
 +
 +
This is used by [[HID_services|hid]].
  
 
== GetHidReportEventInfo ==
 
== GetHidReportEventInfo ==
Line 392: Line 446:
  
 
The [7.0.0+] GetHidReportEventInfo sdknso func loads data using the above sharedmem.
 
The [7.0.0+] GetHidReportEventInfo sdknso func loads data using the above sharedmem.
 +
 +
This is used by [[HID_services|hid]].
  
 
== GetLatestPlr ==
 
== GetLatestPlr ==
Line 398: Line 454:
 
== GetPendingConnections ==
 
== GetPendingConnections ==
 
No input/output.
 
No input/output.
 +
 +
This is used by [[BTM_services|btm]].
  
 
== GetChannelMap ==
 
== GetChannelMap ==
Line 418: Line 476:
 
== InitializeBle ==
 
== InitializeBle ==
 
No input, returns an output Event handle with EventClearMode=1.
 
No input, returns an output Event handle with EventClearMode=1.
 +
 +
This is used by [[BTM_services|btm]].
  
 
== EnableBle ==
 
== EnableBle ==
 
No input/output.
 
No input/output.
 +
 +
This is used by [[BTM_services|btm]].
  
 
== DisableBle ==
 
== DisableBle ==
 
No input/output.
 
No input/output.
 +
 +
This is used by [[BTM_services|btm]].
  
 
== FinalizeBle ==
 
== FinalizeBle ==
Line 436: Line 500:
 
== SetBleConnectionParameter ==
 
== SetBleConnectionParameter ==
 
Takes an input [[#Address]], a bool, a [[#BleConnectionParameter]], no output.
 
Takes an input [[#Address]], a bool, a [[#BleConnectionParameter]], no output.
 +
 +
This is used by [[BTM_services|btm]].
  
 
== SetLeDefaultConnectionParameter ==
 
== SetLeDefaultConnectionParameter ==
Line 442: Line 508:
 
== SetBleDefaultConnectionParameter ==
 
== SetBleDefaultConnectionParameter ==
 
Takes a [[#BleConnectionParameter]], no output.
 
Takes a [[#BleConnectionParameter]], no output.
 +
 +
This is used by [[BTM_services|btm]].
  
 
== SetBleAdvertiseData ==
 
== SetBleAdvertiseData ==
Line 451: Line 519:
 
== StartBleScan ==
 
== StartBleScan ==
 
No input/output.
 
No input/output.
 +
 +
This is used by [[BTM_services|btm]].
  
 
== StopBleScan ==
 
== StopBleScan ==
 
No input/output.
 
No input/output.
 +
 +
This is used by [[BTM_services|btm]].
  
 
== AddBleScanFilterCondition ==
 
== AddBleScanFilterCondition ==
 
Takes a type-0x19 input buffer containing a [[#BleAdvertiseFilter]], no output.
 
Takes a type-0x19 input buffer containing a [[#BleAdvertiseFilter]], no output.
 +
 +
This is used by [[BTM_services|btm]].
  
 
== DeleteBleScanFilterCondition ==
 
== DeleteBleScanFilterCondition ==
 
Takes a type-0x19 input buffer containing a [[#BleAdvertiseFilter]], no output.
 
Takes a type-0x19 input buffer containing a [[#BleAdvertiseFilter]], no output.
 +
 +
This is used by [[BTM_services|btm]].
  
 
== DeleteBleScanFilter ==
 
== DeleteBleScanFilter ==
Line 468: Line 544:
 
== ClearBleScanFilters ==
 
== ClearBleScanFilters ==
 
No input/output.
 
No input/output.
 +
 +
This is used by [[BTM_services|btm]].
  
 
== EnableBleScanFilter ==
 
== EnableBleScanFilter ==
 
Takes an input bool, no output.
 
Takes an input bool, no output.
 +
 +
This is used by [[BTM_services|btm]].
  
 
== RegisterGattClient ==
 
== RegisterGattClient ==
 
Takes an input [[#GattAttributeUuid]], no output.
 
Takes an input [[#GattAttributeUuid]], no output.
 +
 +
This is used by [[BTM_services|btm]].
  
 
== UnregisterGattClient ==
 
== UnregisterGattClient ==
Line 483: Line 565:
 
== ConnectGattServer ==
 
== ConnectGattServer ==
 
Takes an input u8, an [[#Address]], a bool, an [[Applet_Manager_services#AppletResourceUserId|AppletResourceUserId]], no output.
 
Takes an input u8, an [[#Address]], a bool, an [[Applet_Manager_services#AppletResourceUserId|AppletResourceUserId]], no output.
 +
 +
This is used by [[BTM_services|btm]].
  
 
== CancelConnectGattServer ==
 
== CancelConnectGattServer ==
 
Takes an input u8, an [[#Address]], a bool, no output.
 
Takes an input u8, an [[#Address]], a bool, no output.
 +
 +
This is used by [[BTM_services|btm]].
  
 
== DisconnectGattServer ==
 
== DisconnectGattServer ==
 
Takes an input u32, no output.
 
Takes an input u32, no output.
 +
 +
This is used by [[BTM_services|btm]].
  
 
== GetGattAttribute ==
 
== GetGattAttribute ==
Line 500: Line 588:
 
== ConfigureAttMtu ==
 
== ConfigureAttMtu ==
 
Takes an input u16 and u32, no output.
 
Takes an input u16 and u32, no output.
 +
 +
This is used by [[BTM_services|btm]].
  
 
== RegisterGattServer ==
 
== RegisterGattServer ==
Line 534: Line 624:
  
 
This copies 0x400-bytes from state to the output buffer, and copies the [[#BleEventType]] from state to output.
 
This copies 0x400-bytes from state to the output buffer, and copies the [[#BleEventType]] from state to output.
 +
 +
This is used by [[BTM_services|btm]].
  
 
== GetGattFirstCharacteristic ==
 
== GetGattFirstCharacteristic ==
Line 549: Line 641:
 
== RegisterGattManagedDataPath ==
 
== RegisterGattManagedDataPath ==
 
Takes an input [[#GattAttributeUuid]], no output.
 
Takes an input [[#GattAttributeUuid]], no output.
 +
 +
This is used by [[BTM_services|btm]].
  
 
== UnregisterGattManagedDataPath ==
 
== UnregisterGattManagedDataPath ==
Line 555: Line 649:
 
== RegisterGattHidDataPath ==
 
== RegisterGattHidDataPath ==
 
Takes an input [[#GattAttributeUuid]], no output.
 
Takes an input [[#GattAttributeUuid]], no output.
 +
 +
This is used by [[BTM_services|btm]].
  
 
== UnregisterGattHidDataPath ==
 
== UnregisterGattHidDataPath ==
 
Takes an input [[#GattAttributeUuid]], no output.
 
Takes an input [[#GattAttributeUuid]], no output.
 +
 +
This is used by [[BTM_services|btm]].
  
 
== RegisterGattDataPath ==
 
== RegisterGattDataPath ==
 
Takes an input [[#GattAttributeUuid]], no output.
 
Takes an input [[#GattAttributeUuid]], no output.
 +
 +
This is used by [[BTM_services|btm]].
  
 
== UnregisterGattDataPath ==
 
== UnregisterGattDataPath ==
 
Takes an input [[#GattAttributeUuid]], no output.
 
Takes an input [[#GattAttributeUuid]], no output.
 +
 +
This is used by [[BTM_services|btm]].
  
 
== ReadGattCharacteristic ==
 
== ReadGattCharacteristic ==
 
Takes an input bool, an u8, an u32, a [[#GattId]], a [[#GattId]], no output.
 
Takes an input bool, an u8, an u32, a [[#GattId]], a [[#GattId]], no output.
 +
 +
This is used by [[HID_services|hid]] and [[BTM_services|btm]].
  
 
== ReadGattDescriptor ==
 
== ReadGattDescriptor ==
 
Takes an input bool, an u8, an u32, a [[#GattId]], a [[#GattId]], a [[#GattId]], no output.
 
Takes an input bool, an u8, an u32, a [[#GattId]], a [[#GattId]], a [[#GattId]], no output.
 +
 +
This is used by [[HID_services|hid]].
  
 
== WriteGattCharacteristic ==
 
== WriteGattCharacteristic ==
Line 575: Line 681:
  
 
The buffer size must be <=0x258.
 
The buffer size must be <=0x258.
 +
 +
This is used by [[HID_services|hid]] and [[BTM_services|btm]].
  
 
== WriteGattDescriptor ==
 
== WriteGattDescriptor ==
Line 580: Line 688:
  
 
The buffer size must be <=0x258.
 
The buffer size must be <=0x258.
 +
 +
This is used by [[HID_services|hid]] and [[BTM_services|btm]].
  
 
== RegisterGattNotification ==
 
== RegisterGattNotification ==
 
Takes an input bool, an u32, a [[#GattId]], a [[#GattId]], no output.
 
Takes an input bool, an u32, a [[#GattId]], a [[#GattId]], no output.
 +
 +
This is used by [[HID_services|hid]] and [[BTM_services|btm]].
  
 
== UnregisterGattNotification ==
 
== UnregisterGattNotification ==
 
Takes an input bool, an u32, a [[#GattId]], a [[#GattId]], no output.
 
Takes an input bool, an u32, a [[#GattId]], a [[#GattId]], no output.
 +
 +
This is used by [[HID_services|hid]].
  
 
== GetLeHidEventInfo ==
 
== GetLeHidEventInfo ==
Line 591: Line 705:
  
 
This copies 0x400-bytes from state to the output buffer, and copies the [[#BleEventType]] from state to output. This also resets the state which was used for the outbuf-copy. Once finished, this signals an event.
 
This copies 0x400-bytes from state to the output buffer, and copies the [[#BleEventType]] from state to output. This also resets the state which was used for the outbuf-copy. Once finished, this signals an event.
 +
 +
This is used by [[HID_services|hid]].
  
 
== RegisterBleHidEvent ==
 
== RegisterBleHidEvent ==
 
No input, returns an output Event handle with EventClearMode=1.
 
No input, returns an output Event handle with EventClearMode=1.
 +
 +
This is used by [[HID_services|hid]].
  
 
== SetBleScanParameter ==
 
== SetBleScanParameter ==
 
Takes two input u16s, no output.
 
Takes two input u16s, no output.
 +
 +
This is used by [[BTM_services|btm]].
  
 
== MoveToSecondaryPiconet ==
 
== MoveToSecondaryPiconet ==
Line 603: Line 723:
 
== IsManufacturingMode ==
 
== IsManufacturingMode ==
 
No input, returns an output bool.
 
No input, returns an output bool.
 +
 +
This is used by [[BTM_services|btm]].
  
 
== EmulateBluetoothCrash ==
 
== EmulateBluetoothCrash ==

Revision as of 02:42, 19 July 2020

btdrv

This is "nn::bluetooth::IBluetoothDriver".

The bluetooth driver implements the bluetooth protocol over h4/uart.

It interfaces with the uart service to actually talk with the bluetooth hardware.

The code seems to be derived from a broadcom stack. A good starting point for similar source code can be found in the MICO project: https://github.com/yinhongxing/mico/tree/ea67ff3659f12d730d4dc3b8d547b093bd2ee2ee/MICO/bluetooth_bte Note that the library files contain many (symbolized) functions which match btdrv.

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

btdrv appears to be designed to only be used by the two sysmodules which use it, hid and btm. This service uses global state, nothing service-session-specific.

This has max_sessions 30. IPC handling is done by the main-thread.

Cmd Name
0 #InitializeBluetoothDriver
1 #InitializeBluetooth
2 #EnableBluetooth
3 #DisableBluetooth
4 #FinalizeBluetooth ([?-8.1.1] CleanupBluetooth)
5 #GetAdapterProperties
6 #GetAdapterProperty
7 #SetAdapterProperty
8 #StartInquiry ([?-8.1.1] StartDiscovery)
9 #StopInquiry ([?-8.1.1] CancelDiscovery)
10 #CreateBond
11 #RemoveBond
12 #CancelBond
13 #RespondToPinRequest ([?-8.1.1] PinReply)
14 #RespondToSspRequest ([?-8.1.1] SspReply)
15 #GetEventInfo
16 #InitializeHid
17 #OpenHidConnection ([?-8.1.1] HidConnect)
18 #CloseHidConnection ([?-8.1.1] HidDisconnect)
19 #WriteHidData ([?-8.1.1] HidSendData)
20 #WriteHidData2 ([?-8.1.1] HidSendData2)
21 #SetHidReport ([?-8.1.1] #HidSetReport)
22 #GetHidReport ([?-8.1.1] HidGetReport)
23 #TriggerConnection ([?-8.1.1] #HidWakeController)
24 #AddPairedDeviceInfo ([?-8.1.1] HidAddPairedDevice)
25 #GetPairedDeviceInfo ([?-8.1.1] HidGetPairedDevice)
26 #FinalizeHid ([?-8.1.1] CleanupHid)
27 #GetHidEventInfo ([?-8.1.1] HidGetEventInfo)
28 #SetTsi ([?-8.1.1]] ExtSetTsi)
29 #EnableBurstMode ([?-8.1.1] ExtSetBurstMode)
30 #SetZeroRetransmission ([?-8.1.1] ExtSetZeroRetran)
31 #EnableMcMode ([?-8.1.1] ExtSetMcMode)
32 #EnableLlrScan ([?-8.1.1] ExtStartLlrMode)
33 #DisableLlrScan ([?-8.1.1] ExtExitLlrMode)
34 #EnableRadio ([?-8.1.1] ExtSetRadio)
35 #SetVisibility ([?-8.1.1] ExtSetVisibility)
36 #EnableTbfcScan ([?-8.1.1] ExtSetTbfcScan)
37 #RegisterHidReportEvent
38 #GetHidReportEventInfo ([?-8.1.1] HidGetReportEventInfo)
39 #GetLatestPlr
40 [3.0.0+] #GetPendingConnections ([?-8.1.1] ExtGetPendingConnections)
41 [3.0.0+] #GetChannelMap
42 [3.0.0+] #EnableTxPowerBoostSetting ([?-8.1.1] EnableBluetoothBoostSetting)
43 [3.0.0+] #IsTxPowerBoostSettingEnabled ([?-8.1.1] IsBluetoothBoostSettingEnabled)
44 [3.0.0+] #EnableAfhSetting ([?-8.1.1] EnableBluetoothAfhSetting)
45 #IsAfhSettingEnabled ([?-8.1.1] IsBluetoothAfhSettingEnabled)
46 [5.0.0+] #InitializeBle ([5.0.0-8.1.1] InitializeBluetoothLe)
47 [5.0.0+] #EnableBle ([5.0.0-8.1.1] EnableBluetoothLe)
48 [5.0.0+] #DisableBle ([5.0.0-8.1.1] DisableBluetoothLe)
49 [5.0.0+] #FinalizeBle ([5.0.0-8.1.1] CleanupBluetoothLe)
50 [5.0.0+] #SetBleVisibility ([5.0.0-8.1.1] SetLeVisibility)
51 [5.0.0+] #SetBleConnectionParameter ([5.0.0-8.1.1] #SetLeConnectionParameter)
52 [5.0.0+] #SetBleDefaultConnectionParameter ([5.0.0-8.1.1] #SetLeDefaultConnectionParameter)
53 [5.0.0+] #SetBleAdvertiseData ([5.0.0-8.1.1] SetLeAdvertiseData)
54 [5.0.0+] #SetBleAdvertiseParameter ([5.0.0-8.1.1] SetLeAdvertiseParameter)
55 [5.0.0+] #StartBleScan ([5.0.0-8.1.1] StartLeScan)
56 [5.0.0+] #StopBleScan ([5.0.0-8.1.1] StopLeScan)
57 [5.0.0+] #AddBleScanFilterCondition ([5.0.0-8.1.1] AddLeScanFilterCondition)
58 [5.0.0+] #DeleteBleScanFilterCondition ([5.0.0-8.1.1] DeleteLeScanFilterCondition)
59 [5.0.0+] #DeleteBleScanFilter ([5.0.0-8.1.1] DeleteLeScanFilter)
60 [5.0.0+] #ClearBleScanFilters ([5.0.0-8.1.1] ClearLeScanFilters)
61 [5.0.0+] #EnableBleScanFilter ([5.0.0-8.1.1] EnableLeScanFilter)
62 [5.0.0+] #RegisterGattClient ([5.0.0-8.1.1] RegisterLeClient)
63 [5.0.0+] #UnregisterGattClient ([5.0.0-8.1.1] UnregisterLeClient)
64 [5.0.0+] #UnregisterAllGattClients ([5.0.0-8.1.1] UnregisterLeClientAll)
65 [5.0.0+] #ConnectGattServer ([5.0.0-8.1.1] LeClientConnect)
66 [5.1.0+] #CancelConnectGattServer ([5.1.0-8.1.1] LeClientCancelConnection)
67 ([5.0.0-5.0.2] 66) #DisconnectGattServer ([?-8.1.1] LeClientCancelConnection)
68 ([5.0.0-5.0.2] 67) [5.0.0+] #GetGattAttribute ([5.0.0-8.1.1] LeClientGetAttributes)
69 ([5.0.0-5.0.2] 68) [5.0.0+] #GetGattService ([5.0.0-8.1.1] LeClientDiscoverService)
70 ([5.0.0-5.0.2] 69) [5.0.0+] #ConfigureAttMtu ([5.0.0-8.1.1] LeClientConfigureMtu)
71 ([5.0.0-5.0.2] 70) [5.0.0+] #RegisterGattServer ([5.0.0-8.1.1] RegisterLeServer)
72 ([5.0.0-5.0.2] 71) [5.0.0+] #UnregisterGattServer ([5.0.0-8.1.1] UnregisterLeServer)
73 ([5.0.0-5.0.2] 72) [5.0.0+] #ConnectGattClient ([5.0.0-8.1.1] LeServerConnect)
74 ([5.0.0-5.0.2] 73) [5.0.0+] #DisconnectGattClient ([5.0.0-8.1.1] #LeServerDisconnect)
75 [5.0.0+] #AddGattService ([5.0.0-8.1.1] CreateLeService)
76 ([5.0.0-5.0.2] 74) [5.0.0+] #EnableGattService ([5.0.0-8.1.1] StartLeService)
77 [5.0.0+] #AddGattCharacteristic ([5.0.0-8.1.1] AddLeCharacteristic)
78 ([5.0.0-5.0.2] 76) [5.0.0+] #AddGattDescriptor ([5.0.0-8.1.1] AddLeDescriptor)
79 ([5.0.0-5.0.2] 78) [5.0.0+] #GetBleManagedEventInfo ([5.0.0-8.1.1] GetLeCoreEventInfo)
80 ([5.0.0-5.0.2] 79) [5.0.0+] #GetGattFirstCharacteristic ([5.0.0-8.1.1] LeGetFirstCharacteristic)
81 ([5.0.0-5.0.2] 80) [5.0.0+] #GetGattNextCharacteristic ([5.0.0-8.1.1] LeGetNextCharacteristic)
82 ([5.0.0-5.0.2] 81) [5.0.0+] #GetGattFirstDescriptor ([5.0.0-8.1.1] LeGetFirstDescriptor)
83 ([5.0.0-5.0.2] 82) [5.0.0+] #GetGattNextDescriptor ([5.0.0-8.1.1] LeGetNextDescriptor)
84 [5.0.0+] #RegisterGattManagedDataPath ([5.0.0-8.1.1] RegisterLeCoreDataPath)
85 [5.0.0+] #UnregisterGattManagedDataPath ([5.0.0-8.1.1] UnregisterLeCoreDataPath)
86 [5.0.0+] #RegisterGattHidDataPath ([5.0.0-8.1.1] RegisterLeHidDataPath)
87 [5.0.0+] #UnregisterGattHidDataPath ([5.0.0-8.1.1] UnregisterLeHidDataPath)
88 [5.0.0+] #RegisterGattDataPath ([5.0.0-8.1.1] RegisterLeDataPath)
89 ([5.0.0-5.0.2] 83) [5.0.0+] #UnregisterGattDataPath ([5.0.0-8.1.1] UnregisterLeDataPath)
90 ([5.0.0-5.0.2] 89) [5.0.0+] #ReadGattCharacteristic ([5.0.0-8.1.1] LeClientReadCharacteristic)
91 ([5.0.0-5.0.2] 90) [5.0.0+] #ReadGattDescriptor ([5.0.0-8.1.1] LeClientReadDescriptor)
92 ([5.0.0-5.0.2] 91) [5.0.0+] #WriteGattCharacteristic ([5.0.0-8.1.1] LeClientWriteCharacteristic)
93 ([5.0.0-5.0.2] 92) [5.0.0+] #WriteGattDescriptor ([5.0.0-8.1.1] LeClientWriteDescriptor)
94 [5.0.0+] #RegisterGattNotification ([5.0.0-8.1.1] LeClientRegisterNotification)
95 ([5.0.0-5.0.2] 93) [5.0.0+] #UnregisterGattNotification ([5.0.0-8.1.1] LeClientDeregisterNotification)
96 ([5.0.0-5.0.2] 95) [5.0.0+] #GetLeHidEventInfo
97 ([5.0.0-5.0.2] 96) [5.0.0+] #RegisterBleHidEvent
98 [5.1.0+] #SetBleScanParameter ([5.1.0-8.1.1] SetLeScanParameter)
99 [10.0.0+] #MoveToSecondaryPiconet
256 [5.0.0+] #IsManufacturingMode
257 [7.0.0+] #EmulateBluetoothCrash
258 [9.0.0+] #GetBleChannelMap

Various cmdids were moved with [4.0.0+] and [5.0.0+].

InitializeBluetoothDriver

No input/output.

This is the first cmd used during service init.

This just returns 0.

InitializeBluetooth

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

This is used by btm, this should not be used by other processes.

EnableBluetooth

No input/output.

This is used by btm.

DisableBluetooth

No input/output.

This is used by btm.

FinalizeBluetooth

No input/output.

Not used by btm, other processes should not use this.

GetAdapterProperties

Takes a type-0x1A output buffer containing an #AdapterProperty.

This is used by btm.

GetAdapterProperty

Takes an input #BluetoothPropertyType and a type-0xA output buffer.

SetAdapterProperty

Takes an input #BluetoothPropertyType and a type-0x9 input buffer.

StartInquiry

No input/output.

This is used by btm.

StopInquiry

No input/output.

This is used by btm.

CreateBond

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

[9.0.0+] Now only takes an #Address and a #TransportType without a buffer, no output.

This is used by btm.

RemoveBond

Takes an input #Address, no output.

This is used by btm.

CancelBond

Takes an input #Address, no output.

This is used by btm.

RespondToPinRequest

Takes an input #Address, a bool, an u8, a #BluetoothPinCode, no output.

sdknso uses an user-specified s32 for the u8.

RespondToSspRequest

Takes an input #Address, a #BluetoothSspVariant, a bool, an u32, no output.

This is used by btm.

GetEventInfo

Takes a type-0xA output buffer and returns an output #EventType.

This copies 0x400-bytes from state to the output buffer, copies the #EventType from state to output, and signals an event.

This is used by btm.

InitializeHid

Takes an input u16, returns an output Event with EventClearMode=1.

Originally sdknso used an user-specified value for the u16, however with [9.0.0+] it uses hard-coded value 0x1 instead.

This is used by btm, this should not be used by other processes.

OpenHidConnection

Takes an input #Address, no output.

This just returns 0.

This is used by btm.

CloseHidConnection

Takes an input #Address, no output.

This is used by btm.

HidSendData

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

WriteHidData

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

This is used by hid.

WriteHidData2

Takes an input #Address and a type-0x9 input buffer, no output.

This is internally the same as #WriteHidData, with the input buffer being directly passed to the funcptr instead of a tmp copy of the input #HidReport.

HidSetReport

Takes an input #Address, a #BluetoothHhReportType, a type-0x19 input buffer containing a #HidData, no output.

SetHidReport

Takes an input #Address, a #BluetoothHhReportType, a type-0x19 input buffer containing a #HidReport, no output.

This is used by hid.

GetHidReport

Takes an input #Address, an u8, a #BluetoothHhReportType, no output.

This is used by hid.

HidWakeController

Takes an input #Address, no output.

TriggerConnection

Takes an input #Address and an u16, no output.

This is used by btm.

AddPairedDeviceInfo

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

This is used by btm.

GetPairedDeviceInfo

Takes an input #Address and a type-0x1A output buffer containing BluetoothDevicesSettings.

This is used by btm.

FinalizeHid

No input/output.

Not used by btm, other processes should not use this.

GetHidEventInfo

Takes a type-0xA output buffer, returns an output #HidEventType.

This copies 0x480-bytes from state to the output buffer. #HidEventType is set to: stateval!=0 ? 7 : 0. Once finished, this signals an event.

This is used by btm.

SetTsi

Takes an input #Address and an u8, no output.

This is used by btm.

EnableBurstMode

Takes an input #Address and a bool, no output.

This is used by btm.

SetZeroRetransmission

Takes an input #Address and a type-0x9 input buffer containing an array of u8s, no output.

The entry-count is clamped to a maximum of 5, the count can be 0.

This is used by btm.

EnableMcMode

Takes an input bool, no output.

This is used by btm.

EnableLlrScan

No input/output.

This is used by btm.

DisableLlrScan

No input/output.

This is used by btm.

EnableRadio

Takes an input bool, no output.

This is used by btm.

SetVisibility

Takes two input bools, no output.

This is used by btm.

EnableTbfcScan

Takes an input bool, no output.

This is used by btm.

RegisterHidReportEvent

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

This gets the Event handle for a previously created Event.

This is used by hid.

GetHidReportEventInfo

No input, takes a type-0xA output buffer and returns a #HidEventType.

[7.0.0+] No longer takes a buffer or returns output, now returns an output sharedmem handle. sdknso maps this with size=0x3000 and permissions=RW-.

Originally this was used in a dedicated sdknso func, with [7.0.0+] this is now used at the start of the sdknso impl for #RegisterHidReportEvent if the above sharedmem was not mapped yet.

The [7.0.0+] GetHidReportEventInfo sdknso func loads data using the above sharedmem.

This is used by hid.

GetLatestPlr

Takes a type-0x16 output buffer containing a #PlrList ([1.0.0-8.1.1] #PlrStatistics).

GetPendingConnections

No input/output.

This is used by btm.

GetChannelMap

Takes a type-0x16 output buffer containing a #ChannelMapList.

EnableTxPowerBoostSetting

Takes an input bool, no output.

IsTxPowerBoostSettingEnabled

No input, returns an output bool.

sdknso sets the tmpout_bool to 1, and uses that with the cmd. The sdknso func directly returns tmpout_bool, errors from the cmd are ignored.

EnableAfhSetting

Takes an input bool, no output.

IsAfhSettingEnabled

sdknso sets the tmpout_bool to 1, and uses that with the cmd. The sdknso func directly returns tmpout_bool, errors from the cmd are ignored.

InitializeBle

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

This is used by btm.

EnableBle

No input/output.

This is used by btm.

DisableBle

No input/output.

This is used by btm.

FinalizeBle

No input/output.

SetBleVisibility

Takes two input bools, no output.

SetLeConnectionParameter

Takes a #LeConnectionParams, no output.

SetBleConnectionParameter

Takes an input #Address, a bool, a #BleConnectionParameter, no output.

This is used by btm.

SetLeDefaultConnectionParameter

Takes a #LeConnectionParams, no output.

SetBleDefaultConnectionParameter

Takes a #BleConnectionParameter, no output.

This is used by btm.

SetBleAdvertiseData

Takes an input #BleAdvertisePacketData, no output.

SetBleAdvertiseParameter

Takes an input #Address, two u16s, no output.

StartBleScan

No input/output.

This is used by btm.

StopBleScan

No input/output.

This is used by btm.

AddBleScanFilterCondition

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

This is used by btm.

DeleteBleScanFilterCondition

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

This is used by btm.

DeleteBleScanFilter

Takes an input u8, no output.

Originally the sdknso func used an u8 for the user-specified param, with [9.0.0+] it's a s32.

ClearBleScanFilters

No input/output.

This is used by btm.

EnableBleScanFilter

Takes an input bool, no output.

This is used by btm.

RegisterGattClient

Takes an input #GattAttributeUuid, no output.

This is used by btm.

UnregisterGattClient

Takes an input u8, no output.

UnregisterAllGattClients

No input/output.

ConnectGattServer

Takes an input u8, an #Address, a bool, an AppletResourceUserId, no output.

This is used by btm.

CancelConnectGattServer

Takes an input u8, an #Address, a bool, no output.

This is used by btm.

DisconnectGattServer

Takes an input u32, no output.

This is used by btm.

GetGattAttribute

Takes an #Address and an u32, no output.

[9.0.0+] Now takes an input u32, no output.

GetGattService

Takes an input u32 and a #GattAttributeUuid, no output.

ConfigureAttMtu

Takes an input u16 and u32, no output.

This is used by btm.

RegisterGattServer

Takes an input #GattAttributeUuid, no output.

UnregisterGattServer

Takes an input u8, no output.

ConnectGattClient

Takes an input u8, an #Address, a bool, no output.

LeServerDisconnect

Takes an input u8, an #Address, no output.

DisconnectGattClient

Takes an input u8, no output.

AddGattService

Takes an input u8, an u8, a bool, a #GattAttributeUuid, no output.

Originally sdknso used an user-specified u8 for the second u8, with [9.0.0+] that func param is now a s32.

EnableGattService

Takes an input u8, a #GattAttributeUuid, no output.

AddGattCharacteristic

Takes an input u8, an u8, an u16, a #GattAttributeUuid, a #GattAttributeUuid, no output.

AddGattDescriptor

Takes an input u8, an u16, a #GattAttributeUuid, a #GattAttributeUuid, no output.

GetBleManagedEventInfo

Takes a type-0xA output buffer, returns an output #BleEventType.

This copies 0x400-bytes from state to the output buffer, and copies the #BleEventType from state to output.

This is used by btm.

GetGattFirstCharacteristic

Takes an input bool, an u32, a #GattId, a #GattAttributeUuid, returns an output u8 and #GattId.

GetGattNextCharacteristic

Takes an input bool, an u32, a #GattId, a #GattId, a #GattAttributeUuid, returns an output u8 and #GattId.

GetGattFirstDescriptor

Takes an input bool, an u32, a #GattId, a #GattId, a #GattAttributeUuid, returns an output #GattId.

GetGattNextDescriptor

Takes an input bool, an u32, a #GattId, a #GattId, a #GattId, a #GattAttributeUuid, returns an output #GattId.

RegisterGattManagedDataPath

Takes an input #GattAttributeUuid, no output.

This is used by btm.

UnregisterGattManagedDataPath

Takes an input #GattAttributeUuid, no output.

RegisterGattHidDataPath

Takes an input #GattAttributeUuid, no output.

This is used by btm.

UnregisterGattHidDataPath

Takes an input #GattAttributeUuid, no output.

This is used by btm.

RegisterGattDataPath

Takes an input #GattAttributeUuid, no output.

This is used by btm.

UnregisterGattDataPath

Takes an input #GattAttributeUuid, no output.

This is used by btm.

ReadGattCharacteristic

Takes an input bool, an u8, an u32, a #GattId, a #GattId, no output.

This is used by hid and btm.

ReadGattDescriptor

Takes an input bool, an u8, an u32, a #GattId, a #GattId, a #GattId, no output.

This is used by hid.

WriteGattCharacteristic

Takes a type-0x9 input buffer, a bool, an u8, a bool, an u32, a #GattId, a #GattId, no output.

The buffer size must be <=0x258.

This is used by hid and btm.

WriteGattDescriptor

Takes a type-0x9 input buffer, a bool, an u8, an u32, a #GattId, a #GattId, a #GattId, no output.

The buffer size must be <=0x258.

This is used by hid and btm.

RegisterGattNotification

Takes an input bool, an u32, a #GattId, a #GattId, no output.

This is used by hid and btm.

UnregisterGattNotification

Takes an input bool, an u32, a #GattId, a #GattId, no output.

This is used by hid.

GetLeHidEventInfo

Takes a type-0xA output buffer, returns an output #BleEventType.

This copies 0x400-bytes from state to the output buffer, and copies the #BleEventType from state to output. This also resets the state which was used for the outbuf-copy. Once finished, this signals an event.

This is used by hid.

RegisterBleHidEvent

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

This is used by hid.

SetBleScanParameter

Takes two input u16s, no output.

This is used by btm.

MoveToSecondaryPiconet

Takes an input #Address, no output.

IsManufacturingMode

No input, returns an output bool.

This is used by btm.

EmulateBluetoothCrash

Takes an input #FatalReason, no output.

sdknso masks the FatalReason with an u16-mask before passing it to the cmd.

GetBleChannelMap

Takes a type-0x16 output buffer containing a #ChannelMapList.

bt

This is "nn::bluetooth::IBluetoothUser".

This has max_sessions 30. IPC handling is done by the main-thread.

Cmd Name
0 #LeClientReadCharacteristic
1 #LeClientReadDescriptor
2 #LeClientWriteCharacteristic
3 #LeClientWriteDescriptor
4 #LeClientRegisterNotification
5 #LeClientDeregisterNotification
6 #SetLeResponse
7 #LeSendIndication
8 #GetLeEventInfo
9 #RegisterBleEvent

LeClientReadCharacteristic

Takes a PID, a bool, an u8, an u32, a #GattId, a #GattId, an AppletResourceUserId, no output.

This is essentially the same as #ReadGattCharacteristic, the AppletResourceUserId is unused.

LeClientReadDescriptor

Takes a PID, a bool, an u8, an u32, a #GattId, a #GattId, a #GattId, an AppletResourceUserId, no output.

This is essentially the same as #ReadGattDescriptor, the AppletResourceUserId is unused.

LeClientWriteCharacteristic

Takes a PID, a type-0x9 input buffer, a bool, an u8, a bool, an u32, a #GattId, a #GattId, an AppletResourceUserId, no output.

This is essentially the same as #WriteGattCharacteristic, the AppletResourceUserId is unused.

LeClientWriteDescriptor

Takes a PID, a type-0x9 input buffer, a bool, an u8, an u32, a #GattId, a #GattId, a #GattId, an AppletResourceUserId, no output.

This is essentially the same as #WriteGattDescriptor, the AppletResourceUserId is unused.

LeClientRegisterNotification

Takes a PID, an input bool, an u32, a #GattId, a #GattId, an AppletResourceUserId, no output.

This is essentially the same as #RegisterGattNotification, the AppletResourceUserId is unused.

LeClientDeregisterNotification

Takes a PID, an input bool, an u32, a #GattId, a #GattId, an AppletResourceUserId, no output.

This is essentially the same as #UnregisterGattNotification, the AppletResourceUserId is unused.

SetLeResponse

Takes a PID, a type-0x9 input buffer, an u8, a #GattAttributeUuid, a #GattAttributeUuid, an AppletResourceUserId, no output.

The AppletResourceUserId is unused.

The buffer size must be <=0x258.

LeSendIndication

Takes a PID, a type-0x9 input buffer, an u8, a bool, a #GattAttributeUuid, a #GattAttributeUuid, an AppletResourceUserId, no output.

The AppletResourceUserId is unused.

The buffer size used internally is clamped to max size 0x258.

GetLeEventInfo

Takes a PID, a type-0xA output buffer, an AppletResourceUserId, returns an output #BleEventType.

This is identical to #GetLeHidEventInfo except different state is used. The AppletResourceUserId is unused.

RegisterBleEvent

Takes a PID, an AppletResourceUserId, returns an output Event handle with EventClearMode=1.

This is identical to #RegisterBleHidEvent except different Event state is used. The AppletResourceUserId is unused.

BluetoothPropertyType

This is u32 enum "nn::bluetooth::BluetoothPropertyType".

The sysmodule will Abort if the input type is unavailable / not recognized.

Value Description Buffer contents
1 Name String, max length 0xF8 excluding NUL-terminator.
2 Address #Address
3 Only available with #SetAdapterProperty. 3-bytes
5 3-bytes
6 1-byte. The default is value 0x68.

TransportType

This is u32 enum "nn::bluetooth::TransportType".

BluetoothSspVariant

This is u8 enum "nn::bluetooth::BluetoothSspVariant".

EventType

This is u32 enum "nn::bluetooth::EventType".

BluetoothHhReportType

This is u32 enum "nn::bluetooth::BluetoothHhReportType".

HidEventType

This is u32 enum "nn::bluetooth::HidEventType".

BleEventType

This is u32 enum "nn::bluetooth::BleEventType".

FatalReason

This is u32 enum "nn::bluetooth::FatalReason".

AdapterProperty

This is "nn::bluetooth::AdapterProperty". This is a 0x103-byte struct.

Offset Size Description
0x0 0x6 Same as the data for #BluetoothPropertyType type2.
0x6 0x3 Same as the data for #BluetoothPropertyType type5.
0x9 0xF9 Same as the data for #BluetoothPropertyType type1 (last byte is not initialized).
0x102 0x1 Set to hard-coded value 0x68 (same as the data for #BluetoothPropertyType type6).

Address

This is "nn::bluetooth::Address". This is a 0x6-byte struct with 1-byte alignment.

BluetoothPinCode

This is "nn::bluetooth::BluetoothPinCode". This is a 0x10-byte struct with 1-byte alignment.

HidData

This is "nn::bluetooth::HidData". This is a 0x282-byte struct.

Offset Size Description
0x0 0x2 Size of the following data.
0x2 0x280 Data

HidReport

This is "nn::bluetooth::HidReport". This is a 0x2BE-byte struct.

Offset Size Description
0x0 0x2 Size of the following data.
0x2 0x2BC Data

PlrStatistics

This is "nn::bluetooth::PlrStatistics". This is a 0x84-byte struct.

PlrList

This is "nn::bluetooth::PlrList". This is a 0xA4-byte struct.

ChannelMapList

This is "nn::bluetooth::ChannelMapList". This is a 0x88-byte struct.

LeConnectionParams

This is "nn::bluetooth::LeConnectionParams". This is a 0x14-byte struct with 2-byte alignment.

BleConnectionParameter

This is "nn::bluetooth::BleConnectionParameter". This is a 0xC-byte struct with 2-byte alignment.

BleAdvertisePacketData

This is "nn::bluetooth::BleAdvertisePacketData" ([5.0.0-8.1.1] "nn::bluetooth::LeAdvertiseData"). This is a 0xCC-byte struct.

BleAdvertiseFilter

This is "nn::bluetooth::BleAdvertiseFilter". This is a 0x3E-byte struct.

GattAttributeUuid

This is "nn::bluetooth::GattAttributeUuid". This is a 0x14-byte struct with 4-byte alignment.

GattId

This is "nn::bluetooth::GattId". This is a 0x18-byte struct with 4-byte alignment.