/** * @file btm.h * @brief btm service IPC wrapper. * @author yellows8 */ #pragma once #include "../types.h" #include "../kernel/event.h" #include "../services/btdrv.h" #include "../sf/service.h" /// GattClientConditionList typedef struct { u8 unk_x0[0x74]; ///< Unknown } BtmGattClientConditionList; /// GattService typedef struct { u8 unk_x0[0x4]; ///< Unknown BtdrvGattAttributeUuid uuid; ///< \ref BtdrvGattAttributeUuid u16 unk_x18; ///< Unknown u8 unk_x1A[0x4]; ///< Unknown u16 unk_x1E; ///< Unknown u8 unk_x20; ///< Unknown u8 pad[3]; ///< Padding } BtmGattService; /// GattCharacteristic typedef struct { u8 unk_x0[0x24]; ///< Unknown } BtmGattCharacteristic; /// GattDescriptor typedef struct { u8 unk_x0[0x20]; ///< Unknown } BtmGattDescriptor; /// BleDataPath typedef struct { u8 unk_x0; ///< Unknown u8 pad[3]; ///< Padding BtdrvGattAttributeUuid uuid; ///< \ref BtdrvGattAttributeUuid } BtmBleDataPath; /// Initialize btm. Result btmInitialize(void); /// Exit btm. void btmExit(void); /// Gets the Service object for the actual btm service session. Service* btmGetServiceSession(void); /** * @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] unk Must be value 0x1 or 0xFFFF. * @param[out] out \ref BtdrvBleAdvertisePacketParameter */ Result btmGetBleScanParameterGeneral(u16 unk, BtdrvBleAdvertisePacketParameter *out); /** * @brief GetBleScanParameterSmartDevice * @note Only available on [5.1.0+]. * @param[in] unk Must be value 0x2. * @param[out] out \ref BtdrvGattAttributeUuid. The first 4-bytes is always 0. */ Result btmGetBleScanParameterSmartDevice(u16 unk, 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] id This must match a BtdrvBleConnectionInfo::id from \ref btmBleGetConnectionState. [5.1.0+] 0xFFFFFFFF is invalid. */ Result btmBleDisconnect(u32 id); /** * @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] param \ref BtdrvBleAdvertisePacketParameter * @param[in] id Same as \ref btmBleDisconnect. */ Result btmBlePairDevice(BtdrvBleAdvertisePacketParameter param, u32 id); /** * @brief BleUnpairDeviceOnBoth * @note Only available on [5.1.0+]. * @param[in] param \ref BtdrvBleAdvertisePacketParameter * @param[in] id Same as \ref btmBleDisconnect. */ Result btmBleUnpairDeviceOnBoth(BtdrvBleAdvertisePacketParameter param, u32 id); /** * @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] id 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 id, 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] id 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 id, 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] id Same as \ref btmBleDisconnect. * @param[in] unk1 Unknown * @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 id, u16 unk1, 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] id Same as \ref btmBleDisconnect. * @param[in] unk1 Unknown * @param[out] service \ref BtmGattService * @param[out] flag Whether a \ref BtmGattService was returned. */ Result btmGetBelongingService(u32 id, u16 unk1, BtmGattService *service, bool *flag); /** * @brief GetGattCharacteristics * @note Only available on [5.0.0+]. * @param[in] id Same as \ref btmBleDisconnect. * @param[in] unk1 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 id, u16 unk1, BtmGattCharacteristic *characteristics, u8 count, u8 *total_out); /** * @brief GetGattDescriptors * @note Only available on [5.0.0+]. * @param[in] id Same as \ref btmBleDisconnect. * @param[in] unk1 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 id, u16 unk1, 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] id Same as \ref btmBleDisconnect. * @param[in] mtu MTU */ Result btmConfigureBleMtu(u32 id, u16 mtu); /** * @brief GetBleMtu * @note Only available on [5.0.0+]. * @param[in] id Same as \ref btmBleDisconnect. * @param[out] out Output MTU. */ Result btmGetBleMtu(u32 id, 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);