Changes

Jump to navigation Jump to search
no edit summary
Line 215: Line 215:  
|-
 
|-
 
| 100 || [12.0.0+] [[#IsBluetoothEnabled]]
 
| 100 || [12.0.0+] [[#IsBluetoothEnabled]]
 +
|-
 +
| 101 || [15.0.0+] ForceEnableBluetooth
 +
|-
 +
| 102 || [15.0.0+] EnableBluetoothStub
 
|-
 
|-
 
| 128 || [12.0.0+] [[#AcquireAudioEvent]]
 
| 128 || [12.0.0+] [[#AcquireAudioEvent]]
Line 248: Line 252:  
| 143 || [12.0.0+] [[#GetAudioControlInputState]]
 
| 143 || [12.0.0+] [[#GetAudioControlInputState]]
 
|-
 
|-
| 144 || [12.0.0+] [[#AcquireAudioConnectionStateChangedEvent]]
+
| 144 || [12.0.0-13.2.1] [[#AcquireAudioConnectionStateChangedEvent]]
 +
|-
 +
| 145 || [12.0.0-13.2.1] [[#GetConnectedAudioDevice]]
 +
|-
 +
| 146 || [13.0.0+] [[#CloseAudioControlInput]]
 +
|-
 +
| 147 || [13.0.0+] [[#RegisterAudioControlNotification]]
 +
|-
 +
| 148 || [13.0.0+] [[#SendAudioControlPassthroughCommand]]
 +
|-
 +
| 149 || [13.0.0+] [[#SendAudioControlSetAbsoluteVolumeCommand]]
 +
|-
 +
| 150 || [14.0.0+] AcquireAudioSinkVolumeLocallyChangedEvent
 +
|-
 +
| 151 || [14.0.0+] AcquireAudioSinkVolumeUpdateRequestCompletedEvent
 +
|-
 +
| 152 || [14.0.0+] GetAudioSinkVolume
 
|-
 
|-
| 145 || [12.0.0+] [[#GetConnectedAudioDevice]]
+
| 153 || [14.0.0+] RequestUpdateAudioSinkVolume
 +
|-
 +
| 154 || [14.0.0+] IsAudioSinkVolumeSupported
 +
|-
 +
| 155 || [15.0.0+] IsAudioSinkVolumeSupported2
 
|-
 
|-
 
| 256 || [5.0.0+] [[#IsManufacturingMode]]
 
| 256 || [5.0.0+] [[#IsManufacturingMode]]
Line 275: Line 299:  
This is used by [[BTM_services|btm]], this should not be used by other processes.
 
This is used by [[BTM_services|btm]], this should not be used by other processes.
   −
This first initializes the funcptr table interfaces to the defaults (same as [[#DisableBluetooth]]). [[Settings_services#GetConfigurationId1|GetConfigurationId1]] is used, an error is thrown if the output string is empty, or if it matches "SDEV_00_01_00".
+
[1.0.0-11.0.1] This first initializes the funcptr table interfaces to the defaults (same as [[#DisableBluetooth]]). [[Settings_services#GetConfigurationId1|GetConfigurationId1]] is used, an error is thrown if the output string is empty, or if it matches "SDEV_00_01_00".
   −
If the flag for [[#IsManufacturingMode]] is 0, or if this cmd was already used where that flag was 1, an interface funcptr is called. This is passed a ptr to a table of funcptrs. The ret is converted to a Result and returned if needed.
+
If the flag for [[#IsManufacturingMode]] is 0, or if this cmd was already used where that flag was 1, an interface funcptr is called. This is passed a ptr to a table of funcptrs. The ret is converted to a Result and returned if needed. [12.0.0+] A normal func is called instead, with no params/ret. This cmd always returns 0.
   −
The funcptr does the following:
+
The above called func does the following:
* A func is called, which copies the input funcptr table into global state. These are used for writing events into [[#EventInfo]].
+
* [1.0.0-11.0.1] A func is called, which copies the input funcptr table into global state. These are used for writing events into [[#EventInfo]].
* A func is called 5 times with input param = [1-5]. This initializes the specified nn::bluetooth::CircularBuffer (sharedmem and internal).
+
* A func is called 5 times with input param = [1-5]. This initializes the specified nn::bluetooth::CircularBuffer (sharedmem and internal). [12.0.0+] This functionality is now inlined.
* A func is called for creating the "nn.bluetooth.HidMessageHandler" thread.
+
* A func is called for creating the "nn.bluetooth.HidMessageHandler" thread. [12.0.0+] This functionality is now inlined.
   −
Lastly, the Event is created and returned (which global state the Event is stored in depends on whether the code-path which calls the above funcptr was used).
+
Lastly, the Event is ([1.0.0-11.0.1] created and) returned (which global state the Event is stored in depends on whether the code-path which calls the above funcptr was used).
    
== EnableBluetooth ==
 
== EnableBluetooth ==
Line 291: Line 315:  
This is used by [[BTM_services|btm]].
 
This is used by [[BTM_services|btm]].
   −
This first calls an interface funcptr, on failure 0xCA71 is returned.
+
[1.0.0-11.0.1] This first calls an interface funcptr, on failure 0xCA71 is returned.
   −
A global fixed [[#Address]] is copied to stack, this stack data is then overwritten with the output from [[Settings_services|GetBluetoothBdAddress]]. If GetBluetoothBdAddress fails, this will Abort. Then the same funcptr used by [[#SetAdapterProperty]] is called with this stack data, with [[#BluetoothPropertyType|type2]]. A converted error is returned if needed.
+
[1.0.0-11.0.1] A global fixed [[#Address]] is copied to stack, this stack data is then overwritten with the output from [[Settings_services|GetBluetoothBdAddress]]. If GetBluetoothBdAddress fails, this will Abort. Then the same funcptr used by [[#SetAdapterProperty]] is called with this stack data, with [[#BluetoothPropertyType|type2]]. A converted error is returned if needed.
   −
The last two bytes of the stack [[#Address]] are inverted (byteval = ~byteval), then the above funcptr is called with this for [[#BluetoothPropertyType|type3]]. Error conversion is handled if needed, then this returns 0.
+
[1.0.0-11.0.1] The last two bytes of the stack [[#Address]] are inverted (byteval = ~byteval), then the above funcptr is called with this for [[#BluetoothPropertyType|type3]]. Error conversion is handled if needed, then this returns 0.
   −
The first funcptr called above does the following:
+
The first funcptr called above does the following ([12.0.0+] this code is now inlined):
 
* Calls a GPIO func with param=0, [[SVC|sleeps]] for 10000000 nanoseconds, then calls the GPIO func again with param=1.
 
* Calls a GPIO func with param=0, [[SVC|sleeps]] for 10000000 nanoseconds, then calls the GPIO func again with param=1.
 +
* [12.0.0+] Calls a func to update an interface object ptr to use the enabled-object. A vfunc for various interface objects are called, with Result 0xCA71 being returned if the ret is non-zero (failure after the first interface object will trigger an Abort).
 +
* [12.0.0+] [[Settings_services|GetBluetoothBdAddress]] is used, on failure this will Abort. Then the same vfunc used by [[#SetAdapterProperty]] is called with the output from GetBluetoothBdAddress, with [[#AdapterPropertyType|type0]]. This will Abort on failure.
 +
* [12.0.0+] The last two bytes of the stack [[#Address]] are inverted (byteval = ~byteval), then the above vfunc is called with this for [[#AdapterPropertyType|type3]]. This will Abort on failure, otherwise 0 is returned.
 +
* [12.0.0+] Various code described below was moved into the above vfunc(s), etc.
 
* Calls a func for initializing the paired-devices table (empty).
 
* Calls a func for initializing the paired-devices table (empty).
 
* Calls a modified version of BSA_Boot, which handles BSA server initialization.
 
* Calls a modified version of BSA_Boot, which handles BSA server initialization.
Line 314: Line 342:  
* Uses SetValue with the param which was passed to this func.
 
* Uses SetValue with the param which was passed to this func.
 
* Does cleanup for the session object and exits the service.
 
* Does cleanup for the session object and exits the service.
 +
 +
[12.0.0+] The Enable vfunc called above for Audio does the following:
 +
* Calls a func which does the following:
 +
** Uses BSA to enable AV. Besides the callback, the only field in the passed struct which is set is <code>features</code>. This is ORRed to set bit0 for "remote control target", which with [13.0.0+] is only done if [[System_Settings|system-setting]] <code>bluetooth_debug!is_av_rc_tg</code> is set to true. With [14.0.0+] this is also ORRed with value 0xA (bit1/bit3) when [[System_Settings|system-setting]] <code>bluetooth_debug!is_av_rc_ct</code> is set to true (which is the case for [14.0.0+]).
 +
** Error handling + state setup is done.
 +
** Uses BSA to register AV twice, with the default input struct.
 +
** Error handling + state setup is done.
 +
* If an error occurred in a certain range, a [[#FatalReason|fatal]] is triggered and 0 is returned.
 +
* Otherwise when successful, state init is done then 0 is returned.
    
== DisableBluetooth ==
 
== DisableBluetooth ==
Line 320: Line 357:  
This is used by [[BTM_services|btm]].
 
This is used by [[BTM_services|btm]].
   −
This calls an interface funcptr. On success, the funcs for updating the interface funcptr tables are called (same as [[#InitializeBluetooth]]). Then the converted ret is returned as needed.
+
[1.0.0-11.0.1] This calls an interface funcptr. On success, the funcs for updating the interface funcptr tables are called (same as [[#InitializeBluetooth]]). Then the converted ret is returned as needed.
 +
 
 +
* [12.0.0+] Vfuncs for various interface objects are called, with failure triggering an Abort in some cases.
 +
* [12.0.0+] Calls funcs to update interfaces object ptrs to use the disabled-object.
 +
* [12.0.0+] Calls the same GPIO func as [[#EnableBluetooth]] with param=0, then 0 is returned.
 +
* [12.0.0+] Various code described below was moved into the above vfunc(s), etc.
    
When bluetooth is already disabled, that funcptr just returns 0. Otherwise when it's already enabled, it does the following:
 
When bluetooth is already disabled, that funcptr just returns 0. Otherwise when it's already enabled, it does the following:
Line 378: Line 420:  
This starts Inquiry, the output data will be available via [[#GetEventInfo]]. Inquiry will automatically stop in 10.24 seconds ([12.0.0+] calculated from the input duration instead).
 
This starts Inquiry, the output data will be available via [[#GetEventInfo]]. Inquiry will automatically stop in 10.24 seconds ([12.0.0+] calculated from the input duration instead).
   −
[12.0.0+] When service_mask is -1 the original defaults from pre-12.0.0 are used (besides duration). Otherwise, service_mask is written into the parameter struct (masked with the all-allowed-BSA-services value), and the EventInfo for discovered devices are triggered when inquiry finishes instead of immediately.
+
[12.0.0+] When services is -1 the original defaults from pre-12.0.0 are used (besides duration). Otherwise, services is written into the parameter struct (masked with the all-allowed-BSA-services value), and the EventInfo for discovered devices are triggered when inquiry finishes instead of immediately.
    
== StopInquiry ==
 
== StopInquiry ==
Line 509: Line 551:     
This is used by [[BTM_services|btm]].
 
This is used by [[BTM_services|btm]].
 +
 +
[12.0.0+] If [[Settings_services#BluetoothDevicesSettings|TrustedServices]] is 0, value 0x100000 is used. When bit20 is set, HID is initialized for this device, otherwise when bitmask 0xC0000 is set (<code>if((TrustedServices & 0xC0000) != 0)</code>) [[#OpenAudioConnection|audio]] is initialized for this device.
    
== GetPairedDeviceInfo ==
 
== GetPairedDeviceInfo ==
Line 528: Line 572:     
This is used by [[BTM_services|btm]].
 
This is used by [[BTM_services|btm]].
 +
 +
See [[#HidEventInfo]].
    
== SetTsi ==
 
== SetTsi ==
Line 549: Line 595:  
This is used by [[BTM_services|btm]].
 
This is used by [[BTM_services|btm]].
   −
The response will be available via [[#GetHidEventInfo]].
+
The response will be available via [[#GetHidEventInfo]] ([12.0.0+] [[#GetEventInfo]]).
    
This uses a BSA extension.
 
This uses a BSA extension.
Line 562: Line 608:  
This is used by [[BTM_services|btm]].
 
This is used by [[BTM_services|btm]].
   −
The response will be available via [[#GetHidEventInfo]].
+
The response will be available via [[#GetHidEventInfo]] ([12.0.0+] [[#GetEventInfo]]).
    
This uses a BSA extension (message 0x8CF).
 
This uses a BSA extension (message 0x8CF).
Line 642: Line 688:  
This is used by [[BTM_services|btm]].
 
This is used by [[BTM_services|btm]].
   −
The output data will be available via [[#GetEventInfo]] ([1.0.0-11.0.1] [[#GetHidEventInfo]]).
+
The output data will be available via [[#GetHidEventInfo]] ([12.0.0+] [[#GetEventInfo]]).
    
== GetChannelMap ==
 
== GetChannelMap ==
Line 765: Line 811:     
== ConnectGattServer ==
 
== ConnectGattServer ==
Takes an input u8, an [[#Address]], a bool, an [[Applet_Manager_services#AppletResourceUserId|AppletResourceUserId]], no output.
+
Takes an input u8 client_if, an [[#Address]], a bool, an [[Applet_Manager_services#AppletResourceUserId|AppletResourceUserId]], no output.
    
This is used by [[BTM_services|btm]].
 
This is used by [[BTM_services|btm]].
 +
 +
The input bool and AppletResourceUserId are unused.
 +
 +
The is_direct field passed to BSA is value 1.
    
== CancelConnectGattServer ==
 
== CancelConnectGattServer ==
Line 918: Line 968:  
== SetBleScanParameter ==
 
== SetBleScanParameter ==
 
Takes two input u16s, no output.
 
Takes two input u16s, no output.
 +
 +
The first u16 is scan_interval, the second u16 is scan_window.
    
This is used by [[BTM_services|btm]].
 
This is used by [[BTM_services|btm]].
Line 924: Line 976:  
Takes an input [[#Address]], no output.
 
Takes an input [[#Address]], no output.
   −
The response will be available via [[#GetHidEventInfo]].
+
The response will be available via [[#GetHidEventInfo]] ([12.0.0+] [[#GetEventInfo]]).
    
This uses a BSA extension (message 0x8D0).
 
This uses a BSA extension (message 0x8D0).
Line 935: Line 987:     
sdknso uses an user-specified EventClearMode.
 
sdknso uses an user-specified EventClearMode.
 +
 +
This just gets a previously-initialized Event from global state, [[#IsManufacturingMode]] is used to select which Event to use.
    
== GetAudioEventInfo ==
 
== GetAudioEventInfo ==
 
Takes a type-0xA output buffer, returns an output [[#AudioEventType]].
 
Takes a type-0xA output buffer, returns an output [[#AudioEventType]].
 +
 +
This is essentially the same as the other [12.0.0+] Get*EventInfo cmds, however in this case the output type is set to value 0 when no event is available.
 +
 +
See [[#AudioEventInfo]].
    
== OpenAudioConnection ==
 
== OpenAudioConnection ==
 
Takes an input [[#Address]], no output.
 
Takes an input [[#Address]], no output.
 +
 +
This goes through state and eventually uses BSA to open an AV connection. The input struct has the RC flag set to true. sec_mask is set to require authentication and encryption.
    
== CloseAudioConnection ==
 
== CloseAudioConnection ==
 
Takes an input [[#Address]], no output.
 
Takes an input [[#Address]], no output.
 +
 +
This goes through state and eventually uses BSA to close an AV connection.
    
== OpenAudioOut ==
 
== OpenAudioOut ==
Takes an input [[#Address]], returns an output u32.
+
Takes an input [[#Address]], returns an output u32 audio_handle.
    
== CloseAudioOut ==
 
== CloseAudioOut ==
Takes an input u32, no output.
+
Takes an input u32 [[#OpenAudioOut|audio_handle]], no output.
    
== AcquireAudioOutStateChangedEvent ==
 
== AcquireAudioOutStateChangedEvent ==
Takes an input u32, returns an output Event handle.
+
Takes an input u32 [[#OpenAudioOut|audio_handle]], returns an output Event handle.
    
sdknso uses an user-specified EventClearMode.
 
sdknso uses an user-specified EventClearMode.
    
== StartAudioOut ==
 
== StartAudioOut ==
Takes an input u32, a [[#PcmParameter]], a nn::TimeSpan, returns an output nn::TimeSpan and u64.
+
Takes an input u32 [[#OpenAudioOut|audio_handle]], a [[#PcmParameter]], a nn::TimeSpan latency, returns an output nn::TimeSpan latency and u64.
 +
 
 +
This eventually uses BSA to start an AV stream. The codec is "Raw PCM". Synchronous feeding mode is used.
    
== StopAudioOut ==
 
== StopAudioOut ==
Takes an input u32, no output.
+
Takes an input u32 [[#OpenAudioOut|audio_handle]], no output.
 +
 
 +
This eventually uses BSA to stop an AV stream. The pause flag is set to false.
    
== GetAudioOutState ==
 
== GetAudioOutState ==
Takes an input u32, returns an output [[#AudioOutState]].
+
Takes an input u32 [[#OpenAudioOut|audio_handle]], returns an output [[#AudioOutState]].
    
== GetAudioOutFeedingCodec ==
 
== GetAudioOutFeedingCodec ==
Takes an input u32, returns an output [[#AudioCodec]].
+
Takes an input u32 [[#OpenAudioOut|audio_handle]], returns an output [[#AudioCodec]].
    
== GetAudioOutFeedingParameter ==
 
== GetAudioOutFeedingParameter ==
Takes an input u32, returns an output [[#PcmParameter]].
+
Takes an input u32 [[#OpenAudioOut|audio_handle]], returns an output [[#PcmParameter]].
    
== AcquireAudioOutBufferAvailableEvent ==
 
== AcquireAudioOutBufferAvailableEvent ==
Takes an input u32, returns an output Event handle.
+
Takes an input u32 [[#OpenAudioOut|audio_handle]], returns an output Event handle.
    
sdknso uses an user-specified EventClearMode.
 
sdknso uses an user-specified EventClearMode.
 +
 +
This gets an Event which was previously initialized.
    
== SendAudioData ==
 
== SendAudioData ==
Takes an input u32, a type-0x9 input buffer, returns an output u64.
+
Takes an input u32 [[#OpenAudioOut|audio_handle]], a type-0x9 input buffer, returns an output u64 transferred_size.
 +
 
 +
This eventually uses BSA to send the specified buffer to the required UIPC channel. If transferred_size doesn't match the buffer size, error 0x177A71 is returned. transferred_size is always either 0 (error occured) or the buffer size.
    
== AcquireAudioControlInputStateChangedEvent ==
 
== AcquireAudioControlInputStateChangedEvent ==
Line 983: Line 1,053:     
sdknso uses an user-specified EventClearMode.
 
sdknso uses an user-specified EventClearMode.
 +
 +
This gets an Event which was previously initialized.
    
== GetAudioControlInputState ==
 
== GetAudioControlInputState ==
Takes a type-0xA output buffer containing an array of [[#AudioControlButtonState]], returns an output s32.
+
Takes a type-0xA output buffer containing an array of [[#AudioControlButtonState]], returns an output s32 total_out.
 +
 
 +
A maximum of 0xF entries can be returned.
    
== AcquireAudioConnectionStateChangedEvent ==
 
== AcquireAudioConnectionStateChangedEvent ==
Line 991: Line 1,065:     
sdknso uses an user-specified EventClearMode.
 
sdknso uses an user-specified EventClearMode.
 +
 +
This gets an Event which was previously initialized.
    
== GetConnectedAudioDevice ==
 
== GetConnectedAudioDevice ==
Takes a type-0xA output buffer containing an array of [[#Address]], returns an output s32.
+
Takes a type-0xA output buffer containing an array of [[#Address]], returns an output s32 total_out.
 +
 
 +
A maximum of 0x8 entries can be returned.
 +
 
 +
== CloseAudioControlInput ==
 +
Takes an input [[#Address]], no output.
 +
 
 +
This uses the BSA AV API to close the AVRCP connection.
 +
 
 +
== RegisterAudioControlNotification ==
 +
Takes an input [[#Address]] and an u32 [[#AvrcEventType]], no output.
 +
 
 +
This uses the BSA AV API to send a vendor control command: ctype=0x3, label={counter which is incremented}, length=0x9, data=[0x31, 0x00, 0x00, 0x05, {u8 [[#AvrcEventType]]}, {rest is zeros}].
 +
 
 +
This does nothing since BSA requires [[#EnableBluetooth|features]] bit1 and bit3 to be set in order to use this.
 +
 
 +
== SendAudioControlPassthroughCommand ==
 +
Takes an input [[#Address]], an u32 [[#AvrcOperationId]], an u32 [[#AvrcStateType]], no output.
 +
 
 +
This uses the BSA AV API to send a remote control command: label={counter which is incremented}, rc_id=[[#AvrcOperationId]], key_state=[[#AvrcStateType]].
 +
 
 +
This does nothing since BSA requires [[#EnableBluetooth|features]] bit1 to be set in order to use this.
 +
 
 +
== SendAudioControlSetAbsoluteVolumeCommand ==
 +
Takes an input [[#Address]] and a s32, no output.
 +
 
 +
This uses the BSA AV API to send a vendor control command: ctype=0x0, label={counter which is incremented}, length=0x5, data=[0x50, 0x00, 0x00, 0x01, {input s32 value written as an u8}].
 +
 
 +
See [[#RegisterAudioControlNotification]] regarding the usage requirement.
    
== IsManufacturingMode ==
 
== IsManufacturingMode ==
Line 1,126: Line 1,230:  
This is u32 enum "nn::bluetooth::hal::AdapterPropertyType".
 
This is u32 enum "nn::bluetooth::hal::AdapterPropertyType".
   −
= TransportType =
+
The sysmodule will Abort if the input type is unavailable / not recognized.
This is u32 enum "nn::bluetooth::TransportType".
     −
= BluetoothSspVariant =
+
{| class="wikitable" border="1"
 +
|-
 +
!  Value
 +
!  Description
 +
!  Data contents
 +
|-
 +
| 0 || Address || [[#Address]]
 +
|-
 +
| 1 || Name || String, max length 0xF8 excluding NUL-terminator.
 +
|-
 +
| 2 || || 3-bytes, Class of Device.
 +
|-
 +
| 3 || || Only available with [[#SetAdapterProperty]]. Same as [[#BluetoothPropertyType]] type3.
 +
|}
 +
 
 +
= TransportType =
 +
This is u32 enum "nn::bluetooth::TransportType".
 +
 
 +
= BluetoothSspVariant =
 
This is u8 enum "nn::bluetooth::BluetoothSspVariant". [12.0.0+] This is u32 enum "nn::bluetooth::hal::BluetoothSspVariant".
 
This is u8 enum "nn::bluetooth::BluetoothSspVariant". [12.0.0+] This is u32 enum "nn::bluetooth::hal::BluetoothSspVariant".
   Line 1,245: Line 1,366:  
|-
 
|-
 
| 7 || Only for [[#EventInfo]]: triggered after enabling bluetooth, when a global state field is value 4 or 2.
 
| 7 || Only for [[#EventInfo]]: triggered after enabling bluetooth, when a global state field is value 4 or 2.
 +
|-
 +
| 9 || [12.0.0+] Only for [[#EventInfo]]: triggered when bluetooth errors occur in a certain range, with various Audio interface vfuncs.
 
|}
 
|}
   Line 1,266: Line 1,389:     
[12.0.0+]:
 
[12.0.0+]:
  −
{...}
  −
  −
= AdapterPropertySet =
  −
This is "nn::bluetooth::hal::AdapterPropertySet". This is a 0x102-byte struct.
  −
  −
= Address =
  −
This is "nn::bluetooth::Address". This is a 0x6-byte struct with 1-byte alignment.
  −
  −
= EventInfo =
  −
This is the output buffer for [[#GetEventInfo]]. The data stored here depends on the [[#EventType]].
  −
  −
[[#EventType|Type0]]:
      
{| class="wikitable" border="1"
 
{| class="wikitable" border="1"
Line 1,286: Line 1,396:  
! Description
 
! Description
 
|-
 
|-
| 0x0 || 0x4 ||  
+
| 0x0 || 0x1 || [[#AdapterPropertyType]]
 +
|-
 +
| 0x1 || 0x1 || Data size
 +
|-
 +
| 0x2 || {Above size} || Data, as specified by the type.
 
|}
 
|}
   −
[12.0.0+] [[#EventType|Type0]]:
+
= AdapterPropertySet =
 +
This is "nn::bluetooth::hal::AdapterPropertySet". This is a 0x102-byte struct.
    
{| class="wikitable" border="1"
 
{| class="wikitable" border="1"
Line 1,297: Line 1,412:  
! Description
 
! Description
 
|-
 
|-
| 0x0 || 0x6 || Device [[#Address|address]].
+
| 0x0 || 0x6 || Same as the data for [[#AdapterPropertyType]] type0.
|-
  −
| 0x6 || 0xF9 || Device name, NUL-terminated string.
   
|-
 
|-
| 0xFF || 0x3 || Class of Device.
+
| 0x6 || 0x3 || Same as the data for [[#AdapterPropertyType]] type2.
 
|-
 
|-
| 0x102 || 0x6 || Reserved
+
| 0x9 || 0xF9 || Same as the data for [[#AdapterPropertyType]] type1.
 
|}
 
|}
   −
[12.0.0+] [[#EventType|Type1]]:
+
= Address =
 +
This is "nn::bluetooth::Address". This is a 0x6-byte struct with 1-byte alignment.
 +
 
 +
= EventInfo =
 +
This is the output buffer for [[#GetEventInfo]]. The data stored here depends on the [[#EventType]].
 +
 
 +
[[#EventType|Type0]]:
    
{| class="wikitable" border="1"
 
{| class="wikitable" border="1"
Line 1,314: Line 1,433:  
! Description
 
! Description
 
|-
 
|-
| 0x0 || 0x1 || Status: 0 = stopped, 1 = started.
+
| 0x0 || 0x4 ||  
|-
  −
| 0x1 || 0x3 || Padding
  −
|-
  −
| 0x4 || 0x4 || services value from [[#StartInquiry]] when starting, otherwise this is value 0.
   
|}
 
|}
   −
[1.0.0-11.0.1] [[#EventType|Type3]]:
+
[12.0.0+] [[#EventType|Type0]]:
    
{| class="wikitable" border="1"
 
{| class="wikitable" border="1"
Line 1,329: Line 1,444:  
! Description
 
! Description
 
|-
 
|-
| 0x0 || 0xF9 || Device name, NUL-terminated string.
+
| 0x0 || 0x6 || Device [[#Address|address]].
 
|-
 
|-
| 0xF9 || 0x6 || Device [[#Address|address]].
+
| 0x6 || 0xF9 || Device name, NUL-terminated string.
 
|-
 
|-
| 0xFF || 0x10 || Reserved
+
| 0xFF || 0x3 || Class of Device.
 
|-
 
|-
| 0x10F || 0x3 || Class of Device.
+
| 0x102 || 0x6 || Reserved
|-
  −
| 0x112 || 0x4 || Set to fixed value u32 0x1.
  −
|-
  −
| 0x116 || 0xFA || Reserved
  −
|-
  −
| 0x210 || 0x5C || Reserved
  −
|-
  −
| 0x26C || 0xF9 || Device name, NUL-terminated string. Same as name above, except starting at index 1.
  −
|-
  −
| 0x365 || 0x4 || s32 RSSI
  −
|-
  −
| 0x369 || 0x4 || Two bytes which are the same as name[11-12].
  −
|-
  −
| 0x36D || 0x10 || Reserved
   
|}
 
|}
   −
[1.0.0-11.0.1] [[#EventType|Type4]]:
+
[12.0.0+] [[#EventType|Type1]]:
    
{| class="wikitable" border="1"
 
{| class="wikitable" border="1"
Line 1,360: Line 1,461:  
! Description
 
! Description
 
|-
 
|-
| 0x0 || 0x4 || Status: 0 = stopped, 1 = started.
+
| 0x0 || 0x1 || Status: 0 = stopped, 1 = started.
 +
|-
 +
| 0x1 || 0x3 || Padding
 +
|-
 +
| 0x4 || 0x4 || services value from [[#StartInquiry]] when starting, otherwise this is value 0.
 
|}
 
|}
   −
[[#EventType|Type2]] ([1.0.0-11.0.1] type5):
+
[1.0.0-11.0.1] [[#EventType|Type3]]:
    
{| class="wikitable" border="1"
 
{| class="wikitable" border="1"
Line 1,371: Line 1,476:  
! Description
 
! Description
 
|-
 
|-
| 0x0 || 0x6 || Device [[#Address|address]].
+
| 0x0 || 0xF9 || Device name, NUL-terminated string.
 +
|-
 +
| 0xF9 || 0x6 || Device [[#Address|address]].
 +
|-
 +
| 0xFF || 0x10 || Reserved
 +
|-
 +
| 0x10F || 0x3 || Class of Device.
 +
|-
 +
| 0x112 || 0x4 || Set to fixed value u32 0x1.
 +
|-
 +
| 0x116 || 0xFA || Reserved
 +
|-
 +
| 0x210 || 0x5C || Reserved
 +
|-
 +
| 0x26C || 0xF9 || Device name, NUL-terminated string. Same as name above, except starting at index 1.
 +
|-
 +
| 0x365 || 0x4 || s32 RSSI
 
|-
 
|-
| 0x6 || 0xF9 || Device name, NUL-terminated string.
+
| 0x369 || 0x4 || Two bytes which are the same as name[11-12].
 
|-
 
|-
| 0xFF || 0x3 || Class of Device.
+
| 0x36D || 0x10 || Reserved
 
|}
 
|}
   −
[1.0.0-11.0.1] [[#EventType|Type6]]:
+
[1.0.0-11.0.1] [[#EventType|Type4]]:
    
{| class="wikitable" border="1"
 
{| class="wikitable" border="1"
Line 1,386: Line 1,507:  
! Description
 
! Description
 
|-
 
|-
| 0x0 || 0x6 || Device [[#Address|address]].
+
| 0x0 || 0x4 || Status: 0 = stopped, 1 = started.
 +
|}
 +
 
 +
[[#EventType|Type2]] ([1.0.0-11.0.1] type5):
 +
 
 +
{| class="wikitable" border="1"
 +
|-
 +
! Offset
 +
! Size
 +
! Description
 +
|-
 +
| 0x0 || 0x6 || Device [[#Address|address]].
 +
|-
 +
| 0x6 || 0xF9 || Device name, NUL-terminated string.
 +
|-
 +
| 0xFF || 0x3 || Class of Device.
 +
|}
 +
 
 +
[1.0.0-11.0.1] [[#EventType|Type6]]:
 +
 
 +
{| class="wikitable" border="1"
 +
|-
 +
! Offset
 +
! Size
 +
! Description
 +
|-
 +
| 0x0 || 0x6 || Device [[#Address|address]].
 
|-
 
|-
 
| 0x6 || 0xF9 || Device name, NUL-terminated string.
 
| 0x6 || 0xF9 || Device name, NUL-terminated string.
Line 1,420: Line 1,567:  
|}
 
|}
   −
[1.0.0-11.0.1] [[#EventType|Type7]]:
+
[1.0.0-8.1.1] [[#EventType|Type7]]:
 +
 
 +
{| class="wikitable" border="1"
 +
|-
 +
! Offset
 +
! Size
 +
! Description
 +
 
 +
|-
 +
| 0x0 || 0x6 || Device [[#Address|address]].
 +
|-
 +
| 0x6 || 0x2 || Padding
 +
|-
 +
| 0x8 || 0x4 || Status, always 0 except with [[#ConnectionEventType|event0]]: 2 = ACL Link is now Resumed (BSA_SEC_RESUMED_EVT), 9 = connection failed (pairing/authentication failed, or opening the hid connection failed).
 +
|-
 +
| 0xC || 0x4 || [[#ConnectionEventType]]
 +
|}
 +
 
 +
[9.0.0-11.0.1] [[#EventType|Type7]]:
    
{| class="wikitable" border="1"
 
{| class="wikitable" border="1"
Line 1,449: Line 1,614:  
| 0x4 || 0x6 || Device [[#Address|address]].
 
| 0x4 || 0x6 || Device [[#Address|address]].
 
|-
 
|-
| 0xA || 0xFE ||  
+
| 0xA || 0xFE || Reserved
 
|}
 
|}
   Line 1,538: Line 1,703:  
|}
 
|}
   −
= BluetoothPinCode =
+
= HidEventInfo =
This is "nn::bluetooth::BluetoothPinCode". This is a 0x10-byte struct with 1-byte alignment.
+
This is the output buffer for [[#GetHidEventInfo]] / events in sharedmem. The data stored here depends on the [[#HidEventType]].
   −
= PinCode =
+
[[#HidEventType|Type0]], for [[#GetHidEventInfo]]:
This is "nn::bluetooth::hal::PinCode". This is a 0x11-byte struct with 1-byte alignment.
      +
[1.0.0-11.0.1]
 
{| class="wikitable" border="1"
 
{| class="wikitable" border="1"
 
|-
 
|-
Line 1,550: Line 1,715:  
! Description
 
! Description
 
|-
 
|-
| 0x0 || 0xF || PinCode
+
| 0x0 || 0x6 || Device [[#Address|address]].
 +
|-
 +
| 0x6 || 0x2 || Padding
 
|-
 
|-
| 0xF || 0x1 || PinCode length, must be 0x1-0xF otherwise the sysmodule will Abort.
+
| 0x8 || 0x4 || Status: 0 = hid connection opened, 2 = hid connection closed, 8 = failed to open hid connection.
 
|}
 
|}
   −
= ServiceFlag =
+
[12.0.0+]
This is "nn::bluetooth::hal::ServiceFlag". This is the same as the BSA service-mask.
  −
 
  −
= HidData =
  −
This is "nn::bluetooth::HidData". This is a 0x282-byte struct.
  −
 
   
{| class="wikitable" border="1"
 
{| class="wikitable" border="1"
 
|-
 
|-
Line 1,567: Line 1,729:  
! Description
 
! Description
 
|-
 
|-
| 0x0 || 0x2 || Size of the following data.
+
| 0x0 || 0x4 || Status: 0 = hid connection closed, 1 = hid connection opened, 2 = failed to open hid connection.
 
|-
 
|-
| 0x2 || 0x280 || Data
+
| 0x4 || 0x6 || Device [[#Address|address]].
 
|}
 
|}
   −
= HidReport =
+
= BluetoothPinCode =
This is "nn::bluetooth::HidReport". This is a 0x2BE-byte struct.
+
This is "nn::bluetooth::BluetoothPinCode". This is a 0x10-byte struct with 1-byte alignment.
 +
 
 +
= PinCode =
 +
This is "nn::bluetooth::hal::PinCode". This is a 0x11-byte struct with 1-byte alignment.
    
{| class="wikitable" border="1"
 
{| class="wikitable" border="1"
Line 1,581: Line 1,746:  
! Description
 
! Description
 
|-
 
|-
| 0x0 || 0x2 || Size of the following data.
+
| 0x0 || 0xF || PinCode
 
|-
 
|-
| 0x2 || 0x2BC || Data
+
| 0xF || 0x1 || PinCode length, must be 0x1-0xF otherwise the sysmodule will Abort.
 
|}
 
|}
   −
= PlrStatistics =
+
= ServiceFlag =
This is "nn::bluetooth::PlrStatistics". This is a 0x84-byte struct.
+
This is "nn::bluetooth::hal::ServiceFlag". This is the same as the BSA service-mask.
   −
= PlrList =
+
= HidData =
This is "nn::bluetooth::PlrList". This is a 0xA4-byte struct.
+
This is "nn::bluetooth::HidData". This is a 0x282-byte struct.
   −
= PacketLostRate =
+
{| class="wikitable" border="1"
This is "nn::bluetooth::hal::PacketLostRate".
+
|-
 
+
! Offset
= ChannelMapList =
+
! Size
This is "nn::bluetooth::ChannelMapList". This is a 0x88-byte struct.
+
! Description
 +
|-
 +
| 0x0 || 0x2 || Size of the following data.
 +
|-
 +
| 0x2 || 0x280 || Data
 +
|}
   −
= Channel =
+
= HidReport =
This is "nn::bluetooth::hal::Channel".
+
This is "nn::bluetooth::HidReport". This is a 0x2BE-byte struct.
 
  −
= LeChannel =
  −
This is "nn::bluetooth::hal::LeChannel".
  −
 
  −
= 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.
      
{| class="wikitable" border="1"
 
{| class="wikitable" border="1"
Line 1,619: Line 1,777:  
! Description
 
! Description
 
|-
 
|-
| 0x0 || 0x4 ||  
+
| 0x0 || 0x2 || Size of the following data.
 
|-
 
|-
| 0x4 || 0x1 ||
+
| 0x2 || 0x2BC || Data
|-
  −
| 0x5 || 0x1 || Size of the data at +0x6.
  −
|-
  −
| 0x6 || 0x1F ||
  −
|-
  −
| 0x25 || 0x3 || Padding
  −
|-
  −
| 0x28 || 0x1 || Total array entries for the below array, can be 0.
  −
|-
  −
| 0x29 || 0x7 || Padding
  −
|-
  −
| 0x30 || count*0x14 || Array entries, see below.
  −
|-
  −
| 0xA4 || 0x1 || Size of the data at +0xA8.
  −
|-
  −
| 0xA5 || 0x1 ||
  −
|-
  −
| 0xA6 || 0x2 || Padding
  −
|-
  −
| 0xA8 || 0x1F ||
  −
|-
  −
| 0xC7 || 0x1 ||
  −
|-
  −
| 0xC8 || 0x1 ||
  −
|-
  −
| 0xC9 || 0x3 || Padding
   
|}
 
|}
   −
Array entry:
+
= PlrStatistics =
 +
This is "nn::bluetooth::PlrStatistics". This is a 0x84-byte struct.
 +
 
 +
= PlrList =
 +
This is "nn::bluetooth::PlrList". This is a 0xA4-byte struct.
 +
 
 +
= PacketLostRate =
 +
This is "nn::bluetooth::hal::PacketLostRate".
 +
 
 +
= ChannelMapList =
 +
This is "nn::bluetooth::ChannelMapList". This is a 0x88-byte struct.
 +
 
 +
= Channel =
 +
This is "nn::bluetooth::hal::Channel".
 +
 
 +
= LeChannel =
 +
This is "nn::bluetooth::hal::LeChannel".
 +
 
 +
= 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.
    
{| class="wikitable" border="1"
 
{| class="wikitable" border="1"
Line 1,658: Line 1,815:  
! Description
 
! Description
 
|-
 
|-
| 0x0 || 0x2 ||  
+
| 0x0 || 0x4 ||  
 
|-
 
|-
| 0x2 || 0x12 || Unused
+
| 0x4 || 0x1 ||  
|}
+
|-
 
+
| 0x5 || 0x1 || Size of the data at +0x6.
= BleAdvertiseFilter =
  −
This is "nn::bluetooth::BleAdvertiseFilter". This is a 0x3E-byte struct.
  −
 
  −
= BleAdvertisePacketParameter =
  −
This is "nn::bluetooth::BleAdvertisePacketParameter". This is a 8-byte struct with 1-byte alignment.
  −
 
  −
= BleScanResult =
  −
This is "nn::bluetooth::BleScanResult". This is a 0x148-byte struct.
  −
 
  −
{| class="wikitable" border="1"
   
|-
 
|-
! Offset
+
| 0x6 || 0x1F ||
! Size
  −
! Description
   
|-
 
|-
| 0x0 || 0x1 ||  
+
| 0x25 || 0x3 || Padding
 
|-
 
|-
| 0x1 || 0x6 || [[#Address]]
+
| 0x28 || 0x1 || Total array entries for the below array, can be 0.
 
|-
 
|-
| 0x7 || 0x139 ||  
+
| 0x29 || 0x7 || Padding
 
|-
 
|-
| 0x140 || 0x4 || s32
+
| 0x30 || count*0x14 || Array entries, see below.
 
|-
 
|-
| 0x144 || 0x4 || s32
+
| 0xA4 || 0x1 || Size of the data at +0xA8.
|}
+
|-
 
+
| 0xA5 || 0x1 ||
= BleConnectionInfo =
  −
This is "nn::bluetooth::BleConnectionInfo". This is a 0xC-byte struct.
  −
 
  −
{| class="wikitable" border="1"
   
|-
 
|-
! Offset
+
| 0xA6 || 0x2 || Padding
! Size
  −
! Description
   
|-
 
|-
| 0x0 || 0x4 || ConnectionHandle, 0xFFFFFFFF ([5.0.0-5.0.2] 0xFFFF) is invalid.
+
| 0xA8 || 0x1F ||  
 
|-
 
|-
| 0x4 || 0x6 || [[#Address]]
+
| 0xC7 || 0x1 ||  
 
|-
 
|-
| 0xA || 0x2 || Padding
+
| 0xC8 || 0x1 ||  
 
|-
 
|-
 +
| 0xC9 || 0x3 || Padding
 
|}
 
|}
   −
= GattAttributeUuid =
+
Array entry:
This is "nn::bluetooth::GattAttributeUuid". This is a 0x14-byte struct with 4-byte alignment.
      
{| class="wikitable" border="1"
 
{| class="wikitable" border="1"
Line 1,715: Line 1,854:  
! Description
 
! Description
 
|-
 
|-
| 0x0 || 0x4 || UUID size, must be 0x2, 0x4, or 0x10.
+
| 0x0 || 0x2 ||  
 
|-
 
|-
| 0x4 || 0x10 || UUID with the above size.
+
| 0x2 || 0x12 || Unused
 
|}
 
|}
   −
= GattId =
+
= BleAdvertiseFilter =
This is "nn::bluetooth::GattId". This is a 0x18-byte struct with 4-byte alignment.
+
This is "nn::bluetooth::BleAdvertiseFilter". This is a 0x3E-byte struct.
    
{| class="wikitable" border="1"
 
{| class="wikitable" border="1"
Line 1,729: Line 1,868:  
! Description
 
! Description
 
|-
 
|-
| 0x0 || 0x1 || InstanceId
+
| 0x0 || 0x1 || FilterId
 
|-
 
|-
| 0x1 || 0x3 || Padding
+
| 0x1 || 0x1 || CondDataSize. Only used with CondType Manu.
 +
|-
 +
| 0x2 || 0x1 || CondType
 +
|-
 +
| 0x3 || 0x1D || CondData, content depends on CondType.
 +
|-
 +
| 0x20 || 0x1D || Mask. Only used with CondType Manu. +0 = u16 CompanyIdMask, then {pattern mask}.
 
|-
 
|-
| 0x4 || 0x14 || [[#GattAttributeUuid]]
+
| 0x3D || 0x1 || MaskSize. Only used with CondType Manu.
 
|}
 
|}
   −
= LeEventInfo =
+
CondType:
This is a 0x400-byte struct.
  −
 
   
{| class="wikitable" border="1"
 
{| class="wikitable" border="1"
 
|-
 
|-
! Offset
+
! Value
! Size
+
! Name
! Description
+
! Description
|-
  −
| 0x0 || 0x4 ||
  −
|-
  −
| 0x4 || 0x4 ||
  −
|-
  −
| 0x8 || 0x1 ||
  −
|-
  −
| 0x9 || 0x3 || Padding
  −
|-
  −
| 0xC || 0x14 || [[#GattAttributeUuid]]
   
|-
 
|-
| 0x20 || 0x14 || [[#GattAttributeUuid]]
+
| 2-3 || || ServiceUuid16. CondData = 16bit UUID which is byteswapped.
 
|-
 
|-
| 0x34 || 0x14 || [[#GattAttributeUuid]]
+
| 4-5 || || ServiceUuid32. CondData = 32bit UUID which is byteswapped.
 
|-
 
|-
| 0x48 || 0x2 || Size of the below data.
+
| 6-7 || || ServiceUuid128. CondData = 128bit UUID which is copied raw into the param struct.
 
|-
 
|-
| 0x4A || {above size} || Data.
+
| 255 || || Manu. CondData: u16 CompanyId, then {pattern data}.
 
|}
 
|}
   −
= BleClientGattOperationInfo =
+
To pass filtering, the BLE advert data should be: data & Mask == CondData (following the type field in the advert entry with the matching type).
This is "nn::bluetooth::BleClientGattOperationInfo". This is converted from [[#LeEventInfo]].
+
 
 +
= BleAdvertisePacketParameter =
 +
This is "nn::bluetooth::BleAdvertisePacketParameter". This is a 8-byte struct with 1-byte alignment.
   −
{| class="wikitable" border="1"
+
[[BTM_services#StartBleScanForGeneral|StartBleScanForGeneral]] generates a [[#BleAdvertiseFilter]] from this. CondType = Manu, CondDataSize = 0xA. CondData: +0 = u16 CompanyId, u8 +2 = 0x1, +3 = {data copied from PatternData, then an u8 with value 0x0}. MaskSize = 0x9, Mask = {all 0xFF}.
 +
 
 +
[[BTM_services#StartBleScanForPaired|StartBleScanForPaired]] generates a [[#BleAdvertiseFilter]] from this, similar to the above. CondType = Manu, CondDataSize = 0x11. CondData: +0 = u16 CompanyId, u8 +2 = 0x1, +3 = {data copied from PatternData, then an u8 with value 0x0, then {6-byte system btaddr}}. MaskSize = 0x10, Mask = {all 0xFF except u8 +0x9 which is 0x0}.
 +
 
 +
{| class="wikitable" border="1"
 
|-
 
|-
 
! Offset
 
! Offset
Line 1,773: Line 1,912:  
! Description
 
! Description
 
|-
 
|-
| 0x0 || 0x1 || Converted from [[#LeEventInfo]]+0x0.
+
| 0x0 || 0x2 || CompanyId
 
|-
 
|-
| 0x1 || 0x3 || Padding
+
| 0x2 || 0x6 || PatternData
 +
|}
 +
 
 +
= BleScanResult =
 +
This is "nn::bluetooth::BleScanResult". This is a 0x148-byte struct.
 +
 
 +
{| class="wikitable" border="1"
 
|-
 
|-
| 0x4 || 0x4 || Same as [[#LeEventInfo]]+0x4.
+
! Offset
 +
! Size
 +
! Description
 
|-
 
|-
| 0x8 || 0x1 || Same as [[#LeEventInfo]]+0x8.
+
| 0x0 || 0x1 ||  
 
|-
 
|-
| 0x9 || 0x3 || Padding
+
| 0x1 || 0x6 || [[#Address]]
 
|-
 
|-
| 0xC || 0x14 || Same as [[#LeEventInfo]]+0xC.
+
| 0x7 || || Array of entries where each entry is 0x1F-bytes. hid compares +1 with 0xFF and +0x2 with the cached output from [[#BTM_services#GetBleScanParameterGeneral|GetBleScanParameterGeneral]] (entry+0x4 is skipped over).
 
|-
 
|-
| 0x20 || 0x14 || Same as [[#LeEventInfo]]+0x20.
+
| 0x140 || 0x4 || s32 Total entries in the array at 0x8.
 
|-
 
|-
| 0x34 || 0x14 || Same as [[#LeEventInfo]]+0x34.
+
| 0x144 || 0x4 || s32
|-
  −
| 0x48 || 0x8 || Same as [[#LeEventInfo]]+0x48.
  −
|-
  −
| 0x50 || {above size} || Same as [[#LeEventInfo]]+0x4A.
   
|}
 
|}
   −
= AudioEventType =
+
= BleConnectionInfo =
This is "nn::bluetooth::hal::AudioEventType". This is an u32 enum.
+
This is "nn::bluetooth::BleConnectionInfo". This is a 0xC-byte struct.
 
+
 
= PcmParameter =
+
{| class="wikitable" border="1"
This is "nn::bluetooth::system::PcmParameter". This is a 0xC-byte struct with 4-byte alignment.
+
|-
 
+
! Offset
= AudioOutState =
+
! Size
This is "nn::bluetooth::system::AudioOutState". This is an u32 enum.
+
! Description
 
+
|-
= AudioCodec =
+
| 0x0 || 0x4 || ConnectionHandle, 0xFFFFFFFF ([5.0.0-5.0.2] 0xFFFF) is invalid.
This is "nn::bluetooth::system::AudioCodec". This is an u32 enum.
+
|-
 
+
| 0x4 || 0x6 || [[#Address]]
= AudioControlButtonState =
+
|-
This is "nn::bluetooth::system::AudioControlButtonState". This is a 0x10-byte struct.
+
| 0xA || 0x2 || Padding
 
+
|-
= Notes =
+
|}
The output from <code>sudo hcitool info {BDADDR}</code> is identical for [1.0.0-11.0.0]:
+
 
 
+
= GattAttributeUuid =
   BD Address:  {BDADDR}
+
This is "nn::bluetooth::GattAttributeUuid". This is a 0x14-byte struct with 4-byte alignment.
   OUI Company: Nintendo Co.,Ltd (98-B6-E9)
+
 
   Device Name: Nintendo Switch
+
{| class="wikitable" border="1"
   LMP Version: 4.2 (0x8) LMP Subversion: 0x2409
+
|-
   Manufacturer: Broadcom Corporation (15)
+
! Offset
   Features page 0: 0xbf 0xfe 0xcf 0xfe 0xdb 0xff 0x7b 0x87
+
! Size
     <3-slot packets> <5-slot packets> <encryption> <slot offset>  
+
! Description
     <timing accuracy> <role switch> <sniff mode> <RSSI>  
+
|-
     <channel quality> <SCO link> <HV2 packets> <HV3 packets>  
+
| 0x0 || 0x4 || [[#BleGattUuid]] size. Must be 0x2, 0x4, or 0x10.
     <u-law log> <A-law log> <CVSD> <paging scheme> <power control>  
+
|-
     <transparent SCO> <broadcast encrypt> <EDR ACL 2 Mbps>  
+
| 0x4 || 0x10 || [[#BleGattUuid]] with the above size.
     <EDR ACL 3 Mbps> <enhanced iscan> <interlaced iscan>  
+
|}
     <interlaced pscan> <inquiry with RSSI> <extended SCO>  
+
 
     <EV4 packets> <EV5 packets> <AFH cap. slave>  
+
= GattId =
     <AFH class. slave> <LE support> <3-slot EDR ACL>  
+
This is "nn::bluetooth::GattId". This is a 0x18-byte struct with 4-byte alignment.
 +
 
 +
{| class="wikitable" border="1"
 +
|-
 +
! Offset
 +
! Size
 +
! Description
 +
|-
 +
| 0x0 || 0x1 || InstanceId
 +
|-
 +
| 0x1 || 0x3 || Padding
 +
|-
 +
| 0x4 || 0x14 || [[#GattAttributeUuid]]
 +
|}
 +
 
 +
= BleGattUuid =
 +
This is an enum of u16, u32 and u128 values.
 +
 
 +
{| class="wikitable" border="1"
 +
|-
 +
!  Value
 +
!  Description
 +
|-
 +
| 0x2902 || ClientConfigUuid16
 +
|-
 +
| 0x2908 || ReportReferenceUuid16
 +
|-
 +
| 0x1B666C080A578E83994EA7F7BF50DDA3 || PalmaOtafuControlPointUuid128
 +
|-
 +
| 0x26FE2EE709244FB7914061D97A6CE8A2 || PalmaOtafuDataUuid128
 +
|-
 +
| 0x45CEF889AF8E0784664404737C7FBE2B || NbatUuid128
 +
|-
 +
| 0x46CEF889AF8E0784664404737C7FBE2B || BatteryLevelUuid128
 +
|-
 +
| 0x47CEF889AF8E0784664404737C7FBE2B || BatteryStateUuid128
 +
|-
 +
| 0xD88B7646729DBDA17A4425F4101126C7 || PalmaOtafuUuid128
 +
|-
 +
| 0xE5237AE2516B55BB67456DF36CE17566 || NhogUuid128
 +
|-
 +
| 0xE6237AE2516B55BB67456DF36CE17566 || InputReportUuid128
 +
|-
 +
| 0xE7237AE2516B55BB67456DF36CE17566 || OutputCommandUuid128
 +
|-
 +
| 0xE8237AE2516B55BB67456DF36CE17566 || CommandResponseUuid128
 +
|}
 +
 
 +
= BleClientGattOperationStatus =
 +
This is an u8 enum. This is converted from the [[#LeEventInfo]] status field.
 +
 
 +
{| class="wikitable" border="1"
 +
|-
 +
!  Value
 +
!  Name
 +
!  Description
 +
|-
 +
| 0 || || Same as [[#LeEventInfo]] status 0.
 +
|-
 +
| 1 || || Same as [[#LeEventInfo]] status 55.
 +
|-
 +
| 2 || || Same as [[#LeEventInfo]] status 25, 52.
 +
|-
 +
| 3 || || Same as [[#LeEventInfo]] status 4, 16, 21, 50.
 +
|-
 +
| 4 || || Same as [[#LeEventInfo]] status 5.
 +
|-
 +
| 5 || || Same as [[#LeEventInfo]] status 6.
 +
|-
 +
| 6 || || Same as [[#LeEventInfo]] status 7.
 +
|-
 +
| 7 || || Same as [[#LeEventInfo]] status 9.
 +
|-
 +
| 8 || || Same as [[#LeEventInfo]] status 13.
 +
|-
 +
| 9 || || Used as the default case when the [[#LeEventInfo]] status is unrecognized.
 +
|-
 +
| 10 || || Same as [[#LeEventInfo]] status 35.
 +
|}
 +
 
 +
= LeEventInfo =
 +
This is a 0x400-byte struct.
 +
 
 +
{| class="wikitable" border="1"
 +
|-
 +
! Offset
 +
! Size
 +
! Description
 +
|-
 +
| 0x0 || 0x4 || Status. 0 = success, non-zero = error.
 +
|-
 +
| 0x4 || 0x4 || ConnectionId
 +
|-
 +
| 0x8 || 0x1 || Flags. Bit0 = IsWrite, bit1 = IsDescriptor, bit2 = IsNotify.
 +
When bit2 is set, bit0 = IsIndication.
 +
|-
 +
| 0x9 || 0x3 || Padding
 +
|-
 +
| 0xC || 0x14 || Service [[#GattAttributeUuid]]
 +
|-
 +
| 0x20 || 0x14 || Characteristic [[#GattAttributeUuid]]
 +
|-
 +
| 0x34 || 0x14 || Descriptor [[#GattAttributeUuid]]
 +
|-
 +
| 0x48 || 0x2 || Size of the below data.
 +
|-
 +
| 0x4A || 0x200 || Data with the above size.
 +
|}
 +
 
 +
= BleClientGattOperationInfo =
 +
This is "nn::bluetooth::BleClientGattOperationInfo". This is converted from [[#LeEventInfo]].
 +
 
 +
{| class="wikitable" border="1"
 +
|-
 +
! Offset
 +
! Size
 +
! Description
 +
|-
 +
| 0x0 || 0x1 || [[#BleClientGattOperationStatus]]
 +
|-
 +
| 0x1 || 0x3 || Padding
 +
|-
 +
| 0x4 || 0x4 || Same as [[#LeEventInfo]]+0x4.
 +
|-
 +
| 0x8 || 0x1 || Same as [[#LeEventInfo]]+0x8.
 +
|-
 +
| 0x9 || 0x3 || Padding
 +
|-
 +
| 0xC || 0x14 || Same as [[#LeEventInfo]]+0xC.
 +
|-
 +
| 0x20 || 0x14 || Same as [[#LeEventInfo]]+0x20.
 +
|-
 +
| 0x34 || 0x14 || Same as [[#LeEventInfo]]+0x34.
 +
|-
 +
| 0x48 || 0x8 || Same as [[#LeEventInfo]]+0x48.
 +
|-
 +
| 0x50 || {above size} || Same as [[#LeEventInfo]]+0x4A.
 +
|}
 +
 
 +
= AudioEventType =
 +
This is "nn::bluetooth::hal::AudioEventType". This is an u32 enum.
 +
 
 +
{| class="wikitable" border="1"
 +
|-
 +
!  Value
 +
!  Name
 +
!  Description
 +
|-
 +
| 0 || || None
 +
|-
 +
| 1 || || Connection
 +
|}
 +
 
 +
= AudioEventInfo =
 +
This is the output buffer for [[#GetAudioEventInfo]]. The data stored here depends on the [[#AudioEventType]].
 +
 
 +
[[#AudioEventType|Type1]]:
 +
 
 +
{| class="wikitable" border="1"
 +
|-
 +
! Offset
 +
! Size
 +
! Description
 +
|-
 +
| 0x0 || 0x4 || Status: 0 = AV connection closed, 1 = AV connection opened, 2 = failed to open AV connection.
 +
|-
 +
| 0x4 || 0x6 || Device [[#Address|address]].
 +
|-
 +
| 0xA || 0x2 || Padding
 +
|}
 +
 
 +
= PcmParameter =
 +
This is "nn::bluetooth::system::PcmParameter". This is a 0xC-byte struct with 4-byte alignment.
 +
 
 +
The sysmodule will Abort if any of these fields are invalid.
 +
 
 +
{| class="wikitable" border="1"
 +
|-
 +
! Offset
 +
! Size
 +
! Description
 +
|-
 +
| 0x0 || 0x4 || Must be 0-3. Controls number of channels: 0 = mono, non-zero = stereo.
 +
|-
 +
| 0x4 || 0x4 || s32 SampleRate. Must be one of the following: 16000, 32000, 44100, 48000.
 +
|-
 +
| 0x8 || 0x4 || Bits per sample. Must be 8 or 16.
 +
|}
 +
 
 +
= AudioOutState =
 +
This is "nn::bluetooth::system::AudioOutState". This is an u32 enum.
 +
 
 +
{| class="wikitable" border="1"
 +
|-
 +
!  Value
 +
!  Description
 +
|-
 +
| 0 || Stopped
 +
|-
 +
| 1 || Started
 +
|}
 +
 
 +
= AudioCodec =
 +
This is "nn::bluetooth::system::AudioCodec". This is an u32 enum.
 +
 
 +
{| class="wikitable" border="1"
 +
|-
 +
!  Value
 +
!  Description
 +
|-
 +
| 0 || Raw PCM
 +
|}
 +
 
 +
= AudioControlButtonState =
 +
This is "nn::bluetooth::system::AudioControlButtonState". This is a 0x10-byte struct.
 +
 
 +
= AvrcEventType =
 +
This is "nn::bluetooth::hal::AvrcEventType".
 +
 
 +
= AvrcOperationId =
 +
This is "nn::bluetooth::hal::AvrcOperationId". This is the same as tBSA_AV_RC.
 +
 
 +
= AvrcStateType =
 +
This is "nn::bluetooth::hal::AvrcStateType". This is the same as tBSA_AV_STATE.
 +
 
 +
= Notes =
 +
The output from <code>sudo hcitool info {BDADDR}</code> is identical for [1.0.0-11.0.0]:
 +
 
 +
   BD Address:  {BDADDR}
 +
   OUI Company: Nintendo Co.,Ltd (98-B6-E9)
 +
   Device Name: Nintendo Switch
 +
   LMP Version: 4.2 (0x8) LMP Subversion: 0x2409
 +
   Manufacturer: Broadcom Corporation (15)
 +
   Features page 0: 0xbf 0xfe 0xcf 0xfe 0xdb 0xff 0x7b 0x87
 +
     <3-slot packets> <5-slot packets> <encryption> <slot offset>  
 +
     <timing accuracy> <role switch> <sniff mode> <RSSI>  
 +
     <channel quality> <SCO link> <HV2 packets> <HV3 packets>  
 +
     <u-law log> <A-law log> <CVSD> <paging scheme> <power control>  
 +
     <transparent SCO> <broadcast encrypt> <EDR ACL 2 Mbps>  
 +
     <EDR ACL 3 Mbps> <enhanced iscan> <interlaced iscan>  
 +
     <interlaced pscan> <inquiry with RSSI> <extended SCO>  
 +
     <EV4 packets> <EV5 packets> <AFH cap. slave>  
 +
     <AFH class. slave> <LE support> <3-slot EDR ACL>  
 
     <5-slot EDR ACL> <sniff subrating> <pause encryption>  
 
     <5-slot EDR ACL> <sniff subrating> <pause encryption>  
 
     <AFH cap. master> <AFH class. master> <EDR eSCO 2 Mbps>  
 
     <AFH cap. master> <AFH class. master> <EDR eSCO 2 Mbps>  
Line 1,840: Line 2,225:  
The bluetooth stack is Broadcom/Cypress brcm BSA (for example, see [https://github.com/hardkernel/buildroot_linux_amlogic_brcm-bsa here]).
 
The bluetooth stack is Broadcom/Cypress brcm BSA (for example, see [https://github.com/hardkernel/buildroot_linux_amlogic_brcm-bsa here]).
   −
Various btdrv service commands use a custom BSA extension (message-ids based at 0x8CA/2250), this is referred to as "robson".
+
Various btdrv service commands use a custom BSA extension (message-ids based at 0x8CA/2250), this is referred to as "robson". The following BSA modules are supported by the BSA server task thread (including the aforementioned robson): sys, dm, disc, sec, hh, [12.0.0+] av, dg, tm, ble.
   −
The following L2CAP services are registered (dynamic channels): SDP, ATT (GATT), RFCOMM, HID (PSMs: 0x11, 0x13, 0x8001, 0x8003).
+
The following L2CAP services are registered (dynamic channels): SDP, ATT (GATT), RFCOMM, HID (PSMs: 0x11, 0x13, 0x8001, 0x8003), [12.0.0+] AVCTP/AVCTP_Browsing (only when the features bitfield passed to BSA_AvEnable by [[#EnableBluetooth]] has bit0 ("remote control target") or bit1 set), [12.0.0+] AVDTP.
    
<code>l2cu_send_peer_echo_rsp</code> is called with p_data=NULL and data_len=0, therefore no data is returned in the L2CAP ECHO response.
 
<code>l2cu_send_peer_echo_rsp</code> is called with p_data=NULL and data_len=0, therefore no data is returned in the L2CAP ECHO response.
Line 1,907: Line 2,292:  
| CYW4356A3_001.004.009.0092.0095
 
| CYW4356A3_001.004.009.0092.0095
 
|-
 
|-
| [12.0.0]
+
| [12.0.0-14.1.2]
 
| BSA0106_01.60.00_
 
| BSA0106_01.60.00_
 
| Hayward_T3_RC_20210224
 
| Hayward_T3_RC_20210224
 
| CYW4356A3_001.004.009.0092.0095
 
| CYW4356A3_001.004.009.0092.0095
 +
|-
 +
| [15.0.0-18.0.0]
 +
| BSA0106_01.60.00_
 +
| Hayward_T3_RC_20210224
 +
| BCM4356A3 UART 37.4 MHz wlbga_bu
 
|}
 
|}
    
<code>bsa_sv_tm_read_version_excback</code> copies bsa_version_string and concats with bsa_version_info_string to generate <code>tBSA_TM_READ_VERSION.bsa_server_version</code>.
 
<code>bsa_sv_tm_read_version_excback</code> copies bsa_version_string and concats with bsa_version_info_string to generate <code>tBSA_TM_READ_VERSION.bsa_server_version</code>.
 +
 +
* [15.0.0]: In the HCI memwrite data, only config data was changed, no code changes.
    
[[Category:Services]]
 
[[Category:Services]]

Navigation menu