Line 248: |
Line 248: |
| | 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+] [[#GetConnectedAudioDevice]] | + | | 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 |
| + | |- |
| + | | 153 || [14.0.0+] RequestUpdateAudioSinkVolume |
| + | |- |
| + | | 154 || [14.0.0+] IsAudioSinkVolumeSupported |
| |- | | |- |
| | 256 || [5.0.0+] [[#IsManufacturingMode]] | | | 256 || [5.0.0+] [[#IsManufacturingMode]] |
Line 321: |
Line 339: |
| [12.0.0+] The Enable vfunc called above for Audio does the following: | | [12.0.0+] The Enable vfunc called above for Audio does the following: |
| * Calls a func which 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 set for "remote control target". | + | ** 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. | | ** Error handling + state setup is done. |
| ** Uses BSA to register AV twice, with the default input struct. | | ** Uses BSA to register AV twice, with the default input struct. |
Line 527: |
Line 545: |
| | | |
| 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 785: |
Line 805: |
| | | |
| == 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 938: |
Line 962: |
| == 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 987: |
Line 1,013: |
| | | |
| == StartAudioOut == | | == StartAudioOut == |
− | Takes an input u32 [[#OpenAudioOut|audio_handle]], 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. | | This eventually uses BSA to start an AV stream. The codec is "Raw PCM". Synchronous feeding mode is used. |
Line 1,040: |
Line 1,066: |
| | | |
| A maximum of 0x8 entries can be returned. | | 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,509: |
Line 1,561: |
| |} | | |} |
| | | |
− | [1.0.0-11.0.1] [[#EventType|Type7]]: | + | [1.0.0-8.1.1] [[#EventType|Type7]]: |
| | | |
| {| class="wikitable" border="1" | | {| class="wikitable" border="1" |
Line 1,516: |
Line 1,568: |
| ! Size | | ! Size |
| ! Description | | ! Description |
| + | |
| |- | | |- |
− | | 0x0 || 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). | + | | 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" |
| + | |- |
| + | ! Offset |
| + | ! Size |
| + | ! Description |
| + | |- |
| + | | 0x0 || 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). |
| |- | | |- |
| | 0x4 || 0x6 || Device [[#Address|address]]. | | | 0x4 || 0x6 || Device [[#Address|address]]. |
Line 1,632: |
Line 1,702: |
| [[#HidEventType|Type0]], for [[#GetHidEventInfo]]: | | [[#HidEventType|Type0]], for [[#GetHidEventInfo]]: |
| | | |
| + | [1.0.0-11.0.1] |
| {| class="wikitable" border="1" | | {| class="wikitable" border="1" |
| |- | | |- |
Line 1,642: |
Line 1,713: |
| | 0x6 || 0x2 || Padding | | | 0x6 || 0x2 || Padding |
| |- | | |- |
− | | 0x8 || 0x4 || Status: | + | | 0x8 || 0x4 || Status: 0 = hid connection opened, 2 = hid connection closed, 8 = failed to open hid connection. |
− | [1.0.0-11.0.1] 0 = hid connection opened, 2 = hid connection closed, 8 = failed to open hid connection.
| + | |} |
| | | |
− | [12.0.0+] 0 = hid connection closed, 1 = hid connection opened, 2 = failed to open hid connection. | + | [12.0.0+] |
| + | {| class="wikitable" border="1" |
| + | |- |
| + | ! Offset |
| + | ! Size |
| + | ! Description |
| + | |- |
| + | | 0x0 || 0x4 || Status: 0 = hid connection closed, 1 = hid connection opened, 2 = failed to open hid connection. |
| + | |- |
| + | | 0x4 || 0x6 || Device [[#Address|address]]. |
| |} | | |} |
| | | |
Line 1,775: |
Line 1,855: |
| = BleAdvertiseFilter = | | = BleAdvertiseFilter = |
| This is "nn::bluetooth::BleAdvertiseFilter". This is a 0x3E-byte struct. | | 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" | | {| class="wikitable" border="1" |
Line 1,788: |
Line 1,862: |
| ! Description | | ! Description |
| |- | | |- |
− | | 0x0 || 0x1 || | + | | 0x0 || 0x1 || FilterId |
| + | |- |
| + | | 0x1 || 0x1 || CondDataSize. Only used with CondType Manu. |
| |- | | |- |
− | | 0x1 || 0x6 || [[#Address]] | + | | 0x2 || 0x1 || CondType |
| |- | | |- |
− | | 0x7 || 0x139 || | + | | 0x3 || 0x1D || CondData, content depends on CondType. |
| |- | | |- |
− | | 0x140 || 0x4 || s32 | + | | 0x20 || 0x1D || Mask. Only used with CondType Manu. +0 = u16 CompanyIdMask, then {pattern mask}. |
| |- | | |- |
− | | 0x144 || 0x4 || s32 | + | | 0x3D || 0x1 || MaskSize. Only used with CondType Manu. |
| |} | | |} |
| | | |
− | = BleConnectionInfo =
| + | CondType: |
− | This is "nn::bluetooth::BleConnectionInfo". This is a 0xC-byte struct.
| |
− | | |
| {| class="wikitable" border="1" | | {| class="wikitable" border="1" |
| |- | | |- |
− | ! Offset | + | ! Value |
− | ! Size | + | ! Name |
− | ! Description | + | ! Description |
| |- | | |- |
− | | 0x0 || 0x4 || ConnectionHandle, 0xFFFFFFFF ([5.0.0-5.0.2] 0xFFFF) is invalid. | + | | 2-3 || || ServiceUuid16. CondData = 16bit UUID which is byteswapped. |
| |- | | |- |
− | | 0x4 || 0x6 || [[#Address]] | + | | 4-5 || || ServiceUuid32. CondData = 32bit UUID which is byteswapped. |
| |- | | |- |
− | | 0xA || 0x2 || Padding | + | | 6-7 || || ServiceUuid128. CondData = 128bit UUID which is copied raw into the param struct. |
| |- | | |- |
| + | | 255 || || Manu. CondData: u16 CompanyId, then {pattern data}. |
| |} | | |} |
| | | |
− | = GattAttributeUuid = | + | 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::GattAttributeUuid". This is a 0x14-byte struct with 4-byte alignment. | + | |
| + | = BleAdvertisePacketParameter = |
| + | This is "nn::bluetooth::BleAdvertisePacketParameter". This is a 8-byte struct with 1-byte alignment. |
| + | |
| + | [[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" | | {| class="wikitable" border="1" |
Line 1,825: |
Line 1,906: |
| ! Description | | ! Description |
| |- | | |- |
− | | 0x0 || 0x4 || UUID size, must be 0x2, 0x4, or 0x10. | + | | 0x0 || 0x2 || CompanyId |
| |- | | |- |
− | | 0x4 || 0x10 || UUID with the above size. | + | | 0x2 || 0x6 || PatternData |
| |} | | |} |
| | | |
− | = GattId = | + | = BleScanResult = |
− | This is "nn::bluetooth::GattId". This is a 0x18-byte struct with 4-byte alignment. | + | This is "nn::bluetooth::BleScanResult". This is a 0x148-byte struct. |
| | | |
| {| class="wikitable" border="1" | | {| class="wikitable" border="1" |
Line 1,839: |
Line 1,920: |
| ! Description | | ! Description |
| |- | | |- |
− | | 0x0 || 0x1 || InstanceId | + | | 0x0 || 0x1 || |
− | |- | + | |- |
− | | 0x1 || 0x3 || Padding | + | | 0x1 || 0x6 || [[#Address]] |
− | |- | + | |- |
− | | 0x4 || 0x14 || [[#GattAttributeUuid]] | + | | 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). |
− | |} | + | |- |
− | | + | | 0x140 || 0x4 || s32 Total entries in the array at 0x8. |
− | = LeEventInfo = | + | |- |
− | This is a 0x400-byte struct. | + | | 0x144 || 0x4 || s32 |
− | | + | |} |
− | {| class="wikitable" border="1" | + | |
| + | = BleConnectionInfo = |
| + | This is "nn::bluetooth::BleConnectionInfo". This is a 0xC-byte struct. |
| + | |
| + | {| class="wikitable" border="1" |
| + | |- |
| + | ! Offset |
| + | ! Size |
| + | ! Description |
| + | |- |
| + | | 0x0 || 0x4 || ConnectionHandle, 0xFFFFFFFF ([5.0.0-5.0.2] 0xFFFF) is invalid. |
| + | |- |
| + | | 0x4 || 0x6 || [[#Address]] |
| + | |- |
| + | | 0xA || 0x2 || Padding |
| + | |- |
| + | |} |
| + | |
| + | = GattAttributeUuid = |
| + | This is "nn::bluetooth::GattAttributeUuid". This is a 0x14-byte struct with 4-byte alignment. |
| + | |
| + | {| class="wikitable" border="1" |
| + | |- |
| + | ! Offset |
| + | ! Size |
| + | ! Description |
| + | |- |
| + | | 0x0 || 0x4 || [[#BleGattUuid]] size. Must be 0x2, 0x4, or 0x10. |
| + | |- |
| + | | 0x4 || 0x10 || [[#BleGattUuid]] with the above size. |
| + | |} |
| + | |
| + | = GattId = |
| + | 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 | | ! Offset |
Line 1,855: |
Line 2,081: |
| ! Description | | ! Description |
| |- | | |- |
− | | 0x0 || 0x4 ||
| + | | 0x0 || 0x1 || [[#BleClientGattOperationStatus]] |
− | |-
| |
− | | 0x4 || 0x4 ||
| |
− | |-
| |
− | | 0x8 || 0x1 ||
| |
− | |-
| |
− | | 0x9 || 0x3 || Padding
| |
− | |-
| |
− | | 0xC || 0x14 || [[#GattAttributeUuid]]
| |
− | |-
| |
− | | 0x20 || 0x14 || [[#GattAttributeUuid]]
| |
− | |-
| |
− | | 0x34 || 0x14 || [[#GattAttributeUuid]]
| |
− | |-
| |
− | | 0x48 || 0x2 || Size of the below data.
| |
− | |-
| |
− | | 0x4A || {above size} || Data.
| |
− | |}
| |
− | | |
− | = BleClientGattOperationInfo =
| |
− | This is "nn::bluetooth::BleClientGattOperationInfo". This is converted from [[#LeEventInfo]].
| |
− | | |
− | {| class="wikitable" border="1"
| |
− | |-
| |
− | ! Offset
| |
− | ! Size
| |
− | ! Description
| |
− | |-
| |
− | | 0x0 || 0x1 || Converted from [[#LeEventInfo]]+0x0. | |
| |- | | |- |
| | 0x1 || 0x3 || Padding | | | 0x1 || 0x3 || Padding |
Line 1,980: |
Line 2,178: |
| = AudioControlButtonState = | | = AudioControlButtonState = |
| This is "nn::bluetooth::system::AudioControlButtonState". This is a 0x10-byte struct. | | 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 = | | = Notes = |
Line 2,012: |
Line 2,219: |
| 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 2,079: |
Line 2,286: |
| | CYW4356A3_001.004.009.0092.0095 | | | CYW4356A3_001.004.009.0092.0095 |
| |- | | |- |
− | | [12.0.0] | + | | [12.0.0-14.0.0] |
| | BSA0106_01.60.00_ | | | BSA0106_01.60.00_ |
| | Hayward_T3_RC_20210224 | | | Hayward_T3_RC_20210224 |