Skip to content

Commit 3c851a3

Browse files
authored
bt: fill in unknowns and update function parameters to match their btdrv counterparts (#644)
1 parent df05082 commit 3c851a3

File tree

2 files changed

+91
-91
lines changed
  • nx
    • include/switch/services
    • source/services

2 files changed

+91
-91
lines changed

nx/include/switch/services/bt.h

Lines changed: 43 additions & 43 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22
* @file bt.h
33
* @brief Bluetooth user (bt) service IPC wrapper.
44
* @note See also btdev.
5-
* @author yellows8
5+
* @author yellows8, ndeadly
66
* @copyright libnx Authors
77
*/
88
#pragma once
@@ -24,103 +24,103 @@ Service* btGetServiceSession(void);
2424
* @brief LeClientReadCharacteristic
2525
* @note This is essentially the same as \ref btdrvReadGattCharacteristic.
2626
* @param[in] connection_handle ConnectionHandle
27-
* @param[in] primary_service PrimaryService
28-
* @param[in] id0 \ref BtdrvGattId
29-
* @param[in] id1 \ref BtdrvGattId
30-
* @param[in] unk Unknown
27+
* @param[in] is_primary Is a primary service or not
28+
* @param[in] serv_id Service GATT ID \ref BtdrvGattId
29+
* @param[in] char_id Characteristic GATT ID \ref BtdrvGattId
30+
* @param[in] auth_req \ref BtdrvGattAuthReqType
3131
*/
32-
Result btLeClientReadCharacteristic(u32 connection_handle, bool primary_service, const BtdrvGattId *id0, const BtdrvGattId *id1, u8 unk);
32+
Result btLeClientReadCharacteristic(u32 connection_handle, bool is_primary, const BtdrvGattId *serv_id, const BtdrvGattId *char_id, u8 auth_req);
3333

3434
/**
3535
* @brief LeClientReadDescriptor
3636
* @note This is essentially the same as \ref btdrvReadGattDescriptor.
3737
* @param[in] connection_handle ConnectionHandle
38-
* @param[in] primary_service PrimaryService
39-
* @param[in] id0 \ref BtdrvGattId
40-
* @param[in] id1 \ref BtdrvGattId
41-
* @param[in] id2 \ref BtdrvGattId
42-
* @param[in] unk Unknown
38+
* @param[in] is_primary Is a primary service or not
39+
* @param[in] serv_id Service GATT ID \ref BtdrvGattId
40+
* @param[in] char_id Characteristic GATT ID \ref BtdrvGattId
41+
* @param[in] desc_id Descriptor GATT ID \ref BtdrvGattId
42+
* @param[in] auth_req \ref BtdrvGattAuthReqType
4343
*/
44-
Result btLeClientReadDescriptor(u32 connection_handle, bool primary_service, const BtdrvGattId *id0, const BtdrvGattId *id1, const BtdrvGattId *id2, u8 unk);
44+
Result btLeClientReadDescriptor(u32 connection_handle, bool is_primary, const BtdrvGattId *serv_id, const BtdrvGattId *char_id, const BtdrvGattId *desc_id, u8 auth_req);
4545

4646
/**
4747
* @brief LeClientWriteCharacteristic
4848
* @note This is essentially the same as \ref btdrvWriteGattCharacteristic.
4949
* @param[in] connection_handle ConnectionHandle
50-
* @param[in] primary_service PrimaryService
51-
* @param[in] id0 \ref BtdrvGattId
52-
* @param[in] id1 \ref BtdrvGattId
50+
* @param[in] is_primary Is a primary service or not
51+
* @param[in] serv_id Service GATT ID \ref BtdrvGattId
52+
* @param[in] char_id Characteristic GATT ID \ref BtdrvGattId
5353
* @param[in] buffer Input buffer.
5454
* @param[in] size Input buffer size, must be <=0x258.
55-
* @param[in] unk Unknown
56-
* @param[in] flag Flag
55+
* @param[in] auth_req \ref BtdrvGattAuthReqType
56+
* @param[in] with_response Whether to use Write-With-Response write type or not
5757
*/
58-
Result btLeClientWriteCharacteristic(u32 connection_handle, bool primary_service, const BtdrvGattId *id0, const BtdrvGattId *id1, const void* buffer, size_t size, u8 unk, bool flag);
58+
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);
5959

6060
/**
6161
* @brief LeClientWriteDescriptor
6262
* @note This is essentially the same as \ref btdrvWriteGattDescriptor.
6363
* @param[in] connection_handle ConnectionHandle
64-
* @param[in] primary_service PrimaryService
65-
* @param[in] id0 \ref BtdrvGattId
66-
* @param[in] id1 \ref BtdrvGattId
67-
* @param[in] id2 \ref BtdrvGattId
64+
* @param[in] is_primary Is a primary service or not
65+
* @param[in] serv_id Service GATT ID \ref BtdrvGattId
66+
* @param[in] char_id Characteristic GATT ID \ref BtdrvGattId
67+
* @param[in] desc_id Descriptor GATT ID \ref BtdrvGattId
6868
* @param[in] buffer Input buffer.
6969
* @param[in] size Input buffer size, must be <=0x258.
70-
* @param[in] unk Unknown
70+
* @param[in] auth_req \ref BtdrvGattAuthReqType
7171
*/
72-
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);
72+
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);
7373

7474
/**
7575
* @brief LeClientRegisterNotification
7676
* @note This is essentially the same as \ref btdrvRegisterGattNotification.
7777
* @param[in] connection_handle ConnectionHandle
78-
* @param[in] primary_service PrimaryService
79-
* @param[in] id0 \ref BtdrvGattId
80-
* @param[in] id1 \ref BtdrvGattId
78+
* @param[in] is_primary Is a primary service or not
79+
* @param[in] serv_id Service GATT ID \ref BtdrvGattId
80+
* @param[in] char_id Characteristic GATT ID \ref BtdrvGattId
8181
*/
82-
Result btLeClientRegisterNotification(u32 connection_handle, bool primary_service, const BtdrvGattId *id0, const BtdrvGattId *id1);
82+
Result btLeClientRegisterNotification(u32 connection_handle, bool is_primary, const BtdrvGattId *serv_id, const BtdrvGattId *char_id);
8383

8484
/**
8585
* @brief LeClientDeregisterNotification
8686
* @note This is essentially the same as \ref btdrvUnregisterGattNotification.
8787
* @param[in] connection_handle ConnectionHandle
88-
* @param[in] primary_service PrimaryService
89-
* @param[in] id0 \ref BtdrvGattId
90-
* @param[in] id1 \ref BtdrvGattId
88+
* @param[in] is_primary Is a primary service or not
89+
* @param[in] serv_id Service GATT ID \ref BtdrvGattId
90+
* @param[in] char_id Characteristic GATT ID \ref BtdrvGattId
9191
*/
92-
Result btLeClientDeregisterNotification(u32 connection_handle, bool primary_service, const BtdrvGattId *id0, const BtdrvGattId *id1);
92+
Result btLeClientDeregisterNotification(u32 connection_handle, bool is_primary, const BtdrvGattId *serv_id, const BtdrvGattId *char_id);
9393

9494
/**
9595
* @brief SetLeResponse
96-
* @param[in] unk Unknown
97-
* @param[in] uuid0 \ref BtdrvGattAttributeUuid
98-
* @param[in] uuid1 \ref BtdrvGattAttributeUuid
96+
* @param[in] server_if Server interface ID
97+
* @param[in] serv_uuid Service UUID \ref BtdrvGattAttributeUuid
98+
* @param[in] char_uuid Characteristic UUID \ref BtdrvGattAttributeUuid
9999
* @param[in] buffer Input buffer.
100100
* @param[in] size Input buffer size, must be <=0x258.
101101
*/
102-
Result btSetLeResponse(u8 unk, const BtdrvGattAttributeUuid *uuid0, const BtdrvGattAttributeUuid *uuid1, const void* buffer, size_t size);
102+
Result btSetLeResponse(u8 server_if, const BtdrvGattAttributeUuid *serv_uuid, const BtdrvGattAttributeUuid *char_uuid, const void* buffer, size_t size);
103103

104104
/**
105105
* @brief LeSendIndication
106-
* @param[in] unk Unknown
107-
* @param[in] uuid0 \ref BtdrvGattAttributeUuid
108-
* @param[in] uuid1 \ref BtdrvGattAttributeUuid
106+
* @param[in] server_if Server interface ID
107+
* @param[in] serv_uuid Service UUID \ref BtdrvGattAttributeUuid
108+
* @param[in] char_uuid Characteristic UUID \ref BtdrvGattAttributeUuid
109109
* @param[in] buffer Input buffer.
110110
* @param[in] size Input buffer size, clamped to max size 0x258.
111-
* @param[in] flag Flag
111+
* @param[in] noconfirm Whether no confirmation is required (notification) or not (indication)
112112
*/
113-
Result btLeSendIndication(u8 unk, const BtdrvGattAttributeUuid *uuid0, const BtdrvGattAttributeUuid *uuid1, const void* buffer, size_t size, bool flag);
113+
Result btLeSendIndication(u8 server_if, const BtdrvGattAttributeUuid *serv_uuid, const BtdrvGattAttributeUuid *char_uuid, const void* buffer, size_t size, bool noconfirm);
114114

115115
/**
116116
* @brief GetLeEventInfo
117117
* @note This is identical to \ref btdrvGetLeHidEventInfo except different state is used.
118118
* @note The state used by this is reset after writing the data to output.
119119
* @param[in] buffer Output buffer. 0x400-bytes from state is written here. See \ref BtdrvLeEventInfo.
120120
* @param[in] size Output buffer size.
121-
* @param[out] type Output BleEventType.
121+
* @param[out] type Output BtdrvBleEventType.
122122
*/
123-
Result btGetLeEventInfo(void* buffer, size_t size, u32 *type);
123+
Result btGetLeEventInfo(void* buffer, size_t size, BtdrvBleEventType *type);
124124

125125
/**
126126
* @brief RegisterBleEvent

nx/source/services/bt.c

Lines changed: 48 additions & 48 deletions
Original file line numberDiff line numberDiff line change
@@ -24,50 +24,50 @@ Service* btGetServiceSession(void) {
2424
return &g_btSrv;
2525
}
2626

27-
Result btLeClientReadCharacteristic(u32 connection_handle, bool primary_service, const BtdrvGattId *id0, const BtdrvGattId *id1, u8 unk) {
27+
Result btLeClientReadCharacteristic(u32 connection_handle, bool is_primary, const BtdrvGattId *serv_id, const BtdrvGattId *char_id, u8 auth_req) {
2828
const struct {
29-
u8 primary_service;
30-
u8 unk;
29+
u8 is_primary;
30+
u8 auth_req;
3131
u8 pad[2];
3232
u32 connection_handle;
33-
BtdrvGattId id0;
34-
BtdrvGattId id1;
33+
BtdrvGattId serv_id;
34+
BtdrvGattId char_id;
3535
u64 AppletResourceUserId;
36-
} in = { primary_service!=0, unk, {0}, connection_handle, *id0, *id1, appletGetAppletResourceUserId() };
36+
} in = { is_primary!=0, auth_req, {0}, connection_handle, *serv_id, *char_id, appletGetAppletResourceUserId() };
3737

3838
return serviceDispatchIn(&g_btSrv, 0, in,
3939
.in_send_pid = true,
4040
);
4141
}
4242

43-
Result btLeClientReadDescriptor(u32 connection_handle, bool primary_service, const BtdrvGattId *id0, const BtdrvGattId *id1, const BtdrvGattId *id2, u8 unk) {
43+
Result btLeClientReadDescriptor(u32 connection_handle, bool is_primary, const BtdrvGattId *serv_id, const BtdrvGattId *char_id, const BtdrvGattId *desc_id, u8 auth_req) {
4444
const struct {
45-
u8 primary_service;
46-
u8 unk;
45+
u8 is_primary;
46+
u8 auth_req;
4747
u8 pad[2];
4848
u32 connection_handle;
49-
BtdrvGattId id0;
50-
BtdrvGattId id1;
51-
BtdrvGattId id2;
49+
BtdrvGattId serv_id;
50+
BtdrvGattId char_id;
51+
BtdrvGattId desc_id;
5252
u64 AppletResourceUserId;
53-
} in = { primary_service!=0, unk, {0}, connection_handle, *id0, *id1, *id2, appletGetAppletResourceUserId() };
53+
} in = { is_primary!=0, auth_req, {0}, connection_handle, *serv_id, *char_id, *desc_id, appletGetAppletResourceUserId() };
5454

5555
return serviceDispatchIn(&g_btSrv, 1, in,
5656
.in_send_pid = true,
5757
);
5858
}
5959

60-
Result btLeClientWriteCharacteristic(u32 connection_handle, bool primary_service, const BtdrvGattId *id0, const BtdrvGattId *id1, const void* buffer, size_t size, u8 unk, bool flag) {
60+
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) {
6161
const struct {
62-
u8 primary_service;
63-
u8 unk;
64-
u8 flag;
62+
u8 is_primary;
63+
u8 auth_req;
64+
u8 with_response;
6565
u8 pad;
6666
u32 connection_handle;
67-
BtdrvGattId id0;
68-
BtdrvGattId id1;
67+
BtdrvGattId serv_id;
68+
BtdrvGattId char_id;
6969
u64 AppletResourceUserId;
70-
} in = { primary_service!=0, unk, flag!=0, 0, connection_handle, *id0, *id1, appletGetAppletResourceUserId() };
70+
} in = { is_primary!=0, auth_req, with_response!=0, 0, connection_handle, *serv_id, *char_id, appletGetAppletResourceUserId() };
7171

7272
return serviceDispatchIn(&g_btSrv, 2, in,
7373
.buffer_attrs = { SfBufferAttr_HipcPointer | SfBufferAttr_In },
@@ -76,17 +76,17 @@ Result btLeClientWriteCharacteristic(u32 connection_handle, bool primary_service
7676
);
7777
}
7878

79-
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) {
79+
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) {
8080
const struct {
81-
u8 primary_service;
82-
u8 unk;
81+
u8 is_primary;
82+
u8 auth_req;
8383
u8 pad[2];
8484
u32 connection_handle;
85-
BtdrvGattId id0;
86-
BtdrvGattId id1;
87-
BtdrvGattId id2;
85+
BtdrvGattId serv_id;
86+
BtdrvGattId char_id;
87+
BtdrvGattId desc_id;
8888
u64 AppletResourceUserId;
89-
} in = { primary_service!=0, unk, {0}, connection_handle, *id0, *id1, *id2, appletGetAppletResourceUserId() };
89+
} in = { is_primary!=0, auth_req, {0}, connection_handle, *serv_id, *char_id, *desc_id, appletGetAppletResourceUserId() };
9090

9191
return serviceDispatchIn(&g_btSrv, 3, in,
9292
.buffer_attrs = { SfBufferAttr_HipcPointer | SfBufferAttr_In },
@@ -95,38 +95,38 @@ Result btLeClientWriteDescriptor(u32 connection_handle, bool primary_service, co
9595
);
9696
}
9797

98-
static Result _btLeClientNotification(u32 connection_handle, bool primary_service, const BtdrvGattId *id0, const BtdrvGattId *id1, u32 cmd_id) {
98+
static Result _btLeClientNotification(u32 connection_handle, bool is_primary, const BtdrvGattId *serv_id, const BtdrvGattId *char_id, u32 cmd_id) {
9999
const struct {
100-
u8 primary_service;
100+
u8 is_primary;
101101
u8 pad[3];
102102
u32 connection_handle;
103-
BtdrvGattId id0;
104-
BtdrvGattId id1;
103+
BtdrvGattId serv_id;
104+
BtdrvGattId char_id;
105105
u64 AppletResourceUserId;
106-
} in = { primary_service!=0, {0}, connection_handle, *id0, *id1, appletGetAppletResourceUserId() };
106+
} in = { is_primary!=0, {0}, connection_handle, *serv_id, *char_id, appletGetAppletResourceUserId() };
107107

108108
return serviceDispatchIn(&g_btSrv, cmd_id, in,
109109
.in_send_pid = true,
110110
);
111111
}
112112

113-
Result btLeClientRegisterNotification(u32 connection_handle, bool primary_service, const BtdrvGattId *id0, const BtdrvGattId *id1) {
114-
return _btLeClientNotification(connection_handle, primary_service, id0, id1, 4);
113+
Result btLeClientRegisterNotification(u32 connection_handle, bool is_primary, const BtdrvGattId *serv_id, const BtdrvGattId *char_id) {
114+
return _btLeClientNotification(connection_handle, is_primary, serv_id, char_id, 4);
115115
}
116116

117-
Result btLeClientDeregisterNotification(u32 connection_handle, bool primary_service, const BtdrvGattId *id0, const BtdrvGattId *id1) {
118-
return _btLeClientNotification(connection_handle, primary_service, id0, id1, 5);
117+
Result btLeClientDeregisterNotification(u32 connection_handle, bool is_primary, const BtdrvGattId *serv_id, const BtdrvGattId *char_id) {
118+
return _btLeClientNotification(connection_handle, is_primary, serv_id, char_id, 5);
119119
}
120120

121-
Result btSetLeResponse(u8 unk, const BtdrvGattAttributeUuid *uuid0, const BtdrvGattAttributeUuid *uuid1, const void* buffer, size_t size) {
121+
Result btSetLeResponse(u8 server_if, const BtdrvGattAttributeUuid *serv_uuid, const BtdrvGattAttributeUuid *char_uuid, const void* buffer, size_t size) {
122122
const struct {
123-
u8 unk;
123+
u8 server_if;
124124
u8 pad[3];
125-
BtdrvGattAttributeUuid uuid0;
126-
BtdrvGattAttributeUuid uuid1;
125+
BtdrvGattAttributeUuid serv_uuid;
126+
BtdrvGattAttributeUuid char_uuid;
127127
u8 pad2[4];
128128
u64 AppletResourceUserId;
129-
} in = { unk, {0}, *uuid0, *uuid1, {0}, appletGetAppletResourceUserId() };
129+
} in = { server_if, {0}, *serv_uuid, *char_uuid, {0}, appletGetAppletResourceUserId() };
130130

131131
return serviceDispatchIn(&g_btSrv, 6, in,
132132
.buffer_attrs = { SfBufferAttr_HipcPointer | SfBufferAttr_In },
@@ -135,16 +135,16 @@ Result btSetLeResponse(u8 unk, const BtdrvGattAttributeUuid *uuid0, const BtdrvG
135135
);
136136
}
137137

138-
Result btLeSendIndication(u8 unk, const BtdrvGattAttributeUuid *uuid0, const BtdrvGattAttributeUuid *uuid1, const void* buffer, size_t size, bool flag) {
138+
Result btLeSendIndication(u8 server_if, const BtdrvGattAttributeUuid *serv_uuid, const BtdrvGattAttributeUuid *char_uuid, const void* buffer, size_t size, bool noconfirm) {
139139
const struct {
140-
u8 unk;
141-
u8 flag;
140+
u8 server_if;
141+
u8 noconfirm;
142142
u8 pad[2];
143-
BtdrvGattAttributeUuid uuid0;
144-
BtdrvGattAttributeUuid uuid1;
143+
BtdrvGattAttributeUuid serv_uuid;
144+
BtdrvGattAttributeUuid char_uuid;
145145
u8 pad2[4];
146146
u64 AppletResourceUserId;
147-
} in = { unk, flag!=0, {0}, *uuid0, *uuid1, {0}, appletGetAppletResourceUserId() };
147+
} in = { server_if, noconfirm!=0, {0}, *serv_uuid, *char_uuid, {0}, appletGetAppletResourceUserId() };
148148

149149
return serviceDispatchIn(&g_btSrv, 7, in,
150150
.buffer_attrs = { SfBufferAttr_HipcPointer | SfBufferAttr_In },
@@ -153,7 +153,7 @@ Result btLeSendIndication(u8 unk, const BtdrvGattAttributeUuid *uuid0, const Btd
153153
);
154154
}
155155

156-
Result btGetLeEventInfo(void* buffer, size_t size, u32 *type) {
156+
Result btGetLeEventInfo(void* buffer, size_t size, BtdrvBleEventType *type) {
157157
u64 AppletResourceUserId = appletGetAppletResourceUserId();
158158
return serviceDispatchInOut(&g_btSrv, 8, AppletResourceUserId, *type,
159159
.buffer_attrs = { SfBufferAttr_HipcPointer | SfBufferAttr_Out },

0 commit comments

Comments
 (0)