libnx/nx/include/switch/services/btm.h
2021-09-25 11:01:30 -04:00

492 lines
15 KiB
C

/**
* @file btm.h
* @brief btm service IPC wrapper.
* @note See also: https://switchbrew.org/wiki/BTM_services
* @author yellows8
*/
#pragma once
#include "../types.h"
#include "../kernel/event.h"
#include "../services/btdrv_types.h"
#include "../services/btm_types.h"
#include "../sf/service.h"
/// Initialize btm.
Result btmInitialize(void);
/// Exit btm.
void btmExit(void);
/// Gets the Service object for the actual btm service session.
Service* btmGetServiceSession(void);
/**
* @brief GetState
* @param[out] out \ref BtmState
*/
Result btmGetState(BtmState *out);
/**
* @brief GetHostDeviceProperty
* @param[out] out \ref BtmHostDeviceProperty
*/
Result btmGetHostDeviceProperty(BtmHostDeviceProperty *out);
/**
* @brief AcquireDeviceConditionEvent
* @note The Event must be closed by the user once finished with it.
* @param[out] out_event Output Event with autoclear=true.
*/
Result btmAcquireDeviceConditionEvent(Event* out_event);
/**
* @brief GetDeviceCondition [1.0.0-12.1.0]
* @param[out] out \ref BtmDeviceCondition
*/
Result btmLegacyGetDeviceCondition(BtmDeviceCondition *out);
/**
* @brief GetDeviceCondition [13.0.0+]
* @param[in] profile \ref BtmProfile, when not ::BtmProfile_None entries are only returned which match this profile.
* @param[out] out \ref BtmConnectedDeviceV13
* @param[in] count Size of the out array in entries.
* @param[out] total_out Total output entries.
*/
Result btmGetDeviceCondition(BtmProfile profile, BtmConnectedDeviceV13 *out, size_t count, s32 *total_out);
/**
* @brief SetBurstMode
* @param[in] addr \ref BtdrvAddress
* @param[in] flag Flag
*/
Result btmSetBurstMode(BtdrvAddress addr, bool flag);
/**
* @brief SetSlotMode
* @param[in] list \ref BtmDeviceSlotModeList
*/
Result btmSetSlotMode(const BtmDeviceSlotModeList *list);
/**
* @brief SetBluetoothMode
* @note Only available on pre-9.0.0.
* @param[in] mode \ref BtmBluetoothMode
*/
Result btmSetBluetoothMode(BtmBluetoothMode mode);
/**
* @brief SetWlanMode
* @param[in] mode \ref BtmWlanMode
*/
Result btmSetWlanMode(BtmWlanMode mode);
/**
* @brief AcquireDeviceInfoEvent
* @note The Event must be closed by the user once finished with it.
* @param[out] out_event Output Event with autoclear=true.
*/
Result btmAcquireDeviceInfoEvent(Event* out_event);
/**
* @brief GetDeviceInfo [1.0.0-12.1.0]
* @param[out] out \ref BtmDeviceInfoList
*/
Result btmLegacyGetDeviceInfo(BtmDeviceInfoList *out);
/**
* @brief GetDeviceInfo [13.0.0+]
* @param[in] profile \ref BtmProfile, when not ::BtmProfile_None entries are only returned which match this profile.
* @param[out] out \ref BtmDeviceInfoV13
* @param[in] count Size of the out array in entries.
* @param[out] total_out Total output entries.
*/
Result btmGetDeviceInfo(BtmProfile profile, BtmDeviceInfoV13 *out, size_t count, s32 *total_out);
/**
* @brief AddDeviceInfo
* @param[in] info \ref BtmDeviceInfo
*/
Result btmAddDeviceInfo(const BtmDeviceInfo *info);
/**
* @brief RemoveDeviceInfo
* @param[in] addr \ref BtdrvAddress
*/
Result btmRemoveDeviceInfo(BtdrvAddress addr);
/**
* @brief IncreaseDeviceInfoOrder
* @param[in] addr \ref BtdrvAddress
*/
Result btmIncreaseDeviceInfoOrder(BtdrvAddress addr);
/**
* @brief LlrNotify
* @param[in] addr \ref BtdrvAddress
* @param[in] unk [9.0.0+] Unknown
*/
Result btmLlrNotify(BtdrvAddress addr, s32 unk);
/**
* @brief EnableRadio
*/
Result btmEnableRadio(void);
/**
* @brief DisableRadio
*/
Result btmDisableRadio(void);
/**
* @brief HidDisconnect
* @param[in] addr \ref BtdrvAddress
*/
Result btmHidDisconnect(BtdrvAddress addr);
/**
* @brief HidSetRetransmissionMode
* @param[in] addr \ref BtdrvAddress
* @param[in] list \ref BtmZeroRetransmissionList
*/
Result btmHidSetRetransmissionMode(BtdrvAddress addr, const BtmZeroRetransmissionList *list);
/**
* @brief AcquireAwakeReqEvent
* @note Only available on [2.0.0+].
* @note The Event must be closed by the user once finished with it.
* @param[out] out_event Output Event with autoclear=true.
*/
Result btmAcquireAwakeReqEvent(Event* out_event);
/**
* @brief AcquireLlrStateEvent
* @note Only available on [4.0.0+].
* @note The Event must be closed by the user once finished with it.
* @param[out] out_event Output Event with autoclear=true.
*/
Result btmAcquireLlrStateEvent(Event* out_event);
/**
* @brief IsLlrStarted
* @note Only available on [4.0.0+].
* @param[out] out Output flag.
*/
Result btmIsLlrStarted(bool *out);
/**
* @brief EnableSlotSaving
* @note Only available on [4.0.0+].
* @param[in] flag Flag
*/
Result btmEnableSlotSaving(bool flag);
/**
* @brief ProtectDeviceInfo
* @note Only available on [5.0.0+].
* @param[in] addr \ref BtdrvAddress
* @param[in] flag Flag
*/
Result btmProtectDeviceInfo(BtdrvAddress addr, bool flag);
/**
* @brief AcquireBleScanEvent
* @note Only available on [5.0.0+].
* @note The Event must be closed by the user once finished with it.
* @param[out] out_event Output Event with autoclear=true.
*/
Result btmAcquireBleScanEvent(Event* out_event);
/**
* @brief GetBleScanParameterGeneral
* @note Only available on [5.1.0+].
* @param[in] parameter_id Must be value 0x1 or 0xFFFF.
* @param[out] out \ref BtdrvBleAdvertisePacketParameter
*/
Result btmGetBleScanParameterGeneral(u16 parameter_id, BtdrvBleAdvertisePacketParameter *out);
/**
* @brief GetBleScanParameterSmartDevice
* @note Only available on [5.1.0+].
* @param[in] parameter_id Must be value 0x2.
* @param[out] out \ref BtdrvGattAttributeUuid. The first 4-bytes is always 0.
*/
Result btmGetBleScanParameterSmartDevice(u16 parameter_id, BtdrvGattAttributeUuid *out);
/**
* @brief StartBleScanForGeneral
* @note Only available on [5.1.0+].
* @param[in] param \ref BtdrvBleAdvertisePacketParameter
*/
Result btmStartBleScanForGeneral(BtdrvBleAdvertisePacketParameter param);
/**
* @brief StopBleScanForGeneral
* @note Only available on [5.1.0+].
*/
Result btmStopBleScanForGeneral(void);
/**
* @brief GetBleScanResultsForGeneral
* @note Only available on [5.1.0+].
* @param[out] results Output array of \ref BtdrvBleScanResult.
* @param[in] count Size of the results array in entries. The max is 10.
* @param[out] total_out Total output entries.
*/
Result btmGetBleScanResultsForGeneral(BtdrvBleScanResult *results, u8 count, u8 *total_out);
/**
* @brief StartBleScanForPaired
* @note Only available on [5.1.0+].
* @param[in] param \ref BtdrvBleAdvertisePacketParameter
*/
Result btmStartBleScanForPaired(BtdrvBleAdvertisePacketParameter param);
/**
* @brief StopBleScanForPaired
* @note Only available on [5.1.0+].
*/
Result btmStopBleScanForPaired(void);
/**
* @brief StartBleScanForSmartDevice
* @note Only available on [5.1.0+].
* @param[in] uuid \ref BtdrvGattAttributeUuid
*/
Result btmStartBleScanForSmartDevice(const BtdrvGattAttributeUuid *uuid);
/**
* @brief StopBleScanForSmartDevice
* @note Only available on [5.1.0+].
*/
Result btmStopBleScanForSmartDevice(void);
/**
* @brief GetBleScanResultsForSmartDevice
* @note Only available on [5.1.0+].
* @param[out] results Output array of \ref BtdrvBleScanResult.
* @param[in] count Size of the results array in entries. The max is 10.
* @param[out] total_out Total output entries.
*/
Result btmGetBleScanResultsForSmartDevice(BtdrvBleScanResult *results, u8 count, u8 *total_out);
/**
* @brief AcquireBleConnectionEvent
* @note Only available on [5.1.0+].
* @note The Event must be closed by the user once finished with it.
* @param[out] out_event Output Event with autoclear=true.
*/
Result btmAcquireBleConnectionEvent(Event* out_event);
/**
* @brief BleConnect
* @note Only available on [5.0.0+].
* @note The \ref BtdrvAddress must not be already connected. A maximum of 4 devices can be connected.
* @param[in] addr \ref BtdrvAddress
*/
Result btmBleConnect(BtdrvAddress addr);
/**
* @brief BleOverrideConnection
* @note Only available on [5.1.0+].
* @param[in] id Same as \ref btmBleDisconnect.
*/
Result btmBleOverrideConnection(u32 id);
/**
* @brief BleDisconnect
* @note Only available on [5.0.0+].
* @param[in] connection_handle This must match a BtdrvBleConnectionInfo::id from \ref btmBleGetConnectionState. [5.1.0+] 0xFFFFFFFF is invalid.
*/
Result btmBleDisconnect(u32 connection_handle);
/**
* @brief BleGetConnectionState
* @note Only available on [5.0.0+].
* @param[out] info Output array of \ref BtdrvBleConnectionInfo.
* @param[in] count Size of the info array in entries. Other cmds which use this internally use count=4.
* @param[out] total_out Total output entries.
*/
Result btmBleGetConnectionState(BtdrvBleConnectionInfo *info, u8 count, u8 *total_out);
/**
* @brief BleGetGattClientConditionList
* @note Only available on [5.0.0+].
* @param[out] list \ref BtmGattClientConditionList
*/
Result btmBleGetGattClientConditionList(BtmGattClientConditionList *list);
/**
* @brief AcquireBlePairingEvent
* @note Only available on [5.0.0+].
* @note The Event must be closed by the user once finished with it.
* @param[out] out_event Output Event with autoclear=true.
*/
Result btmAcquireBlePairingEvent(Event* out_event);
/**
* @brief BlePairDevice
* @note Only available on [5.1.0+].
* @param[in] connection_handle Same as \ref btmBleDisconnect.
* @param[in] param \ref BtdrvBleAdvertisePacketParameter
*/
Result btmBlePairDevice(u32 connection_handle, BtdrvBleAdvertisePacketParameter param);
/**
* @brief BleUnpairDeviceOnBoth
* @note Only available on [5.1.0+].
* @param[in] connection_handle Same as \ref btmBleDisconnect.
* @param[in] param \ref BtdrvBleAdvertisePacketParameter
*/
Result btmBleUnpairDeviceOnBoth(u32 connection_handle, BtdrvBleAdvertisePacketParameter param);
/**
* @brief BleUnPairDevice
* @note Only available on [5.1.0+].
* @param[in] addr \ref BtdrvAddress
* @param[in] param \ref BtdrvBleAdvertisePacketParameter
*/
Result btmBleUnPairDevice(BtdrvAddress addr, BtdrvBleAdvertisePacketParameter param);
/**
* @brief BleGetPairedAddresses
* @note Only available on [5.1.0+].
* @param[in] param \ref BtdrvBleAdvertisePacketParameter
* @param[out] addrs Output array of \ref BtdrvAddress.
* @param[in] count Size of the addrs array in entries.
* @param[out] total_out Total output entries. The max is 10.
*/
Result btmBleGetPairedAddresses(BtdrvBleAdvertisePacketParameter param, BtdrvAddress *addrs, u8 count, u8 *total_out);
/**
* @brief AcquireBleServiceDiscoveryEvent
* @note Only available on [5.1.0+].
* @note The Event must be closed by the user once finished with it.
* @param[out] out_event Output Event with autoclear=true.
*/
Result btmAcquireBleServiceDiscoveryEvent(Event* out_event);
/**
* @brief GetGattServices
* @note Only available on [5.0.0+].
* @param[in] connection_handle Same as \ref btmBleDisconnect.
* @param[out] services Output array of \ref BtmGattService.
* @param[in] count Size of the services array in entries. The max is 100.
* @param[out] total_out Total output entries.
*/
Result btmGetGattServices(u32 connection_handle, BtmGattService *services, u8 count, u8 *total_out);
/**
* @brief Same as \ref btmGetGattServices except this only returns the \ref BtmGattService which matches the input \ref BtdrvGattAttributeUuid.
* @note Only available on [5.0.0+].
* @param[in] connection_handle Same as \ref btmBleDisconnect.
* @param[in] uuid \ref BtdrvGattAttributeUuid
* @param[out] service \ref BtmGattService
* @param[out] flag Whether a \ref BtmGattService was returned.
*/
Result btmGetGattService(u32 connection_handle, const BtdrvGattAttributeUuid *uuid, BtmGattService *service, bool *flag);
/**
* @brief Same as \ref btmGetGattServices except this only returns \ref BtmGattService entries where various checks pass with u16 fields.
* @note Only available on [5.0.0+].
* @param[in] connection_handle Same as \ref btmBleDisconnect.
* @param[in] service_handle ServiceHandle
* @param[out] services \ref BtmGattService
* @param[in] count Size of the services array in entries. The max is 100.
* @param[out] out Output value.
*/
Result btmGetGattIncludedServices(u32 connection_handle, u16 service_handle, BtmGattService *services, u8 count, u8 *out);
/**
* @brief This is similar to \ref btmGetGattIncludedServices except this only returns 1 \ref BtmGattService.
* @note Only available on [5.0.0+].
* @param[in] connection_handle Same as \ref btmBleDisconnect.
* @param[in] attribute_handle AttributeHandle
* @param[out] service \ref BtmGattService
* @param[out] flag Whether a \ref BtmGattService was returned.
*/
Result btmGetBelongingService(u32 connection_handle, u16 attribute_handle, BtmGattService *service, bool *flag);
/**
* @brief GetGattCharacteristics
* @note Only available on [5.0.0+].
* @param[in] connection_handle Same as \ref btmBleDisconnect.
* @param[in] service_handle This controls which \ref BtmGattCharacteristic entries to return.
* @param[out] characteristics \ref BtmGattCharacteristic
* @param[in] count Size of the characteristics array in entries. The max is 100.
* @param[out] total_out Total output entries.
*/
Result btmGetGattCharacteristics(u32 connection_handle, u16 service_handle, BtmGattCharacteristic *characteristics, u8 count, u8 *total_out);
/**
* @brief GetGattDescriptors
* @note Only available on [5.0.0+].
* @param[in] connection_handle Same as \ref btmBleDisconnect.
* @param[in] char_handle Characteristic handle. This controls which \ref BtmGattDescriptor entries to return.
* @param[out] descriptors \ref BtmGattDescriptor
* @param[in] count Size of the descriptors array in entries. The max is 100.
* @param[out] total_out Total output entries.
*/
Result btmGetGattDescriptors(u32 connection_handle, u16 char_handle, BtmGattDescriptor *descriptors, u8 count, u8 *total_out);
/**
* @brief AcquireBleMtuConfigEvent
* @note Only available on [5.0.0+].
* @note The Event must be closed by the user once finished with it.
* @param[out] out_event Output Event with autoclear=true.
*/
Result btmAcquireBleMtuConfigEvent(Event* out_event);
/**
* @brief ConfigureBleMtu
* @note Only available on [5.0.0+].
* @param[in] connection_handle Same as \ref btmBleDisconnect.
* @param[in] mtu MTU
*/
Result btmConfigureBleMtu(u32 connection_handle, u16 mtu);
/**
* @brief GetBleMtu
* @note Only available on [5.0.0+].
* @param[in] connection_handle Same as \ref btmBleDisconnect.
* @param[out] out Output MTU.
*/
Result btmGetBleMtu(u32 connection_handle, u16 *out);
/**
* @brief RegisterBleGattDataPath
* @note Only available on [5.0.0+].
* @param[in] path \ref BtmBleDataPath
*/
Result btmRegisterBleGattDataPath(const BtmBleDataPath *path);
/**
* @brief UnregisterBleGattDataPath
* @note Only available on [5.0.0+].
* @param[in] path \ref BtmBleDataPath
*/
Result btmUnregisterBleGattDataPath(const BtmBleDataPath *path);
/**
* @brief RegisterAppletResourceUserId
* @note Only available on [5.0.0+].
* @param[in] AppletResourceUserId AppletResourceUserId
* @param[in] unk Unknown
*/
Result btmRegisterAppletResourceUserId(u64 AppletResourceUserId, u32 unk);
/**
* @brief UnregisterAppletResourceUserId
* @note Only available on [5.0.0+].
* @param[in] AppletResourceUserId AppletResourceUserId
*/
Result btmUnregisterAppletResourceUserId(u64 AppletResourceUserId);
/**
* @brief SetAppletResourceUserId
* @note Only available on [5.0.0+].
* @param[in] AppletResourceUserId AppletResourceUserId
*/
Result btmSetAppletResourceUserId(u64 AppletResourceUserId);