Skip to content

Commit 760c7e0

Browse files
committed
Make BTE API more generic
1 parent aafc456 commit 760c7e0

4 files changed

Lines changed: 127 additions & 62 deletions

File tree

gc/bte/bte.h

Lines changed: 3 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -70,11 +70,6 @@
7070
#define BD_NAME_LEN 248
7171
#define BD_MAX_INQUIRY_DEVS 255
7272

73-
enum pair_mode {
74-
PAIR_MODE_NORMAL,
75-
PAIR_MODE_TEMPORARY
76-
};
77-
7873
#ifdef __cplusplus
7974
extern "C" {
8075
#endif /* __cplusplus */
@@ -155,12 +150,14 @@ s32 BTE_PeriodicInquiry(u8 max_cnt,u8 flush,btecallback cb);
155150
s32 BTE_ExitPeriodicInquiry(void);
156151
s32 BTE_LinkKeyRequestReply(struct bd_addr *bdaddr,u8 *key);
157152
s32 BTE_LinkKeyRequestNegativeReply(struct bd_addr *bdaddr);
153+
s32 BTE_PinCodeRequestReply(struct bd_addr *bdaddr,u8 pinlen,u8 *pincode);
158154
void (*BTE_SetDisconnectCallback(void (*callback)(struct bd_addr *bdaddr,u8 reason)))(struct bd_addr *bdaddr,u8 reason);
159155
void BTE_SetHostSyncButtonCallback(void (*callback)(u32 held));
160156
void BTE_SetConnectionRequestCallback(s8 (*callback)(void *arg,struct bd_addr *bdaddr,u8 *cod,u8 link_type));
161157
void BTE_SetLinkKeyRequestCallback(s8 (*callback)(void *arg,struct bd_addr *bdaddr));
162158
void BTE_SetLinkKeyNotificationCallback(s8 (*callback)(void *arg,struct bd_addr *bdaddr,u8 *key));
163-
u8 BTE_GetPairMode(void);
159+
void BTE_SetPinCodeRequestCallback(s8 (*callback)(void *arg,struct bd_addr *bdaddr));
160+
s32 BTE_GetLocalAddress(struct bd_addr *bdaddr);
164161
s32 BTE_WriteStoredLinkKey(struct bd_addr *bdaddr,u8 *key);
165162
s32 BTE_ClearStoredLinkKeys(void);
166163
s32 BTE_DeleteStoredLinkKey(struct bd_addr *bdaddr);

lwbt/bte.c

Lines changed: 72 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -42,8 +42,6 @@ struct bt_state
4242

4343
u8_t num_maxdevs;
4444

45-
u8_t pair_mode;
46-
4745
struct bte_inquiry_res inq_res;
4846

4947
btecallback cb;
@@ -89,7 +87,6 @@ static u8_t bte_patch1[92] = {
8987
static u8 ppc_stack[STACKSIZE] ATTRIBUTE_ALIGN(8);
9088

9189
err_t acl_wlp_completed(void *arg,struct bd_addr *bdaddr);
92-
err_t pin_req(void *arg,struct bd_addr *bdaddr);
9390
err_t l2cap_connected(void *arg,struct l2cap_pcb *l2cappcb,u16_t result,u16_t status);
9491
err_t l2cap_accepted(void *arg,struct l2cap_pcb *l2cappcb,err_t err);
9592
err_t acl_conn_complete(void *arg,struct bd_addr *bdaddr);
@@ -392,7 +389,6 @@ void BTE_Init(void)
392389
hci_connection_complete(acl_conn_complete);
393390
hci_auth_complete(acl_auth_complete);
394391
hci_remote_name_req_complete(bte_read_remote_name_complete);
395-
hci_pin_req(pin_req);
396392
_CPU_ISR_Restore(level);
397393

398394
tb.tv_sec = 1;
@@ -584,11 +580,6 @@ s32 BTE_LinkKeyRequestNegativeReply(struct bd_addr *bdaddr)
584580
return last_err;
585581
}
586582

587-
u8 BTE_GetPairMode(void)
588-
{
589-
return btstate.pair_mode;
590-
}
591-
592583
void (*BTE_SetDisconnectCallback(void (*callback)(struct bd_addr *bdaddr,u8 reason)))(struct bd_addr *bdaddr,u8 reason)
593584
{
594585
return l2cap_disconnect_bb(callback);
@@ -684,6 +675,47 @@ s32 BTE_DeleteStoredLinkKey(struct bd_addr *bdaddr)
684675
return last_err;
685676
}
686677

678+
void BTE_SetPinCodeRequestCallback(err_t (*callback)(void *arg,struct bd_addr *bdaddr))
679+
{
680+
u32 level;
681+
682+
_CPU_ISR_Disable(level);
683+
hci_pin_req(callback);
684+
_CPU_ISR_Restore(level);
685+
}
686+
687+
s32 BTE_GetLocalAddress(struct bd_addr *bdaddr)
688+
{
689+
u32 level;
690+
err_t last_err = ERR_OK;
691+
692+
LOG("BTE_GetLocalAddress\n");
693+
694+
_CPU_ISR_Disable(level);
695+
hci_get_bd_addr(bdaddr);
696+
_CPU_ISR_Restore(level);
697+
698+
return last_err;
699+
}
700+
701+
s32 BTE_PinCodeRequestReply(struct bd_addr *bdaddr,u8 pinlen,u8 *pincode)
702+
{
703+
u32 level;
704+
err_t last_err = ERR_OK;
705+
706+
LOG("BTE_PinCodeRequestReply\n");
707+
708+
_CPU_ISR_Disable(level);
709+
btstate.cb = NULL;
710+
btstate.usrdata = NULL;
711+
btstate.hci_cmddone = 0;
712+
hci_arg(&btstate);
713+
hci_pin_code_request_reply(bdaddr, pinlen, pincode);
714+
_CPU_ISR_Restore(level);
715+
716+
return last_err;
717+
}
718+
687719
struct bte_pcb* bte_new(void)
688720
{
689721
struct bte_pcb *pcb;
@@ -713,7 +745,6 @@ s32 BTE_Inquiry(u8 max_cnt,u8 flush,btecallback cb)
713745
_CPU_ISR_Disable(level);
714746
if(btstate.inq_res.count==0 || flush==1) {
715747
btstate.inq_complete_cb = cb;
716-
btstate.pair_mode = PAIR_MODE_NORMAL;
717748
btstate.num_maxdevs = max_cnt;
718749
hci_arg(&btstate);
719750
// Use Limited Dedicated Inquiry Access Code (LIAC) to query, since third-party Wiimotes
@@ -724,14 +755,28 @@ s32 BTE_Inquiry(u8 max_cnt,u8 flush,btecallback cb)
724755
return ERR_OK;
725756
}
726757

758+
s32 BTE_InquiryEx(u8 max_cnt,u8 flush,btecallback cb,u32 lap)
759+
{
760+
u32 level;
761+
762+
_CPU_ISR_Disable(level);
763+
if(btstate.inq_res.count==0 || flush==1) {
764+
btstate.inq_complete_cb = cb;
765+
btstate.num_maxdevs = max_cnt;
766+
hci_arg(&btstate);
767+
hci_inquiry(lap,0x03,max_cnt,bte_inquiry_complete);
768+
}
769+
_CPU_ISR_Restore(level);
770+
return ERR_OK;
771+
}
772+
727773
s32 BTE_PeriodicInquiry(u8 max_cnt,u8 flush,btecallback cb)
728774
{
729775
u32 level;
730776

731777
_CPU_ISR_Disable(level);
732778
if(btstate.inq_res.count==0 || flush==1) {
733779
btstate.inq_complete_cb = cb;
734-
btstate.pair_mode = PAIR_MODE_TEMPORARY;
735780
btstate.num_maxdevs = max_cnt;
736781
hci_arg(&btstate);
737782
// Use Limited Dedicated Inquiry Access Code (LIAC) to query, since third-party Wiimotes
@@ -742,12 +787,26 @@ s32 BTE_PeriodicInquiry(u8 max_cnt,u8 flush,btecallback cb)
742787
return ERR_OK;
743788
}
744789

790+
s32 BTE_PeriodicInquiryEx(u8 max_cnt,u8 flush,btecallback cb, u32 lap)
791+
{
792+
u32 level;
793+
794+
_CPU_ISR_Disable(level);
795+
if(btstate.inq_res.count==0 || flush==1) {
796+
btstate.inq_complete_cb = cb;
797+
btstate.num_maxdevs = max_cnt;
798+
hci_arg(&btstate);
799+
hci_periodic_inquiry(lap,0x04,0x05,0x03,max_cnt,bte_inquiry_complete);
800+
}
801+
_CPU_ISR_Restore(level);
802+
return ERR_OK;
803+
}
804+
745805
s32 BTE_ExitPeriodicInquiry(void)
746806
{
747807
u32 level;
748808

749809
_CPU_ISR_Disable(level);
750-
btstate.pair_mode = PAIR_MODE_NORMAL;
751810
hci_exit_periodic_inquiry();
752811
_CPU_ISR_Restore(level);
753812
return ERR_OK;
@@ -1046,25 +1105,6 @@ err_t acl_auth_complete(void *arg,struct bd_addr *bdaddr)
10461105
return ERR_OK;
10471106
}
10481107

1049-
err_t pin_req(void *arg,struct bd_addr *bdaddr)
1050-
{
1051-
struct bd_addr addr;
1052-
LOG("pin_req\n");
1053-
1054-
if (btstate.pair_mode == PAIR_MODE_NORMAL)
1055-
{
1056-
// Pairing from sync button (permanent)
1057-
hci_get_bd_addr(&addr);
1058-
}
1059-
else
1060-
{
1061-
// Pairing from 1+2 (guest/temporary)
1062-
bd_addr_set(&addr, bdaddr);
1063-
}
1064-
hci_pin_code_request_reply(bdaddr, sizeof(addr.addr), addr.addr);
1065-
return ERR_OK;
1066-
}
1067-
10681108
err_t l2cap_disconnected_ind(void *arg, struct l2cap_pcb *pcb, err_t err)
10691109
{
10701110
struct bte_pcb *bte = (struct bte_pcb*)arg;
@@ -1220,8 +1260,7 @@ err_t bte_inquiry_complete(void *arg,struct hci_pcb *pcb,struct hci_inq_res *ire
12201260
state->hci_cmddone = 1;
12211261
state->inq_complete_cb(ERR_OK,&state->inq_res);
12221262
_CPU_ISR_Restore(level);
1223-
} else if (state->pair_mode == PAIR_MODE_NORMAL)
1224-
hci_inquiry(0x009E8B00,0x03,btstate.num_maxdevs,bte_inquiry_complete);
1263+
}
12251264
}
12261265
return ERR_OK;
12271266
}

lwbt/hci.c

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1581,8 +1581,7 @@ u16_t lp_pdu_maxsize(void)
15811581
/*-----------------------------------------------------------------------------------*/
15821582
/* hci_get_bd_addr():
15831583
*
1584-
* Called by L2CAP to check the maxsize of the PDU. In this case it is the largest
1585-
* ACL packet that the Host Controller can buffer.
1584+
* Called by the host to get its own local Bluetooth address.
15861585
*/
15871586
/*-----------------------------------------------------------------------------------*/
15881587
void hci_get_bd_addr(struct bd_addr *bdaddr)

0 commit comments

Comments
 (0)