bt: fill in unknowns and update function parameters to match their btdrv counterparts (#644)

This commit is contained in:
ndeadly 2024-06-28 14:48:22 +02:00 committed by GitHub
parent df0508200b
commit 3c851a3443
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
2 changed files with 91 additions and 91 deletions

View File

@ -2,7 +2,7 @@
* @file bt.h * @file bt.h
* @brief Bluetooth user (bt) service IPC wrapper. * @brief Bluetooth user (bt) service IPC wrapper.
* @note See also btdev. * @note See also btdev.
* @author yellows8 * @author yellows8, ndeadly
* @copyright libnx Authors * @copyright libnx Authors
*/ */
#pragma once #pragma once
@ -24,93 +24,93 @@ Service* btGetServiceSession(void);
* @brief LeClientReadCharacteristic * @brief LeClientReadCharacteristic
* @note This is essentially the same as \ref btdrvReadGattCharacteristic. * @note This is essentially the same as \ref btdrvReadGattCharacteristic.
* @param[in] connection_handle ConnectionHandle * @param[in] connection_handle ConnectionHandle
* @param[in] primary_service PrimaryService * @param[in] is_primary Is a primary service or not
* @param[in] id0 \ref BtdrvGattId * @param[in] serv_id Service GATT ID \ref BtdrvGattId
* @param[in] id1 \ref BtdrvGattId * @param[in] char_id Characteristic GATT ID \ref BtdrvGattId
* @param[in] unk Unknown * @param[in] auth_req \ref BtdrvGattAuthReqType
*/ */
Result btLeClientReadCharacteristic(u32 connection_handle, bool primary_service, const BtdrvGattId *id0, const BtdrvGattId *id1, u8 unk); Result btLeClientReadCharacteristic(u32 connection_handle, bool is_primary, const BtdrvGattId *serv_id, const BtdrvGattId *char_id, u8 auth_req);
/** /**
* @brief LeClientReadDescriptor * @brief LeClientReadDescriptor
* @note This is essentially the same as \ref btdrvReadGattDescriptor. * @note This is essentially the same as \ref btdrvReadGattDescriptor.
* @param[in] connection_handle ConnectionHandle * @param[in] connection_handle ConnectionHandle
* @param[in] primary_service PrimaryService * @param[in] is_primary Is a primary service or not
* @param[in] id0 \ref BtdrvGattId * @param[in] serv_id Service GATT ID \ref BtdrvGattId
* @param[in] id1 \ref BtdrvGattId * @param[in] char_id Characteristic GATT ID \ref BtdrvGattId
* @param[in] id2 \ref BtdrvGattId * @param[in] desc_id Descriptor GATT ID \ref BtdrvGattId
* @param[in] unk Unknown * @param[in] auth_req \ref BtdrvGattAuthReqType
*/ */
Result btLeClientReadDescriptor(u32 connection_handle, bool primary_service, const BtdrvGattId *id0, const BtdrvGattId *id1, const BtdrvGattId *id2, u8 unk); Result btLeClientReadDescriptor(u32 connection_handle, bool is_primary, const BtdrvGattId *serv_id, const BtdrvGattId *char_id, const BtdrvGattId *desc_id, u8 auth_req);
/** /**
* @brief LeClientWriteCharacteristic * @brief LeClientWriteCharacteristic
* @note This is essentially the same as \ref btdrvWriteGattCharacteristic. * @note This is essentially the same as \ref btdrvWriteGattCharacteristic.
* @param[in] connection_handle ConnectionHandle * @param[in] connection_handle ConnectionHandle
* @param[in] primary_service PrimaryService * @param[in] is_primary Is a primary service or not
* @param[in] id0 \ref BtdrvGattId * @param[in] serv_id Service GATT ID \ref BtdrvGattId
* @param[in] id1 \ref BtdrvGattId * @param[in] char_id Characteristic GATT ID \ref BtdrvGattId
* @param[in] buffer Input buffer. * @param[in] buffer Input buffer.
* @param[in] size Input buffer size, must be <=0x258. * @param[in] size Input buffer size, must be <=0x258.
* @param[in] unk Unknown * @param[in] auth_req \ref BtdrvGattAuthReqType
* @param[in] flag Flag * @param[in] with_response Whether to use Write-With-Response write type or not
*/ */
Result btLeClientWriteCharacteristic(u32 connection_handle, bool primary_service, const BtdrvGattId *id0, const BtdrvGattId *id1, const void* buffer, size_t size, u8 unk, bool flag); Result btLeClientWriteCharacteristic(u32 connection_handle, bool is_primary, const BtdrvGattId *serv_id, const BtdrvGattId *char_id, const void* buffer, size_t size, u8 auth_req, bool with_response);
/** /**
* @brief LeClientWriteDescriptor * @brief LeClientWriteDescriptor
* @note This is essentially the same as \ref btdrvWriteGattDescriptor. * @note This is essentially the same as \ref btdrvWriteGattDescriptor.
* @param[in] connection_handle ConnectionHandle * @param[in] connection_handle ConnectionHandle
* @param[in] primary_service PrimaryService * @param[in] is_primary Is a primary service or not
* @param[in] id0 \ref BtdrvGattId * @param[in] serv_id Service GATT ID \ref BtdrvGattId
* @param[in] id1 \ref BtdrvGattId * @param[in] char_id Characteristic GATT ID \ref BtdrvGattId
* @param[in] id2 \ref BtdrvGattId * @param[in] desc_id Descriptor GATT ID \ref BtdrvGattId
* @param[in] buffer Input buffer. * @param[in] buffer Input buffer.
* @param[in] size Input buffer size, must be <=0x258. * @param[in] size Input buffer size, must be <=0x258.
* @param[in] unk Unknown * @param[in] auth_req \ref BtdrvGattAuthReqType
*/ */
Result btLeClientWriteDescriptor(u32 connection_handle, bool primary_service, const BtdrvGattId *id0, const BtdrvGattId *id1, const BtdrvGattId *id2, const void* buffer, size_t size, u8 unk); Result btLeClientWriteDescriptor(u32 connection_handle, bool is_primary, const BtdrvGattId *serv_id, const BtdrvGattId *char_id, const BtdrvGattId *desc_id, const void* buffer, size_t size, u8 auth_req);
/** /**
* @brief LeClientRegisterNotification * @brief LeClientRegisterNotification
* @note This is essentially the same as \ref btdrvRegisterGattNotification. * @note This is essentially the same as \ref btdrvRegisterGattNotification.
* @param[in] connection_handle ConnectionHandle * @param[in] connection_handle ConnectionHandle
* @param[in] primary_service PrimaryService * @param[in] is_primary Is a primary service or not
* @param[in] id0 \ref BtdrvGattId * @param[in] serv_id Service GATT ID \ref BtdrvGattId
* @param[in] id1 \ref BtdrvGattId * @param[in] char_id Characteristic GATT ID \ref BtdrvGattId
*/ */
Result btLeClientRegisterNotification(u32 connection_handle, bool primary_service, const BtdrvGattId *id0, const BtdrvGattId *id1); Result btLeClientRegisterNotification(u32 connection_handle, bool is_primary, const BtdrvGattId *serv_id, const BtdrvGattId *char_id);
/** /**
* @brief LeClientDeregisterNotification * @brief LeClientDeregisterNotification
* @note This is essentially the same as \ref btdrvUnregisterGattNotification. * @note This is essentially the same as \ref btdrvUnregisterGattNotification.
* @param[in] connection_handle ConnectionHandle * @param[in] connection_handle ConnectionHandle
* @param[in] primary_service PrimaryService * @param[in] is_primary Is a primary service or not
* @param[in] id0 \ref BtdrvGattId * @param[in] serv_id Service GATT ID \ref BtdrvGattId
* @param[in] id1 \ref BtdrvGattId * @param[in] char_id Characteristic GATT ID \ref BtdrvGattId
*/ */
Result btLeClientDeregisterNotification(u32 connection_handle, bool primary_service, const BtdrvGattId *id0, const BtdrvGattId *id1); Result btLeClientDeregisterNotification(u32 connection_handle, bool is_primary, const BtdrvGattId *serv_id, const BtdrvGattId *char_id);
/** /**
* @brief SetLeResponse * @brief SetLeResponse
* @param[in] unk Unknown * @param[in] server_if Server interface ID
* @param[in] uuid0 \ref BtdrvGattAttributeUuid * @param[in] serv_uuid Service UUID \ref BtdrvGattAttributeUuid
* @param[in] uuid1 \ref BtdrvGattAttributeUuid * @param[in] char_uuid Characteristic UUID \ref BtdrvGattAttributeUuid
* @param[in] buffer Input buffer. * @param[in] buffer Input buffer.
* @param[in] size Input buffer size, must be <=0x258. * @param[in] size Input buffer size, must be <=0x258.
*/ */
Result btSetLeResponse(u8 unk, const BtdrvGattAttributeUuid *uuid0, const BtdrvGattAttributeUuid *uuid1, const void* buffer, size_t size); Result btSetLeResponse(u8 server_if, const BtdrvGattAttributeUuid *serv_uuid, const BtdrvGattAttributeUuid *char_uuid, const void* buffer, size_t size);
/** /**
* @brief LeSendIndication * @brief LeSendIndication
* @param[in] unk Unknown * @param[in] server_if Server interface ID
* @param[in] uuid0 \ref BtdrvGattAttributeUuid * @param[in] serv_uuid Service UUID \ref BtdrvGattAttributeUuid
* @param[in] uuid1 \ref BtdrvGattAttributeUuid * @param[in] char_uuid Characteristic UUID \ref BtdrvGattAttributeUuid
* @param[in] buffer Input buffer. * @param[in] buffer Input buffer.
* @param[in] size Input buffer size, clamped to max size 0x258. * @param[in] size Input buffer size, clamped to max size 0x258.
* @param[in] flag Flag * @param[in] noconfirm Whether no confirmation is required (notification) or not (indication)
*/ */
Result btLeSendIndication(u8 unk, const BtdrvGattAttributeUuid *uuid0, const BtdrvGattAttributeUuid *uuid1, const void* buffer, size_t size, bool flag); Result btLeSendIndication(u8 server_if, const BtdrvGattAttributeUuid *serv_uuid, const BtdrvGattAttributeUuid *char_uuid, const void* buffer, size_t size, bool noconfirm);
/** /**
* @brief GetLeEventInfo * @brief GetLeEventInfo
@ -118,9 +118,9 @@ Result btLeSendIndication(u8 unk, const BtdrvGattAttributeUuid *uuid0, const Btd
* @note The state used by this is reset after writing the data to output. * @note The state used by this is reset after writing the data to output.
* @param[in] buffer Output buffer. 0x400-bytes from state is written here. See \ref BtdrvLeEventInfo. * @param[in] buffer Output buffer. 0x400-bytes from state is written here. See \ref BtdrvLeEventInfo.
* @param[in] size Output buffer size. * @param[in] size Output buffer size.
* @param[out] type Output BleEventType. * @param[out] type Output BtdrvBleEventType.
*/ */
Result btGetLeEventInfo(void* buffer, size_t size, u32 *type); Result btGetLeEventInfo(void* buffer, size_t size, BtdrvBleEventType *type);
/** /**
* @brief RegisterBleEvent * @brief RegisterBleEvent

View File

@ -24,50 +24,50 @@ Service* btGetServiceSession(void) {
return &g_btSrv; return &g_btSrv;
} }
Result btLeClientReadCharacteristic(u32 connection_handle, bool primary_service, const BtdrvGattId *id0, const BtdrvGattId *id1, u8 unk) { Result btLeClientReadCharacteristic(u32 connection_handle, bool is_primary, const BtdrvGattId *serv_id, const BtdrvGattId *char_id, u8 auth_req) {
const struct { const struct {
u8 primary_service; u8 is_primary;
u8 unk; u8 auth_req;
u8 pad[2]; u8 pad[2];
u32 connection_handle; u32 connection_handle;
BtdrvGattId id0; BtdrvGattId serv_id;
BtdrvGattId id1; BtdrvGattId char_id;
u64 AppletResourceUserId; u64 AppletResourceUserId;
} in = { primary_service!=0, unk, {0}, connection_handle, *id0, *id1, appletGetAppletResourceUserId() }; } in = { is_primary!=0, auth_req, {0}, connection_handle, *serv_id, *char_id, appletGetAppletResourceUserId() };
return serviceDispatchIn(&g_btSrv, 0, in, return serviceDispatchIn(&g_btSrv, 0, in,
.in_send_pid = true, .in_send_pid = true,
); );
} }
Result btLeClientReadDescriptor(u32 connection_handle, bool primary_service, const BtdrvGattId *id0, const BtdrvGattId *id1, const BtdrvGattId *id2, u8 unk) { Result btLeClientReadDescriptor(u32 connection_handle, bool is_primary, const BtdrvGattId *serv_id, const BtdrvGattId *char_id, const BtdrvGattId *desc_id, u8 auth_req) {
const struct { const struct {
u8 primary_service; u8 is_primary;
u8 unk; u8 auth_req;
u8 pad[2]; u8 pad[2];
u32 connection_handle; u32 connection_handle;
BtdrvGattId id0; BtdrvGattId serv_id;
BtdrvGattId id1; BtdrvGattId char_id;
BtdrvGattId id2; BtdrvGattId desc_id;
u64 AppletResourceUserId; u64 AppletResourceUserId;
} in = { primary_service!=0, unk, {0}, connection_handle, *id0, *id1, *id2, appletGetAppletResourceUserId() }; } in = { is_primary!=0, auth_req, {0}, connection_handle, *serv_id, *char_id, *desc_id, appletGetAppletResourceUserId() };
return serviceDispatchIn(&g_btSrv, 1, in, return serviceDispatchIn(&g_btSrv, 1, in,
.in_send_pid = true, .in_send_pid = true,
); );
} }
Result btLeClientWriteCharacteristic(u32 connection_handle, bool primary_service, const BtdrvGattId *id0, const BtdrvGattId *id1, const void* buffer, size_t size, u8 unk, bool flag) { Result btLeClientWriteCharacteristic(u32 connection_handle, bool is_primary, const BtdrvGattId *serv_id, const BtdrvGattId *char_id, const void* buffer, size_t size, u8 auth_req, bool with_response) {
const struct { const struct {
u8 primary_service; u8 is_primary;
u8 unk; u8 auth_req;
u8 flag; u8 with_response;
u8 pad; u8 pad;
u32 connection_handle; u32 connection_handle;
BtdrvGattId id0; BtdrvGattId serv_id;
BtdrvGattId id1; BtdrvGattId char_id;
u64 AppletResourceUserId; u64 AppletResourceUserId;
} in = { primary_service!=0, unk, flag!=0, 0, connection_handle, *id0, *id1, appletGetAppletResourceUserId() }; } in = { is_primary!=0, auth_req, with_response!=0, 0, connection_handle, *serv_id, *char_id, appletGetAppletResourceUserId() };
return serviceDispatchIn(&g_btSrv, 2, in, return serviceDispatchIn(&g_btSrv, 2, in,
.buffer_attrs = { SfBufferAttr_HipcPointer | SfBufferAttr_In }, .buffer_attrs = { SfBufferAttr_HipcPointer | SfBufferAttr_In },
@ -76,17 +76,17 @@ Result btLeClientWriteCharacteristic(u32 connection_handle, bool primary_service
); );
} }
Result btLeClientWriteDescriptor(u32 connection_handle, bool primary_service, const BtdrvGattId *id0, const BtdrvGattId *id1, const BtdrvGattId *id2, const void* buffer, size_t size, u8 unk) { Result btLeClientWriteDescriptor(u32 connection_handle, bool is_primary, const BtdrvGattId *serv_id, const BtdrvGattId *char_id, const BtdrvGattId *desc_id, const void* buffer, size_t size, u8 auth_req) {
const struct { const struct {
u8 primary_service; u8 is_primary;
u8 unk; u8 auth_req;
u8 pad[2]; u8 pad[2];
u32 connection_handle; u32 connection_handle;
BtdrvGattId id0; BtdrvGattId serv_id;
BtdrvGattId id1; BtdrvGattId char_id;
BtdrvGattId id2; BtdrvGattId desc_id;
u64 AppletResourceUserId; u64 AppletResourceUserId;
} in = { primary_service!=0, unk, {0}, connection_handle, *id0, *id1, *id2, appletGetAppletResourceUserId() }; } in = { is_primary!=0, auth_req, {0}, connection_handle, *serv_id, *char_id, *desc_id, appletGetAppletResourceUserId() };
return serviceDispatchIn(&g_btSrv, 3, in, return serviceDispatchIn(&g_btSrv, 3, in,
.buffer_attrs = { SfBufferAttr_HipcPointer | SfBufferAttr_In }, .buffer_attrs = { SfBufferAttr_HipcPointer | SfBufferAttr_In },
@ -95,38 +95,38 @@ Result btLeClientWriteDescriptor(u32 connection_handle, bool primary_service, co
); );
} }
static Result _btLeClientNotification(u32 connection_handle, bool primary_service, const BtdrvGattId *id0, const BtdrvGattId *id1, u32 cmd_id) { static Result _btLeClientNotification(u32 connection_handle, bool is_primary, const BtdrvGattId *serv_id, const BtdrvGattId *char_id, u32 cmd_id) {
const struct { const struct {
u8 primary_service; u8 is_primary;
u8 pad[3]; u8 pad[3];
u32 connection_handle; u32 connection_handle;
BtdrvGattId id0; BtdrvGattId serv_id;
BtdrvGattId id1; BtdrvGattId char_id;
u64 AppletResourceUserId; u64 AppletResourceUserId;
} in = { primary_service!=0, {0}, connection_handle, *id0, *id1, appletGetAppletResourceUserId() }; } in = { is_primary!=0, {0}, connection_handle, *serv_id, *char_id, appletGetAppletResourceUserId() };
return serviceDispatchIn(&g_btSrv, cmd_id, in, return serviceDispatchIn(&g_btSrv, cmd_id, in,
.in_send_pid = true, .in_send_pid = true,
); );
} }
Result btLeClientRegisterNotification(u32 connection_handle, bool primary_service, const BtdrvGattId *id0, const BtdrvGattId *id1) { Result btLeClientRegisterNotification(u32 connection_handle, bool is_primary, const BtdrvGattId *serv_id, const BtdrvGattId *char_id) {
return _btLeClientNotification(connection_handle, primary_service, id0, id1, 4); return _btLeClientNotification(connection_handle, is_primary, serv_id, char_id, 4);
} }
Result btLeClientDeregisterNotification(u32 connection_handle, bool primary_service, const BtdrvGattId *id0, const BtdrvGattId *id1) { Result btLeClientDeregisterNotification(u32 connection_handle, bool is_primary, const BtdrvGattId *serv_id, const BtdrvGattId *char_id) {
return _btLeClientNotification(connection_handle, primary_service, id0, id1, 5); return _btLeClientNotification(connection_handle, is_primary, serv_id, char_id, 5);
} }
Result btSetLeResponse(u8 unk, const BtdrvGattAttributeUuid *uuid0, const BtdrvGattAttributeUuid *uuid1, const void* buffer, size_t size) { Result btSetLeResponse(u8 server_if, const BtdrvGattAttributeUuid *serv_uuid, const BtdrvGattAttributeUuid *char_uuid, const void* buffer, size_t size) {
const struct { const struct {
u8 unk; u8 server_if;
u8 pad[3]; u8 pad[3];
BtdrvGattAttributeUuid uuid0; BtdrvGattAttributeUuid serv_uuid;
BtdrvGattAttributeUuid uuid1; BtdrvGattAttributeUuid char_uuid;
u8 pad2[4]; u8 pad2[4];
u64 AppletResourceUserId; u64 AppletResourceUserId;
} in = { unk, {0}, *uuid0, *uuid1, {0}, appletGetAppletResourceUserId() }; } in = { server_if, {0}, *serv_uuid, *char_uuid, {0}, appletGetAppletResourceUserId() };
return serviceDispatchIn(&g_btSrv, 6, in, return serviceDispatchIn(&g_btSrv, 6, in,
.buffer_attrs = { SfBufferAttr_HipcPointer | SfBufferAttr_In }, .buffer_attrs = { SfBufferAttr_HipcPointer | SfBufferAttr_In },
@ -135,16 +135,16 @@ Result btSetLeResponse(u8 unk, const BtdrvGattAttributeUuid *uuid0, const BtdrvG
); );
} }
Result btLeSendIndication(u8 unk, const BtdrvGattAttributeUuid *uuid0, const BtdrvGattAttributeUuid *uuid1, const void* buffer, size_t size, bool flag) { Result btLeSendIndication(u8 server_if, const BtdrvGattAttributeUuid *serv_uuid, const BtdrvGattAttributeUuid *char_uuid, const void* buffer, size_t size, bool noconfirm) {
const struct { const struct {
u8 unk; u8 server_if;
u8 flag; u8 noconfirm;
u8 pad[2]; u8 pad[2];
BtdrvGattAttributeUuid uuid0; BtdrvGattAttributeUuid serv_uuid;
BtdrvGattAttributeUuid uuid1; BtdrvGattAttributeUuid char_uuid;
u8 pad2[4]; u8 pad2[4];
u64 AppletResourceUserId; u64 AppletResourceUserId;
} in = { unk, flag!=0, {0}, *uuid0, *uuid1, {0}, appletGetAppletResourceUserId() }; } in = { server_if, noconfirm!=0, {0}, *serv_uuid, *char_uuid, {0}, appletGetAppletResourceUserId() };
return serviceDispatchIn(&g_btSrv, 7, in, return serviceDispatchIn(&g_btSrv, 7, in,
.buffer_attrs = { SfBufferAttr_HipcPointer | SfBufferAttr_In }, .buffer_attrs = { SfBufferAttr_HipcPointer | SfBufferAttr_In },
@ -153,7 +153,7 @@ Result btLeSendIndication(u8 unk, const BtdrvGattAttributeUuid *uuid0, const Btd
); );
} }
Result btGetLeEventInfo(void* buffer, size_t size, u32 *type) { Result btGetLeEventInfo(void* buffer, size_t size, BtdrvBleEventType *type) {
u64 AppletResourceUserId = appletGetAppletResourceUserId(); u64 AppletResourceUserId = appletGetAppletResourceUserId();
return serviceDispatchInOut(&g_btSrv, 8, AppletResourceUserId, *type, return serviceDispatchInOut(&g_btSrv, 8, AppletResourceUserId, *type,
.buffer_attrs = { SfBufferAttr_HipcPointer | SfBufferAttr_Out }, .buffer_attrs = { SfBufferAttr_HipcPointer | SfBufferAttr_Out },