Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
9 changes: 3 additions & 6 deletions gc/bte/bte.h
Original file line number Diff line number Diff line change
Expand Up @@ -70,11 +70,6 @@
#define BD_NAME_LEN 248
#define BD_MAX_INQUIRY_DEVS 255

enum pair_mode {
PAIR_MODE_NORMAL,
PAIR_MODE_TEMPORARY
};

#ifdef __cplusplus
extern "C" {
#endif /* __cplusplus */
Expand Down Expand Up @@ -155,12 +150,14 @@ s32 BTE_PeriodicInquiry(u8 max_cnt,u8 flush,btecallback cb);
s32 BTE_ExitPeriodicInquiry(void);
s32 BTE_LinkKeyRequestReply(struct bd_addr *bdaddr,u8 *key);
s32 BTE_LinkKeyRequestNegativeReply(struct bd_addr *bdaddr);
s32 BTE_PinCodeRequestReply(struct bd_addr *bdaddr,u8 pinlen,u8 *pincode);
void (*BTE_SetDisconnectCallback(void (*callback)(struct bd_addr *bdaddr,u8 reason)))(struct bd_addr *bdaddr,u8 reason);
void BTE_SetHostSyncButtonCallback(void (*callback)(u32 held));
void BTE_SetConnectionRequestCallback(s8 (*callback)(void *arg,struct bd_addr *bdaddr,u8 *cod,u8 link_type));
void BTE_SetLinkKeyRequestCallback(s8 (*callback)(void *arg,struct bd_addr *bdaddr));
void BTE_SetLinkKeyNotificationCallback(s8 (*callback)(void *arg,struct bd_addr *bdaddr,u8 *key));
u8 BTE_GetPairMode(void);
void BTE_SetPinCodeRequestCallback(s8 (*callback)(void *arg,struct bd_addr *bdaddr));
s32 BTE_GetLocalAddress(struct bd_addr *bdaddr);
s32 BTE_WriteStoredLinkKey(struct bd_addr *bdaddr,u8 *key);
s32 BTE_ClearStoredLinkKeys(void);
s32 BTE_DeleteStoredLinkKey(struct bd_addr *bdaddr);
Expand Down
105 changes: 72 additions & 33 deletions lwbt/bte.c
Original file line number Diff line number Diff line change
Expand Up @@ -42,8 +42,6 @@ struct bt_state

u8_t num_maxdevs;

u8_t pair_mode;

struct bte_inquiry_res inq_res;

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

err_t acl_wlp_completed(void *arg,struct bd_addr *bdaddr);
err_t pin_req(void *arg,struct bd_addr *bdaddr);
err_t l2cap_connected(void *arg,struct l2cap_pcb *l2cappcb,u16_t result,u16_t status);
err_t l2cap_accepted(void *arg,struct l2cap_pcb *l2cappcb,err_t err);
err_t acl_conn_complete(void *arg,struct bd_addr *bdaddr);
Expand Down Expand Up @@ -392,7 +389,6 @@ void BTE_Init(void)
hci_connection_complete(acl_conn_complete);
hci_auth_complete(acl_auth_complete);
hci_remote_name_req_complete(bte_read_remote_name_complete);
hci_pin_req(pin_req);
_CPU_ISR_Restore(level);

tb.tv_sec = 1;
Expand Down Expand Up @@ -584,11 +580,6 @@ s32 BTE_LinkKeyRequestNegativeReply(struct bd_addr *bdaddr)
return last_err;
}

u8 BTE_GetPairMode(void)
{
return btstate.pair_mode;
}

void (*BTE_SetDisconnectCallback(void (*callback)(struct bd_addr *bdaddr,u8 reason)))(struct bd_addr *bdaddr,u8 reason)
{
return l2cap_disconnect_bb(callback);
Expand Down Expand Up @@ -684,6 +675,47 @@ s32 BTE_DeleteStoredLinkKey(struct bd_addr *bdaddr)
return last_err;
}

void BTE_SetPinCodeRequestCallback(err_t (*callback)(void *arg,struct bd_addr *bdaddr))
{
u32 level;

_CPU_ISR_Disable(level);
hci_pin_req(callback);
_CPU_ISR_Restore(level);
}

s32 BTE_GetLocalAddress(struct bd_addr *bdaddr)
{
u32 level;
err_t last_err = ERR_OK;

LOG("BTE_GetLocalAddress\n");

_CPU_ISR_Disable(level);
hci_get_bd_addr(bdaddr);
_CPU_ISR_Restore(level);

return last_err;
}

s32 BTE_PinCodeRequestReply(struct bd_addr *bdaddr,u8 pinlen,u8 *pincode)
{
u32 level;
err_t last_err = ERR_OK;

LOG("BTE_PinCodeRequestReply\n");

_CPU_ISR_Disable(level);
btstate.cb = NULL;
btstate.usrdata = NULL;
btstate.hci_cmddone = 0;
hci_arg(&btstate);
hci_pin_code_request_reply(bdaddr, pinlen, pincode);
_CPU_ISR_Restore(level);

return last_err;
}

struct bte_pcb* bte_new(void)
{
struct bte_pcb *pcb;
Expand Down Expand Up @@ -713,7 +745,6 @@ s32 BTE_Inquiry(u8 max_cnt,u8 flush,btecallback cb)
_CPU_ISR_Disable(level);
if(btstate.inq_res.count==0 || flush==1) {
btstate.inq_complete_cb = cb;
btstate.pair_mode = PAIR_MODE_NORMAL;
btstate.num_maxdevs = max_cnt;
hci_arg(&btstate);
// Use Limited Dedicated Inquiry Access Code (LIAC) to query, since third-party Wiimotes
Expand All @@ -724,14 +755,28 @@ s32 BTE_Inquiry(u8 max_cnt,u8 flush,btecallback cb)
return ERR_OK;
}

s32 BTE_InquiryEx(u8 max_cnt,u8 flush,btecallback cb,u32 lap)
{
u32 level;

_CPU_ISR_Disable(level);
if(btstate.inq_res.count==0 || flush==1) {
btstate.inq_complete_cb = cb;
btstate.num_maxdevs = max_cnt;
hci_arg(&btstate);
hci_inquiry(lap,0x03,max_cnt,bte_inquiry_complete);
}
_CPU_ISR_Restore(level);
return ERR_OK;
}

s32 BTE_PeriodicInquiry(u8 max_cnt,u8 flush,btecallback cb)
{
u32 level;

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

s32 BTE_PeriodicInquiryEx(u8 max_cnt,u8 flush,btecallback cb, u32 lap)
{
u32 level;

_CPU_ISR_Disable(level);
if(btstate.inq_res.count==0 || flush==1) {
btstate.inq_complete_cb = cb;
btstate.num_maxdevs = max_cnt;
hci_arg(&btstate);
hci_periodic_inquiry(lap,0x04,0x05,0x03,max_cnt,bte_inquiry_complete);
}
_CPU_ISR_Restore(level);
return ERR_OK;
}

s32 BTE_ExitPeriodicInquiry(void)
{
u32 level;

_CPU_ISR_Disable(level);
btstate.pair_mode = PAIR_MODE_NORMAL;
hci_exit_periodic_inquiry();
_CPU_ISR_Restore(level);
return ERR_OK;
Expand Down Expand Up @@ -1046,25 +1105,6 @@ err_t acl_auth_complete(void *arg,struct bd_addr *bdaddr)
return ERR_OK;
}

err_t pin_req(void *arg,struct bd_addr *bdaddr)
{
struct bd_addr addr;
LOG("pin_req\n");

if (btstate.pair_mode == PAIR_MODE_NORMAL)
{
// Pairing from sync button (permanent)
hci_get_bd_addr(&addr);
}
else
{
// Pairing from 1+2 (guest/temporary)
bd_addr_set(&addr, bdaddr);
}
hci_pin_code_request_reply(bdaddr, sizeof(addr.addr), addr.addr);
return ERR_OK;
}

err_t l2cap_disconnected_ind(void *arg, struct l2cap_pcb *pcb, err_t err)
{
struct bte_pcb *bte = (struct bte_pcb*)arg;
Expand Down Expand Up @@ -1220,8 +1260,7 @@ err_t bte_inquiry_complete(void *arg,struct hci_pcb *pcb,struct hci_inq_res *ire
state->hci_cmddone = 1;
state->inq_complete_cb(ERR_OK,&state->inq_res);
_CPU_ISR_Restore(level);
} else if (state->pair_mode == PAIR_MODE_NORMAL)
hci_inquiry(0x009E8B00,0x03,btstate.num_maxdevs,bte_inquiry_complete);
}
}
return ERR_OK;
}
Expand Down
3 changes: 1 addition & 2 deletions lwbt/hci.c
Original file line number Diff line number Diff line change
Expand Up @@ -1581,8 +1581,7 @@ u16_t lp_pdu_maxsize(void)
/*-----------------------------------------------------------------------------------*/
/* hci_get_bd_addr():
*
* Called by L2CAP to check the maxsize of the PDU. In this case it is the largest
* ACL packet that the Host Controller can buffer.
* Called by the host to get its own local Bluetooth address.
*/
/*-----------------------------------------------------------------------------------*/
void hci_get_bd_addr(struct bd_addr *bdaddr)
Expand Down
6 changes: 5 additions & 1 deletion lwbt/l2cap.c
Original file line number Diff line number Diff line change
Expand Up @@ -293,6 +293,10 @@ void l2cap_process_sig(struct pbuf *q, struct l2cap_hdr *l2caphdr, struct bd_add

switch(sighdr->code) {
case L2CAP_CMD_REJ:
if(pcb == NULL) {
/* A rejection without a matching PCB is silently discarded */
break;
}
/* Remove signal from unresponded list and deallocate it */
L2CAP_SIG_RMV(&(pcb->unrsp_sigs), sig);
btpbuf_free(sig->p);
Expand Down Expand Up @@ -701,7 +705,7 @@ void l2cap_process_sig(struct pbuf *q, struct l2cap_hdr *l2caphdr, struct bd_add
/* Give upper layer indication */
pcb->state = L2CAP_CLOSED;
LOG("l2cap_process_sig: Disconnection request\n");
L2CA_ACTION_DISCONN_IND(pcb,ERR_OK,ret);
L2CA_ACTION_DISCONN_IND(pcb,ERR_OK,ret);
}
}
break;
Expand Down
Loading