From 2b918cd3d839b8daf5917d1775ba093a267000be Mon Sep 17 00:00:00 2001 From: Zarithya Date: Sat, 15 Mar 2025 18:29:34 -0700 Subject: [PATCH 01/27] Add remote syncing --- gc/bte/bd_addr.h | 17 ++++ gc/bte/bte.h | 7 ++ gc/ogc/conf.h | 3 + gc/wiiuse/wiiuse.h | 3 +- gc/wiiuse/wpad.h | 2 + libogc/conf.c | 84 +++++++++++++++++++ lwbt/bte.c | 187 ++++++++++++++++++++++++++++++++++++++--- lwbt/btopt.h | 2 +- lwbt/hci.c | 190 ++++++++++++++++++++++++++++++++++++----- lwbt/hci.h | 57 ++++++++++++- wiiuse/io_wii.c | 27 ++++++ wiiuse/wpad.c | 204 ++++++++++++++++++++++++++++++++++++++++++--- 12 files changed, 734 insertions(+), 49 deletions(-) diff --git a/gc/bte/bd_addr.h b/gc/bte/bd_addr.h index 87faf9267..8016ddb79 100644 --- a/gc/bte/bd_addr.h +++ b/gc/bte/bd_addr.h @@ -55,6 +55,23 @@ struct bd_addr { (bdaddr)->addr[3] = d; \ (bdaddr)->addr[4] = e; \ (bdaddr)->addr[5] = f; }while(0) + +#define BD_ADDR_FROM_BYTES(bdaddr, bytes) do{ \ + (bdaddr)->addr[0] = bytes[5]; \ + (bdaddr)->addr[1] = bytes[4]; \ + (bdaddr)->addr[2] = bytes[3]; \ + (bdaddr)->addr[3] = bytes[2]; \ + (bdaddr)->addr[4] = bytes[1]; \ + (bdaddr)->addr[5] = bytes[0]; }while(0) + +#define BYTES_FROM_BD_ADDR(bytes, bdaddr) do{ \ + bytes[0] = (bdaddr)->addr[5]; \ + bytes[1] = (bdaddr)->addr[4]; \ + bytes[2] = (bdaddr)->addr[3]; \ + bytes[3] = (bdaddr)->addr[2]; \ + bytes[4] = (bdaddr)->addr[1]; \ + bytes[5] = (bdaddr)->addr[0]; }while(0) + //TODO: USE memcmp???? #define bd_addr_cmp(addr1, addr2) (((addr1)->addr[0] == (addr2)->addr[0]) && \ ((addr1)->addr[1] == (addr2)->addr[1]) && \ diff --git a/gc/bte/bte.h b/gc/bte/bte.h index 3a181613d..2700ab8f0 100644 --- a/gc/bte/bte.h +++ b/gc/bte/bte.h @@ -66,6 +66,8 @@ #define HIDP_PROTO_BOOT 0x00 #define HIDP_PROTO_REPORT 0x01 +#define BD_NAME_LEN 248 + #ifdef __cplusplus extern "C" { #endif /* __cplusplus */ @@ -125,7 +127,11 @@ s32 BTE_ApplyPatch(btecallback cb); s32 BTE_InitSub(btecallback cb); s32 BTE_ReadStoredLinkKey(struct linkkey_info *keys,u8 max_cnt,btecallback cb); s32 BTE_ReadBdAddr(struct bd_addr *bdaddr, btecallback cb); +s32 BTE_SetEvtFilter(u8 filter_type,u8 filter_cond_type,u8 *cond, btecallback cb); +s32 BTE_ReadRemoteName(u8 *name, struct bd_addr *bdaddr); void (*BTE_SetDisconnectCallback(void (*callback)(struct bd_addr *bdaddr,u8 reason)))(struct bd_addr *bdaddr,u8 reason); +void BTE_SetSyncButtonCallback(void (*callback)(u32 held)); +void BTE_ClearStoredLinkKeys(void); struct bte_pcb* bte_new(void); void bte_arg(struct bte_pcb *pcb,void *arg); @@ -133,6 +139,7 @@ void bte_received(struct bte_pcb *pcb, s32 (*recv)(void *arg,void *buffer,u16 le void bte_disconnected(struct bte_pcb *pcb,s32 (disconn_cfm)(void *arg,struct bte_pcb *pcb,u8 err)); s32 bte_registerdeviceasync(struct bte_pcb *pcb,struct bd_addr *bdaddr,s32 (*conn_cfm)(void *arg,struct bte_pcb *pcb,u8 err)); +s32 bte_connectdeviceasync(struct bte_pcb *pcb,struct bd_addr *bdaddr,s32 (*conn_cfm)(void *arg,struct bte_pcb *pcb,u8 err)); s32 bte_disconnect(struct bte_pcb *pcb); diff --git a/gc/ogc/conf.h b/gc/ogc/conf.h index 4cdf2962a..4ed30c916 100644 --- a/gc/ogc/conf.h +++ b/gc/ogc/conf.h @@ -174,6 +174,9 @@ s32 CONF_GetRegion(void); s32 CONF_GetArea(void); s32 CONF_GetVideo(void); +s32 CONF_SetPadDevices(const conf_pads *pads); +s32 CONF_SaveChanges(void); + #ifdef __cplusplus } #endif /* __cplusplus */ diff --git a/gc/wiiuse/wiiuse.h b/gc/wiiuse/wiiuse.h index 61369db0f..27c3d80e7 100644 --- a/gc/wiiuse/wiiuse.h +++ b/gc/wiiuse/wiiuse.h @@ -698,6 +698,7 @@ WIIUSE_EXPORT extern const char* wiiuse_version(); WIIUSE_EXPORT extern struct wiimote_t** wiiuse_init(int wiimotes); #else WIIUSE_EXPORT extern int wiiuse_register(struct wiimote_listen_t *wml, struct bd_addr *bdaddr, struct wiimote_t *(*assign_cb)(struct bd_addr *bdaddr)); +WIIUSE_EXPORT extern int wiiuse_connect(struct wiimote_listen_t *wml, struct bd_addr *bdaddr, struct wiimote_t *(*assign_cb)(struct bd_addr *bdaddr)); WIIUSE_EXPORT extern struct wiimote_t** wiiuse_init(int wiimotes, wii_event_cb event_cb); WIIUSE_EXPORT extern void wiiuse_sensorbar_enable(int enable); #endif @@ -721,7 +722,7 @@ WIIUSE_EXPORT extern int wiiuse_write_streamdata(struct wiimote_t *wm,ubyte *dat /* connect.c */ WIIUSE_EXPORT extern int wiiuse_find(struct wiimote_t** wm, int max_wiimotes, int timeout); -WIIUSE_EXPORT extern int wiiuse_connect(struct wiimote_t** wm, int wiimotes); +//WIIUSE_EXPORT extern int wiiuse_connect(struct wiimote_t** wm, int wiimotes); WIIUSE_EXPORT extern void wiiuse_disconnect(struct wiimote_t* wm); /* events.c */ diff --git a/gc/wiiuse/wpad.h b/gc/wiiuse/wpad.h index 952d9d62b..84fa97dbd 100644 --- a/gc/wiiuse/wpad.h +++ b/gc/wiiuse/wpad.h @@ -166,6 +166,7 @@ typedef struct _wpad_encstatus typedef void (*WPADDataCallback)(s32 chan, const WPADData *data); typedef void (*WPADShutdownCallback)(s32 chan); +typedef void (*WPADSyncCallback)(u32 held); s32 WPAD_Init(void); s32 WPAD_ControlSpeaker(s32 chan,s32 enable); @@ -186,6 +187,7 @@ void WPAD_Shutdown(void); void WPAD_SetIdleTimeout(u32 seconds); void WPAD_SetPowerButtonCallback(WPADShutdownCallback cb); void WPAD_SetBatteryDeadCallback(WPADShutdownCallback cb); +void WPAD_SetSyncButtonCallback(WPADSyncCallback cb); s32 WPAD_ScanPads(void); s32 WPAD_Rumble(s32 chan, int status); s32 WPAD_SetIdleThresholds(s32 chan, s32 btns, s32 ir, s32 accel, s32 js, s32 wb, s32 mp); diff --git a/libogc/conf.c b/libogc/conf.c index 2492e45c8..59f8a6205 100644 --- a/libogc/conf.c +++ b/libogc/conf.c @@ -31,6 +31,7 @@ distribution. #include #include #include +#include #include "ipc.h" #include "asm.h" #include "processor.h" @@ -40,6 +41,7 @@ distribution. static int __conf_inited = 0; static u8 __conf_buffer[0x4000] ATTRIBUTE_ALIGN(32); static char __conf_txt_buffer[0x101] ATTRIBUTE_ALIGN(32); +static int __conf_buffer_dirty = FALSE; static const char __conf_file[] ATTRIBUTE_ALIGN(32) = "/shared2/sys/SYSCONF"; static const char __conf_txt_file[] ATTRIBUTE_ALIGN(32) = "/title/00000001/00000002/data/setting.txt"; @@ -207,6 +209,78 @@ s32 CONF_Get(const char *name, void *buffer, u32 length) return len; } +s32 CONF_Set(const char *name, const void *buffer, u32 length) +{ + u8 *entry; + s32 len; + if(!__conf_inited) return CONF_ENOTINIT; + + entry = __CONF_Find(name); + if(!entry) return CONF_ENOENT; + + len = CONF_GetLength(name); + if(len<0) return len; + if(len!=length) return CONF_EBADVALUE; + + switch(*entry>>5) { + case CONF_BIGARRAY: + memcpy(&entry[strlen(name)+3], buffer, len); + break; + case CONF_SMALLARRAY: + memcpy(&entry[strlen(name)+2], buffer, len); + break; + case CONF_BYTE: + case CONF_SHORT: + case CONF_LONG: + case CONF_BOOL: + memcpy(&entry[strlen(name)+1], buffer, len); + break; + default: + return CONF_ENOTIMPL; + } + __conf_buffer_dirty = TRUE; + return len; +} + +int __CONF_WriteBuffer(void) +{ + int ret, fd; + + if (!__conf_inited) + return CONF_ENOTINIT; + + if (!__conf_buffer_dirty) + return 0; + + fd = IOS_Open(__conf_file, 2); + if (fd < 0) + return fd; + + ret = IOS_Write(fd, __conf_buffer, 0x4000); + IOS_Close(fd); + if (ret != 0x4000) + return CONF_EBADFILE; + + __conf_buffer_dirty = FALSE; + return 0; +} + +s32 CONF_SaveChanges(void) +{ + s32 ret; + if (!__conf_inited) + return CONF_ENOTINIT; + ret = __CONF_WriteBuffer(); + if (ret < 0) + return ret; + + /*ret = __CONF_WriteTxtBuffer(); + if (ret < 0) + return ret;*/ + + return CONF_ERR_OK; +} + s32 CONF_GetShutdownMode(void) { u8 idleconf[2] = {0,0}; @@ -346,6 +420,16 @@ s32 CONF_GetPadDevices(conf_pads *pads) return 0; } +s32 CONF_SetPadDevices(const conf_pads *pads) +{ + u8 count; + + if (!pads) return CONF_EBADVALUE; + count = pads->num_registered; + if (count > CONF_PAD_MAX_REGISTERED) return CONF_EBADVALUE; + return CONF_Set("BT.DINF", pads, sizeof(conf_pads)); +} + s32 CONF_GetNickName(u8 *nickname) { int i, res; diff --git a/lwbt/bte.c b/lwbt/bte.c index 76d276f55..26fd5e592 100644 --- a/lwbt/bte.c +++ b/lwbt/bte.c @@ -111,6 +111,8 @@ err_t bte_hci_initsub_complete(void *arg,struct hci_pcb *pcb,u8_t ogf,u8_t ocf,u err_t bte_inquiry_complete(void *arg,struct hci_pcb *pcb,struct hci_inq_res *ires,u16_t result); err_t bte_read_stored_link_key_complete(void *arg,struct hci_pcb *pcb,u8_t ogf,u8_t ocf,u8_t result); err_t bte_read_bd_addr_complete(void *arg,struct hci_pcb *pcb,u8_t ogf,u8_t ocf,u8_t result); +err_t bte_set_evt_filter_complete(void *arg,struct hci_pcb *pcb,u8_t ogf,u8_t ocf,u8_t result); +err_t bte_read_remote_name_complete(void *arg,struct bd_addr *bdaddr,u8_t *name, u8_t result); MEMB(bte_pcbs,sizeof(struct bte_pcb),MEMP_NUM_BTE_PCB); @@ -387,6 +389,9 @@ void BTE_Init(void) hci_wlp_complete(acl_wlp_completed); hci_connection_complete(acl_conn_complete); + hci_remote_name_req_complete(bte_read_remote_name_complete); + hci_link_key_not(link_key_not); + hci_pin_req(pin_req); _CPU_ISR_Restore(level); tb.tv_sec = 1; @@ -498,11 +503,59 @@ s32 BTE_ReadBdAddr(struct bd_addr *bdaddr, btecallback cb) return ERR_OK; } +s32 BTE_SetEvtFilter(u8 filter_type,u8 filter_cond_type,u8 *cond, btecallback cb) +{ + u32 level; + err_t last_err = ERR_OK; + + _CPU_ISR_Disable(level); + btstate.cb = cb; + btstate.usrdata = NULL; + btstate.hci_cmddone = 0; + hci_arg(&btstate); + hci_cmd_complete(bte_set_evt_filter_complete); + hci_set_event_filter(filter_type,filter_cond_type,cond); + _CPU_ISR_Restore(level); + + return last_err; +} + +s32 BTE_ReadRemoteName(u8_t *name, struct bd_addr *bdaddr) +{ + u32 level; + err_t last_err = ERR_OK; + + _CPU_ISR_Disable(level); + btstate.cb = NULL; + btstate.usrdata = name; + btstate.hci_cmddone = 0; + hci_arg(&btstate); + hci_read_remote_name(bdaddr); + last_err = __bte_waitcmdfinish(&btstate); + _CPU_ISR_Restore(level); + + return last_err; +} + void (*BTE_SetDisconnectCallback(void (*callback)(struct bd_addr *bdaddr,u8 reason)))(struct bd_addr *bdaddr,u8 reason) { return l2cap_disconnect_bb(callback); } +void BTE_SetSyncButtonCallback(void (*callback)(u32 held)) +{ + u32 level; + + _CPU_ISR_Disable(level); + hci_sync_btn(callback); + _CPU_ISR_Restore(level); +} + +void BTE_ClearStoredLinkKeys(void) +{ + hci_delete_stored_link_key(NULL, 0x01); +} + struct bte_pcb* bte_new(void) { struct bte_pcb *pcb; @@ -563,6 +616,52 @@ s32 bte_registerdeviceasync(struct bte_pcb *pcb,struct bd_addr *bdaddr,s32 (*con return err; } +s32 bte_connectdeviceasync(struct bte_pcb *pcb,struct bd_addr *bdaddr,s32 (*conn_cfm)(void *arg,struct bte_pcb *pcb,u8 err)) +{ + u32 level; + s32 err = ERR_OK; + struct l2cap_pcb *l2capcb = NULL; + + printf("bte_connectdeviceasync()\n"); + _CPU_ISR_Disable(level); + pcb->err = ERR_USE; + pcb->data_pcb = NULL; + pcb->ctl_pcb = NULL; + pcb->conn_cfm = conn_cfm; + pcb->state = (u32)STATE_CONNECTING; + + bd_addr_set(&(pcb->bdaddr),bdaddr); + if((l2capcb=l2cap_new())==NULL) { + err = ERR_MEM; + goto error; + } + l2cap_arg(l2capcb,pcb); + + err = l2ca_connect_req(l2capcb,bdaddr,HIDP_CONTROL_CHANNEL,HCI_ALLOW_ROLE_SWITCH,l2cap_connected); + if(err!=ERR_OK) { + l2cap_close(l2capcb); + err = ERR_CONN; + goto error; + } + + if((l2capcb=l2cap_new())==NULL) { + err = ERR_MEM; + goto error; + } + l2cap_arg(l2capcb,pcb); + + err = l2ca_connect_req(l2capcb,bdaddr,HIDP_DATA_CHANNEL,HCI_ALLOW_ROLE_SWITCH,l2cap_connected); + if(err!=ERR_OK) { + l2cap_close(l2capcb); + err = ERR_CONN; + } + +error: + _CPU_ISR_Restore(level); + //printf("bte_connectdeviceasync(%02x)\n",err); + return err; +} + s32 bte_inquiry(struct inquiry_info *info,u8 max_cnt,u8 flush) { s32_t i; @@ -574,9 +673,13 @@ s32 bte_inquiry(struct inquiry_info *info,u8 max_cnt,u8 flush) _CPU_ISR_Disable(level); if(btstate.num_founddevs==0 || flush==1) { + btstate.cb = NULL; btstate.hci_cmddone = 0; btstate.num_maxdevs = max_cnt; - hci_inquiry(0x009E8B33,0x03,max_cnt,bte_inquiry_complete); + hci_arg(&btstate); + // Use Limited Dedicated Inquiry Access Code (LIAC) to query, since third-party Wiimotes + // cannot be discovered without it. + hci_inquiry(0x009E8B00,0x03,max_cnt,bte_inquiry_complete); last_err = __bte_waitcmdfinish(&btstate); } fnd = btstate.num_founddevs; @@ -603,9 +706,13 @@ s32 bte_inquiry_ex(struct inquiry_info_ex *info,u8 max_cnt,u8 flush) _CPU_ISR_Disable(level); if(btstate.num_founddevs==0 || flush==1) { + btstate.cb = NULL; btstate.hci_cmddone = 0; btstate.num_maxdevs = max_cnt; - hci_inquiry(0x009E8B33,0x03,max_cnt,bte_inquiry_complete); + hci_arg(&btstate); + // Use Limited Dedicated Inquiry Access Code (LIAC) to query, since third-party Wiimotes + // cannot be discovered without it. + hci_inquiry(0x009E8B00,0x03,max_cnt,bte_inquiry_complete); last_err = __bte_waitcmdfinish(&btstate); } fnd = btstate.num_founddevs; @@ -848,7 +955,11 @@ err_t acl_conn_complete(void *arg,struct bd_addr *bdaddr) err_t pin_req(void *arg,struct bd_addr *bdaddr) { + struct bd_addr host_addr; //printf("pin_req\n"); + + hci_get_bd_addr(&host_addr); + hci_pin_code_request_reply(bdaddr, BD_ADDR_LEN, host_addr.addr); return ERR_OK; } @@ -917,16 +1028,24 @@ err_t link_key_not(void *arg,struct bd_addr *bdaddr,u8_t *key) return hci_write_stored_link_key(bdaddr,key); } -/* err_t l2cap_connected(void *arg,struct l2cap_pcb *l2cappcb,u16_t result,u16_t status) { struct bte_pcb *btepcb = (struct bte_pcb*)arg; - printf("l2cap_connected(%02x)\n",result); + //printf("l2cap_connected(%02x)\n",result); if(result==L2CAP_CONN_SUCCESS) { - l2cap_recv(l2cappcb,bte_input); + l2cap_recv(l2cappcb,bte_process_input); l2cap_disconnect_ind(l2cappcb,l2cap_disconnected_ind); + switch(l2cap_psm(l2cappcb)) { + case HIDP_CONTROL_CHANNEL: + btepcb->ctl_pcb = l2cappcb; + break; + case HIDP_DATA_CHANNEL: + btepcb->data_pcb = l2cappcb; + break; + } btepcb->err = ERR_OK; + btepcb->state = (u32)STATE_CONNECTED; } else { l2cap_close(l2cappcb); btepcb->err = ERR_CONN; @@ -936,7 +1055,7 @@ err_t l2cap_connected(void *arg,struct l2cap_pcb *l2cappcb,u16_t result,u16_t st LWP_ThreadSignal(btepcb->cmdq); return ERR_OK; } -*/ + err_t l2cap_accepted(void *arg,struct l2cap_pcb *l2cappcb,err_t err) { struct bte_pcb *btepcb = (struct bte_pcb*)arg; @@ -961,7 +1080,7 @@ err_t l2cap_accepted(void *arg,struct l2cap_pcb *l2cappcb,err_t err) } else { l2cap_close(l2cappcb); btepcb->err = ERR_CONN; - btepcb->conn_cfm(btepcb->cbarg,btepcb,ERR_CONN); + if(btepcb->conn_cfm) btepcb->conn_cfm(btepcb->cbarg,btepcb,ERR_CONN); } return ERR_OK; @@ -996,11 +1115,11 @@ err_t bte_inquiry_complete(void *arg,struct hci_pcb *pcb,struct hci_inq_res *ire btstate.info[i].psm = p->psm; btstate.info[i].co = p->co; - printf("bdaddr: %02x:%02x:%02x:%02x:%02x:%02x\n",p->bdaddr.addr[0],p->bdaddr.addr[1],p->bdaddr.addr[2],p->bdaddr.addr[3],p->bdaddr.addr[4],p->bdaddr.addr[5]); + /*printf("bdaddr: %02x:%02x:%02x:%02x:%02x:%02x\n",p->bdaddr.addr[0],p->bdaddr.addr[1],p->bdaddr.addr[2],p->bdaddr.addr[3],p->bdaddr.addr[4],p->bdaddr.addr[5]); printf("cod: %02x%02x%02x\n",p->cod[0],p->cod[1],p->cod[2]); printf("psrm: %02x\n",p->psrm); printf("psm: %02x\n",p->psm); - printf("co: %04x\n",p->co); + printf("co: %04x\n",p->co);*/ p = p->next; } __bte_cmdfinish(state,ERR_OK); @@ -1065,7 +1184,50 @@ err_t bte_read_bd_addr_complete(void *arg,struct hci_pcb *pcb,u8_t ogf,u8_t ocf, bdaddr->addr[4] = pcb->bdaddr.addr[1]; bdaddr->addr[5] = pcb->bdaddr.addr[0]; } - LOG("bte_read_bd_addr_complete(%02x,%p,%d)\n",result,bdaddr,i); + LOG("bte_read_bd_addr_complete(%02x,%p)\n",result,bdaddr); + __bte_cmdfinish(state,ERR_OK); + return ERR_OK; + } + + return __bte_cmdfinish(state,ERR_VAL); +} + +err_t bte_read_remote_name_complete(void *arg,struct bd_addr *bdaddr,u8_t *name,u8_t result) +{ + u8_t *name_dest; + struct bt_state *state = (struct bt_state*)arg; + + LOG("bte_read_remote_name_complete(%02x,%p)\n", result, bdaddr); + + if(state==NULL) return ERR_VAL; + + if(result == HCI_SUCCESS) { + name_dest = (u8_t *)state->usrdata; + if (name_dest != NULL) { + memcpy(name_dest, name, BD_NAME_LEN); + } + LOG("bte_read_remote_name_complete(%02x,%s)\n",result,name_dest); + __bte_cmdfinish(state,ERR_OK); + return ERR_OK; + } + + return __bte_cmdfinish(state,ERR_VAL); +} + +err_t bte_set_evt_filter_complete(void *arg,struct hci_pcb *pcb,u8_t ogf,u8_t ocf,u8_t result) +{ + struct bt_state *state = (struct bt_state*)arg; + + if(!pcb) return ERR_CONN; + + LOG("bte_set_evt_filter_complete(%02x)\n", result); + + if(state==NULL) return ERR_VAL; + + if(!(ogf==HCI_HC_BB_OGF && ocf==HCI_SET_EV_FILTER_OCF)) return __bte_cmdfinish(state,ERR_CONN); + + if(result == HCI_SUCCESS) { + LOG("bte_set_evt_filter_complete(%02x)\n",result); __bte_cmdfinish(state,ERR_OK); return ERR_OK; } @@ -1341,6 +1503,11 @@ err_t bte_hci_initsub_complete(void *arg,struct hci_pcb *pcb,u8_t ogf,u8_t ocf,u } else err = ERR_CONN; } else if(ocf==HCI_WRITE_SCAN_ENABLE) { + if(result==HCI_SUCCESS) { + hci_write_authentication_enable(0x01); + } else + err = ERR_CONN; + } else if(ocf==HCI_W_AUTH_ENABLE_OCF) { if(result==HCI_SUCCESS) { hci_cmd_complete(NULL); return __bte_cmdfinish(state,ERR_OK); diff --git a/lwbt/btopt.h b/lwbt/btopt.h index 28485f10b..6fa38ad59 100644 --- a/lwbt/btopt.h +++ b/lwbt/btopt.h @@ -181,7 +181,7 @@ typedef s8 err_t; * \hideinitializer */ #define LOGGING 0 -#define ERRORING 0 +#define ERRORING 1 /** * Print out a uIP log message. diff --git a/lwbt/hci.c b/lwbt/hci.c index acb7de8da..dd1109808 100644 --- a/lwbt/hci.c +++ b/lwbt/hci.c @@ -185,6 +185,30 @@ void hci_pin_req(err_t (* pin_req)(void *arg, struct bd_addr *bdaddr)) hci_dev->pin_req = pin_req; } /*-----------------------------------------------------------------------------------*/ +/* + * hci_sync_btn(): + * + * Used to specify the function that should be called when HCI has received a + * sync button event. + */ +/*-----------------------------------------------------------------------------------*/ +void hci_sync_btn(void (* sync_btn)(u32_t held)) +{ + hci_dev->sync_btn = sync_btn; +} +/*-----------------------------------------------------------------------------------*/ +/* + * hci_remote_name_req_complete(): + * + * Used to specify the function that should be called when HCI has received a + * remote name request complete event. + */ +/*-----------------------------------------------------------------------------------*/ +void hci_remote_name_req_complete(err_t (* remote_name_req_complete)(void *arg, struct bd_addr *bdaddr, u8_t *name, u8_t result)) +{ + hci_dev->remote_name_req_complete = remote_name_req_complete; +} +/*-----------------------------------------------------------------------------------*/ /* * hci_link_key_req(): * @@ -845,6 +869,31 @@ err_t hci_write_link_policy_settings(struct bd_addr *bdaddr, u16_t link_policy) btpbuf_free(p); return ERR_OK; } +/*-----------------------------------------------------------------------------------*/ +/* hci_write_authentication_enable(): + * + * Control the authentication enable for the Host Controller. + * + */ +/*-----------------------------------------------------------------------------------*/ +err_t hci_write_authentication_enable(u8_t auth_enable) +{ + struct pbuf *p; + + if( (p = btpbuf_alloc(PBUF_TRANSPORT, HCI_W_AUTH_ENABLE_PLEN, PBUF_RAM)) == NULL) { /* Alloc len of packet */ + ERROR("hci_write_authentication_enable: Could not allocate memory for pbuf\n"); + return ERR_MEM; + } + /* Assembling command packet */ + p = hci_cmd_ass(p, HCI_W_AUTH_ENABLE_OCF, HCI_HC_BB_OGF, HCI_W_AUTH_ENABLE_PLEN); + + /* Assembling cmd prameters */ + ((u8_t *)p->payload)[4] = auth_enable; + + physbusif_output(p, p->tot_len); + btpbuf_free(p); + return ERR_OK; +} /*-----------------------------------------------------------------------------------*/ /* hci_pin_code_request_reply(): @@ -887,22 +936,22 @@ err_t hci_pin_code_request_reply(struct bd_addr *bdaddr, u8_t pinlen, u8_t *pinc /*-----------------------------------------------------------------------------------*/ err_t hci_link_key_req_reply(struct bd_addr *bdaddr, unsigned char *link_key) { - struct pbuf *p; - if ((p = btpbuf_alloc(PBUF_RAW, HCI_LINK_KEY_REQ_REP_PLEN, PBUF_RAM)) == NULL) { - ERROR("hci_link_key_req_reply: Could not allocate memory for pbuf\n"); - return ERR_MEM; - } - - p = hci_cmd_ass(p, HCI_LINK_KEY_REQ_REP, HCI_LINK_CTRL_OGF, HCI_LINK_KEY_REQ_REP_PLEN); - //copy bdaddr to offset 0x4 - memcpy(((u8_t *)p->payload)+4, bdaddr->addr, 6); - //copy Link Key (16 bytes long) to offset 10 (0xA) - memcpy(((u8_t *)p->payload)+10, link_key, 16); - //send command - physbusif_output(p,p->tot_len); - btpbuf_free(p); - - return ERR_OK; + struct pbuf *p; + if ((p = btpbuf_alloc(PBUF_RAW, HCI_LINK_KEY_REQ_REP_PLEN, PBUF_RAM)) == NULL) { + ERROR("hci_link_key_req_reply: Could not allocate memory for pbuf\n"); + return ERR_MEM; + } + + p = hci_cmd_ass(p, HCI_LINK_KEY_REQ_REP, HCI_LINK_CTRL_OGF, HCI_LINK_KEY_REQ_REP_PLEN); + //copy bdaddr to offset 0x4 + memcpy(((u8_t *)p->payload)+4, bdaddr->addr, 6); + //copy Link Key (16 bytes long) to offset 10 (0xA) + memcpy(((u8_t *)p->payload)+10, link_key, 16); + //send command + physbusif_output(p,p->tot_len); + btpbuf_free(p); + + return ERR_OK; } @@ -1024,14 +1073,14 @@ err_t hci_reject_connection_request(struct bd_addr *bdaddr, u8_t reason) /*-----------------------------------------------------------------------------------*/ err_t hci_write_stored_link_key(struct bd_addr *bdaddr, u8_t *link) { - struct pbuf *p; + struct pbuf *p; - if((p = btpbuf_alloc(PBUF_RAW, HCI_WRITE_STORED_LINK_KEY_PLEN, PBUF_RAM)) == NULL) { + if((p = btpbuf_alloc(PBUF_RAW, HCI_W_STORED_LINK_KEY_PLEN, PBUF_RAM)) == NULL) { ERROR("hci_write_stored_link_key: Could not allocate memory for pbuf\n"); return ERR_MEM; } /* Assembling command packet */ - p = hci_cmd_ass(p, HCI_WRITE_STORED_LINK_KEY, HCI_HC_BB_OGF, HCI_WRITE_STORED_LINK_KEY_PLEN); + p = hci_cmd_ass(p, HCI_WRITE_STORED_LINK_KEY, HCI_HC_BB_OGF, HCI_W_STORED_LINK_KEY_PLEN); /* Assembling cmd prameters */ ((u8_t *)p->payload)[4] = 0x01; memcpy(((u8_t *)p->payload) + 5, bdaddr->addr, 6); @@ -1043,6 +1092,39 @@ err_t hci_write_stored_link_key(struct bd_addr *bdaddr, u8_t *link) return ERR_OK; } +/*-----------------------------------------------------------------------------------*/ +/* hci_delete_stored_link_key(): + * + * Deletes a link key from the Bluetooth host controller. + */ + /*-----------------------------------------------------------------------------------*/ +err_t hci_delete_stored_link_key(struct bd_addr *bdaddr, u8_t delete_all) +{ + struct pbuf *p; + + if((p = btpbuf_alloc(PBUF_RAW, HCI_DEL_STORED_LINK_KEY_PLEN, PBUF_RAM)) == NULL) { + ERROR("hci_write_stored_link_key: Could not allocate memory for pbuf\n"); + return ERR_MEM; + } + /* Assembling command packet */ + p = hci_cmd_ass(p, HCI_DELETE_STORED_LINK_KEY, HCI_HC_BB_OGF, HCI_DEL_STORED_LINK_KEY_PLEN); + /* Assembling cmd prameters */ + if (bdaddr) + { + memcpy(((u8_t *)p->payload) + 4, bdaddr->addr, 6); + } + else + { + memset(((u8_t *)p->payload) + 4, 0, 6); + } + ((u8_t *)p->payload)[10] = delete_all; + + physbusif_output(p, p->tot_len); + btpbuf_free(p); + + return ERR_OK; +} + /*-----------------------------------------------------------------------------------*/ /* hci_write_cod(): * @@ -1183,6 +1265,19 @@ u16_t lp_pdu_maxsize(void) return hci_dev->acl_mtu; } +/*-----------------------------------------------------------------------------------*/ +/* 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. + */ +/*-----------------------------------------------------------------------------------*/ +void hci_get_bd_addr(struct bd_addr *bdaddr) +{ + if (bdaddr) + bd_addr_set(bdaddr, &hci_dev->bdaddr); +} + /*-----------------------------------------------------------------------------------*/ /* lp_is_connected(): * @@ -1422,7 +1517,7 @@ static void hci_cc_host_ctrl(u8_t ocf,struct pbuf *p) u8_t *lap; u8_t i,resp_off; - //printf("hci_cc_host_ctrl(%02x)\n",ocf); + LOG("hci_cc_host_ctrl(%02x)\n",ocf); switch(ocf) { case HCI_SET_HC_TO_H_FC: if(((u8_t*)p->payload)[0]==HCI_SUCCESS) hci_dev->flow = 1; @@ -1544,7 +1639,7 @@ static void hci_inquiry_result_evt(struct pbuf *p) struct hci_inq_res *ires; num_resp = ((u8_t*)p->payload)[0]; - //printf("hci_inquriy_result_evt(%d)\n",num_resp); + //printf("hci_inquiry_result_evt(%d)\n",num_resp); for(i=0;ipayload)+(1+resp_off)); @@ -1558,7 +1653,34 @@ static void hci_inquiry_result_evt(struct pbuf *p) HCI_REG(&(hci_dev->ires),ires); } else - ERROR("hci_inquriy_result_evt: Could not allocate memory for inquiry result\n"); + ERROR("hci_inquiry_result_evt: Could not allocate memory for inquiry result\n"); + } + +} + +static void hci_inquiry_result_with_rssi_evt(struct pbuf *p) +{ + u8_t num_resp; + u32_t i,resp_off; + struct bd_addr *bdaddr; + struct hci_inq_res *ires; + + num_resp = ((u8_t*)p->payload)[0]; + //printf("hci_inquiry_result_with_rssi_evt(%d)\n",num_resp); + for(i=0;ipayload)+(1+resp_off)); + if((ires=btmemb_alloc(&hci_inq_results))!=NULL) { + bd_addr_set(&(ires->bdaddr),bdaddr); + ires->psrm = ((u8_t*)p->payload)[7+resp_off]; + ires->psm = ((u8_t*)p->payload)[8+resp_off]; + memcpy(ires->cod,((u8_t*)p->payload)+9+resp_off,3); + ires->co = le16toh(*((u16_t*)(((u8_t*)p->payload)+12+resp_off))); + ires->next = NULL; + + HCI_REG(&(hci_dev->ires),ires); + } else + ERROR("hci_inquiry_result_with_rssi_evt: Could not allocate memory for inquiry result\n"); } } @@ -1612,6 +1734,9 @@ void hci_event_handler(struct pbuf *p) case HCI_INQUIRY_RESULT: hci_inquiry_result_evt(p); break; + case HCI_INQUIRY_RESULT_WITH_RSSI: + hci_inquiry_result_with_rssi_evt(p); + break; case HCI_CONNECTION_COMPLETE: hci_conn_complete_evt(p); break; @@ -1633,6 +1758,10 @@ void hci_event_handler(struct pbuf *p) return; } break; + case HCI_REMOTE_NAME_REQ_COMPLETE: + bdaddr = (void *)(((u8_t *)p->payload)+1); /* Get the Bluetooth address */ + HCI_EVENT_REMOTE_NAME_REQ_COMPLETE(hci_dev,bdaddr,(((u8_t*)p->payload)+7),((u8_t*)p->payload)[0],ret); + break; case HCI_ENCRYPTION_CHANGE: break; case HCI_QOS_SETUP_COMPLETE: @@ -1725,8 +1854,23 @@ void hci_event_handler(struct pbuf *p) HCI_EVENT_LINK_KEY_NOT(hci_dev, bdaddr, ((u8_t *)p->payload) + 6, ret); /* Notify application.*/ break; + case HCI_VENDOR: + switch (((u8_t *)p->payload)[0]) { + case HCI_VENDOR_BEGIN_PAIRING: + //printf("Begin Wiimote pairing\n"); + HCI_EVENT_SYNC_BTN(hci_dev, FALSE); + break; + case HCI_VENDOR_CLEAR_PAIRED_DEVICES: + //printf("Clear paired Wiimotes"); + HCI_EVENT_SYNC_BTN(hci_dev, TRUE); + break; + default: + LOG("hci_event_input: Undefined vendor event code 0x%x, length %d\n", ((u8_t *)p->payload)[0], evthdr->len); + break; + } + break; default: - LOG("hci_event_input: Undefined event code 0x%x\n", evthdr->code); + LOG("hci_event_input: Undefined event code 0x%x, length %d\n", evthdr->code, evthdr->len); break; } } diff --git a/lwbt/hci.h b/lwbt/hci.h index be0d8905b..a9650a012 100644 --- a/lwbt/hci.h +++ b/lwbt/hci.h @@ -89,7 +89,7 @@ #define HCI_RESET 0x03 #define HCI_SET_EVENT_FILTER 0x05 #define HCI_WRITE_STORED_LINK_KEY 0x11 -#define HCI_ROLE_CHANGE 0x12 +#define HCI_DELETE_STORED_LINK_KEY 0x12 #define HCI_WRITE_LOCAL_NAME 0x13 #define HCI_WRITE_PAGE_TIMEOUT 0x18 @@ -125,11 +125,18 @@ #define HCI_CONNECTION_COMPLETE 0x03 #define HCI_CONNECTION_REQUEST 0x04 #define HCI_DISCONNECTION_COMPLETE 0x05 +#define HCI_AUTH_COMPLETE 0x06 +#define HCI_REMOTE_NAME_REQ_COMPLETE 0x07 #define HCI_ENCRYPTION_CHANGE 0x08 +#define HCI_CHANGE_CONN_LINK_KEY_COMPLETE 0x09 +#define HCI_MASTER_LINK_KEY_COMPLETE 0x0A +#define HCI_READ_REMOTE_FEATURES_COMPLETE 0x0B +#define HCI_READ_REMOTE_VERSION_COMPLETE 0x0C #define HCI_QOS_SETUP_COMPLETE 0x0D #define HCI_COMMAND_COMPLETE 0x0E #define HCI_COMMAND_STATUS 0x0F #define HCI_HARDWARE_ERROR 0x10 +#define HCI_FLUSH_OCCURRED 0x11 #define HCI_ROLE_CHANGE 0x12 #define HCI_NBR_OF_COMPLETED_PACKETS 0x13 #define HCI_MODE_CHANGE 0x14 @@ -137,8 +144,37 @@ #define HCI_PIN_CODE_REQUEST 0x16 #define HCI_LINK_KEY_REQUEST 0x17 #define HCI_LINK_KEY_NOTIFICATION 0x18 +#define HCI_LOOPBACK_COMMAND 0x19 #define HCI_DATA_BUFFER_OVERFLOW 0x1A #define HCI_MAX_SLOTS_CHANGE 0x1B +#define HCI_READ_CLOCK_OFFSET_COMPLETE 0x1C +#define HCI_CONN_PTYPE_CHANGED 0x1D +#define HCI_QOS_VIOLATION 0x1E +#define HCI_PSCAN_REP_MODE_CHANGE 0x20 +#define HCI_FLOW_SPEC_COMPLETE 0x21 +#define HCI_INQUIRY_RESULT_WITH_RSSI 0x22 +#define HCI_READ_REMOTE_EXT_FEATURES_COMPLETE 0x23 +#define HCI_SYNC_CONN_COMPLETE 0x2C +#define HCI_SYNC_CONN_CHANGED 0x2D +#define HCI_SNIFF_SUBRATING 0x2E +#define HCI_EXTENDED_INQUIRY_RESULT 0x2F +#define HCI_ENCRYPTION_KEY_REFRESH_COMPLETE 0x30 +#define HCI_IO_CAPABILITY_REQUEST 0x31 +#define HCI_IO_CAPABILITY_RESPONSE 0x32 +#define HCI_USER_CONFIRM_REQUEST 0x33 +#define HCI_USER_PASSKEY_REQUEST 0x34 +#define HCI_REMOTE_OOB_DATA_REQUEST 0x35 +#define HCI_SIMPLE_PAIRING_COMPLETE 0x36 +#define HCI_LINK_SUPERVISION_TIMEOUT_CHANGED 0x38 +#define HCI_ENHANCED_FLUSH_COMPLETE 0x39 +#define HCI_USER_PASSKEY_NOTIFY 0x3B +#define HCI_KEYPRESS_NOTIFY 0x3C +#define HCI_REMOTE_HOST_FEATURES_NOTIFY 0x3D +#define HCI_VENDOR 0xFF + +/* Wii vendor specific event codes */ +#define HCI_VENDOR_BEGIN_PAIRING 0x08 +#define HCI_VENDOR_CLEAR_PAIRED_DEVICES 0x09 /* Success code */ #define HCI_SUCCESS 0x00 @@ -217,6 +253,7 @@ #define HCI_R_STORED_LINK_KEY_OCF 0x0D #define HCI_W_PAGE_TIMEOUT_OCF 0x18 #define HCI_W_SCAN_EN_OCF 0x1A +#define HCI_W_AUTH_ENABLE_OCF 0x20 #define HCI_R_COD_OCF 0x23 #define HCI_W_COD_OCF 0x24 #define HCI_SET_HC_TO_H_FC_OCF 0x31 @@ -232,7 +269,6 @@ #define HCI_W_INQUIRY_SCAN_TYPE_OCF 0x43 #define HCI_W_INQUIRY_MODE_OCF 0x45 #define HCI_W_PAGE_SCAN_TYPE_OCF 0x47 -#define HCI_W_PAGE_SCAN_TYPE_OCF 0x47 /* Command packet length (including ACL header)*/ #define HCI_INQUIRY_PLEN 9 @@ -247,7 +283,8 @@ #define HCI_LINK_KEY_REQ_REP_PLEN 26 #define HCI_LINK_KEY_REQ_REP_NEG_PLEN 10 #define HCI_SET_CONN_ENCRYPT_PLEN 7 -#define HCI_WRITE_STORED_LINK_KEY_PLEN 27 +#define HCI_W_STORED_LINK_KEY_PLEN 27 +#define HCI_DEL_STORED_LINK_KEY_PLEN 11 #define HCI_SET_EV_MASK_PLEN 12 #define HCI_SNIFF_PLEN 14 #define HCI_W_LINK_POLICY_PLEN 8 @@ -255,6 +292,7 @@ #define HCI_SET_EV_FILTER_PLEN 6 #define HCI_W_PAGE_TIMEOUT_PLEN 6 #define HCI_W_SCAN_EN_PLEN 5 +#define HCI_W_AUTH_ENABLE_PLEN 5 #define HCI_R_COD_PLEN 4 #define HCI_W_COD_PLEN 7 #define HCI_W_FLUSHTO_PLEN 8 @@ -357,6 +395,8 @@ struct hci_pcb err_t (*inq_complete)(void *arg,struct hci_pcb *pcb,struct hci_inq_res *ires,u16_t result); err_t (*wlp_complete)(void *arg, struct bd_addr *bdaddr); err_t (*conn_req)(void *arg,struct bd_addr *bdaddr,u8_t *cod,u8_t link_type); + err_t (*remote_name_req_complete)(void *arg,struct bd_addr *bdaddr,u8_t *name,u8_t result); + void (*sync_btn)(u32_t held); }; err_t hci_init(void); @@ -381,6 +421,7 @@ err_t hci_reject_connection_request(struct bd_addr *bdaddr, u8_t reason); err_t hci_pin_code_request_reply(struct bd_addr *bdaddr, u8_t pinlen, u8_t *pincode); err_t hci_link_key_req_reply(struct bd_addr *bdaddr, u8_t *link_key); err_t hci_write_stored_link_key(struct bd_addr *bdaddr, u8_t *link); +err_t hci_delete_stored_link_key(struct bd_addr *bdaddr, u8_t delete_all); err_t hci_set_event_filter(u8_t filter_type,u8_t filter_cond_type,u8_t *cond); err_t hci_write_page_timeout(u16_t timeout); err_t hci_inquiry(u32_t lap,u8_t inq_len,u8_t num_resp,err_t (*inq_complete)(void *arg,struct hci_pcb *pcb,struct hci_inq_res *ires,u16_t result)); @@ -390,6 +431,7 @@ err_t hci_write_scan_enable(u8_t scan_enable); err_t hci_host_num_comp_packets(u16_t conhdl, u16_t num_complete); err_t hci_sniff_mode(struct bd_addr *bdaddr, u16_t max_interval, u16_t min_interval, u16_t attempt, u16_t timeout); err_t hci_write_link_policy_settings(struct bd_addr *bdaddr, u16_t link_policy); +err_t hci_write_authentication_enable(u8_t auth_enable); err_t hci_periodic_inquiry(u32_t lap,u16_t min_period,u16_t max_period,u8_t inq_len,u8_t num_resp,err_t (*inq_complete)(void *arg,struct hci_pcb *pcb,struct hci_inq_res *ires,u16_t result)); err_t hci_exit_periodic_inquiry(void); err_t hci_accecpt_conn_request(struct bd_addr *bdaddr,u8_t role); @@ -412,6 +454,9 @@ void hci_link_key_req(err_t (* link_key_req)(void *arg, struct bd_addr *bdaddr)) void hci_link_key_not(err_t (* link_key_not)(void *arg, struct bd_addr *bdaddr, u8_t *key)); void hci_wlp_complete(err_t (* wlp_complete)(void *arg, struct bd_addr *bdaddr)); void hci_conn_req(err_t (*conn_req)(void *arg,struct bd_addr *bdaddr,u8_t *cod,u8_t link_type)); +void hci_remote_name_req_complete(err_t (*remote_name_req_complete)(void *arg,struct bd_addr *bdaddr,u8_t *name,u8_t result)); +void hci_sync_btn(void (*sync_btn)(u32_t held)); +void hci_get_bd_addr(struct bd_addr *bdaddr); u16_t lp_pdu_maxsize(void); u8_t lp_is_connected(struct bd_addr *bdaddr); @@ -451,6 +496,12 @@ err_t lp_write_flush_timeout(struct bd_addr *bdaddr, u16_t flushto); #define HCI_EVENT_CMD_COMPLETE(pcb,ogf,ocf,result,ret) \ if((pcb)->cmd_complete != NULL) \ (ret = (pcb)->cmd_complete((pcb)->cbarg,(pcb),(ogf),(ocf),(result))) +#define HCI_EVENT_REMOTE_NAME_REQ_COMPLETE(pcb,bdaddr,name,result,ret) \ + if((pcb)->remote_name_req_complete != NULL) \ + (ret = (pcb)->remote_name_req_complete((pcb)->cbarg,(bdaddr),(name),(result))) +#define HCI_EVENT_SYNC_BTN(pcb, held) \ + if((pcb)->sync_btn != NULL) \ + ((pcb)->sync_btn(held)) /* The HCI LINK lists. */ extern struct hci_link *hci_active_links; /* List of all active HCI LINKs */ diff --git a/wiiuse/io_wii.c b/wiiuse/io_wii.c index a1e50a6b3..f9ee77007 100644 --- a/wiiuse/io_wii.c +++ b/wiiuse/io_wii.c @@ -83,6 +83,11 @@ static s32 __wiiuse_connected(void *arg,struct bte_pcb *pcb,u8 err) struct wiimote_listen_t *wml = (struct wiimote_listen_t*)arg; struct wiimote_t *wm; + if(err) { + bte_disconnect(wml->sock); + return ERR_CONN; + } + wm = wml->assign_cb(&wml->bdaddr); if(!wm) { @@ -138,6 +143,28 @@ int wiiuse_register(struct wiimote_listen_t *wml, struct bd_addr *bdaddr, struct return 0; } +int wiiuse_connect(struct wiimote_listen_t *wml, struct bd_addr *bdaddr, struct wiimote_t *(*assign_cb)(struct bd_addr *bdaddr)) +{ + s32 err; + + if(!wml || !bdaddr || !assign_cb) return 0; + + wml->wm = NULL; + wml->bdaddr = *bdaddr; + wml->sock = bte_new(); + wml->assign_cb = assign_cb; + if(wml->sock==NULL) return 0; + + bte_arg(wml->sock,wml); + bte_received(wml->sock,__wiiuse_receive); + bte_disconnected(wml->sock,__wiiuse_disconnected); + + err = bte_connectdeviceasync(wml->sock,bdaddr,__wiiuse_connected); + if(err==ERR_OK) return 1; + + return 0; +} + void wiiuse_disconnect(struct wiimote_t *wm) { if(wm==NULL || wm->sock==NULL) return; diff --git a/wiiuse/wpad.c b/wiiuse/wpad.c index a0cb3169a..f099f73ce 100644 --- a/wiiuse/wpad.c +++ b/wiiuse/wpad.c @@ -99,14 +99,17 @@ static WPADData wpaddata[WPAD_MAX_WIIMOTES]; static struct _wpad_cb __wpdcb[WPAD_MAX_WIIMOTES]; static conf_pads __wpad_devs; static struct linkkey_info __wpad_keys[WPAD_MAX_WIIMOTES]; +static lwp_t __wpad_syncbtnthread = LWP_THREAD_NULL; static s32 __wpad_onreset(s32 final); static s32 __wpad_disconnect(struct _wpad_cb *wpdcb); static void __wpad_eventCB(struct wiimote_t *wm,s32 event); static void __wpad_def_powcb(s32 chan); +static void __wpad_def_synccb(u32 held); static WPADShutdownCallback __wpad_batcb = NULL; static WPADShutdownCallback __wpad_powcb = __wpad_def_powcb; +static WPADSyncCallback __wpad_synccb = __wpad_def_synccb; extern void __wiiuse_sensorbar_enable(int enable); extern void __SYS_DoPowerCB(void); @@ -206,10 +209,11 @@ wiimote *__wpad_assign_slot(struct bd_addr *pad_addr) u32 i, level; struct bd_addr bdaddr; //printf("WPAD Assigning slot (active: 0x%02x)\n", __wpads_used); + //printf(" bdaddr: %02x:%02x:%02x:%02x:%02x:%02x\n",pad_addr->addr[5],pad_addr->addr[4],pad_addr->addr[3],pad_addr->addr[2],pad_addr->addr[1],pad_addr->addr[0]); _CPU_ISR_Disable(level); // check for balance board - BD_ADDR(&(bdaddr),__wpad_devs.balance_board.bdaddr[5],__wpad_devs.balance_board.bdaddr[4],__wpad_devs.balance_board.bdaddr[3],__wpad_devs.balance_board.bdaddr[2],__wpad_devs.balance_board.bdaddr[1],__wpad_devs.balance_board.bdaddr[0]); + BD_ADDR_FROM_BYTES(&(bdaddr),__wpad_devs.balance_board.bdaddr); if(bd_addr_cmp(pad_addr,&bdaddr)) { if(!(__wpads_used&(1<cod[1] & 0x1F) == 0x5) + { + for (int j = 0; j < total; j++) + { + if (bd_addr_cmp(&addrs[j], &p->bdaddr)) + { + new = FALSE; + break; + } + } + + if (new && !bd_addr_cmp(&p->bdaddr,BD_ADDR_ANY)) + { + bd_addr_set(&(addrs[total]),&p->bdaddr); + total++; + } + } + } + //printf("Found %d BT devices\n", total); + + for (int i = 0; i < total; i++) + { + bool isRegistered = FALSE; + u8 name[BD_NAME_LEN] = {0}; + BTE_ReadRemoteName(name, &addrs[i]); + if (IsValidDeviceName(name)) + { + printf("Found Wiimote %s:\n", name); + printf(" bdaddr: %02x:%02x:%02x:%02x:%02x:%02x\n",addrs[i].addr[5],addrs[i].addr[4],addrs[i].addr[3],addrs[i].addr[2],addrs[i].addr[1],addrs[i].addr[0]); + + for(int j=0; j<__wpad_devs.num_registered; j++) { + struct bd_addr bdaddr; + BD_ADDR_FROM_BYTES(&(bdaddr),__wpad_devs.registered[i].bdaddr); + if(bd_addr_cmp(&addrs[i],&bdaddr)) { + printf("Wiimote already registered\n"); + isRegistered = TRUE; + break; + } + } + + if (!isRegistered) + { + u8 index = __wpad_devs.num_registered; + + if(index >= CONF_PAD_MAX_REGISTERED) + { + for(int j=0; j CONF_PAD_MAX_REGISTERED) { WPAD_Shutdown(); @@ -703,6 +863,12 @@ s32 WPAD_Init(void) return WPAD_ERR_BADCONF; } + for(i=0;/*__wpads[i] && */i<__wpad_devs.num_registered;i++) { + conf_pad_device *device = &__wpad_devs.registered[i]; + printf("Registered Wiimote %s:\n", device->name); + printf(" bdaddr: %02x:%02x:%02x:%02x:%02x:%02x\n",device->bdaddr[0],device->bdaddr[1],device->bdaddr[2],device->bdaddr[3],device->bdaddr[4],device->bdaddr[5]); + } + __wpads = wiiuse_init(WPAD_MAX_WIIMOTES,__wpad_eventCB); if(__wpads==NULL) { WPAD_Shutdown(); @@ -714,6 +880,7 @@ s32 WPAD_Init(void) BTE_Init(); BTE_SetDisconnectCallback(__wpad_disconnectCB); + BTE_SetSyncButtonCallback(__wpad_syncbuttonCB); BTE_InitCore(__initcore_finished); if (SYS_CreateAlarm(&__wpad_timer) < 0) @@ -1085,6 +1252,18 @@ void WPAD_SetBatteryDeadCallback(WPADShutdownCallback cb) _CPU_ISR_Restore(level); } +void WPAD_SetSyncButtonCallback(WPADSyncCallback cb) +{ + u32 level; + + _CPU_ISR_Disable(level); + if(cb) + __wpad_synccb = cb; + else + __wpad_synccb = __wpad_def_synccb; + _CPU_ISR_Restore(level); +} + s32 WPAD_Disconnect(s32 chan) { u32 level, cnt = 0; @@ -1119,6 +1298,9 @@ void WPAD_Shutdown(void) struct _wpad_cb *wpdcb = NULL; _CPU_ISR_Disable(level); + + CONF_SetPadDevices(&__wpad_devs); + CONF_SaveChanges(); __wpads_inited = WPAD_STATE_DISABLED; SYS_RemoveAlarm(__wpad_timer); From 60df4810f029da197d43f819609d843c52638b6c Mon Sep 17 00:00:00 2001 From: Zarithya Date: Tue, 18 Mar 2025 00:33:35 -0700 Subject: [PATCH 02/27] Async --- gc/bte/bte.h | 29 +++- gc/ogc/conf.h | 1 + gc/wiiuse/wiiuse.h | 7 +- gc/wiiuse/wpad.h | 2 + lwbt/bte.c | 190 ++++++++++++++----------- lwbt/hci.c | 31 +++- lwbt/hci.h | 2 +- wiiuse/io.c | 6 +- wiiuse/io_wii.c | 33 +++-- wiiuse/wpad.c | 347 ++++++++++++++++++++++++++++++--------------- 10 files changed, 425 insertions(+), 223 deletions(-) diff --git a/gc/bte/bte.h b/gc/bte/bte.h index 2700ab8f0..4a0a9c481 100644 --- a/gc/bte/bte.h +++ b/gc/bte/bte.h @@ -66,7 +66,13 @@ #define HIDP_PROTO_BOOT 0x00 #define HIDP_PROTO_REPORT 0x01 -#define BD_NAME_LEN 248 +#define BD_NAME_LEN 248 +#define BD_MAX_INQUIRY_DEVS 255 + +enum inquiry_mode { + INQUIRY_MODE_SINGLE, + INQUIRY_MODE_PERIODIC +}; #ifdef __cplusplus extern "C" { @@ -90,12 +96,24 @@ struct inquiry_info_ex u16 co; }; +struct inquiry_res +{ + u8 count; + struct inquiry_info_ex *info; +}; + struct linkkey_info { struct bd_addr bdaddr; u8 key[16]; }; +struct pad_info +{ + struct bd_addr bdaddr; + u8 name[BD_NAME_LEN]; +}; + struct bte_pcb { u8 err; @@ -121,6 +139,7 @@ struct bte_pcb typedef s32 (*btecallback)(s32 result,void *userdata); void BTE_Init(void); +void BTE_Restart(void); void BTE_Shutdown(void); s32 BTE_InitCore(btecallback cb); s32 BTE_ApplyPatch(btecallback cb); @@ -128,9 +147,13 @@ s32 BTE_InitSub(btecallback cb); s32 BTE_ReadStoredLinkKey(struct linkkey_info *keys,u8 max_cnt,btecallback cb); s32 BTE_ReadBdAddr(struct bd_addr *bdaddr, btecallback cb); s32 BTE_SetEvtFilter(u8 filter_type,u8 filter_cond_type,u8 *cond, btecallback cb); -s32 BTE_ReadRemoteName(u8 *name, struct bd_addr *bdaddr); +s32 BTE_ReadRemoteName(struct pad_info *info, btecallback cb); +s32 BTE_Inquiry(u8 max_cnt,u8 flush, btecallback cb); +s32 BTE_PeriodicInquiry(u8 max_cnt,u8 flush,btecallback cb); +s32 BTE_ExitPeriodicInquiry(void); void (*BTE_SetDisconnectCallback(void (*callback)(struct bd_addr *bdaddr,u8 reason)))(struct bd_addr *bdaddr,u8 reason); void BTE_SetSyncButtonCallback(void (*callback)(u32 held)); +u8 BTE_GetPairMode(void); void BTE_ClearStoredLinkKeys(void); struct bte_pcb* bte_new(void); @@ -145,8 +168,6 @@ s32 bte_disconnect(struct bte_pcb *pcb); //s32 bte_listen(struct bte_pcb *pcb,struct bd_addr *bdaddr,u8 psm); //s32 bte_accept(struct bte_pcb *pcb,s32 (*recv)(void *arg,void *buffer,u16 len)); -s32 bte_inquiry(struct inquiry_info *info,u8 max_cnt,u8 flush); -s32 bte_inquiry_ex(struct inquiry_info_ex *info,u8 max_cnt,u8 flush); //s32 bte_connect(struct bte_pcb *pcb,struct bd_addr *bdaddr,u8 psm,s32 (*recv)(void *arg,void *buffer,u16 len)); //s32 bte_connect_ex(struct bte_pcb *pcb,struct inquiry_info_ex *info,u8 psm,s32 (*recv)(void *arg,void *buffer,u16 len)); s32 bte_senddata(struct bte_pcb *pcb,void *message,u16 len); diff --git a/gc/ogc/conf.h b/gc/ogc/conf.h index 4ed30c916..128ef6433 100644 --- a/gc/ogc/conf.h +++ b/gc/ogc/conf.h @@ -128,6 +128,7 @@ enum { #define CONF_PAD_MAX_REGISTERED 10 #define CONF_PAD_MAX_ACTIVE 4 +#define CONF_PAD_TOTAL (CONF_PAD_MAX_REGISTERED + CONF_PAD_MAX_ACTIVE + 2) typedef struct _conf_pad_device conf_pad_device; diff --git a/gc/wiiuse/wiiuse.h b/gc/wiiuse/wiiuse.h index 27c3d80e7..8d23aa0ad 100644 --- a/gc/wiiuse/wiiuse.h +++ b/gc/wiiuse/wiiuse.h @@ -660,9 +660,10 @@ typedef struct wiimote_t { * @brief Wiimote listen structure. */ typedef struct wiimote_listen_t { + WCONST u8 in_use; WCONST struct bd_addr bdaddr; WCONST struct bte_pcb *sock; - WCONST struct wiimote_t *(*assign_cb)(struct bd_addr *bdaddr); + WCONST struct wiimote_t *(*assign_cb)(struct wiimote_listen_t *wml); WCONST struct wiimote_t *wm; } wiimote_listen; #endif @@ -697,8 +698,8 @@ WIIUSE_EXPORT extern const char* wiiuse_version(); #ifndef GEKKO WIIUSE_EXPORT extern struct wiimote_t** wiiuse_init(int wiimotes); #else -WIIUSE_EXPORT extern int wiiuse_register(struct wiimote_listen_t *wml, struct bd_addr *bdaddr, struct wiimote_t *(*assign_cb)(struct bd_addr *bdaddr)); -WIIUSE_EXPORT extern int wiiuse_connect(struct wiimote_listen_t *wml, struct bd_addr *bdaddr, struct wiimote_t *(*assign_cb)(struct bd_addr *bdaddr)); +WIIUSE_EXPORT extern int wiiuse_register(struct wiimote_listen_t *wml, struct bd_addr *bdaddr, struct wiimote_t *(*assign_cb)(struct wiimote_listen_t *wml)); +WIIUSE_EXPORT extern int wiiuse_connect(struct wiimote_listen_t *wml, struct bd_addr *bdaddr, struct wiimote_t *(*assign_cb)(struct wiimote_listen_t *wml)); WIIUSE_EXPORT extern struct wiimote_t** wiiuse_init(int wiimotes, wii_event_cb event_cb); WIIUSE_EXPORT extern void wiiuse_sensorbar_enable(int enable); #endif diff --git a/gc/wiiuse/wpad.h b/gc/wiiuse/wpad.h index 84fa97dbd..88da3ee97 100644 --- a/gc/wiiuse/wpad.h +++ b/gc/wiiuse/wpad.h @@ -183,6 +183,8 @@ s32 WPAD_SetEventBufs(s32 chan, WPADData *bufs, u32 cnt); s32 WPAD_Disconnect(s32 chan); s32 WPAD_IsSpeakerEnabled(s32 chan); s32 WPAD_SendStreamData(s32 chan,void *buf,u32 len); +s32 WPAD_Search(void); +s32 WPAD_StopSearch(void); void WPAD_Shutdown(void); void WPAD_SetIdleTimeout(u32 seconds); void WPAD_SetPowerButtonCallback(WPADShutdownCallback cb); diff --git a/lwbt/bte.c b/lwbt/bte.c index 26fd5e592..a46b5d0c5 100644 --- a/lwbt/bte.c +++ b/lwbt/bte.c @@ -49,10 +49,13 @@ struct bt_state u8_t hci_inited; u8_t num_maxdevs; - u8_t num_founddevs; - struct inquiry_info_ex *info; + + u8_t inquiry_mode; + + struct inquiry_res inq_res; btecallback cb; + btecallback inq_complete_cb; void *usrdata; }; @@ -123,12 +126,12 @@ static void bte_reset_all() btmemb_init(&bte_pcbs); btmemb_init(&bte_ctrl_reqs); - if(btstate.info!=NULL) free(btstate.info); + if(btstate.inq_res.info!=NULL) free(btstate.inq_res.info); - btstate.info = NULL; + btstate.inq_res.count = 0; + btstate.inq_res.info = NULL; btstate.hci_inited = 0; btstate.hci_cmddone = 0; - btstate.num_founddevs = 0; btstate.last_err = ERR_OK; } @@ -399,6 +402,18 @@ void BTE_Init(void) SYS_SetPeriodicAlarm(btstate.timer_svc,&tb,&tb,bt_alarmhandler, NULL); } +void BTE_Restart(void) +{ + u32 level; + + _CPU_ISR_Disable(level); + bte_reset_all(); + hci_reset_all(); + l2cap_reset_all(); + physbusif_reset_all(); + _CPU_ISR_Restore(level); +} + void BTE_Shutdown(void) { u32 level; @@ -506,7 +521,6 @@ s32 BTE_ReadBdAddr(struct bd_addr *bdaddr, btecallback cb) s32 BTE_SetEvtFilter(u8 filter_type,u8 filter_cond_type,u8 *cond, btecallback cb) { u32 level; - err_t last_err = ERR_OK; _CPU_ISR_Disable(level); btstate.cb = cb; @@ -517,26 +531,30 @@ s32 BTE_SetEvtFilter(u8 filter_type,u8 filter_cond_type,u8 *cond, btecallback cb hci_set_event_filter(filter_type,filter_cond_type,cond); _CPU_ISR_Restore(level); - return last_err; + return ERR_OK; } -s32 BTE_ReadRemoteName(u8_t *name, struct bd_addr *bdaddr) -{ +s32 BTE_ReadRemoteName(struct pad_info *info, btecallback cb) +{ u32 level; err_t last_err = ERR_OK; _CPU_ISR_Disable(level); - btstate.cb = NULL; - btstate.usrdata = name; + btstate.cb = cb; + btstate.usrdata = NULL; btstate.hci_cmddone = 0; hci_arg(&btstate); - hci_read_remote_name(bdaddr); - last_err = __bte_waitcmdfinish(&btstate); + hci_read_remote_name(&info->bdaddr); _CPU_ISR_Restore(level); return last_err; } +u8 BTE_GetPairMode(void) +{ + return btstate.inquiry_mode; +} + void (*BTE_SetDisconnectCallback(void (*callback)(struct bd_addr *bdaddr,u8 reason)))(struct bd_addr *bdaddr,u8 reason) { return l2cap_disconnect_bb(callback); @@ -578,6 +596,12 @@ s32 bte_registerdeviceasync(struct bte_pcb *pcb,struct bd_addr *bdaddr,s32 (*con //printf("bte_registerdeviceasync()\n"); _CPU_ISR_Disable(level); + if(lp_is_connected(bdaddr)) { + printf("bdaddr already exists: %02x:%02x:%02x:%02x:%02x:%02x\n",bdaddr->addr[5],bdaddr->addr[4],bdaddr->addr[3],bdaddr->addr[2],bdaddr->addr[1],bdaddr->addr[0]); + err = ERR_CONN; + goto error; + } + pcb->err = ERR_USE; pcb->data_pcb = NULL; pcb->ctl_pcb = NULL; @@ -621,9 +645,14 @@ s32 bte_connectdeviceasync(struct bte_pcb *pcb,struct bd_addr *bdaddr,s32 (*conn u32 level; s32 err = ERR_OK; struct l2cap_pcb *l2capcb = NULL; - - printf("bte_connectdeviceasync()\n"); + _CPU_ISR_Disable(level); + //printf("bte_connectdeviceasync()\n"); + if(lp_is_connected(bdaddr)) { + printf("bdaddr already exists: %02x:%02x:%02x:%02x:%02x:%02x\n",bdaddr->addr[5],bdaddr->addr[4],bdaddr->addr[3],bdaddr->addr[2],bdaddr->addr[1],bdaddr->addr[0]); + err = ERR_CONN; + goto error; + } pcb->err = ERR_USE; pcb->data_pcb = NULL; pcb->ctl_pcb = NULL; @@ -662,73 +691,50 @@ s32 bte_connectdeviceasync(struct bte_pcb *pcb,struct bd_addr *bdaddr,s32 (*conn return err; } -s32 bte_inquiry(struct inquiry_info *info,u8 max_cnt,u8 flush) +s32 BTE_Inquiry(u8 max_cnt,u8 flush,btecallback cb) { - s32_t i; - u32 level,fnd; - err_t last_err; - struct inquiry_info_ex *pinfo; - - last_err = ERR_OK; + u32 level; _CPU_ISR_Disable(level); - if(btstate.num_founddevs==0 || flush==1) { - btstate.cb = NULL; - btstate.hci_cmddone = 0; + if(btstate.inq_res.count==0 || flush==1) { + btstate.inq_complete_cb = cb; + btstate.inquiry_mode = INQUIRY_MODE_SINGLE; btstate.num_maxdevs = max_cnt; hci_arg(&btstate); // Use Limited Dedicated Inquiry Access Code (LIAC) to query, since third-party Wiimotes // cannot be discovered without it. hci_inquiry(0x009E8B00,0x03,max_cnt,bte_inquiry_complete); - last_err = __bte_waitcmdfinish(&btstate); } - fnd = btstate.num_founddevs; - pinfo = btstate.info; _CPU_ISR_Restore(level); - - if(last_err==ERR_OK) { - for(i=0;iinfo!=NULL) free(inq_res->info); + inq_res->info = NULL; + inq_res->count = 0; btstate.num_maxdevs = 0; - btstate.num_founddevs = 0; p = ires; while(p!=NULL) { - btstate.num_founddevs++; + inq_res->count++; p = p->next; } p = ires; - btstate.info = (struct inquiry_info_ex*)malloc(sizeof(struct inquiry_info_ex)*btstate.num_founddevs); - for(i=0;ibdaddr)); - memcpy(btstate.info[i].cod,p->cod,3); - btstate.info[i].psrm = p->psrm; - btstate.info[i].psm = p->psm; - btstate.info[i].co = p->co; + inq_res->info = (struct inquiry_info_ex*)malloc(sizeof(struct inquiry_info_ex)*inq_res->count); + for(i=0;icount && p!=NULL;i++) { + bd_addr_set(&(inq_res->info[i].bdaddr),&(p->bdaddr)); + memcpy(inq_res->info[i].cod,p->cod,3); + inq_res->info[i].psrm = p->psrm; + inq_res->info[i].psm = p->psm; + inq_res->info[i].co = p->co; /*printf("bdaddr: %02x:%02x:%02x:%02x:%02x:%02x\n",p->bdaddr.addr[0],p->bdaddr.addr[1],p->bdaddr.addr[2],p->bdaddr.addr[3],p->bdaddr.addr[4],p->bdaddr.addr[5]); printf("cod: %02x%02x%02x\n",p->cod[0],p->cod[1],p->cod[2]); @@ -1122,8 +1139,13 @@ err_t bte_inquiry_complete(void *arg,struct hci_pcb *pcb,struct hci_inq_res *ire printf("co: %04x\n",p->co);*/ p = p->next; } - __bte_cmdfinish(state,ERR_OK); - } else + //__bte_cmdfinish(state,ERR_OK); + _CPU_ISR_Disable(level); + state->last_err = ERR_OK; + state->hci_cmddone = 1; + state->inq_complete_cb(ERR_OK,&state->inq_res); + _CPU_ISR_Restore(level); + } else if (state->inquiry_mode == INQUIRY_MODE_SINGLE) hci_inquiry(0x009E8B33,0x03,btstate.num_maxdevs,bte_inquiry_complete); } return ERR_OK; @@ -1194,7 +1216,7 @@ err_t bte_read_bd_addr_complete(void *arg,struct hci_pcb *pcb,u8_t ogf,u8_t ocf, err_t bte_read_remote_name_complete(void *arg,struct bd_addr *bdaddr,u8_t *name,u8_t result) { - u8_t *name_dest; + struct pad_info *info; struct bt_state *state = (struct bt_state*)arg; LOG("bte_read_remote_name_complete(%02x,%p)\n", result, bdaddr); @@ -1202,11 +1224,13 @@ err_t bte_read_remote_name_complete(void *arg,struct bd_addr *bdaddr,u8_t *name, if(state==NULL) return ERR_VAL; if(result == HCI_SUCCESS) { - name_dest = (u8_t *)state->usrdata; - if (name_dest != NULL) { - memcpy(name_dest, name, BD_NAME_LEN); - } - LOG("bte_read_remote_name_complete(%02x,%s)\n",result,name_dest); + info = (struct pad_info *)malloc(sizeof(struct pad_info)); + if (info == NULL) + return ERR_MEM; + bd_addr_set(&info->bdaddr, bdaddr); + memcpy(info->name, name, BD_NAME_LEN); + state->usrdata = info; + LOG("bte_read_remote_name_complete(%02x,%s)\n",result,name); __bte_cmdfinish(state,ERR_OK); return ERR_OK; } diff --git a/lwbt/hci.c b/lwbt/hci.c index dd1109808..a59530a25 100644 --- a/lwbt/hci.c +++ b/lwbt/hci.c @@ -154,7 +154,7 @@ void hci_reset_all(void) for(ikeys=hci_dev->keyres;ikeys!=NULL;) { tikeys = ikeys->next; - btmemb_free(&hci_inq_results,ikeys); + btmemb_free(&hci_link_key_results,ikeys); ikeys = tikeys; } btmemb_free(&hci_pcbs,hci_dev); @@ -391,7 +391,6 @@ err_t hci_read_stored_link_key(void) hci_dev->keyres = hci_dev->keyres->next; btmemb_free(&hci_link_key_results,tmpres); } - if((p=btpbuf_alloc(PBUF_RAW,HCI_R_STORED_LINK_KEY_PLEN,PBUF_RAM))==NULL) { ERROR("hci_read_stored_link_keys: Could not allocate memory for pbuf\n"); @@ -591,7 +590,7 @@ err_t hci_exit_periodic_inquiry(void) return ERR_OK; } -err_t hci_accecpt_conn_request(struct bd_addr *bdaddr,u8_t role) +err_t hci_accept_conn_request(struct bd_addr *bdaddr,u8_t role) { struct pbuf *p = NULL; @@ -1568,7 +1567,9 @@ static void hci_conn_request_evt(struct pbuf *p) struct hci_link *link; LOG("hci_conn_request_evt()\n"); + printf("hci_conn_request_evt()\n"); bdaddr = (void*)((u8_t*)p->payload); + printf(" bdaddr: %02x:%02x:%02x:%02x:%02x:%02x\n",bdaddr->addr[5],bdaddr->addr[4],bdaddr->addr[3],bdaddr->addr[2],bdaddr->addr[1],bdaddr->addr[0]); cod = (((u8_t*)p->payload)+6); link_type = *(((u8_t*)p->payload)+9); @@ -1584,7 +1585,7 @@ static void hci_conn_request_evt(struct pbuf *p) bd_addr_set(&(link->bdaddr),bdaddr); HCI_REG(&(hci_active_links),link); } - hci_accecpt_conn_request(bdaddr,0x00); + hci_accept_conn_request(bdaddr,0x00); } else { } } @@ -1599,7 +1600,7 @@ static void hci_conn_complete_evt(struct pbuf *p) bdaddr = (void*)(((u8_t*)p->payload)+3); link = hci_get_link(bdaddr); - LOG("hci_conn_complete_evt(%p,%02x - %02x:%02x:%02x:%02x:%02x:%02x)\n",link,((u8_t*)p->payload)[0],bdaddr->addr[0],bdaddr->addr[1],bdaddr->addr[2],bdaddr->addr[3],bdaddr->addr[4],bdaddr->addr[5]); + //printf("hci_conn_complete_evt(%p,%02x - %02x:%02x:%02x:%02x:%02x:%02x)\n",link,((u8_t*)p->payload)[0],bdaddr->addr[5],bdaddr->addr[4],bdaddr->addr[3],bdaddr->addr[2],bdaddr->addr[1],bdaddr->addr[0]); switch(((u8_t*)p->payload)[0]) { case HCI_SUCCESS: if(link==NULL) { @@ -1710,6 +1711,23 @@ static void hci_return_link_key_evt(struct pbuf *p) } +static void hci_inquiry_complete_evt(struct pbuf *p) +{ + err_t ret; + struct hci_inq_res *tmpres; + + (void)ret; + + HCI_EVENT_INQ_COMPLETE(hci_dev,((u8_t*)p->payload)[0],ret); + + // After event completes, clear the list (in case periodic scan is ongoing) + while(hci_dev->ires != NULL) { + tmpres = hci_dev->ires; + hci_dev->ires = hci_dev->ires->next; + btmemb_free(&hci_inq_results,tmpres); + } +} + void hci_event_handler(struct pbuf *p) { err_t ret; @@ -1725,11 +1743,12 @@ void hci_event_handler(struct pbuf *p) evthdr = p->payload; btpbuf_header(p,-HCI_EVENT_HDR_LEN); + //printf("HCI_EVENT %02x\n", evthdr->code); switch(evthdr->code) { case HCI_INQUIRY_COMPLETE: //printf("HCI_INQUIRY_COMPLETE\n"); - HCI_EVENT_INQ_COMPLETE(hci_dev,((u8_t*)p->payload)[0],ret); + hci_inquiry_complete_evt(p); break; case HCI_INQUIRY_RESULT: hci_inquiry_result_evt(p); diff --git a/lwbt/hci.h b/lwbt/hci.h index a9650a012..60fe72a77 100644 --- a/lwbt/hci.h +++ b/lwbt/hci.h @@ -434,7 +434,7 @@ err_t hci_write_link_policy_settings(struct bd_addr *bdaddr, u16_t link_policy); err_t hci_write_authentication_enable(u8_t auth_enable); err_t hci_periodic_inquiry(u32_t lap,u16_t min_period,u16_t max_period,u8_t inq_len,u8_t num_resp,err_t (*inq_complete)(void *arg,struct hci_pcb *pcb,struct hci_inq_res *ires,u16_t result)); err_t hci_exit_periodic_inquiry(void); -err_t hci_accecpt_conn_request(struct bd_addr *bdaddr,u8_t role); +err_t hci_accept_conn_request(struct bd_addr *bdaddr,u8_t role); err_t hci_set_event_mask(u64_t ev_mask); err_t hci_read_local_version(void); err_t hci_read_local_features(void); diff --git a/wiiuse/io.c b/wiiuse/io.c index 57bd09de0..bf980f84e 100644 --- a/wiiuse/io.c +++ b/wiiuse/io.c @@ -3,6 +3,7 @@ #include #include +#include #include "definitions.h" #include "wiiuse_internal.h" @@ -12,14 +13,13 @@ #include "wiiboard.h" #include "motion_plus.h" #include "io.h" - void wiiuse_handshake(struct wiimote_t *wm,ubyte *data,uword len) + { ubyte *buf = NULL; struct accel_t *accel = &wm->accel_calib; - //printf("wiiuse_handshake(%d,%p,%d)\n",wm->handshake_state,data,len); - + printf("wiiuse_handshake(%d,%p,%d)\n",wm->handshake_state,data,len); switch(wm->handshake_state) { case 0: wm->handshake_state++; diff --git a/wiiuse/io_wii.c b/wiiuse/io_wii.c index f9ee77007..24c325f15 100644 --- a/wiiuse/io_wii.c +++ b/wiiuse/io_wii.c @@ -39,7 +39,7 @@ static s32 __wiiuse_disconnected(void *arg,struct bte_pcb *pcb,u8 err) if(!wm) return ERR_OK; - //printf("wiimote disconnected\n"); + printf("wiimote disconnected\n"); WIIMOTE_DISABLE_STATE(wm, (WIIMOTE_STATE_IR|WIIMOTE_STATE_IR_INIT)); WIIMOTE_DISABLE_STATE(wm, (WIIMOTE_STATE_SPEAKER|WIIMOTE_STATE_SPEAKER_INIT)); WIIMOTE_DISABLE_STATE(wm, (WIIMOTE_STATE_EXP|WIIMOTE_STATE_EXP_HANDSHAKE|WIIMOTE_STATE_EXP_FAILED)); @@ -54,6 +54,7 @@ static s32 __wiiuse_disconnected(void *arg,struct bte_pcb *pcb,u8 err) if(wm->event_cb) wm->event_cb(wm,WIIUSE_DISCONNECT); wml->wm = NULL; + wml->in_use = FALSE; return ERR_OK; } @@ -83,14 +84,17 @@ static s32 __wiiuse_connected(void *arg,struct bte_pcb *pcb,u8 err) struct wiimote_listen_t *wml = (struct wiimote_listen_t*)arg; struct wiimote_t *wm; + printf("__wiiuse_connected(%d)\n", err); if(err) { + wml->in_use = FALSE; bte_disconnect(wml->sock); return ERR_CONN; } - - wm = wml->assign_cb(&wml->bdaddr); - + + wm = wml->assign_cb(wml); + if(!wm) { + wml->in_use = FALSE; bte_disconnect(wml->sock); return ERR_OK; } @@ -100,7 +104,7 @@ static s32 __wiiuse_connected(void *arg,struct bte_pcb *pcb,u8 err) wm->sock = wml->sock; wm->bdaddr = wml->bdaddr; - //printf("__wiiuse_connected()\n"); + printf("__wiiuse_connected()\n"); WIIMOTE_ENABLE_STATE(wm,(WIIMOTE_STATE_CONNECTED|WIIMOTE_STATE_HANDSHAKE)); wm->handshake_state = 0; @@ -121,14 +125,16 @@ void __wiiuse_sensorbar_enable(int enable) IRQ_Restore(level); } -int wiiuse_register(struct wiimote_listen_t *wml, struct bd_addr *bdaddr, struct wiimote_t *(*assign_cb)(struct bd_addr *bdaddr)) +int wiiuse_register(struct wiimote_listen_t *wml, struct bd_addr *bdaddr, struct wiimote_t *(*assign_cb)(struct wiimote_listen_t *wml)) { s32 err; if(!wml || !bdaddr || !assign_cb) return 0; + wml->in_use = TRUE; wml->wm = NULL; - wml->bdaddr = *bdaddr; + bd_addr_set(&(wml->bdaddr),bdaddr); + //wml->bdaddr = *bdaddr; wml->sock = bte_new(); wml->assign_cb = assign_cb; if(wml->sock==NULL) return 0; @@ -143,14 +149,18 @@ int wiiuse_register(struct wiimote_listen_t *wml, struct bd_addr *bdaddr, struct return 0; } -int wiiuse_connect(struct wiimote_listen_t *wml, struct bd_addr *bdaddr, struct wiimote_t *(*assign_cb)(struct bd_addr *bdaddr)) +int wiiuse_connect(struct wiimote_listen_t *wml, struct bd_addr *bdaddr, struct wiimote_t *(*assign_cb)(struct wiimote_listen_t *wml)) { s32 err; + printf("wiiuse_connect %p, bdaddr: %02x:%02x:%02x:%02x:%02x:%02x\n",wml,bdaddr->addr[5],bdaddr->addr[4],bdaddr->addr[3],bdaddr->addr[2],bdaddr->addr[1],bdaddr->addr[0]); + if(!wml || !bdaddr || !assign_cb) return 0; + wml->in_use = TRUE; wml->wm = NULL; - wml->bdaddr = *bdaddr; + bd_addr_set(&(wml->bdaddr),bdaddr); + //wml->bdaddr = *bdaddr; wml->sock = bte_new(); wml->assign_cb = assign_cb; if(wml->sock==NULL) return 0; @@ -158,7 +168,9 @@ int wiiuse_connect(struct wiimote_listen_t *wml, struct bd_addr *bdaddr, struct bte_arg(wml->sock,wml); bte_received(wml->sock,__wiiuse_receive); bte_disconnected(wml->sock,__wiiuse_disconnected); - + + //Wprintf("wiiuse_connect\n"); + err = bte_connectdeviceasync(wml->sock,bdaddr,__wiiuse_connected); if(err==ERR_OK) return 1; @@ -171,6 +183,7 @@ void wiiuse_disconnect(struct wiimote_t *wm) WIIMOTE_DISABLE_STATE(wm,WIIMOTE_STATE_CONNECTED); bte_disconnect(wm->sock); + wm->sock = NULL; } void wiiuse_sensorbar_enable(int enable) diff --git a/wiiuse/wpad.c b/wiiuse/wpad.c index f099f73ce..3b8209275 100644 --- a/wiiuse/wpad.c +++ b/wiiuse/wpad.c @@ -89,17 +89,18 @@ struct _wpad_cb { static syswd_t __wpad_timer; static vu32 __wpads_inited = 0; -static vs32 __wpads_ponded = 0; +static vs32 __wpads_bonded = 0; static u32 __wpad_idletimeout = 300; static vu32 __wpads_active = 0; static vu32 __wpads_used = 0; +//static vu32 __wpads_pending_slots = 0; static wiimote **__wpads = NULL; -static wiimote_listen __wpads_listen[CONF_PAD_MAX_REGISTERED]; +static wiimote_listen __wpads_listen[CONF_PAD_TOTAL]; static WPADData wpaddata[WPAD_MAX_WIIMOTES]; static struct _wpad_cb __wpdcb[WPAD_MAX_WIIMOTES]; static conf_pads __wpad_devs; static struct linkkey_info __wpad_keys[WPAD_MAX_WIIMOTES]; -static lwp_t __wpad_syncbtnthread = LWP_THREAD_NULL; +static struct pad_info __wpad_dev_candidates[BD_MAX_INQUIRY_DEVS]; static s32 __wpad_onreset(s32 final); static s32 __wpad_disconnect(struct _wpad_cb *wpdcb); @@ -204,17 +205,17 @@ static void __wpad_setfmt(s32 chan) } } -wiimote *__wpad_assign_slot(struct bd_addr *pad_addr) +wiimote *__wpad_assign_slot(wiimote_listen *wml) { u32 i, level; struct bd_addr bdaddr; - //printf("WPAD Assigning slot (active: 0x%02x)\n", __wpads_used); - //printf(" bdaddr: %02x:%02x:%02x:%02x:%02x:%02x\n",pad_addr->addr[5],pad_addr->addr[4],pad_addr->addr[3],pad_addr->addr[2],pad_addr->addr[1],pad_addr->addr[0]); + printf("WPAD Assigning slot (active: 0x%02x)\n", __wpads_used); + printf(" bdaddr: %02x:%02x:%02x:%02x:%02x:%02x\n",wml->bdaddr.addr[5],wml->bdaddr.addr[4],wml->bdaddr.addr[3],wml->bdaddr.addr[2],wml->bdaddr.addr[1],wml->bdaddr.addr[0]); _CPU_ISR_Disable(level); // check for balance board BD_ADDR_FROM_BYTES(&(bdaddr),__wpad_devs.balance_board.bdaddr); - if(bd_addr_cmp(pad_addr,&bdaddr)) { + if(bd_addr_cmp(&wml->bdaddr,&bdaddr)) { if(!(__wpads_used&(1<bdaddr,&bdaddr) && !(__wpads_used & (1<bdaddr); + printf("WPAD Got Free Slot %d\n", i); __wpads_used |= (0x01<bdaddr)) { + printf("Registering Wiimote '%s' with system...\n", __wpad_dev_candidates[i].name); + BYTES_FROM_BD_ADDR(__wpad_devs.registered[registered_index].bdaddr, &wml->bdaddr); + memcpy(__wpad_devs.registered[registered_index].name, __wpad_dev_candidates[i].name, sizeof(__wpad_devs.registered[registered_index].name)); + __wpad_devs.registered[registered_index].name[0x3F] = 0x00; + __wpad_devs.num_registered = registered_index + 1; + break; + } + } + } + + return __wpad_assign_slot(wml); +} + static s32 __wpad_init_finished(s32 result,void *usrdata) { u32 i; struct bd_addr bdaddr; - //printf("__wpad_init_finished(%d)\n",result); + printf("__wpad_init_finished(%d)\n",result); if(result==ERR_OK) { + for(i=0;iqueue_int,0,(sizeof(WPADData)*EVENTQUEUE_LENGTH)); __wpads_active &= ~(0x01<name)) + { + printf("Found Wiimote %s:\n", info->name); + printf(" bdaddr: %02x:%02x:%02x:%02x:%02x:%02x\n",info->bdaddr.addr[5],info->bdaddr.addr[4],info->bdaddr.addr[3],info->bdaddr.addr[2],info->bdaddr.addr[1],info->bdaddr.addr[0]); + + if (BTE_GetPairMode() == INQUIRY_MODE_SINGLE) + { + int index = __wpad_devs.num_registered; + + for(i=0; ibdaddr,&bdaddr)) { + printf("Wiimote already registered\n"); + isRegistered = TRUE; + index = i; + break; + } + } + + if(index >= CONF_PAD_MAX_REGISTERED) + { + for(i=0; ibdaddr),__wpad_register_new); + break; + } + else + { + wiiuse_connect(&__wpads_listen[i],&(info->bdaddr),__wpad_assign_slot); + break; + } + } + } + } + else + { + for (i=CONF_PAD_MAX_REGISTERED; i<(CONF_PAD_MAX_REGISTERED+CONF_PAD_MAX_ACTIVE); i++) + { + if (!__wpads_listen[i].in_use) + { + wiiuse_connect(&__wpads_listen[i],&(info->bdaddr),__wpad_assign_slot); + break; + } + } + } } - memset(&__wpad_devs,0,sizeof(conf_pads)); - memset(__wpad_keys,0,sizeof(struct linkkey_info)*WPAD_MAX_WIIMOTES); - BTE_ClearStoredLinkKeys(); + else + { + printf("Found non-Wiimote %s:\n", info->name); + printf(" bdaddr: %02x:%02x:%02x:%02x:%02x:%02x\n",info->bdaddr.addr[5],info->bdaddr.addr[4],info->bdaddr.addr[3],info->bdaddr.addr[2],info->bdaddr.addr[1],info->bdaddr.addr[0]); + } + + free(info); } - else + + return ERR_OK; +} + +s32 __wpad_inquiry_finished(s32 result,void *userdata) +{ + int i; + struct inquiry_res *inq_res = (struct inquiry_res *)userdata; + + if (result == ERR_OK && inq_res != NULL) { - printf("Pairing...\n"); - struct inquiry_info info[255]; - struct bd_addr addrs[255]; - memset(info, 0, sizeof(info)); + int count = 0; + struct bd_addr addrs[BD_MAX_INQUIRY_DEVS]; memset(addrs, 0, sizeof(addrs)); - - int total = 0; - int found = bte_inquiry(info, 255, TRUE); - - for (int i = 0; i < found; i++) + for (i = 0; i < inq_res->count; i++) { + // Filter out duplicates bool new = TRUE; - struct inquiry_info *p = &info[i]; - //if ((p->cod[1] & 0x1F) == 0x5) + struct inquiry_info_ex *info = &inq_res->info[i]; + + //if ((info->cod[1] & 0x1F) == 0x5) + if (!bd_addr_cmp(&info->bdaddr,BD_ADDR_ANY)) { - for (int j = 0; j < total; j++) + for (int j = 0; j < count; j++) { - if (bd_addr_cmp(&addrs[j], &p->bdaddr)) + if (bd_addr_cmp(&__wpad_dev_candidates[j].bdaddr, &info->bdaddr)) { new = FALSE; break; } } - - if (new && !bd_addr_cmp(&p->bdaddr,BD_ADDR_ANY)) + + if (new) { - bd_addr_set(&(addrs[total]),&p->bdaddr); - total++; + //printf("Saw bdaddr: %02x:%02x:%02x:%02x:%02x:%02x\n",info->bdaddr.addr[5],info->bdaddr.addr[4],info->bdaddr.addr[3],info->bdaddr.addr[2],info->bdaddr.addr[1],info->bdaddr.addr[0]); + bd_addr_set(&(__wpad_dev_candidates[count].bdaddr),&info->bdaddr); + count++; } } } - //printf("Found %d BT devices\n", total); - for (int i = 0; i < total; i++) + for (i = 0; (i < count) && (i < BD_MAX_INQUIRY_DEVS); i++) { - bool isRegistered = FALSE; - u8 name[BD_NAME_LEN] = {0}; - BTE_ReadRemoteName(name, &addrs[i]); - if (IsValidDeviceName(name)) - { - printf("Found Wiimote %s:\n", name); - printf(" bdaddr: %02x:%02x:%02x:%02x:%02x:%02x\n",addrs[i].addr[5],addrs[i].addr[4],addrs[i].addr[3],addrs[i].addr[2],addrs[i].addr[1],addrs[i].addr[0]); - - for(int j=0; j<__wpad_devs.num_registered; j++) { - struct bd_addr bdaddr; - BD_ADDR_FROM_BYTES(&(bdaddr),__wpad_devs.registered[i].bdaddr); - if(bd_addr_cmp(&addrs[i],&bdaddr)) { - printf("Wiimote already registered\n"); - isRegistered = TRUE; - break; - } - } + //printf("Attempting to read name for bdaddr: %02x:%02x:%02x:%02x:%02x:%02x\n",__wpad_dev_candidates[i].bdaddr.addr[5],__wpad_dev_candidates[i].bdaddr.addr[4],__wpad_dev_candidates[i].bdaddr.addr[3],__wpad_dev_candidates[i].bdaddr.addr[2],__wpad_dev_candidates[i].bdaddr.addr[1],__wpad_dev_candidates[i].bdaddr.addr[0]); + BTE_ReadRemoteName(&__wpad_dev_candidates[i], __wpad_read_remote_name_finished); + } + } - if (!isRegistered) - { - u8 index = __wpad_devs.num_registered; + return ERR_OK; +} - if(index >= CONF_PAD_MAX_REGISTERED) - { - for(int j=0; jname); + printf(" bdaddr: %02x:%02x:%02x:%02x:%02x:%02x\n",device->bdaddr[0],device->bdaddr[1],device->bdaddr[2],device->bdaddr[3],device->bdaddr[4],device->bdaddr[5]); + } + + for(i=0;i<__wpad_devs.num_registered;i++) { conf_pad_device *device = &__wpad_devs.registered[i]; printf("Registered Wiimote %s:\n", device->name); printf(" bdaddr: %02x:%02x:%02x:%02x:%02x:%02x\n",device->bdaddr[0],device->bdaddr[1],device->bdaddr[2],device->bdaddr[3],device->bdaddr[4],device->bdaddr[5]); From b1b84fd502a4d0f1056f9274ab0919164c036d0e Mon Sep 17 00:00:00 2001 From: Zarithya Date: Wed, 19 Mar 2025 03:58:20 -0700 Subject: [PATCH 03/27] Almost finished replicating Wii menu pairing functionality --- gc/bte/bte.h | 12 +- gc/ogc/conf.h | 18 ++ gc/wiiuse/wiiuse.h | 6 +- gc/wiiuse/wpad.h | 2 + libogc/conf.c | 20 ++ lwbt/bte.c | 60 ++++-- lwbt/hci.c | 22 ++- wiiuse/io.c | 2 +- wiiuse/io_wii.c | 34 ++-- wiiuse/wpad.c | 484 +++++++++++++++++++++++++++------------------ 10 files changed, 422 insertions(+), 238 deletions(-) diff --git a/gc/bte/bte.h b/gc/bte/bte.h index 4a0a9c481..1ab7a9524 100644 --- a/gc/bte/bte.h +++ b/gc/bte/bte.h @@ -69,9 +69,9 @@ #define BD_NAME_LEN 248 #define BD_MAX_INQUIRY_DEVS 255 -enum inquiry_mode { - INQUIRY_MODE_SINGLE, - INQUIRY_MODE_PERIODIC +enum pair_mode { + PAIR_MODE_NORMAL, + PAIR_MODE_TEMPORARY }; #ifdef __cplusplus @@ -132,6 +132,7 @@ struct bte_pcb s32 (*recv)(void *arg,void *buffer,u16 len); + s32 (*conn_req)(void *arg,struct bte_pcb *pcb,struct bd_addr *bdaddr,u8 *cod,u8 link_type,u8 err); s32 (*conn_cfm)(void *arg,struct bte_pcb *pcb,u8 err); s32 (*disconn_cfm)(void *arg,struct bte_pcb *pcb,u8 err); }; @@ -147,13 +148,16 @@ s32 BTE_InitSub(btecallback cb); s32 BTE_ReadStoredLinkKey(struct linkkey_info *keys,u8 max_cnt,btecallback cb); s32 BTE_ReadBdAddr(struct bd_addr *bdaddr, btecallback cb); s32 BTE_SetEvtFilter(u8 filter_type,u8 filter_cond_type,u8 *cond, btecallback cb); -s32 BTE_ReadRemoteName(struct pad_info *info, btecallback cb); +s32 BTE_ReadRemoteName(struct bd_addr *bdaddr, btecallback cb); s32 BTE_Inquiry(u8 max_cnt,u8 flush, btecallback cb); s32 BTE_PeriodicInquiry(u8 max_cnt,u8 flush,btecallback cb); s32 BTE_ExitPeriodicInquiry(void); void (*BTE_SetDisconnectCallback(void (*callback)(struct bd_addr *bdaddr,u8 reason)))(struct bd_addr *bdaddr,u8 reason); void BTE_SetSyncButtonCallback(void (*callback)(u32 held)); +void BTE_SetConnectionRequestCallback(s8 (*callback)(void *arg,struct bd_addr *bdaddr,u8 *cod,u8 link_type)); +void BTE_SetLinkKeyNotificationCallback(s8 (*callback)(void *arg,struct bd_addr *bdaddr,u8 *key)); u8 BTE_GetPairMode(void); +void BTE_WriteStoredLinkKey(struct bd_addr *bdaddr,u8 *key); void BTE_ClearStoredLinkKeys(void); struct bte_pcb* bte_new(void); diff --git a/gc/ogc/conf.h b/gc/ogc/conf.h index 128ef6433..3705499bf 100644 --- a/gc/ogc/conf.h +++ b/gc/ogc/conf.h @@ -129,6 +129,7 @@ enum { #define CONF_PAD_MAX_REGISTERED 10 #define CONF_PAD_MAX_ACTIVE 4 #define CONF_PAD_TOTAL (CONF_PAD_MAX_REGISTERED + CONF_PAD_MAX_ACTIVE + 2) +#define CONF_PAD_GUESTS_MAX 6 typedef struct _conf_pad_device conf_pad_device; @@ -147,6 +148,21 @@ struct _conf_pads { conf_pad_device unknown; } ATTRIBUTE_PACKED; +typedef struct _conf_pad_guest_device conf_pad_guest_device; + +struct _conf_pad_guest_device { + u8 bdaddr[6]; + char name[0x40]; + u8 link_key[16]; +} ATTRIBUTE_PACKED; + +typedef struct _conf_pad_guests conf_pad_guests; + +struct _conf_pad_guests { + u8 num_guests; + conf_pad_guest_device guests[CONF_PAD_GUESTS_MAX]; +} ATTRIBUTE_PACKED; + s32 CONF_Init(void); s32 CONF_GetLength(const char *name); s32 CONF_GetType(const char *name); @@ -165,6 +181,7 @@ s32 CONF_GetCounterBias(u32 *bias); s32 CONF_GetScreenSaverMode(void); s32 CONF_GetDisplayOffsetH(s8 *offset); s32 CONF_GetPadDevices(conf_pads *pads); +s32 CONF_GetPadGuestDevices(conf_pad_guests *pads); s32 CONF_GetNickName(u8 *nickname); s32 CONF_GetAspectRatio(void); s32 CONF_GetEULA(void); @@ -176,6 +193,7 @@ s32 CONF_GetArea(void); s32 CONF_GetVideo(void); s32 CONF_SetPadDevices(const conf_pads *pads); +s32 CONF_SetPadGuestDevices(const conf_pad_guests *pads); s32 CONF_SaveChanges(void); #ifdef __cplusplus diff --git a/gc/wiiuse/wiiuse.h b/gc/wiiuse/wiiuse.h index 8d23aa0ad..6265affc6 100644 --- a/gc/wiiuse/wiiuse.h +++ b/gc/wiiuse/wiiuse.h @@ -660,7 +660,7 @@ typedef struct wiimote_t { * @brief Wiimote listen structure. */ typedef struct wiimote_listen_t { - WCONST u8 in_use; + WCONST u8 name[0x40]; WCONST struct bd_addr bdaddr; WCONST struct bte_pcb *sock; WCONST struct wiimote_t *(*assign_cb)(struct wiimote_listen_t *wml); @@ -698,8 +698,8 @@ WIIUSE_EXPORT extern const char* wiiuse_version(); #ifndef GEKKO WIIUSE_EXPORT extern struct wiimote_t** wiiuse_init(int wiimotes); #else -WIIUSE_EXPORT extern int wiiuse_register(struct wiimote_listen_t *wml, struct bd_addr *bdaddr, struct wiimote_t *(*assign_cb)(struct wiimote_listen_t *wml)); -WIIUSE_EXPORT extern int wiiuse_connect(struct wiimote_listen_t *wml, struct bd_addr *bdaddr, struct wiimote_t *(*assign_cb)(struct wiimote_listen_t *wml)); +WIIUSE_EXPORT extern int wiiuse_register(struct wiimote_listen_t *wml, struct bd_addr *bdaddr, u8 *name, struct wiimote_t *(*assign_cb)(struct wiimote_listen_t *wml)); +WIIUSE_EXPORT extern int wiiuse_connect(struct wiimote_listen_t *wml, struct bd_addr *bdaddr, u8 *name, struct wiimote_t *(*assign_cb)(struct wiimote_listen_t *wml)); WIIUSE_EXPORT extern struct wiimote_t** wiiuse_init(int wiimotes, wii_event_cb event_cb); WIIUSE_EXPORT extern void wiiuse_sensorbar_enable(int enable); #endif diff --git a/gc/wiiuse/wpad.h b/gc/wiiuse/wpad.h index 88da3ee97..c4587b46d 100644 --- a/gc/wiiuse/wpad.h +++ b/gc/wiiuse/wpad.h @@ -185,6 +185,8 @@ s32 WPAD_IsSpeakerEnabled(s32 chan); s32 WPAD_SendStreamData(s32 chan,void *buf,u32 len); s32 WPAD_Search(void); s32 WPAD_StopSearch(void); +s32 WPAD_StartPairing(void); +s32 WPAD_WipeSavedControllers(void); void WPAD_Shutdown(void); void WPAD_SetIdleTimeout(u32 seconds); void WPAD_SetPowerButtonCallback(WPADShutdownCallback cb); diff --git a/libogc/conf.c b/libogc/conf.c index 59f8a6205..9fb6d31a7 100644 --- a/libogc/conf.c +++ b/libogc/conf.c @@ -430,6 +430,26 @@ s32 CONF_SetPadDevices(const conf_pads *pads) return CONF_Set("BT.DINF", pads, sizeof(conf_pads)); } +s32 CONF_GetPadGuestDevices(conf_pad_guests *pads) +{ + int res; + + res = CONF_Get("BT.CDIF", pads, sizeof(conf_pad_guests)); + if(res < 0) return res; + if(res < sizeof(conf_pad_guests)) return CONF_EBADVALUE; + return 0; +} + +s32 CONF_SetPadGuestDevices(const conf_pad_guests *pads) +{ + u8 count; + + if (!pads) return CONF_EBADVALUE; + count = pads->num_guests; + if (count > CONF_PAD_GUESTS_MAX) return CONF_EBADVALUE; + return CONF_Set("BT.CDIF", pads, sizeof(conf_pad_guests)); +} + s32 CONF_GetNickName(u8 *nickname) { int i, res; diff --git a/lwbt/bte.c b/lwbt/bte.c index a46b5d0c5..0ba889660 100644 --- a/lwbt/bte.c +++ b/lwbt/bte.c @@ -50,7 +50,7 @@ struct bt_state u8_t num_maxdevs; - u8_t inquiry_mode; + u8_t pair_mode; struct inquiry_res inq_res; @@ -168,9 +168,15 @@ static inline s32 __bte_cmdfinish(struct bt_state *state,err_t err) state->last_err = err; state->hci_cmddone = 1; if(state->cb!=NULL) - state->cb(err,state->usrdata); + { + btecallback cb = state->cb; + state->cb = NULL; + cb(err,state->usrdata); + } else + { LWP_ThreadSignal(state->hci_cmdq); + } _CPU_ISR_Restore(level); return err; @@ -393,7 +399,7 @@ void BTE_Init(void) hci_wlp_complete(acl_wlp_completed); hci_connection_complete(acl_conn_complete); hci_remote_name_req_complete(bte_read_remote_name_complete); - hci_link_key_not(link_key_not); + //hci_link_key_not(link_key_not); hci_pin_req(pin_req); _CPU_ISR_Restore(level); @@ -534,7 +540,7 @@ s32 BTE_SetEvtFilter(u8 filter_type,u8 filter_cond_type,u8 *cond, btecallback cb return ERR_OK; } -s32 BTE_ReadRemoteName(struct pad_info *info, btecallback cb) +s32 BTE_ReadRemoteName(struct bd_addr *bdaddr, btecallback cb) { u32 level; err_t last_err = ERR_OK; @@ -544,7 +550,7 @@ s32 BTE_ReadRemoteName(struct pad_info *info, btecallback cb) btstate.usrdata = NULL; btstate.hci_cmddone = 0; hci_arg(&btstate); - hci_read_remote_name(&info->bdaddr); + hci_read_remote_name(bdaddr); _CPU_ISR_Restore(level); return last_err; @@ -552,7 +558,7 @@ s32 BTE_ReadRemoteName(struct pad_info *info, btecallback cb) u8 BTE_GetPairMode(void) { - return btstate.inquiry_mode; + return btstate.pair_mode; } void (*BTE_SetDisconnectCallback(void (*callback)(struct bd_addr *bdaddr,u8 reason)))(struct bd_addr *bdaddr,u8 reason) @@ -569,6 +575,24 @@ void BTE_SetSyncButtonCallback(void (*callback)(u32 held)) _CPU_ISR_Restore(level); } +void BTE_SetConnectionRequestCallback(err_t (*callback)(void *arg,struct bd_addr *bdaddr,u8 *cod,u8 link_type)) +{ + u32 level; + + _CPU_ISR_Disable(level); + hci_conn_req(callback); + _CPU_ISR_Restore(level); +} + +void BTE_SetLinkKeyNotificationCallback(err_t (*callback)(void *arg,struct bd_addr *bdaddr,u8 *key)) +{ + u32 level; + + _CPU_ISR_Disable(level); + hci_link_key_not(callback); + _CPU_ISR_Restore(level); +} + void BTE_ClearStoredLinkKeys(void) { hci_delete_stored_link_key(NULL, 0x01); @@ -596,11 +620,11 @@ s32 bte_registerdeviceasync(struct bte_pcb *pcb,struct bd_addr *bdaddr,s32 (*con //printf("bte_registerdeviceasync()\n"); _CPU_ISR_Disable(level); - if(lp_is_connected(bdaddr)) { + /*if(lp_is_connected(bdaddr)) { printf("bdaddr already exists: %02x:%02x:%02x:%02x:%02x:%02x\n",bdaddr->addr[5],bdaddr->addr[4],bdaddr->addr[3],bdaddr->addr[2],bdaddr->addr[1],bdaddr->addr[0]); err = ERR_CONN; goto error; - } + }*/ pcb->err = ERR_USE; pcb->data_pcb = NULL; @@ -698,7 +722,7 @@ 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.inquiry_mode = INQUIRY_MODE_SINGLE; + 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 @@ -716,7 +740,7 @@ s32 BTE_PeriodicInquiry(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.inquiry_mode = INQUIRY_MODE_PERIODIC; + 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 @@ -732,6 +756,7 @@ 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; @@ -964,7 +989,7 @@ err_t pin_req(void *arg,struct bd_addr *bdaddr) struct bd_addr addr; //printf("pin_req\n"); - if (btstate.inquiry_mode == INQUIRY_MODE_SINGLE) + if (btstate.pair_mode == PAIR_MODE_NORMAL) { // Pairing from sync button (permanent) hci_get_bd_addr(&addr); @@ -1037,10 +1062,9 @@ err_t l2cap_disconnect_cfm(void *arg, struct l2cap_pcb *pcb) return ERR_OK; } -err_t link_key_not(void *arg,struct bd_addr *bdaddr,u8_t *key) +void BTE_WriteStoredLinkKey(struct bd_addr *bdaddr,u8_t *key) { - //printf("link_key_not\n"); - return hci_write_stored_link_key(bdaddr,key); + hci_write_stored_link_key(bdaddr,key); } err_t l2cap_connected(void *arg,struct l2cap_pcb *l2cappcb,u16_t result,u16_t status) @@ -1075,7 +1099,7 @@ err_t l2cap_accepted(void *arg,struct l2cap_pcb *l2cappcb,err_t err) { struct bte_pcb *btepcb = (struct bte_pcb*)arg; - printf("l2cap_accepted(%02x)\n",err); + //printf("l2cap_accepted(%02x)\n",err); if(err==ERR_OK) { l2cap_recv(l2cappcb,bte_process_input); l2cap_disconnect_ind(l2cappcb,l2cap_disconnected_ind); @@ -1132,8 +1156,8 @@ err_t bte_inquiry_complete(void *arg,struct hci_pcb *pcb,struct hci_inq_res *ire inq_res->info[i].psm = p->psm; inq_res->info[i].co = p->co; - /*printf("bdaddr: %02x:%02x:%02x:%02x:%02x:%02x\n",p->bdaddr.addr[0],p->bdaddr.addr[1],p->bdaddr.addr[2],p->bdaddr.addr[3],p->bdaddr.addr[4],p->bdaddr.addr[5]); - printf("cod: %02x%02x%02x\n",p->cod[0],p->cod[1],p->cod[2]); + /*printf("bdaddr: %02x:%02x:%02x:%02x:%02x:%02x\n",p->bdaddr.addr[5],p->bdaddr.addr[4],p->bdaddr.addr[3],p->bdaddr.addr[2],p->bdaddr.addr[1],p->bdaddr.addr[0]); + printf("cod: %02x%02x%02x\n",p->cod[2],p->cod[1],p->cod[0]); printf("psrm: %02x\n",p->psrm); printf("psm: %02x\n",p->psm); printf("co: %04x\n",p->co);*/ @@ -1145,7 +1169,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->inquiry_mode == INQUIRY_MODE_SINGLE) + } else if (state->pair_mode == PAIR_MODE_NORMAL) hci_inquiry(0x009E8B33,0x03,btstate.num_maxdevs,bte_inquiry_complete); } return ERR_OK; diff --git a/lwbt/hci.c b/lwbt/hci.c index a59530a25..7952e43a8 100644 --- a/lwbt/hci.c +++ b/lwbt/hci.c @@ -460,7 +460,7 @@ err_t hci_set_event_filter(u8_t filter_type,u8_t filter_cond_type,u8_t *cond) ((u8_t*)p->payload)[4] = filter_type; ((u8_t*)p->payload)[5] = filter_cond_type; if(cond_len>0) memcpy(p->payload+6,cond,cond_len); - + physbusif_output(p,p->tot_len); btpbuf_free(p); @@ -741,7 +741,7 @@ err_t hci_write_page_scan_type(u8_t type) struct pbuf *p = NULL; if((p=btpbuf_alloc(PBUF_RAW,HCI_W_PAGE_SCAN_TYPE_PLEN,PBUF_RAM))==NULL) { - ERROR("hci_write_inquiry_mode: Could not allocate memory for pbuf\n"); + ERROR("hci_write_page_scan_type: Could not allocate memory for pbuf\n"); return ERR_MEM; } @@ -761,7 +761,7 @@ err_t hci_write_inquiry_scan_type(u8_t type) struct pbuf *p = NULL; if((p=btpbuf_alloc(PBUF_RAW,HCI_W_INQUIRY_SCAN_TYPE_PLEN,PBUF_RAM))==NULL) { - ERROR("hci_write_inquiry_mode: Could not allocate memory for pbuf\n"); + ERROR("hci_write_inquiry_scan_type: Could not allocate memory for pbuf\n"); return ERR_MEM; } @@ -781,7 +781,7 @@ err_t hci_vendor_specific_command(u8_t ocf,u8_t ogf,void *data,u8_t len) struct pbuf *p = NULL; if((p=btpbuf_alloc(PBUF_RAW,HCI_W_VENDOR_CMD_PLEN + len,PBUF_RAM))==NULL) { - ERROR("hci_vendor_specific_patch: Could not allocate memory for pbuf\n"); + ERROR("hci_vendor_specific_command: Could not allocate memory for pbuf\n"); return ERR_MEM; } @@ -1567,9 +1567,9 @@ static void hci_conn_request_evt(struct pbuf *p) struct hci_link *link; LOG("hci_conn_request_evt()\n"); - printf("hci_conn_request_evt()\n"); + //printf("hci_conn_request_evt()\n"); bdaddr = (void*)((u8_t*)p->payload); - printf(" bdaddr: %02x:%02x:%02x:%02x:%02x:%02x\n",bdaddr->addr[5],bdaddr->addr[4],bdaddr->addr[3],bdaddr->addr[2],bdaddr->addr[1],bdaddr->addr[0]); + //printf(" bdaddr: %02x:%02x:%02x:%02x:%02x:%02x\n",bdaddr->addr[5],bdaddr->addr[4],bdaddr->addr[3],bdaddr->addr[2],bdaddr->addr[1],bdaddr->addr[0]); cod = (((u8_t*)p->payload)+6); link_type = *(((u8_t*)p->payload)+9); @@ -1587,6 +1587,7 @@ static void hci_conn_request_evt(struct pbuf *p) } hci_accept_conn_request(bdaddr,0x00); } else { + hci_reject_connection_request(bdaddr, HCI_HOST_REJECTED_DUE_TO_SECURITY_REASONS); } } @@ -1600,7 +1601,7 @@ static void hci_conn_complete_evt(struct pbuf *p) bdaddr = (void*)(((u8_t*)p->payload)+3); link = hci_get_link(bdaddr); - //printf("hci_conn_complete_evt(%p,%02x - %02x:%02x:%02x:%02x:%02x:%02x)\n",link,((u8_t*)p->payload)[0],bdaddr->addr[5],bdaddr->addr[4],bdaddr->addr[3],bdaddr->addr[2],bdaddr->addr[1],bdaddr->addr[0]); + printf("hci_conn_complete_evt(%p,%02x - %02x:%02x:%02x:%02x:%02x:%02x)\n",link,((u8_t*)p->payload)[0],bdaddr->addr[5],bdaddr->addr[4],bdaddr->addr[3],bdaddr->addr[2],bdaddr->addr[1],bdaddr->addr[0]); switch(((u8_t*)p->payload)[0]) { case HCI_SUCCESS: if(link==NULL) { @@ -1622,6 +1623,11 @@ static void hci_conn_complete_evt(struct pbuf *p) } break; case HCI_PAGE_TIMEOUT: + ERROR("hci_conn_complete_evt: Timeout\n"); + if(link==NULL) { + hci_disconnect(bdaddr, HCI_OTHER_END_TERMINATED_CONN_USER_ENDED); + lp_disconnect_ind(bdaddr,HCI_CONN_TERMINATED_BY_LOCAL_HOST); + } break; default: if(link!=NULL) { @@ -1876,11 +1882,9 @@ void hci_event_handler(struct pbuf *p) case HCI_VENDOR: switch (((u8_t *)p->payload)[0]) { case HCI_VENDOR_BEGIN_PAIRING: - //printf("Begin Wiimote pairing\n"); HCI_EVENT_SYNC_BTN(hci_dev, FALSE); break; case HCI_VENDOR_CLEAR_PAIRED_DEVICES: - //printf("Clear paired Wiimotes"); HCI_EVENT_SYNC_BTN(hci_dev, TRUE); break; default: diff --git a/wiiuse/io.c b/wiiuse/io.c index bf980f84e..e938f92d8 100644 --- a/wiiuse/io.c +++ b/wiiuse/io.c @@ -19,7 +19,7 @@ void wiiuse_handshake(struct wiimote_t *wm,ubyte *data,uword len) ubyte *buf = NULL; struct accel_t *accel = &wm->accel_calib; - printf("wiiuse_handshake(%d,%p,%d)\n",wm->handshake_state,data,len); + //printf("wiiuse_handshake(%d,%p,%d)\n",wm->handshake_state,data,len); switch(wm->handshake_state) { case 0: wm->handshake_state++; diff --git a/wiiuse/io_wii.c b/wiiuse/io_wii.c index 24c325f15..b88a6f853 100644 --- a/wiiuse/io_wii.c +++ b/wiiuse/io_wii.c @@ -54,7 +54,8 @@ static s32 __wiiuse_disconnected(void *arg,struct bte_pcb *pcb,u8 err) if(wm->event_cb) wm->event_cb(wm,WIIUSE_DISCONNECT); wml->wm = NULL; - wml->in_use = FALSE; + //printf("Clearing Wiimote %s (%p)\n", wml->name, wml); + memset(wml->name, 0x00, sizeof(wml->name)); return ERR_OK; } @@ -86,7 +87,7 @@ static s32 __wiiuse_connected(void *arg,struct bte_pcb *pcb,u8 err) printf("__wiiuse_connected(%d)\n", err); if(err) { - wml->in_use = FALSE; + memset(wml->name, 0x00, sizeof(wml->name)); bte_disconnect(wml->sock); return ERR_CONN; } @@ -94,7 +95,7 @@ static s32 __wiiuse_connected(void *arg,struct bte_pcb *pcb,u8 err) wm = wml->assign_cb(wml); if(!wm) { - wml->in_use = FALSE; + memset(wml->name, 0x00, sizeof(wml->name)); bte_disconnect(wml->sock); return ERR_OK; } @@ -125,16 +126,25 @@ void __wiiuse_sensorbar_enable(int enable) IRQ_Restore(level); } -int wiiuse_register(struct wiimote_listen_t *wml, struct bd_addr *bdaddr, struct wiimote_t *(*assign_cb)(struct wiimote_listen_t *wml)) +int wiiuse_register(struct wiimote_listen_t *wml, struct bd_addr *bdaddr, u8 *name, struct wiimote_t *(*assign_cb)(struct wiimote_listen_t *wml)) { s32 err; + printf("wiiuse_register %p, bdaddr: %02x:%02x:%02x:%02x:%02x:%02x\n",wml,bdaddr->addr[5],bdaddr->addr[4],bdaddr->addr[3],bdaddr->addr[2],bdaddr->addr[1],bdaddr->addr[0]); + if(!wml || !bdaddr || !assign_cb) return 0; - wml->in_use = TRUE; wml->wm = NULL; bd_addr_set(&(wml->bdaddr),bdaddr); - //wml->bdaddr = *bdaddr; + if (name) + { + strncpy((char *)wml->name, (char *)name, sizeof(wml->name)); + wml->name[sizeof(wml->name) - 1] = 0x00; + } + else + { + memset(wml->name, 0, sizeof(wml->name)); + } wml->sock = bte_new(); wml->assign_cb = assign_cb; if(wml->sock==NULL) return 0; @@ -149,18 +159,18 @@ int wiiuse_register(struct wiimote_listen_t *wml, struct bd_addr *bdaddr, struct return 0; } -int wiiuse_connect(struct wiimote_listen_t *wml, struct bd_addr *bdaddr, struct wiimote_t *(*assign_cb)(struct wiimote_listen_t *wml)) +int wiiuse_connect(struct wiimote_listen_t *wml, struct bd_addr *bdaddr, u8 *name, struct wiimote_t *(*assign_cb)(struct wiimote_listen_t *wml)) { s32 err; - printf("wiiuse_connect %p, bdaddr: %02x:%02x:%02x:%02x:%02x:%02x\n",wml,bdaddr->addr[5],bdaddr->addr[4],bdaddr->addr[3],bdaddr->addr[2],bdaddr->addr[1],bdaddr->addr[0]); + //printf("wiiuse_connect %p, bdaddr: %02x:%02x:%02x:%02x:%02x:%02x\n",wml,bdaddr->addr[5],bdaddr->addr[4],bdaddr->addr[3],bdaddr->addr[2],bdaddr->addr[1],bdaddr->addr[0]); - if(!wml || !bdaddr || !assign_cb) return 0; + if(!wml || !bdaddr || !name || !assign_cb) return 0; - wml->in_use = TRUE; wml->wm = NULL; bd_addr_set(&(wml->bdaddr),bdaddr); - //wml->bdaddr = *bdaddr; + strncpy((char *)wml->name, (char *)name, sizeof(wml->name)); + wml->name[sizeof(wml->name) - 1] = 0x00; wml->sock = bte_new(); wml->assign_cb = assign_cb; if(wml->sock==NULL) return 0; @@ -169,7 +179,7 @@ int wiiuse_connect(struct wiimote_listen_t *wml, struct bd_addr *bdaddr, struct bte_received(wml->sock,__wiiuse_receive); bte_disconnected(wml->sock,__wiiuse_disconnected); - //Wprintf("wiiuse_connect\n"); + //printf("wiiuse_connect\n"); err = bte_connectdeviceasync(wml->sock,bdaddr,__wiiuse_connected); if(err==ERR_OK) return 1; diff --git a/wiiuse/wpad.c b/wiiuse/wpad.c index 3b8209275..a1ef88029 100644 --- a/wiiuse/wpad.c +++ b/wiiuse/wpad.c @@ -93,14 +93,13 @@ static vs32 __wpads_bonded = 0; static u32 __wpad_idletimeout = 300; static vu32 __wpads_active = 0; static vu32 __wpads_used = 0; -//static vu32 __wpads_pending_slots = 0; static wiimote **__wpads = NULL; -static wiimote_listen __wpads_listen[CONF_PAD_TOTAL]; +static wiimote_listen __wpads_listen[WPAD_MAX_WIIMOTES]; static WPADData wpaddata[WPAD_MAX_WIIMOTES]; static struct _wpad_cb __wpdcb[WPAD_MAX_WIIMOTES]; static conf_pads __wpad_devs; -static struct linkkey_info __wpad_keys[WPAD_MAX_WIIMOTES]; -static struct pad_info __wpad_dev_candidates[BD_MAX_INQUIRY_DEVS]; +static conf_pad_guests __wpad_guests; +static struct linkkey_info __wpad_keys[CONF_PAD_TOTAL]; static s32 __wpad_onreset(s32 final); static s32 __wpad_disconnect(struct _wpad_cb *wpdcb); @@ -208,76 +207,85 @@ static void __wpad_setfmt(s32 chan) wiimote *__wpad_assign_slot(wiimote_listen *wml) { u32 i, level; - struct bd_addr bdaddr; - printf("WPAD Assigning slot (active: 0x%02x)\n", __wpads_used); - printf(" bdaddr: %02x:%02x:%02x:%02x:%02x:%02x\n",wml->bdaddr.addr[5],wml->bdaddr.addr[4],wml->bdaddr.addr[3],wml->bdaddr.addr[2],wml->bdaddr.addr[1],wml->bdaddr.addr[0]); _CPU_ISR_Disable(level); - // check for balance board - BD_ADDR_FROM_BYTES(&(bdaddr),__wpad_devs.balance_board.bdaddr); - if(bd_addr_cmp(&wml->bdaddr,&bdaddr)) { - if(!(__wpads_used&(1<bdaddr,&bdaddr) && !(__wpads_used & (1<bdaddr.addr[5],wml->bdaddr.addr[4],wml->bdaddr.addr[3],wml->bdaddr.addr[2],wml->bdaddr.addr[1],wml->bdaddr.addr[0]); + BYTES_FROM_BD_ADDR(__wpad_devs.active[i].bdaddr, &wml->bdaddr); + __wpads_used |= (0x01<bdaddr); - printf("WPAD Got Free Slot %d\n", i); - __wpads_used |= (0x01<bdaddr,&bdaddr)) { + printf("Wiimote guest in slot %d\n", i); + known = TRUE; break; } } + + if (!known) + { + for(i=0; ibdaddr,&bdaddr)) { + printf("Wiimote currently registered in slot %d\n", i); + known = TRUE; + break; + } + } + } - if (registered_index < CONF_PAD_MAX_REGISTERED) + if (!known) { - for (i=0; ibdaddr)) { - printf("Registering Wiimote '%s' with system...\n", __wpad_dev_candidates[i].name); - BYTES_FROM_BD_ADDR(__wpad_devs.registered[registered_index].bdaddr, &wml->bdaddr); - memcpy(__wpad_devs.registered[registered_index].name, __wpad_dev_candidates[i].name, sizeof(__wpad_devs.registered[registered_index].name)); - __wpad_devs.registered[registered_index].name[0x3F] = 0x00; - __wpad_devs.num_registered = registered_index + 1; - break; + printf("Registering Wiimote '%s' with system...\n", wml->name); + memmove(&__wpad_devs.registered[1], &__wpad_devs.registered[0], sizeof(conf_pad_device)*(CONF_PAD_MAX_REGISTERED-1)); + BYTES_FROM_BD_ADDR(__wpad_devs.registered[0].bdaddr, &wml->bdaddr); + memcpy(__wpad_devs.registered[0].name, wml->name, sizeof(__wpad_devs.registered[0].name)); + if (__wpad_devs.num_registered < CONF_PAD_MAX_REGISTERED) + __wpad_devs.num_registered++; + } + else + { + printf("Saving Wiimote '%s' as guest...\n", wml->name); + memmove(&__wpad_guests.guests[1], &__wpad_guests.guests[0], sizeof(conf_pad_guest_device)*(CONF_PAD_GUESTS_MAX-1)); + BYTES_FROM_BD_ADDR(__wpad_guests.guests[0].bdaddr, &wml->bdaddr); + memcpy(__wpad_guests.guests[0].name, wml->name, sizeof(__wpad_guests.guests[0].name)); + if (__wpad_guests.num_guests < CONF_PAD_GUESTS_MAX) + __wpad_guests.num_guests++; + + for(i=0; ibdaddr,&__wpad_keys[i].bdaddr)) { + u8 *src = __wpad_keys[i].key; + u8 *dst = __wpad_guests.guests[0].link_key; + printf("Writing guest key: %02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x\n",__wpad_keys[i].key[0],__wpad_keys[i].key[1],__wpad_keys[i].key[2],__wpad_keys[i].key[3],__wpad_keys[i].key[4],__wpad_keys[i].key[5],__wpad_keys[i].key[6],__wpad_keys[i].key[7],__wpad_keys[i].key[8],__wpad_keys[i].key[9],__wpad_keys[i].key[10],__wpad_keys[i].key[11],__wpad_keys[i].key[12],__wpad_keys[i].key[13],__wpad_keys[i].key[14],__wpad_keys[i].key[15]); + for (j=0;j<16;j++) + { + dst[j] = src[15 - j]; + } + //memcpy(__wpad_guests.guests[0].link_key,&__wpad_keys[i].key,sizeof(__wpad_guests.guests[0].link_key)); + break; + } } } } @@ -285,61 +293,61 @@ wiimote *__wpad_register_new(wiimote_listen *wml) return __wpad_assign_slot(wml); } -static s32 __wpad_init_finished(s32 result,void *usrdata) +static s32 __wpad_setevtfilter_connsetup_finished(s32 result,void *usrdata) { u32 i; struct bd_addr bdaddr; - printf("__wpad_init_finished(%d)\n",result); + //printf("__wpad_setevtfilter_finished(%d)\n",result); if(result==ERR_OK) { for(i=0;iqueue_int,0,(sizeof(WPADData)*EVENTQUEUE_LENGTH)); __wpads_active &= ~(0x01<name)) + if (!strncmp("Nintendo RVL-", (char *)info->name, 13)) { printf("Found Wiimote %s:\n", info->name); printf(" bdaddr: %02x:%02x:%02x:%02x:%02x:%02x\n",info->bdaddr.addr[5],info->bdaddr.addr[4],info->bdaddr.addr[3],info->bdaddr.addr[2],info->bdaddr.addr[1],info->bdaddr.addr[0]); - if (BTE_GetPairMode() == INQUIRY_MODE_SINGLE) - { - int index = __wpad_devs.num_registered; - - for(i=0; ibdaddr,&bdaddr)) { - printf("Wiimote already registered\n"); - isRegistered = TRUE; - index = i; - break; - } + // Check for Balance Board + BD_ADDR_FROM_BYTES(&(bdaddr),__wpad_devs.balance_board.bdaddr); + if(bd_addr_cmp(&info->bdaddr,&bdaddr)) { + if(__wpads_listen[WPAD_BALANCE_BOARD].name[0] == 0x00) { + printf("Balance Board!\n"); + slot = WPAD_BALANCE_BOARD; } - - if(index >= CONF_PAD_MAX_REGISTERED) + else { - for(i=0; ibdaddr),__wpad_register_new); - break; - } - else - { - wiiuse_connect(&__wpads_listen[i],&(info->bdaddr),__wpad_assign_slot); - break; - } + } + + // Not Balance Board, check active list + if(slot >= WPAD_MAX_WIIMOTES) + { + for(i=0; ibdaddr,&bdaddr)) { + printf("Wiimote already active in slot %d\n", i); + slot = i; + break; } } } - else + + // Not active, try to make active + if(slot >= WPAD_MAX_WIIMOTES) { - for (i=CONF_PAD_MAX_REGISTERED; i<(CONF_PAD_MAX_REGISTERED+CONF_PAD_MAX_ACTIVE); i++) - { - if (!__wpads_listen[i].in_use) - { - wiiuse_connect(&__wpads_listen[i],&(info->bdaddr),__wpad_assign_slot); + for(i=0; ibdaddr,info->name,__wpad_register_new); + } + else + { + printf("All slots used!\n"); + result = ERR_CONN; + } } else { printf("Found non-Wiimote %s:\n", info->name); printf(" bdaddr: %02x:%02x:%02x:%02x:%02x:%02x\n",info->bdaddr.addr[5],info->bdaddr.addr[4],info->bdaddr.addr[3],info->bdaddr.addr[2],info->bdaddr.addr[1],info->bdaddr.addr[0]); + result = ERR_ARG; } + } + +end: + if (info) free(info); + return result; +} - free(info); +static s8 __wpad_connreqCB(void *arg,struct bd_addr *pad_addr,u8 *cod,u8 link_type) +{ + int i, j; + int slot = WPAD_MAX_WIIMOTES; + struct bd_addr bdaddr; + + if (BTE_GetPairMode() == PAIR_MODE_NORMAL) + { + if (!bd_addr_cmp(pad_addr,BD_ADDR_ANY)) + { + BD_ADDR_FROM_BYTES(&(bdaddr),__wpad_devs.balance_board.bdaddr); + if(bd_addr_cmp(pad_addr,&bdaddr)) { + printf("Balance Board wants to connect!\n"); + wiiuse_register(&__wpads_listen[WPAD_BALANCE_BOARD],pad_addr,(u8 *)"Balance Board",__wpad_assign_slot); + return ERR_OK; + } + + for(i=0; iaddr[5],pad_addr->addr[4],pad_addr->addr[3],pad_addr->addr[2],pad_addr->addr[1],pad_addr->addr[0]); + return ERR_VAL; + } + return ERR_CONN; +} + +static s8 __wpad_linkkeynotCB(void *arg,struct bd_addr *pad_addr,u8 *key) +{ + int i; + if (BTE_GetPairMode() == PAIR_MODE_NORMAL) + { + BTE_WriteStoredLinkKey(pad_addr,key); + } + + printf("__wpad_linkkeynotCB\n"); + + for(i=0; iaddr[5],pad_addr->addr[4],pad_addr->addr[3],pad_addr->addr[2],pad_addr->addr[1],pad_addr->addr[0]); + //printf(" key: %02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x\n",key[0],key[1],key[2],key[3],key[4],key[5],key[6],key[7],key[8],key[9],key[10],key[11],key[12],key[13],key[14],key[15]); + memcpy(__wpad_keys[i].key,key,sizeof(__wpad_keys[i].key)); + break; + } } return ERR_OK; @@ -815,103 +907,88 @@ s32 __wpad_inquiry_finished(s32 result,void *userdata) { int i; struct inquiry_res *inq_res = (struct inquiry_res *)userdata; + printf("__wpad_inquiry_finished %d\n", inq_res->count); if (result == ERR_OK && inq_res != NULL) { - int count = 0; - struct bd_addr addrs[BD_MAX_INQUIRY_DEVS]; - memset(addrs, 0, sizeof(addrs)); - + // Filter out weird null values for (i = 0; i < inq_res->count; i++) { - // Filter out duplicates - bool new = TRUE; struct inquiry_info_ex *info = &inq_res->info[i]; - //if ((info->cod[1] & 0x1F) == 0x5) if (!bd_addr_cmp(&info->bdaddr,BD_ADDR_ANY)) { - for (int j = 0; j < count; j++) - { - if (bd_addr_cmp(&__wpad_dev_candidates[j].bdaddr, &info->bdaddr)) - { - new = FALSE; - break; - } - } - - if (new) - { - //printf("Saw bdaddr: %02x:%02x:%02x:%02x:%02x:%02x\n",info->bdaddr.addr[5],info->bdaddr.addr[4],info->bdaddr.addr[3],info->bdaddr.addr[2],info->bdaddr.addr[1],info->bdaddr.addr[0]); - bd_addr_set(&(__wpad_dev_candidates[count].bdaddr),&info->bdaddr); - count++; - } + printf("Attempting to read name for bdaddr: %02x:%02x:%02x:%02x:%02x:%02x\n",info->bdaddr.addr[5],info->bdaddr.addr[4],info->bdaddr.addr[3],info->bdaddr.addr[2],info->bdaddr.addr[1],info->bdaddr.addr[0]); + BTE_ReadRemoteName(&info->bdaddr, __wpad_read_remote_name_finished); + break; } } - - for (i = 0; (i < count) && (i < BD_MAX_INQUIRY_DEVS); i++) - { - //printf("Attempting to read name for bdaddr: %02x:%02x:%02x:%02x:%02x:%02x\n",__wpad_dev_candidates[i].bdaddr.addr[5],__wpad_dev_candidates[i].bdaddr.addr[4],__wpad_dev_candidates[i].bdaddr.addr[3],__wpad_dev_candidates[i].bdaddr.addr[2],__wpad_dev_candidates[i].bdaddr.addr[1],__wpad_dev_candidates[i].bdaddr.addr[0]); - BTE_ReadRemoteName(&__wpad_dev_candidates[i], __wpad_read_remote_name_finished); - } } return ERR_OK; } -void __wpad_def_synccb(u32 held) +s32 WPAD_StartPairing(void) +{ + u32 level; + + _CPU_ISR_Disable(level); + printf("Pairing...\n"); + BTE_Inquiry(BD_MAX_INQUIRY_DEVS, TRUE, __wpad_inquiry_finished); + _CPU_ISR_Restore(level); + + return ERR_OK; +} + +s32 WPAD_WipeSavedControllers(void) { u32 level; int i; - struct _wpad_cb *wpdcb = NULL; + _CPU_ISR_Disable(level); + printf("Wiping saved controllers...\n"); + + for(i=0;ibdaddr[0],device->bdaddr[1],device->bdaddr[2],device->bdaddr[3],device->bdaddr[4],device->bdaddr[5]); } + printf("BT.DINF num_registered %d\n", __wpad_devs.num_registered); + for(i=0;i<__wpad_devs.num_registered;i++) { conf_pad_device *device = &__wpad_devs.registered[i]; printf("Registered Wiimote %s:\n", device->name); printf(" bdaddr: %02x:%02x:%02x:%02x:%02x:%02x\n",device->bdaddr[0],device->bdaddr[1],device->bdaddr[2],device->bdaddr[3],device->bdaddr[4],device->bdaddr[5]); } + if(CONF_GetPadGuestDevices(&__wpad_guests) < 0) { + WPAD_Shutdown(); + _CPU_ISR_Restore(level); + return WPAD_ERR_BADCONF; + } + + if(__wpad_guests.num_guests > CONF_PAD_GUESTS_MAX) { + WPAD_Shutdown(); + _CPU_ISR_Restore(level); + return WPAD_ERR_BADCONF; + } + + printf("BT.CDIF num_guests %d\n", __wpad_guests.num_guests); + + for(i=0;i<__wpad_guests.num_guests;i++) { + conf_pad_guest_device *device = &__wpad_guests.guests[i]; + printf("Guest Wiimote %s:\n", device->name); + printf(" bdaddr: %02x:%02x:%02x:%02x:%02x:%02x\n",device->bdaddr[0],device->bdaddr[1],device->bdaddr[2],device->bdaddr[3],device->bdaddr[4],device->bdaddr[5]); + } + __wpads = wiiuse_init(WPAD_MAX_WIIMOTES,__wpad_eventCB); if(__wpads==NULL) { WPAD_Shutdown(); @@ -1002,6 +1101,8 @@ s32 WPAD_Init(void) BTE_Init(); BTE_SetDisconnectCallback(__wpad_disconnectCB); BTE_SetSyncButtonCallback(__wpad_syncbuttonCB); + BTE_SetConnectionRequestCallback(__wpad_connreqCB); + BTE_SetLinkKeyNotificationCallback(__wpad_linkkeynotCB); BTE_InitCore(__initcore_finished); if (SYS_CreateAlarm(&__wpad_timer) < 0) @@ -1421,6 +1522,7 @@ void WPAD_Shutdown(void) _CPU_ISR_Disable(level); CONF_SetPadDevices(&__wpad_devs); + CONF_SetPadGuestDevices(&__wpad_guests); CONF_SaveChanges(); __wpads_inited = WPAD_STATE_DISABLED; From ccfe2674ba65f50afa6e0271eeda8b5adbcaa107 Mon Sep 17 00:00:00 2001 From: Zarithya Date: Tue, 25 Mar 2025 15:52:46 -0700 Subject: [PATCH 04/27] Final pairing implementation (cleanup WIP) --- gc/bte/bte.h | 3 + gc/ogc/conf.h | 4 +- gc/wiiuse/wiiuse.h | 6 +- gc/wiiuse/wpad.h | 1 + libogc/conf.c | 2 +- lwbt/bte.c | 48 +++++- lwbt/hci.c | 12 +- lwbt/l2cap.c | 2 +- wiiuse/io_wii.c | 42 ++---- wiiuse/wpad.c | 360 ++++++++++++++++++++++++++++++--------------- 10 files changed, 323 insertions(+), 157 deletions(-) diff --git a/gc/bte/bte.h b/gc/bte/bte.h index 1ab7a9524..4e26e9a42 100644 --- a/gc/bte/bte.h +++ b/gc/bte/bte.h @@ -152,9 +152,12 @@ s32 BTE_ReadRemoteName(struct bd_addr *bdaddr, btecallback cb); s32 BTE_Inquiry(u8 max_cnt,u8 flush, btecallback cb); 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); void (*BTE_SetDisconnectCallback(void (*callback)(struct bd_addr *bdaddr,u8 reason)))(struct bd_addr *bdaddr,u8 reason); void BTE_SetSyncButtonCallback(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_WriteStoredLinkKey(struct bd_addr *bdaddr,u8 *key); diff --git a/gc/ogc/conf.h b/gc/ogc/conf.h index 3705499bf..c860cead8 100644 --- a/gc/ogc/conf.h +++ b/gc/ogc/conf.h @@ -129,7 +129,7 @@ enum { #define CONF_PAD_MAX_REGISTERED 10 #define CONF_PAD_MAX_ACTIVE 4 #define CONF_PAD_TOTAL (CONF_PAD_MAX_REGISTERED + CONF_PAD_MAX_ACTIVE + 2) -#define CONF_PAD_GUESTS_MAX 6 +#define CONF_PAD_MAX_GUESTS 6 typedef struct _conf_pad_device conf_pad_device; @@ -160,7 +160,7 @@ typedef struct _conf_pad_guests conf_pad_guests; struct _conf_pad_guests { u8 num_guests; - conf_pad_guest_device guests[CONF_PAD_GUESTS_MAX]; + conf_pad_guest_device guests[CONF_PAD_MAX_GUESTS]; } ATTRIBUTE_PACKED; s32 CONF_Init(void); diff --git a/gc/wiiuse/wiiuse.h b/gc/wiiuse/wiiuse.h index 6265affc6..66b3b0f7c 100644 --- a/gc/wiiuse/wiiuse.h +++ b/gc/wiiuse/wiiuse.h @@ -663,7 +663,7 @@ typedef struct wiimote_listen_t { WCONST u8 name[0x40]; WCONST struct bd_addr bdaddr; WCONST struct bte_pcb *sock; - WCONST struct wiimote_t *(*assign_cb)(struct wiimote_listen_t *wml); + WCONST struct wiimote_t *(*assign_cb)(struct wiimote_listen_t *wml, u8 err); WCONST struct wiimote_t *wm; } wiimote_listen; #endif @@ -698,8 +698,8 @@ WIIUSE_EXPORT extern const char* wiiuse_version(); #ifndef GEKKO WIIUSE_EXPORT extern struct wiimote_t** wiiuse_init(int wiimotes); #else -WIIUSE_EXPORT extern int wiiuse_register(struct wiimote_listen_t *wml, struct bd_addr *bdaddr, u8 *name, struct wiimote_t *(*assign_cb)(struct wiimote_listen_t *wml)); -WIIUSE_EXPORT extern int wiiuse_connect(struct wiimote_listen_t *wml, struct bd_addr *bdaddr, u8 *name, struct wiimote_t *(*assign_cb)(struct wiimote_listen_t *wml)); +WIIUSE_EXPORT extern int wiiuse_register(struct wiimote_listen_t *wml, struct bd_addr *bdaddr, struct wiimote_t *(*assign_cb)(struct wiimote_listen_t *wml, u8 err)); +WIIUSE_EXPORT extern int wiiuse_connect(struct wiimote_listen_t *wml, struct bd_addr *bdaddr, u8 *name, struct wiimote_t *(*assign_cb)(struct wiimote_listen_t *wml, u8 err)); WIIUSE_EXPORT extern struct wiimote_t** wiiuse_init(int wiimotes, wii_event_cb event_cb); WIIUSE_EXPORT extern void wiiuse_sensorbar_enable(int enable); #endif diff --git a/gc/wiiuse/wpad.h b/gc/wiiuse/wpad.h index c4587b46d..f5ce13378 100644 --- a/gc/wiiuse/wpad.h +++ b/gc/wiiuse/wpad.h @@ -191,6 +191,7 @@ void WPAD_Shutdown(void); void WPAD_SetIdleTimeout(u32 seconds); void WPAD_SetPowerButtonCallback(WPADShutdownCallback cb); void WPAD_SetBatteryDeadCallback(WPADShutdownCallback cb); +void WPAD_SetIdleTimeoutCallback(WPADShutdownCallback cb); void WPAD_SetSyncButtonCallback(WPADSyncCallback cb); s32 WPAD_ScanPads(void); s32 WPAD_Rumble(s32 chan, int status); diff --git a/libogc/conf.c b/libogc/conf.c index 9fb6d31a7..9af23e0a4 100644 --- a/libogc/conf.c +++ b/libogc/conf.c @@ -446,7 +446,7 @@ s32 CONF_SetPadGuestDevices(const conf_pad_guests *pads) if (!pads) return CONF_EBADVALUE; count = pads->num_guests; - if (count > CONF_PAD_GUESTS_MAX) return CONF_EBADVALUE; + if (count > CONF_PAD_MAX_GUESTS) return CONF_EBADVALUE; return CONF_Set("BT.CDIF", pads, sizeof(conf_pad_guests)); } diff --git a/lwbt/bte.c b/lwbt/bte.c index 0ba889660..2d2f9ab9f 100644 --- a/lwbt/bte.c +++ b/lwbt/bte.c @@ -399,7 +399,6 @@ void BTE_Init(void) hci_wlp_complete(acl_wlp_completed); hci_connection_complete(acl_conn_complete); hci_remote_name_req_complete(bte_read_remote_name_complete); - //hci_link_key_not(link_key_not); hci_pin_req(pin_req); _CPU_ISR_Restore(level); @@ -556,6 +555,42 @@ s32 BTE_ReadRemoteName(struct bd_addr *bdaddr, btecallback cb) return last_err; } +s32 BTE_LinkKeyRequestReply(struct bd_addr *bdaddr,u8 *key) +{ + u32 level; + err_t last_err = ERR_OK; + + printf("BTE_LinkKeyRequestReply\n"); + + _CPU_ISR_Disable(level); + btstate.cb = NULL; + btstate.usrdata = NULL; + btstate.hci_cmddone = 0; + hci_arg(&btstate); + hci_link_key_req_reply(bdaddr, key); + _CPU_ISR_Restore(level); + + return last_err; +} + +s32 BTE_LinkKeyRequestNegativeReply(struct bd_addr *bdaddr) +{ + u32 level; + err_t last_err = ERR_OK; + + printf("BTE_LinkKeyRequestNegativeReply\n"); + + _CPU_ISR_Disable(level); + btstate.cb = NULL; + btstate.usrdata = NULL; + btstate.hci_cmddone = 0; + hci_arg(&btstate); + hci_link_key_req_neg_reply(bdaddr); + _CPU_ISR_Restore(level); + + return last_err; +} + u8 BTE_GetPairMode(void) { return btstate.pair_mode; @@ -584,6 +619,15 @@ void BTE_SetConnectionRequestCallback(err_t (*callback)(void *arg,struct bd_addr _CPU_ISR_Restore(level); } +void BTE_SetLinkKeyRequestCallback(err_t (*callback)(void *arg,struct bd_addr *bdaddr)) +{ + u32 level; + + _CPU_ISR_Disable(level); + hci_link_key_req(callback); + _CPU_ISR_Restore(level); +} + void BTE_SetLinkKeyNotificationCallback(err_t (*callback)(void *arg,struct bd_addr *bdaddr,u8 *key)) { u32 level; @@ -711,7 +755,7 @@ s32 bte_connectdeviceasync(struct bte_pcb *pcb,struct bd_addr *bdaddr,s32 (*conn error: _CPU_ISR_Restore(level); - //printf("bte_connectdeviceasync(%02x)\n",err); + printf("bte_connectdeviceasync(%02x)\n",err); return err; } diff --git a/lwbt/hci.c b/lwbt/hci.c index 7952e43a8..3381309fe 100644 --- a/lwbt/hci.c +++ b/lwbt/hci.c @@ -1601,7 +1601,7 @@ static void hci_conn_complete_evt(struct pbuf *p) bdaddr = (void*)(((u8_t*)p->payload)+3); link = hci_get_link(bdaddr); - printf("hci_conn_complete_evt(%p,%02x - %02x:%02x:%02x:%02x:%02x:%02x)\n",link,((u8_t*)p->payload)[0],bdaddr->addr[5],bdaddr->addr[4],bdaddr->addr[3],bdaddr->addr[2],bdaddr->addr[1],bdaddr->addr[0]); + //printf("hci_conn_complete_evt(%p,%02x - %02x:%02x:%02x:%02x:%02x:%02x)\n",link,((u8_t*)p->payload)[0],bdaddr->addr[5],bdaddr->addr[4],bdaddr->addr[3],bdaddr->addr[2],bdaddr->addr[1],bdaddr->addr[0]); switch(((u8_t*)p->payload)[0]) { case HCI_SUCCESS: if(link==NULL) { @@ -1624,9 +1624,9 @@ static void hci_conn_complete_evt(struct pbuf *p) break; case HCI_PAGE_TIMEOUT: ERROR("hci_conn_complete_evt: Timeout\n"); - if(link==NULL) { - hci_disconnect(bdaddr, HCI_OTHER_END_TERMINATED_CONN_USER_ENDED); - lp_disconnect_ind(bdaddr,HCI_CONN_TERMINATED_BY_LOCAL_HOST); + if(link!=NULL) { + hci_close(link); + lp_connect_cfm(bdaddr,((u8_t*)p->payload)[10],ERR_CONN); } break; default: @@ -1646,7 +1646,7 @@ static void hci_inquiry_result_evt(struct pbuf *p) struct hci_inq_res *ires; num_resp = ((u8_t*)p->payload)[0]; - //printf("hci_inquiry_result_evt(%d)\n",num_resp); + printf("hci_inquiry_result_evt(%d)\n",num_resp); for(i=0;ipayload)+(1+resp_off)); @@ -1749,7 +1749,7 @@ void hci_event_handler(struct pbuf *p) evthdr = p->payload; btpbuf_header(p,-HCI_EVENT_HDR_LEN); - //printf("HCI_EVENT %02x\n", evthdr->code); + //printf("HCI_EVENT %02X\n", evthdr->code); switch(evthdr->code) { case HCI_INQUIRY_COMPLETE: diff --git a/lwbt/l2cap.c b/lwbt/l2cap.c index 799cba7d6..fe0052f80 100644 --- a/lwbt/l2cap.c +++ b/lwbt/l2cap.c @@ -1398,7 +1398,7 @@ void lp_connect_cfm(struct bd_addr *bdaddr, u8_t encrypt_mode, err_t err) L2CA_ACTION_CONN_CFM(pcb,L2CAP_CONN_REF_RES,0x0000,ret); /* No resources available */ } } else { - ERROR("lp_connect_cfm: Connection falied\n"); + ERROR("lp_connect_cfm: Connection failed\n"); L2CA_ACTION_CONN_CFM(pcb,L2CAP_CONN_REF_RES,0x0000,ret); /* No resources available */ } } diff --git a/wiiuse/io_wii.c b/wiiuse/io_wii.c index b88a6f853..d769e9b48 100644 --- a/wiiuse/io_wii.c +++ b/wiiuse/io_wii.c @@ -39,7 +39,7 @@ static s32 __wiiuse_disconnected(void *arg,struct bte_pcb *pcb,u8 err) if(!wm) return ERR_OK; - printf("wiimote disconnected\n"); + //printf("wiimote disconnected\n"); WIIMOTE_DISABLE_STATE(wm, (WIIMOTE_STATE_IR|WIIMOTE_STATE_IR_INIT)); WIIMOTE_DISABLE_STATE(wm, (WIIMOTE_STATE_SPEAKER|WIIMOTE_STATE_SPEAKER_INIT)); WIIMOTE_DISABLE_STATE(wm, (WIIMOTE_STATE_EXP|WIIMOTE_STATE_EXP_HANDSHAKE|WIIMOTE_STATE_EXP_FAILED)); @@ -55,7 +55,7 @@ static s32 __wiiuse_disconnected(void *arg,struct bte_pcb *pcb,u8 err) wml->wm = NULL; //printf("Clearing Wiimote %s (%p)\n", wml->name, wml); - memset(wml->name, 0x00, sizeof(wml->name)); + memset(wml->name, 0, sizeof(wml->name)); return ERR_OK; } @@ -85,17 +85,11 @@ static s32 __wiiuse_connected(void *arg,struct bte_pcb *pcb,u8 err) struct wiimote_listen_t *wml = (struct wiimote_listen_t*)arg; struct wiimote_t *wm; - printf("__wiiuse_connected(%d)\n", err); - if(err) { - memset(wml->name, 0x00, sizeof(wml->name)); - bte_disconnect(wml->sock); - return ERR_CONN; - } + //printf("__wiiuse_connected(%d)\n", err); - wm = wml->assign_cb(wml); + wm = wml->assign_cb(wml, err); if(!wm) { - memset(wml->name, 0x00, sizeof(wml->name)); bte_disconnect(wml->sock); return ERR_OK; } @@ -105,7 +99,7 @@ static s32 __wiiuse_connected(void *arg,struct bte_pcb *pcb,u8 err) wm->sock = wml->sock; wm->bdaddr = wml->bdaddr; - printf("__wiiuse_connected()\n"); + //printf("__wiiuse_connected()\n"); WIIMOTE_ENABLE_STATE(wm,(WIIMOTE_STATE_CONNECTED|WIIMOTE_STATE_HANDSHAKE)); wm->handshake_state = 0; @@ -126,28 +120,20 @@ void __wiiuse_sensorbar_enable(int enable) IRQ_Restore(level); } -int wiiuse_register(struct wiimote_listen_t *wml, struct bd_addr *bdaddr, u8 *name, struct wiimote_t *(*assign_cb)(struct wiimote_listen_t *wml)) +int wiiuse_register(struct wiimote_listen_t *wml, struct bd_addr *bdaddr, struct wiimote_t *(*assign_cb)(struct wiimote_listen_t *wml, u8 err)) { s32 err; - printf("wiiuse_register %p, bdaddr: %02x:%02x:%02x:%02x:%02x:%02x\n",wml,bdaddr->addr[5],bdaddr->addr[4],bdaddr->addr[3],bdaddr->addr[2],bdaddr->addr[1],bdaddr->addr[0]); + //printf("wiiuse_register %p, bdaddr: %02x:%02x:%02x:%02x:%02x:%02x\n",wml,bdaddr->addr[5],bdaddr->addr[4],bdaddr->addr[3],bdaddr->addr[2],bdaddr->addr[1],bdaddr->addr[0]); if(!wml || !bdaddr || !assign_cb) return 0; wml->wm = NULL; bd_addr_set(&(wml->bdaddr),bdaddr); - if (name) - { - strncpy((char *)wml->name, (char *)name, sizeof(wml->name)); - wml->name[sizeof(wml->name) - 1] = 0x00; - } - else - { - memset(wml->name, 0, sizeof(wml->name)); - } - wml->sock = bte_new(); + memset(wml->name, 0, sizeof(wml->name)); wml->assign_cb = assign_cb; - if(wml->sock==NULL) return 0; + if(wml->sock==NULL) + wml->sock = bte_new(); bte_arg(wml->sock,wml); bte_received(wml->sock,__wiiuse_receive); @@ -159,7 +145,7 @@ int wiiuse_register(struct wiimote_listen_t *wml, struct bd_addr *bdaddr, u8 *na return 0; } -int wiiuse_connect(struct wiimote_listen_t *wml, struct bd_addr *bdaddr, u8 *name, struct wiimote_t *(*assign_cb)(struct wiimote_listen_t *wml)) +int wiiuse_connect(struct wiimote_listen_t *wml, struct bd_addr *bdaddr, u8 *name, struct wiimote_t *(*assign_cb)(struct wiimote_listen_t *wml, u8 err)) { s32 err; @@ -171,9 +157,9 @@ int wiiuse_connect(struct wiimote_listen_t *wml, struct bd_addr *bdaddr, u8 *nam bd_addr_set(&(wml->bdaddr),bdaddr); strncpy((char *)wml->name, (char *)name, sizeof(wml->name)); wml->name[sizeof(wml->name) - 1] = 0x00; - wml->sock = bte_new(); wml->assign_cb = assign_cb; - if(wml->sock==NULL) return 0; + if(wml->sock==NULL) + wml->sock = bte_new(); bte_arg(wml->sock,wml); bte_received(wml->sock,__wiiuse_receive); @@ -189,6 +175,8 @@ int wiiuse_connect(struct wiimote_listen_t *wml, struct bd_addr *bdaddr, u8 *nam void wiiuse_disconnect(struct wiimote_t *wm) { + printf("wiiuse_disconnect\n"); + if(wm==NULL || wm->sock==NULL) return; WIIMOTE_DISABLE_STATE(wm,WIIMOTE_STATE_CONNECTED); diff --git a/wiiuse/wpad.c b/wiiuse/wpad.c index a1ef88029..8fd031f6f 100644 --- a/wiiuse/wpad.c +++ b/wiiuse/wpad.c @@ -53,8 +53,10 @@ distribution. #define MAX_STREAMDATA_LEN 20 #define EVENTQUEUE_LENGTH 16 -#define DISCONNECT_BATTERY_DIED 0x14 -#define DISCONNECT_POWER_OFF 0x15 +#define DISCONNECT_TIMEOUT 8 +#define DISCONNECT_BATTERY_DIED 20 +#define DISCONNECT_POWER_OFF 21 +#define DISCONNECT_IDLE_TIMEOUT 22 struct _wpad_thresh{ s32 btns; @@ -109,6 +111,7 @@ static void __wpad_def_powcb(s32 chan); static void __wpad_def_synccb(u32 held); static WPADShutdownCallback __wpad_batcb = NULL; static WPADShutdownCallback __wpad_powcb = __wpad_def_powcb; +static WPADShutdownCallback __wpad_idletimeoutcb = NULL; static WPADSyncCallback __wpad_synccb = __wpad_def_synccb; extern void __wiiuse_sensorbar_enable(int enable); @@ -204,93 +207,129 @@ static void __wpad_setfmt(s32 chan) } } -wiimote *__wpad_assign_slot(wiimote_listen *wml) +wiimote *__wpad_assign_slot(wiimote_listen *wml, u8 err) { u32 i, level; + _CPU_ISR_Disable(level); for(i=0; ibdaddr.addr[5],wml->bdaddr.addr[4],wml->bdaddr.addr[3],wml->bdaddr.addr[2],wml->bdaddr.addr[1],wml->bdaddr.addr[0]); - BYTES_FROM_BD_ADDR(__wpad_devs.active[i].bdaddr, &wml->bdaddr); - __wpads_used |= (0x01<= WPAD_MAX_WIIMOTES) + { + printf("WPAD Listen Slot Not Valid\n"); + _CPU_ISR_Restore(level); + return NULL; + } + + if (err) { + printf("Connection error(%d)\n", err); + __wpads_used &= ~(0x01<bdaddr.addr[5],wml->bdaddr.addr[4],wml->bdaddr.addr[3],wml->bdaddr.addr[2],wml->bdaddr.addr[1],wml->bdaddr.addr[0]); + BYTES_FROM_BD_ADDR(__wpad_devs.active[i].bdaddr, &wml->bdaddr); + _CPU_ISR_Restore(level); + return __wpads[i]; } -wiimote *__wpad_register_new(wiimote_listen *wml) +wiimote *__wpad_register_new(wiimote_listen *wml, u8 err) { - u32 i,j; + u32 i,j,level; struct bd_addr bdaddr; + wiimote *wm; //printf("Registering Wiimote with system...\n"); - bool known = FALSE; - for(i=0; ibdaddr,&bdaddr)) { - printf("Wiimote guest in slot %d\n", i); - known = TRUE; - break; + int guestEntry = CONF_PAD_MAX_GUESTS; + int registeredEntry = CONF_PAD_MAX_REGISTERED; + + _CPU_ISR_Disable(level); + wm = __wpad_assign_slot(wml, err); + if (wm) + { + // Search for wml->bdaddr in guest registration list + for(i=0; ibdaddr,&bdaddr)) { + //printf("Wiimote guest in slot %d\n", i); + guestEntry = i; + break; + } } - } - if (!known) - { + // Search for wml->bdaddr in permanent registration list for(i=0; ibdaddr,&bdaddr)) { - printf("Wiimote currently registered in slot %d\n", i); - known = TRUE; + //printf("Wiimote currently registered in slot %d\n", i); + registeredEntry = i; break; } } - } - - if (!known) - { + if (BTE_GetPairMode() == PAIR_MODE_NORMAL) { - printf("Registering Wiimote '%s' with system...\n", wml->name); - memmove(&__wpad_devs.registered[1], &__wpad_devs.registered[0], sizeof(conf_pad_device)*(CONF_PAD_MAX_REGISTERED-1)); - BYTES_FROM_BD_ADDR(__wpad_devs.registered[0].bdaddr, &wml->bdaddr); - memcpy(__wpad_devs.registered[0].name, wml->name, sizeof(__wpad_devs.registered[0].name)); - if (__wpad_devs.num_registered < CONF_PAD_MAX_REGISTERED) - __wpad_devs.num_registered++; + // Not permanent pair, need to save wml->bdaddr as known controller + if (registeredEntry >= CONF_PAD_MAX_REGISTERED) + { + // If currently guest, we want to allow for upgrade to permanent pair + if (guestEntry < CONF_PAD_MAX_GUESTS) + { + // Wipe guest entry and shift later ones up + for (i = guestEntry; i < (__wpad_guests.num_guests - 1); i++) + { + memcpy(&__wpad_guests.guests[i], &__wpad_guests.guests[i+1], sizeof(conf_pad_guest_device)); + } + memset(&__wpad_guests.guests[--__wpad_guests.num_guests], 0, sizeof(conf_pad_guest_device)); + } + + //printf("Registering Wiimote '%s' with system...\n", wml->name); + memmove(&__wpad_devs.registered[1], &__wpad_devs.registered[0], sizeof(conf_pad_device)*(CONF_PAD_MAX_REGISTERED-1)); + BYTES_FROM_BD_ADDR(__wpad_devs.registered[0].bdaddr, &wml->bdaddr); + memcpy(__wpad_devs.registered[0].name, wml->name, sizeof(__wpad_devs.registered[0].name)); + if (__wpad_devs.num_registered < CONF_PAD_MAX_REGISTERED) + __wpad_devs.num_registered++; + } } - else + else if (registeredEntry >= CONF_PAD_MAX_REGISTERED) { - printf("Saving Wiimote '%s' as guest...\n", wml->name); - memmove(&__wpad_guests.guests[1], &__wpad_guests.guests[0], sizeof(conf_pad_guest_device)*(CONF_PAD_GUESTS_MAX-1)); - BYTES_FROM_BD_ADDR(__wpad_guests.guests[0].bdaddr, &wml->bdaddr); - memcpy(__wpad_guests.guests[0].name, wml->name, sizeof(__wpad_guests.guests[0].name)); - if (__wpad_guests.num_guests < CONF_PAD_GUESTS_MAX) - __wpad_guests.num_guests++; - - for(i=0; i= CONF_PAD_MAX_GUESTS) { - if(bd_addr_cmp(&wml->bdaddr,&__wpad_keys[i].bdaddr)) { - u8 *src = __wpad_keys[i].key; - u8 *dst = __wpad_guests.guests[0].link_key; - printf("Writing guest key: %02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x\n",__wpad_keys[i].key[0],__wpad_keys[i].key[1],__wpad_keys[i].key[2],__wpad_keys[i].key[3],__wpad_keys[i].key[4],__wpad_keys[i].key[5],__wpad_keys[i].key[6],__wpad_keys[i].key[7],__wpad_keys[i].key[8],__wpad_keys[i].key[9],__wpad_keys[i].key[10],__wpad_keys[i].key[11],__wpad_keys[i].key[12],__wpad_keys[i].key[13],__wpad_keys[i].key[14],__wpad_keys[i].key[15]); - for (j=0;j<16;j++) - { - dst[j] = src[15 - j]; + //printf("Saving Wiimote '%s' as guest...\n", wml->name); + memmove(&__wpad_guests.guests[1], &__wpad_guests.guests[0], sizeof(conf_pad_guest_device)*(CONF_PAD_MAX_GUESTS-1)); + BYTES_FROM_BD_ADDR(__wpad_guests.guests[0].bdaddr, &wml->bdaddr); + memcpy(__wpad_guests.guests[0].name, wml->name, sizeof(__wpad_guests.guests[0].name)); + if (__wpad_guests.num_guests < CONF_PAD_MAX_GUESTS) + __wpad_guests.num_guests++; + + for(i=0; ibdaddr,&__wpad_keys[i].bdaddr)) { + u8 *src = __wpad_keys[i].key; + u8 *dst = __wpad_guests.guests[0].link_key; + //printf("Writing guest key: %02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x\n",__wpad_keys[i].key[0],__wpad_keys[i].key[1],__wpad_keys[i].key[2],__wpad_keys[i].key[3],__wpad_keys[i].key[4],__wpad_keys[i].key[5],__wpad_keys[i].key[6],__wpad_keys[i].key[7],__wpad_keys[i].key[8],__wpad_keys[i].key[9],__wpad_keys[i].key[10],__wpad_keys[i].key[11],__wpad_keys[i].key[12],__wpad_keys[i].key[13],__wpad_keys[i].key[14],__wpad_keys[i].key[15]); + // Keys are stored in config backwards, like bdaddrs + for (j=0;j<16;j++) + { + dst[j] = src[15 - j]; + } + break; } - //memcpy(__wpad_guests.guests[0].link_key,&__wpad_keys[i].key,sizeof(__wpad_guests.guests[0].link_key)); - break; } } } } + _CPU_ISR_Restore(level); - return __wpad_assign_slot(wml); + return wm; } static s32 __wpad_setevtfilter_connsetup_finished(s32 result,void *usrdata) @@ -301,17 +340,6 @@ static s32 __wpad_setevtfilter_connsetup_finished(s32 result,void *usrdata) //printf("__wpad_setevtfilter_finished(%d)\n",result); if(result==ERR_OK) { - for(i=0;iunid; wpdcb = &__wpdcb[chan]; wpdcb->wm = wm; @@ -682,6 +711,7 @@ static void __wpad_eventCB(struct wiimote_t *wm,s32 event) __wpads_active |= (0x01<unid; wpdcb = &__wpdcb[chan]; wpdcb->wm = wm; @@ -697,24 +727,33 @@ static void __wpad_eventCB(struct wiimote_t *wm,s32 event) __wpads_active &= ~(0x01<bdaddr,&bdaddr)) { - if(__wpads_listen[WPAD_BALANCE_BOARD].name[0] == 0x00) { + if(!(__wpads_used & (1<bdaddr,&bdaddr)) { - printf("Wiimote already active in slot %d\n", i); + //printf("Wiimote already active in slot %d\n", i); slot = i; break; } @@ -777,8 +816,8 @@ s32 __wpad_read_remote_name_finished(s32 result,void *userdata) if(slot >= WPAD_MAX_WIIMOTES) { for(i=0; ibdaddr,info->name,__wpad_register_new); + __wpads_used |= (0x01<= CONF_PAD_TOTAL) { - BTE_WriteStoredLinkKey(pad_addr,key); + BTE_LinkKeyRequestNegativeReply(pad_addr); } - printf("__wpad_linkkeynotCB\n"); + return ERR_OK; +} + +static s8 __wpad_linkkeynotCB(void *arg,struct bd_addr *pad_addr,u8 *key) +{ + int i; + BTE_WriteStoredLinkKey(pad_addr,key); + + //printf("__wpad_linkkeynotCB\n"); for(i=0; iaddr[5],pad_addr->addr[4],pad_addr->addr[3],pad_addr->addr[2],pad_addr->addr[1],pad_addr->addr[0]); - //printf(" key: %02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x\n",key[0],key[1],key[2],key[3],key[4],key[5],key[6],key[7],key[8],key[9],key[10],key[11],key[12],key[13],key[14],key[15]); memcpy(__wpad_keys[i].key,key,sizeof(__wpad_keys[i].key)); break; } @@ -907,7 +1029,7 @@ s32 __wpad_inquiry_finished(s32 result,void *userdata) { int i; struct inquiry_res *inq_res = (struct inquiry_res *)userdata; - printf("__wpad_inquiry_finished %d\n", inq_res->count); + //printf("__wpad_inquiry_finished %d\n", inq_res->count); if (result == ERR_OK && inq_res != NULL) { @@ -918,7 +1040,8 @@ s32 __wpad_inquiry_finished(s32 result,void *userdata) if (!bd_addr_cmp(&info->bdaddr,BD_ADDR_ANY)) { - printf("Attempting to read name for bdaddr: %02x:%02x:%02x:%02x:%02x:%02x\n",info->bdaddr.addr[5],info->bdaddr.addr[4],info->bdaddr.addr[3],info->bdaddr.addr[2],info->bdaddr.addr[1],info->bdaddr.addr[0]); + // Read name of first valid controller + //printf("Attempting to read name for bdaddr: %02x:%02x:%02x:%02x:%02x:%02x\n",info->bdaddr.addr[5],info->bdaddr.addr[4],info->bdaddr.addr[3],info->bdaddr.addr[2],info->bdaddr.addr[1],info->bdaddr.addr[0]); BTE_ReadRemoteName(&info->bdaddr, __wpad_read_remote_name_finished); break; } @@ -954,7 +1077,9 @@ s32 WPAD_WipeSavedControllers(void) } __wpads_active = 0; __wpads_used = 0; + __wpads_bonded = 0; memset(&__wpad_devs,0,sizeof(__wpad_devs)); + memset(&__wpad_guests,0,sizeof(__wpad_guests)); memset(__wpad_keys,0,sizeof(__wpad_keys)); BTE_ClearStoredLinkKeys(); _CPU_ISR_Restore(level); @@ -1043,19 +1168,13 @@ s32 WPAD_Init(void) return WPAD_ERR_BADCONF; } - /*if(__wpad_devs.num_registered == 0) { - WPAD_Shutdown(); - _CPU_ISR_Restore(level); - return WPAD_ERR_NONEREGISTERED; - }*/ - if(__wpad_devs.num_registered > CONF_PAD_MAX_REGISTERED) { WPAD_Shutdown(); _CPU_ISR_Restore(level); return WPAD_ERR_BADCONF; } - for(i=0;iname); printf(" bdaddr: %02x:%02x:%02x:%02x:%02x:%02x\n",device->bdaddr[0],device->bdaddr[1],device->bdaddr[2],device->bdaddr[3],device->bdaddr[4],device->bdaddr[5]); @@ -1067,7 +1186,7 @@ s32 WPAD_Init(void) conf_pad_device *device = &__wpad_devs.registered[i]; printf("Registered Wiimote %s:\n", device->name); printf(" bdaddr: %02x:%02x:%02x:%02x:%02x:%02x\n",device->bdaddr[0],device->bdaddr[1],device->bdaddr[2],device->bdaddr[3],device->bdaddr[4],device->bdaddr[5]); - } + }*/ if(CONF_GetPadGuestDevices(&__wpad_guests) < 0) { WPAD_Shutdown(); @@ -1075,19 +1194,19 @@ s32 WPAD_Init(void) return WPAD_ERR_BADCONF; } - if(__wpad_guests.num_guests > CONF_PAD_GUESTS_MAX) { + if(__wpad_guests.num_guests > CONF_PAD_MAX_GUESTS) { WPAD_Shutdown(); _CPU_ISR_Restore(level); return WPAD_ERR_BADCONF; } - printf("BT.CDIF num_guests %d\n", __wpad_guests.num_guests); + /*printf("BT.CDIF num_guests %d\n", __wpad_guests.num_guests); for(i=0;i<__wpad_guests.num_guests;i++) { conf_pad_guest_device *device = &__wpad_guests.guests[i]; printf("Guest Wiimote %s:\n", device->name); printf(" bdaddr: %02x:%02x:%02x:%02x:%02x:%02x\n",device->bdaddr[0],device->bdaddr[1],device->bdaddr[2],device->bdaddr[3],device->bdaddr[4],device->bdaddr[5]); - } + }*/ __wpads = wiiuse_init(WPAD_MAX_WIIMOTES,__wpad_eventCB); if(__wpads==NULL) { @@ -1102,6 +1221,8 @@ s32 WPAD_Init(void) BTE_SetDisconnectCallback(__wpad_disconnectCB); BTE_SetSyncButtonCallback(__wpad_syncbuttonCB); BTE_SetConnectionRequestCallback(__wpad_connreqCB); + // For some reason, returning our saved link key causes Wiimote to disconnect... + //BTE_SetLinkKeyRequestCallback(__wpad_linkkeyreqCB); BTE_SetLinkKeyNotificationCallback(__wpad_linkkeynotCB); BTE_InitCore(__initcore_finished); @@ -1474,6 +1595,15 @@ void WPAD_SetBatteryDeadCallback(WPADShutdownCallback cb) _CPU_ISR_Restore(level); } +void WPAD_SetIdleTimeoutCallback(WPADShutdownCallback cb) +{ + u32 level; + + _CPU_ISR_Disable(level); + __wpad_idletimeoutcb = cb; + _CPU_ISR_Restore(level); +} + void WPAD_SetSyncButtonCallback(WPADSyncCallback cb) { u32 level; From e09691938000b6fc0ee2f37c709d28bb228fa6f1 Mon Sep 17 00:00:00 2001 From: Zarithya Date: Tue, 25 Mar 2025 19:06:53 -0700 Subject: [PATCH 05/27] Cleanup --- gc/bte/bte.h | 1 - gc/ogc/conf.h | 10 +- gc/wiiuse/wpad.h | 3 +- libogc/conf.c | 2 +- lwbt/bte.c | 88 ++++------ lwbt/hci.c | 78 +++++---- lwbt/hci.h | 378 +++++++++++++++++++++---------------------- wiiuse/io.c | 4 +- wiiuse/io_wii.c | 14 +- wiiuse/wpad.c | 412 ++++++++++++++++++++++------------------------- 10 files changed, 458 insertions(+), 532 deletions(-) diff --git a/gc/bte/bte.h b/gc/bte/bte.h index 4e26e9a42..757cab201 100644 --- a/gc/bte/bte.h +++ b/gc/bte/bte.h @@ -140,7 +140,6 @@ struct bte_pcb typedef s32 (*btecallback)(s32 result,void *userdata); void BTE_Init(void); -void BTE_Restart(void); void BTE_Shutdown(void); s32 BTE_InitCore(btecallback cb); s32 BTE_ApplyPatch(btecallback cb); diff --git a/gc/ogc/conf.h b/gc/ogc/conf.h index c860cead8..8c99a5db5 100644 --- a/gc/ogc/conf.h +++ b/gc/ogc/conf.h @@ -127,9 +127,9 @@ enum { }; #define CONF_PAD_MAX_REGISTERED 10 -#define CONF_PAD_MAX_ACTIVE 4 -#define CONF_PAD_TOTAL (CONF_PAD_MAX_REGISTERED + CONF_PAD_MAX_ACTIVE + 2) -#define CONF_PAD_MAX_GUESTS 6 +#define CONF_PAD_MAX_ACTIVE 6 +#define CONF_PAD_MAX_WIIMOTES 4 +#define CONF_PAD_TOTAL (CONF_PAD_MAX_REGISTERED + CONF_PAD_MAX_ACTIVE) typedef struct _conf_pad_device conf_pad_device; @@ -144,8 +144,6 @@ struct _conf_pads { u8 num_registered; conf_pad_device registered[CONF_PAD_MAX_REGISTERED]; conf_pad_device active[CONF_PAD_MAX_ACTIVE]; - conf_pad_device balance_board; - conf_pad_device unknown; } ATTRIBUTE_PACKED; typedef struct _conf_pad_guest_device conf_pad_guest_device; @@ -160,7 +158,7 @@ typedef struct _conf_pad_guests conf_pad_guests; struct _conf_pad_guests { u8 num_guests; - conf_pad_guest_device guests[CONF_PAD_MAX_GUESTS]; + conf_pad_guest_device guests[CONF_PAD_MAX_ACTIVE]; } ATTRIBUTE_PACKED; s32 CONF_Init(void); diff --git a/gc/wiiuse/wpad.h b/gc/wiiuse/wpad.h index f5ce13378..b20a136a9 100644 --- a/gc/wiiuse/wpad.h +++ b/gc/wiiuse/wpad.h @@ -43,7 +43,8 @@ enum { WPAD_CHAN_2, WPAD_CHAN_3, WPAD_BALANCE_BOARD, - WPAD_MAX_WIIMOTES, + WPAD_CHAN_5, + WPAD_MAX_DEVICES, }; #define WPAD_BUTTON_2 0x0001 diff --git a/libogc/conf.c b/libogc/conf.c index 9af23e0a4..72a2dfaed 100644 --- a/libogc/conf.c +++ b/libogc/conf.c @@ -446,7 +446,7 @@ s32 CONF_SetPadGuestDevices(const conf_pad_guests *pads) if (!pads) return CONF_EBADVALUE; count = pads->num_guests; - if (count > CONF_PAD_MAX_GUESTS) return CONF_EBADVALUE; + if (count > CONF_PAD_MAX_ACTIVE) return CONF_EBADVALUE; return CONF_Set("BT.CDIF", pads, sizeof(conf_pad_guests)); } diff --git a/lwbt/bte.c b/lwbt/bte.c index 2d2f9ab9f..71cc5a517 100644 --- a/lwbt/bte.c +++ b/lwbt/bte.c @@ -17,14 +17,6 @@ #define STACKSIZE 32768 #define MQ_BOX_SIZE 256 -/* Vendor specific OGF */ -#define HCI_VENDOR_OGF 0x3f - -/* Vendor specific OCF */ -#define HCI_VENDOR_PATCH_START_OCF 0x4f -#define HCI_VENDOR_PATCH_CONT_OCF 0x4c -#define HCI_VENDOR_PATCH_END_OCF 0x4f - enum bte_state { STATE_NOTREADY = -1, STATE_READY = 0, @@ -407,18 +399,6 @@ void BTE_Init(void) SYS_SetPeriodicAlarm(btstate.timer_svc,&tb,&tb,bt_alarmhandler, NULL); } -void BTE_Restart(void) -{ - u32 level; - - _CPU_ISR_Disable(level); - bte_reset_all(); - hci_reset_all(); - l2cap_reset_all(); - physbusif_reset_all(); - _CPU_ISR_Restore(level); -} - void BTE_Shutdown(void) { u32 level; @@ -755,7 +735,7 @@ s32 bte_connectdeviceasync(struct bte_pcb *pcb,struct bd_addr *bdaddr,s32 (*conn error: _CPU_ISR_Restore(level); - printf("bte_connectdeviceasync(%02x)\n",err); + //printf("bte_connectdeviceasync(%02x)\n",err); return err; } @@ -1043,7 +1023,7 @@ err_t pin_req(void *arg,struct bd_addr *bdaddr) // Pairing from 1+2 (guest/temporary) bd_addr_set(&addr, bdaddr); } - hci_pin_code_request_reply(bdaddr, BD_ADDR_LEN, addr.addr); + hci_pin_code_request_reply(bdaddr, sizeof(addr.addr), addr.addr); return ERR_OK; } @@ -1337,27 +1317,27 @@ static err_t bte_hci_initcore_complete2(void *arg,struct hci_pcb *pcb,u8_t ogf,u LOG("bte_hci_initcore_complete2(%02x,%02x)\n",ogf,ocf); switch(ogf) { case HCI_HC_BB_OGF: - if(ocf==HCI_WRITE_INQUIRY_MODE) { + if(ocf==HCI_W_INQUIRY_MODE_OCF) { if(result==HCI_SUCCESS) { hci_write_page_scan_type(0x01); } else err = ERR_CONN; - } else if(ocf==HCI_WRITE_PAGE_SCAN_TYPE) { + } else if(ocf==HCI_W_PAGE_SCAN_TYPE_OCF) { if(result==HCI_SUCCESS) { hci_write_inquiry_scan_type(0x01); } else err = ERR_CONN; - } else if(ocf==HCI_WRITE_INQUIRY_SCAN_TYPE) { + } else if(ocf==HCI_W_INQUIRY_SCAN_TYPE_OCF) { if(result==HCI_SUCCESS) { hci_write_cod(dev_cod); } else err = ERR_CONN; - } else if(ocf==HCI_WRITE_COD) { + } else if(ocf==HCI_W_COD_OCF) { if(result==HCI_SUCCESS) { hci_write_page_timeout(0x2000); } else err = ERR_CONN; - } else if(ocf==HCI_WRITE_PAGE_TIMEOUT) { + } else if(ocf==HCI_W_PAGE_TIMEOUT_OCF) { if(result==HCI_SUCCESS) { state->hci_inited = 1; hci_cmd_complete(NULL); @@ -1384,23 +1364,23 @@ err_t bte_hci_initcore_complete(void *arg,struct hci_pcb *pcb,u8_t ogf,u8_t ocf, LOG("bte_hci_initcore_complete(%02x,%02x)\n",ogf,ocf); switch(ogf) { - case HCI_INFO_PARAM: - if(ocf==HCI_READ_BUFFER_SIZE) { + case HCI_INFO_PARAM_OGF: + if(ocf==HCI_R_BUF_SIZE_OCF) { if(result==HCI_SUCCESS) { hci_write_cod(dev_cod); } else err = ERR_CONN; - } else if(ocf==HCI_READ_LOCAL_VERSION) { + } else if(ocf==HCI_R_LOC_VERS_INFO_OCF) { if(result==HCI_SUCCESS) { hci_read_bd_addr(); } else err = ERR_CONN; - } else if(ocf==HCI_READ_BD_ADDR) { + } else if(ocf==HCI_R_BD_ADDR_OCF) { if(result==HCI_SUCCESS) { hci_read_local_features(); } else err = ERR_CONN; - } else if(ocf==HCI_READ_LOCAL_FEATURES) { + } else if(ocf==HCI_R_LOC_FEAT_OCF) { if(result==HCI_SUCCESS) { hci_cmd_complete(bte_hci_initcore_complete2); hci_write_inquiry_mode(0x01); @@ -1409,27 +1389,27 @@ err_t bte_hci_initcore_complete(void *arg,struct hci_pcb *pcb,u8_t ogf,u8_t ocf, } break; case HCI_HC_BB_OGF: - if(ocf==HCI_RESET) { + if(ocf==HCI_RESET_OCF) { if(result==HCI_SUCCESS) { hci_read_buffer_size(); } else err = ERR_CONN; - } else if(ocf==HCI_WRITE_COD) { + } else if(ocf==HCI_W_COD_OCF) { if(result==HCI_SUCCESS) { hci_write_local_name((u8_t*)"",1); } else err = ERR_CONN; - } else if(ocf==HCI_WRITE_LOCAL_NAME) { + } else if(ocf==HCI_W_LOCAL_NAME_OCF) { if(result==HCI_SUCCESS) { hci_write_pin_type(0x00); } else err = ERR_CONN; - } else if(ocf==HCI_WRITE_PIN_TYPE) { + } else if(ocf==HCI_W_PIN_TYPE_OCF) { if(result==HCI_SUCCESS) { hci_host_buffer_size(); } else err = ERR_CONN; - } else if(ocf==HCI_HOST_BUF_SIZE) { + } else if(ocf==HCI_HOST_BUF_SIZE_OCF) { if(result==HCI_SUCCESS) { hci_read_local_version(); } else @@ -1485,23 +1465,23 @@ err_t bte_hci_patch_complete(void *arg,struct hci_pcb *pcb,u8_t ogf,u8_t ocf,u8_ LOG("bte_hci_patch_complete(%02x,%02x,%02x)\n",ogf,ocf,result); switch(ogf) { - case HCI_INFO_PARAM: - if(ocf==HCI_READ_BUFFER_SIZE) { + case HCI_INFO_PARAM_OGF: + if(ocf==HCI_R_BUF_SIZE_OCF) { if(result==HCI_SUCCESS) { hci_write_cod(dev_cod); } else err = ERR_CONN; - } else if(ocf==HCI_READ_LOCAL_VERSION) { + } else if(ocf==HCI_R_LOC_VERS_INFO_OCF) { if(result==HCI_SUCCESS) { hci_read_bd_addr(); } else err = ERR_CONN; - } else if(ocf==HCI_READ_BD_ADDR) { + } else if(ocf==HCI_R_BD_ADDR_OCF) { if(result==HCI_SUCCESS) { hci_read_local_features(); } else err = ERR_CONN; - } else if(ocf==HCI_READ_LOCAL_FEATURES) { + } else if(ocf==HCI_R_LOC_FEAT_OCF) { if(result==HCI_SUCCESS) { hci_cmd_complete(NULL); return __bte_cmdfinish(state,ERR_OK); @@ -1510,27 +1490,27 @@ err_t bte_hci_patch_complete(void *arg,struct hci_pcb *pcb,u8_t ogf,u8_t ocf,u8_ } break; case HCI_HC_BB_OGF: - if(ocf==HCI_RESET) { + if(ocf==HCI_RESET_OCF) { if(result==HCI_SUCCESS) { hci_read_buffer_size(); } else err = ERR_CONN; - } else if(ocf==HCI_WRITE_COD) { + } else if(ocf==HCI_W_COD_OCF) { if(result==HCI_SUCCESS) { hci_write_local_name((u8_t*)"",1); } else err = ERR_CONN; - } else if(ocf==HCI_WRITE_LOCAL_NAME) { + } else if(ocf==HCI_W_LOCAL_NAME_OCF) { if(result==HCI_SUCCESS) { hci_write_pin_type(0x00); } else err = ERR_CONN; - } else if(ocf==HCI_WRITE_PIN_TYPE) { + } else if(ocf==HCI_W_PIN_TYPE_OCF) { if(result==HCI_SUCCESS) { hci_host_buffer_size(); } else err = ERR_CONN; - } else if(ocf==HCI_HOST_BUF_SIZE) { + } else if(ocf==HCI_HOST_BUF_SIZE_OCF) { if(result==HCI_SUCCESS) { hci_read_local_version(); } else @@ -1564,37 +1544,37 @@ err_t bte_hci_initsub_complete(void *arg,struct hci_pcb *pcb,u8_t ogf,u8_t ocf,u LOG("bte_hci_initsub_complete(%02x,%02x)\n",ogf,ocf); switch(ogf) { case HCI_HC_BB_OGF: - if(ocf==HCI_WRITE_INQUIRY_MODE) { + if(ocf==HCI_W_INQUIRY_MODE_OCF) { if(result==HCI_SUCCESS) { hci_write_page_scan_type(0x01); } else err = ERR_CONN; - } else if(ocf==HCI_WRITE_PAGE_SCAN_TYPE) { + } else if(ocf==HCI_W_PAGE_SCAN_TYPE_OCF) { if(result==HCI_SUCCESS) { hci_write_inquiry_scan_type(0x01); } else err = ERR_CONN; - } else if(ocf==HCI_WRITE_INQUIRY_SCAN_TYPE) { + } else if(ocf==HCI_W_INQUIRY_SCAN_TYPE_OCF) { if(result==HCI_SUCCESS) { hci_write_cod(dev_cod); } else err = ERR_CONN; - } else if(ocf==HCI_WRITE_COD) { + } else if(ocf==HCI_W_COD_OCF) { if(result==HCI_SUCCESS) { hci_write_page_timeout(0x8000); } else err = ERR_CONN; - } else if(ocf==HCI_WRITE_PAGE_TIMEOUT) { + } else if(ocf==HCI_W_PAGE_TIMEOUT_OCF) { if(result==HCI_SUCCESS) { hci_write_local_name((u8_t*)"Wii",4); } else err = ERR_CONN; - } else if(ocf==HCI_WRITE_LOCAL_NAME) { + } else if(ocf==HCI_W_LOCAL_NAME_OCF) { if(result==HCI_SUCCESS) { hci_write_scan_enable(0x02); } else err = ERR_CONN; - } else if(ocf==HCI_WRITE_SCAN_ENABLE) { + } else if(ocf==HCI_W_SCAN_EN_OCF) { if(result==HCI_SUCCESS) { hci_write_authentication_enable(0x01); } else diff --git a/lwbt/hci.c b/lwbt/hci.c index 3381309fe..cc389fda2 100644 --- a/lwbt/hci.c +++ b/lwbt/hci.c @@ -350,12 +350,12 @@ err_t hci_read_local_version(void) { struct pbuf *p = NULL; - if((p=btpbuf_alloc(PBUF_RAW,HCI_R_LOC_VERS_SIZE_PLEN,PBUF_RAM))==NULL) { + if((p=btpbuf_alloc(PBUF_RAW,HCI_R_LOC_VERS_INFO_PLEN,PBUF_RAM))==NULL) { ERROR("hci_read_local_version: Could not allocate memory for pbuf\n"); return ERR_MEM; } - p = hci_cmd_ass(p,HCI_R_LOC_VERSION_OCF,HCI_INFO_PARAM_OGF,HCI_R_LOC_VERS_SIZE_PLEN); + p = hci_cmd_ass(p,HCI_R_LOC_VERS_INFO_OCF,HCI_INFO_PARAM_OGF,HCI_R_LOC_VERS_INFO_PLEN); physbusif_output(p,p->tot_len); btpbuf_free(p); @@ -367,12 +367,12 @@ err_t hci_read_local_features(void) { struct pbuf *p = NULL; - if((p=btpbuf_alloc(PBUF_RAW,HCI_R_LOC_FEAT_SIZE_PLEN,PBUF_RAM))==NULL) { + if((p=btpbuf_alloc(PBUF_RAW,HCI_R_LOC_FEAT_PLEN,PBUF_RAM))==NULL) { ERROR("hci_read_local_features: Could not allocate memory for pbuf\n"); return ERR_MEM; } - p = hci_cmd_ass(p,HCI_R_LOC_FEATURES_OCF,HCI_INFO_PARAM_OGF,HCI_R_LOC_FEAT_SIZE_PLEN); + p = hci_cmd_ass(p,HCI_R_LOC_FEAT_OCF,HCI_INFO_PARAM_OGF,HCI_R_LOC_FEAT_PLEN); physbusif_output(p,p->tot_len); btpbuf_free(p); @@ -814,13 +814,13 @@ err_t hci_sniff_mode(struct bd_addr *bdaddr, u16_t max_interval, u16_t min_inter return ERR_CONN; } - if((p = btpbuf_alloc(PBUF_TRANSPORT, HCI_SNIFF_PLEN, PBUF_RAM)) == NULL) { /* Alloc len of packet */ + if((p = btpbuf_alloc(PBUF_TRANSPORT, HCI_SNIFF_MODE_PLEN, PBUF_RAM)) == NULL) { /* Alloc len of packet */ ERROR("hci_sniff_mode: Could not allocate memory for pbuf\n"); return ERR_MEM; } /* Assembling command packet */ - p = hci_cmd_ass(p, HCI_SNIFF_MODE_OCF, HCI_LINK_POLICY_OGF, HCI_SNIFF_PLEN); + p = hci_cmd_ass(p, HCI_SNIFF_MODE_OCF, HCI_LINK_POLICY_OGF, HCI_SNIFF_MODE_PLEN); /* Assembling cmd prameters */ ((u16_t *)p->payload)[2] = htole16(link->connhdl); ((u16_t *)p->payload)[3] = htole16(max_interval); @@ -914,7 +914,7 @@ err_t hci_pin_code_request_reply(struct bd_addr *bdaddr, u8_t pinlen, u8_t *pinc memset((u8_t *)p->payload, 0, HCI_PIN_CODE_REQ_REP_PLEN); /* Assembling command packet */ - p = hci_cmd_ass(p, HCI_PIN_CODE_REQ_REP, HCI_LINK_CTRL_OGF, HCI_PIN_CODE_REQ_REP_PLEN); + p = hci_cmd_ass(p, HCI_PIN_CODE_REQ_REP_OCF, HCI_LINK_CTRL_OGF, HCI_PIN_CODE_REQ_REP_PLEN); /* Assembling cmd prameters */ memcpy(((u8_t *)p->payload) + 4, bdaddr->addr, 6); ((u8_t *)p->payload)[10] = pinlen; @@ -937,11 +937,11 @@ err_t hci_link_key_req_reply(struct bd_addr *bdaddr, unsigned char *link_key) { struct pbuf *p; if ((p = btpbuf_alloc(PBUF_RAW, HCI_LINK_KEY_REQ_REP_PLEN, PBUF_RAM)) == NULL) { - ERROR("hci_link_key_req_reply: Could not allocate memory for pbuf\n"); - return ERR_MEM; + ERROR("hci_link_key_req_reply: Could not allocate memory for pbuf\n"); + return ERR_MEM; } - p = hci_cmd_ass(p, HCI_LINK_KEY_REQ_REP, HCI_LINK_CTRL_OGF, HCI_LINK_KEY_REQ_REP_PLEN); + p = hci_cmd_ass(p, HCI_LINK_KEY_REQ_REP_OCF, HCI_LINK_CTRL_OGF, HCI_LINK_KEY_REQ_REP_PLEN); //copy bdaddr to offset 0x4 memcpy(((u8_t *)p->payload)+4, bdaddr->addr, 6); //copy Link Key (16 bytes long) to offset 10 (0xA) @@ -970,7 +970,7 @@ err_t hci_pin_code_request_neg_reply(struct bd_addr *bdaddr) return ERR_MEM; } - p = hci_cmd_ass(p,HCI_PIN_CODE_REQ_NEG_REP,HCI_LINK_CTRL_OGF,HCI_PIN_CODE_REQ_NEG_REP_PLEN); + p = hci_cmd_ass(p,HCI_PIN_CODE_REQ_NEG_REP_OCF,HCI_LINK_CTRL_OGF,HCI_PIN_CODE_REQ_NEG_REP_PLEN); memcpy(((u8_t *)p->payload)+4, bdaddr->addr, 6); physbusif_output(p,p->tot_len); @@ -990,12 +990,12 @@ err_t hci_link_key_req_neg_reply(struct bd_addr *bdaddr) { struct pbuf *p; - if ((p = btpbuf_alloc(PBUF_RAW, HCI_LINK_KEY_REQ_REP_NEG_PLEN, PBUF_RAM)) == NULL) { + if ((p = btpbuf_alloc(PBUF_RAW, HCI_LINK_KEY_REQ_NEG_REP_PLEN, PBUF_RAM)) == NULL) { ERROR("hci_link_key_req_neg_repl: Could not allocate memory for pbuf\n"); return ERR_MEM; } - p = hci_cmd_ass(p, HCI_LINK_KEY_REQ_REP_NEG, HCI_LINK_CTRL_OGF, HCI_LINK_KEY_REQ_REP_NEG_PLEN); + p = hci_cmd_ass(p, HCI_LINK_KEY_REQ_NEG_REP_OCF, HCI_LINK_CTRL_OGF, HCI_LINK_KEY_REQ_NEG_REP_PLEN); memcpy(((u8_t *)p->payload)+4, bdaddr->addr, 6); physbusif_output(p,p->tot_len); @@ -1079,7 +1079,7 @@ err_t hci_write_stored_link_key(struct bd_addr *bdaddr, u8_t *link) return ERR_MEM; } /* Assembling command packet */ - p = hci_cmd_ass(p, HCI_WRITE_STORED_LINK_KEY, HCI_HC_BB_OGF, HCI_W_STORED_LINK_KEY_PLEN); + p = hci_cmd_ass(p, HCI_W_STORED_LINK_KEY_OCF, HCI_HC_BB_OGF, HCI_W_STORED_LINK_KEY_PLEN); /* Assembling cmd prameters */ ((u8_t *)p->payload)[4] = 0x01; memcpy(((u8_t *)p->payload) + 5, bdaddr->addr, 6); @@ -1101,12 +1101,12 @@ err_t hci_delete_stored_link_key(struct bd_addr *bdaddr, u8_t delete_all) { struct pbuf *p; - if((p = btpbuf_alloc(PBUF_RAW, HCI_DEL_STORED_LINK_KEY_PLEN, PBUF_RAM)) == NULL) { + if((p = btpbuf_alloc(PBUF_RAW, HCI_D_STORED_LINK_KEY_PLEN, PBUF_RAM)) == NULL) { ERROR("hci_write_stored_link_key: Could not allocate memory for pbuf\n"); return ERR_MEM; } /* Assembling command packet */ - p = hci_cmd_ass(p, HCI_DELETE_STORED_LINK_KEY, HCI_HC_BB_OGF, HCI_DEL_STORED_LINK_KEY_PLEN); + p = hci_cmd_ass(p, HCI_D_STORED_LINK_KEY_OCF, HCI_HC_BB_OGF, HCI_D_STORED_LINK_KEY_PLEN); /* Assembling cmd prameters */ if (bdaddr) { @@ -1204,12 +1204,12 @@ err_t hci_set_hc_to_h_fc(void) err_t hci_host_buffer_size(void) { struct pbuf *p; - if((p = btpbuf_alloc(PBUF_RAW, HCI_H_BUF_SIZE_PLEN, PBUF_RAM)) == NULL) { + if((p = btpbuf_alloc(PBUF_RAW, HCI_HOST_BUF_SIZE_PLEN, PBUF_RAM)) == NULL) { ERROR("hci_host_buffer_size: Could not allocate memory for pbuf\n"); return ERR_MEM; } /* Assembling command packet */ - p = hci_cmd_ass(p, HCI_H_BUF_SIZE_OCF, HCI_HC_BB_OGF, HCI_H_BUF_SIZE_PLEN); + p = hci_cmd_ass(p, HCI_HOST_BUF_SIZE_OCF, HCI_HC_BB_OGF, HCI_HOST_BUF_SIZE_PLEN); ((u16_t *)p->payload)[2] = htole16(HCI_HOST_ACL_MAX_LEN); /* Host ACL data packet maximum length */ ((u8_t *)p->payload)[6] = 255; /* Host SCO Data Packet Length */ *((u16_t *)(((u8_t *)p->payload)+7)) = htole16(HCI_HOST_MAX_NUM_ACL); /* Host max total num ACL data packets */ @@ -1239,7 +1239,7 @@ err_t hci_host_num_comp_packets(u16_t conhdl, u16_t num_complete) return ERR_MEM; } /* Assembling command packet */ - p = hci_cmd_ass(p, HCI_H_NUM_COMPL_OCF, HCI_HC_BB_OGF, HCI_H_NUM_COMPL_PLEN); + p = hci_cmd_ass(p, HCI_HOST_NUM_COMPL_OCF, HCI_HC_BB_OGF, HCI_H_NUM_COMPL_PLEN); ((u8_t*)p->payload)[4] = 1; *(u16_t*)(p->payload+5) = htole16(conhdl); *(u16_t*)(p->payload+7) = htole16(num_complete); /* Number of completed acl packets */ @@ -1385,7 +1385,7 @@ err_t lp_write_flush_timeout(struct bd_addr *bdaddr, u16_t flushto) } /* Assembling command packet */ - p = hci_cmd_ass(p, HCI_W_FLUSHTO, HCI_HC_BB_OGF, HCI_W_FLUSHTO_PLEN); + p = hci_cmd_ass(p, HCI_W_FLUSHTO_OCF, HCI_HC_BB_OGF, HCI_W_FLUSHTO_PLEN); /* Assembling cmd prameters */ ((u16_t *)p->payload)[2] = htole16(link->connhdl); ((u16_t *)p->payload)[3] = htole16(flushto); @@ -1466,17 +1466,17 @@ static void hci_cc_info_param(u8_t ocf,struct pbuf *p) struct bd_addr *bdaddr; switch(ocf) { - case HCI_READ_LOCAL_VERSION: + case HCI_R_LOC_VERS_INFO_OCF: if(((u8_t*)p->payload)[0]==HCI_SUCCESS) { hci_dev->info.hci_version = *((u8_t*)p->payload + 1); hci_dev->info.hci_revision = le16toh(*(u16_t*)((u8_t*)p->payload + 2)); hci_dev->info.lmp_version = *((u8_t*)p->payload + 4); hci_dev->info.manufacturer = le16toh(*(u16_t*)((u8_t*)p->payload + 5)); hci_dev->info.lmp_subversion = le16toh(*(u16_t*)((u8_t*)p->payload + 7)); - LOG("hci_cc_info_param(HCI_READ_LOCAL_VERSION): hci_version = %02x, hci_revision = %04x, lmp_version = %02x, manufacturer = %04x, lmp_suversion = %04x\n",hci_dev->info.hci_version,hci_dev->info.hci_revision,hci_dev->info.lmp_version,hci_dev->info.manufacturer,hci_dev->info.lmp_subversion); + LOG("hci_cc_info_param(HCI_R_LOC_VERS_INFO_OCF): hci_version = %02x, hci_revision = %04x, lmp_version = %02x, manufacturer = %04x, lmp_suversion = %04x\n",hci_dev->info.hci_version,hci_dev->info.hci_revision,hci_dev->info.lmp_version,hci_dev->info.manufacturer,hci_dev->info.lmp_subversion); } break; - case HCI_READ_LOCAL_FEATURES: + case HCI_R_LOC_FEAT_OCF: if(((u8_t*)p->payload)[0]==HCI_SUCCESS) { memcpy(hci_dev->features,(void*)((u8_t*)p->payload+1),sizeof(hci_dev->features)); @@ -1488,23 +1488,23 @@ static void hci_cc_info_param(u8_t ocf,struct pbuf *p) hci_dev->pkt_type |= HCI_HV2; if(hci_dev->features[1]&LMP_HV3) hci_dev->pkt_type |= HCI_HV3; - LOG("hci_cc_info_param(HCI_READ_LOCAL_FEATURES): %02x:%02x:%02x:%02x:%02x:%02x:%02x:%02x\n",hci_dev->features[0],hci_dev->features[1],hci_dev->features[2],hci_dev->features[3], + LOG("hci_cc_info_param(HCI_R_LOC_FEAT_OCF): %02x:%02x:%02x:%02x:%02x:%02x:%02x:%02x\n",hci_dev->features[0],hci_dev->features[1],hci_dev->features[2],hci_dev->features[3], hci_dev->features[4],hci_dev->features[5],hci_dev->features[6],hci_dev->features[7]); } break; - case HCI_READ_BUFFER_SIZE: + case HCI_R_BUF_SIZE_OCF: if(((u8_t*)p->payload)[0]==HCI_SUCCESS) { hci_dev->acl_mtu = le16toh(*(u16_t*)(((u8_t*)p->payload)+1)); hci_dev->sco_mtu = *((u8_t*)p->payload+3); hci_dev->acl_max_pkt = le16toh(*(u16_t*)(((u8_t*)p->payload)+4)); hci_dev->sco_max_pkt = le16toh(*(u16_t*)(((u8_t*)p->payload)+5)); - LOG("hci_cc_info_param(HCI_READ_BUFFER_SIZE): acl_mt = %d, sco_mt = %d, acl_max_pkt = %d, sco_max_pkt = %d\n",hci_dev->acl_mtu,hci_dev->sco_mtu,hci_dev->acl_max_pkt,hci_dev->sco_max_pkt); + LOG("hci_cc_info_param(HCI_R_BUF_SIZE_OCF): acl_mt = %d, sco_mt = %d, acl_max_pkt = %d, sco_max_pkt = %d\n",hci_dev->acl_mtu,hci_dev->sco_mtu,hci_dev->acl_max_pkt,hci_dev->sco_max_pkt); } break; - case HCI_READ_BD_ADDR: + case HCI_R_BD_ADDR_OCF: if(((u8_t*)p->payload)[0]==HCI_SUCCESS) { bdaddr = (void*)((u8_t*)p->payload+1); - LOG("hci_cc_info_param(HCI_READ_BD_ADDR): %02x:%02x:%02x:%02x:%02x:%02x",bdaddr->addr[0],bdaddr->addr[1],bdaddr->addr[2],bdaddr->addr[3],bdaddr->addr[4],bdaddr->addr[5]); + LOG("hci_cc_info_param(HCI_R_BD_ADDR_OCF): %02x:%02x:%02x:%02x:%02x:%02x",bdaddr->addr[0],bdaddr->addr[1],bdaddr->addr[2],bdaddr->addr[3],bdaddr->addr[4],bdaddr->addr[5]); bd_addr_set(&(hci_dev->bdaddr),bdaddr); } break; @@ -1516,12 +1516,12 @@ static void hci_cc_host_ctrl(u8_t ocf,struct pbuf *p) u8_t *lap; u8_t i,resp_off; - LOG("hci_cc_host_ctrl(%02x)\n",ocf); + //printf("hci_cc_host_ctrl(%02x)\n",ocf); switch(ocf) { - case HCI_SET_HC_TO_H_FC: + case HCI_SET_HC_TO_H_FC_OCF: if(((u8_t*)p->payload)[0]==HCI_SUCCESS) hci_dev->flow = 1; break; - case HCI_READ_CUR_IACLAP: + case HCI_R_CUR_IACLAP_OCF: if(((u8_t*)p->payload)[0]==HCI_SUCCESS) { for(i=0;i<((u8_t*)p->payload)[1];i++) { resp_off = (i*3); @@ -1541,7 +1541,7 @@ static void hci_cc_link_policy(u8_t ocf,struct pbuf *p) (void)ret; switch(ocf) { - case HCI_W_LINK_POLICY: + case HCI_W_LINK_POLICY_OCF: if(((u8_t*)p->payload)[0]==HCI_SUCCESS) { for(link=hci_active_links;link!=NULL;link=link->next) { if(link->connhdl==le16toh(*((u16_t*)(((u8_t*)p->payload)+1)))) break; @@ -1567,9 +1567,7 @@ static void hci_conn_request_evt(struct pbuf *p) struct hci_link *link; LOG("hci_conn_request_evt()\n"); - //printf("hci_conn_request_evt()\n"); bdaddr = (void*)((u8_t*)p->payload); - //printf(" bdaddr: %02x:%02x:%02x:%02x:%02x:%02x\n",bdaddr->addr[5],bdaddr->addr[4],bdaddr->addr[3],bdaddr->addr[2],bdaddr->addr[1],bdaddr->addr[0]); cod = (((u8_t*)p->payload)+6); link_type = *(((u8_t*)p->payload)+9); @@ -1601,7 +1599,7 @@ static void hci_conn_complete_evt(struct pbuf *p) bdaddr = (void*)(((u8_t*)p->payload)+3); link = hci_get_link(bdaddr); - //printf("hci_conn_complete_evt(%p,%02x - %02x:%02x:%02x:%02x:%02x:%02x)\n",link,((u8_t*)p->payload)[0],bdaddr->addr[5],bdaddr->addr[4],bdaddr->addr[3],bdaddr->addr[2],bdaddr->addr[1],bdaddr->addr[0]); + LOG("hci_conn_complete_evt(%p,%02x - %02x:%02x:%02x:%02x:%02x:%02x)\n",link,((u8_t*)p->payload)[0],bdaddr->addr[5],bdaddr->addr[4],bdaddr->addr[3],bdaddr->addr[2],bdaddr->addr[1],bdaddr->addr[0]); switch(((u8_t*)p->payload)[0]) { case HCI_SUCCESS: if(link==NULL) { @@ -1646,7 +1644,7 @@ static void hci_inquiry_result_evt(struct pbuf *p) struct hci_inq_res *ires; num_resp = ((u8_t*)p->payload)[0]; - printf("hci_inquiry_result_evt(%d)\n",num_resp); + //printf("hci_inquiry_result_evt(%d)\n",num_resp); for(i=0;ipayload)+(1+resp_off)); @@ -1801,13 +1799,13 @@ void hci_event_handler(struct pbuf *p) btpbuf_header(p,-2); switch(ogf) { - case HCI_INFO_PARAM: + case HCI_INFO_PARAM_OGF: hci_cc_info_param(ocf,p); break; - case HCI_HOST_C_N_BB: + case HCI_HC_BB_OGF: hci_cc_host_ctrl(ocf,p); break; - case HCI_LINK_POLICY: + case HCI_LINK_POLICY_OGF: hci_cc_link_policy(ocf,p); break; } @@ -1879,7 +1877,7 @@ void hci_event_handler(struct pbuf *p) HCI_EVENT_LINK_KEY_NOT(hci_dev, bdaddr, ((u8_t *)p->payload) + 6, ret); /* Notify application.*/ break; - case HCI_VENDOR: + case HCI_VENDOR_SPECIFIC_EVENT: switch (((u8_t *)p->payload)[0]) { case HCI_VENDOR_BEGIN_PAIRING: HCI_EVENT_SYNC_BTN(hci_dev, FALSE); diff --git a/lwbt/hci.h b/lwbt/hci.h index 60fe72a77..eba0d4596 100644 --- a/lwbt/hci.h +++ b/lwbt/hci.h @@ -9,7 +9,7 @@ #define HCI_ACL_DATA_PACKET 0x02 #define HCI_SCO_DATA_PACKET 0x03 #define HCI_EVENT_PACKET 0x04 -#define HCI_VENDOR_PACKET 0xff +#define HCI_VENDOR_PACKET 0xFF /* HCI packet types */ #define HCI_DM1 0x0008 @@ -31,6 +31,12 @@ #define HCI_SCO_HDR_LEN 3 #define HCI_CMD_HDR_LEN 3 +/* Specification specific parameters */ +#define HCI_BD_ADDR_LEN 6 +#define HCI_LMP_FEATURES_LEN 8 +#define HCI_LINK_KEY_LEN 16 +#define HCI_LMP_FEAT_LEN 8 + /* LMP features */ #define LMP_3SLOT 0x01 #define LMP_5SLOT 0x02 @@ -55,126 +61,194 @@ #define LMP_PCONTROL 0x04 /* Opcode Group Field (OGF) values */ -#define HCI_LINK_CONTROL 0x01 /* Link Control Commands */ -#define HCI_LINK_POLICY 0x02 /* Link Policy Commands */ -#define HCI_HOST_C_N_BB 0x03 /* Host Controller & Baseband Commands */ -#define HCI_INFO_PARAM 0x04 /* Informational Parameters */ -#define HCI_STATUS_PARAM 0x05 /* Status Parameters */ -#define HCI_TESTING 0x06 /* Testing Commands */ +#define HCI_LINK_CTRL_OGF 0x01 /* Link ctrl cmds */ +#define HCI_LINK_POLICY_OGF 0x02 /* Link Policy Commands */ +#define HCI_HC_BB_OGF 0x03 /* Host controller and baseband commands */ +#define HCI_INFO_PARAM_OGF 0x04 /* Informal parameters */ +#define HCI_STATUS_PARAM_OGF 0x05 /* Status Parameters */ +#define HCI_TESTING_OGF 0x06 /* Testing Commands */ +#define HCI_VENDOR_OGF 0x3F /* Vendor-Specific Commands */ /* Opcode Command Field (OCF) values */ /* Link control commands */ -#define HCI_INQUIRY 0x01 -#define HCI_PERIODIC_INQUIRY 0x03 -#define HCI_CREATE_CONNECTION 0x05 -#define HCI_REJECT_CONNECTION_REQUEST 0x0A -#define HCI_DISCONNECT 0x06 -#define HCI_PIN_CODE_REQ_REP 0x0D -#define HCI_PIN_CODE_REQ_NEG_REP 0x0E -#define HCI_LINK_KEY_REQ_REP 0x0B -#define HCI_LINK_KEY_REQ_REP_NEG 0x0C -#define HCI_SET_CONN_ENCRYPT 0x13 +#define HCI_INQUIRY_OCF 0x01 +#define HCI_PERIODIC_INQUIRY_OCF 0x03 +#define HCI_EXIT_PERIODIC_INQUIRY_OCF 0x04 +#define HCI_CREATE_CONN_OCF 0x05 +#define HCI_DISCONN_OCF 0x06 +#define HCI_ACCEPT_CONN_REQ_OCF 0x09 +#define HCI_REJECT_CONN_REQ_OCF 0x0A +#define HCI_LINK_KEY_REQ_REP_OCF 0x0B +#define HCI_LINK_KEY_REQ_NEG_REP_OCF 0x0C +#define HCI_PIN_CODE_REQ_REP_OCF 0x0D +#define HCI_PIN_CODE_REQ_NEG_REP_OCF 0x0E +#define HCI_SET_CONN_ENCRYPT_OCF 0x13 +#define HCI_R_REMOTE_NAME_OCF 0x19 /* Link Policy commands */ -#define HCI_HOLD_MODE 0x01 -#define HCI_SNIFF_MODE 0x03 -#define HCI_EXIT_SNIFF_MODE 0x04 -#define HCI_PARK_MODE 0x05 -#define HCI_EXIT_PARK_MODE 0x06 -#define HCI_W_LINK_POLICY 0x0D +#define HCI_HOLD_MODE_OCF 0x01 +#define HCI_SNIFF_MODE_OCF 0x03 +#define HCI_EXIT_SNIFF_MODE_OCF 0x04 +#define HCI_PARK_MODE_OCF 0x05 +#define HCI_EXIT_PARK_MODE_OCF 0x06 +#define HCI_W_LINK_POLICY_OCF 0x0D /* Host-Controller and Baseband Commands */ -#define HCI_SET_EVENT_MASK 0x01 -#define HCI_RESET 0x03 -#define HCI_SET_EVENT_FILTER 0x05 -#define HCI_WRITE_STORED_LINK_KEY 0x11 -#define HCI_DELETE_STORED_LINK_KEY 0x12 -#define HCI_WRITE_LOCAL_NAME 0x13 - -#define HCI_WRITE_PAGE_TIMEOUT 0x18 -#define HCI_WRITE_SCAN_ENABLE 0x1A -#define HCI_WRITE_COD 0x24 -#define HCI_W_FLUSHTO 0x28 -#define HCI_SET_HC_TO_H_FC 0x31 -#define HCI_READ_CUR_IACLAP 0x39 -#define HCI_WRITE_PIN_TYPE 0x0A -#define HCI_R_STORED_LINK_KEY 0x0D -#define HCI_HOST_BUF_SIZE 0x33 -#define HCI_WRITE_INQUIRY_SCAN_TYPE 0x43 -#define HCI_WRITE_INQUIRY_MODE 0x45 -#define HCI_WRITE_PAGE_SCAN_TYPE 0x47 +#define HCI_SET_EV_MASK_OCF 0x01 +#define HCI_RESET_OCF 0x03 +#define HCI_SET_EV_FILTER_OCF 0x05 +#define HCI_W_PIN_TYPE_OCF 0x0A +#define HCI_R_STORED_LINK_KEY_OCF 0x0D +#define HCI_W_STORED_LINK_KEY_OCF 0x11 +#define HCI_D_STORED_LINK_KEY_OCF 0x12 +#define HCI_W_LOCAL_NAME_OCF 0x13 +#define HCI_W_PAGE_TIMEOUT_OCF 0x18 +#define HCI_W_SCAN_EN_OCF 0x1A +#define HCI_W_AUTH_ENABLE_OCF 0x20 +#define HCI_R_COD_OCF 0x23 +#define HCI_W_COD_OCF 0x24 +#define HCI_W_FLUSHTO_OCF 0x28 +#define HCI_SET_HC_TO_H_FC_OCF 0x31 +#define HCI_HOST_BUF_SIZE_OCF 0x33 +#define HCI_HOST_NUM_COMPL_OCF 0x35 +#define HCI_R_CUR_IACLAP_OCF 0x39 +#define HCI_W_INQUIRY_SCAN_TYPE_OCF 0x43 +#define HCI_W_INQUIRY_MODE_OCF 0x45 +#define HCI_W_PAGE_SCAN_TYPE_OCF 0x47 + +/* Informational Parameters */ +#define HCI_R_LOC_VERS_INFO_OCF 0x01 +#define HCI_R_LOC_FEAT_OCF 0x03 +#define HCI_R_BUF_SIZE_OCF 0x05 +#define HCI_R_BD_ADDR_OCF 0x09 + +/* Status Parameters */ +#define HCI_READ_FAILED_CONTACT_COUNTER 0x01 +#define HCI_RESET_FAILED_CONTACT_COUNTER 0x02 +#define HCI_GET_LINK_QUALITY 0x03 +#define HCI_READ_RSSI 0x05 + +/* Testing commands */ + +/* Vendor-Specific Commands*/ +#define HCI_VENDOR_PATCH_START_OCF 0x4F +#define HCI_VENDOR_PATCH_CONT_OCF 0x4C +#define HCI_VENDOR_PATCH_END_OCF 0x4F + +/* Command packet length (including ACL header)*/ + +/* Link Control Commands */ +#define HCI_INQUIRY_PLEN 9 +#define HCI_PERIODIC_INQUIRY_PLEN 13 +#define HCI_EXIT_PERIODIC_INQUIRY_PLEN 4 +#define HCI_CREATE_CONN_PLEN 17 +#define HCI_DISCONN_PLEN 7 +#define HCI_ACCEPT_CONN_REQ_PLEN 11 +#define HCI_REJECT_CONN_REQ_PLEN 11 +#define HCI_LINK_KEY_REQ_REP_PLEN 26 +#define HCI_LINK_KEY_REQ_NEG_REP_PLEN 10 +#define HCI_PIN_CODE_REQ_REP_PLEN 27 +#define HCI_PIN_CODE_REQ_NEG_REP_PLEN 10 +#define HCI_SET_CONN_ENCRYPT_PLEN 7 +#define HCI_R_REMOTE_NAME_PLEN 14 + +/* Link Policy Commands */ +#define HCI_SNIFF_MODE_PLEN 14 +#define HCI_W_LINK_POLICY_PLEN 8 + +/* Host-Controller and Baseband Commands */ +#define HCI_SET_EV_MASK_PLEN 12 +#define HCI_RESET_PLEN 4 +#define HCI_SET_EV_FILTER_PLEN 6 +#define HCI_W_PIN_TYPE_PLEN 5 +#define HCI_R_STORED_LINK_KEY_PLEN 11 +#define HCI_W_STORED_LINK_KEY_PLEN 27 +#define HCI_D_STORED_LINK_KEY_PLEN 11 +#define HCI_W_LOCAL_NAME_PLEN 252 +#define HCI_W_PAGE_TIMEOUT_PLEN 6 +#define HCI_W_SCAN_EN_PLEN 5 +#define HCI_W_AUTH_ENABLE_PLEN 5 +#define HCI_R_COD_PLEN 4 +#define HCI_W_COD_PLEN 7 +#define HCI_W_FLUSHTO_PLEN 8 +#define HCI_SET_HC_TO_H_FC_PLEN 5 +#define HCI_HOST_BUF_SIZE_PLEN 11 +#define HCI_H_NUM_COMPL_PLEN 9 +#define HCI_R_CUR_IACLAP_PLEN 4 +#define HCI_W_INQUIRY_SCAN_TYPE_PLEN 5 +#define HCI_W_INQUIRY_MODE_PLEN 5 +#define HCI_W_PAGE_SCAN_TYPE_PLEN 5 /* Informational Parameters */ -#define HCI_READ_LOCAL_VERSION 0x01 -#define HCI_READ_LOCAL_FEATURES 0x03 -#define HCI_READ_BUFFER_SIZE 0x05 -#define HCI_READ_BD_ADDR 0x09 +#define HCI_R_LOC_VERS_INFO_PLEN 4 +#define HCI_R_LOC_FEAT_PLEN 4 +#define HCI_R_BUF_SIZE_PLEN 4 +#define HCI_R_BD_ADDR_PLEN 4 /* Status Parameters */ -#define HCI_READ_FAILED_CONTACT_COUNTER 0x01 -#define HCI_RESET_FAILED_CONTACT_COUNTER 0x02 -#define HCI_GET_LINK_QUALITY 0x03 -#define HCI_READ_RSSI 0x05 /* Testing commands */ +/* Vendor-Specific Commands*/ +#define HCI_W_VENDOR_CMD_PLEN 4 + /* Possible event codes */ -#define HCI_INQUIRY_COMPLETE 0x01 -#define HCI_INQUIRY_RESULT 0x02 -#define HCI_CONNECTION_COMPLETE 0x03 -#define HCI_CONNECTION_REQUEST 0x04 -#define HCI_DISCONNECTION_COMPLETE 0x05 -#define HCI_AUTH_COMPLETE 0x06 -#define HCI_REMOTE_NAME_REQ_COMPLETE 0x07 -#define HCI_ENCRYPTION_CHANGE 0x08 -#define HCI_CHANGE_CONN_LINK_KEY_COMPLETE 0x09 -#define HCI_MASTER_LINK_KEY_COMPLETE 0x0A -#define HCI_READ_REMOTE_FEATURES_COMPLETE 0x0B -#define HCI_READ_REMOTE_VERSION_COMPLETE 0x0C -#define HCI_QOS_SETUP_COMPLETE 0x0D -#define HCI_COMMAND_COMPLETE 0x0E -#define HCI_COMMAND_STATUS 0x0F -#define HCI_HARDWARE_ERROR 0x10 -#define HCI_FLUSH_OCCURRED 0x11 -#define HCI_ROLE_CHANGE 0x12 -#define HCI_NBR_OF_COMPLETED_PACKETS 0x13 -#define HCI_MODE_CHANGE 0x14 -#define HCI_RETURN_LINK_KEYS 0x15 -#define HCI_PIN_CODE_REQUEST 0x16 -#define HCI_LINK_KEY_REQUEST 0x17 -#define HCI_LINK_KEY_NOTIFICATION 0x18 -#define HCI_LOOPBACK_COMMAND 0x19 -#define HCI_DATA_BUFFER_OVERFLOW 0x1A -#define HCI_MAX_SLOTS_CHANGE 0x1B -#define HCI_READ_CLOCK_OFFSET_COMPLETE 0x1C -#define HCI_CONN_PTYPE_CHANGED 0x1D -#define HCI_QOS_VIOLATION 0x1E -#define HCI_PSCAN_REP_MODE_CHANGE 0x20 -#define HCI_FLOW_SPEC_COMPLETE 0x21 -#define HCI_INQUIRY_RESULT_WITH_RSSI 0x22 -#define HCI_READ_REMOTE_EXT_FEATURES_COMPLETE 0x23 -#define HCI_SYNC_CONN_COMPLETE 0x2C -#define HCI_SYNC_CONN_CHANGED 0x2D -#define HCI_SNIFF_SUBRATING 0x2E -#define HCI_EXTENDED_INQUIRY_RESULT 0x2F -#define HCI_ENCRYPTION_KEY_REFRESH_COMPLETE 0x30 -#define HCI_IO_CAPABILITY_REQUEST 0x31 -#define HCI_IO_CAPABILITY_RESPONSE 0x32 -#define HCI_USER_CONFIRM_REQUEST 0x33 -#define HCI_USER_PASSKEY_REQUEST 0x34 -#define HCI_REMOTE_OOB_DATA_REQUEST 0x35 -#define HCI_SIMPLE_PAIRING_COMPLETE 0x36 -#define HCI_LINK_SUPERVISION_TIMEOUT_CHANGED 0x38 -#define HCI_ENHANCED_FLUSH_COMPLETE 0x39 -#define HCI_USER_PASSKEY_NOTIFY 0x3B -#define HCI_KEYPRESS_NOTIFY 0x3C -#define HCI_REMOTE_HOST_FEATURES_NOTIFY 0x3D -#define HCI_VENDOR 0xFF - -/* Wii vendor specific event codes */ -#define HCI_VENDOR_BEGIN_PAIRING 0x08 -#define HCI_VENDOR_CLEAR_PAIRED_DEVICES 0x09 +#define HCI_INQUIRY_COMPLETE 0x01 +#define HCI_INQUIRY_RESULT 0x02 +#define HCI_CONNECTION_COMPLETE 0x03 +#define HCI_CONNECTION_REQUEST 0x04 +#define HCI_DISCONNECTION_COMPLETE 0x05 +#define HCI_AUTH_COMPLETE 0x06 +#define HCI_REMOTE_NAME_REQ_COMPLETE 0x07 +#define HCI_ENCRYPTION_CHANGE 0x08 +#define HCI_CHANGE_CONN_LINK_KEY_COMPLETE 0x09 +#define HCI_MASTER_LINK_KEY_COMPLETE 0x0A +#define HCI_READ_REMOTE_FEATURES_COMPLETE 0x0B +#define HCI_READ_REMOTE_VERSION_COMPLETE 0x0C +#define HCI_QOS_SETUP_COMPLETE 0x0D +#define HCI_COMMAND_COMPLETE 0x0E +#define HCI_COMMAND_STATUS 0x0F +#define HCI_HARDWARE_ERROR 0x10 +#define HCI_FLUSH_OCCURRED 0x11 +#define HCI_ROLE_CHANGE 0x12 +#define HCI_NBR_OF_COMPLETED_PACKETS 0x13 +#define HCI_MODE_CHANGE 0x14 +#define HCI_RETURN_LINK_KEYS 0x15 +#define HCI_PIN_CODE_REQUEST 0x16 +#define HCI_LINK_KEY_REQUEST 0x17 +#define HCI_LINK_KEY_NOTIFICATION 0x18 +#define HCI_LOOPBACK_COMMAND 0x19 +#define HCI_DATA_BUFFER_OVERFLOW 0x1A +#define HCI_MAX_SLOTS_CHANGE 0x1B +#define HCI_READ_CLOCK_OFFSET_COMPLETE 0x1C +#define HCI_CONN_PTYPE_CHANGED 0x1D +#define HCI_QOS_VIOLATION 0x1E +#define HCI_PSCAN_REP_MODE_CHANGE 0x20 +#define HCI_FLOW_SPEC_COMPLETE 0x21 +#define HCI_INQUIRY_RESULT_WITH_RSSI 0x22 +#define HCI_READ_REMOTE_EXT_FEATURES_COMPLETE 0x23 +#define HCI_SYNC_CONN_COMPLETE 0x2C +#define HCI_SYNC_CONN_CHANGED 0x2D +#define HCI_SNIFF_SUBRATING 0x2E +#define HCI_EXTENDED_INQUIRY_RESULT 0x2F +#define HCI_ENCRYPTION_KEY_REFRESH_COMPLETE 0x30 +#define HCI_IO_CAPABILITY_REQUEST 0x31 +#define HCI_IO_CAPABILITY_RESPONSE 0x32 +#define HCI_USER_CONFIRM_REQUEST 0x33 +#define HCI_USER_PASSKEY_REQUEST 0x34 +#define HCI_REMOTE_OOB_DATA_REQUEST 0x35 +#define HCI_SIMPLE_PAIRING_COMPLETE 0x36 +#define HCI_LINK_SUPERVISION_TIMEOUT_CHANGED 0x38 +#define HCI_ENHANCED_FLUSH_COMPLETE 0x39 +#define HCI_USER_PASSKEY_NOTIFY 0x3B +#define HCI_KEYPRESS_NOTIFY 0x3C +#define HCI_REMOTE_HOST_FEATURES_NOTIFY 0x3D +#define HCI_VENDOR_SPECIFIC_EVENT 0xFF + +/* Vendor specific event codes */ +#define HCI_VENDOR_BEGIN_PAIRING 0x08 +#define HCI_VENDOR_CLEAR_PAIRED_DEVICES 0x09 /* Success code */ #define HCI_SUCCESS 0x00 @@ -201,7 +275,7 @@ #define HCI_OTHER_END_TERMINATED_CONN_LOW_RESOURCES 0x14 #define HCI_OTHER_END_TERMINATED_CONN_ABOUT_TO_POWER_OFF 0x15 #define HCI_CONN_TERMINATED_BY_LOCAL_HOST 0x16 -#define HCI_REPETED_ATTEMPTS 0x17 +#define HCI_REPEATED_ATTEMPTS 0x17 #define HCI_PAIRING_NOT_ALLOWED 0x18 #define HCI_UNKNOWN_LMP_PDU 0x19 #define HCI_UNSUPPORTED_REMOTE_FEATURE 0x1A @@ -221,98 +295,6 @@ #define HCI_INSTANT_PASSED 0x28 #define HCI_PAIRING_UNIT_KEY_NOT_SUPPORTED 0x29 -/* Specification specific parameters */ -#define HCI_BD_ADDR_LEN 6 -#define HCI_LMP_FEATURES_LEN 8 -#define HCI_LINK_KEY_LEN 16 -#define HCI_LMP_FEAT_LEN 8 - -/* Command OGF */ -#define HCI_LINK_CTRL_OGF 0x01 /* Link ctrl cmds */ -#define HCI_LINK_POLICY_OGF 0x02 /* Link Policy Commands */ -#define HCI_HC_BB_OGF 0x03 /* Host controller and baseband commands */ -#define HCI_INFO_PARAM_OGF 0x04 /* Informal parameters */ - -/* Command OCF */ -#define HCI_INQUIRY_OCF 0x01 -#define HCI_SNIFF_MODE_OCF 0x03 -#define HCI_EXIT_SNIFF_MODE_OCF 0x04 -#define HCI_PARK_MODE_OCF 0x05 -#define HCI_EXIT_PARK_MODE_OCF 0x06 -#define HCI_PERIODIC_INQUIRY_OCF 0x03 -#define HCI_EXIT_PERIODIC_INQUIRY_OCF 0x04 -#define HCI_CREATE_CONN_OCF 0x05 -#define HCI_DISCONN_OCF 0x06 -#define HCI_W_LOCAL_NAME_OCF 0x13 -#define HCI_W_LINK_POLICY_OCF 0x0D -#define HCI_ACCEPT_CONN_REQ_OCF 0x09 -#define HCI_REJECT_CONN_REQ_OCF 0x0A -#define HCI_SET_EV_MASK_OCF 0x01 -#define HCI_RESET_OCF 0x03 -#define HCI_SET_EV_FILTER_OCF 0x05 -#define HCI_R_STORED_LINK_KEY_OCF 0x0D -#define HCI_W_PAGE_TIMEOUT_OCF 0x18 -#define HCI_W_SCAN_EN_OCF 0x1A -#define HCI_W_AUTH_ENABLE_OCF 0x20 -#define HCI_R_COD_OCF 0x23 -#define HCI_W_COD_OCF 0x24 -#define HCI_SET_HC_TO_H_FC_OCF 0x31 -#define HCI_H_BUF_SIZE_OCF 0x33 -#define HCI_H_NUM_COMPL_OCF 0x35 -#define HCI_R_CUR_IACLAP_OCF 0x39 -#define HCI_R_LOC_VERSION_OCF 0x01 -#define HCI_R_LOC_FEATURES_OCF 0x03 -#define HCI_R_BUF_SIZE_OCF 0x05 -#define HCI_R_BD_ADDR_OCF 0x09 -#define HCI_R_REMOTE_NAME_OCF 0x19 -#define HCI_W_PIN_TYPE_OCF 0x0A -#define HCI_W_INQUIRY_SCAN_TYPE_OCF 0x43 -#define HCI_W_INQUIRY_MODE_OCF 0x45 -#define HCI_W_PAGE_SCAN_TYPE_OCF 0x47 - -/* Command packet length (including ACL header)*/ -#define HCI_INQUIRY_PLEN 9 -#define HCI_PERIODIC_INQUIRY_PLEN 13 -#define HCI_EXIT_PERIODIC_INQUIRY_PLEN 4 -#define HCI_CREATE_CONN_PLEN 17 -#define HCI_DISCONN_PLEN 7 -#define HCI_REJECT_CONN_REQ_PLEN 11 -#define HCI_ACCEPT_CONN_REQ_PLEN 11 -#define HCI_PIN_CODE_REQ_REP_PLEN 27 -#define HCI_PIN_CODE_REQ_NEG_REP_PLEN 10 -#define HCI_LINK_KEY_REQ_REP_PLEN 26 -#define HCI_LINK_KEY_REQ_REP_NEG_PLEN 10 -#define HCI_SET_CONN_ENCRYPT_PLEN 7 -#define HCI_W_STORED_LINK_KEY_PLEN 27 -#define HCI_DEL_STORED_LINK_KEY_PLEN 11 -#define HCI_SET_EV_MASK_PLEN 12 -#define HCI_SNIFF_PLEN 14 -#define HCI_W_LINK_POLICY_PLEN 8 -#define HCI_RESET_PLEN 4 -#define HCI_SET_EV_FILTER_PLEN 6 -#define HCI_W_PAGE_TIMEOUT_PLEN 6 -#define HCI_W_SCAN_EN_PLEN 5 -#define HCI_W_AUTH_ENABLE_PLEN 5 -#define HCI_R_COD_PLEN 4 -#define HCI_W_COD_PLEN 7 -#define HCI_W_FLUSHTO_PLEN 8 -#define HCI_W_LOCAL_NAME_PLEN 252 -#define HCI_SET_HC_TO_H_FC_PLEN 5 -#define HCI_H_BUF_SIZE_PLEN 11 -#define HCI_H_NUM_COMPL_PLEN 9 -#define HCI_R_LOC_FEAT_SIZE_PLEN 4 -#define HCI_R_LOC_VERS_SIZE_PLEN 4 -#define HCI_R_BUF_SIZE_PLEN 4 -#define HCI_R_BD_ADDR_PLEN 4 -#define HCI_R_CUR_IACLAP_PLEN 4 -#define HCI_R_STORED_LINK_KEY_PLEN 11 -#define HCI_R_REMOTE_NAME_PLEN 14 -#define HCI_W_PIN_TYPE_PLEN 5 -#define HCI_W_INQUIRY_MODE_PLEN 5 -#define HCI_W_INQUIRY_SCAN_TYPE_PLEN 5 -#define HCI_W_PAGE_SCAN_TYPE_PLEN 5 -#define HCI_W_VENDOR_CMD_PLEN 4 - struct hci_evt_hdr { u8_t code; diff --git a/wiiuse/io.c b/wiiuse/io.c index e938f92d8..57bd09de0 100644 --- a/wiiuse/io.c +++ b/wiiuse/io.c @@ -3,7 +3,6 @@ #include #include -#include #include "definitions.h" #include "wiiuse_internal.h" @@ -13,13 +12,14 @@ #include "wiiboard.h" #include "motion_plus.h" #include "io.h" -void wiiuse_handshake(struct wiimote_t *wm,ubyte *data,uword len) +void wiiuse_handshake(struct wiimote_t *wm,ubyte *data,uword len) { ubyte *buf = NULL; struct accel_t *accel = &wm->accel_calib; //printf("wiiuse_handshake(%d,%p,%d)\n",wm->handshake_state,data,len); + switch(wm->handshake_state) { case 0: wm->handshake_state++; diff --git a/wiiuse/io_wii.c b/wiiuse/io_wii.c index d769e9b48..9171687f1 100644 --- a/wiiuse/io_wii.c +++ b/wiiuse/io_wii.c @@ -54,8 +54,6 @@ static s32 __wiiuse_disconnected(void *arg,struct bte_pcb *pcb,u8 err) if(wm->event_cb) wm->event_cb(wm,WIIUSE_DISCONNECT); wml->wm = NULL; - //printf("Clearing Wiimote %s (%p)\n", wml->name, wml); - memset(wml->name, 0, sizeof(wml->name)); return ERR_OK; } @@ -85,8 +83,6 @@ static s32 __wiiuse_connected(void *arg,struct bte_pcb *pcb,u8 err) struct wiimote_listen_t *wml = (struct wiimote_listen_t*)arg; struct wiimote_t *wm; - //printf("__wiiuse_connected(%d)\n", err); - wm = wml->assign_cb(wml, err); if(!wm) { @@ -124,9 +120,9 @@ int wiiuse_register(struct wiimote_listen_t *wml, struct bd_addr *bdaddr, struct { s32 err; - //printf("wiiuse_register %p, bdaddr: %02x:%02x:%02x:%02x:%02x:%02x\n",wml,bdaddr->addr[5],bdaddr->addr[4],bdaddr->addr[3],bdaddr->addr[2],bdaddr->addr[1],bdaddr->addr[0]); - if(!wml || !bdaddr || !assign_cb) return 0; + + //printf("wiiuse_register %p, bdaddr: %02x:%02x:%02x:%02x:%02x:%02x\n",wml,bdaddr->addr[5],bdaddr->addr[4],bdaddr->addr[3],bdaddr->addr[2],bdaddr->addr[1],bdaddr->addr[0]); wml->wm = NULL; bd_addr_set(&(wml->bdaddr),bdaddr); @@ -149,9 +145,9 @@ int wiiuse_connect(struct wiimote_listen_t *wml, struct bd_addr *bdaddr, u8 *nam { s32 err; - //printf("wiiuse_connect %p, bdaddr: %02x:%02x:%02x:%02x:%02x:%02x\n",wml,bdaddr->addr[5],bdaddr->addr[4],bdaddr->addr[3],bdaddr->addr[2],bdaddr->addr[1],bdaddr->addr[0]); - if(!wml || !bdaddr || !name || !assign_cb) return 0; + + //printf("wiiuse_connect %p, bdaddr: %02x:%02x:%02x:%02x:%02x:%02x\n",wml,bdaddr->addr[5],bdaddr->addr[4],bdaddr->addr[3],bdaddr->addr[2],bdaddr->addr[1],bdaddr->addr[0]); wml->wm = NULL; bd_addr_set(&(wml->bdaddr),bdaddr); @@ -175,7 +171,7 @@ int wiiuse_connect(struct wiimote_listen_t *wml, struct bd_addr *bdaddr, u8 *nam void wiiuse_disconnect(struct wiimote_t *wm) { - printf("wiiuse_disconnect\n"); + //printf("wiiuse_disconnect\n"); if(wm==NULL || wm->sock==NULL) return; diff --git a/wiiuse/wpad.c b/wiiuse/wpad.c index 8fd031f6f..6bcab9657 100644 --- a/wiiuse/wpad.c +++ b/wiiuse/wpad.c @@ -53,10 +53,10 @@ distribution. #define MAX_STREAMDATA_LEN 20 #define EVENTQUEUE_LENGTH 16 -#define DISCONNECT_TIMEOUT 8 -#define DISCONNECT_BATTERY_DIED 20 -#define DISCONNECT_POWER_OFF 21 -#define DISCONNECT_IDLE_TIMEOUT 22 +#define DISCONNECT_TIMEOUT 0x08 /* HCI_CONN_TIMEOUT */ +#define DISCONNECT_BATTERY_DIED 0x14 /* HCI_OTHER_END_TERMINATED_CONN_LOW_RESOURCES */ +#define DISCONNECT_POWER_OFF 0x15 /* HCI_OTHER_END_TERMINATED_CONN_ABOUT_TO_POWER_OFF */ +#define DISCONNECT_IDLE_TIMEOUT 0x16 /* HCI_CONN_TERMINATED_BY_LOCAL_HOST */ struct _wpad_thresh{ s32 btns; @@ -96,9 +96,9 @@ static u32 __wpad_idletimeout = 300; static vu32 __wpads_active = 0; static vu32 __wpads_used = 0; static wiimote **__wpads = NULL; -static wiimote_listen __wpads_listen[WPAD_MAX_WIIMOTES]; -static WPADData wpaddata[WPAD_MAX_WIIMOTES]; -static struct _wpad_cb __wpdcb[WPAD_MAX_WIIMOTES]; +static wiimote_listen __wpads_listen[WPAD_MAX_DEVICES]; +static WPADData wpaddata[WPAD_MAX_DEVICES]; +static struct _wpad_cb __wpdcb[WPAD_MAX_DEVICES]; static conf_pads __wpad_devs; static conf_pad_guests __wpad_guests; static struct linkkey_info __wpad_keys[CONF_PAD_TOTAL]; @@ -146,7 +146,7 @@ static void __wpad_timeouthandler(syswd_t alarm,void *cbarg) if(!__wpads_active) return; __lwp_thread_dispatchdisable(); - for(i=0;iwm; if(wm && WIIMOTE_IS_SET(wm,WIIMOTE_STATE_CONNECTED)) { @@ -209,31 +209,31 @@ static void __wpad_setfmt(s32 chan) wiimote *__wpad_assign_slot(wiimote_listen *wml, u8 err) { - u32 i, level; + u32 i, level; - _CPU_ISR_Disable(level); + _CPU_ISR_Disable(level); - for(i=0; i= WPAD_MAX_WIIMOTES) + if (i >= WPAD_MAX_DEVICES) { - printf("WPAD Listen Slot Not Valid\n"); + //printf("WPAD Listen Slot Not Valid\n"); _CPU_ISR_Restore(level); return NULL; } if (err) { - printf("Connection error(%d)\n", err); + printf("WPAD Connection Error %d\n", err); __wpads_used &= ~(0x01<bdaddr.addr[5],wml->bdaddr.addr[4],wml->bdaddr.addr[3],wml->bdaddr.addr[2],wml->bdaddr.addr[1],wml->bdaddr.addr[0]); BYTES_FROM_BD_ADDR(__wpad_devs.active[i].bdaddr, &wml->bdaddr); _CPU_ISR_Restore(level); @@ -247,15 +247,15 @@ wiimote *__wpad_register_new(wiimote_listen *wml, u8 err) wiimote *wm; //printf("Registering Wiimote with system...\n"); - int guestEntry = CONF_PAD_MAX_GUESTS; + int guestEntry = CONF_PAD_MAX_ACTIVE; int registeredEntry = CONF_PAD_MAX_REGISTERED; - _CPU_ISR_Disable(level); + _CPU_ISR_Disable(level); wm = __wpad_assign_slot(wml, err); if (wm) { // Search for wml->bdaddr in guest registration list - for(i=0; ibdaddr,&bdaddr)) { //printf("Wiimote guest in slot %d\n", i); @@ -274,17 +274,13 @@ wiimote *__wpad_register_new(wiimote_listen *wml, u8 err) } } - if (BTE_GetPairMode() == PAIR_MODE_NORMAL) - { + if(BTE_GetPairMode() == PAIR_MODE_NORMAL) { // Not permanent pair, need to save wml->bdaddr as known controller - if (registeredEntry >= CONF_PAD_MAX_REGISTERED) - { + if(registeredEntry >= CONF_PAD_MAX_REGISTERED) { // If currently guest, we want to allow for upgrade to permanent pair - if (guestEntry < CONF_PAD_MAX_GUESTS) - { + if(guestEntry < CONF_PAD_MAX_ACTIVE) { // Wipe guest entry and shift later ones up - for (i = guestEntry; i < (__wpad_guests.num_guests - 1); i++) - { + for(i = guestEntry; i < (__wpad_guests.num_guests - 1); i++) { memcpy(&__wpad_guests.guests[i], &__wpad_guests.guests[i+1], sizeof(conf_pad_guest_device)); } memset(&__wpad_guests.guests[--__wpad_guests.num_guests], 0, sizeof(conf_pad_guest_device)); @@ -297,28 +293,23 @@ wiimote *__wpad_register_new(wiimote_listen *wml, u8 err) if (__wpad_devs.num_registered < CONF_PAD_MAX_REGISTERED) __wpad_devs.num_registered++; } - } - else if (registeredEntry >= CONF_PAD_MAX_REGISTERED) - { + } else if(registeredEntry >= CONF_PAD_MAX_REGISTERED) { // Not permanent pair, need to save bdaddr and link key as guest controller - if (guestEntry >= CONF_PAD_MAX_GUESTS) - { + if(guestEntry >= CONF_PAD_MAX_ACTIVE) { //printf("Saving Wiimote '%s' as guest...\n", wml->name); - memmove(&__wpad_guests.guests[1], &__wpad_guests.guests[0], sizeof(conf_pad_guest_device)*(CONF_PAD_MAX_GUESTS-1)); + memmove(&__wpad_guests.guests[1], &__wpad_guests.guests[0], sizeof(conf_pad_guest_device)*(CONF_PAD_MAX_ACTIVE-1)); BYTES_FROM_BD_ADDR(__wpad_guests.guests[0].bdaddr, &wml->bdaddr); memcpy(__wpad_guests.guests[0].name, wml->name, sizeof(__wpad_guests.guests[0].name)); - if (__wpad_guests.num_guests < CONF_PAD_MAX_GUESTS) + if (__wpad_guests.num_guests < CONF_PAD_MAX_ACTIVE) __wpad_guests.num_guests++; - for(i=0; ibdaddr,&__wpad_keys[i].bdaddr)) { u8 *src = __wpad_keys[i].key; u8 *dst = __wpad_guests.guests[0].link_key; //printf("Writing guest key: %02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x\n",__wpad_keys[i].key[0],__wpad_keys[i].key[1],__wpad_keys[i].key[2],__wpad_keys[i].key[3],__wpad_keys[i].key[4],__wpad_keys[i].key[5],__wpad_keys[i].key[6],__wpad_keys[i].key[7],__wpad_keys[i].key[8],__wpad_keys[i].key[9],__wpad_keys[i].key[10],__wpad_keys[i].key[11],__wpad_keys[i].key[12],__wpad_keys[i].key[13],__wpad_keys[i].key[14],__wpad_keys[i].key[15]); // Keys are stored in config backwards, like bdaddrs - for (j=0;j<16;j++) - { + for (j=0;j<16;j++) { dst[j] = src[15 - j]; } break; @@ -327,16 +318,13 @@ wiimote *__wpad_register_new(wiimote_listen *wml, u8 err) } } } - _CPU_ISR_Restore(level); + _CPU_ISR_Restore(level); return wm; } static s32 __wpad_setevtfilter_connsetup_finished(s32 result,void *usrdata) { - u32 i; - struct bd_addr bdaddr; - //printf("__wpad_setevtfilter_finished(%d)\n",result); if(result==ERR_OK) { @@ -349,6 +337,7 @@ static s32 __wpad_setevtfilter_inquiry_finished(s32 result,void *usrdata) { //printf("__wpad_setevtfilter_inquiry_finished(%d)\n",result); + // Filter connection setup to allow only gamepads u8 filter[] = {0x00, 0x05, 0x00, 0x00, 0x1F, 0x00, 0x01}; BTE_SetEvtFilter(0x02,0x01,filter,__wpad_setevtfilter_connsetup_finished); return ERR_OK; @@ -358,6 +347,7 @@ static s32 __wpad_init_finished(s32 result,void *usrdata) { //printf("__wpad_init_finished(%d)\n",result); + // Filter inquiry to allow only gamepads u8 filter[] = {0x00, 0x05, 0x00, 0x00, 0x1F, 0x00}; BTE_SetEvtFilter(0x01,0x01,filter,__wpad_setevtfilter_inquiry_finished); return ERR_OK; @@ -366,6 +356,7 @@ static s32 __wpad_init_finished(s32 result,void *usrdata) static s32 __wpad_patch_finished(s32 result,void *usrdata) { //printf("__wpad_patch_finished(%d)\n",result); + BTE_InitSub(__wpad_init_finished); return ERR_OK; } @@ -740,18 +731,24 @@ void __wpad_disconnectCB(struct bd_addr *pad_addr, u8 reason) int i; if(__wpads_inited == WPAD_STATE_ENABLED) { - for(i=0;iname, 13)) - { - printf("Found Wiimote %s:\n", info->name); - printf(" bdaddr: %02x:%02x:%02x:%02x:%02x:%02x\n",info->bdaddr.addr[5],info->bdaddr.addr[4],info->bdaddr.addr[3],info->bdaddr.addr[2],info->bdaddr.addr[1],info->bdaddr.addr[0]); + if(result == ERR_OK && info != NULL) { + if (!strncmp("Nintendo RVL-", (char *)info->name, 13)) { + //printf("Found controller %s:\n", info->name); + //printf(" bdaddr: %02x:%02x:%02x:%02x:%02x:%02x\n",info->bdaddr.addr[5],info->bdaddr.addr[4],info->bdaddr.addr[3],info->bdaddr.addr[2],info->bdaddr.addr[1],info->bdaddr.addr[0]); - // Check for Balance Board - BD_ADDR_FROM_BYTES(&(bdaddr),__wpad_devs.balance_board.bdaddr); - if(bd_addr_cmp(&info->bdaddr,&bdaddr)) { - if(!(__wpads_used & (1<= WPAD_MAX_WIIMOTES) - { - for(i=0; iname, 17)) { + // Check active list + for(i=0; ibdaddr,&bdaddr)) { //printf("Wiimote already active in slot %d\n", i); @@ -810,42 +788,56 @@ s32 __wpad_read_remote_name_finished(s32 result,void *userdata) break; } } - } - - // Not active, try to make active - if(slot >= WPAD_MAX_WIIMOTES) - { - for(i=0; i= CONF_PAD_MAX_WIIMOTES) { + for(i=0; ibdaddr,&bdaddr)) { + //printf("Non-Wiimote already active in slot %d\n", i); slot = i; break; } } + + // Not active, try to make active + if(slot >= CONF_PAD_MAX_ACTIVE) { + for(i=0; ibdaddr,info->name,__wpad_register_new); __wpads_used |= (0x01<name); - printf(" bdaddr: %02x:%02x:%02x:%02x:%02x:%02x\n",info->bdaddr.addr[5],info->bdaddr.addr[4],info->bdaddr.addr[3],info->bdaddr.addr[2],info->bdaddr.addr[1],info->bdaddr.addr[0]); + } else { + //printf("Found non-Wiimote %s:\n", info->name); + //printf(" bdaddr: %02x:%02x:%02x:%02x:%02x:%02x\n",info->bdaddr.addr[5],info->bdaddr.addr[4],info->bdaddr.addr[3],info->bdaddr.addr[2],info->bdaddr.addr[1],info->bdaddr.addr[0]); result = ERR_ARG; } } -end: if (info) free(info); return result; } @@ -887,7 +879,7 @@ static s32 GetRegisteredSlot(struct bd_addr *pad_addr) static s32 GetGuestSlot(struct bd_addr *pad_addr) { int i; - int slot = CONF_PAD_MAX_GUESTS; + int slot = CONF_PAD_MAX_ACTIVE; struct bd_addr bdaddr; for(i=0; i<__wpad_guests.num_guests; i++) { @@ -904,71 +896,63 @@ static s32 GetGuestSlot(struct bd_addr *pad_addr) static s8 __wpad_connreqCB(void *arg,struct bd_addr *pad_addr,u8 *cod,u8 link_type) { int i, j; - int slot = WPAD_MAX_WIIMOTES; + int slot = CONF_PAD_MAX_ACTIVE; struct bd_addr bdaddr; // Only accept connection requests (i.e. "press any button") if not doing guest pairing - if (BTE_GetPairMode() == PAIR_MODE_NORMAL) - { - if (!bd_addr_cmp(pad_addr,BD_ADDR_ANY)) - { - BD_ADDR_FROM_BYTES(&(bdaddr),__wpad_devs.balance_board.bdaddr); - if(bd_addr_cmp(pad_addr,&bdaddr)) { - printf("Balance Board wants to connect!\n"); - __wpads_used |= (0x01<= CONF_PAD_MAX_ACTIVE) { + for(i=0; i= CONF_PAD_MAX_WIIMOTES) { + slot = CONF_PAD_MAX_ACTIVE; + } + } else { + for(j=CONF_PAD_MAX_WIIMOTES; jaddr[5],pad_addr->addr[4],pad_addr->addr[3],pad_addr->addr[2],pad_addr->addr[1],pad_addr->addr[0]); + if(slot < CONF_PAD_MAX_ACTIVE) { + __wpads_used |= (0x01<addr[5],pad_addr->addr[4],pad_addr->addr[3],pad_addr->addr[2],pad_addr->addr[1],pad_addr->addr[0]); return ERR_VAL; } return ERR_CONN; @@ -977,19 +961,16 @@ static s8 __wpad_connreqCB(void *arg,struct bd_addr *pad_addr,u8 *cod,u8 link_ty static s8 __wpad_linkkeyreqCB(void *arg,struct bd_addr *pad_addr) { int i; - printf("__wpad_linkkeyreqCB\n"); + //printf("__wpad_linkkeyreqCB\n"); - for(i=0; i= CONF_PAD_TOTAL) - { + if(i >= CONF_PAD_TOTAL) { BTE_LinkKeyRequestNegativeReply(pad_addr); } @@ -1003,21 +984,18 @@ static s8 __wpad_linkkeynotCB(void *arg,struct bd_addr *pad_addr,u8 *key) //printf("__wpad_linkkeynotCB\n"); - for(i=0; icount); - if (result == ERR_OK && inq_res != NULL) - { + if(result == ERR_OK && inq_res != NULL) { // Filter out weird null values - for (i = 0; i < inq_res->count; i++) - { + for(i = 0; i < inq_res->count; i++) { struct inquiry_info_ex *info = &inq_res->info[i]; - if (!bd_addr_cmp(&info->bdaddr,BD_ADDR_ANY)) - { + if(!bd_addr_cmp(&info->bdaddr,BD_ADDR_ANY)) { // Read name of first valid controller //printf("Attempting to read name for bdaddr: %02x:%02x:%02x:%02x:%02x:%02x\n",info->bdaddr.addr[5],info->bdaddr.addr[4],info->bdaddr.addr[3],info->bdaddr.addr[2],info->bdaddr.addr[1],info->bdaddr.addr[0]); BTE_ReadRemoteName(&info->bdaddr, __wpad_read_remote_name_finished); @@ -1071,7 +1046,7 @@ s32 WPAD_WipeSavedControllers(void) _CPU_ISR_Disable(level); printf("Wiping saved controllers...\n"); - for(i=0;i CONF_PAD_MAX_GUESTS) { + if(__wpad_guests.num_guests > CONF_PAD_MAX_ACTIVE) { WPAD_Shutdown(); _CPU_ISR_Restore(level); return WPAD_ERR_BADCONF; @@ -1208,7 +1180,7 @@ s32 WPAD_Init(void) printf(" bdaddr: %02x:%02x:%02x:%02x:%02x:%02x\n",device->bdaddr[0],device->bdaddr[1],device->bdaddr[2],device->bdaddr[3],device->bdaddr[4],device->bdaddr[5]); }*/ - __wpads = wiiuse_init(WPAD_MAX_WIIMOTES,__wpad_eventCB); + __wpads = wiiuse_init(WPAD_MAX_DEVICES,__wpad_eventCB); if(__wpads==NULL) { WPAD_Shutdown(); _CPU_ISR_Restore(level); @@ -1252,7 +1224,7 @@ s32 WPAD_ReadEvent(s32 chan, WPADData *data) struct _wpad_cb *wpdcb = NULL; WPADData *lstate = NULL,*wpadd = NULL; - if(chan=WPAD_MAX_WIIMOTES) return WPAD_ERR_BAD_CHANNEL; + if(chan=WPAD_MAX_DEVICES) return WPAD_ERR_BAD_CHANNEL; _CPU_ISR_Disable(level); if(__wpads_inited==WPAD_STATE_DISABLED) { @@ -1305,7 +1277,7 @@ s32 WPAD_DroppedEvents(s32 chan) int dropped = 0; if(chan == WPAD_CHAN_ALL) { - for(i=WPAD_CHAN_0; i=WPAD_MAX_WIIMOTES) return WPAD_ERR_BAD_CHANNEL; + if(chan=WPAD_MAX_DEVICES) return WPAD_ERR_BAD_CHANNEL; _CPU_ISR_Disable(level); if(__wpads_inited==WPAD_STATE_DISABLED) { @@ -1335,7 +1307,7 @@ s32 WPAD_Flush(s32 chan) int i; int count = 0; if(chan == WPAD_CHAN_ALL) { - for(i=WPAD_CHAN_0; i= WPAD_ERR_NONE) count += ret; return count; @@ -1418,13 +1390,13 @@ s32 WPAD_SetDataFormat(s32 chan, s32 fmt) int i; if(chan == WPAD_CHAN_ALL) { - for(i=WPAD_CHAN_0; i=WPAD_MAX_WIIMOTES) return WPAD_ERR_BAD_CHANNEL; + if(chan=WPAD_MAX_DEVICES) return WPAD_ERR_BAD_CHANNEL; _CPU_ISR_Disable(level); if(__wpads_inited==WPAD_STATE_DISABLED) { @@ -1456,13 +1428,13 @@ s32 WPAD_SetMotionPlus(s32 chan, u8 enable) int i; if(chan == WPAD_CHAN_ALL) { - for(i=WPAD_CHAN_0; i=WPAD_MAX_WIIMOTES) return WPAD_ERR_BAD_CHANNEL; + if(chan=WPAD_MAX_DEVICES) return WPAD_ERR_BAD_CHANNEL; _CPU_ISR_Disable(level); if(__wpads_inited==WPAD_STATE_DISABLED) { @@ -1484,13 +1456,13 @@ s32 WPAD_SetVRes(s32 chan,u32 xres,u32 yres) int i; if(chan == WPAD_CHAN_ALL) { - for(i=WPAD_CHAN_0; i=WPAD_MAX_WIIMOTES) return WPAD_ERR_BAD_CHANNEL; + if(chan=WPAD_MAX_DEVICES) return WPAD_ERR_BAD_CHANNEL; _CPU_ISR_Disable(level); if(__wpads_inited==WPAD_STATE_DISABLED) { @@ -1523,7 +1495,7 @@ s32 WPAD_Probe(s32 chan,u32 *type) u32 level,dev; wiimote *wm = NULL; - if(chan=WPAD_MAX_WIIMOTES) return WPAD_ERR_BAD_CHANNEL; + if(chan=WPAD_MAX_DEVICES) return WPAD_ERR_BAD_CHANNEL; _CPU_ISR_Disable(level); if(__wpads_inited==WPAD_STATE_DISABLED) { @@ -1561,7 +1533,7 @@ s32 WPAD_SetEventBufs(s32 chan, WPADData *bufs, u32 cnt) u32 level; struct _wpad_cb *wpdcb = NULL; - if(chan=WPAD_MAX_WIIMOTES) return WPAD_ERR_BAD_CHANNEL; + if(chan=WPAD_MAX_DEVICES) return WPAD_ERR_BAD_CHANNEL; _CPU_ISR_Disable(level); wpdcb = &__wpdcb[chan]; @@ -1621,7 +1593,7 @@ s32 WPAD_Disconnect(s32 chan) u32 level, cnt = 0; struct _wpad_cb *wpdcb = NULL; - if(chan=WPAD_MAX_WIIMOTES) return WPAD_ERR_BAD_CHANNEL; + if(chan=WPAD_MAX_DEVICES) return WPAD_ERR_BAD_CHANNEL; _CPU_ISR_Disable(level); if(__wpads_inited==WPAD_STATE_DISABLED) { @@ -1657,7 +1629,7 @@ void WPAD_Shutdown(void) __wpads_inited = WPAD_STATE_DISABLED; SYS_RemoveAlarm(__wpad_timer); - for(i=0;isound_alarm); __wpad_disconnect(wpdcb); @@ -1695,13 +1667,13 @@ s32 WPAD_Rumble(s32 chan, int status) u32 level; if(chan == WPAD_CHAN_ALL) { - for(i=WPAD_CHAN_0; i=WPAD_MAX_WIIMOTES) return WPAD_ERR_BAD_CHANNEL; + if(chan=WPAD_MAX_DEVICES) return WPAD_ERR_BAD_CHANNEL; _CPU_ISR_Disable(level); if(__wpads_inited==WPAD_STATE_DISABLED) { @@ -1723,13 +1695,13 @@ s32 WPAD_SetIdleThresholds(s32 chan, s32 btns, s32 ir, s32 accel, s32 js, s32 wb u32 level; if(chan == WPAD_CHAN_ALL) { - for(i=WPAD_CHAN_0; i=WPAD_MAX_WIIMOTES) return WPAD_ERR_BAD_CHANNEL; + if(chan=WPAD_MAX_DEVICES) return WPAD_ERR_BAD_CHANNEL; _CPU_ISR_Disable(level); if(__wpads_inited==WPAD_STATE_DISABLED) { @@ -1756,13 +1728,13 @@ s32 WPAD_ControlSpeaker(s32 chan,s32 enable) u32 level; if(chan == WPAD_CHAN_ALL) { - for(i=WPAD_CHAN_0; i=WPAD_MAX_WIIMOTES) return WPAD_ERR_BAD_CHANNEL; + if(chan=WPAD_MAX_DEVICES) return WPAD_ERR_BAD_CHANNEL; _CPU_ISR_Disable(level); if(__wpads_inited==WPAD_STATE_DISABLED) { @@ -1785,7 +1757,7 @@ s32 WPAD_IsSpeakerEnabled(s32 chan) u32 level; wiimote *wm = NULL; - if(chan=WPAD_MAX_WIIMOTES) return WPAD_ERR_BAD_CHANNEL; + if(chan=WPAD_MAX_DEVICES) return WPAD_ERR_BAD_CHANNEL; _CPU_ISR_Disable(level); if(__wpads_inited==WPAD_STATE_DISABLED) { @@ -1810,7 +1782,7 @@ s32 WPAD_SendStreamData(s32 chan,void *buf,u32 len) struct timespec tb; wiimote *wm = NULL; - if(chan=WPAD_MAX_WIIMOTES) return WPAD_ERR_BAD_CHANNEL; + if(chan=WPAD_MAX_DEVICES) return WPAD_ERR_BAD_CHANNEL; _CPU_ISR_Disable(level); if(__wpads_inited==WPAD_STATE_DISABLED) { @@ -1856,60 +1828,60 @@ void WPAD_EncodeData(WPADEncStatus *info,u32 flag,const s16 *pcmSamples,s32 numS WPADData *WPAD_Data(int chan) { - if(chan<0 || chan>=WPAD_MAX_WIIMOTES) return NULL; + if(chan<0 || chan>=WPAD_MAX_DEVICES) return NULL; return &wpaddata[chan]; } u8 WPAD_BatteryLevel(int chan) { - if(chan<0 || chan>=WPAD_MAX_WIIMOTES) return 0; + if(chan<0 || chan>=WPAD_MAX_DEVICES) return 0; return wpaddata[chan].battery_level; } u32 WPAD_ButtonsUp(int chan) { - if(chan<0 || chan>=WPAD_MAX_WIIMOTES) return 0; + if(chan<0 || chan>=WPAD_MAX_DEVICES) return 0; return wpaddata[chan].btns_u; } u32 WPAD_ButtonsDown(int chan) { - if(chan<0 || chan>=WPAD_MAX_WIIMOTES) return 0; + if(chan<0 || chan>=WPAD_MAX_DEVICES) return 0; return wpaddata[chan].btns_d; } u32 WPAD_ButtonsHeld(int chan) { - if(chan<0 || chan>=WPAD_MAX_WIIMOTES) return 0; + if(chan<0 || chan>=WPAD_MAX_DEVICES) return 0; return wpaddata[chan].btns_h; } void WPAD_IR(int chan, struct ir_t *ir) { - if(chan<0 || chan>=WPAD_MAX_WIIMOTES || ir==NULL ) return; + if(chan<0 || chan>=WPAD_MAX_DEVICES || ir==NULL ) return; *ir = wpaddata[chan].ir; } void WPAD_Orientation(int chan, struct orient_t *orient) { - if(chan<0 || chan>=WPAD_MAX_WIIMOTES || orient==NULL ) return; + if(chan<0 || chan>=WPAD_MAX_DEVICES || orient==NULL ) return; *orient = wpaddata[chan].orient; } void WPAD_GForce(int chan, struct gforce_t *gforce) { - if(chan<0 || chan>=WPAD_MAX_WIIMOTES || gforce==NULL ) return; + if(chan<0 || chan>=WPAD_MAX_DEVICES || gforce==NULL ) return; *gforce = wpaddata[chan].gforce; } void WPAD_Accel(int chan, struct vec3w_t *accel) { - if(chan<0 || chan>=WPAD_MAX_WIIMOTES || accel==NULL ) return; + if(chan<0 || chan>=WPAD_MAX_DEVICES || accel==NULL ) return; *accel = wpaddata[chan].accel; } void WPAD_Expansion(int chan, struct expansion_t *exp) { - if(chan<0 || chan>=WPAD_MAX_WIIMOTES || exp==NULL ) return; + if(chan<0 || chan>=WPAD_MAX_DEVICES || exp==NULL ) return; *exp = wpaddata[chan].exp; } From d0d01916364c6d9193cfe5c7773491f08456c4be Mon Sep 17 00:00:00 2001 From: Zarithya Date: Tue, 1 Apr 2025 18:05:36 -0700 Subject: [PATCH 06/27] Fix some race conditions --- gc/bte/bte.h | 1 + gc/wiiuse/wpad.h | 5 +- lwbt/bte.c | 9 +++ lwbt/hci.c | 1 + lwbt/l2cap.c | 2 + wiiuse/io_wii.c | 7 ++- wiiuse/wpad.c | 148 +++++++++++++++++++++++++++++++++++------------ 7 files changed, 133 insertions(+), 40 deletions(-) diff --git a/gc/bte/bte.h b/gc/bte/bte.h index 757cab201..a730e644e 100644 --- a/gc/bte/bte.h +++ b/gc/bte/bte.h @@ -141,6 +141,7 @@ typedef s32 (*btecallback)(s32 result,void *userdata); void BTE_Init(void); void BTE_Shutdown(void); +void BTE_Stop(void); s32 BTE_InitCore(btecallback cb); s32 BTE_ApplyPatch(btecallback cb); s32 BTE_InitSub(btecallback cb); diff --git a/gc/wiiuse/wpad.h b/gc/wiiuse/wpad.h index b20a136a9..9c61e5f81 100644 --- a/gc/wiiuse/wpad.h +++ b/gc/wiiuse/wpad.h @@ -46,6 +46,9 @@ enum { WPAD_CHAN_5, WPAD_MAX_DEVICES, }; + +// Compatibility with old apps +#define WPAD_MAX_WIIMOTES WPAD_MAX_DEVICES #define WPAD_BUTTON_2 0x0001 #define WPAD_BUTTON_1 0x0002 @@ -188,7 +191,7 @@ s32 WPAD_Search(void); s32 WPAD_StopSearch(void); s32 WPAD_StartPairing(void); s32 WPAD_WipeSavedControllers(void); -void WPAD_Shutdown(void); +s32 WPAD_Shutdown(void); void WPAD_SetIdleTimeout(u32 seconds); void WPAD_SetPowerButtonCallback(WPADShutdownCallback cb); void WPAD_SetBatteryDeadCallback(WPADShutdownCallback cb); diff --git a/lwbt/bte.c b/lwbt/bte.c index 71cc5a517..814383910 100644 --- a/lwbt/bte.c +++ b/lwbt/bte.c @@ -399,6 +399,15 @@ void BTE_Init(void) SYS_SetPeriodicAlarm(btstate.timer_svc,&tb,&tb,bt_alarmhandler, NULL); } +void BTE_Stop(void) +{ + u32 level; + + _CPU_ISR_Disable(level); + hci_cmd_complete(NULL); + _CPU_ISR_Restore(level); +} + void BTE_Shutdown(void) { u32 level; diff --git a/lwbt/hci.c b/lwbt/hci.c index cc389fda2..3f430b44a 100644 --- a/lwbt/hci.c +++ b/lwbt/hci.c @@ -1767,6 +1767,7 @@ void hci_event_handler(struct pbuf *p) hci_conn_request_evt(p); break; case HCI_DISCONNECTION_COMPLETE: + printf("HCI_DISCONNECTION_COMPLETE\n"); switch(((u8_t*)p->payload)[0]) { case HCI_SUCCESS: for(link=hci_active_links;link!=NULL;link=link->next) { diff --git a/lwbt/l2cap.c b/lwbt/l2cap.c index fe0052f80..d99a6b787 100644 --- a/lwbt/l2cap.c +++ b/lwbt/l2cap.c @@ -1427,6 +1427,8 @@ void lp_disconnect_ind(struct bd_addr *bdaddr,u8_t reason) struct l2cap_pcb *pcb, *tpcb; err_t ret; + printf("lp_disconnect_ind\n"); + (void)ret; for(pcb = l2cap_active_pcbs; pcb != NULL;) { diff --git a/wiiuse/io_wii.c b/wiiuse/io_wii.c index 9171687f1..dd2772057 100644 --- a/wiiuse/io_wii.c +++ b/wiiuse/io_wii.c @@ -129,7 +129,12 @@ int wiiuse_register(struct wiimote_listen_t *wml, struct bd_addr *bdaddr, struct memset(wml->name, 0, sizeof(wml->name)); wml->assign_cb = assign_cb; if(wml->sock==NULL) + { + printf("wml->sock was null\n"); wml->sock = bte_new(); + } + else + printf("err: %d / state: %d / bdaddr: %02x:%02x:%02x:%02x:%02x:%02x\n", wml->sock->err, wml->sock->state, wml->sock->bdaddr.addr[5], wml->sock->bdaddr.addr[4], wml->sock->bdaddr.addr[3], wml->sock->bdaddr.addr[2], wml->sock->bdaddr.addr[1], wml->sock->bdaddr.addr[0]); bte_arg(wml->sock,wml); bte_received(wml->sock,__wiiuse_receive); @@ -171,7 +176,7 @@ int wiiuse_connect(struct wiimote_listen_t *wml, struct bd_addr *bdaddr, u8 *nam void wiiuse_disconnect(struct wiimote_t *wm) { - //printf("wiiuse_disconnect\n"); + printf("wiiuse_disconnect\n"); if(wm==NULL || wm->sock==NULL) return; diff --git a/wiiuse/wpad.c b/wiiuse/wpad.c index 6bcab9657..f6f7d6468 100644 --- a/wiiuse/wpad.c +++ b/wiiuse/wpad.c @@ -325,59 +325,99 @@ wiimote *__wpad_register_new(wiimote_listen *wml, u8 err) static s32 __wpad_setevtfilter_connsetup_finished(s32 result,void *usrdata) { - //printf("__wpad_setevtfilter_finished(%d)\n",result); + u32 i, level; + struct bd_addr bdaddr; + + printf("__wpad_setevtfilter_finished(%d)\n",result); - if(result==ERR_OK) { + _CPU_ISR_Disable(level); + if((result==ERR_OK) && (__wpads_inited==WPAD_STATE_ENABLING)) { + /*for(i=0;iwm; @@ -702,7 +744,7 @@ static void __wpad_eventCB(struct wiimote_t *wm,s32 event) __wpads_active |= (0x01<unid; wpdcb = &__wpdcb[chan]; wpdcb->wm = wm; @@ -716,7 +758,7 @@ static void __wpad_eventCB(struct wiimote_t *wm,s32 event) memset(&wpaddata[chan],0,sizeof(WPADData)); memset(wpdcb->queue_int,0,(sizeof(WPADData)*EVENTQUEUE_LENGTH)); __wpads_active &= ~(0x01<name, 13)) { //printf("Found controller %s:\n", info->name); //printf(" bdaddr: %02x:%02x:%02x:%02x:%02x:%02x\n",info->bdaddr.addr[5],info->bdaddr.addr[4],info->bdaddr.addr[3],info->bdaddr.addr[2],info->bdaddr.addr[1],info->bdaddr.addr[0]); - + + __lwp_thread_dispatchdisable(); if (!strncmp("Nintendo RVL-CNT-", (char *)info->name, 17)) { // Check active list for(i=0; iname); //printf(" bdaddr: %02x:%02x:%02x:%02x:%02x:%02x\n",info->bdaddr.addr[5],info->bdaddr.addr[4],info->bdaddr.addr[3],info->bdaddr.addr[2],info->bdaddr.addr[1],info->bdaddr.addr[0]); @@ -895,13 +949,16 @@ static s32 GetGuestSlot(struct bd_addr *pad_addr) static s8 __wpad_connreqCB(void *arg,struct bd_addr *pad_addr,u8 *cod,u8 link_type) { - int i, j; + int i, j, level; int slot = CONF_PAD_MAX_ACTIVE; struct bd_addr bdaddr; - + + printf("__wpad_connreqCB\n"); + // Only accept connection requests (i.e. "press any button") if not doing guest pairing if(BTE_GetPairMode() == PAIR_MODE_NORMAL) { if(!bd_addr_cmp(pad_addr,BD_ADDR_ANY)) { + __lwp_thread_dispatchdisable(); for(i=0; i=WPAD_MAX_DEVICES) return WPAD_ERR_BAD_CHANNEL; _CPU_ISR_Disable(level); - if(__wpads_inited==WPAD_STATE_DISABLED) { - _CPU_ISR_Restore(level); - return WPAD_ERR_NOT_READY; - } - - wpdcb = &__wpdcb[chan]; - __wpad_disconnect(wpdcb); + if(__wpads_inited==WPAD_STATE_ENABLED) { + wpdcb = &__wpdcb[chan]; + __wpad_disconnect(wpdcb); - _CPU_ISR_Restore(level); + _CPU_ISR_Restore(level); - while(__wpads_active&(0x01< 3000) break; + while(__wpads_used&(0x01< 3000) break; + } + } else { + _CPU_ISR_Restore(level); + err = WPAD_ERR_NOT_READY; } - return WPAD_ERR_NONE; + return err; } -void WPAD_Shutdown(void) +s32 WPAD_Shutdown(void) { + s32 err = WPAD_ERR_NONE; s32 i; u32 level; u32 cnt = 0; struct _wpad_cb *wpdcb = NULL; + + printf("WPAD_Shutdown\n"); _CPU_ISR_Disable(level); - + BTE_Stop(); + CONF_SetPadDevices(&__wpad_devs); CONF_SetPadGuestDevices(&__wpad_guests); CONF_SaveChanges(); @@ -1632,18 +1702,20 @@ void WPAD_Shutdown(void) for(i=0;isound_alarm); - __wpad_disconnect(wpdcb); + //__wpad_disconnect(wpdcb); } __wiiuse_sensorbar_enable(0); _CPU_ISR_Restore(level); - while(__wpads_active) { + while(__wpads_used) { usleep(50); if(++cnt > 3000) break; } BTE_Shutdown(); + + return err; } void WPAD_SetIdleTimeout(u32 seconds) From 57f29212b5606d83c780016618a0f5bf85f7e04b Mon Sep 17 00:00:00 2001 From: Zarithya Date: Tue, 1 Apr 2025 22:46:57 -0700 Subject: [PATCH 07/27] Stop sharing sockets! --- gc/bte/bte.h | 1 + lwbt/bte.c | 8 ++++++++ wiiuse/io_wii.c | 7 +++++++ wiiuse/wpad.c | 16 +++++++++++----- 4 files changed, 27 insertions(+), 5 deletions(-) diff --git a/gc/bte/bte.h b/gc/bte/bte.h index a730e644e..75325ec38 100644 --- a/gc/bte/bte.h +++ b/gc/bte/bte.h @@ -164,6 +164,7 @@ void BTE_WriteStoredLinkKey(struct bd_addr *bdaddr,u8 *key); void BTE_ClearStoredLinkKeys(void); struct bte_pcb* bte_new(void); +void bte_free(struct bte_pcb *pcb); void bte_arg(struct bte_pcb *pcb,void *arg); void bte_received(struct bte_pcb *pcb, s32 (*recv)(void *arg,void *buffer,u16 len)); void bte_disconnected(struct bte_pcb *pcb,s32 (disconn_cfm)(void *arg,struct bte_pcb *pcb,u8 err)); diff --git a/lwbt/bte.c b/lwbt/bte.c index 814383910..19798fe5c 100644 --- a/lwbt/bte.c +++ b/lwbt/bte.c @@ -645,6 +645,14 @@ struct bte_pcb* bte_new(void) return pcb; } +void bte_free(struct bte_pcb *pcb) +{ + if(pcb==NULL) return; + + LWP_CloseQueue(pcb->cmdq); + btmemb_free(&bte_pcbs, pcb); +} + s32 bte_registerdeviceasync(struct bte_pcb *pcb,struct bd_addr *bdaddr,s32 (*conn_cfm)(void *arg,struct bte_pcb *pcb,u8 err)) { u32 level; diff --git a/wiiuse/io_wii.c b/wiiuse/io_wii.c index dd2772057..70497632c 100644 --- a/wiiuse/io_wii.c +++ b/wiiuse/io_wii.c @@ -53,6 +53,9 @@ static s32 __wiiuse_disconnected(void *arg,struct bte_pcb *pcb,u8 err) if(wm->event_cb) wm->event_cb(wm,WIIUSE_DISCONNECT); + bte_free(wml->sock); + wml->sock = NULL; + wml->wm = NULL; return ERR_OK; } @@ -134,7 +137,11 @@ int wiiuse_register(struct wiimote_listen_t *wml, struct bd_addr *bdaddr, struct wml->sock = bte_new(); } else + { printf("err: %d / state: %d / bdaddr: %02x:%02x:%02x:%02x:%02x:%02x\n", wml->sock->err, wml->sock->state, wml->sock->bdaddr.addr[5], wml->sock->bdaddr.addr[4], wml->sock->bdaddr.addr[3], wml->sock->bdaddr.addr[2], wml->sock->bdaddr.addr[1], wml->sock->bdaddr.addr[0]); + bte_free(wml->sock); + wml->sock = bte_new(); + } bte_arg(wml->sock,wml); bte_received(wml->sock,__wiiuse_receive); diff --git a/wiiuse/wpad.c b/wiiuse/wpad.c index f6f7d6468..c43661eac 100644 --- a/wiiuse/wpad.c +++ b/wiiuse/wpad.c @@ -958,7 +958,8 @@ static s8 __wpad_connreqCB(void *arg,struct bd_addr *pad_addr,u8 *cod,u8 link_ty // Only accept connection requests (i.e. "press any button") if not doing guest pairing if(BTE_GetPairMode() == PAIR_MODE_NORMAL) { if(!bd_addr_cmp(pad_addr,BD_ADDR_ANY)) { - __lwp_thread_dispatchdisable(); + _CPU_ISR_Disable(level); + //__lwp_thread_dispatchdisable(); for(i=0; isound_alarm); + bte_free(__wpads_listen[i].sock); + __wpads_listen[i].sock = NULL; //__wpad_disconnect(wpdcb); } __wiiuse_sensorbar_enable(0); _CPU_ISR_Restore(level); - while(__wpads_used) { + /*while(__wpads_used) { usleep(50); if(++cnt > 3000) break; - } + }*/ BTE_Shutdown(); From 3cb9d09b9d237b56b445671f9a1eed007504e124 Mon Sep 17 00:00:00 2001 From: Zarithya Date: Wed, 2 Apr 2025 00:02:51 -0700 Subject: [PATCH 08/27] Properly wait for USB to close --- gc/bte/bte.h | 2 +- lwbt/bte.c | 3 ++- lwbt/physbusif.c | 4 +++- wiiuse/io_wii.c | 41 ++++++++++++++++++++++++++++------------- wiiuse/wpad.c | 8 +------- 5 files changed, 35 insertions(+), 23 deletions(-) diff --git a/gc/bte/bte.h b/gc/bte/bte.h index 75325ec38..125f44bf3 100644 --- a/gc/bte/bte.h +++ b/gc/bte/bte.h @@ -141,7 +141,7 @@ typedef s32 (*btecallback)(s32 result,void *userdata); void BTE_Init(void); void BTE_Shutdown(void); -void BTE_Stop(void); +void BTE_Close(void); s32 BTE_InitCore(btecallback cb); s32 BTE_ApplyPatch(btecallback cb); s32 BTE_InitSub(btecallback cb); diff --git a/lwbt/bte.c b/lwbt/bte.c index 19798fe5c..034ecce8b 100644 --- a/lwbt/bte.c +++ b/lwbt/bte.c @@ -399,7 +399,7 @@ void BTE_Init(void) SYS_SetPeriodicAlarm(btstate.timer_svc,&tb,&tb,bt_alarmhandler, NULL); } -void BTE_Stop(void) +void BTE_Close(void) { u32 level; @@ -425,6 +425,7 @@ void BTE_Shutdown(void) hci_cmd_complete(__bte_shutdown_finished); hci_reset(); __bte_waitcmdfinish(&btstate); + LWP_CloseQueue(btstate.hci_cmdq); _CPU_ISR_Restore(level); physbusif_shutdown(); diff --git a/lwbt/physbusif.c b/lwbt/physbusif.c index 88e9be76e..cda055c9a 100644 --- a/lwbt/physbusif.c +++ b/lwbt/physbusif.c @@ -299,7 +299,9 @@ void physbusif_close(void) void physbusif_shutdown(void) { if(__usbdev.openstate!=0x0004) return; - USB_CloseDeviceAsync(&__usbdev.fd,__usb_closeCB,NULL); + //USB_CloseDeviceAsync(&__usbdev.fd,__usb_closeCB,NULL); + USB_CloseDevice(&__usbdev.fd); + __usbdev.fd = -1; } void physbusif_reset_all(void) diff --git a/wiiuse/io_wii.c b/wiiuse/io_wii.c index 70497632c..82e13c737 100644 --- a/wiiuse/io_wii.c +++ b/wiiuse/io_wii.c @@ -55,7 +55,7 @@ static s32 __wiiuse_disconnected(void *arg,struct bte_pcb *pcb,u8 err) bte_free(wml->sock); wml->sock = NULL; - + wml->wm = NULL; return ERR_OK; } @@ -131,25 +131,28 @@ int wiiuse_register(struct wiimote_listen_t *wml, struct bd_addr *bdaddr, struct bd_addr_set(&(wml->bdaddr),bdaddr); memset(wml->name, 0, sizeof(wml->name)); wml->assign_cb = assign_cb; - if(wml->sock==NULL) + + if(wml->sock!=NULL) { - printf("wml->sock was null\n"); - wml->sock = bte_new(); + printf("wiiuse_register: wml->sock was not NULL!\n"); + return 0; } - else + + wml->sock = bte_new(); + if (wml->sock==NULL) { - printf("err: %d / state: %d / bdaddr: %02x:%02x:%02x:%02x:%02x:%02x\n", wml->sock->err, wml->sock->state, wml->sock->bdaddr.addr[5], wml->sock->bdaddr.addr[4], wml->sock->bdaddr.addr[3], wml->sock->bdaddr.addr[2], wml->sock->bdaddr.addr[1], wml->sock->bdaddr.addr[0]); - bte_free(wml->sock); - wml->sock = bte_new(); + printf("wiiuse_register: bte_new failed to alloc new sock\n"); + return 0; } - + bte_arg(wml->sock,wml); bte_received(wml->sock,__wiiuse_receive); bte_disconnected(wml->sock,__wiiuse_disconnected); err = bte_registerdeviceasync(wml->sock,bdaddr,__wiiuse_connected); if(err==ERR_OK) return 1; - + + printf("wiiuse_register: bte_registerdeviceasync failed(%d)\n", err); return 0; } @@ -166,9 +169,20 @@ int wiiuse_connect(struct wiimote_listen_t *wml, struct bd_addr *bdaddr, u8 *nam strncpy((char *)wml->name, (char *)name, sizeof(wml->name)); wml->name[sizeof(wml->name) - 1] = 0x00; wml->assign_cb = assign_cb; - if(wml->sock==NULL) - wml->sock = bte_new(); + if(wml->sock!=NULL) + { + printf("wiiuse_connect: wml->sock was not NULL!\n"); + return 0; + } + + wml->sock = bte_new(); + if (wml->sock==NULL) + { + printf("wiiuse_connect: bte_new failed to alloc new sock\n"); + return 0; + } + bte_arg(wml->sock,wml); bte_received(wml->sock,__wiiuse_receive); bte_disconnected(wml->sock,__wiiuse_disconnected); @@ -177,7 +191,8 @@ int wiiuse_connect(struct wiimote_listen_t *wml, struct bd_addr *bdaddr, u8 *nam err = bte_connectdeviceasync(wml->sock,bdaddr,__wiiuse_connected); if(err==ERR_OK) return 1; - + + printf("wiiuse_connect: bte_registerdeviceasync failed(%d)\n", err); return 0; } diff --git a/wiiuse/wpad.c b/wiiuse/wpad.c index c43661eac..d5a0258dc 100644 --- a/wiiuse/wpad.c +++ b/wiiuse/wpad.c @@ -1695,7 +1695,7 @@ s32 WPAD_Shutdown(void) printf("WPAD_Shutdown\n"); _CPU_ISR_Disable(level); - BTE_Stop(); + BTE_Close(); CONF_SetPadDevices(&__wpad_devs); CONF_SetPadGuestDevices(&__wpad_guests); @@ -1708,17 +1708,11 @@ s32 WPAD_Shutdown(void) SYS_RemoveAlarm(wpdcb->sound_alarm); bte_free(__wpads_listen[i].sock); __wpads_listen[i].sock = NULL; - //__wpad_disconnect(wpdcb); } __wiiuse_sensorbar_enable(0); _CPU_ISR_Restore(level); - /*while(__wpads_used) { - usleep(50); - if(++cnt > 3000) break; - }*/ - BTE_Shutdown(); return err; From 4d5665a004288c2430663b5d370adc8eba142b97 Mon Sep 17 00:00:00 2001 From: Zarithya Date: Wed, 2 Apr 2025 14:08:38 -0700 Subject: [PATCH 09/27] Remove listen PCB when opening new connection --- lwbt/l2cap.c | 3 +++ 1 file changed, 3 insertions(+) diff --git a/lwbt/l2cap.c b/lwbt/l2cap.c index d99a6b787..a63ed1254 100644 --- a/lwbt/l2cap.c +++ b/lwbt/l2cap.c @@ -342,6 +342,9 @@ void l2cap_process_sig(struct pbuf *q, struct l2cap_hdr *l2caphdr, struct bd_add pcb->state = L2CAP_CONFIG; L2CAP_REG(&l2cap_active_pcbs, pcb); + + /* Free the listening pcb, don't need it anymore */ + l2cap_close((struct l2cap_pcb *)lpcb); LOG("l2cap_process_sig: A connection request was received. Send a response\n"); data = btpbuf_alloc(PBUF_RAW, L2CAP_CONN_RSP_SIZE, PBUF_RAM); From 56bda29c4d578f9cf83587aadf401d2e796730e6 Mon Sep 17 00:00:00 2001 From: Zarithya Date: Tue, 6 May 2025 20:36:17 -0700 Subject: [PATCH 10/27] Correctly free socket on wiimote disconnect --- wiiuse/io_wii.c | 4 ---- wiiuse/wpad.c | 8 ++++++++ 2 files changed, 8 insertions(+), 4 deletions(-) diff --git a/wiiuse/io_wii.c b/wiiuse/io_wii.c index 82e13c737..bbbdea29e 100644 --- a/wiiuse/io_wii.c +++ b/wiiuse/io_wii.c @@ -53,9 +53,6 @@ static s32 __wiiuse_disconnected(void *arg,struct bte_pcb *pcb,u8 err) if(wm->event_cb) wm->event_cb(wm,WIIUSE_DISCONNECT); - bte_free(wml->sock); - wml->sock = NULL; - wml->wm = NULL; return ERR_OK; } @@ -204,7 +201,6 @@ void wiiuse_disconnect(struct wiimote_t *wm) WIIMOTE_DISABLE_STATE(wm,WIIMOTE_STATE_CONNECTED); bte_disconnect(wm->sock); - wm->sock = NULL; } void wiiuse_sensorbar_enable(int enable) diff --git a/wiiuse/wpad.c b/wiiuse/wpad.c index d5a0258dc..5ec17523d 100644 --- a/wiiuse/wpad.c +++ b/wiiuse/wpad.c @@ -54,6 +54,7 @@ distribution. #define EVENTQUEUE_LENGTH 16 #define DISCONNECT_TIMEOUT 0x08 /* HCI_CONN_TIMEOUT */ +#define DISCONNECT_USER_ENDED 0x13 /* HCI_OTHER_END_TERMINATED_CONN_USER_ENDED */ #define DISCONNECT_BATTERY_DIED 0x14 /* HCI_OTHER_END_TERMINATED_CONN_LOW_RESOURCES */ #define DISCONNECT_POWER_OFF 0x15 /* HCI_OTHER_END_TERMINATED_CONN_ABOUT_TO_POWER_OFF */ #define DISCONNECT_IDLE_TIMEOUT 0x16 /* HCI_CONN_TERMINATED_BY_LOCAL_HOST */ @@ -793,10 +794,15 @@ void __wpad_disconnectCB(struct bd_addr *pad_addr, u8 reason) case DISCONNECT_TIMEOUT: // Controller stopped responding for an unknown reason break; + case DISCONNECT_USER_ENDED: + printf("WPAD User Disconnect (what?)\n"); + break; default: printf("WPAD Unknown Disconnect Reason(%d)\n", reason); break; } + bte_free(__wpads_listen[i].sock); + __wpads_listen[i].sock = NULL; __wpads_used &= ~(0x01< Date: Thu, 8 May 2025 01:15:20 -0700 Subject: [PATCH 11/27] Start making it act like SM --- gc/bte/bte.h | 3 + lwbt/bte.c | 63 ++++++++++++++- lwbt/hci.c | 219 +++++++++++++++++++++++++++++++++++++++++++++++++- lwbt/hci.h | 20 +++++ lwbt/l2cap.c | 2 +- wiiuse/wpad.c | 11 +++ 6 files changed, 312 insertions(+), 6 deletions(-) diff --git a/gc/bte/bte.h b/gc/bte/bte.h index 125f44bf3..10ca4cc0c 100644 --- a/gc/bte/bte.h +++ b/gc/bte/bte.h @@ -149,6 +149,9 @@ s32 BTE_ReadStoredLinkKey(struct linkkey_info *keys,u8 max_cnt,btecallback cb); s32 BTE_ReadBdAddr(struct bd_addr *bdaddr, btecallback cb); s32 BTE_SetEvtFilter(u8 filter_type,u8 filter_cond_type,u8 *cond, btecallback cb); s32 BTE_ReadRemoteName(struct bd_addr *bdaddr, btecallback cb); +s32 BTE_ReadClockOffset(struct bd_addr *bdaddr, btecallback cb); +s32 BTE_ReadRemoteVersionInfo(struct bd_addr *bdaddr, btecallback cb); +s32 BTE_ReadRemoteFeatures(struct bd_addr *bdaddr, btecallback cb); s32 BTE_Inquiry(u8 max_cnt,u8 flush, btecallback cb); s32 BTE_PeriodicInquiry(u8 max_cnt,u8 flush,btecallback cb); s32 BTE_ExitPeriodicInquiry(void); diff --git a/lwbt/bte.c b/lwbt/bte.c index 034ecce8b..455629500 100644 --- a/lwbt/bte.c +++ b/lwbt/bte.c @@ -94,6 +94,7 @@ 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); +err_t acl_auth_complete(void *arg,struct bd_addr *bdaddr); err_t l2cap_disconnect_cfm(void *arg, struct l2cap_pcb *pcb); err_t l2cap_disconnected_ind(void *arg, struct l2cap_pcb *pcb, err_t err); @@ -390,6 +391,7 @@ void BTE_Init(void) hci_wlp_complete(acl_wlp_completed); 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); @@ -545,6 +547,54 @@ s32 BTE_ReadRemoteName(struct bd_addr *bdaddr, btecallback cb) return last_err; } +s32 BTE_ReadClockOffset(struct bd_addr *bdaddr, btecallback cb) +{ + u32 level; + err_t last_err = ERR_OK; + + _CPU_ISR_Disable(level); + btstate.cb = cb; + btstate.usrdata = NULL; + btstate.hci_cmddone = 0; + hci_arg(&btstate); + hci_read_clock_offset(bdaddr); + _CPU_ISR_Restore(level); + + return last_err; +} + +/*s32 BTE_ReadRemoteVersionInfo(struct bd_addr *bdaddr, btecallback cb) +{ + u32 level; + err_t last_err = ERR_OK; + + _CPU_ISR_Disable(level); + btstate.cb = cb; + btstate.usrdata = NULL; + btstate.hci_cmddone = 0; + hci_arg(&btstate); + hci_read_remote_version_info(bdaddr); + _CPU_ISR_Restore(level); + + return last_err; +} + +s32 BTE_ReadRemoteFeatures(struct bd_addr *bdaddr, btecallback cb) +{ + u32 level; + err_t last_err = ERR_OK; + + _CPU_ISR_Disable(level); + btstate.cb = cb; + btstate.usrdata = NULL; + btstate.hci_cmddone = 0; + hci_arg(&btstate); + hci_read_remote_features(bdaddr); + _CPU_ISR_Restore(level); + + return last_err; +}*/ + s32 BTE_LinkKeyRequestReply(struct bd_addr *bdaddr,u8 *key) { u32 level; @@ -1022,6 +1072,15 @@ err_t acl_conn_complete(void *arg,struct bd_addr *bdaddr) //printf("acl_conn_complete\n"); //memcpy(&(btstate.acl_bdaddr),bdaddr,6); + hci_auth_req(bdaddr); + return ERR_OK; +} + +err_t acl_auth_complete(void *arg,struct bd_addr *bdaddr) +{ + //printf("acl_auth_complete\n"); + //memcpy(&(btstate.acl_bdaddr),bdaddr,6); + hci_write_link_policy_settings(bdaddr,0x0005); return ERR_OK; } @@ -1593,11 +1652,11 @@ err_t bte_hci_initsub_complete(void *arg,struct hci_pcb *pcb,u8_t ogf,u8_t ocf,u } else err = ERR_CONN; } else if(ocf==HCI_W_SCAN_EN_OCF) { - if(result==HCI_SUCCESS) { + /* if(result==HCI_SUCCESS) { hci_write_authentication_enable(0x01); } else err = ERR_CONN; - } else if(ocf==HCI_W_AUTH_ENABLE_OCF) { + } else if(ocf==HCI_W_AUTH_ENABLE_OCF) {*/ if(result==HCI_SUCCESS) { hci_cmd_complete(NULL); return __bte_cmdfinish(state,ERR_OK); diff --git a/lwbt/hci.c b/lwbt/hci.c index 3f430b44a..61934adbe 100644 --- a/lwbt/hci.c +++ b/lwbt/hci.c @@ -246,6 +246,19 @@ void hci_connection_complete(err_t (* conn_complete)(void *arg, struct bd_addr * hci_dev->conn_complete = conn_complete; } +/*-----------------------------------------------------------------------------------*/ +/* + * hci_auth_complete(): + * + * Used to specify the function that should be called when HCI has received a + * connection complete event. + */ +/*-----------------------------------------------------------------------------------*/ +void hci_auth_complete(err_t (* auth_complete)(void *arg, struct bd_addr *bdaddr)) +{ + hci_dev->auth_complete = auth_complete; +} + /*-----------------------------------------------------------------------------------*/ /* * hci_wlp_complete(): @@ -286,6 +299,7 @@ err_t hci_reg_dev_info(struct bd_addr *bdaddr,u8_t *cod,u8_t psrm,u8_t psm,u16_t static struct pbuf* hci_cmd_ass(struct pbuf *p,u8_t ocf,u8_t ogf,u8_t len) { + memset(p, 0, len); ((u8_t*)p->payload)[0] = HCI_COMMAND_DATA_PACKET; /* cmd packet type */ ((u8_t*)p->payload)[1] = (ocf&0xff); /* OCF & OGF */ ((u8_t*)p->payload)[2] = ((ocf>>8)|(ogf<<2)); @@ -713,7 +727,75 @@ err_t hci_read_remote_name(struct bd_addr *bdaddr) btpbuf_free(p); return ERR_OK; +} + +err_t hci_read_clock_offset(struct bd_addr *bdaddr) +{ + struct pbuf *p = NULL; + struct hci_link *link; + + /* Check if an ACL connection exists */ + link = hci_get_link(bdaddr); + + if(link == NULL) { + ERROR("hci_read_clock_offset: ACL connection does not exist\n"); + return ERR_CONN; + } + + if((p=btpbuf_alloc(PBUF_RAW,HCI_R_CLOCK_OFFSET_PLEN,PBUF_RAM))==NULL) { + ERROR("hci_read_clock_offset: Could not allocate memory for pbuf\n"); + return ERR_MEM; + } + + /* Assembling command packet */ + p = hci_cmd_ass(p,HCI_R_CLOCK_OFFSET_OCF,HCI_LINK_CTRL_OGF,HCI_R_CLOCK_OFFSET_PLEN); + /* Assembling cmd prameters */ + ((u16_t *)p->payload)[2] = htole16(link->connhdl); + + physbusif_output(p, p->tot_len); + btpbuf_free(p); + return ERR_OK; +} + +err_t hci_read_remote_version_info(u16_t connhdl) +{ + struct pbuf *p = NULL; + + if((p=btpbuf_alloc(PBUF_RAW,HCI_R_REMOTE_VERSION_INFO_PLEN,PBUF_RAM))==NULL) { + ERROR("hci_read_remote_version_info: Could not allocate memory for pbuf\n"); + return ERR_MEM; + } + + /* Assembling command packet */ + p = hci_cmd_ass(p,HCI_R_REMOTE_VERSION_INFO_OCF,HCI_LINK_CTRL_OGF,HCI_R_REMOTE_VERSION_INFO_PLEN); + /* Assembling cmd prameters */ + ((u16_t *)p->payload)[2] = htole16(connhdl); + + physbusif_output(p, p->tot_len); + btpbuf_free(p); + + return ERR_OK; +} + +err_t hci_read_remote_features(u16_t connhdl) +{ + struct pbuf *p = NULL; + + if((p=btpbuf_alloc(PBUF_RAW,HCI_R_REMOTE_FEATURES_PLEN,PBUF_RAM))==NULL) { + ERROR("hci_read_remote_features: Could not allocate memory for pbuf\n"); + return ERR_MEM; + } + + /* Assembling command packet */ + p = hci_cmd_ass(p,HCI_R_REMOTE_FEATURES_OCF,HCI_LINK_CTRL_OGF,HCI_R_REMOTE_FEATURES_PLEN); + /* Assembling cmd prameters */ + ((u16_t *)p->payload)[2] = htole16(connhdl); + + physbusif_output(p, p->tot_len); + btpbuf_free(p); + + return ERR_OK; } err_t hci_write_inquiry_mode(u8_t mode) @@ -833,6 +915,42 @@ err_t hci_sniff_mode(struct bd_addr *bdaddr, u16_t max_interval, u16_t min_inter return ERR_OK; } + +/*-----------------------------------------------------------------------------------*/ +/* hci_auth_req(): + * + * Control the modes (park, sniff, hold) that an ACL connection can take. + * + */ +/*-----------------------------------------------------------------------------------*/ +err_t hci_auth_req(struct bd_addr *bdaddr) +{ + struct pbuf *p; + struct hci_link *link; + + /* Check if an ACL connection exists */ + link = hci_get_link(bdaddr); + + if(link == NULL) { + ERROR("hci_auth_req: ACL connection does not exist\n"); + return ERR_CONN; + } + + if( (p = btpbuf_alloc(PBUF_TRANSPORT, HCI_AUTH_REQUESTED_PLEN, PBUF_RAM)) == NULL) { /* Alloc len of packet */ + ERROR("hci_auth_req: Could not allocate memory for pbuf\n"); + return ERR_MEM; + } + /* Assembling command packet */ + p = hci_cmd_ass(p, HCI_AUTH_REQUESTED_OCF, HCI_LINK_CTRL_OGF, HCI_AUTH_REQUESTED_PLEN); + + /* Assembling cmd prameters */ + ((u16_t *)p->payload)[2] = htole16(link->connhdl); + + physbusif_output(p, p->tot_len); + btpbuf_free(p); + return ERR_OK; +} + /*-----------------------------------------------------------------------------------*/ /* hci_write_link_policy_settings(): * @@ -868,6 +986,7 @@ err_t hci_write_link_policy_settings(struct bd_addr *bdaddr, u16_t link_policy) btpbuf_free(p); return ERR_OK; } + /*-----------------------------------------------------------------------------------*/ /* hci_write_authentication_enable(): * @@ -953,7 +1072,6 @@ err_t hci_link_key_req_reply(struct bd_addr *bdaddr, unsigned char *link_key) return ERR_OK; } - /*-----------------------------------------------------------------------------------*/ /* hci_pin_code_request_neg_reply(): * @@ -1621,13 +1739,35 @@ static void hci_conn_complete_evt(struct pbuf *p) } break; case HCI_PAGE_TIMEOUT: + ERROR("hci_conn_complete_evt: Page timeout\n"); + if(link!=NULL) { + hci_close(link); + lp_connect_cfm(bdaddr,((u8_t*)p->payload)[10],ERR_CONN); + } + break; + case HCI_CONN_TIMEOUT: ERROR("hci_conn_complete_evt: Timeout\n"); if(link!=NULL) { hci_close(link); lp_connect_cfm(bdaddr,((u8_t*)p->payload)[10],ERR_CONN); } break; + case HCI_HOST_REJECTED_DUE_TO_SECURITY_REASONS: + ERROR("hci_conn_complete_evt: Host rejected due to security reasons (device not paired?)\n"); + if(link!=NULL) { + hci_close(link); + lp_connect_cfm(bdaddr,((u8_t*)p->payload)[10],ERR_CONN); + } + break; + case HCI_PAIRING_NOT_ALLOWED: + ERROR("hci_conn_complete_evt: Pairing not allowed\n"); + if(link!=NULL) { + hci_close(link); + lp_connect_cfm(bdaddr,((u8_t*)p->payload)[10],ERR_CONN); + } + break; default: + ERROR("hci_conn_complete_evt: Unknown error %d\n", ((u8_t*)p->payload)[0]); if(link!=NULL) { hci_close(link); lp_connect_cfm(bdaddr,((u8_t*)p->payload)[10],ERR_CONN); @@ -1690,6 +1830,56 @@ static void hci_inquiry_result_with_rssi_evt(struct pbuf *p) } +static void hci_read_remote_features_complete_evt(struct pbuf *p) +{ + u16_t conn_handle; + + switch(((u8_t*)p->payload)[0]) { + case HCI_SUCCESS: + conn_handle = le16toh(*((u16_t*)(((u8_t*)p->payload)+1))); + //hci_read_remote_features(conn_handle); + break; + default: + break; + } +} + +static void hci_read_remote_version_info_complete_evt(struct pbuf *p) +{ + u16_t conn_handle; + u8_t version; + u16_t manufacturer_name; + u16_t subversion; + + switch(((u8_t*)p->payload)[0]) { + case HCI_SUCCESS: + conn_handle = le16toh(*((u16_t*)(((u8_t*)p->payload)+1))); + version = ((u8_t*)p->payload)[3]; + manufacturer_name = le16toh(*((u16_t*)(((u8_t*)p->payload)+4))); + subversion = le16toh(*((u16_t*)(((u8_t*)p->payload)+5))); + hci_read_remote_features(conn_handle); + break; + default: + break; + } +} + +static void hci_read_clock_offset_complete_evt(struct pbuf *p) +{ + u16_t conn_handle; + u16_t clock_offset; + + switch(((u8_t*)p->payload)[0]) { + case HCI_SUCCESS: + conn_handle = le16toh(*((u16_t*)(((u8_t*)p->payload)+1))); + clock_offset = le16toh(*((u16_t*)(((u8_t*)p->payload)+3))); + hci_read_remote_version_info(conn_handle); + break; + default: + break; + } +} + static void hci_return_link_key_evt(struct pbuf *p) { u8_t num_keys; @@ -1747,7 +1937,7 @@ void hci_event_handler(struct pbuf *p) evthdr = p->payload; btpbuf_header(p,-HCI_EVENT_HDR_LEN); - //printf("HCI_EVENT %02X\n", evthdr->code); + printf("HCI_EVENT %02X\n", evthdr->code); switch(evthdr->code) { case HCI_INQUIRY_COMPLETE: @@ -1782,12 +1972,32 @@ void hci_event_handler(struct pbuf *p) return; } break; + case HCI_AUTH_COMPLETE: + switch(((u8_t*)p->payload)[0]) { + case HCI_SUCCESS: + for(link=hci_active_links;link!=NULL;link=link->next) { + if(link->connhdl==le16toh(*((u16_t*)(((u8_t*)p->payload)+1)))) break; + } + if(link!=NULL) { + HCI_EVENT_AUTH_COMPLETE(hci_dev,&(link->bdaddr),ret); + } + break; + default: + return; + } + break; case HCI_REMOTE_NAME_REQ_COMPLETE: bdaddr = (void *)(((u8_t *)p->payload)+1); /* Get the Bluetooth address */ HCI_EVENT_REMOTE_NAME_REQ_COMPLETE(hci_dev,bdaddr,(((u8_t*)p->payload)+7),((u8_t*)p->payload)[0],ret); break; case HCI_ENCRYPTION_CHANGE: break; + case HCI_READ_REMOTE_FEATURES_COMPLETE: + hci_read_remote_features_complete_evt(p); + break; + case HCI_READ_REMOTE_VERSION_COMPLETE: + hci_read_remote_version_info_complete_evt(p); + break; case HCI_QOS_SETUP_COMPLETE: break; case HCI_COMMAND_COMPLETE: @@ -1860,7 +2070,10 @@ void hci_event_handler(struct pbuf *p) //TODO: IS THIS FATAL???? break; case HCI_MAX_SLOTS_CHANGE: - break; + break; + case HCI_READ_CLOCK_OFFSET_COMPLETE: + hci_read_clock_offset_complete_evt(p); + break; case HCI_RETURN_LINK_KEYS: hci_return_link_key_evt(p); break; diff --git a/lwbt/hci.h b/lwbt/hci.h index eba0d4596..0972f96b1 100644 --- a/lwbt/hci.h +++ b/lwbt/hci.h @@ -73,6 +73,7 @@ /* Link control commands */ #define HCI_INQUIRY_OCF 0x01 +#define HCI_INQUIRY_CANCEL_OCF 0x02 #define HCI_PERIODIC_INQUIRY_OCF 0x03 #define HCI_EXIT_PERIODIC_INQUIRY_OCF 0x04 #define HCI_CREATE_CONN_OCF 0x05 @@ -83,8 +84,13 @@ #define HCI_LINK_KEY_REQ_NEG_REP_OCF 0x0C #define HCI_PIN_CODE_REQ_REP_OCF 0x0D #define HCI_PIN_CODE_REQ_NEG_REP_OCF 0x0E +#define HCI_CHANGE_CONN_PACKET_TYPE_OCF 0x0F +#define HCI_AUTH_REQUESTED_OCF 0x11 #define HCI_SET_CONN_ENCRYPT_OCF 0x13 #define HCI_R_REMOTE_NAME_OCF 0x19 +#define HCI_R_REMOTE_FEATURES_OCF 0x1B +#define HCI_R_REMOTE_VERSION_INFO_OCF 0x1D +#define HCI_R_CLOCK_OFFSET_OCF 0x1F /* Link Policy commands */ #define HCI_HOLD_MODE_OCF 0x01 @@ -112,6 +118,7 @@ #define HCI_SET_HC_TO_H_FC_OCF 0x31 #define HCI_HOST_BUF_SIZE_OCF 0x33 #define HCI_HOST_NUM_COMPL_OCF 0x35 +#define HCI_W_LINK_SUP_TIMEOUT_OCF 0x37 #define HCI_R_CUR_IACLAP_OCF 0x39 #define HCI_W_INQUIRY_SCAN_TYPE_OCF 0x43 #define HCI_W_INQUIRY_MODE_OCF 0x45 @@ -150,8 +157,12 @@ #define HCI_LINK_KEY_REQ_NEG_REP_PLEN 10 #define HCI_PIN_CODE_REQ_REP_PLEN 27 #define HCI_PIN_CODE_REQ_NEG_REP_PLEN 10 +#define HCI_AUTH_REQUESTED_PLEN 6 #define HCI_SET_CONN_ENCRYPT_PLEN 7 #define HCI_R_REMOTE_NAME_PLEN 14 +#define HCI_R_REMOTE_FEATURES_PLEN 6 +#define HCI_R_REMOTE_VERSION_INFO_PLEN 6 +#define HCI_R_CLOCK_OFFSET_PLEN 6 /* Link Policy Commands */ #define HCI_SNIFF_MODE_PLEN 14 @@ -374,6 +385,7 @@ struct hci_pcb err_t (*cmd_complete)(void *arg,struct hci_pcb *pcb,u8_t ogf,u8_t ocf,u8_t result); err_t (*link_key_not)(void *arg, struct bd_addr *bdaddr, u8_t *key); err_t (*conn_complete)(void *arg,struct bd_addr *bdaddr); + err_t (*auth_complete)(void *arg,struct bd_addr *bdaddr); err_t (*inq_complete)(void *arg,struct hci_pcb *pcb,struct hci_inq_res *ires,u16_t result); err_t (*wlp_complete)(void *arg, struct bd_addr *bdaddr); err_t (*conn_req)(void *arg,struct bd_addr *bdaddr,u8_t *cod,u8_t link_type); @@ -412,6 +424,7 @@ err_t hci_link_key_req_neg_reply(struct bd_addr *bdaddr); err_t hci_write_scan_enable(u8_t scan_enable); err_t hci_host_num_comp_packets(u16_t conhdl, u16_t num_complete); err_t hci_sniff_mode(struct bd_addr *bdaddr, u16_t max_interval, u16_t min_interval, u16_t attempt, u16_t timeout); +err_t hci_auth_req(struct bd_addr *bdaddr); err_t hci_write_link_policy_settings(struct bd_addr *bdaddr, u16_t link_policy); err_t hci_write_authentication_enable(u8_t auth_enable); err_t hci_periodic_inquiry(u32_t lap,u16_t min_period,u16_t max_period,u8_t inq_len,u8_t num_resp,err_t (*inq_complete)(void *arg,struct hci_pcb *pcb,struct hci_inq_res *ires,u16_t result)); @@ -424,6 +437,9 @@ err_t hci_write_local_name(u8_t *name,u8_t len); err_t hci_write_pin_type(u8_t type); err_t hci_read_stored_link_key(void); err_t hci_read_remote_name(struct bd_addr *bdaddr); +err_t hci_read_clock_offset(struct bd_addr *bdaddr); +err_t hci_read_remote_version_info(u16_t connhdl); +err_t hci_read_remote_features(u16_t connhdl); err_t hci_vendor_specific_command(u8_t ocf,u8_t ogf,void *data,u8_t len); err_t hci_reg_dev_info(struct bd_addr *bdaddr,u8_t *cod,u8_t psrm,u8_t psm,u16_t co); @@ -431,6 +447,7 @@ err_t hci_reg_dev_info(struct bd_addr *bdaddr,u8_t *cod,u8_t psrm,u8_t psm,u16_t void hci_arg(void *arg); void hci_cmd_complete(err_t (*cmd_complete)(void *arg,struct hci_pcb *pcb,u8_t ogf,u8_t ocf,u8_t result)); void hci_connection_complete(err_t (* conn_complete)(void *arg, struct bd_addr *bdaddr)); +void hci_auth_complete(err_t (* auth_complete)(void *arg, struct bd_addr *bdaddr)); void hci_pin_req(err_t (* pin_req)(void *arg, struct bd_addr *bdaddr)); void hci_link_key_req(err_t (* link_key_req)(void *arg, struct bd_addr *bdaddr)); void hci_link_key_not(err_t (* link_key_not)(void *arg, struct bd_addr *bdaddr, u8_t *key)); @@ -475,6 +492,9 @@ err_t lp_write_flush_timeout(struct bd_addr *bdaddr, u16_t flushto); #define HCI_EVENT_CONN_COMPLETE(pcb,bdaddr,ret) \ if((pcb)->conn_complete != NULL) \ (ret = (pcb)->conn_complete((pcb)->cbarg,(bdaddr))); +#define HCI_EVENT_AUTH_COMPLETE(pcb,bdaddr,ret) \ + if((pcb)->auth_complete != NULL) \ + (ret = (pcb)->auth_complete((pcb)->cbarg,(bdaddr))); #define HCI_EVENT_CMD_COMPLETE(pcb,ogf,ocf,result,ret) \ if((pcb)->cmd_complete != NULL) \ (ret = (pcb)->cmd_complete((pcb)->cbarg,(pcb),(ogf),(ocf),(result))) diff --git a/lwbt/l2cap.c b/lwbt/l2cap.c index a63ed1254..1dfc00c57 100644 --- a/lwbt/l2cap.c +++ b/lwbt/l2cap.c @@ -1401,7 +1401,7 @@ void lp_connect_cfm(struct bd_addr *bdaddr, u8_t encrypt_mode, err_t err) L2CA_ACTION_CONN_CFM(pcb,L2CAP_CONN_REF_RES,0x0000,ret); /* No resources available */ } } else { - ERROR("lp_connect_cfm: Connection failed\n"); + ERROR("lp_connect_cfm: Connection failed(%d)\n", err); L2CA_ACTION_CONN_CFM(pcb,L2CAP_CONN_REF_RES,0x0000,ret); /* No resources available */ } } diff --git a/wiiuse/wpad.c b/wiiuse/wpad.c index 5ec17523d..526577045 100644 --- a/wiiuse/wpad.c +++ b/wiiuse/wpad.c @@ -822,6 +822,17 @@ static void __wpad_syncbuttonCB(u32 held) _CPU_ISR_Restore(level); } +s32 __wpad_read_remote_features_finished(s32 result,void *userdata) +{ + +} + +s32 __wpad_read_clock_offset_finished(s32 result,void *userdata) +{ + //BTE_ReadClockOffset(&info->bdaddr, __wpad_read_clock_offset_finished); + return result; +} + s32 __wpad_read_remote_name_finished(s32 result,void *userdata) { int i; From 86704a68ce9fc4e19f011747dcbab59172b3672d Mon Sep 17 00:00:00 2001 From: Zarithya Date: Sat, 24 May 2025 02:57:45 -0700 Subject: [PATCH 12/27] TRs work --- gc/bte/bte.h | 1 + lwbt/bte.c | 43 +++++++++++++++++++++++++++++++++++++++---- lwbt/hci.c | 2 +- wiiuse/io_wii.c | 17 ++++++++++++++++- wiiuse/wpad.c | 24 ++++++++++++++++-------- 5 files changed, 73 insertions(+), 14 deletions(-) diff --git a/gc/bte/bte.h b/gc/bte/bte.h index 10ca4cc0c..7bdf8856e 100644 --- a/gc/bte/bte.h +++ b/gc/bte/bte.h @@ -174,6 +174,7 @@ void bte_disconnected(struct bte_pcb *pcb,s32 (disconn_cfm)(void *arg,struct bte s32 bte_registerdeviceasync(struct bte_pcb *pcb,struct bd_addr *bdaddr,s32 (*conn_cfm)(void *arg,struct bte_pcb *pcb,u8 err)); s32 bte_connectdeviceasync(struct bte_pcb *pcb,struct bd_addr *bdaddr,s32 (*conn_cfm)(void *arg,struct bte_pcb *pcb,u8 err)); +s32 bte_connectdeviceasync2(struct bte_pcb *pcb,s32 (*conn_cfm)(void *arg,struct bte_pcb *pcb,u8 err)); s32 bte_disconnect(struct bte_pcb *pcb); diff --git a/lwbt/bte.c b/lwbt/bte.c index 455629500..d8b5d1ccf 100644 --- a/lwbt/bte.c +++ b/lwbt/bte.c @@ -738,7 +738,7 @@ s32 bte_registerdeviceasync(struct bte_pcb *pcb,struct bd_addr *bdaddr,s32 (*con goto error; } - if((l2capcb=l2cap_new())==NULL) { + /*if((l2capcb=l2cap_new())==NULL) { err = ERR_MEM; goto error; } @@ -748,7 +748,7 @@ s32 bte_registerdeviceasync(struct bte_pcb *pcb,struct bd_addr *bdaddr,s32 (*con if(err!=ERR_OK) { l2cap_close(l2capcb); err = ERR_CONN; - } + }*/ error: _CPU_ISR_Restore(level); @@ -763,7 +763,7 @@ s32 bte_connectdeviceasync(struct bte_pcb *pcb,struct bd_addr *bdaddr,s32 (*conn struct l2cap_pcb *l2capcb = NULL; _CPU_ISR_Disable(level); - //printf("bte_connectdeviceasync()\n"); + printf("bte_connectdeviceasync()\n"); if(lp_is_connected(bdaddr)) { printf("bdaddr already exists: %02x:%02x:%02x:%02x:%02x:%02x\n",bdaddr->addr[5],bdaddr->addr[4],bdaddr->addr[3],bdaddr->addr[2],bdaddr->addr[1],bdaddr->addr[0]); err = ERR_CONN; @@ -789,13 +789,48 @@ s32 bte_connectdeviceasync(struct bte_pcb *pcb,struct bd_addr *bdaddr,s32 (*conn goto error; } - if((l2capcb=l2cap_new())==NULL) { + /*if((l2capcb=l2cap_new())==NULL) { err = ERR_MEM; goto error; } l2cap_arg(l2capcb,pcb); err = l2ca_connect_req(l2capcb,bdaddr,HIDP_DATA_CHANNEL,HCI_ALLOW_ROLE_SWITCH,l2cap_connected); + if(err!=ERR_OK) { + l2cap_close(l2capcb); + err = ERR_CONN; + }*/ + +error: + _CPU_ISR_Restore(level); + //printf("bte_connectdeviceasync(%02x)\n",err); + return err; +} + +s32 bte_connectdeviceasync2(struct bte_pcb *pcb,s32 (*conn_cfm)(void *arg,struct bte_pcb *pcb,u8 err)) +{ + u32 level; + s32 err = ERR_OK; + struct l2cap_pcb *l2capcb = NULL; + + _CPU_ISR_Disable(level); + printf("bte_connectdeviceasync2()\n"); + + if(!lp_is_connected(&(pcb->bdaddr))) { + printf("bdaddr not connected: %02x:%02x:%02x:%02x:%02x:%02x\n",pcb->bdaddr.addr[5],pcb->bdaddr.addr[4],pcb->bdaddr.addr[3],pcb->bdaddr.addr[2],pcb->bdaddr.addr[1],pcb->bdaddr.addr[0]); + err = ERR_CONN; + goto error; + } + + pcb->conn_cfm = conn_cfm; + + if((l2capcb=l2cap_new())==NULL) { + err = ERR_MEM; + goto error; + } + l2cap_arg(l2capcb,pcb); + + err = l2ca_connect_req(l2capcb,&(pcb->bdaddr),HIDP_DATA_CHANNEL,HCI_ALLOW_ROLE_SWITCH,l2cap_connected); if(err!=ERR_OK) { l2cap_close(l2capcb); err = ERR_CONN; diff --git a/lwbt/hci.c b/lwbt/hci.c index 61934adbe..40f90d6c7 100644 --- a/lwbt/hci.c +++ b/lwbt/hci.c @@ -299,7 +299,7 @@ err_t hci_reg_dev_info(struct bd_addr *bdaddr,u8_t *cod,u8_t psrm,u8_t psm,u16_t static struct pbuf* hci_cmd_ass(struct pbuf *p,u8_t ocf,u8_t ogf,u8_t len) { - memset(p, 0, len); + memset(p->payload, 0, len); ((u8_t*)p->payload)[0] = HCI_COMMAND_DATA_PACKET; /* cmd packet type */ ((u8_t*)p->payload)[1] = (ocf&0xff); /* OCF & OGF */ ((u8_t*)p->payload)[2] = ((ocf>>8)|(ogf<<2)); diff --git a/wiiuse/io_wii.c b/wiiuse/io_wii.c index bbbdea29e..b334fdc37 100644 --- a/wiiuse/io_wii.c +++ b/wiiuse/io_wii.c @@ -78,7 +78,7 @@ static s32 __wiiuse_receive(void *arg,void *buffer,u16 len) return ERR_OK; } -static s32 __wiiuse_connected(void *arg,struct bte_pcb *pcb,u8 err) +static s32 __wiiuse_connected2(void *arg,struct bte_pcb *pcb,u8 err) { struct wiimote_listen_t *wml = (struct wiimote_listen_t*)arg; struct wiimote_t *wm; @@ -104,6 +104,21 @@ static s32 __wiiuse_connected(void *arg,struct bte_pcb *pcb,u8 err) return ERR_OK; } +static s32 __wiiuse_connected(void *arg,struct bte_pcb *pcb,u8 err) +{ + if (err!=ERR_OK) { + bte_disconnect(pcb); + return ERR_OK; + } + + err = bte_connectdeviceasync2(pcb,__wiiuse_connected2); + + if(err==ERR_OK) return ERR_OK; + + printf("wiiuse_connect: bte_registerdeviceasync failed(%d)\n", err); + return err; +} + void __wiiuse_sensorbar_enable(int enable) { u32 val; diff --git a/wiiuse/wpad.c b/wiiuse/wpad.c index 526577045..df46694fe 100644 --- a/wiiuse/wpad.c +++ b/wiiuse/wpad.c @@ -50,14 +50,16 @@ distribution. #include "lwp_threads.inl" -#define MAX_STREAMDATA_LEN 20 -#define EVENTQUEUE_LENGTH 16 +#define MAX_STREAMDATA_LEN 20 +#define EVENTQUEUE_LENGTH 16 -#define DISCONNECT_TIMEOUT 0x08 /* HCI_CONN_TIMEOUT */ -#define DISCONNECT_USER_ENDED 0x13 /* HCI_OTHER_END_TERMINATED_CONN_USER_ENDED */ -#define DISCONNECT_BATTERY_DIED 0x14 /* HCI_OTHER_END_TERMINATED_CONN_LOW_RESOURCES */ -#define DISCONNECT_POWER_OFF 0x15 /* HCI_OTHER_END_TERMINATED_CONN_ABOUT_TO_POWER_OFF */ -#define DISCONNECT_IDLE_TIMEOUT 0x16 /* HCI_CONN_TERMINATED_BY_LOCAL_HOST */ +#define DISCONNECT_AUTH_FAILURE 0x05 /* HCI_AUTHENTICATION_FAILURE */ +#define DISCONNECT_TIMEOUT 0x08 /* HCI_CONN_TIMEOUT */ +#define DISCONNECT_USER_ENDED 0x13 /* HCI_OTHER_END_TERMINATED_CONN_USER_ENDED */ +#define DISCONNECT_BATTERY_DIED 0x14 /* HCI_OTHER_END_TERMINATED_CONN_LOW_RESOURCES */ +#define DISCONNECT_POWER_OFF 0x15 /* HCI_OTHER_END_TERMINATED_CONN_ABOUT_TO_POWER_OFF */ +#define DISCONNECT_IDLE_TIMEOUT 0x16 /* HCI_CONN_TERMINATED_BY_LOCAL_HOST */ +#define DISCONNECT_REPEATED_ATTEMPTS 0x17 /* HCI_REPEATED_ATTEMPTS */ struct _wpad_thresh{ s32 btns; @@ -228,7 +230,7 @@ wiimote *__wpad_assign_slot(wiimote_listen *wml, u8 err) } if (err) { - printf("WPAD Connection Error %d\n", err); + printf("WPAD Connection Error %d\n", (s8)err); __wpads_used &= ~(0x01< Date: Sat, 24 May 2025 03:47:45 -0700 Subject: [PATCH 13/27] Reconnect after pair works --- gc/bte/bte.h | 4 +-- lwbt/bte.c | 95 ++++++++++++++++++++----------------------------- lwbt/hci.c | 53 --------------------------- wiiuse/io_wii.c | 24 +++++++++++-- wiiuse/wpad.c | 11 ------ 5 files changed, 61 insertions(+), 126 deletions(-) diff --git a/gc/bte/bte.h b/gc/bte/bte.h index 7bdf8856e..0ceddf588 100644 --- a/gc/bte/bte.h +++ b/gc/bte/bte.h @@ -149,9 +149,6 @@ s32 BTE_ReadStoredLinkKey(struct linkkey_info *keys,u8 max_cnt,btecallback cb); s32 BTE_ReadBdAddr(struct bd_addr *bdaddr, btecallback cb); s32 BTE_SetEvtFilter(u8 filter_type,u8 filter_cond_type,u8 *cond, btecallback cb); s32 BTE_ReadRemoteName(struct bd_addr *bdaddr, btecallback cb); -s32 BTE_ReadClockOffset(struct bd_addr *bdaddr, btecallback cb); -s32 BTE_ReadRemoteVersionInfo(struct bd_addr *bdaddr, btecallback cb); -s32 BTE_ReadRemoteFeatures(struct bd_addr *bdaddr, btecallback cb); s32 BTE_Inquiry(u8 max_cnt,u8 flush, btecallback cb); s32 BTE_PeriodicInquiry(u8 max_cnt,u8 flush,btecallback cb); s32 BTE_ExitPeriodicInquiry(void); @@ -173,6 +170,7 @@ void bte_received(struct bte_pcb *pcb, s32 (*recv)(void *arg,void *buffer,u16 le void bte_disconnected(struct bte_pcb *pcb,s32 (disconn_cfm)(void *arg,struct bte_pcb *pcb,u8 err)); s32 bte_registerdeviceasync(struct bte_pcb *pcb,struct bd_addr *bdaddr,s32 (*conn_cfm)(void *arg,struct bte_pcb *pcb,u8 err)); +s32 bte_registerdeviceasync2(struct bte_pcb *pcb,s32 (*conn_cfm)(void *arg,struct bte_pcb *pcb,u8 err)); s32 bte_connectdeviceasync(struct bte_pcb *pcb,struct bd_addr *bdaddr,s32 (*conn_cfm)(void *arg,struct bte_pcb *pcb,u8 err)); s32 bte_connectdeviceasync2(struct bte_pcb *pcb,s32 (*conn_cfm)(void *arg,struct bte_pcb *pcb,u8 err)); diff --git a/lwbt/bte.c b/lwbt/bte.c index d8b5d1ccf..729ba2a7c 100644 --- a/lwbt/bte.c +++ b/lwbt/bte.c @@ -547,54 +547,6 @@ s32 BTE_ReadRemoteName(struct bd_addr *bdaddr, btecallback cb) return last_err; } -s32 BTE_ReadClockOffset(struct bd_addr *bdaddr, btecallback cb) -{ - u32 level; - err_t last_err = ERR_OK; - - _CPU_ISR_Disable(level); - btstate.cb = cb; - btstate.usrdata = NULL; - btstate.hci_cmddone = 0; - hci_arg(&btstate); - hci_read_clock_offset(bdaddr); - _CPU_ISR_Restore(level); - - return last_err; -} - -/*s32 BTE_ReadRemoteVersionInfo(struct bd_addr *bdaddr, btecallback cb) -{ - u32 level; - err_t last_err = ERR_OK; - - _CPU_ISR_Disable(level); - btstate.cb = cb; - btstate.usrdata = NULL; - btstate.hci_cmddone = 0; - hci_arg(&btstate); - hci_read_remote_version_info(bdaddr); - _CPU_ISR_Restore(level); - - return last_err; -} - -s32 BTE_ReadRemoteFeatures(struct bd_addr *bdaddr, btecallback cb) -{ - u32 level; - err_t last_err = ERR_OK; - - _CPU_ISR_Disable(level); - btstate.cb = cb; - btstate.usrdata = NULL; - btstate.hci_cmddone = 0; - hci_arg(&btstate); - hci_read_remote_features(bdaddr); - _CPU_ISR_Restore(level); - - return last_err; -}*/ - s32 BTE_LinkKeyRequestReply(struct bd_addr *bdaddr,u8 *key) { u32 level; @@ -752,7 +704,41 @@ s32 bte_registerdeviceasync(struct bte_pcb *pcb,struct bd_addr *bdaddr,s32 (*con error: _CPU_ISR_Restore(level); - //printf("bte_registerdeviceasync(%02x)\n",err); + printf("bte_registerdeviceasync(%02x)\n",err); + return err; +} + +s32 bte_registerdeviceasync2(struct bte_pcb *pcb,s32 (*conn_cfm)(void *arg,struct bte_pcb *pcb,u8 err)) +{ + u32 level; + s32 err = ERR_OK; + struct l2cap_pcb *l2capcb = NULL; + + //printf("bte_registerdeviceasync2()\n"); + _CPU_ISR_Disable(level); + if(!lp_is_connected(&(pcb->bdaddr))) { + printf("bdaddr not connected: %02x:%02x:%02x:%02x:%02x:%02x\n",pcb->bdaddr.addr[5],pcb->bdaddr.addr[4],pcb->bdaddr.addr[3],pcb->bdaddr.addr[2],pcb->bdaddr.addr[1],pcb->bdaddr.addr[0]); + err = ERR_CONN; + goto error; + } + + pcb->conn_cfm = conn_cfm; + + if((l2capcb=l2cap_new())==NULL) { + err = ERR_MEM; + goto error; + } + l2cap_arg(l2capcb,pcb); + + err = l2cap_connect_ind(l2capcb,&(pcb->bdaddr),HIDP_DATA_CHANNEL,l2cap_accepted); + if(err!=ERR_OK) { + l2cap_close(l2capcb); + err = ERR_CONN; + } + +error: + _CPU_ISR_Restore(level); + printf("bte_registerdeviceasync2(%02x)\n",err); return err; } @@ -1247,17 +1233,14 @@ err_t l2cap_accepted(void *arg,struct l2cap_pcb *l2cappcb,err_t err) btepcb->data_pcb = l2cappcb; break; } - if(btepcb->data_pcb && btepcb->ctl_pcb) { - btepcb->err = ERR_OK; - btepcb->state = (u32)STATE_CONNECTED; - if(btepcb->conn_cfm) btepcb->conn_cfm(btepcb->cbarg,btepcb,ERR_OK); - } + btepcb->err = ERR_OK; + btepcb->state = (u32)STATE_CONNECTED; } else { l2cap_close(l2cappcb); btepcb->err = ERR_CONN; - if(btepcb->conn_cfm) btepcb->conn_cfm(btepcb->cbarg,btepcb,ERR_CONN); } - + + if(btepcb->conn_cfm) btepcb->conn_cfm(btepcb->cbarg,btepcb,btepcb->err); return ERR_OK; } diff --git a/lwbt/hci.c b/lwbt/hci.c index 40f90d6c7..08b77386b 100644 --- a/lwbt/hci.c +++ b/lwbt/hci.c @@ -1830,56 +1830,6 @@ static void hci_inquiry_result_with_rssi_evt(struct pbuf *p) } -static void hci_read_remote_features_complete_evt(struct pbuf *p) -{ - u16_t conn_handle; - - switch(((u8_t*)p->payload)[0]) { - case HCI_SUCCESS: - conn_handle = le16toh(*((u16_t*)(((u8_t*)p->payload)+1))); - //hci_read_remote_features(conn_handle); - break; - default: - break; - } -} - -static void hci_read_remote_version_info_complete_evt(struct pbuf *p) -{ - u16_t conn_handle; - u8_t version; - u16_t manufacturer_name; - u16_t subversion; - - switch(((u8_t*)p->payload)[0]) { - case HCI_SUCCESS: - conn_handle = le16toh(*((u16_t*)(((u8_t*)p->payload)+1))); - version = ((u8_t*)p->payload)[3]; - manufacturer_name = le16toh(*((u16_t*)(((u8_t*)p->payload)+4))); - subversion = le16toh(*((u16_t*)(((u8_t*)p->payload)+5))); - hci_read_remote_features(conn_handle); - break; - default: - break; - } -} - -static void hci_read_clock_offset_complete_evt(struct pbuf *p) -{ - u16_t conn_handle; - u16_t clock_offset; - - switch(((u8_t*)p->payload)[0]) { - case HCI_SUCCESS: - conn_handle = le16toh(*((u16_t*)(((u8_t*)p->payload)+1))); - clock_offset = le16toh(*((u16_t*)(((u8_t*)p->payload)+3))); - hci_read_remote_version_info(conn_handle); - break; - default: - break; - } -} - static void hci_return_link_key_evt(struct pbuf *p) { u8_t num_keys; @@ -1993,10 +1943,8 @@ void hci_event_handler(struct pbuf *p) case HCI_ENCRYPTION_CHANGE: break; case HCI_READ_REMOTE_FEATURES_COMPLETE: - hci_read_remote_features_complete_evt(p); break; case HCI_READ_REMOTE_VERSION_COMPLETE: - hci_read_remote_version_info_complete_evt(p); break; case HCI_QOS_SETUP_COMPLETE: break; @@ -2072,7 +2020,6 @@ void hci_event_handler(struct pbuf *p) case HCI_MAX_SLOTS_CHANGE: break; case HCI_READ_CLOCK_OFFSET_COMPLETE: - hci_read_clock_offset_complete_evt(p); break; case HCI_RETURN_LINK_KEYS: hci_return_link_key_evt(p); diff --git a/wiiuse/io_wii.c b/wiiuse/io_wii.c index b334fdc37..910858bb9 100644 --- a/wiiuse/io_wii.c +++ b/wiiuse/io_wii.c @@ -83,6 +83,7 @@ static s32 __wiiuse_connected2(void *arg,struct bte_pcb *pcb,u8 err) struct wiimote_listen_t *wml = (struct wiimote_listen_t*)arg; struct wiimote_t *wm; + printf("__wiiuse_connected2(%d)\n", err); wm = wml->assign_cb(wml, err); if(!wm) { @@ -95,7 +96,7 @@ static s32 __wiiuse_connected2(void *arg,struct bte_pcb *pcb,u8 err) wm->sock = wml->sock; wm->bdaddr = wml->bdaddr; - //printf("__wiiuse_connected()\n"); + //printf("__wiiuse_connected2()\n"); WIIMOTE_ENABLE_STATE(wm,(WIIMOTE_STATE_CONNECTED|WIIMOTE_STATE_HANDSHAKE)); wm->handshake_state = 0; @@ -106,6 +107,7 @@ static s32 __wiiuse_connected2(void *arg,struct bte_pcb *pcb,u8 err) static s32 __wiiuse_connected(void *arg,struct bte_pcb *pcb,u8 err) { + printf("__wiiuse_connected(%d)\n", err); if (err!=ERR_OK) { bte_disconnect(pcb); return ERR_OK; @@ -115,7 +117,23 @@ static s32 __wiiuse_connected(void *arg,struct bte_pcb *pcb,u8 err) if(err==ERR_OK) return ERR_OK; - printf("wiiuse_connect: bte_registerdeviceasync failed(%d)\n", err); + printf("__wiiuse_connected: bte_connectdeviceasync2 failed(%d)\n", err); + return err; +} + +static s32 __wiiuse_registered(void *arg,struct bte_pcb *pcb,u8 err) +{ + printf("__wiiuse_registered(%d)\n", err); + if (err!=ERR_OK) { + bte_disconnect(pcb); + return ERR_OK; + } + + err = bte_registerdeviceasync2(pcb,__wiiuse_connected2); + + if(err==ERR_OK) return ERR_OK; + + printf("__wiiuse_registered: bte_registerdeviceasync2 failed(%d)\n", err); return err; } @@ -161,7 +179,7 @@ int wiiuse_register(struct wiimote_listen_t *wml, struct bd_addr *bdaddr, struct bte_received(wml->sock,__wiiuse_receive); bte_disconnected(wml->sock,__wiiuse_disconnected); - err = bte_registerdeviceasync(wml->sock,bdaddr,__wiiuse_connected); + err = bte_registerdeviceasync(wml->sock,bdaddr,__wiiuse_registered); if(err==ERR_OK) return 1; printf("wiiuse_register: bte_registerdeviceasync failed(%d)\n", err); diff --git a/wiiuse/wpad.c b/wiiuse/wpad.c index df46694fe..ae212390f 100644 --- a/wiiuse/wpad.c +++ b/wiiuse/wpad.c @@ -830,17 +830,6 @@ static void __wpad_syncbuttonCB(u32 held) _CPU_ISR_Restore(level); } -s32 __wpad_read_remote_features_finished(s32 result,void *userdata) -{ - -} - -s32 __wpad_read_clock_offset_finished(s32 result,void *userdata) -{ - //BTE_ReadClockOffset(&info->bdaddr, __wpad_read_clock_offset_finished); - return result; -} - s32 __wpad_read_remote_name_finished(s32 result,void *userdata) { int i; From 545eeeb7c33ac48678ce983974f5c632fc2d0cdd Mon Sep 17 00:00:00 2001 From: Zarithya Date: Wed, 28 May 2025 00:28:42 -0700 Subject: [PATCH 14/27] TRs can reconnect after pairing --- lwbt/hci.c | 2 +- wiiuse/wpad.c | 82 ++++++++++++++++++++++++++++++++++----------------- 2 files changed, 56 insertions(+), 28 deletions(-) diff --git a/lwbt/hci.c b/lwbt/hci.c index 08b77386b..ea2a4aaf9 100644 --- a/lwbt/hci.c +++ b/lwbt/hci.c @@ -1887,7 +1887,7 @@ void hci_event_handler(struct pbuf *p) evthdr = p->payload; btpbuf_header(p,-HCI_EVENT_HDR_LEN); - printf("HCI_EVENT %02X\n", evthdr->code); + //printf("HCI_EVENT %02X\n", evthdr->code); switch(evthdr->code) { case HCI_INQUIRY_COMPLETE: diff --git a/wiiuse/wpad.c b/wiiuse/wpad.c index ae212390f..484367089 100644 --- a/wiiuse/wpad.c +++ b/wiiuse/wpad.c @@ -106,6 +106,11 @@ static conf_pads __wpad_devs; static conf_pad_guests __wpad_guests; static struct linkkey_info __wpad_keys[CONF_PAD_TOTAL]; +static sem_t __wpad_confsave_sem; +static bool __wpad_confsave_thread_running = false; +static void* __wpad_confsave_thread_func(void *); +static lwp_t __wpad_confsave_thread = LWP_THREAD_NULL; + static s32 __wpad_onreset(s32 final); static s32 __wpad_disconnect(struct _wpad_cb *wpdcb); static void __wpad_eventCB(struct wiimote_t *wm,s32 event); @@ -243,6 +248,34 @@ wiimote *__wpad_assign_slot(wiimote_listen *wml, u8 err) return __wpads[i]; } +static void* __wpad_confsave_thread_func(void *) +{ + __wpad_confsave_thread_running = true; + + while (__wpad_confsave_thread_running) + { + LWP_SemWait(__wpad_confsave_sem); + CONF_SaveChanges(); + } + + return NULL; +} + +static void __wpad_confsave_thread_stop(void) +{ + if (__wpad_confsave_thread != LWP_THREAD_NULL) { + __wpad_confsave_thread_running = false; + LWP_SemPost(__wpad_confsave_sem); + LWP_JoinThread(__wpad_confsave_thread, NULL); + __wpad_confsave_thread = LWP_THREAD_NULL; + } + + if (__wpad_confsave_sem != LWP_SEM_NULL) { + LWP_SemDestroy(__wpad_confsave_sem); + __wpad_confsave_sem = LWP_SEM_NULL; + } +} + wiimote *__wpad_register_new(wiimote_listen *wml, u8 err) { u32 i,j,level; @@ -295,6 +328,8 @@ wiimote *__wpad_register_new(wiimote_listen *wml, u8 err) memcpy(__wpad_devs.registered[0].name, wml->name, sizeof(__wpad_devs.registered[0].name)); if (__wpad_devs.num_registered < CONF_PAD_MAX_REGISTERED) __wpad_devs.num_registered++; + CONF_SetPadDevices(&__wpad_devs); + LWP_SemPost(__wpad_confsave_sem); } } else if(registeredEntry >= CONF_PAD_MAX_REGISTERED) { // Not permanent pair, need to save bdaddr and link key as guest controller @@ -318,15 +353,19 @@ wiimote *__wpad_register_new(wiimote_listen *wml, u8 err) break; } } + + CONF_SetPadGuestDevices(&__wpad_guests); + LWP_SemPost(__wpad_confsave_sem); } } } + _CPU_ISR_Restore(level); return wm; } -static s32 __wpad_setevtfilter_connsetup_finished(s32 result,void *usrdata) +static s32 __wpad_setevtfilter_finished(s32 result,void *usrdata) { u32 i, level; struct bd_addr bdaddr; @@ -347,35 +386,15 @@ static s32 __wpad_setevtfilter_connsetup_finished(s32 result,void *usrdata) return ERR_OK; } -static s32 __wpad_setevtfilter_inquiry_finished(s32 result,void *usrdata) -{ - u32 level; - - printf("__wpad_setevtfilter_inquiry_finished(%d)\n",result); - - // Filter connection setup to allow only gamepads - u8 filter[] = {0x00, 0x05, 0x00, 0x00, 0x1F, 0x00, 0x01}; - - _CPU_ISR_Disable(level); - if(__wpads_inited==WPAD_STATE_ENABLING) { - BTE_SetEvtFilter(0x02,0x01,filter,__wpad_setevtfilter_connsetup_finished); - } - _CPU_ISR_Restore(level); - return ERR_OK; -} - static s32 __wpad_init_finished(s32 result,void *usrdata) { u32 level; printf("__wpad_init_finished(%d)\n",result); - // Filter inquiry to allow only gamepads - u8 filter[] = {0x00, 0x05, 0x00, 0x00, 0x1F, 0x00}; - _CPU_ISR_Disable(level); if(__wpads_inited==WPAD_STATE_ENABLING) { - BTE_SetEvtFilter(0x01,0x01,filter,__wpad_setevtfilter_inquiry_finished); + BTE_SetEvtFilter(0x01,0x00,NULL,__wpad_setevtfilter_finished); } _CPU_ISR_Restore(level); return ERR_OK; @@ -1279,8 +1298,7 @@ s32 WPAD_Init(void) BTE_SetDisconnectCallback(__wpad_disconnectCB); BTE_SetSyncButtonCallback(__wpad_syncbuttonCB); BTE_SetConnectionRequestCallback(__wpad_connreqCB); - // For some reason, returning our saved link key causes Wiimote to disconnect... - //BTE_SetLinkKeyRequestCallback(__wpad_linkkeyreqCB); + BTE_SetLinkKeyRequestCallback(__wpad_linkkeyreqCB); BTE_SetLinkKeyNotificationCallback(__wpad_linkkeynotCB); BTE_InitCore(__initcore_finished); @@ -1296,6 +1314,18 @@ s32 WPAD_Init(void) tb.tv_sec = 1; tb.tv_nsec = 0; SYS_SetPeriodicAlarm(__wpad_timer,&tb,&tb,__wpad_timeouthandler,NULL); + + if (LWP_SemInit(&__wpad_confsave_sem,0,1)<0) { + WPAD_Shutdown(); + _CPU_ISR_Restore(level); + return WPAD_ERR_UNKNOWN; + } + + if(LWP_CreateThread(&__wpad_confsave_thread,__wpad_confsave_thread_func,NULL,NULL,0,80)<0) { + WPAD_Shutdown(); + _CPU_ISR_Restore(level); + return WPAD_ERR_UNKNOWN; + } } _CPU_ISR_Restore(level); return WPAD_ERR_NONE; @@ -1713,9 +1743,7 @@ s32 WPAD_Shutdown(void) _CPU_ISR_Disable(level); BTE_Close(); - CONF_SetPadDevices(&__wpad_devs); - CONF_SetPadGuestDevices(&__wpad_guests); - CONF_SaveChanges(); + __wpad_confsave_thread_stop(); __wpads_inited = WPAD_STATE_DISABLED; SYS_RemoveAlarm(__wpad_timer); From 4406038b7dccc5d7d96be3af51ac88cef0782a67 Mon Sep 17 00:00:00 2001 From: Zarithya Date: Sun, 1 Jun 2025 19:39:10 -0700 Subject: [PATCH 15/27] Fix balance board --- gc/bte/bte.h | 2 +- gc/wiiuse/wiiuse.h | 5 +- gc/wiiuse/wpad.h | 4 +- lwbt/bte.c | 16 +++---- lwbt/hci.c | 2 +- lwbt/l2cap.c | 2 - wiiuse/events.c | 14 ++++-- wiiuse/io.c | 21 ++++----- wiiuse/io_wii.c | 37 +++++++++------ wiiuse/wiiboard.c | 2 +- wiiuse/wiiuse_internal.h | 2 +- wiiuse/wpad.c | 98 ++++++++++++++++++++++------------------ 12 files changed, 110 insertions(+), 95 deletions(-) diff --git a/gc/bte/bte.h b/gc/bte/bte.h index 0ceddf588..e5903a991 100644 --- a/gc/bte/bte.h +++ b/gc/bte/bte.h @@ -155,7 +155,7 @@ s32 BTE_ExitPeriodicInquiry(void); s32 BTE_LinkKeyRequestReply(struct bd_addr *bdaddr,u8 *key); s32 BTE_LinkKeyRequestNegativeReply(struct bd_addr *bdaddr); void (*BTE_SetDisconnectCallback(void (*callback)(struct bd_addr *bdaddr,u8 reason)))(struct bd_addr *bdaddr,u8 reason); -void BTE_SetSyncButtonCallback(void (*callback)(u32 held)); +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)); diff --git a/gc/wiiuse/wiiuse.h b/gc/wiiuse/wiiuse.h index 66b3b0f7c..30bca753c 100644 --- a/gc/wiiuse/wiiuse.h +++ b/gc/wiiuse/wiiuse.h @@ -242,7 +242,8 @@ typedef enum cmd_blk_s { CMD_READY = 0, CMD_SENT, - CMD_DONE + CMD_DONE, + CMD_FAILED } cmd_blk_s; struct cmd_blk_t @@ -698,7 +699,7 @@ WIIUSE_EXPORT extern const char* wiiuse_version(); #ifndef GEKKO WIIUSE_EXPORT extern struct wiimote_t** wiiuse_init(int wiimotes); #else -WIIUSE_EXPORT extern int wiiuse_register(struct wiimote_listen_t *wml, struct bd_addr *bdaddr, struct wiimote_t *(*assign_cb)(struct wiimote_listen_t *wml, u8 err)); +WIIUSE_EXPORT extern int wiiuse_register(struct wiimote_listen_t *wml, struct bd_addr *bdaddr, u8 *name, struct wiimote_t *(*assign_cb)(struct wiimote_listen_t *wml, u8 err)); WIIUSE_EXPORT extern int wiiuse_connect(struct wiimote_listen_t *wml, struct bd_addr *bdaddr, u8 *name, struct wiimote_t *(*assign_cb)(struct wiimote_listen_t *wml, u8 err)); WIIUSE_EXPORT extern struct wiimote_t** wiiuse_init(int wiimotes, wii_event_cb event_cb); WIIUSE_EXPORT extern void wiiuse_sensorbar_enable(int enable); diff --git a/gc/wiiuse/wpad.h b/gc/wiiuse/wpad.h index 9c61e5f81..94d67caef 100644 --- a/gc/wiiuse/wpad.h +++ b/gc/wiiuse/wpad.h @@ -170,7 +170,7 @@ typedef struct _wpad_encstatus typedef void (*WPADDataCallback)(s32 chan, const WPADData *data); typedef void (*WPADShutdownCallback)(s32 chan); -typedef void (*WPADSyncCallback)(u32 held); +typedef void (*WPADHostSyncBtnCallback)(u32 held); s32 WPAD_Init(void); s32 WPAD_ControlSpeaker(s32 chan,s32 enable); @@ -196,7 +196,7 @@ void WPAD_SetIdleTimeout(u32 seconds); void WPAD_SetPowerButtonCallback(WPADShutdownCallback cb); void WPAD_SetBatteryDeadCallback(WPADShutdownCallback cb); void WPAD_SetIdleTimeoutCallback(WPADShutdownCallback cb); -void WPAD_SetSyncButtonCallback(WPADSyncCallback cb); +void WPAD_SetHostSyncButtonCallback(WPADHostSyncBtnCallback cb); s32 WPAD_ScanPads(void); s32 WPAD_Rumble(s32 chan, int status); s32 WPAD_SetIdleThresholds(s32 chan, s32 btns, s32 ir, s32 accel, s32 js, s32 wb, s32 mp); diff --git a/lwbt/bte.c b/lwbt/bte.c index 729ba2a7c..c37ff88bb 100644 --- a/lwbt/bte.c +++ b/lwbt/bte.c @@ -552,7 +552,7 @@ s32 BTE_LinkKeyRequestReply(struct bd_addr *bdaddr,u8 *key) u32 level; err_t last_err = ERR_OK; - printf("BTE_LinkKeyRequestReply\n"); + //printf("BTE_LinkKeyRequestReply\n"); _CPU_ISR_Disable(level); btstate.cb = NULL; @@ -570,7 +570,7 @@ s32 BTE_LinkKeyRequestNegativeReply(struct bd_addr *bdaddr) u32 level; err_t last_err = ERR_OK; - printf("BTE_LinkKeyRequestNegativeReply\n"); + //printf("BTE_LinkKeyRequestNegativeReply\n"); _CPU_ISR_Disable(level); btstate.cb = NULL; @@ -593,7 +593,7 @@ void (*BTE_SetDisconnectCallback(void (*callback)(struct bd_addr *bdaddr,u8 reas return l2cap_disconnect_bb(callback); } -void BTE_SetSyncButtonCallback(void (*callback)(u32 held)) +void BTE_SetHostSyncButtonCallback(void (*callback)(u32 held)) { u32 level; @@ -704,7 +704,7 @@ s32 bte_registerdeviceasync(struct bte_pcb *pcb,struct bd_addr *bdaddr,s32 (*con error: _CPU_ISR_Restore(level); - printf("bte_registerdeviceasync(%02x)\n",err); + //printf("bte_registerdeviceasync(%02x)\n",err); return err; } @@ -738,7 +738,7 @@ s32 bte_registerdeviceasync2(struct bte_pcb *pcb,s32 (*conn_cfm)(void *arg,struc error: _CPU_ISR_Restore(level); - printf("bte_registerdeviceasync2(%02x)\n",err); + //printf("bte_registerdeviceasync2(%02x)\n",err); return err; } @@ -749,7 +749,7 @@ s32 bte_connectdeviceasync(struct bte_pcb *pcb,struct bd_addr *bdaddr,s32 (*conn struct l2cap_pcb *l2capcb = NULL; _CPU_ISR_Disable(level); - printf("bte_connectdeviceasync()\n"); + //printf("bte_connectdeviceasync()\n"); if(lp_is_connected(bdaddr)) { printf("bdaddr already exists: %02x:%02x:%02x:%02x:%02x:%02x\n",bdaddr->addr[5],bdaddr->addr[4],bdaddr->addr[3],bdaddr->addr[2],bdaddr->addr[1],bdaddr->addr[0]); err = ERR_CONN; @@ -800,7 +800,7 @@ s32 bte_connectdeviceasync2(struct bte_pcb *pcb,s32 (*conn_cfm)(void *arg,struct struct l2cap_pcb *l2capcb = NULL; _CPU_ISR_Disable(level); - printf("bte_connectdeviceasync2()\n"); + //printf("bte_connectdeviceasync2()\n"); if(!lp_is_connected(&(pcb->bdaddr))) { printf("bdaddr not connected: %02x:%02x:%02x:%02x:%02x:%02x\n",pcb->bdaddr.addr[5],pcb->bdaddr.addr[4],pcb->bdaddr.addr[3],pcb->bdaddr.addr[2],pcb->bdaddr.addr[1],pcb->bdaddr.addr[0]); @@ -824,7 +824,7 @@ s32 bte_connectdeviceasync2(struct bte_pcb *pcb,s32 (*conn_cfm)(void *arg,struct error: _CPU_ISR_Restore(level); - //printf("bte_connectdeviceasync(%02x)\n",err); + //printf("bte_connectdeviceasync2(%02x)\n",err); return err; } diff --git a/lwbt/hci.c b/lwbt/hci.c index ea2a4aaf9..92c902860 100644 --- a/lwbt/hci.c +++ b/lwbt/hci.c @@ -1778,6 +1778,7 @@ static void hci_conn_complete_evt(struct pbuf *p) static void hci_inquiry_result_evt(struct pbuf *p) { + // TODO: implement inquiries like the SM does (canceling inquiry after first valid result) u8_t num_resp; u32_t i,resp_off; struct bd_addr *bdaddr; @@ -1907,7 +1908,6 @@ void hci_event_handler(struct pbuf *p) hci_conn_request_evt(p); break; case HCI_DISCONNECTION_COMPLETE: - printf("HCI_DISCONNECTION_COMPLETE\n"); switch(((u8_t*)p->payload)[0]) { case HCI_SUCCESS: for(link=hci_active_links;link!=NULL;link=link->next) { diff --git a/lwbt/l2cap.c b/lwbt/l2cap.c index 1dfc00c57..b26a6c528 100644 --- a/lwbt/l2cap.c +++ b/lwbt/l2cap.c @@ -1430,8 +1430,6 @@ void lp_disconnect_ind(struct bd_addr *bdaddr,u8_t reason) struct l2cap_pcb *pcb, *tpcb; err_t ret; - printf("lp_disconnect_ind\n"); - (void)ret; for(pcb = l2cap_active_pcbs; pcb != NULL;) { diff --git a/wiiuse/events.c b/wiiuse/events.c index 3dc05649a..45ad5b018 100644 --- a/wiiuse/events.c +++ b/wiiuse/events.c @@ -85,11 +85,15 @@ static void event_ack(struct wiimote_t *wm,ubyte *msg) if(!cmd) return; if(!cmd || cmd->state!=CMD_SENT || cmd->data[0]==WM_CMD_READ_DATA || cmd->data[0]==WM_CMD_CTRL_STATUS || cmd->data[0]!=msg[2]) { WIIUSE_WARNING("Unsolicited event ack: report %02x status %02x", msg[2], msg[3]); - return; + //return; } if(msg[3]) { - WIIUSE_WARNING("Command %02x %02x failed: status %02x", cmd->data[0], cmd->data[1], msg[3]); - return; + WIIUSE_WARNING("Command %02x %02x%02x%02x%02x failed: status %02x", cmd->data[0], cmd->data[1], cmd->data[2], cmd->data[3], cmd->data[4], msg[3]); + cmd->state = CMD_FAILED; + //return; + } + else { + cmd->state = CMD_DONE; } WIIUSE_DEBUG("Received ack for command %02x %02x", cmd->data[0], cmd->data[1]); @@ -97,8 +101,8 @@ static void event_ack(struct wiimote_t *wm,ubyte *msg) wm->cmd_head = cmd->next; wm->event = WIIUSE_ACK; - cmd->state = CMD_DONE; - if(cmd->cb) cmd->cb(wm,NULL,0); + //cmd->state = CMD_DONE; + if(cmd->state != CMD_FAILED && cmd->cb) cmd->cb(wm,NULL,0); __lwp_queue_append(&wm->cmdq,&cmd->node); wiiuse_send_next_command(wm); diff --git a/wiiuse/io.c b/wiiuse/io.c index 57bd09de0..a01074795 100644 --- a/wiiuse/io.c +++ b/wiiuse/io.c @@ -102,11 +102,18 @@ void wiiuse_handshake_expansion(struct wiimote_t *wm,ubyte *data,uword len) case 3: if(!data || !len) return; id = BIG_ENDIAN_LONG(*(int*)(&data[220])); + //printf("New exp type: %d\n", id); switch(id) { case EXP_ID_CODE_NUNCHUK: if(!nunchuk_handshake(wm,&wm->exp.nunchuk,data,len)) return; break; + case EXP_ID_CODE_GUITAR: + if(!guitar_hero_3_handshake(wm,&wm->exp.gh3,data,len)) return; + break; + case EXP_ID_CODE_WIIBOARD: + if(!wii_board_handshake(wm,&wm->exp.wb,data,len)) return; + break; case EXP_ID_CODE_CLASSIC_CONTROLLER: case EXP_ID_CODE_CLASSIC_CONTROLLER_NYKOWING: case EXP_ID_CODE_CLASSIC_CONTROLLER_NYKOWING2: @@ -117,21 +124,9 @@ void wiiuse_handshake_expansion(struct wiimote_t *wm,ubyte *data,uword len) case EXP_ID_CODE_CLASSIC_CONTROLLER_GENERIC4: case EXP_ID_CODE_CLASSIC_CONTROLLER_GENERIC5: case EXP_ID_CODE_CLASSIC_WIIU_PRO: - if(!classic_ctrl_handshake(wm,&wm->exp.classic,data,len)) return; - break; - case EXP_ID_CODE_GUITAR: - if(!guitar_hero_3_handshake(wm,&wm->exp.gh3,data,len)) return; - break; - case EXP_ID_CODE_WIIBOARD: - if(!wii_board_handshake(wm,&wm->exp.wb,data,len)) return; - break; default: if(!classic_ctrl_handshake(wm,&wm->exp.classic,data,len)) return; - /*WIIMOTE_DISABLE_STATE(wm,WIIMOTE_STATE_EXP_HANDSHAKE); - WIIMOTE_ENABLE_STATE(wm,WIIMOTE_STATE_EXP_FAILED); - __lwp_wkspace_free(data); - wiiuse_status(wm,NULL); - return;*/ + break; } __lwp_wkspace_free(data); diff --git a/wiiuse/io_wii.c b/wiiuse/io_wii.c index 910858bb9..30f2e034a 100644 --- a/wiiuse/io_wii.c +++ b/wiiuse/io_wii.c @@ -149,25 +149,30 @@ void __wiiuse_sensorbar_enable(int enable) IRQ_Restore(level); } -int wiiuse_register(struct wiimote_listen_t *wml, struct bd_addr *bdaddr, struct wiimote_t *(*assign_cb)(struct wiimote_listen_t *wml, u8 err)) +int wiiuse_register(struct wiimote_listen_t *wml, struct bd_addr *bdaddr, u8 *name, struct wiimote_t *(*assign_cb)(struct wiimote_listen_t *wml, u8 err)) { s32 err; - if(!wml || !bdaddr || !assign_cb) return 0; + if(!wml || !bdaddr || !name || !assign_cb) return 0; //printf("wiiuse_register %p, bdaddr: %02x:%02x:%02x:%02x:%02x:%02x\n",wml,bdaddr->addr[5],bdaddr->addr[4],bdaddr->addr[3],bdaddr->addr[2],bdaddr->addr[1],bdaddr->addr[0]); - wml->wm = NULL; - bd_addr_set(&(wml->bdaddr),bdaddr); - memset(wml->name, 0, sizeof(wml->name)); - wml->assign_cb = assign_cb; - if(wml->sock!=NULL) { printf("wiiuse_register: wml->sock was not NULL!\n"); return 0; } + wml->wm = NULL; + bd_addr_set(&(wml->bdaddr),bdaddr); + if(name) { + strncpy((char *)wml->name, (char *)name, sizeof(wml->name)); + wml->name[sizeof(wml->name) - 1] = 0x00; + } else { + memset(wml->name, 0, sizeof(wml->name)); + } + wml->assign_cb = assign_cb; + wml->sock = bte_new(); if (wml->sock==NULL) { @@ -190,22 +195,26 @@ int wiiuse_connect(struct wiimote_listen_t *wml, struct bd_addr *bdaddr, u8 *nam { s32 err; - if(!wml || !bdaddr || !name || !assign_cb) return 0; + if(!wml || !bdaddr|| !assign_cb) return 0; //printf("wiiuse_connect %p, bdaddr: %02x:%02x:%02x:%02x:%02x:%02x\n",wml,bdaddr->addr[5],bdaddr->addr[4],bdaddr->addr[3],bdaddr->addr[2],bdaddr->addr[1],bdaddr->addr[0]); - wml->wm = NULL; - bd_addr_set(&(wml->bdaddr),bdaddr); - strncpy((char *)wml->name, (char *)name, sizeof(wml->name)); - wml->name[sizeof(wml->name) - 1] = 0x00; - wml->assign_cb = assign_cb; - if(wml->sock!=NULL) { printf("wiiuse_connect: wml->sock was not NULL!\n"); return 0; } + wml->wm = NULL; + bd_addr_set(&(wml->bdaddr),bdaddr); + if(name) { + strncpy((char *)wml->name, (char *)name, sizeof(wml->name)); + wml->name[sizeof(wml->name) - 1] = 0x00; + } else { + memset(wml->name, 0, sizeof(wml->name)); + } + wml->assign_cb = assign_cb; + wml->sock = bte_new(); if (wml->sock==NULL) { diff --git a/wiiuse/wiiboard.c b/wiiuse/wiiboard.c index 5ee0ccad6..cca1a1567 100644 --- a/wiiuse/wiiboard.c +++ b/wiiuse/wiiboard.c @@ -95,7 +95,7 @@ int wii_board_handshake(struct wiimote_t* wm, struct wii_board_t* wb, ubyte* dat /** * @brief The wii board disconnected. * - * @param cc A pointer to a classic_ctrl_t structure. + * @param cc A pointer to a wii_board_t structure. */ void wii_board_disconnected(struct wii_board_t* wb) { diff --git a/wiiuse/wiiuse_internal.h b/wiiuse/wiiuse_internal.h index 17892f970..f95e056b3 100644 --- a/wiiuse/wiiuse_internal.h +++ b/wiiuse/wiiuse_internal.h @@ -174,7 +174,7 @@ #define EXP_ID_CODE_CLASSIC_CONTROLLER_GENERIC3 0xa0a1a000 #define EXP_ID_CODE_CLASSIC_CONTROLLER_GENERIC4 0x8d8d8e00 #define EXP_ID_CODE_CLASSIC_CONTROLLER_GENERIC5 0x93949400 -#define EXP_ID_CODE_CLASSIC_WIIU_PRO 0xa4200120 +#define EXP_ID_CODE_CLASSIC_WIIU_PRO 0xa4200120 #define EXP_ID_CODE_GUITAR 0xa4200103 #define EXP_ID_CODE_WIIBOARD 0xa4200402 #define EXP_ID_CODE_MOTION_PLUS 0xa4200405 diff --git a/wiiuse/wpad.c b/wiiuse/wpad.c index 484367089..47ccb9797 100644 --- a/wiiuse/wpad.c +++ b/wiiuse/wpad.c @@ -55,7 +55,7 @@ distribution. #define DISCONNECT_AUTH_FAILURE 0x05 /* HCI_AUTHENTICATION_FAILURE */ #define DISCONNECT_TIMEOUT 0x08 /* HCI_CONN_TIMEOUT */ -#define DISCONNECT_USER_ENDED 0x13 /* HCI_OTHER_END_TERMINATED_CONN_USER_ENDED */ +#define DISCONNECT_SYNC_PRESSED 0x13 /* HCI_OTHER_END_TERMINATED_CONN_USER_ENDED */ #define DISCONNECT_BATTERY_DIED 0x14 /* HCI_OTHER_END_TERMINATED_CONN_LOW_RESOURCES */ #define DISCONNECT_POWER_OFF 0x15 /* HCI_OTHER_END_TERMINATED_CONN_ABOUT_TO_POWER_OFF */ #define DISCONNECT_IDLE_TIMEOUT 0x16 /* HCI_CONN_TERMINATED_BY_LOCAL_HOST */ @@ -116,11 +116,12 @@ static s32 __wpad_disconnect(struct _wpad_cb *wpdcb); static void __wpad_eventCB(struct wiimote_t *wm,s32 event); static void __wpad_def_powcb(s32 chan); -static void __wpad_def_synccb(u32 held); +static void __wpad_def_hostsynccb(u32 held); static WPADShutdownCallback __wpad_batcb = NULL; static WPADShutdownCallback __wpad_powcb = __wpad_def_powcb; +static WPADShutdownCallback __wpad_synccb = NULL; static WPADShutdownCallback __wpad_idletimeoutcb = NULL; -static WPADSyncCallback __wpad_synccb = __wpad_def_synccb; +static WPADHostSyncBtnCallback __wpad_hostsynccb = __wpad_def_hostsynccb; extern void __wiiuse_sensorbar_enable(int enable); extern void __SYS_DoPowerCB(void); @@ -244,6 +245,9 @@ wiimote *__wpad_assign_slot(wiimote_listen *wml, u8 err) printf("WPAD Assigning Slot %d (used: 0x%02x)\n", i, __wpads_used); //printf(" bdaddr: %02x:%02x:%02x:%02x:%02x:%02x\n",wml->bdaddr.addr[5],wml->bdaddr.addr[4],wml->bdaddr.addr[3],wml->bdaddr.addr[2],wml->bdaddr.addr[1],wml->bdaddr.addr[0]); BYTES_FROM_BD_ADDR(__wpad_devs.active[i].bdaddr, &wml->bdaddr); + memcpy(__wpad_devs.active[i].name, wml->name, sizeof(__wpad_devs.active[i].name)); + CONF_SetPadDevices(&__wpad_devs); + LWP_SemPost(__wpad_confsave_sem); _CPU_ISR_Restore(level); return __wpads[i]; } @@ -281,7 +285,7 @@ wiimote *__wpad_register_new(wiimote_listen *wml, u8 err) u32 i,j,level; struct bd_addr bdaddr; wiimote *wm; - //printf("Registering Wiimote with system...\n"); + printf("Registering Wiimote with system...\n"); int guestEntry = CONF_PAD_MAX_ACTIVE; int registeredEntry = CONF_PAD_MAX_REGISTERED; @@ -294,7 +298,7 @@ wiimote *__wpad_register_new(wiimote_listen *wml, u8 err) for(i=0; ibdaddr,&bdaddr)) { - //printf("Wiimote guest in slot %d\n", i); + printf("Wiimote guest in slot %d\n", i); guestEntry = i; break; } @@ -304,14 +308,14 @@ wiimote *__wpad_register_new(wiimote_listen *wml, u8 err) for(i=0; ibdaddr,&bdaddr)) { - //printf("Wiimote currently registered in slot %d\n", i); + printf("Wiimote currently registered in slot %d\n", i); registeredEntry = i; break; } } if(BTE_GetPairMode() == PAIR_MODE_NORMAL) { - // Not permanent pair, need to save wml->bdaddr as known controller + // Permanent pair, need to save wml->bdaddr as known controller if(registeredEntry >= CONF_PAD_MAX_REGISTERED) { // If currently guest, we want to allow for upgrade to permanent pair if(guestEntry < CONF_PAD_MAX_ACTIVE) { @@ -322,7 +326,7 @@ wiimote *__wpad_register_new(wiimote_listen *wml, u8 err) memset(&__wpad_guests.guests[--__wpad_guests.num_guests], 0, sizeof(conf_pad_guest_device)); } - //printf("Registering Wiimote '%s' with system...\n", wml->name); + printf("Registering Wiimote '%s' with system...\n", wml->name); memmove(&__wpad_devs.registered[1], &__wpad_devs.registered[0], sizeof(conf_pad_device)*(CONF_PAD_MAX_REGISTERED-1)); BYTES_FROM_BD_ADDR(__wpad_devs.registered[0].bdaddr, &wml->bdaddr); memcpy(__wpad_devs.registered[0].name, wml->name, sizeof(__wpad_devs.registered[0].name)); @@ -334,7 +338,7 @@ wiimote *__wpad_register_new(wiimote_listen *wml, u8 err) } else if(registeredEntry >= CONF_PAD_MAX_REGISTERED) { // Not permanent pair, need to save bdaddr and link key as guest controller if(guestEntry >= CONF_PAD_MAX_ACTIVE) { - //printf("Saving Wiimote '%s' as guest...\n", wml->name); + printf("Saving Wiimote '%s' as guest...\n", wml->name); memmove(&__wpad_guests.guests[1], &__wpad_guests.guests[0], sizeof(conf_pad_guest_device)*(CONF_PAD_MAX_ACTIVE-1)); BYTES_FROM_BD_ADDR(__wpad_guests.guests[0].bdaddr, &wml->bdaddr); memcpy(__wpad_guests.guests[0].name, wml->name, sizeof(__wpad_guests.guests[0].name)); @@ -370,7 +374,7 @@ static s32 __wpad_setevtfilter_finished(s32 result,void *usrdata) u32 i, level; struct bd_addr bdaddr; - printf("__wpad_setevtfilter_finished(%d)\n",result); + //printf("__wpad_setevtfilter_finished(%d)\n",result); _CPU_ISR_Disable(level); if((result==ERR_OK) && (__wpads_inited==WPAD_STATE_ENABLING)) { @@ -390,7 +394,7 @@ static s32 __wpad_init_finished(s32 result,void *usrdata) { u32 level; - printf("__wpad_init_finished(%d)\n",result); + //printf("__wpad_init_finished(%d)\n",result); _CPU_ISR_Disable(level); if(__wpads_inited==WPAD_STATE_ENABLING) { @@ -404,7 +408,7 @@ static s32 __wpad_patch_finished(s32 result,void *usrdata) { u32 level; - printf("__wpad_patch_finished(%d)\n",result); + //printf("__wpad_patch_finished(%d)\n",result); _CPU_ISR_Disable(level); if(__wpads_inited==WPAD_STATE_ENABLING) { @@ -418,7 +422,7 @@ static s32 __readlinkkey_finished(s32 result,void *usrdata) { u32 level; - printf("__readlinkkey_finished(%d)\n",result); + //printf("__readlinkkey_finished(%d)\n",result); _CPU_ISR_Disable(level); if(__wpads_inited==WPAD_STATE_ENABLING) { @@ -433,7 +437,7 @@ static s32 __initcore_finished(s32 result,void *usrdata) { u32 level; - printf("__initcore_finished(%d)\n",result); + //printf("__initcore_finished(%d)\n",result); _CPU_ISR_Disable(level); if((result==ERR_OK) && (__wpads_inited==WPAD_STATE_ENABLING)) { @@ -760,13 +764,13 @@ static void __wpad_eventCB(struct wiimote_t *wm,s32 event) memset(wpdcb->queue_int,0,(sizeof(WPADData)*EVENTQUEUE_LENGTH)); wiiuse_set_ir_position(wm,(CONF_GetSensorBarPosition()^1)); wiiuse_set_ir_sensitivity(wm,CONF_GetIRSensitivity()); - wiiuse_set_leds(wm,(WIIMOTE_LED_1<<(chan%WPAD_BALANCE_BOARD)),NULL); + wiiuse_set_leds(wm,(WIIMOTE_LED_1<<(chan%WPAD_BALANCE_BOARD)),NULL); wiiuse_set_speaker(wm,wpdcb->speaker_enabled); __wpad_setfmt(chan); __wpads_active |= (0x01<unid; wpdcb = &__wpdcb[chan]; wpdcb->wm = wm; @@ -785,7 +789,7 @@ static void __wpad_eventCB(struct wiimote_t *wm,s32 event) case WIIUSE_ACK: break; default: - printf("__wpad_eventCB(%d)\n", event); + printf("__wpad_eventCB(%02x)\n", event); break; } } @@ -796,13 +800,22 @@ void __wpad_disconnectCB(struct bd_addr *pad_addr, u8 reason) u32 level; - printf("__wpad_disconnectCB(%d)\n", __wpads_inited); + //printf("__wpad_disconnectCB(%d)\n", __wpads_inited); _CPU_ISR_Disable(level); if(__wpads_inited == WPAD_STATE_ENABLED) { for(i=0;i= CONF_PAD_MAX_ACTIVE) { - for(i=0; iname); printf(" bdaddr: %02x:%02x:%02x:%02x:%02x:%02x\n",device->bdaddr[0],device->bdaddr[1],device->bdaddr[2],device->bdaddr[3],device->bdaddr[4],device->bdaddr[5]); @@ -1261,7 +1269,7 @@ s32 WPAD_Init(void) conf_pad_device *device = &__wpad_devs.registered[i]; printf("Registered Wiimote %s:\n", device->name); printf(" bdaddr: %02x:%02x:%02x:%02x:%02x:%02x\n",device->bdaddr[0],device->bdaddr[1],device->bdaddr[2],device->bdaddr[3],device->bdaddr[4],device->bdaddr[5]); - }*/ + } if(CONF_GetPadGuestDevices(&__wpad_guests) < 0) { WPAD_Shutdown(); @@ -1275,13 +1283,13 @@ s32 WPAD_Init(void) return WPAD_ERR_BADCONF; } - /*printf("BT.CDIF num_guests %d\n", __wpad_guests.num_guests); + printf("BT.CDIF num_guests %d\n", __wpad_guests.num_guests); for(i=0;i<__wpad_guests.num_guests;i++) { conf_pad_guest_device *device = &__wpad_guests.guests[i]; printf("Guest Wiimote %s:\n", device->name); printf(" bdaddr: %02x:%02x:%02x:%02x:%02x:%02x\n",device->bdaddr[0],device->bdaddr[1],device->bdaddr[2],device->bdaddr[3],device->bdaddr[4],device->bdaddr[5]); - }*/ + } __wpads = wiiuse_init(WPAD_MAX_DEVICES,__wpad_eventCB); if(__wpads==NULL) { @@ -1296,7 +1304,7 @@ s32 WPAD_Init(void) BTE_Init(); BTE_SetDisconnectCallback(__wpad_disconnectCB); - BTE_SetSyncButtonCallback(__wpad_syncbuttonCB); + BTE_SetHostSyncButtonCallback(__wpad_hostsyncbuttonCB); BTE_SetConnectionRequestCallback(__wpad_connreqCB); BTE_SetLinkKeyRequestCallback(__wpad_linkkeyreqCB); BTE_SetLinkKeyNotificationCallback(__wpad_linkkeynotCB); @@ -1691,15 +1699,15 @@ void WPAD_SetIdleTimeoutCallback(WPADShutdownCallback cb) _CPU_ISR_Restore(level); } -void WPAD_SetSyncButtonCallback(WPADSyncCallback cb) +void WPAD_SetHostSyncButtonCallback(WPADHostSyncBtnCallback cb) { u32 level; _CPU_ISR_Disable(level); if(cb) - __wpad_synccb = cb; + __wpad_hostsynccb = cb; else - __wpad_synccb = __wpad_def_synccb; + __wpad_hostsynccb = __wpad_def_hostsynccb; _CPU_ISR_Restore(level); } @@ -1738,7 +1746,7 @@ s32 WPAD_Shutdown(void) u32 cnt = 0; struct _wpad_cb *wpdcb = NULL; - printf("WPAD_Shutdown\n"); + //printf("WPAD_Shutdown\n"); _CPU_ISR_Disable(level); BTE_Close(); From caedcc18ca3ae94c00f285609ffe158f0073aec7 Mon Sep 17 00:00:00 2001 From: Zarithya Date: Mon, 9 Jun 2025 01:29:45 -0700 Subject: [PATCH 16/27] Begin final cleanup --- gc/bte/bte.h | 5 +-- gc/ogc/conf.h | 8 +++-- gc/wiiuse/wpad.h | 2 +- lwbt/bte.c | 64 ++++++++++++++++++++++++++++++------ wiiuse/wpad.c | 84 ++++++++++++++++++++++++++++-------------------- 5 files changed, 113 insertions(+), 50 deletions(-) diff --git a/gc/bte/bte.h b/gc/bte/bte.h index e5903a991..77976d88b 100644 --- a/gc/bte/bte.h +++ b/gc/bte/bte.h @@ -160,8 +160,9 @@ void BTE_SetConnectionRequestCallback(s8 (*callback)(void *arg,struct bd_addr *b 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_WriteStoredLinkKey(struct bd_addr *bdaddr,u8 *key); -void BTE_ClearStoredLinkKeys(void); +s32 BTE_WriteStoredLinkKey(struct bd_addr *bdaddr,u8 *key); +s32 BTE_ClearStoredLinkKeys(void); +s32 BTE_DeleteStoredLinkKey(struct bd_addr *bdaddr); struct bte_pcb* bte_new(void); void bte_free(struct bte_pcb *pcb); diff --git a/gc/ogc/conf.h b/gc/ogc/conf.h index 8c99a5db5..78726ae69 100644 --- a/gc/ogc/conf.h +++ b/gc/ogc/conf.h @@ -127,9 +127,8 @@ enum { }; #define CONF_PAD_MAX_REGISTERED 10 -#define CONF_PAD_MAX_ACTIVE 6 -#define CONF_PAD_MAX_WIIMOTES 4 -#define CONF_PAD_TOTAL (CONF_PAD_MAX_REGISTERED + CONF_PAD_MAX_ACTIVE) +#define CONF_PAD_MAX_ACTIVE 4 +#define CONF_PAD_TOTAL (CONF_PAD_MAX_REGISTERED + CONF_PAD_MAX_ACTIVE + 2) typedef struct _conf_pad_device conf_pad_device; @@ -144,6 +143,8 @@ struct _conf_pads { u8 num_registered; conf_pad_device registered[CONF_PAD_MAX_REGISTERED]; conf_pad_device active[CONF_PAD_MAX_ACTIVE]; + conf_pad_device balance_board; + conf_pad_device unknown; } ATTRIBUTE_PACKED; typedef struct _conf_pad_guest_device conf_pad_guest_device; @@ -159,6 +160,7 @@ typedef struct _conf_pad_guests conf_pad_guests; struct _conf_pad_guests { u8 num_guests; conf_pad_guest_device guests[CONF_PAD_MAX_ACTIVE]; + conf_pad_guest_device unknown[2]; // Balance Board can't be set as guest... } ATTRIBUTE_PACKED; s32 CONF_Init(void); diff --git a/gc/wiiuse/wpad.h b/gc/wiiuse/wpad.h index 94d67caef..f0167d02a 100644 --- a/gc/wiiuse/wpad.h +++ b/gc/wiiuse/wpad.h @@ -43,7 +43,7 @@ enum { WPAD_CHAN_2, WPAD_CHAN_3, WPAD_BALANCE_BOARD, - WPAD_CHAN_5, + WPAD_CHAN_UNKNOWN, WPAD_MAX_DEVICES, }; diff --git a/lwbt/bte.c b/lwbt/bte.c index c37ff88bb..302315432 100644 --- a/lwbt/bte.c +++ b/lwbt/bte.c @@ -552,7 +552,7 @@ s32 BTE_LinkKeyRequestReply(struct bd_addr *bdaddr,u8 *key) u32 level; err_t last_err = ERR_OK; - //printf("BTE_LinkKeyRequestReply\n"); + printf("BTE_LinkKeyRequestReply\n"); _CPU_ISR_Disable(level); btstate.cb = NULL; @@ -570,7 +570,7 @@ s32 BTE_LinkKeyRequestNegativeReply(struct bd_addr *bdaddr) u32 level; err_t last_err = ERR_OK; - //printf("BTE_LinkKeyRequestNegativeReply\n"); + printf("BTE_LinkKeyRequestNegativeReply\n"); _CPU_ISR_Disable(level); btstate.cb = NULL; @@ -629,9 +629,58 @@ void BTE_SetLinkKeyNotificationCallback(err_t (*callback)(void *arg,struct bd_ad _CPU_ISR_Restore(level); } -void BTE_ClearStoredLinkKeys(void) +s32 BTE_WriteStoredLinkKey(struct bd_addr *bdaddr,u8_t *key) { - hci_delete_stored_link_key(NULL, 0x01); + u32 level; + err_t last_err = ERR_OK; + + //printf("BTE_WriteStoredLinkKey\n"); + + _CPU_ISR_Disable(level); + btstate.cb = NULL; + btstate.usrdata = NULL; + btstate.hci_cmddone = 0; + hci_arg(&btstate); + hci_write_stored_link_key(bdaddr,key); + _CPU_ISR_Restore(level); + + return last_err; +} + +s32 BTE_ClearStoredLinkKeys(void) +{ + u32 level; + err_t last_err = ERR_OK; + + //printf("BTE_ClearStoredLinkKeys\n"); + + _CPU_ISR_Disable(level); + btstate.cb = NULL; + btstate.usrdata = NULL; + btstate.hci_cmddone = 0; + hci_arg(&btstate); + hci_delete_stored_link_key(NULL, 1); + _CPU_ISR_Restore(level); + + return last_err; +} + +s32 BTE_DeleteStoredLinkKey(struct bd_addr *bdaddr) +{ + u32 level; + err_t last_err = ERR_OK; + + //printf("BTE_DeleteStoredLinkKey\n"); + + _CPU_ISR_Disable(level); + btstate.cb = NULL; + btstate.usrdata = NULL; + btstate.hci_cmddone = 0; + hci_arg(&btstate); + hci_delete_stored_link_key(bdaddr, 0); + _CPU_ISR_Restore(level); + + return last_err; } struct bte_pcb* bte_new(void) @@ -1184,11 +1233,6 @@ err_t l2cap_disconnect_cfm(void *arg, struct l2cap_pcb *pcb) return ERR_OK; } -void BTE_WriteStoredLinkKey(struct bd_addr *bdaddr,u8_t *key) -{ - hci_write_stored_link_key(bdaddr,key); -} - err_t l2cap_connected(void *arg,struct l2cap_pcb *l2cappcb,u16_t result,u16_t status) { struct bte_pcb *btepcb = (struct bte_pcb*)arg; @@ -1289,7 +1333,7 @@ err_t bte_inquiry_complete(void *arg,struct hci_pcb *pcb,struct hci_inq_res *ire state->inq_complete_cb(ERR_OK,&state->inq_res); _CPU_ISR_Restore(level); } else if (state->pair_mode == PAIR_MODE_NORMAL) - hci_inquiry(0x009E8B33,0x03,btstate.num_maxdevs,bte_inquiry_complete); + hci_inquiry(0x009E8B00,0x03,btstate.num_maxdevs,bte_inquiry_complete); } return ERR_OK; } diff --git a/wiiuse/wpad.c b/wiiuse/wpad.c index 47ccb9797..725edbd07 100644 --- a/wiiuse/wpad.c +++ b/wiiuse/wpad.c @@ -230,7 +230,7 @@ wiimote *__wpad_assign_slot(wiimote_listen *wml, u8 err) if (i >= WPAD_MAX_DEVICES) { - //printf("WPAD Listen Slot Not Valid\n"); + printf("WPAD Listen Slot Not Valid\n"); _CPU_ISR_Restore(level); return NULL; } @@ -244,9 +244,12 @@ wiimote *__wpad_assign_slot(wiimote_listen *wml, u8 err) printf("WPAD Assigning Slot %d (used: 0x%02x)\n", i, __wpads_used); //printf(" bdaddr: %02x:%02x:%02x:%02x:%02x:%02x\n",wml->bdaddr.addr[5],wml->bdaddr.addr[4],wml->bdaddr.addr[3],wml->bdaddr.addr[2],wml->bdaddr.addr[1],wml->bdaddr.addr[0]); - BYTES_FROM_BD_ADDR(__wpad_devs.active[i].bdaddr, &wml->bdaddr); - memcpy(__wpad_devs.active[i].name, wml->name, sizeof(__wpad_devs.active[i].name)); - CONF_SetPadDevices(&__wpad_devs); + if(i>=WPAD_BALANCE_BOARD) { + BYTES_FROM_BD_ADDR(__wpad_devs.balance_board.bdaddr, &wml->bdaddr); + memcpy(__wpad_devs.balance_board.name, wml->name, sizeof(__wpad_devs.balance_board.name)); + } else { + BYTES_FROM_BD_ADDR(__wpad_devs.active[i].bdaddr, &wml->bdaddr); + } LWP_SemPost(__wpad_confsave_sem); _CPU_ISR_Restore(level); return __wpads[i]; @@ -255,10 +258,12 @@ wiimote *__wpad_assign_slot(wiimote_listen *wml, u8 err) static void* __wpad_confsave_thread_func(void *) { __wpad_confsave_thread_running = true; - + while (__wpad_confsave_thread_running) { LWP_SemWait(__wpad_confsave_sem); + CONF_SetPadDevices(&__wpad_devs); + CONF_SetPadGuestDevices(&__wpad_guests); CONF_SaveChanges(); } @@ -267,14 +272,14 @@ static void* __wpad_confsave_thread_func(void *) static void __wpad_confsave_thread_stop(void) { - if (__wpad_confsave_thread != LWP_THREAD_NULL) { - __wpad_confsave_thread_running = false; - LWP_SemPost(__wpad_confsave_sem); - LWP_JoinThread(__wpad_confsave_thread, NULL); - __wpad_confsave_thread = LWP_THREAD_NULL; - } - if (__wpad_confsave_sem != LWP_SEM_NULL) { + if (__wpad_confsave_thread != LWP_THREAD_NULL) { + __wpad_confsave_thread_running = false; + LWP_SemPost(__wpad_confsave_sem); + LWP_JoinThread(__wpad_confsave_thread, NULL); + __wpad_confsave_thread = LWP_THREAD_NULL; + } + LWP_SemDestroy(__wpad_confsave_sem); __wpad_confsave_sem = LWP_SEM_NULL; } @@ -285,7 +290,6 @@ wiimote *__wpad_register_new(wiimote_listen *wml, u8 err) u32 i,j,level; struct bd_addr bdaddr; wiimote *wm; - printf("Registering Wiimote with system...\n"); int guestEntry = CONF_PAD_MAX_ACTIVE; int registeredEntry = CONF_PAD_MAX_REGISTERED; @@ -305,7 +309,7 @@ wiimote *__wpad_register_new(wiimote_listen *wml, u8 err) } // Search for wml->bdaddr in permanent registration list - for(i=0; ibdaddr,&bdaddr)) { printf("Wiimote currently registered in slot %d\n", i); @@ -316,7 +320,7 @@ wiimote *__wpad_register_new(wiimote_listen *wml, u8 err) if(BTE_GetPairMode() == PAIR_MODE_NORMAL) { // Permanent pair, need to save wml->bdaddr as known controller - if(registeredEntry >= CONF_PAD_MAX_REGISTERED) { + if(registeredEntry >= __wpad_devs.num_registered) { // If currently guest, we want to allow for upgrade to permanent pair if(guestEntry < CONF_PAD_MAX_ACTIVE) { // Wipe guest entry and shift later ones up @@ -332,7 +336,6 @@ wiimote *__wpad_register_new(wiimote_listen *wml, u8 err) memcpy(__wpad_devs.registered[0].name, wml->name, sizeof(__wpad_devs.registered[0].name)); if (__wpad_devs.num_registered < CONF_PAD_MAX_REGISTERED) __wpad_devs.num_registered++; - CONF_SetPadDevices(&__wpad_devs); LWP_SemPost(__wpad_confsave_sem); } } else if(registeredEntry >= CONF_PAD_MAX_REGISTERED) { @@ -349,8 +352,8 @@ wiimote *__wpad_register_new(wiimote_listen *wml, u8 err) if(bd_addr_cmp(&wml->bdaddr,&__wpad_keys[i].bdaddr)) { u8 *src = __wpad_keys[i].key; u8 *dst = __wpad_guests.guests[0].link_key; - //printf("Writing guest key: %02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x\n",__wpad_keys[i].key[0],__wpad_keys[i].key[1],__wpad_keys[i].key[2],__wpad_keys[i].key[3],__wpad_keys[i].key[4],__wpad_keys[i].key[5],__wpad_keys[i].key[6],__wpad_keys[i].key[7],__wpad_keys[i].key[8],__wpad_keys[i].key[9],__wpad_keys[i].key[10],__wpad_keys[i].key[11],__wpad_keys[i].key[12],__wpad_keys[i].key[13],__wpad_keys[i].key[14],__wpad_keys[i].key[15]); // Keys are stored in config backwards, like bdaddrs + printf("Writing guest key: %02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x\n",__wpad_keys[i].key[0],__wpad_keys[i].key[1],__wpad_keys[i].key[2],__wpad_keys[i].key[3],__wpad_keys[i].key[4],__wpad_keys[i].key[5],__wpad_keys[i].key[6],__wpad_keys[i].key[7],__wpad_keys[i].key[8],__wpad_keys[i].key[9],__wpad_keys[i].key[10],__wpad_keys[i].key[11],__wpad_keys[i].key[12],__wpad_keys[i].key[13],__wpad_keys[i].key[14],__wpad_keys[i].key[15]); for (j=0;j<16;j++) { dst[j] = src[15 - j]; } @@ -358,7 +361,6 @@ wiimote *__wpad_register_new(wiimote_listen *wml, u8 err) } } - CONF_SetPadGuestDevices(&__wpad_guests); LWP_SemPost(__wpad_confsave_sem); } } @@ -420,13 +422,24 @@ static s32 __wpad_patch_finished(s32 result,void *usrdata) static s32 __readlinkkey_finished(s32 result,void *usrdata) { - u32 level; + u32 i, j, level; //printf("__readlinkkey_finished(%d)\n",result); _CPU_ISR_Disable(level); if(__wpads_inited==WPAD_STATE_ENABLING) { __wpads_bonded = result; + for(i=0;i<__wpad_guests.num_guests;i++) { + BD_ADDR_FROM_BYTES(&__wpad_keys[__wpads_bonded].bdaddr, __wpad_guests.guests[i].bdaddr); + u8 *src = __wpad_guests.guests[i].link_key; + u8 *dst = __wpad_keys[__wpads_bonded].key; + + // Keys are stored in config backwards, like bdaddrs + for (j=0;j<16;j++) { + dst[j] = src[15 - j]; + } + __wpads_bonded++; + } BTE_ApplyPatch(__wpad_patch_finished); } _CPU_ISR_Restore(level); @@ -870,7 +883,7 @@ s32 __wpad_read_remote_name_finished(s32 result,void *userdata) __lwp_thread_dispatchdisable(); if (!strncmp("Nintendo RVL-CNT-", (char *)info->name, 17)) { // Check active list - for(i=0; ibdaddr,&bdaddr)) { //printf("Wiimote already active in slot %d\n", i); @@ -880,8 +893,8 @@ s32 __wpad_read_remote_name_finished(s32 result,void *userdata) } // Not active, try to make active - if(slot >= CONF_PAD_MAX_WIIMOTES) { - for(i=0; i= CONF_PAD_MAX_ACTIVE) { + for(i=0; ibdaddr,&bdaddr)) { //printf("Non-Wiimote already active in slot %d\n", i); @@ -902,7 +915,7 @@ s32 __wpad_read_remote_name_finished(s32 result,void *userdata) // Not active, try to make active if(slot >= CONF_PAD_MAX_ACTIVE) { - for(i=CONF_PAD_MAX_WIIMOTES; i= CONF_PAD_MAX_WIIMOTES) { + if(slot >= CONF_PAD_MAX_ACTIVE) { slot = CONF_PAD_MAX_ACTIVE; } } else { - for(j=CONF_PAD_MAX_WIIMOTES; j Date: Tue, 10 Jun 2025 01:23:09 -0700 Subject: [PATCH 17/27] Guest mode pairing works --- gc/ogc/conf.h | 3 +- lwbt/bte.c | 46 +++----------------------- lwbt/hci.c | 22 ++++++------ lwbt/hci.h | 2 +- wiiuse/wpad.c | 92 ++++++++++++++++++++++++++++++++++++--------------- 5 files changed, 84 insertions(+), 81 deletions(-) diff --git a/gc/ogc/conf.h b/gc/ogc/conf.h index 78726ae69..2ad925493 100644 --- a/gc/ogc/conf.h +++ b/gc/ogc/conf.h @@ -128,7 +128,8 @@ enum { #define CONF_PAD_MAX_REGISTERED 10 #define CONF_PAD_MAX_ACTIVE 4 -#define CONF_PAD_TOTAL (CONF_PAD_MAX_REGISTERED + CONF_PAD_MAX_ACTIVE + 2) +#define CONF_PAD_ACTIVE_AND_OTHER (CONF_PAD_MAX_ACTIVE + 2) +#define CONF_PAD_TOTAL (CONF_PAD_MAX_REGISTERED + CONF_PAD_ACTIVE_AND_OTHER) typedef struct _conf_pad_device conf_pad_device; diff --git a/lwbt/bte.c b/lwbt/bte.c index 302315432..059745ebb 100644 --- a/lwbt/bte.c +++ b/lwbt/bte.c @@ -89,7 +89,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 link_key_not(void *arg,struct bd_addr *bdaddr,u8_t *key); 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); @@ -552,7 +551,7 @@ s32 BTE_LinkKeyRequestReply(struct bd_addr *bdaddr,u8 *key) u32 level; err_t last_err = ERR_OK; - printf("BTE_LinkKeyRequestReply\n"); + //printf("BTE_LinkKeyRequestReply\n"); _CPU_ISR_Disable(level); btstate.cb = NULL; @@ -570,7 +569,7 @@ s32 BTE_LinkKeyRequestNegativeReply(struct bd_addr *bdaddr) u32 level; err_t last_err = ERR_OK; - printf("BTE_LinkKeyRequestNegativeReply\n"); + //printf("BTE_LinkKeyRequestNegativeReply\n"); _CPU_ISR_Disable(level); btstate.cb = NULL; @@ -659,7 +658,7 @@ s32 BTE_ClearStoredLinkKeys(void) btstate.usrdata = NULL; btstate.hci_cmddone = 0; hci_arg(&btstate); - hci_delete_stored_link_key(NULL, 1); + hci_delete_stored_link_key(NULL); _CPU_ISR_Restore(level); return last_err; @@ -677,7 +676,7 @@ s32 BTE_DeleteStoredLinkKey(struct bd_addr *bdaddr) btstate.usrdata = NULL; btstate.hci_cmddone = 0; hci_arg(&btstate); - hci_delete_stored_link_key(bdaddr, 0); + hci_delete_stored_link_key(bdaddr); _CPU_ISR_Restore(level); return last_err; @@ -713,11 +712,6 @@ s32 bte_registerdeviceasync(struct bte_pcb *pcb,struct bd_addr *bdaddr,s32 (*con //printf("bte_registerdeviceasync()\n"); _CPU_ISR_Disable(level); - /*if(lp_is_connected(bdaddr)) { - printf("bdaddr already exists: %02x:%02x:%02x:%02x:%02x:%02x\n",bdaddr->addr[5],bdaddr->addr[4],bdaddr->addr[3],bdaddr->addr[2],bdaddr->addr[1],bdaddr->addr[0]); - err = ERR_CONN; - goto error; - }*/ pcb->err = ERR_USE; pcb->data_pcb = NULL; @@ -736,20 +730,7 @@ s32 bte_registerdeviceasync(struct bte_pcb *pcb,struct bd_addr *bdaddr,s32 (*con if(err!=ERR_OK) { l2cap_close(l2capcb); err = ERR_CONN; - goto error; } - - /*if((l2capcb=l2cap_new())==NULL) { - err = ERR_MEM; - goto error; - } - l2cap_arg(l2capcb,pcb); - - err = l2cap_connect_ind(l2capcb,bdaddr,HIDP_DATA_CHANNEL,l2cap_accepted); - if(err!=ERR_OK) { - l2cap_close(l2capcb); - err = ERR_CONN; - }*/ error: _CPU_ISR_Restore(level); @@ -821,20 +802,7 @@ s32 bte_connectdeviceasync(struct bte_pcb *pcb,struct bd_addr *bdaddr,s32 (*conn if(err!=ERR_OK) { l2cap_close(l2capcb); err = ERR_CONN; - goto error; } - - /*if((l2capcb=l2cap_new())==NULL) { - err = ERR_MEM; - goto error; - } - l2cap_arg(l2capcb,pcb); - - err = l2ca_connect_req(l2capcb,bdaddr,HIDP_DATA_CHANNEL,HCI_ALLOW_ROLE_SWITCH,l2cap_connected); - if(err!=ERR_OK) { - l2cap_close(l2capcb); - err = ERR_CONN; - }*/ error: _CPU_ISR_Restore(level); @@ -1149,7 +1117,6 @@ err_t acl_conn_complete(void *arg,struct bd_addr *bdaddr) err_t acl_auth_complete(void *arg,struct bd_addr *bdaddr) { //printf("acl_auth_complete\n"); - //memcpy(&(btstate.acl_bdaddr),bdaddr,6); hci_write_link_policy_settings(bdaddr,0x0005); return ERR_OK; @@ -1714,11 +1681,6 @@ err_t bte_hci_initsub_complete(void *arg,struct hci_pcb *pcb,u8_t ogf,u8_t ocf,u } else err = ERR_CONN; } else if(ocf==HCI_W_SCAN_EN_OCF) { - /* if(result==HCI_SUCCESS) { - hci_write_authentication_enable(0x01); - } else - err = ERR_CONN; - } else if(ocf==HCI_W_AUTH_ENABLE_OCF) {*/ if(result==HCI_SUCCESS) { hci_cmd_complete(NULL); return __bte_cmdfinish(state,ERR_OK); diff --git a/lwbt/hci.c b/lwbt/hci.c index 92c902860..1992b4ae2 100644 --- a/lwbt/hci.c +++ b/lwbt/hci.c @@ -250,8 +250,8 @@ void hci_connection_complete(err_t (* conn_complete)(void *arg, struct bd_addr * /* * hci_auth_complete(): * - * Used to specify the function that should be called when HCI has received a - * connection complete event. + * Used to specify the function that should be called when HCI has received an + * authentication complete event. */ /*-----------------------------------------------------------------------------------*/ void hci_auth_complete(err_t (* auth_complete)(void *arg, struct bd_addr *bdaddr)) @@ -919,7 +919,7 @@ err_t hci_sniff_mode(struct bd_addr *bdaddr, u16_t max_interval, u16_t min_inter /*-----------------------------------------------------------------------------------*/ /* hci_auth_req(): * - * Control the modes (park, sniff, hold) that an ACL connection can take. + * Request authentication from an ACL connection. * */ /*-----------------------------------------------------------------------------------*/ @@ -1213,9 +1213,10 @@ err_t hci_write_stored_link_key(struct bd_addr *bdaddr, u8_t *link) /* hci_delete_stored_link_key(): * * Deletes a link key from the Bluetooth host controller. + * If bdaddr == NULL, deletes all keys. */ /*-----------------------------------------------------------------------------------*/ -err_t hci_delete_stored_link_key(struct bd_addr *bdaddr, u8_t delete_all) +err_t hci_delete_stored_link_key(struct bd_addr *bdaddr) { struct pbuf *p; @@ -1226,15 +1227,14 @@ err_t hci_delete_stored_link_key(struct bd_addr *bdaddr, u8_t delete_all) /* Assembling command packet */ p = hci_cmd_ass(p, HCI_D_STORED_LINK_KEY_OCF, HCI_HC_BB_OGF, HCI_D_STORED_LINK_KEY_PLEN); /* Assembling cmd prameters */ - if (bdaddr) - { + if (bdaddr) { memcpy(((u8_t *)p->payload) + 4, bdaddr->addr, 6); + ((u8_t *)p->payload)[10] = 0; } - else - { + else { memset(((u8_t *)p->payload) + 4, 0, 6); + ((u8_t *)p->payload)[10] = 1; } - ((u8_t *)p->payload)[10] = delete_all; physbusif_output(p, p->tot_len); btpbuf_free(p); @@ -1634,7 +1634,7 @@ static void hci_cc_host_ctrl(u8_t ocf,struct pbuf *p) u8_t *lap; u8_t i,resp_off; - //printf("hci_cc_host_ctrl(%02x)\n",ocf); + LOG("hci_cc_host_ctrl(%02x)\n",ocf); switch(ocf) { case HCI_SET_HC_TO_H_FC_OCF: if(((u8_t*)p->payload)[0]==HCI_SUCCESS) hci_dev->flow = 1; @@ -1753,7 +1753,7 @@ static void hci_conn_complete_evt(struct pbuf *p) } break; case HCI_HOST_REJECTED_DUE_TO_SECURITY_REASONS: - ERROR("hci_conn_complete_evt: Host rejected due to security reasons (device not paired?)\n"); + ERROR("hci_conn_complete_evt: Device not paired\n"); if(link!=NULL) { hci_close(link); lp_connect_cfm(bdaddr,((u8_t*)p->payload)[10],ERR_CONN); diff --git a/lwbt/hci.h b/lwbt/hci.h index 0972f96b1..ea41af9b4 100644 --- a/lwbt/hci.h +++ b/lwbt/hci.h @@ -415,7 +415,7 @@ err_t hci_reject_connection_request(struct bd_addr *bdaddr, u8_t reason); err_t hci_pin_code_request_reply(struct bd_addr *bdaddr, u8_t pinlen, u8_t *pincode); err_t hci_link_key_req_reply(struct bd_addr *bdaddr, u8_t *link_key); err_t hci_write_stored_link_key(struct bd_addr *bdaddr, u8_t *link); -err_t hci_delete_stored_link_key(struct bd_addr *bdaddr, u8_t delete_all); +err_t hci_delete_stored_link_key(struct bd_addr *bdaddr); err_t hci_set_event_filter(u8_t filter_type,u8_t filter_cond_type,u8_t *cond); err_t hci_write_page_timeout(u16_t timeout); err_t hci_inquiry(u32_t lap,u8_t inq_len,u8_t num_resp,err_t (*inq_complete)(void *arg,struct hci_pcb *pcb,struct hci_inq_res *ires,u16_t result)); diff --git a/wiiuse/wpad.c b/wiiuse/wpad.c index 725edbd07..644361a6e 100644 --- a/wiiuse/wpad.c +++ b/wiiuse/wpad.c @@ -104,7 +104,8 @@ static WPADData wpaddata[WPAD_MAX_DEVICES]; static struct _wpad_cb __wpdcb[WPAD_MAX_DEVICES]; static conf_pads __wpad_devs; static conf_pad_guests __wpad_guests; -static struct linkkey_info __wpad_keys[CONF_PAD_TOTAL]; +static struct linkkey_info __wpad_keys[CONF_PAD_MAX_REGISTERED]; +static struct linkkey_info __wpad_guest_keys[CONF_PAD_ACTIVE_AND_OTHER]; static sem_t __wpad_confsave_sem; static bool __wpad_confsave_thread_running = false; @@ -349,11 +350,11 @@ wiimote *__wpad_register_new(wiimote_listen *wml, u8 err) __wpad_guests.num_guests++; for(i=0; ibdaddr,&__wpad_keys[i].bdaddr)) { - u8 *src = __wpad_keys[i].key; + if(bd_addr_cmp(&wml->bdaddr,&__wpad_guest_keys[i].bdaddr)) { + u8 *src = __wpad_guest_keys[i].key; u8 *dst = __wpad_guests.guests[0].link_key; // Keys are stored in config backwards, like bdaddrs - printf("Writing guest key: %02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x\n",__wpad_keys[i].key[0],__wpad_keys[i].key[1],__wpad_keys[i].key[2],__wpad_keys[i].key[3],__wpad_keys[i].key[4],__wpad_keys[i].key[5],__wpad_keys[i].key[6],__wpad_keys[i].key[7],__wpad_keys[i].key[8],__wpad_keys[i].key[9],__wpad_keys[i].key[10],__wpad_keys[i].key[11],__wpad_keys[i].key[12],__wpad_keys[i].key[13],__wpad_keys[i].key[14],__wpad_keys[i].key[15]); + printf("Writing guest key: %02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x\n",__wpad_guest_keys[i].key[0],__wpad_guest_keys[i].key[1],__wpad_guest_keys[i].key[2],__wpad_guest_keys[i].key[3],__wpad_guest_keys[i].key[4],__wpad_guest_keys[i].key[5],__wpad_guest_keys[i].key[6],__wpad_guest_keys[i].key[7],__wpad_guest_keys[i].key[8],__wpad_guest_keys[i].key[9],__wpad_guest_keys[i].key[10],__wpad_guest_keys[i].key[11],__wpad_guest_keys[i].key[12],__wpad_guest_keys[i].key[13],__wpad_guest_keys[i].key[14],__wpad_guest_keys[i].key[15]); for (j=0;j<16;j++) { dst[j] = src[15 - j]; } @@ -424,21 +425,21 @@ static s32 __readlinkkey_finished(s32 result,void *usrdata) { u32 i, j, level; - //printf("__readlinkkey_finished(%d)\n",result); + printf("__readlinkkey_finished(%d)\n",result); _CPU_ISR_Disable(level); if(__wpads_inited==WPAD_STATE_ENABLING) { __wpads_bonded = result; + for(i=0;i<__wpad_guests.num_guests;i++) { - BD_ADDR_FROM_BYTES(&__wpad_keys[__wpads_bonded].bdaddr, __wpad_guests.guests[i].bdaddr); + BD_ADDR_FROM_BYTES(&__wpad_guest_keys[i].bdaddr, __wpad_guests.guests[i].bdaddr); u8 *src = __wpad_guests.guests[i].link_key; - u8 *dst = __wpad_keys[__wpads_bonded].key; + u8 *dst = __wpad_guest_keys[i].key; // Keys are stored in config backwards, like bdaddrs for (j=0;j<16;j++) { dst[j] = src[15 - j]; } - __wpads_bonded++; } BTE_ApplyPatch(__wpad_patch_finished); } @@ -454,7 +455,7 @@ static s32 __initcore_finished(s32 result,void *usrdata) _CPU_ISR_Disable(level); if((result==ERR_OK) && (__wpads_inited==WPAD_STATE_ENABLING)) { - BTE_ReadStoredLinkKey(__wpad_keys,CONF_PAD_TOTAL,__readlinkkey_finished); + BTE_ReadStoredLinkKey(__wpad_keys,CONF_PAD_MAX_REGISTERED,__readlinkkey_finished); } _CPU_ISR_Restore(level); return ERR_OK; @@ -807,6 +808,7 @@ static void __wpad_eventCB(struct wiimote_t *wm,s32 event) } } +// TODO: Expose to user instead of handling it here? (so user can be aware of any and all disconnects) void __wpad_disconnectCB(struct bd_addr *pad_addr, u8 reason) { int i; @@ -1080,20 +1082,38 @@ static s8 __wpad_connreqCB(void *arg,struct bd_addr *pad_addr,u8 *cod,u8 link_ty static s8 __wpad_linkkeyreqCB(void *arg,struct bd_addr *pad_addr) { + bool found = false; int i; //printf("__wpad_linkkeyreqCB\n"); for(i=0; i<__wpads_bonded; i++) { if(bd_addr_cmp(pad_addr,&__wpad_keys[i].bdaddr)) { + found = true; + //printf("Found key for bdaddr: %02x:%02x:%02x:%02x:%02x:%02x\n",pad_addr->addr[5],pad_addr->addr[4],pad_addr->addr[3],pad_addr->addr[2],pad_addr->addr[1],pad_addr->addr[0]); + //printf(" %02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x\n",__wpad_keys[i].key[0],__wpad_keys[i].key[1],__wpad_keys[i].key[2],__wpad_keys[i].key[3],__wpad_keys[i].key[4],__wpad_keys[i].key[5],__wpad_keys[i].key[6],__wpad_keys[i].key[7],__wpad_keys[i].key[8],__wpad_keys[i].key[9],__wpad_keys[i].key[10],__wpad_keys[i].key[11],__wpad_keys[i].key[12],__wpad_keys[i].key[13],__wpad_keys[i].key[14],__wpad_keys[i].key[15]); + BTE_LinkKeyRequestReply(pad_addr,__wpad_keys[i].key); break; } } - if(i >= CONF_PAD_TOTAL) { - BTE_LinkKeyRequestNegativeReply(pad_addr); + if(!found) { + for(i=0; iaddr[5],pad_addr->addr[4],pad_addr->addr[3],pad_addr->addr[2],pad_addr->addr[1],pad_addr->addr[0]); + //printf(" %02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x\n",__wpad_keys[i].key[0],__wpad_keys[i].key[1],__wpad_keys[i].key[2],__wpad_keys[i].key[3],__wpad_keys[i].key[4],__wpad_keys[i].key[5],__wpad_keys[i].key[6],__wpad_keys[i].key[7],__wpad_keys[i].key[8],__wpad_keys[i].key[9],__wpad_keys[i].key[10],__wpad_keys[i].key[11],__wpad_keys[i].key[12],__wpad_keys[i].key[13],__wpad_keys[i].key[14],__wpad_keys[i].key[15]); + + BTE_LinkKeyRequestReply(pad_addr,__wpad_guest_keys[i].key); + break; + } + } } + if(!found) + BTE_LinkKeyRequestNegativeReply(pad_addr); + return ERR_OK; } @@ -1104,22 +1124,38 @@ static s8 __wpad_linkkeynotCB(void *arg,struct bd_addr *pad_addr,u8 *key) //printf("__wpad_linkkeynotCB\n"); // Only write link key to controller if not doing guest pairing - if(BTE_GetPairMode() == PAIR_MODE_NORMAL) + if(BTE_GetPairMode() == PAIR_MODE_NORMAL) { BTE_WriteStoredLinkKey(pad_addr,key); - for(i=0; i Date: Tue, 10 Jun 2025 02:02:15 -0700 Subject: [PATCH 18/27] Continue cleanup --- gc/bte/bte.h | 15 ++- gc/wiiuse/wiiuse.h | 2 +- libogc/conf.c | 3 +- lwbt/bte.c | 298 ++++++++++++++++++++++----------------------- lwbt/hci.c | 5 +- wiiuse/io_wii.c | 46 ++++--- wiiuse/wpad.c | 125 ++++++++++--------- 7 files changed, 245 insertions(+), 249 deletions(-) diff --git a/gc/bte/bte.h b/gc/bte/bte.h index 77976d88b..1db773499 100644 --- a/gc/bte/bte.h +++ b/gc/bte/bte.h @@ -67,7 +67,7 @@ #define HIDP_PROTO_REPORT 0x01 #define BD_NAME_LEN 248 -#define BD_MAX_INQUIRY_DEVS 255 +#define BD_MAX_INQUIRY_DEVS 255 enum pair_mode { PAIR_MODE_NORMAL, @@ -108,7 +108,7 @@ struct linkkey_info u8 key[16]; }; -struct pad_info +struct pad_name_info { struct bd_addr bdaddr; u8 name[BD_NAME_LEN]; @@ -148,7 +148,7 @@ s32 BTE_InitSub(btecallback cb); s32 BTE_ReadStoredLinkKey(struct linkkey_info *keys,u8 max_cnt,btecallback cb); s32 BTE_ReadBdAddr(struct bd_addr *bdaddr, btecallback cb); s32 BTE_SetEvtFilter(u8 filter_type,u8 filter_cond_type,u8 *cond, btecallback cb); -s32 BTE_ReadRemoteName(struct bd_addr *bdaddr, btecallback cb); +s32 BTE_ReadRemoteName(struct pad_name_info *padinfo, btecallback cb); s32 BTE_Inquiry(u8 max_cnt,u8 flush, btecallback cb); s32 BTE_PeriodicInquiry(u8 max_cnt,u8 flush,btecallback cb); s32 BTE_ExitPeriodicInquiry(void); @@ -170,17 +170,16 @@ void bte_arg(struct bte_pcb *pcb,void *arg); void bte_received(struct bte_pcb *pcb, s32 (*recv)(void *arg,void *buffer,u16 len)); void bte_disconnected(struct bte_pcb *pcb,s32 (disconn_cfm)(void *arg,struct bte_pcb *pcb,u8 err)); -s32 bte_registerdeviceasync(struct bte_pcb *pcb,struct bd_addr *bdaddr,s32 (*conn_cfm)(void *arg,struct bte_pcb *pcb,u8 err)); -s32 bte_registerdeviceasync2(struct bte_pcb *pcb,s32 (*conn_cfm)(void *arg,struct bte_pcb *pcb,u8 err)); -s32 bte_connectdeviceasync(struct bte_pcb *pcb,struct bd_addr *bdaddr,s32 (*conn_cfm)(void *arg,struct bte_pcb *pcb,u8 err)); -s32 bte_connectdeviceasync2(struct bte_pcb *pcb,s32 (*conn_cfm)(void *arg,struct bte_pcb *pcb,u8 err)); - s32 bte_disconnect(struct bte_pcb *pcb); //s32 bte_listen(struct bte_pcb *pcb,struct bd_addr *bdaddr,u8 psm); //s32 bte_accept(struct bte_pcb *pcb,s32 (*recv)(void *arg,void *buffer,u16 len)); +s32 bte_listenasync(struct bte_pcb *pcb,struct bd_addr *bdaddr,s32 (*conn_cfm)(void *arg,struct bte_pcb *pcb,u8 err)); +s32 bte_listenasync_step2(struct bte_pcb *pcb,s32 (*conn_cfm)(void *arg,struct bte_pcb *pcb,u8 err)); //s32 bte_connect(struct bte_pcb *pcb,struct bd_addr *bdaddr,u8 psm,s32 (*recv)(void *arg,void *buffer,u16 len)); //s32 bte_connect_ex(struct bte_pcb *pcb,struct inquiry_info_ex *info,u8 psm,s32 (*recv)(void *arg,void *buffer,u16 len)); +s32 bte_connectasync(struct bte_pcb *pcb,struct bd_addr *bdaddr,s32 (*conn_cfm)(void *arg,struct bte_pcb *pcb,u8 err)); +s32 bte_connectasync_step2(struct bte_pcb *pcb,s32 (*conn_cfm)(void *arg,struct bte_pcb *pcb,u8 err)); s32 bte_senddata(struct bte_pcb *pcb,void *message,u16 len); s32 bte_sendmessage(struct bte_pcb *pcb,void *message,u16 len); s32 bte_sendmessageasync(struct bte_pcb *pcb,void *message,u16 len,s32 (*sent)(void *arg,struct bte_pcb *pcb,u8 err)); diff --git a/gc/wiiuse/wiiuse.h b/gc/wiiuse/wiiuse.h index 30bca753c..dc1754679 100644 --- a/gc/wiiuse/wiiuse.h +++ b/gc/wiiuse/wiiuse.h @@ -699,7 +699,7 @@ WIIUSE_EXPORT extern const char* wiiuse_version(); #ifndef GEKKO WIIUSE_EXPORT extern struct wiimote_t** wiiuse_init(int wiimotes); #else -WIIUSE_EXPORT extern int wiiuse_register(struct wiimote_listen_t *wml, struct bd_addr *bdaddr, u8 *name, struct wiimote_t *(*assign_cb)(struct wiimote_listen_t *wml, u8 err)); +WIIUSE_EXPORT extern int wiiuse_accept(struct wiimote_listen_t *wml, struct bd_addr *bdaddr, u8 *name, struct wiimote_t *(*assign_cb)(struct wiimote_listen_t *wml, u8 err)); WIIUSE_EXPORT extern int wiiuse_connect(struct wiimote_listen_t *wml, struct bd_addr *bdaddr, u8 *name, struct wiimote_t *(*assign_cb)(struct wiimote_listen_t *wml, u8 err)); WIIUSE_EXPORT extern struct wiimote_t** wiiuse_init(int wiimotes, wii_event_cb event_cb); WIIUSE_EXPORT extern void wiiuse_sensorbar_enable(int enable); diff --git a/libogc/conf.c b/libogc/conf.c index 72a2dfaed..70366cfa6 100644 --- a/libogc/conf.c +++ b/libogc/conf.c @@ -443,8 +443,9 @@ s32 CONF_GetPadGuestDevices(conf_pad_guests *pads) s32 CONF_SetPadGuestDevices(const conf_pad_guests *pads) { u8 count; + conf_pad_guests empty = {0}; - if (!pads) return CONF_EBADVALUE; + if (!pads) pads = ∅ count = pads->num_guests; if (count > CONF_PAD_MAX_ACTIVE) return CONF_EBADVALUE; return CONF_Set("BT.CDIF", pads, sizeof(conf_pad_guests)); diff --git a/lwbt/bte.c b/lwbt/bte.c index 059745ebb..49cc8937b 100644 --- a/lwbt/bte.c +++ b/lwbt/bte.c @@ -530,17 +530,17 @@ s32 BTE_SetEvtFilter(u8 filter_type,u8 filter_cond_type,u8 *cond, btecallback cb return ERR_OK; } -s32 BTE_ReadRemoteName(struct bd_addr *bdaddr, btecallback cb) +s32 BTE_ReadRemoteName(struct pad_name_info *padinfo, btecallback cb) { u32 level; err_t last_err = ERR_OK; _CPU_ISR_Disable(level); btstate.cb = cb; - btstate.usrdata = NULL; + btstate.usrdata = padinfo; btstate.hci_cmddone = 0; hci_arg(&btstate); - hci_read_remote_name(bdaddr); + hci_read_remote_name(&padinfo->bdaddr); _CPU_ISR_Restore(level); return last_err; @@ -704,147 +704,6 @@ void bte_free(struct bte_pcb *pcb) btmemb_free(&bte_pcbs, pcb); } -s32 bte_registerdeviceasync(struct bte_pcb *pcb,struct bd_addr *bdaddr,s32 (*conn_cfm)(void *arg,struct bte_pcb *pcb,u8 err)) -{ - u32 level; - s32 err = ERR_OK; - struct l2cap_pcb *l2capcb = NULL; - - //printf("bte_registerdeviceasync()\n"); - _CPU_ISR_Disable(level); - - pcb->err = ERR_USE; - pcb->data_pcb = NULL; - pcb->ctl_pcb = NULL; - pcb->conn_cfm = conn_cfm; - pcb->state = (u32)STATE_CONNECTING; - - bd_addr_set(&(pcb->bdaddr),bdaddr); - if((l2capcb=l2cap_new())==NULL) { - err = ERR_MEM; - goto error; - } - l2cap_arg(l2capcb,pcb); - - err = l2cap_connect_ind(l2capcb,bdaddr,HIDP_CONTROL_CHANNEL,l2cap_accepted); - if(err!=ERR_OK) { - l2cap_close(l2capcb); - err = ERR_CONN; - } - -error: - _CPU_ISR_Restore(level); - //printf("bte_registerdeviceasync(%02x)\n",err); - return err; -} - -s32 bte_registerdeviceasync2(struct bte_pcb *pcb,s32 (*conn_cfm)(void *arg,struct bte_pcb *pcb,u8 err)) -{ - u32 level; - s32 err = ERR_OK; - struct l2cap_pcb *l2capcb = NULL; - - //printf("bte_registerdeviceasync2()\n"); - _CPU_ISR_Disable(level); - if(!lp_is_connected(&(pcb->bdaddr))) { - printf("bdaddr not connected: %02x:%02x:%02x:%02x:%02x:%02x\n",pcb->bdaddr.addr[5],pcb->bdaddr.addr[4],pcb->bdaddr.addr[3],pcb->bdaddr.addr[2],pcb->bdaddr.addr[1],pcb->bdaddr.addr[0]); - err = ERR_CONN; - goto error; - } - - pcb->conn_cfm = conn_cfm; - - if((l2capcb=l2cap_new())==NULL) { - err = ERR_MEM; - goto error; - } - l2cap_arg(l2capcb,pcb); - - err = l2cap_connect_ind(l2capcb,&(pcb->bdaddr),HIDP_DATA_CHANNEL,l2cap_accepted); - if(err!=ERR_OK) { - l2cap_close(l2capcb); - err = ERR_CONN; - } - -error: - _CPU_ISR_Restore(level); - //printf("bte_registerdeviceasync2(%02x)\n",err); - return err; -} - -s32 bte_connectdeviceasync(struct bte_pcb *pcb,struct bd_addr *bdaddr,s32 (*conn_cfm)(void *arg,struct bte_pcb *pcb,u8 err)) -{ - u32 level; - s32 err = ERR_OK; - struct l2cap_pcb *l2capcb = NULL; - - _CPU_ISR_Disable(level); - //printf("bte_connectdeviceasync()\n"); - if(lp_is_connected(bdaddr)) { - printf("bdaddr already exists: %02x:%02x:%02x:%02x:%02x:%02x\n",bdaddr->addr[5],bdaddr->addr[4],bdaddr->addr[3],bdaddr->addr[2],bdaddr->addr[1],bdaddr->addr[0]); - err = ERR_CONN; - goto error; - } - pcb->err = ERR_USE; - pcb->data_pcb = NULL; - pcb->ctl_pcb = NULL; - pcb->conn_cfm = conn_cfm; - pcb->state = (u32)STATE_CONNECTING; - - bd_addr_set(&(pcb->bdaddr),bdaddr); - if((l2capcb=l2cap_new())==NULL) { - err = ERR_MEM; - goto error; - } - l2cap_arg(l2capcb,pcb); - - err = l2ca_connect_req(l2capcb,bdaddr,HIDP_CONTROL_CHANNEL,HCI_ALLOW_ROLE_SWITCH,l2cap_connected); - if(err!=ERR_OK) { - l2cap_close(l2capcb); - err = ERR_CONN; - } - -error: - _CPU_ISR_Restore(level); - //printf("bte_connectdeviceasync(%02x)\n",err); - return err; -} - -s32 bte_connectdeviceasync2(struct bte_pcb *pcb,s32 (*conn_cfm)(void *arg,struct bte_pcb *pcb,u8 err)) -{ - u32 level; - s32 err = ERR_OK; - struct l2cap_pcb *l2capcb = NULL; - - _CPU_ISR_Disable(level); - //printf("bte_connectdeviceasync2()\n"); - - if(!lp_is_connected(&(pcb->bdaddr))) { - printf("bdaddr not connected: %02x:%02x:%02x:%02x:%02x:%02x\n",pcb->bdaddr.addr[5],pcb->bdaddr.addr[4],pcb->bdaddr.addr[3],pcb->bdaddr.addr[2],pcb->bdaddr.addr[1],pcb->bdaddr.addr[0]); - err = ERR_CONN; - goto error; - } - - pcb->conn_cfm = conn_cfm; - - if((l2capcb=l2cap_new())==NULL) { - err = ERR_MEM; - goto error; - } - l2cap_arg(l2capcb,pcb); - - err = l2ca_connect_req(l2capcb,&(pcb->bdaddr),HIDP_DATA_CHANNEL,HCI_ALLOW_ROLE_SWITCH,l2cap_connected); - if(err!=ERR_OK) { - l2cap_close(l2capcb); - err = ERR_CONN; - } - -error: - _CPU_ISR_Restore(level); - //printf("bte_connectdeviceasync2(%02x)\n",err); - return err; -} - s32 BTE_Inquiry(u8 max_cnt,u8 flush,btecallback cb) { u32 level; @@ -943,9 +802,82 @@ s32 bte_connect_ex(struct bte_pcb *pcb,struct inquiry_info_ex *info,u8 psm,s32 ( if((err=hci_reg_dev_info(&(info->bdaddr),info->cod,info->psrm,info->psm,info->co))!=ERR_OK) return err; return bte_connect(pcb,&(info->bdaddr),psm,recv); +}*/ + +s32 bte_connectasync(struct bte_pcb *pcb,struct bd_addr *bdaddr,s32 (*conn_cfm)(void *arg,struct bte_pcb *pcb,u8 err)) +{ + u32 level; + s32 err = ERR_OK; + struct l2cap_pcb *l2capcb = NULL; + + _CPU_ISR_Disable(level); + //printf("bte_connectasync()\n"); + if(lp_is_connected(bdaddr)) { + printf("bdaddr already exists: %02x:%02x:%02x:%02x:%02x:%02x\n",bdaddr->addr[5],bdaddr->addr[4],bdaddr->addr[3],bdaddr->addr[2],bdaddr->addr[1],bdaddr->addr[0]); + err = ERR_CONN; + goto error; + } + pcb->err = ERR_USE; + pcb->data_pcb = NULL; + pcb->ctl_pcb = NULL; + pcb->conn_cfm = conn_cfm; + pcb->state = (u32)STATE_CONNECTING; + + bd_addr_set(&(pcb->bdaddr),bdaddr); + if((l2capcb=l2cap_new())==NULL) { + err = ERR_MEM; + goto error; + } + l2cap_arg(l2capcb,pcb); + + err = l2ca_connect_req(l2capcb,bdaddr,HIDP_CONTROL_CHANNEL,HCI_ALLOW_ROLE_SWITCH,l2cap_connected); + if(err!=ERR_OK) { + l2cap_close(l2capcb); + err = ERR_CONN; + } + +error: + _CPU_ISR_Restore(level); + //printf("bte_connectasync(%02x)\n",err); + return err; } -s32 bte_listen(struct bte_pcb *pcb,struct bd_addr *bdaddr,u8 psm) +s32 bte_connectasync_step2(struct bte_pcb *pcb,s32 (*conn_cfm)(void *arg,struct bte_pcb *pcb,u8 err)) +{ + u32 level; + s32 err = ERR_OK; + struct l2cap_pcb *l2capcb = NULL; + + _CPU_ISR_Disable(level); + //printf("bte_connectasync_step2()\n"); + + if(!lp_is_connected(&(pcb->bdaddr))) { + printf("bdaddr not connected: %02x:%02x:%02x:%02x:%02x:%02x\n",pcb->bdaddr.addr[5],pcb->bdaddr.addr[4],pcb->bdaddr.addr[3],pcb->bdaddr.addr[2],pcb->bdaddr.addr[1],pcb->bdaddr.addr[0]); + err = ERR_CONN; + goto error; + } + + pcb->conn_cfm = conn_cfm; + + if((l2capcb=l2cap_new())==NULL) { + err = ERR_MEM; + goto error; + } + l2cap_arg(l2capcb,pcb); + + err = l2ca_connect_req(l2capcb,&(pcb->bdaddr),HIDP_DATA_CHANNEL,HCI_ALLOW_ROLE_SWITCH,l2cap_connected); + if(err!=ERR_OK) { + l2cap_close(l2capcb); + err = ERR_CONN; + } + +error: + _CPU_ISR_Restore(level); + //printf("bte_connectasync_step2(%02x)\n",err); + return err; +} + +/*s32 bte_listen(struct bte_pcb *pcb,struct bd_addr *bdaddr,u8 psm) { s32 err; u32 level; @@ -968,8 +900,77 @@ s32 bte_listen(struct bte_pcb *pcb,struct bd_addr *bdaddr,u8 psm) _CPU_ISR_Restore(level); return err; +}*/ + +s32 bte_listenasync(struct bte_pcb *pcb,struct bd_addr *bdaddr,s32 (*conn_cfm)(void *arg,struct bte_pcb *pcb,u8 err)) +{ + u32 level; + s32 err = ERR_OK; + struct l2cap_pcb *l2capcb = NULL; + + //printf("bte_listenasync()\n"); + _CPU_ISR_Disable(level); + + pcb->err = ERR_USE; + pcb->data_pcb = NULL; + pcb->ctl_pcb = NULL; + pcb->conn_cfm = conn_cfm; + pcb->state = (u32)STATE_CONNECTING; + + bd_addr_set(&(pcb->bdaddr),bdaddr); + if((l2capcb=l2cap_new())==NULL) { + err = ERR_MEM; + goto error; + } + l2cap_arg(l2capcb,pcb); + + err = l2cap_connect_ind(l2capcb,bdaddr,HIDP_CONTROL_CHANNEL,l2cap_accepted); + if(err!=ERR_OK) { + l2cap_close(l2capcb); + err = ERR_CONN; + } + +error: + _CPU_ISR_Restore(level); + //printf("bte_listenasync(%02x)\n",err); + return err; +} + +s32 bte_listenasync_step2(struct bte_pcb *pcb,s32 (*conn_cfm)(void *arg,struct bte_pcb *pcb,u8 err)) +{ + u32 level; + s32 err = ERR_OK; + struct l2cap_pcb *l2capcb = NULL; + + //printf("bte_listenasync_step2()\n"); + _CPU_ISR_Disable(level); + if(!lp_is_connected(&(pcb->bdaddr))) { + printf("bdaddr not connected: %02x:%02x:%02x:%02x:%02x:%02x\n",pcb->bdaddr.addr[5],pcb->bdaddr.addr[4],pcb->bdaddr.addr[3],pcb->bdaddr.addr[2],pcb->bdaddr.addr[1],pcb->bdaddr.addr[0]); + err = ERR_CONN; + goto error; + } + + pcb->conn_cfm = conn_cfm; + + if((l2capcb=l2cap_new())==NULL) { + err = ERR_MEM; + goto error; + } + l2cap_arg(l2capcb,pcb); + + err = l2cap_connect_ind(l2capcb,&(pcb->bdaddr),HIDP_DATA_CHANNEL,l2cap_accepted); + if(err!=ERR_OK) { + l2cap_close(l2capcb); + err = ERR_CONN; + } + +error: + _CPU_ISR_Restore(level); + //printf("bte_listenasync_step2(%02x)\n",err); + return err; } +/* s32 bte_accept(struct bte_pcb *pcb,s32 (*recv)(void *arg,void *buffer,u16 len)) { u32 level; @@ -1370,7 +1371,7 @@ err_t bte_read_bd_addr_complete(void *arg,struct hci_pcb *pcb,u8_t ogf,u8_t ocf, err_t bte_read_remote_name_complete(void *arg,struct bd_addr *bdaddr,u8_t *name,u8_t result) { - struct pad_info *info; + struct pad_name_info *info; struct bt_state *state = (struct bt_state*)arg; LOG("bte_read_remote_name_complete(%02x,%p)\n", result, bdaddr); @@ -1378,12 +1379,9 @@ err_t bte_read_remote_name_complete(void *arg,struct bd_addr *bdaddr,u8_t *name, if(state==NULL) return ERR_VAL; if(result == HCI_SUCCESS) { - info = (struct pad_info *)malloc(sizeof(struct pad_info)); - if (info == NULL) - return ERR_MEM; + info = (struct pad_name_info *)state->usrdata; bd_addr_set(&info->bdaddr, bdaddr); memcpy(info->name, name, BD_NAME_LEN); - state->usrdata = info; LOG("bte_read_remote_name_complete(%02x,%s)\n",result,name); __bte_cmdfinish(state,ERR_OK); return ERR_OK; diff --git a/lwbt/hci.c b/lwbt/hci.c index 1992b4ae2..a6bd70975 100644 --- a/lwbt/hci.c +++ b/lwbt/hci.c @@ -1753,7 +1753,7 @@ static void hci_conn_complete_evt(struct pbuf *p) } break; case HCI_HOST_REJECTED_DUE_TO_SECURITY_REASONS: - ERROR("hci_conn_complete_evt: Device not paired\n"); + LOG("hci_conn_complete_evt: Device not paired\n"); if(link!=NULL) { hci_close(link); lp_connect_cfm(bdaddr,((u8_t*)p->payload)[10],ERR_CONN); @@ -1779,6 +1779,7 @@ static void hci_conn_complete_evt(struct pbuf *p) static void hci_inquiry_result_evt(struct pbuf *p) { // TODO: implement inquiries like the SM does (canceling inquiry after first valid result) + // Need to research what SM deems "valid" (it cancels inquiry before checking for name...) u8_t num_resp; u32_t i,resp_off; struct bd_addr *bdaddr; @@ -1806,6 +1807,8 @@ static void hci_inquiry_result_evt(struct pbuf *p) static void hci_inquiry_result_with_rssi_evt(struct pbuf *p) { + // TODO: implement inquiries like the SM does (canceling inquiry after first valid result) + // Need to research what SM deems "valid" (it cancels inquiry before checking for name...) u8_t num_resp; u32_t i,resp_off; struct bd_addr *bdaddr; diff --git a/wiiuse/io_wii.c b/wiiuse/io_wii.c index 30f2e034a..5020d75f4 100644 --- a/wiiuse/io_wii.c +++ b/wiiuse/io_wii.c @@ -78,12 +78,12 @@ static s32 __wiiuse_receive(void *arg,void *buffer,u16 len) return ERR_OK; } -static s32 __wiiuse_connected2(void *arg,struct bte_pcb *pcb,u8 err) +static s32 __wiiuse_connected(void *arg,struct bte_pcb *pcb,u8 err) { struct wiimote_listen_t *wml = (struct wiimote_listen_t*)arg; struct wiimote_t *wm; - printf("__wiiuse_connected2(%d)\n", err); + //printf("__wiiuse_connected(%d)\n", err); wm = wml->assign_cb(wml, err); if(!wm) { @@ -96,7 +96,7 @@ static s32 __wiiuse_connected2(void *arg,struct bte_pcb *pcb,u8 err) wm->sock = wml->sock; wm->bdaddr = wml->bdaddr; - //printf("__wiiuse_connected2()\n"); + //printf("__wiiuse_connected()\n"); WIIMOTE_ENABLE_STATE(wm,(WIIMOTE_STATE_CONNECTED|WIIMOTE_STATE_HANDSHAKE)); wm->handshake_state = 0; @@ -105,35 +105,35 @@ static s32 __wiiuse_connected2(void *arg,struct bte_pcb *pcb,u8 err) return ERR_OK; } -static s32 __wiiuse_connected(void *arg,struct bte_pcb *pcb,u8 err) +static s32 __wiiuse_connect_step2(void *arg,struct bte_pcb *pcb,u8 err) { - printf("__wiiuse_connected(%d)\n", err); + //printf("__wiiuse_connect_step2(%d)\n", err); if (err!=ERR_OK) { bte_disconnect(pcb); return ERR_OK; } - err = bte_connectdeviceasync2(pcb,__wiiuse_connected2); + err = bte_connectasync_step2(pcb,__wiiuse_connected); if(err==ERR_OK) return ERR_OK; - printf("__wiiuse_connected: bte_connectdeviceasync2 failed(%d)\n", err); + printf("__wiiuse_connect_step2: bte_connectasync_step2 failed(%d)\n", err); return err; } -static s32 __wiiuse_registered(void *arg,struct bte_pcb *pcb,u8 err) +static s32 __wiiuse_accept_step2(void *arg,struct bte_pcb *pcb,u8 err) { - printf("__wiiuse_registered(%d)\n", err); + //printf("__wiiuse_accept_step2(%d)\n", err); if (err!=ERR_OK) { bte_disconnect(pcb); return ERR_OK; } - err = bte_registerdeviceasync2(pcb,__wiiuse_connected2); + err = bte_listenasync_step2(pcb,__wiiuse_connected); if(err==ERR_OK) return ERR_OK; - printf("__wiiuse_registered: bte_registerdeviceasync2 failed(%d)\n", err); + printf("__wiiuse_accept_step2: bte_listenasync_step2 failed(%d)\n", err); return err; } @@ -149,17 +149,16 @@ void __wiiuse_sensorbar_enable(int enable) IRQ_Restore(level); } -int wiiuse_register(struct wiimote_listen_t *wml, struct bd_addr *bdaddr, u8 *name, struct wiimote_t *(*assign_cb)(struct wiimote_listen_t *wml, u8 err)) +int wiiuse_accept(struct wiimote_listen_t *wml, struct bd_addr *bdaddr, u8 *name, struct wiimote_t *(*assign_cb)(struct wiimote_listen_t *wml, u8 err)) { s32 err; if(!wml || !bdaddr || !name || !assign_cb) return 0; - //printf("wiiuse_register %p, bdaddr: %02x:%02x:%02x:%02x:%02x:%02x\n",wml,bdaddr->addr[5],bdaddr->addr[4],bdaddr->addr[3],bdaddr->addr[2],bdaddr->addr[1],bdaddr->addr[0]); + //printf("wiiuse_accept %p, bdaddr: %02x:%02x:%02x:%02x:%02x:%02x\n",wml,bdaddr->addr[5],bdaddr->addr[4],bdaddr->addr[3],bdaddr->addr[2],bdaddr->addr[1],bdaddr->addr[0]); - if(wml->sock!=NULL) - { - printf("wiiuse_register: wml->sock was not NULL!\n"); + if(wml->sock!=NULL) { + printf("wiiuse_accept: wml->sock was not NULL!\n"); return 0; } @@ -176,7 +175,7 @@ int wiiuse_register(struct wiimote_listen_t *wml, struct bd_addr *bdaddr, u8 *na wml->sock = bte_new(); if (wml->sock==NULL) { - printf("wiiuse_register: bte_new failed to alloc new sock\n"); + printf("wiiuse_accept: bte_new failed to alloc new sock\n"); return 0; } @@ -184,10 +183,10 @@ int wiiuse_register(struct wiimote_listen_t *wml, struct bd_addr *bdaddr, u8 *na bte_received(wml->sock,__wiiuse_receive); bte_disconnected(wml->sock,__wiiuse_disconnected); - err = bte_registerdeviceasync(wml->sock,bdaddr,__wiiuse_registered); + err = bte_listenasync(wml->sock,bdaddr,__wiiuse_accept_step2); if(err==ERR_OK) return 1; - printf("wiiuse_register: bte_registerdeviceasync failed(%d)\n", err); + printf("wiiuse_accept: bte_listenasync failed(%d)\n", err); return 0; } @@ -199,8 +198,7 @@ int wiiuse_connect(struct wiimote_listen_t *wml, struct bd_addr *bdaddr, u8 *nam //printf("wiiuse_connect %p, bdaddr: %02x:%02x:%02x:%02x:%02x:%02x\n",wml,bdaddr->addr[5],bdaddr->addr[4],bdaddr->addr[3],bdaddr->addr[2],bdaddr->addr[1],bdaddr->addr[0]); - if(wml->sock!=NULL) - { + if(wml->sock!=NULL) { printf("wiiuse_connect: wml->sock was not NULL!\n"); return 0; } @@ -228,16 +226,16 @@ int wiiuse_connect(struct wiimote_listen_t *wml, struct bd_addr *bdaddr, u8 *nam //printf("wiiuse_connect\n"); - err = bte_connectdeviceasync(wml->sock,bdaddr,__wiiuse_connected); + err = bte_connectasync(wml->sock,bdaddr,__wiiuse_connect_step2); if(err==ERR_OK) return 1; - printf("wiiuse_connect: bte_registerdeviceasync failed(%d)\n", err); + printf("wiiuse_connect: bte_listenasync failed(%d)\n", err); return 0; } void wiiuse_disconnect(struct wiimote_t *wm) { - printf("wiiuse_disconnect\n"); + //printf("wiiuse_disconnect\n"); if(wm==NULL || wm->sock==NULL) return; diff --git a/wiiuse/wpad.c b/wiiuse/wpad.c index 644361a6e..17fb683fb 100644 --- a/wiiuse/wpad.c +++ b/wiiuse/wpad.c @@ -231,19 +231,19 @@ wiimote *__wpad_assign_slot(wiimote_listen *wml, u8 err) if (i >= WPAD_MAX_DEVICES) { - printf("WPAD Listen Slot Not Valid\n"); + //printf("WPAD Listen Slot Not Valid\n"); _CPU_ISR_Restore(level); return NULL; } if (err) { - printf("WPAD Connection Error %d\n", (s8)err); + //printf("WPAD Connection Error %d\n", (s8)err); __wpads_used &= ~(0x01<bdaddr.addr[5],wml->bdaddr.addr[4],wml->bdaddr.addr[3],wml->bdaddr.addr[2],wml->bdaddr.addr[1],wml->bdaddr.addr[0]); if(i>=WPAD_BALANCE_BOARD) { BYTES_FROM_BD_ADDR(__wpad_devs.balance_board.bdaddr, &wml->bdaddr); @@ -262,10 +262,9 @@ static void* __wpad_confsave_thread_func(void *) while (__wpad_confsave_thread_running) { - LWP_SemWait(__wpad_confsave_sem); CONF_SetPadDevices(&__wpad_devs); - CONF_SetPadGuestDevices(&__wpad_guests); CONF_SaveChanges(); + LWP_SemWait(__wpad_confsave_sem); } return NULL; @@ -303,7 +302,7 @@ wiimote *__wpad_register_new(wiimote_listen *wml, u8 err) for(i=0; ibdaddr,&bdaddr)) { - printf("Wiimote guest in slot %d\n", i); + //printf("Wiimote guest in slot %d\n", i); guestEntry = i; break; } @@ -313,12 +312,12 @@ wiimote *__wpad_register_new(wiimote_listen *wml, u8 err) for(i=0; i<__wpad_devs.num_registered; i++) { BD_ADDR_FROM_BYTES(&(bdaddr),__wpad_devs.registered[i].bdaddr); if(bd_addr_cmp(&wml->bdaddr,&bdaddr)) { - printf("Wiimote currently registered in slot %d\n", i); + //printf("Wiimote currently registered in slot %d\n", i); registeredEntry = i; break; } } - + if(BTE_GetPairMode() == PAIR_MODE_NORMAL) { // Permanent pair, need to save wml->bdaddr as known controller if(registeredEntry >= __wpad_devs.num_registered) { @@ -331,7 +330,7 @@ wiimote *__wpad_register_new(wiimote_listen *wml, u8 err) memset(&__wpad_guests.guests[--__wpad_guests.num_guests], 0, sizeof(conf_pad_guest_device)); } - printf("Registering Wiimote '%s' with system...\n", wml->name); + //printf("Registering Wiimote '%s' with system...\n", wml->name); memmove(&__wpad_devs.registered[1], &__wpad_devs.registered[0], sizeof(conf_pad_device)*(CONF_PAD_MAX_REGISTERED-1)); BYTES_FROM_BD_ADDR(__wpad_devs.registered[0].bdaddr, &wml->bdaddr); memcpy(__wpad_devs.registered[0].name, wml->name, sizeof(__wpad_devs.registered[0].name)); @@ -342,7 +341,7 @@ wiimote *__wpad_register_new(wiimote_listen *wml, u8 err) } else if(registeredEntry >= CONF_PAD_MAX_REGISTERED) { // Not permanent pair, need to save bdaddr and link key as guest controller if(guestEntry >= CONF_PAD_MAX_ACTIVE) { - printf("Saving Wiimote '%s' as guest...\n", wml->name); + //printf("Saving Wiimote '%s' as guest...\n", wml->name); memmove(&__wpad_guests.guests[1], &__wpad_guests.guests[0], sizeof(conf_pad_guest_device)*(CONF_PAD_MAX_ACTIVE-1)); BYTES_FROM_BD_ADDR(__wpad_guests.guests[0].bdaddr, &wml->bdaddr); memcpy(__wpad_guests.guests[0].name, wml->name, sizeof(__wpad_guests.guests[0].name)); @@ -354,15 +353,13 @@ wiimote *__wpad_register_new(wiimote_listen *wml, u8 err) u8 *src = __wpad_guest_keys[i].key; u8 *dst = __wpad_guests.guests[0].link_key; // Keys are stored in config backwards, like bdaddrs - printf("Writing guest key: %02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x\n",__wpad_guest_keys[i].key[0],__wpad_guest_keys[i].key[1],__wpad_guest_keys[i].key[2],__wpad_guest_keys[i].key[3],__wpad_guest_keys[i].key[4],__wpad_guest_keys[i].key[5],__wpad_guest_keys[i].key[6],__wpad_guest_keys[i].key[7],__wpad_guest_keys[i].key[8],__wpad_guest_keys[i].key[9],__wpad_guest_keys[i].key[10],__wpad_guest_keys[i].key[11],__wpad_guest_keys[i].key[12],__wpad_guest_keys[i].key[13],__wpad_guest_keys[i].key[14],__wpad_guest_keys[i].key[15]); + //printf("Writing guest key: %02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x\n",__wpad_guest_keys[i].key[0],__wpad_guest_keys[i].key[1],__wpad_guest_keys[i].key[2],__wpad_guest_keys[i].key[3],__wpad_guest_keys[i].key[4],__wpad_guest_keys[i].key[5],__wpad_guest_keys[i].key[6],__wpad_guest_keys[i].key[7],__wpad_guest_keys[i].key[8],__wpad_guest_keys[i].key[9],__wpad_guest_keys[i].key[10],__wpad_guest_keys[i].key[11],__wpad_guest_keys[i].key[12],__wpad_guest_keys[i].key[13],__wpad_guest_keys[i].key[14],__wpad_guest_keys[i].key[15]); for (j=0;j<16;j++) { dst[j] = src[15 - j]; } break; } } - - LWP_SemPost(__wpad_confsave_sem); } } } @@ -374,19 +371,12 @@ wiimote *__wpad_register_new(wiimote_listen *wml, u8 err) static s32 __wpad_setevtfilter_finished(s32 result,void *usrdata) { - u32 i, level; - struct bd_addr bdaddr; + u32 level; //printf("__wpad_setevtfilter_finished(%d)\n",result); _CPU_ISR_Disable(level); if((result==ERR_OK) && (__wpads_inited==WPAD_STATE_ENABLING)) { - /*for(i=0;iunid; wpdcb = &__wpdcb[chan]; wpdcb->wm = wm; @@ -778,13 +767,12 @@ static void __wpad_eventCB(struct wiimote_t *wm,s32 event) memset(wpdcb->queue_int,0,(sizeof(WPADData)*EVENTQUEUE_LENGTH)); wiiuse_set_ir_position(wm,(CONF_GetSensorBarPosition()^1)); wiiuse_set_ir_sensitivity(wm,CONF_GetIRSensitivity()); - wiiuse_set_leds(wm,(WIIMOTE_LED_1<<(chan%WPAD_BALANCE_BOARD)),NULL); + wiiuse_set_leds(wm,(WIIMOTE_LED_1<<(chan%WPAD_BALANCE_BOARD)),NULL); wiiuse_set_speaker(wm,wpdcb->speaker_enabled); __wpad_setfmt(chan); __wpads_active |= (0x01<unid; wpdcb = &__wpdcb[chan]; wpdcb->wm = wm; @@ -798,21 +786,20 @@ static void __wpad_eventCB(struct wiimote_t *wm,s32 event) memset(&wpaddata[chan],0,sizeof(WPADData)); memset(wpdcb->queue_int,0,(sizeof(WPADData)*EVENTQUEUE_LENGTH)); __wpads_active &= ~(0x01<name, 13)) { //printf("Found controller %s:\n", info->name); //printf(" bdaddr: %02x:%02x:%02x:%02x:%02x:%02x\n",info->bdaddr.addr[5],info->bdaddr.addr[4],info->bdaddr.addr[3],info->bdaddr.addr[2],info->bdaddr.addr[1],info->bdaddr.addr[0]); - __lwp_thread_dispatchdisable(); if (!strncmp("Nintendo RVL-CNT-", (char *)info->name, 17)) { // Check active list for(i=0; iname); //printf(" bdaddr: %02x:%02x:%02x:%02x:%02x:%02x\n",info->bdaddr.addr[5],info->bdaddr.addr[4],info->bdaddr.addr[3],info->bdaddr.addr[2],info->bdaddr.addr[1],info->bdaddr.addr[0]); @@ -945,6 +932,8 @@ s32 __wpad_read_remote_name_finished(s32 result,void *userdata) } if (info) free(info); + _CPU_ISR_Restore(level); + return result; } @@ -1006,18 +995,17 @@ static s8 __wpad_connreqCB(void *arg,struct bd_addr *pad_addr,u8 *cod,u8 link_ty struct bd_addr bdaddr; u8 *name = NULL; - printf("__wpad_connreqCB\n"); + //printf("__wpad_connreqCB\n"); + _CPU_ISR_Disable(level); // Only accept connection requests (i.e. "press any button") if not doing guest pairing if(BTE_GetPairMode() == PAIR_MODE_NORMAL) { if(!bd_addr_cmp(pad_addr,BD_ADDR_ANY)) { - _CPU_ISR_Disable(level); - //__lwp_thread_dispatchdisable(); for(i=0; iaddr[5],pad_addr->addr[4],pad_addr->addr[3],pad_addr->addr[2],pad_addr->addr[1],pad_addr->addr[0]); + _CPU_ISR_Restore(level); return ERR_VAL; } + _CPU_ISR_Restore(level); return ERR_CONN; } @@ -1165,6 +1149,7 @@ static s8 __wpad_linkkeynotCB(void *arg,struct bd_addr *pad_addr,u8 *key) s32 __wpad_inquiry_finished(s32 result,void *userdata) { int i; + struct pad_name_info *padinfo; struct inquiry_res *inq_res = (struct inquiry_res *)userdata; //printf("__wpad_inquiry_finished %d\n", inq_res->count); @@ -1176,7 +1161,11 @@ s32 __wpad_inquiry_finished(s32 result,void *userdata) if(!bd_addr_cmp(&info->bdaddr,BD_ADDR_ANY)) { // Read name of first valid controller //printf("Attempting to read name for bdaddr: %02x:%02x:%02x:%02x:%02x:%02x\n",info->bdaddr.addr[5],info->bdaddr.addr[4],info->bdaddr.addr[3],info->bdaddr.addr[2],info->bdaddr.addr[1],info->bdaddr.addr[0]); - BTE_ReadRemoteName(&info->bdaddr, __wpad_read_remote_name_finished); + padinfo = (struct pad_name_info *)malloc(sizeof(struct pad_name_info)); + if (padinfo == NULL) + return ERR_MEM; + bd_addr_set(&padinfo->bdaddr, &info->bdaddr); + BTE_ReadRemoteName(padinfo, __wpad_read_remote_name_finished); break; } } @@ -1190,7 +1179,7 @@ s32 WPAD_StartPairing(void) u32 level; _CPU_ISR_Disable(level); - printf("Pairing...\n"); + //printf("Pairing...\n"); BTE_Inquiry(BD_MAX_INQUIRY_DEVS, TRUE, __wpad_inquiry_finished); _CPU_ISR_Restore(level); @@ -1203,7 +1192,7 @@ s32 WPAD_WipeSavedControllers(void) int i; _CPU_ISR_Disable(level); - printf("Wiping saved controllers...\n"); + //printf("Wiping saved controllers...\n"); for(i=0;i CONF_PAD_ACTIVE_AND_OTHER) { + WPAD_Shutdown(); + _CPU_ISR_Restore(level); + return WPAD_ERR_BADCONF; + } + + // Clear guest devices after loading so guests are unregistered in case of unexpected shutdown + if(CONF_SetPadGuestDevices(NULL) < 0) { + WPAD_Shutdown(); + _CPU_ISR_Restore(level); + return WPAD_ERR_BADCONF; + } + + /*for(i=0;iname); printf(" bdaddr: %02x:%02x:%02x:%02x:%02x:%02x\n",device->bdaddr[0],device->bdaddr[1],device->bdaddr[2],device->bdaddr[3],device->bdaddr[4],device->bdaddr[5]); @@ -1327,25 +1335,13 @@ s32 WPAD_Init(void) printf(" bdaddr: %02x:%02x:%02x:%02x:%02x:%02x\n",device->bdaddr[0],device->bdaddr[1],device->bdaddr[2],device->bdaddr[3],device->bdaddr[4],device->bdaddr[5]); } - if(CONF_GetPadGuestDevices(&__wpad_guests) < 0) { - WPAD_Shutdown(); - _CPU_ISR_Restore(level); - return WPAD_ERR_BADCONF; - } - - if(__wpad_guests.num_guests > CONF_PAD_MAX_ACTIVE) { - WPAD_Shutdown(); - _CPU_ISR_Restore(level); - return WPAD_ERR_BADCONF; - } - printf("BT.CDIF num_guests %d\n", __wpad_guests.num_guests); for(i=0;i<__wpad_guests.num_guests;i++) { conf_pad_guest_device *device = &__wpad_guests.guests[i]; printf("Guest Wiimote %s:\n", device->name); printf(" bdaddr: %02x:%02x:%02x:%02x:%02x:%02x\n",device->bdaddr[0],device->bdaddr[1],device->bdaddr[2],device->bdaddr[3],device->bdaddr[4],device->bdaddr[5]); - } + }*/ __wpads = wiiuse_init(WPAD_MAX_DEVICES,__wpad_eventCB); if(__wpads==NULL) { @@ -1799,7 +1795,6 @@ s32 WPAD_Shutdown(void) s32 err = WPAD_ERR_NONE; s32 i; u32 level; - u32 cnt = 0; struct _wpad_cb *wpdcb = NULL; //printf("WPAD_Shutdown\n"); @@ -1808,6 +1803,8 @@ s32 WPAD_Shutdown(void) BTE_Close(); __wpad_confsave_thread_stop(); + CONF_SetPadGuestDevices(&__wpad_guests); + CONF_SaveChanges(); __wpads_inited = WPAD_STATE_DISABLED; SYS_RemoveAlarm(__wpad_timer); From ad5b3d721053e554699e849f63868db545ed4304 Mon Sep 17 00:00:00 2001 From: Zarithya Date: Fri, 13 Jun 2025 14:14:41 -0700 Subject: [PATCH 19/27] Cleanup from review --- gc/bte/bd_addr.h | 6 +- gc/bte/bte.h | 7 +- gc/ogc/conf.h | 7 +- gc/wiiuse/wiiuse.h | 1 - libogc/conf.c | 45 +++--- lwbt/bte.c | 359 +++++++++++++++++---------------------------- lwbt/btopt.h | 2 +- lwbt/hci.c | 293 ++++++++++++++++++++++++++++++------ lwbt/hci.h | 292 ++++++++++++++++++++---------------- lwbt/physbusif.c | 8 - wiiuse/events.c | 12 +- wiiuse/io_wii.c | 36 +++-- wiiuse/wpad.c | 166 ++++++++------------- 13 files changed, 662 insertions(+), 572 deletions(-) diff --git a/gc/bte/bd_addr.h b/gc/bte/bd_addr.h index 8016ddb79..90f6614c1 100644 --- a/gc/bte/bd_addr.h +++ b/gc/bte/bd_addr.h @@ -39,12 +39,12 @@ extern "C" { #endif /* __cplusplus */ +#define BD_ADDR_LEN 6 + struct bd_addr { - u8 addr[6]; + u8 addr[BD_ADDR_LEN]; }; -#define BD_ADDR_LEN 6 - #define BD_ADDR_ANY (&(struct bd_addr){{0,0,0,0,0,0}}) #define BD_ADDR_LOCAL (&(struct bd_addr){{0,0,0,0xff,0xff,0xff}}) diff --git a/gc/bte/bte.h b/gc/bte/bte.h index 1db773499..a209fa9cc 100644 --- a/gc/bte/bte.h +++ b/gc/bte/bte.h @@ -66,6 +66,7 @@ #define HIDP_PROTO_BOOT 0x00 #define HIDP_PROTO_REPORT 0x01 +#define BD_LINK_KEY_LEN 16 #define BD_NAME_LEN 248 #define BD_MAX_INQUIRY_DEVS 255 @@ -105,7 +106,7 @@ struct inquiry_res struct linkkey_info { struct bd_addr bdaddr; - u8 key[16]; + u8 key[BD_LINK_KEY_LEN]; }; struct pad_name_info @@ -172,12 +173,8 @@ void bte_disconnected(struct bte_pcb *pcb,s32 (disconn_cfm)(void *arg,struct bte s32 bte_disconnect(struct bte_pcb *pcb); -//s32 bte_listen(struct bte_pcb *pcb,struct bd_addr *bdaddr,u8 psm); -//s32 bte_accept(struct bte_pcb *pcb,s32 (*recv)(void *arg,void *buffer,u16 len)); s32 bte_listenasync(struct bte_pcb *pcb,struct bd_addr *bdaddr,s32 (*conn_cfm)(void *arg,struct bte_pcb *pcb,u8 err)); s32 bte_listenasync_step2(struct bte_pcb *pcb,s32 (*conn_cfm)(void *arg,struct bte_pcb *pcb,u8 err)); -//s32 bte_connect(struct bte_pcb *pcb,struct bd_addr *bdaddr,u8 psm,s32 (*recv)(void *arg,void *buffer,u16 len)); -//s32 bte_connect_ex(struct bte_pcb *pcb,struct inquiry_info_ex *info,u8 psm,s32 (*recv)(void *arg,void *buffer,u16 len)); s32 bte_connectasync(struct bte_pcb *pcb,struct bd_addr *bdaddr,s32 (*conn_cfm)(void *arg,struct bte_pcb *pcb,u8 err)); s32 bte_connectasync_step2(struct bte_pcb *pcb,s32 (*conn_cfm)(void *arg,struct bte_pcb *pcb,u8 err)); s32 bte_senddata(struct bte_pcb *pcb,void *message,u16 len); diff --git a/gc/ogc/conf.h b/gc/ogc/conf.h index 2ad925493..8564b5736 100644 --- a/gc/ogc/conf.h +++ b/gc/ogc/conf.h @@ -165,6 +165,7 @@ struct _conf_pad_guests { } ATTRIBUTE_PACKED; s32 CONF_Init(void); +s32 CONF_SaveChanges(void); s32 CONF_GetLength(const char *name); s32 CONF_GetType(const char *name); s32 CONF_Get(const char *name, void *buffer, u32 length); @@ -182,7 +183,9 @@ s32 CONF_GetCounterBias(u32 *bias); s32 CONF_GetScreenSaverMode(void); s32 CONF_GetDisplayOffsetH(s8 *offset); s32 CONF_GetPadDevices(conf_pads *pads); +s32 CONF_SetPadDevices(const conf_pads *pads); s32 CONF_GetPadGuestDevices(conf_pad_guests *pads); +s32 CONF_SetPadGuestDevices(const conf_pad_guests *pads); s32 CONF_GetNickName(u8 *nickname); s32 CONF_GetAspectRatio(void); s32 CONF_GetEULA(void); @@ -193,10 +196,6 @@ s32 CONF_GetRegion(void); s32 CONF_GetArea(void); s32 CONF_GetVideo(void); -s32 CONF_SetPadDevices(const conf_pads *pads); -s32 CONF_SetPadGuestDevices(const conf_pad_guests *pads); -s32 CONF_SaveChanges(void); - #ifdef __cplusplus } #endif /* __cplusplus */ diff --git a/gc/wiiuse/wiiuse.h b/gc/wiiuse/wiiuse.h index dc1754679..615d85d70 100644 --- a/gc/wiiuse/wiiuse.h +++ b/gc/wiiuse/wiiuse.h @@ -724,7 +724,6 @@ WIIUSE_EXPORT extern int wiiuse_write_streamdata(struct wiimote_t *wm,ubyte *dat /* connect.c */ WIIUSE_EXPORT extern int wiiuse_find(struct wiimote_t** wm, int max_wiimotes, int timeout); -//WIIUSE_EXPORT extern int wiiuse_connect(struct wiimote_t** wm, int wiimotes); WIIUSE_EXPORT extern void wiiuse_disconnect(struct wiimote_t* wm); /* events.c */ diff --git a/libogc/conf.c b/libogc/conf.c index 70366cfa6..c35b40765 100644 --- a/libogc/conf.c +++ b/libogc/conf.c @@ -1,9 +1,11 @@ /*------------------------------------------------------------- -conf.c -- SYSCONF support +conf.c -- SYSCONF & setting.txt support -Copyright (C) 2008 +Copyright (C) 2008-2025 Hector Martin (marcan) +tona +Zarithya This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any @@ -31,17 +33,18 @@ distribution. #include #include #include -#include #include "ipc.h" #include "asm.h" #include "processor.h" #include "conf.h" +#define CONF_FILE_SIZE 0x4000 +#define CONF_TXT_FILE_SIZE 0x100 static int __conf_inited = 0; -static u8 __conf_buffer[0x4000] ATTRIBUTE_ALIGN(32); -static char __conf_txt_buffer[0x101] ATTRIBUTE_ALIGN(32); -static int __conf_buffer_dirty = FALSE; +static u8 __conf_buffer[CONF_FILE_SIZE] ATTRIBUTE_ALIGN(32); +static char __conf_txt_buffer[CONF_TXT_FILE_SIZE + 1] ATTRIBUTE_ALIGN(32); +static int __conf_buffer_dirty = false; static const char __conf_file[] ATTRIBUTE_ALIGN(32) = "/shared2/sys/SYSCONF"; static const char __conf_txt_file[] ATTRIBUTE_ALIGN(32) = "/title/00000001/00000002/data/setting.txt"; @@ -51,7 +54,7 @@ void __CONF_DecryptTextBuffer(void) u32 key = 0x73B5DBFA; int i; - for(i=0; i<0x100; i++) { + for(i=0; i>31); } @@ -67,19 +70,19 @@ s32 CONF_Init(void) fd = IOS_Open(__conf_file,1); if(fd < 0) return fd; - memset(__conf_buffer,0,0x4000); - memset(__conf_txt_buffer,0,0x101); + memset(__conf_buffer,0,CONF_FILE_SIZE); + memset(__conf_txt_buffer,0,CONF_TXT_FILE_SIZE + 1); - ret = IOS_Read(fd, __conf_buffer, 0x4000); + ret = IOS_Read(fd, __conf_buffer, CONF_FILE_SIZE); IOS_Close(fd); - if(ret != 0x4000) return CONF_EBADFILE; + if(ret != CONF_FILE_SIZE) return CONF_EBADFILE; fd = IOS_Open(__conf_txt_file,1); if(fd < 0) return fd; - ret = IOS_Read(fd, __conf_txt_buffer, 0x100); + ret = IOS_Read(fd, __conf_txt_buffer, CONF_TXT_FILE_SIZE); IOS_Close(fd); - if(ret != 0x100) return CONF_EBADFILE; + if(ret != CONF_TXT_FILE_SIZE) return CONF_EBADFILE; if(memcmp(__conf_buffer, "SCv0", 4)) return CONF_EBADFILE; @@ -98,7 +101,7 @@ int __CONF_GetTxt(const char *name, char *buf, int length) if(!__conf_inited) return CONF_ENOTINIT; - while(line < (__conf_txt_buffer+0x100) ) { + while(line < (__conf_txt_buffer+CONF_TXT_FILE_SIZE) ) { delim = strchr(line, '='); if(delim && ((delim - line) == nlen) && !memcmp(name, line, nlen)) { delim++; @@ -117,7 +120,7 @@ int __CONF_GetTxt(const char *name, char *buf, int length) } // skip to line end - while(line < (__conf_txt_buffer+0x100) && *line++ != '\n'); + while(line < (__conf_txt_buffer+CONF_TXT_FILE_SIZE) && *line++ != '\n'); } return CONF_ENOENT; } @@ -238,7 +241,7 @@ s32 CONF_Set(const char *name, const void *buffer, u32 length) default: return CONF_ENOTIMPL; } - __conf_buffer_dirty = TRUE; + __conf_buffer_dirty = true; return len; } @@ -256,12 +259,12 @@ int __CONF_WriteBuffer(void) if (fd < 0) return fd; - ret = IOS_Write(fd, __conf_buffer, 0x4000); + ret = IOS_Write(fd, __conf_buffer, CONF_FILE_SIZE); IOS_Close(fd); - if (ret != 0x4000) + if (ret != CONF_FILE_SIZE) return CONF_EBADFILE; - __conf_buffer_dirty = FALSE; + __conf_buffer_dirty = false; return 0; } @@ -274,10 +277,6 @@ s32 CONF_SaveChanges(void) if (ret < 0) return ret; - /*ret = __CONF_WriteTxtBuffer(); - if (ret < 0) - return ret;*/ - return CONF_ERR_OK; } diff --git a/lwbt/bte.c b/lwbt/bte.c index 49cc8937b..fa46bea32 100644 --- a/lwbt/bte.c +++ b/lwbt/bte.c @@ -391,8 +391,8 @@ void BTE_Init(void) hci_wlp_complete(acl_wlp_completed); 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); + hci_remote_name_req_complete(bte_read_remote_name_complete); + hci_pin_req(pin_req); _CPU_ISR_Restore(level); tb.tv_sec = 1; @@ -500,84 +500,84 @@ s32 BTE_ReadStoredLinkKey(struct linkkey_info *keys,u8 max_cnt,btecallback cb) s32 BTE_ReadBdAddr(struct bd_addr *bdaddr, btecallback cb) { - u32 level; + u32 level; - _CPU_ISR_Disable(level); - btstate.cb = cb; - btstate.usrdata = bdaddr; - btstate.hci_cmddone = 0; - hci_arg(&btstate); - hci_cmd_complete(bte_read_bd_addr_complete); - hci_read_bd_addr(); - _CPU_ISR_Restore(level); + _CPU_ISR_Disable(level); + btstate.cb = cb; + btstate.usrdata = bdaddr; + btstate.hci_cmddone = 0; + hci_arg(&btstate); + hci_cmd_complete(bte_read_bd_addr_complete); + hci_read_bd_addr(); + _CPU_ISR_Restore(level); - return ERR_OK; + return ERR_OK; } s32 BTE_SetEvtFilter(u8 filter_type,u8 filter_cond_type,u8 *cond, btecallback cb) { - u32 level; + u32 level; - _CPU_ISR_Disable(level); - btstate.cb = cb; - btstate.usrdata = NULL; - btstate.hci_cmddone = 0; - hci_arg(&btstate); - hci_cmd_complete(bte_set_evt_filter_complete); - hci_set_event_filter(filter_type,filter_cond_type,cond); - _CPU_ISR_Restore(level); + _CPU_ISR_Disable(level); + btstate.cb = cb; + btstate.usrdata = NULL; + btstate.hci_cmddone = 0; + hci_arg(&btstate); + hci_cmd_complete(bte_set_evt_filter_complete); + hci_set_event_filter(filter_type,filter_cond_type,cond); + _CPU_ISR_Restore(level); - return ERR_OK; + return ERR_OK; } s32 BTE_ReadRemoteName(struct pad_name_info *padinfo, btecallback cb) { - u32 level; + u32 level; err_t last_err = ERR_OK; - _CPU_ISR_Disable(level); - btstate.cb = cb; - btstate.usrdata = padinfo; - btstate.hci_cmddone = 0; - hci_arg(&btstate); - hci_read_remote_name(&padinfo->bdaddr); - _CPU_ISR_Restore(level); + _CPU_ISR_Disable(level); + btstate.cb = cb; + btstate.usrdata = padinfo; + btstate.hci_cmddone = 0; + hci_arg(&btstate); + hci_read_remote_name(&padinfo->bdaddr); + _CPU_ISR_Restore(level); return last_err; } s32 BTE_LinkKeyRequestReply(struct bd_addr *bdaddr,u8 *key) { - u32 level; + u32 level; err_t last_err = ERR_OK; - //printf("BTE_LinkKeyRequestReply\n"); + LOG("BTE_LinkKeyRequestReply\n"); - _CPU_ISR_Disable(level); - btstate.cb = NULL; - btstate.usrdata = NULL; - btstate.hci_cmddone = 0; - hci_arg(&btstate); - hci_link_key_req_reply(bdaddr, key); - _CPU_ISR_Restore(level); + _CPU_ISR_Disable(level); + btstate.cb = NULL; + btstate.usrdata = NULL; + btstate.hci_cmddone = 0; + hci_arg(&btstate); + hci_link_key_req_reply(bdaddr, key); + _CPU_ISR_Restore(level); return last_err; } s32 BTE_LinkKeyRequestNegativeReply(struct bd_addr *bdaddr) { - u32 level; + u32 level; err_t last_err = ERR_OK; - //printf("BTE_LinkKeyRequestNegativeReply\n"); + LOG("BTE_LinkKeyRequestNegativeReply\n"); - _CPU_ISR_Disable(level); - btstate.cb = NULL; - btstate.usrdata = NULL; - btstate.hci_cmddone = 0; - hci_arg(&btstate); - hci_link_key_req_neg_reply(bdaddr); - _CPU_ISR_Restore(level); + _CPU_ISR_Disable(level); + btstate.cb = NULL; + btstate.usrdata = NULL; + btstate.hci_cmddone = 0; + hci_arg(&btstate); + hci_link_key_req_neg_reply(bdaddr); + _CPU_ISR_Restore(level); return last_err; } @@ -630,54 +630,54 @@ void BTE_SetLinkKeyNotificationCallback(err_t (*callback)(void *arg,struct bd_ad s32 BTE_WriteStoredLinkKey(struct bd_addr *bdaddr,u8_t *key) { - u32 level; + u32 level; err_t last_err = ERR_OK; - //printf("BTE_WriteStoredLinkKey\n"); + LOG("BTE_WriteStoredLinkKey\n"); - _CPU_ISR_Disable(level); - btstate.cb = NULL; - btstate.usrdata = NULL; - btstate.hci_cmddone = 0; - hci_arg(&btstate); - hci_write_stored_link_key(bdaddr,key); - _CPU_ISR_Restore(level); + _CPU_ISR_Disable(level); + btstate.cb = NULL; + btstate.usrdata = NULL; + btstate.hci_cmddone = 0; + hci_arg(&btstate); + hci_write_stored_link_key(bdaddr,key); + _CPU_ISR_Restore(level); return last_err; } s32 BTE_ClearStoredLinkKeys(void) { - u32 level; + u32 level; err_t last_err = ERR_OK; - //printf("BTE_ClearStoredLinkKeys\n"); + LOG("BTE_ClearStoredLinkKeys\n"); - _CPU_ISR_Disable(level); - btstate.cb = NULL; - btstate.usrdata = NULL; - btstate.hci_cmddone = 0; - hci_arg(&btstate); - hci_delete_stored_link_key(NULL); - _CPU_ISR_Restore(level); + _CPU_ISR_Disable(level); + btstate.cb = NULL; + btstate.usrdata = NULL; + btstate.hci_cmddone = 0; + hci_arg(&btstate); + hci_delete_stored_link_key(NULL); + _CPU_ISR_Restore(level); return last_err; } s32 BTE_DeleteStoredLinkKey(struct bd_addr *bdaddr) { - u32 level; + u32 level; err_t last_err = ERR_OK; - //printf("BTE_DeleteStoredLinkKey\n"); + LOG("BTE_DeleteStoredLinkKey\n"); - _CPU_ISR_Disable(level); - btstate.cb = NULL; - btstate.usrdata = NULL; - btstate.hci_cmddone = 0; - hci_arg(&btstate); - hci_delete_stored_link_key(bdaddr); - _CPU_ISR_Restore(level); + _CPU_ISR_Disable(level); + btstate.cb = NULL; + btstate.usrdata = NULL; + btstate.hci_cmddone = 0; + hci_arg(&btstate); + hci_delete_stored_link_key(bdaddr); + _CPU_ISR_Restore(level); return last_err; } @@ -769,41 +769,6 @@ s32 bte_disconnect(struct bte_pcb *pcb) return err; } -/* -s32 bte_connect(struct bte_pcb *pcb,struct bd_addr *bdaddr,u8 psm,s32 (*recv)(void *arg,void *buffer,u16 len)) -{ - u32 level; - err_t err = ERR_OK; - - if(pcb==NULL) return ERR_VAL; - - if((pcb->l2capcb=l2cap_new())==NULL) return ERR_MEM; - - pcb->psm = psm; - pcb->recv = recv; - bd_addr_set(&(pcb->bdaddr),bdaddr); - - _CPU_ISR_Disable(level); - pcb->err = ERR_CONN; - l2cap_arg(pcb->l2capcb,pcb); - err = l2ca_connect_req(pcb->l2capcb,bdaddr,psm,HCI_ALLOW_ROLE_SWITCH,l2cap_connected); - if(err==ERR_OK) { - LWP_ThreadSleep(pcb->cmdq); - err = pcb->err; - } - _CPU_ISR_Restore(level); - - return err; -} - -s32 bte_connect_ex(struct bte_pcb *pcb,struct inquiry_info_ex *info,u8 psm,s32 (*recv)(void *arg,void *buffer,u16 len)) -{ - err_t err; - - if((err=hci_reg_dev_info(&(info->bdaddr),info->cod,info->psrm,info->psm,info->co))!=ERR_OK) return err; - return bte_connect(pcb,&(info->bdaddr),psm,recv); -}*/ - s32 bte_connectasync(struct bte_pcb *pcb,struct bd_addr *bdaddr,s32 (*conn_cfm)(void *arg,struct bte_pcb *pcb,u8 err)) { u32 level; @@ -811,9 +776,9 @@ s32 bte_connectasync(struct bte_pcb *pcb,struct bd_addr *bdaddr,s32 (*conn_cfm)( struct l2cap_pcb *l2capcb = NULL; _CPU_ISR_Disable(level); - //printf("bte_connectasync()\n"); + LOG("bte_connectasync()\n"); if(lp_is_connected(bdaddr)) { - printf("bdaddr already exists: %02x:%02x:%02x:%02x:%02x:%02x\n",bdaddr->addr[5],bdaddr->addr[4],bdaddr->addr[3],bdaddr->addr[2],bdaddr->addr[1],bdaddr->addr[0]); + ERROR("bdaddr already exists: %02x:%02x:%02x:%02x:%02x:%02x\n",bdaddr->addr[5],bdaddr->addr[4],bdaddr->addr[3],bdaddr->addr[2],bdaddr->addr[1],bdaddr->addr[0]); err = ERR_CONN; goto error; } @@ -838,7 +803,7 @@ s32 bte_connectasync(struct bte_pcb *pcb,struct bd_addr *bdaddr,s32 (*conn_cfm)( error: _CPU_ISR_Restore(level); - //printf("bte_connectasync(%02x)\n",err); + LOG("bte_connectasync(%02x)\n",err); return err; } @@ -849,10 +814,10 @@ s32 bte_connectasync_step2(struct bte_pcb *pcb,s32 (*conn_cfm)(void *arg,struct struct l2cap_pcb *l2capcb = NULL; _CPU_ISR_Disable(level); - //printf("bte_connectasync_step2()\n"); + LOG("bte_connectasync_step2()\n"); if(!lp_is_connected(&(pcb->bdaddr))) { - printf("bdaddr not connected: %02x:%02x:%02x:%02x:%02x:%02x\n",pcb->bdaddr.addr[5],pcb->bdaddr.addr[4],pcb->bdaddr.addr[3],pcb->bdaddr.addr[2],pcb->bdaddr.addr[1],pcb->bdaddr.addr[0]); + ERROR("bdaddr not connected: %02x:%02x:%02x:%02x:%02x:%02x\n",pcb->bdaddr.addr[5],pcb->bdaddr.addr[4],pcb->bdaddr.addr[3],pcb->bdaddr.addr[2],pcb->bdaddr.addr[1],pcb->bdaddr.addr[0]); err = ERR_CONN; goto error; } @@ -873,42 +838,17 @@ s32 bte_connectasync_step2(struct bte_pcb *pcb,s32 (*conn_cfm)(void *arg,struct error: _CPU_ISR_Restore(level); - //printf("bte_connectasync_step2(%02x)\n",err); + LOG("bte_connectasync_step2(%02x)\n",err); return err; } -/*s32 bte_listen(struct bte_pcb *pcb,struct bd_addr *bdaddr,u8 psm) -{ - s32 err; - u32 level; - struct l2cap_pcb *l2capcb = NULL; - - if(pcb==NULL) return ERR_VAL; - - if((l2capcb=l2cap_new())==NULL) return ERR_MEM; - pcb->l2capcb = NULL; - - pcb->psm = psm; - pcb->recv = NULL; - bd_addr_set(&(pcb->bdaddr),bdaddr); - - _CPU_ISR_Disable(level); - pcb->err = ERR_CONN; - l2cap_arg(l2capcb,pcb); - err = l2cap_connect_ind(l2capcb,psm,l2cap_accepted); - if(err!=ERR_OK) l2cap_close(l2capcb); - - _CPU_ISR_Restore(level); - return err; -}*/ - s32 bte_listenasync(struct bte_pcb *pcb,struct bd_addr *bdaddr,s32 (*conn_cfm)(void *arg,struct bte_pcb *pcb,u8 err)) { u32 level; s32 err = ERR_OK; struct l2cap_pcb *l2capcb = NULL; - //printf("bte_listenasync()\n"); + LOG("bte_listenasync()\n"); _CPU_ISR_Disable(level); pcb->err = ERR_USE; @@ -932,7 +872,7 @@ s32 bte_listenasync(struct bte_pcb *pcb,struct bd_addr *bdaddr,s32 (*conn_cfm)(v error: _CPU_ISR_Restore(level); - //printf("bte_listenasync(%02x)\n",err); + LOG("bte_listenasync(%02x)\n",err); return err; } @@ -942,10 +882,10 @@ s32 bte_listenasync_step2(struct bte_pcb *pcb,s32 (*conn_cfm)(void *arg,struct b s32 err = ERR_OK; struct l2cap_pcb *l2capcb = NULL; - //printf("bte_listenasync_step2()\n"); + LOG("bte_listenasync_step2()\n"); _CPU_ISR_Disable(level); if(!lp_is_connected(&(pcb->bdaddr))) { - printf("bdaddr not connected: %02x:%02x:%02x:%02x:%02x:%02x\n",pcb->bdaddr.addr[5],pcb->bdaddr.addr[4],pcb->bdaddr.addr[3],pcb->bdaddr.addr[2],pcb->bdaddr.addr[1],pcb->bdaddr.addr[0]); + ERROR("bdaddr not connected: %02x:%02x:%02x:%02x:%02x:%02x\n",pcb->bdaddr.addr[5],pcb->bdaddr.addr[4],pcb->bdaddr.addr[3],pcb->bdaddr.addr[2],pcb->bdaddr.addr[1],pcb->bdaddr.addr[0]); err = ERR_CONN; goto error; } @@ -966,29 +906,10 @@ s32 bte_listenasync_step2(struct bte_pcb *pcb,s32 (*conn_cfm)(void *arg,struct b error: _CPU_ISR_Restore(level); - //printf("bte_listenasync_step2(%02x)\n",err); + LOG("bte_listenasync_step2(%02x)\n",err); return err; } -/* -s32 bte_accept(struct bte_pcb *pcb,s32 (*recv)(void *arg,void *buffer,u16 len)) -{ - u32 level; - err_t err = ERR_OK; - - if(pcb==NULL) return ERR_VAL; - - _CPU_ISR_Disable(level); - pcb->recv = recv; - while(pcb->l2capcb==NULL) - LWP_ThreadSleep(pcb->cmdq); - err = pcb->err; - _CPU_ISR_Restore(level); - - return err; -} -*/ - s32 bte_senddata(struct bte_pcb *pcb,void *message,u16 len) { err_t err; @@ -1016,7 +937,7 @@ s32 bte_sendmessageasync(struct bte_pcb *pcb,void *message,u16 len,s32 (*sent)(v struct pbuf *p; struct ctrl_req_t *req; - //printf("bte_sendmessageasync()\n"); + LOG("bte_sendmessageasync()\n"); if(pcb==NULL || message==NULL || len==0) return ERR_VAL; if(pcb->state==STATE_DISCONNECTING || pcb->state==STATE_DISCONNECTED) return ERR_CLSD; @@ -1047,7 +968,7 @@ s32 bte_sendmessage(struct bte_pcb *pcb,void *message,u16 len) struct pbuf *p; struct ctrl_req_t *req; - //printf("bte_sendmessage()\n"); + LOG("bte_sendmessage()\n"); if(pcb==NULL || message==NULL || len==0) return ERR_VAL; if(pcb->state==STATE_DISCONNECTING || pcb->state==STATE_DISCONNECTED) return ERR_CLSD; @@ -1108,8 +1029,7 @@ err_t acl_wlp_completed(void *arg,struct bd_addr *bdaddr) err_t acl_conn_complete(void *arg,struct bd_addr *bdaddr) { - //printf("acl_conn_complete\n"); - //memcpy(&(btstate.acl_bdaddr),bdaddr,6); + LOG("acl_conn_complete\n"); hci_auth_req(bdaddr); return ERR_OK; @@ -1117,7 +1037,7 @@ err_t acl_conn_complete(void *arg,struct bd_addr *bdaddr) err_t acl_auth_complete(void *arg,struct bd_addr *bdaddr) { - //printf("acl_auth_complete\n"); + LOG("acl_auth_complete\n"); hci_write_link_policy_settings(bdaddr,0x0005); return ERR_OK; @@ -1126,7 +1046,7 @@ err_t acl_auth_complete(void *arg,struct bd_addr *bdaddr) err_t pin_req(void *arg,struct bd_addr *bdaddr) { struct bd_addr addr; - //printf("pin_req\n"); + LOG("pin_req\n"); if (btstate.pair_mode == PAIR_MODE_NORMAL) { @@ -1205,7 +1125,7 @@ err_t l2cap_connected(void *arg,struct l2cap_pcb *l2cappcb,u16_t result,u16_t st { struct bte_pcb *btepcb = (struct bte_pcb*)arg; - //printf("l2cap_connected(%02x)\n",result); + LOG("l2cap_connected(%02x)\n",result); if(result==L2CAP_CONN_SUCCESS) { l2cap_recv(l2cappcb,bte_process_input); l2cap_disconnect_ind(l2cappcb,l2cap_disconnected_ind); @@ -1233,7 +1153,7 @@ err_t l2cap_accepted(void *arg,struct l2cap_pcb *l2cappcb,err_t err) { struct bte_pcb *btepcb = (struct bte_pcb*)arg; - //printf("l2cap_accepted(%02x)\n",err); + LOG("l2cap_accepted(%02x)\n",err); if(err==ERR_OK) { l2cap_recv(l2cappcb,bte_process_input); l2cap_disconnect_ind(l2cappcb,l2cap_disconnected_ind); @@ -1287,13 +1207,10 @@ err_t bte_inquiry_complete(void *arg,struct hci_pcb *pcb,struct hci_inq_res *ire inq_res->info[i].psm = p->psm; inq_res->info[i].co = p->co; - /*printf("bdaddr: %02x:%02x:%02x:%02x:%02x:%02x\n",p->bdaddr.addr[5],p->bdaddr.addr[4],p->bdaddr.addr[3],p->bdaddr.addr[2],p->bdaddr.addr[1],p->bdaddr.addr[0]); - printf("cod: %02x%02x%02x\n",p->cod[2],p->cod[1],p->cod[0]); - printf("psrm: %02x\n",p->psrm); - printf("psm: %02x\n",p->psm); - printf("co: %04x\n",p->co);*/ p = p->next; } + // Can't use __bte_cmdfinish here because we need to run a different callback. + // Commands may have run during inquiry which overwrote state->cb. //__bte_cmdfinish(state,ERR_OK); _CPU_ISR_Disable(level); state->last_err = ERR_OK; @@ -1325,7 +1242,7 @@ err_t bte_read_stored_link_key_complete(void *arg,struct hci_pcb *pcb,u8_t ogf,u if(pcb->keyres!=NULL && keys!=NULL) { for(i=0,p=pcb->keyres;inum_maxdevs && p!=NULL;i++) { bd_addr_set(&(keys[i].bdaddr),&(p->bdaddr)); - memcpy(keys[i].key,p->key,16); + memcpy(keys[i].key,p->key,HCI_LINK_KEY_LEN); p = p->next; } @@ -1340,75 +1257,75 @@ err_t bte_read_stored_link_key_complete(void *arg,struct hci_pcb *pcb,u8_t ogf,u err_t bte_read_bd_addr_complete(void *arg,struct hci_pcb *pcb,u8_t ogf,u8_t ocf,u8_t result) { - struct bd_addr *bdaddr; - struct bt_state *state = (struct bt_state*)arg; - - if(!pcb) return ERR_CONN; + struct bd_addr *bdaddr; + struct bt_state *state = (struct bt_state*)arg; - LOG("bte_read_bd_addr_complete(%02x,%p)\n", result, &pcb->bdaddr); + if(!pcb) return ERR_CONN; - if(state==NULL) return ERR_VAL; + LOG("bte_read_bd_addr_complete(%02x,%p)\n", result, &pcb->bdaddr); - if(!(ogf==HCI_INFO_PARAM_OGF && ocf==HCI_R_BD_ADDR_OCF)) return __bte_cmdfinish(state,ERR_CONN); + if(state==NULL) return ERR_VAL; - if(result == HCI_SUCCESS) { - bdaddr = (struct bd_addr *)state->usrdata; - if (bdaddr != NULL) { - bdaddr->addr[0] = pcb->bdaddr.addr[5]; - bdaddr->addr[1] = pcb->bdaddr.addr[4]; - bdaddr->addr[2] = pcb->bdaddr.addr[3]; - bdaddr->addr[3] = pcb->bdaddr.addr[2]; - bdaddr->addr[4] = pcb->bdaddr.addr[1]; - bdaddr->addr[5] = pcb->bdaddr.addr[0]; - } - LOG("bte_read_bd_addr_complete(%02x,%p)\n",result,bdaddr); - __bte_cmdfinish(state,ERR_OK); - return ERR_OK; - } + if(!(ogf==HCI_INFO_PARAM_OGF && ocf==HCI_R_BD_ADDR_OCF)) return __bte_cmdfinish(state,ERR_CONN); + + if(result == HCI_SUCCESS) { + bdaddr = (struct bd_addr *)state->usrdata; + if (bdaddr != NULL) { + bdaddr->addr[0] = pcb->bdaddr.addr[5]; + bdaddr->addr[1] = pcb->bdaddr.addr[4]; + bdaddr->addr[2] = pcb->bdaddr.addr[3]; + bdaddr->addr[3] = pcb->bdaddr.addr[2]; + bdaddr->addr[4] = pcb->bdaddr.addr[1]; + bdaddr->addr[5] = pcb->bdaddr.addr[0]; + } + LOG("bte_read_bd_addr_complete(%02x,%p)\n",result,bdaddr); + __bte_cmdfinish(state,ERR_OK); + return ERR_OK; + } - return __bte_cmdfinish(state,ERR_VAL); + return __bte_cmdfinish(state,ERR_VAL); } err_t bte_read_remote_name_complete(void *arg,struct bd_addr *bdaddr,u8_t *name,u8_t result) { struct pad_name_info *info; - struct bt_state *state = (struct bt_state*)arg; + struct bt_state *state = (struct bt_state*)arg; - LOG("bte_read_remote_name_complete(%02x,%p)\n", result, bdaddr); + LOG("bte_read_remote_name_complete(%02x,%p)\n", result, bdaddr); - if(state==NULL) return ERR_VAL; + if(state==NULL) return ERR_VAL; - if(result == HCI_SUCCESS) { + if(result == HCI_SUCCESS) { info = (struct pad_name_info *)state->usrdata; bd_addr_set(&info->bdaddr, bdaddr); memcpy(info->name, name, BD_NAME_LEN); - LOG("bte_read_remote_name_complete(%02x,%s)\n",result,name); - __bte_cmdfinish(state,ERR_OK); - return ERR_OK; - } + LOG("bte_read_remote_name_complete(%02x,%s)\n",result,name); + __bte_cmdfinish(state,ERR_OK); + return ERR_OK; + } - return __bte_cmdfinish(state,ERR_VAL); + return __bte_cmdfinish(state,ERR_VAL); } err_t bte_set_evt_filter_complete(void *arg,struct hci_pcb *pcb,u8_t ogf,u8_t ocf,u8_t result) { - struct bt_state *state = (struct bt_state*)arg; + struct bt_state *state = (struct bt_state*)arg; - if(!pcb) return ERR_CONN; + if(!pcb) return ERR_CONN; - LOG("bte_set_evt_filter_complete(%02x)\n", result); + LOG("bte_set_evt_filter_complete(%02x)\n", result); - if(state==NULL) return ERR_VAL; + if(state==NULL) return ERR_VAL; - if(!(ogf==HCI_HC_BB_OGF && ocf==HCI_SET_EV_FILTER_OCF)) return __bte_cmdfinish(state,ERR_CONN); + if(!(ogf==HCI_HC_BB_OGF && ocf==HCI_SET_EV_FILTER_OCF)) return __bte_cmdfinish(state,ERR_CONN); - if(result == HCI_SUCCESS) { - LOG("bte_set_evt_filter_complete(%02x)\n",result); - __bte_cmdfinish(state,ERR_OK); - return ERR_OK; - } + if(result == HCI_SUCCESS) { + LOG("bte_set_evt_filter_complete(%02x)\n",result); + __bte_cmdfinish(state,ERR_OK); + return ERR_OK; + } - return __bte_cmdfinish(state,ERR_VAL); + return __bte_cmdfinish(state,ERR_VAL); } /* new init with patching */ diff --git a/lwbt/btopt.h b/lwbt/btopt.h index 6fa38ad59..28485f10b 100644 --- a/lwbt/btopt.h +++ b/lwbt/btopt.h @@ -181,7 +181,7 @@ typedef s8 err_t; * \hideinitializer */ #define LOGGING 0 -#define ERRORING 1 +#define ERRORING 0 /** * Print out a uIP log message. diff --git a/lwbt/hci.c b/lwbt/hci.c index a6bd70975..fbe8c2e4c 100644 --- a/lwbt/hci.c +++ b/lwbt/hci.c @@ -27,6 +27,7 @@ * This file is part of the lwBT Bluetooth stack. * * Author: Conny Ohult + * Modified in 2025 by Zarithya. * */ @@ -54,16 +55,24 @@ #include "btpbuf.h" #include "physbusif.h" -struct hci_pcb *hci_dev = NULL; -struct hci_link *hci_active_links = NULL; +/* The HCI LINK lists. */ +struct hci_link *hci_active_links = NULL; /* List of all active HCI LINKs */ struct hci_link *hci_tmp_link = NULL; -struct hci_link_key *hci_tmp_key = NULL; + +struct hci_pcb *hci_dev = NULL; MEMB(hci_pcbs,sizeof(struct hci_pcb),MEMB_NUM_HCI_PCB); MEMB(hci_links,sizeof(struct hci_link),MEMB_NUM_HCI_LINK); MEMB(hci_inq_results,sizeof(struct hci_inq_res),MEMB_NUM_HCI_INQ); MEMB(hci_link_key_results,sizeof(struct hci_link_key),MEMB_NUM_HCI_LINK_KEY); +/*-----------------------------------------------------------------------------------*/ +/* + * hci_init(): + * + * Initializes the HCI layer. + */ +/*-----------------------------------------------------------------------------------*/ err_t hci_init(void) { btmemr_init(); @@ -80,12 +89,20 @@ err_t hci_init(void) } memset(hci_dev,0,sizeof(struct hci_pcb)); + /* Clear globals */ hci_active_links = NULL; hci_tmp_link = NULL; return ERR_OK; } +/*-----------------------------------------------------------------------------------*/ +/* + * hci_new(): + * + * Creates a new HCI link control block. + */ +/*-----------------------------------------------------------------------------------*/ struct hci_link* hci_new(void) { struct hci_link *link; @@ -97,16 +114,6 @@ struct hci_link* hci_new(void) return link; } -static struct hci_link* hci_get_link(struct bd_addr *bdaddr) -{ - struct hci_link *link; - - for(link=hci_active_links;link!=NULL;link=link->next) { - if(bd_addr_cmp(&(link->bdaddr),bdaddr)) break; - } - return link; -} - /*-----------------------------------------------------------------------------------*/ /* * hci_close(): @@ -162,11 +169,27 @@ void hci_reset_all(void) hci_init(); } +/*-----------------------------------------------------------------------------------*/ +/* + * hci_arg(): + * + * Used to specify the argument that should be passed to callback + * functions. + */ +/*-----------------------------------------------------------------------------------*/ void hci_arg(void *arg) { hci_dev->cbarg = arg; } +/*-----------------------------------------------------------------------------------*/ +/* + * hci_cmd_complete(): + * + * Used to specify the function that should be called when HCI has received a + * command complete event. + */ +/*-----------------------------------------------------------------------------------*/ void hci_cmd_complete(err_t (*cmd_complete)(void *arg,struct hci_pcb *pcb,u8_t ogf,u8_t ocf,u8_t result)) { hci_dev->cmd_complete = cmd_complete; @@ -184,6 +207,7 @@ void hci_pin_req(err_t (* pin_req)(void *arg, struct bd_addr *bdaddr)) { hci_dev->pin_req = pin_req; } + /*-----------------------------------------------------------------------------------*/ /* * hci_sync_btn(): @@ -196,6 +220,7 @@ void hci_sync_btn(void (* sync_btn)(u32_t held)) { hci_dev->sync_btn = sync_btn; } + /*-----------------------------------------------------------------------------------*/ /* * hci_remote_name_req_complete(): @@ -208,6 +233,7 @@ void hci_remote_name_req_complete(err_t (* remote_name_req_complete)(void *arg, { hci_dev->remote_name_req_complete = remote_name_req_complete; } + /*-----------------------------------------------------------------------------------*/ /* * hci_link_key_req(): @@ -220,6 +246,7 @@ void hci_link_key_req(err_t (* link_key_req)(void *arg, struct bd_addr *bdaddr)) { hci_dev->link_key_req = link_key_req; } + /*-----------------------------------------------------------------------------------*/ /* * hci_link_key_not(): @@ -267,11 +294,36 @@ void hci_auth_complete(err_t (* auth_complete)(void *arg, struct bd_addr *bdaddr * successful write link policy complete event. */ /*-----------------------------------------------------------------------------------*/ -void hci_wlp_complete(err_t (* wlp_complete)(void *arg, struct bd_addr *bdaddr)) +void hci_wlp_complete(err_t (* wlp_complete)(void *arg, struct bd_addr *bdaddr)) { hci_dev->wlp_complete = wlp_complete; } +/*-----------------------------------------------------------------------------------*/ +/* + * hci_get_link(): + * + * Used to get the link structure that represents an ACL connection. + */ +/*-----------------------------------------------------------------------------------*/ +static struct hci_link* hci_get_link(struct bd_addr *bdaddr) +{ + struct hci_link *link; + + for(link=hci_active_links;link!=NULL;link=link->next) { + if(bd_addr_cmp(&(link->bdaddr),bdaddr)) break; + } + return link; +} + +/*-----------------------------------------------------------------------------------*/ +/* + * hci_conn_req(): + * + * Used to specify the function that should be called when HCI has received a + * connection request event. + */ +/*-----------------------------------------------------------------------------------*/ void hci_conn_req(err_t (*conn_req)(void *arg,struct bd_addr *bdaddr,u8_t *cod,u8_t link_type)) { hci_dev->conn_req = conn_req; @@ -297,6 +349,12 @@ err_t hci_reg_dev_info(struct bd_addr *bdaddr,u8_t *cod,u8_t psrm,u8_t psm,u16_t return ERR_MEM; } +/*-----------------------------------------------------------------------------------*/ +/* hci_cmd_ass(): + * + * Assemble the command header. + */ +/*-----------------------------------------------------------------------------------*/ static struct pbuf* hci_cmd_ass(struct pbuf *p,u8_t ocf,u8_t ogf,u8_t len) { memset(p->payload, 0, len); @@ -309,6 +367,12 @@ static struct pbuf* hci_cmd_ass(struct pbuf *p,u8_t ocf,u8_t ogf,u8_t len) return p; } +/*-----------------------------------------------------------------------------------*/ +/* hci_reset(): + * + * Reset the Bluetooth host controller, link manager, and radio module. + */ +/*-----------------------------------------------------------------------------------*/ err_t hci_reset(void) { struct pbuf *p = NULL; @@ -326,6 +390,13 @@ err_t hci_reset(void) return ERR_OK; } +/*-----------------------------------------------------------------------------------*/ +/* hci_read_buffer_size(): + * + * Used to read the maximum size of the data portion of HCI ACL packets sent from the + * Host to the Host Controller. + */ +/*-----------------------------------------------------------------------------------*/ err_t hci_read_buffer_size(void) { struct pbuf *p = NULL; @@ -343,6 +414,12 @@ err_t hci_read_buffer_size(void) return ERR_OK; } +/*-----------------------------------------------------------------------------------*/ +/* hci_read_bd_addr(): + * + * Used to retreive the Bluetooth address of the host controller. + */ +/*-----------------------------------------------------------------------------------*/ err_t hci_read_bd_addr(void) { struct pbuf *p = NULL; @@ -377,6 +454,12 @@ err_t hci_read_local_version(void) return ERR_OK; } +/*-----------------------------------------------------------------------------------*/ +/* hci_read_local_features() + * + * Read the features of the connected module + */ +/*-----------------------------------------------------------------------------------*/ err_t hci_read_local_features(void) { struct pbuf *p = NULL; @@ -422,6 +505,12 @@ err_t hci_read_stored_link_key(void) return ERR_OK; } +/*-----------------------------------------------------------------------------------*/ +/* hci_set_event_filter(): + * + * Used by the host to specify different event filters. + */ +/*-----------------------------------------------------------------------------------*/ err_t hci_set_event_filter(u8_t filter_type,u8_t filter_cond_type,u8_t *cond) { u32 cond_len = 0; @@ -481,6 +570,13 @@ err_t hci_set_event_filter(u8_t filter_type,u8_t filter_cond_type,u8_t *cond) return ERR_OK; } +/*-----------------------------------------------------------------------------------*/ +/* hci_write_page_timeout(): + * + * Define the amount of time a connection request will wait for the remote device + * to respond before the local device returns a connection failure. + */ +/*-----------------------------------------------------------------------------------*/ err_t hci_write_page_timeout(u16_t timeout) { struct pbuf *p = NULL; @@ -499,6 +595,13 @@ err_t hci_write_page_timeout(u16_t timeout) return ERR_OK; } +/*-----------------------------------------------------------------------------------*/ +/* hci_write_scan_enable(): + * + * Controls whether or not the Bluetooth device will periodically scan for page + * attempts and/or inquiry requests from other Bluetooth devices. + */ +/*-----------------------------------------------------------------------------------*/ err_t hci_write_scan_enable(u8_t scan_enable) { struct pbuf *p = NULL; @@ -517,6 +620,13 @@ err_t hci_write_scan_enable(u8_t scan_enable) return ERR_OK; } +/*-----------------------------------------------------------------------------------*/ +/* hci_inquiry(): + * + * Cause the Host contoller to enter inquiry mode to discover other nearby + * Bluetooth devices. + */ +/*-----------------------------------------------------------------------------------*/ err_t hci_inquiry(u32_t lap,u8_t inq_len,u8_t num_resp,err_t (*inq_complete)(void *arg,struct hci_pcb *pcb,struct hci_inq_res *ires,u16_t result)) { struct pbuf *p = NULL; @@ -549,6 +659,13 @@ err_t hci_inquiry(u32_t lap,u8_t inq_len,u8_t num_resp,err_t (*inq_complete)(voi return ERR_OK; } +/*-----------------------------------------------------------------------------------*/ +/* hci_periodic_inquiry(): + * + * Cause the Host contoller to enter periodic inquiry mode to discover other nearby + * Bluetooth devices. + */ +/*-----------------------------------------------------------------------------------*/ err_t hci_periodic_inquiry(u32_t lap,u16_t min_period,u16_t max_period,u8_t inq_len,u8_t num_resp,err_t (*inq_complete)(void *arg,struct hci_pcb *pcb,struct hci_inq_res *ires,u16_t result)) { struct pbuf *p = NULL; @@ -570,7 +687,7 @@ err_t hci_periodic_inquiry(u32_t lap,u16_t min_period,u16_t max_period,u8_t inq_ /* Assembling command packet */ p = hci_cmd_ass(p,HCI_PERIODIC_INQUIRY_OCF,HCI_LINK_CTRL_OGF,HCI_PERIODIC_INQUIRY_PLEN); - /* Assembling cmd prameters */ + /* Assembling cmd parameters */ ((u16_t*)p->payload)[2] = htole16(max_period); ((u16_t*)p->payload)[3] = htole16(min_period); ((u8_t*)p->payload)[8] = (lap&0xff); @@ -586,6 +703,12 @@ err_t hci_periodic_inquiry(u32_t lap,u16_t min_period,u16_t max_period,u8_t inq_ return ERR_OK; } +/*-----------------------------------------------------------------------------------*/ +/* hci_periodic_inquiry(): + * + * Cause the Host contoller to exit periodic inquiry mode. + */ +/*-----------------------------------------------------------------------------------*/ err_t hci_exit_periodic_inquiry(void) { struct pbuf *p = NULL; @@ -604,6 +727,12 @@ err_t hci_exit_periodic_inquiry(void) return ERR_OK; } +/*-----------------------------------------------------------------------------------*/ +/* hci_accept_conn_request(): + * + * Accept a connection request. + */ +/*-----------------------------------------------------------------------------------*/ err_t hci_accept_conn_request(struct bd_addr *bdaddr,u8_t role) { struct pbuf *p = NULL; @@ -616,7 +745,7 @@ err_t hci_accept_conn_request(struct bd_addr *bdaddr,u8_t role) /* Assembling command packet */ p = hci_cmd_ass(p,HCI_ACCEPT_CONN_REQ_OCF,HCI_LINK_CTRL_OGF,HCI_ACCEPT_CONN_REQ_PLEN); - /* Assembling cmd prameters */ + /* Assembling cmd parameters */ memcpy((void*)(((u8_t*)p->payload)+4),bdaddr,6); ((u8_t*)p->payload)[10] = role; @@ -626,6 +755,12 @@ err_t hci_accept_conn_request(struct bd_addr *bdaddr,u8_t role) return ERR_OK; } +/*-----------------------------------------------------------------------------------*/ +/* hci_set_event_mask(): + * + * Sets the Host Controller's event mask. + */ +/*-----------------------------------------------------------------------------------*/ err_t hci_set_event_mask(u64_t ev_mask) { u64_t mask; @@ -648,6 +783,12 @@ err_t hci_set_event_mask(u64_t ev_mask) return ERR_OK; } +/*-----------------------------------------------------------------------------------*/ +/* hci_write_local_name(): + * + * Sets the Host Controller's name. + */ +/*-----------------------------------------------------------------------------------*/ err_t hci_write_local_name(u8_t *name,u8_t len) { struct pbuf *p = NULL; @@ -659,7 +800,7 @@ err_t hci_write_local_name(u8_t *name,u8_t len) /* Assembling command packet */ p = hci_cmd_ass(p,HCI_W_LOCAL_NAME_OCF,HCI_HC_BB_OGF,HCI_W_LOCAL_NAME_PLEN); - /* Assembling cmd prameters */ + /* Assembling cmd parameters */ memcpy(((u8_t *)p->payload) + 4, name, len); physbusif_output(p, p->tot_len); @@ -668,6 +809,12 @@ err_t hci_write_local_name(u8_t *name,u8_t len) return ERR_OK; } +/*-----------------------------------------------------------------------------------*/ +/* hci_write_inquiry_mode(): + * + * Sets the Host Controller's PIN type. + */ +/*-----------------------------------------------------------------------------------*/ err_t hci_write_pin_type(u8_t type) { struct pbuf *p = NULL; @@ -679,7 +826,7 @@ err_t hci_write_pin_type(u8_t type) /* Assembling command packet */ p = hci_cmd_ass(p,HCI_W_PIN_TYPE_OCF,HCI_HC_BB_OGF,HCI_W_PIN_TYPE_PLEN); - /* Assembling cmd prameters */ + /* Assembling cmd parameters */ ((u8_t *)p->payload)[4] = type; physbusif_output(p, p->tot_len); @@ -688,6 +835,12 @@ err_t hci_write_pin_type(u8_t type) return ERR_OK; } +/*-----------------------------------------------------------------------------------*/ +/* hci_read_remote_name(): + * + * Read the remote name of a device. + */ +/*-----------------------------------------------------------------------------------*/ err_t hci_read_remote_name(struct bd_addr *bdaddr) { u16_t clock_offset; @@ -717,7 +870,7 @@ err_t hci_read_remote_name(struct bd_addr *bdaddr) /* Assembling command packet */ p = hci_cmd_ass(p,HCI_R_REMOTE_NAME_OCF,HCI_LINK_CTRL_OGF,HCI_R_REMOTE_NAME_PLEN); - /* Assembling cmd prameters */ + /* Assembling cmd parameters */ memcpy(((u8_t *)p->payload+4),bdaddr->addr,6); ((u8_t*)p->payload)[10] = page_scan_repetition_mode; ((u8_t*)p->payload)[11] = page_scan_mode; @@ -729,6 +882,12 @@ err_t hci_read_remote_name(struct bd_addr *bdaddr) return ERR_OK; } +/*-----------------------------------------------------------------------------------*/ +/* hci_read_clock_offset(): + * + * Read clock offset from an ACL connection. + */ +/*-----------------------------------------------------------------------------------*/ err_t hci_read_clock_offset(struct bd_addr *bdaddr) { struct pbuf *p = NULL; @@ -749,7 +908,7 @@ err_t hci_read_clock_offset(struct bd_addr *bdaddr) /* Assembling command packet */ p = hci_cmd_ass(p,HCI_R_CLOCK_OFFSET_OCF,HCI_LINK_CTRL_OGF,HCI_R_CLOCK_OFFSET_PLEN); - /* Assembling cmd prameters */ + /* Assembling cmd parameters */ ((u16_t *)p->payload)[2] = htole16(link->connhdl); physbusif_output(p, p->tot_len); @@ -758,6 +917,12 @@ err_t hci_read_clock_offset(struct bd_addr *bdaddr) return ERR_OK; } +/*-----------------------------------------------------------------------------------*/ +/* hci_read_remote_version_info(): + * + * Read remote version info from an ACL connection. + */ +/*-----------------------------------------------------------------------------------*/ err_t hci_read_remote_version_info(u16_t connhdl) { struct pbuf *p = NULL; @@ -769,7 +934,7 @@ err_t hci_read_remote_version_info(u16_t connhdl) /* Assembling command packet */ p = hci_cmd_ass(p,HCI_R_REMOTE_VERSION_INFO_OCF,HCI_LINK_CTRL_OGF,HCI_R_REMOTE_VERSION_INFO_PLEN); - /* Assembling cmd prameters */ + /* Assembling cmd parameters */ ((u16_t *)p->payload)[2] = htole16(connhdl); physbusif_output(p, p->tot_len); @@ -778,6 +943,12 @@ err_t hci_read_remote_version_info(u16_t connhdl) return ERR_OK; } +/*-----------------------------------------------------------------------------------*/ +/* hci_read_remote_features(): + * + * Read remote features from an ACL connection. + */ +/*-----------------------------------------------------------------------------------*/ err_t hci_read_remote_features(u16_t connhdl) { struct pbuf *p = NULL; @@ -789,7 +960,7 @@ err_t hci_read_remote_features(u16_t connhdl) /* Assembling command packet */ p = hci_cmd_ass(p,HCI_R_REMOTE_FEATURES_OCF,HCI_LINK_CTRL_OGF,HCI_R_REMOTE_FEATURES_PLEN); - /* Assembling cmd prameters */ + /* Assembling cmd parameters */ ((u16_t *)p->payload)[2] = htole16(connhdl); physbusif_output(p, p->tot_len); @@ -798,6 +969,12 @@ err_t hci_read_remote_features(u16_t connhdl) return ERR_OK; } +/*-----------------------------------------------------------------------------------*/ +/* hci_write_inquiry_mode(): + * + * Sets the Host Controller's inquiry mode. + */ +/*-----------------------------------------------------------------------------------*/ err_t hci_write_inquiry_mode(u8_t mode) { struct pbuf *p = NULL; @@ -809,7 +986,7 @@ err_t hci_write_inquiry_mode(u8_t mode) /* Assembling command packet */ p = hci_cmd_ass(p,HCI_W_INQUIRY_MODE_OCF,HCI_HC_BB_OGF,HCI_W_INQUIRY_MODE_PLEN); - /* Assembling cmd prameters */ + /* Assembling cmd parameters */ ((u8_t*)p->payload)[4] = mode; physbusif_output(p, p->tot_len); @@ -818,6 +995,12 @@ err_t hci_write_inquiry_mode(u8_t mode) return ERR_OK; } +/*-----------------------------------------------------------------------------------*/ +/* hci_write_page_scan_type(): + * + * Sets the Host Controller's page scan type. + */ +/*-----------------------------------------------------------------------------------*/ err_t hci_write_page_scan_type(u8_t type) { struct pbuf *p = NULL; @@ -829,7 +1012,7 @@ err_t hci_write_page_scan_type(u8_t type) /* Assembling command packet */ p = hci_cmd_ass(p,HCI_W_PAGE_SCAN_TYPE_OCF,HCI_HC_BB_OGF,HCI_W_PAGE_SCAN_TYPE_PLEN); - /* Assembling cmd prameters */ + /* Assembling cmd parameters */ ((u8_t*)p->payload)[4] = type; physbusif_output(p, p->tot_len); @@ -838,6 +1021,12 @@ err_t hci_write_page_scan_type(u8_t type) return ERR_OK; } +/*-----------------------------------------------------------------------------------*/ +/* hci_write_inquiry_scan_type(): + * + * Sets the Host Controller's inquiry scan type. + */ +/*-----------------------------------------------------------------------------------*/ err_t hci_write_inquiry_scan_type(u8_t type) { struct pbuf *p = NULL; @@ -849,7 +1038,7 @@ err_t hci_write_inquiry_scan_type(u8_t type) /* Assembling command packet */ p = hci_cmd_ass(p,HCI_W_INQUIRY_SCAN_TYPE_OCF,HCI_HC_BB_OGF,HCI_W_INQUIRY_SCAN_TYPE_PLEN); - /* Assembling cmd prameters */ + /* Assembling cmd parameters */ ((u8_t*)p->payload)[4] = type; physbusif_output(p, p->tot_len); @@ -858,6 +1047,12 @@ err_t hci_write_inquiry_scan_type(u8_t type) return ERR_OK; } +/*-----------------------------------------------------------------------------------*/ +/* hci_vendor_specific_command(): + * + * Sends a vendor specific command to the Host Controller. + */ +/*-----------------------------------------------------------------------------------*/ err_t hci_vendor_specific_command(u8_t ocf,u8_t ogf,void *data,u8_t len) { struct pbuf *p = NULL; @@ -869,7 +1064,7 @@ err_t hci_vendor_specific_command(u8_t ocf,u8_t ogf,void *data,u8_t len) /* Assembling command packet */ p = hci_cmd_ass(p,ocf,ogf,HCI_W_VENDOR_CMD_PLEN + len); - /* Assembling cmd prameters */ + /* Assembling cmd parameters */ memcpy(((u8_t*)p->payload + 4),data,len); physbusif_output(p, p->tot_len); @@ -877,6 +1072,7 @@ err_t hci_vendor_specific_command(u8_t ocf,u8_t ogf,void *data,u8_t len) return ERR_OK; } + /*-----------------------------------------------------------------------------------*/ /* hci_sniff_mode(): * @@ -903,7 +1099,7 @@ err_t hci_sniff_mode(struct bd_addr *bdaddr, u16_t max_interval, u16_t min_inter /* Assembling command packet */ p = hci_cmd_ass(p, HCI_SNIFF_MODE_OCF, HCI_LINK_POLICY_OGF, HCI_SNIFF_MODE_PLEN); - /* Assembling cmd prameters */ + /* Assembling cmd parameters */ ((u16_t *)p->payload)[2] = htole16(link->connhdl); ((u16_t *)p->payload)[3] = htole16(max_interval); ((u16_t *)p->payload)[4] = htole16(min_interval); @@ -943,7 +1139,7 @@ err_t hci_auth_req(struct bd_addr *bdaddr) /* Assembling command packet */ p = hci_cmd_ass(p, HCI_AUTH_REQUESTED_OCF, HCI_LINK_CTRL_OGF, HCI_AUTH_REQUESTED_PLEN); - /* Assembling cmd prameters */ + /* Assembling cmd parameters */ ((u16_t *)p->payload)[2] = htole16(link->connhdl); physbusif_output(p, p->tot_len); @@ -978,7 +1174,7 @@ err_t hci_write_link_policy_settings(struct bd_addr *bdaddr, u16_t link_policy) /* Assembling command packet */ p = hci_cmd_ass(p, HCI_W_LINK_POLICY_OCF, HCI_LINK_POLICY_OGF, HCI_W_LINK_POLICY_PLEN); - /* Assembling cmd prameters */ + /* Assembling cmd parameters */ ((u16_t *)p->payload)[2] = htole16(link->connhdl); ((u16_t *)p->payload)[3] = htole16(link_policy); @@ -1005,7 +1201,7 @@ err_t hci_write_authentication_enable(u8_t auth_enable) /* Assembling command packet */ p = hci_cmd_ass(p, HCI_W_AUTH_ENABLE_OCF, HCI_HC_BB_OGF, HCI_W_AUTH_ENABLE_PLEN); - /* Assembling cmd prameters */ + /* Assembling cmd parameters */ ((u8_t *)p->payload)[4] = auth_enable; physbusif_output(p, p->tot_len); @@ -1034,7 +1230,7 @@ err_t hci_pin_code_request_reply(struct bd_addr *bdaddr, u8_t pinlen, u8_t *pinc /* Assembling command packet */ p = hci_cmd_ass(p, HCI_PIN_CODE_REQ_REP_OCF, HCI_LINK_CTRL_OGF, HCI_PIN_CODE_REQ_REP_PLEN); - /* Assembling cmd prameters */ + /* Assembling cmd parameters */ memcpy(((u8_t *)p->payload) + 4, bdaddr->addr, 6); ((u8_t *)p->payload)[10] = pinlen; memcpy(((u8_t *)p->payload) + 11, pincode, pinlen); @@ -1146,7 +1342,7 @@ err_t hci_disconnect(struct bd_addr *bdaddr, u8_t reason) /* Assembling command packet */ p = hci_cmd_ass(p, HCI_DISCONN_OCF, HCI_LINK_CTRL_OGF, HCI_DISCONN_PLEN); - /* Assembling cmd prameters */ + /* Assembling cmd parameters */ ((u16_t *)p->payload)[2] = htole16(link->connhdl); ((u8_t *)p->payload)[6] = reason; @@ -1172,7 +1368,7 @@ err_t hci_reject_connection_request(struct bd_addr *bdaddr, u8_t reason) } /* Assembling command packet */ p = hci_cmd_ass(p, HCI_REJECT_CONN_REQ_OCF, HCI_LINK_CTRL_OGF, HCI_REJECT_CONN_REQ_PLEN); - /* Assembling cmd prameters */ + /* Assembling cmd parameters */ memcpy(((u8_t *)p->payload) + 4, bdaddr->addr, 6); ((u8_t *)p->payload)[10] = reason; @@ -1198,7 +1394,7 @@ err_t hci_write_stored_link_key(struct bd_addr *bdaddr, u8_t *link) } /* Assembling command packet */ p = hci_cmd_ass(p, HCI_W_STORED_LINK_KEY_OCF, HCI_HC_BB_OGF, HCI_W_STORED_LINK_KEY_PLEN); - /* Assembling cmd prameters */ + /* Assembling cmd parameters */ ((u8_t *)p->payload)[4] = 0x01; memcpy(((u8_t *)p->payload) + 5, bdaddr->addr, 6); memcpy(((u8_t *)p->payload) + 11, link, 16); @@ -1226,7 +1422,7 @@ err_t hci_delete_stored_link_key(struct bd_addr *bdaddr) } /* Assembling command packet */ p = hci_cmd_ass(p, HCI_D_STORED_LINK_KEY_OCF, HCI_HC_BB_OGF, HCI_D_STORED_LINK_KEY_PLEN); - /* Assembling cmd prameters */ + /* Assembling cmd parameters */ if (bdaddr) { memcpy(((u8_t *)p->payload) + 4, bdaddr->addr, 6); ((u8_t *)p->payload)[10] = 0; @@ -1259,7 +1455,7 @@ err_t hci_write_cod(u8_t *cod) } /* Assembling command packet */ p = hci_cmd_ass(p, HCI_W_COD_OCF, HCI_HC_BB_OGF, HCI_W_COD_PLEN); - /* Assembling cmd prameters */ + /* Assembling cmd parameters */ memcpy(((u8_t *)p->payload)+4, cod, 3); physbusif_output(p, p->tot_len); @@ -1302,7 +1498,7 @@ err_t hci_set_hc_to_h_fc(void) } /* Assembling command packet */ p = hci_cmd_ass(p, HCI_SET_HC_TO_H_FC_OCF, HCI_HC_BB_OGF, HCI_SET_HC_TO_H_FC_PLEN); - /* Assembling cmd prameters */ + /* Assembling cmd parameters */ ((u8_t *)p->payload)[4] = 0x01; /* Flow control on for HCI ACL Data Packets and off for HCI SCO Data Packets in direction from Host Controller to Host */ @@ -1504,7 +1700,7 @@ err_t lp_write_flush_timeout(struct bd_addr *bdaddr, u16_t flushto) /* Assembling command packet */ p = hci_cmd_ass(p, HCI_W_FLUSHTO_OCF, HCI_HC_BB_OGF, HCI_W_FLUSHTO_PLEN); - /* Assembling cmd prameters */ + /* Assembling cmd parameters */ ((u16_t *)p->payload)[2] = htole16(link->connhdl); ((u16_t *)p->payload)[3] = htole16(flushto); @@ -1565,7 +1761,7 @@ err_t lp_connect_req(struct bd_addr *bdaddr, u8_t allow_role_switch) /* Assembling command packet */ p = hci_cmd_ass(p, HCI_CREATE_CONN_OCF, HCI_LINK_CTRL_OGF, HCI_CREATE_CONN_PLEN); - /* Assembling cmd prameters */ + /* Assembling cmd parameters */ memcpy(((u8_t *)p->payload)+4, bdaddr->addr, 6); ((u16_t *)p->payload)[5] = htole16(hci_dev->pkt_type); ((u8_t *)p->payload)[12] = page_scan_repetition_mode; @@ -1786,7 +1982,7 @@ static void hci_inquiry_result_evt(struct pbuf *p) struct hci_inq_res *ires; num_resp = ((u8_t*)p->payload)[0]; - //printf("hci_inquiry_result_evt(%d)\n",num_resp); + LOG("hci_inquiry_result_evt(%d)\n",num_resp); for(i=0;ipayload)+(1+resp_off)); @@ -1815,7 +2011,7 @@ static void hci_inquiry_result_with_rssi_evt(struct pbuf *p) struct hci_inq_res *ires; num_resp = ((u8_t*)p->payload)[0]; - //printf("hci_inquiry_result_with_rssi_evt(%d)\n",num_resp); + LOG("hci_inquiry_result_with_rssi_evt(%d)\n",num_resp); for(i=0;ipayload)+(1+resp_off)); @@ -1842,7 +2038,7 @@ static void hci_return_link_key_evt(struct pbuf *p) struct hci_link_key *keyres; num_keys = ((u8_t*)p->payload)[0]; - //printf("hci_return_link_key_evt(%d)\n",num_keys); + LOG("hci_return_link_key_evt(%d)\n",num_keys); for(i=0;ipayload)+1+resp_off); @@ -1891,11 +2087,9 @@ void hci_event_handler(struct pbuf *p) evthdr = p->payload; btpbuf_header(p,-HCI_EVENT_HDR_LEN); - //printf("HCI_EVENT %02X\n", evthdr->code); switch(evthdr->code) { case HCI_INQUIRY_COMPLETE: - //printf("HCI_INQUIRY_COMPLETE\n"); hci_inquiry_complete_evt(p); break; case HCI_INQUIRY_RESULT: @@ -1944,12 +2138,16 @@ void hci_event_handler(struct pbuf *p) HCI_EVENT_REMOTE_NAME_REQ_COMPLETE(hci_dev,bdaddr,(((u8_t*)p->payload)+7),((u8_t*)p->payload)[0],ret); break; case HCI_ENCRYPTION_CHANGE: + LOG("HCI_ENCRYPTION_CHANGE\n"); break; case HCI_READ_REMOTE_FEATURES_COMPLETE: + LOG("HCI_READ_REMOTE_FEATURES_COMPLETE\n"); break; case HCI_READ_REMOTE_VERSION_COMPLETE: + LOG("HCI_READ_REMOTE_VERSION_COMPLETE\n"); break; case HCI_QOS_SETUP_COMPLETE: + LOG("HCI_QOS_SETUP_COMPLETE\n"); break; case HCI_COMMAND_COMPLETE: hci_dev->num_cmd += ((u8_t*)p->payload)[0]; @@ -1988,9 +2186,11 @@ void hci_event_handler(struct pbuf *p) hci_dev->num_cmd += ((u8_t*)p->payload)[1]; break; case HCI_HARDWARE_ERROR: + LOG("HCI_HARDWARE_ERROR\n"); //TODO: IS THIS FATAL?? break; case HCI_ROLE_CHANGE: + LOG("HCI_ROLE_CHANGE\n"); break; case HCI_NBR_OF_COMPLETED_PACKETS: for(i=0;i<((u8_t *)p->payload)[0];i++) { @@ -2015,14 +2215,17 @@ void hci_event_handler(struct pbuf *p) } break; case HCI_MODE_CHANGE: - printf("HCI_MODE_CHANGE\n"); + LOG("HCI_MODE_CHANGE\n"); break; case HCI_DATA_BUFFER_OVERFLOW: + LOG("HCI_DATA_BUFFER_OVERFLOW\n"); //TODO: IS THIS FATAL???? break; case HCI_MAX_SLOTS_CHANGE: + LOG("HCI_MAX_SLOTS_CHANGE\n"); break; case HCI_READ_CLOCK_OFFSET_COMPLETE: + LOG("HCI_READ_CLOCK_OFFSET_COMPLETE\n"); break; case HCI_RETURN_LINK_KEYS: hci_return_link_key_evt(p); diff --git a/lwbt/hci.h b/lwbt/hci.h index ea41af9b4..230d0f95f 100644 --- a/lwbt/hci.h +++ b/lwbt/hci.h @@ -1,3 +1,36 @@ +/* + * Copyright (c) 2003 EISLAB, Lulea University of Technology. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without modification, + * are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * 3. The name of the author may not be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT + * SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT + * OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING + * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY + * OF SUCH DAMAGE. + * + * This file is part of the lwBT Bluetooth stack, modified for use in libogc. + * + * Author: Conny Ohult + * Modified in 2025 by Zarithya. + * + */ + #ifndef __HCI_H__ #define __HCI_H__ @@ -31,9 +64,8 @@ #define HCI_SCO_HDR_LEN 3 #define HCI_CMD_HDR_LEN 3 -/* Specification specific parameters */ +/* Specification defined parameters */ #define HCI_BD_ADDR_LEN 6 -#define HCI_LMP_FEATURES_LEN 8 #define HCI_LINK_KEY_LEN 16 #define HCI_LMP_FEAT_LEN 8 @@ -61,10 +93,10 @@ #define LMP_PCONTROL 0x04 /* Opcode Group Field (OGF) values */ -#define HCI_LINK_CTRL_OGF 0x01 /* Link ctrl cmds */ +#define HCI_LINK_CTRL_OGF 0x01 /* Link Control Commands */ #define HCI_LINK_POLICY_OGF 0x02 /* Link Policy Commands */ -#define HCI_HC_BB_OGF 0x03 /* Host controller and baseband commands */ -#define HCI_INFO_PARAM_OGF 0x04 /* Informal parameters */ +#define HCI_HC_BB_OGF 0x03 /* Host Controller & Baseband Commands */ +#define HCI_INFO_PARAM_OGF 0x04 /* Informational Parameters */ #define HCI_STATUS_PARAM_OGF 0x05 /* Status Parameters */ #define HCI_TESTING_OGF 0x06 /* Testing Commands */ #define HCI_VENDOR_OGF 0x3F /* Vendor-Specific Commands */ @@ -136,7 +168,7 @@ #define HCI_GET_LINK_QUALITY 0x03 #define HCI_READ_RSSI 0x05 -/* Testing commands */ +/* Testing Commands */ /* Vendor-Specific Commands*/ #define HCI_VENDOR_PATCH_START_OCF 0x4F @@ -197,9 +229,7 @@ #define HCI_R_BUF_SIZE_PLEN 4 #define HCI_R_BD_ADDR_PLEN 4 -/* Status Parameters */ - -/* Testing commands */ +/* Testing Commands */ /* Vendor-Specific Commands*/ #define HCI_W_VENDOR_CMD_PLEN 4 @@ -262,85 +292,83 @@ #define HCI_VENDOR_CLEAR_PAIRED_DEVICES 0x09 /* Success code */ -#define HCI_SUCCESS 0x00 +#define HCI_SUCCESS 0x00 /* Possible error codes */ -#define HCI_UNKNOWN_HCI_COMMAND 0x01 -#define HCI_NO_CONNECTION 0x02 -#define HCI_HW_FAILURE 0x03 -#define HCI_PAGE_TIMEOUT 0x04 -#define HCI_AUTHENTICATION_FAILURE 0x05 -#define HCI_KEY_MISSING 0x06 -#define HCI_MEMORY_FULL 0x07 -#define HCI_CONN_TIMEOUT 0x08 -#define HCI_MAX_NUMBER_OF_CONNECTIONS 0x09 -#define HCI_MAX_NUMBER_OF_SCO_CONNECTIONS_TO_DEVICE 0x0A -#define HCI_ACL_CONNECTION_EXISTS 0x0B -#define HCI_COMMAND_DISSALLOWED 0x0C -#define HCI_HOST_REJECTED_DUE_TO_LIMITED_RESOURCES 0x0D -#define HCI_HOST_REJECTED_DUE_TO_SECURITY_REASONS 0x0E -#define HCI_HOST_REJECTED_DUE_TO_REMOTE_DEVICE_ONLY_PERSONAL_SERVICE 0x0F -#define HCI_HOST_TIMEOUT 0x10 -#define HCI_UNSUPPORTED_FEATURE_OR_PARAMETER_VALUE 0x11 -#define HCI_INVALID_HCI_COMMAND_PARAMETERS 0x12 -#define HCI_OTHER_END_TERMINATED_CONN_USER_ENDED 0x13 -#define HCI_OTHER_END_TERMINATED_CONN_LOW_RESOURCES 0x14 -#define HCI_OTHER_END_TERMINATED_CONN_ABOUT_TO_POWER_OFF 0x15 -#define HCI_CONN_TERMINATED_BY_LOCAL_HOST 0x16 -#define HCI_REPEATED_ATTEMPTS 0x17 -#define HCI_PAIRING_NOT_ALLOWED 0x18 -#define HCI_UNKNOWN_LMP_PDU 0x19 -#define HCI_UNSUPPORTED_REMOTE_FEATURE 0x1A -#define HCI_SCO_OFFSET_REJECTED 0x1B -#define HCI_SCO_INTERVAL_REJECTED 0x1C -#define HCI_SCO_AIR_MODE_REJECTED 0x1D -#define HCI_INVALID_LMP_PARAMETERS 0x1E -#define HCI_UNSPECIFIED_ERROR 0x1F -#define HCI_UNSUPPORTED_LMP_PARAMETER_VALUE 0x20 -#define HCI_ROLE_CHANGE_NOT_ALLOWED 0x21 -#define HCI_LMP_RESPONSE_TIMEOUT 0x22 -#define HCI_LMP_ERROR_TRANSACTION_COLLISION 0x23 -#define HCI_LMP_PDU_NOT_ALLOWED 0x24 -#define HCI_ENCRYPTION_MODE_NOT_ACCEPTABLE 0x25 -#define HCI_UNIT_KEY_USED 0x26 -#define HCI_QOS_NOT_SUPPORTED 0x27 -#define HCI_INSTANT_PASSED 0x28 -#define HCI_PAIRING_UNIT_KEY_NOT_SUPPORTED 0x29 - -struct hci_evt_hdr -{ - u8_t code; - u8_t len; +#define HCI_UNKNOWN_HCI_COMMAND 0x01 +#define HCI_NO_CONNECTION 0x02 +#define HCI_HW_FAILURE 0x03 +#define HCI_PAGE_TIMEOUT 0x04 +#define HCI_AUTHENTICATION_FAILURE 0x05 +#define HCI_KEY_MISSING 0x06 +#define HCI_MEMORY_FULL 0x07 +#define HCI_CONN_TIMEOUT 0x08 +#define HCI_MAX_NUMBER_OF_CONNECTIONS 0x09 +#define HCI_MAX_NUMBER_OF_SCO_CONNECTIONS_TO_DEVICE 0x0A +#define HCI_ACL_CONNECTION_EXISTS 0x0B +#define HCI_COMMAND_DISSALLOWED 0x0C +#define HCI_HOST_REJECTED_DUE_TO_LIMITED_RESOURCES 0x0D +#define HCI_HOST_REJECTED_DUE_TO_SECURITY_REASONS 0x0E +#define HCI_HOST_REJECTED_DUE_TO_REMOTE_DEVICE_ONLY_PERSONAL_SERVICE 0x0F +#define HCI_HOST_TIMEOUT 0x10 +#define HCI_UNSUPPORTED_FEATURE_OR_PARAMETER_VALUE 0x11 +#define HCI_INVALID_HCI_COMMAND_PARAMETERS 0x12 +#define HCI_OTHER_END_TERMINATED_CONN_USER_ENDED 0x13 +#define HCI_OTHER_END_TERMINATED_CONN_LOW_RESOURCES 0x14 +#define HCI_OTHER_END_TERMINATED_CONN_ABOUT_TO_POWER_OFF 0x15 +#define HCI_CONN_TERMINATED_BY_LOCAL_HOST 0x16 +#define HCI_REPEATED_ATTEMPTS 0x17 +#define HCI_PAIRING_NOT_ALLOWED 0x18 +#define HCI_UNKNOWN_LMP_PDU 0x19 +#define HCI_UNSUPPORTED_REMOTE_FEATURE 0x1A +#define HCI_SCO_OFFSET_REJECTED 0x1B +#define HCI_SCO_INTERVAL_REJECTED 0x1C +#define HCI_SCO_AIR_MODE_REJECTED 0x1D +#define HCI_INVALID_LMP_PARAMETERS 0x1E +#define HCI_UNSPECIFIED_ERROR 0x1F +#define HCI_UNSUPPORTED_LMP_PARAMETER_VALUE 0x20 +#define HCI_ROLE_CHANGE_NOT_ALLOWED 0x21 +#define HCI_LMP_RESPONSE_TIMEOUT 0x22 +#define HCI_LMP_ERROR_TRANSACTION_COLLISION 0x23 +#define HCI_LMP_PDU_NOT_ALLOWED 0x24 +#define HCI_ENCRYPTION_MODE_NOT_ACCEPTABLE 0x25 +#define HCI_UNIT_KEY_USED 0x26 +#define HCI_QOS_NOT_SUPPORTED 0x27 +#define HCI_INSTANT_PASSED 0x28 +#define HCI_PAIRING_UNIT_KEY_NOT_SUPPORTED 0x29 + +struct hci_evt_hdr { + u8_t code; /* Event code */ + u8_t len; /* Parameter total length */ } ATTRIBUTE_PACKED; -struct hci_acl_hdr -{ - u16_t connhdl_pb_bc; - u16_t len; +struct hci_acl_hdr { + u16_t connhdl_pb_bc; /* Connection handle, packet boundary and broadcast flag + flag */ + u16_t len; /* length of data */ } ATTRIBUTE_PACKED; -struct hci_inq_res -{ - struct hci_inq_res *next; - struct bd_addr bdaddr; - u8_t cod[3]; - u8_t psrm; - u8_t psm; - u16_t co; +struct hci_inq_res { + struct hci_inq_res *next; /* For the linked list */ + + struct bd_addr bdaddr; /* Bluetooth address of a device found in an inquiry */ + u8_t cod[3]; /* Class of the remote device */ + u8_t psrm; /* Page scan repetition mode */ + u8_t psm; /* Page scan mode */ + u16_t co; /* Clock offset */ }; -struct hci_link_key -{ - struct bd_addr bdaddr; - u8_t key[16]; +struct hci_link_key { + struct hci_link_key *next; /* For the linked list */ - struct hci_link_key *next; + struct bd_addr bdaddr; /* The remote peer's Bluetooth address for this connection */ + u8_t key[HCI_LINK_KEY_LEN]; /* The connection's link key */ }; -struct hci_link -{ - struct hci_link *next; - struct bd_addr bdaddr; - u16_t connhdl; +struct hci_link { + struct hci_link *next; /* For the linked list */ + + struct bd_addr bdaddr; /* The remote peers Bluetooth address for this connection */ + u16_t connhdl; /* Connection handle */ struct pbuf *p; u16_t len; u8_t pb; @@ -359,7 +387,10 @@ struct hci_version_info struct hci_pcb { void *cbarg; - s8_t num_cmd; + + /* Host to host controller flow control */ + s8_t num_cmd; /* Number of command packets that the host controller (Bluetooth + module) can buffer */ u16_t acl_mtu; u8_t sco_mtu; @@ -368,32 +399,36 @@ struct hci_pcb u32_t flags; - u8_t flow; - u16_t host_num_acl; + /* Host controller to host flow control */ + u8_t flow; /* Indicates if host controller to host flow control is on */ + u16_t host_num_acl; /* Number of ACL packets that we (the host) can buffer */ u16_t pkt_type; u8_t features[8]; - struct bd_addr bdaddr; - struct hci_version_info info; + struct bd_addr bdaddr; /* Host controller address */ + struct hci_version_info info; /* Host controller version info */ - struct hci_inq_res *ires; + struct hci_inq_res *ires; /* Results of an inquiry */ struct hci_link_key *keyres; err_t (*pin_req)(void *arg,struct bd_addr *bdaddr); + err_t (*inq_complete)(void *arg,struct hci_pcb *pcb,struct hci_inq_res *ires,u16_t result); + err_t (*conn_req)(void *arg,struct bd_addr *bdaddr,u8_t *cod,u8_t link_type); err_t (*link_key_req)(void *arg,struct bd_addr *bdaddr); - err_t (*cmd_complete)(void *arg,struct hci_pcb *pcb,u8_t ogf,u8_t ocf,u8_t result); err_t (*link_key_not)(void *arg, struct bd_addr *bdaddr, u8_t *key); - err_t (*conn_complete)(void *arg,struct bd_addr *bdaddr); err_t (*auth_complete)(void *arg,struct bd_addr *bdaddr); - err_t (*inq_complete)(void *arg,struct hci_pcb *pcb,struct hci_inq_res *ires,u16_t result); err_t (*wlp_complete)(void *arg, struct bd_addr *bdaddr); - err_t (*conn_req)(void *arg,struct bd_addr *bdaddr,u8_t *cod,u8_t link_type); + err_t (*conn_complete)(void *arg,struct bd_addr *bdaddr); + err_t (*cmd_complete)(void *arg,struct hci_pcb *pcb,u8_t ogf,u8_t ocf,u8_t result); err_t (*remote_name_req_complete)(void *arg,struct bd_addr *bdaddr,u8_t *name,u8_t result); void (*sync_btn)(u32_t held); }; -err_t hci_init(void); +/* Functions for interfacing with HCI */ +err_t hci_init(void); /* Must be called first to initialize HCI */ + +/* Application program's interface: */ struct hci_link* hci_new(void); void hci_reset_all(void); void hci_event_handler(struct pbuf *p); @@ -457,79 +492,78 @@ void hci_remote_name_req_complete(err_t (*remote_name_req_complete)(void *arg,st void hci_sync_btn(void (*sync_btn)(u32_t held)); void hci_get_bd_addr(struct bd_addr *bdaddr); +/* L2CAP interface */ u16_t lp_pdu_maxsize(void); u8_t lp_is_connected(struct bd_addr *bdaddr); err_t lp_acl_write(struct bd_addr *bdaddr,struct pbuf *p,u16_t len,u8_t pb); err_t lp_connect_req(struct bd_addr *bdaddr, u8_t allow_role_switch); err_t lp_write_flush_timeout(struct bd_addr *bdaddr, u16_t flushto); - #define HCI_EVENT_PIN_REQ(pcb,bdaddr,ret) \ - if((pcb)->pin_req != NULL) { \ - (ret = (pcb)->pin_req((pcb)->cbarg,(bdaddr))); \ - } else { \ - ret = hci_pin_code_request_neg_reply(bdaddr); \ + if((pcb)->pin_req != NULL) { \ + (ret = (pcb)->pin_req((pcb)->cbarg,(bdaddr))); \ + } else { \ + ret = hci_pin_code_request_neg_reply(bdaddr); \ } #define HCI_EVENT_LINK_KEY_REQ(pcb,bdaddr,ret) \ - if((pcb)->link_key_req != NULL) { \ - (ret = (pcb)->link_key_req((pcb)->cbarg,(bdaddr))); \ - } else { \ - ret = hci_link_key_req_neg_reply(bdaddr); \ + if((pcb)->link_key_req != NULL) { \ + (ret = (pcb)->link_key_req((pcb)->cbarg,(bdaddr))); \ + } else { \ + ret = hci_link_key_req_neg_reply(bdaddr); \ } #define HCI_EVENT_CONN_REQ(pcb,bdaddr,cod,linktype,ret) \ if((pcb)->conn_req!=NULL) \ (ret = (pcb)->conn_req((pcb)->cbarg,(bdaddr),(cod),(linktype))) #define HCI_EVENT_LINK_KEY_NOT(pcb,bdaddr,key,ret) \ - if((pcb)->link_key_not != NULL) { \ - (ret = (pcb)->link_key_not((pcb)->cbarg,(bdaddr),(key))); \ - } + if((pcb)->link_key_not != NULL) { \ + (ret = (pcb)->link_key_not((pcb)->cbarg,(bdaddr),(key))); \ + } #define HCI_EVENT_INQ_COMPLETE(pcb,result,ret) \ - if((pcb)->inq_complete != NULL) \ - (ret = (pcb)->inq_complete((pcb)->cbarg,(pcb),(pcb)->ires,(result))) + if((pcb)->inq_complete != NULL) \ + (ret = (pcb)->inq_complete((pcb)->cbarg,(pcb),(pcb)->ires,(result))) #define HCI_EVENT_WLP_COMPLETE(pcb,bdaddr,ret) \ - if((pcb)->wlp_complete != NULL) \ - (ret = (pcb)->wlp_complete((pcb)->cbarg,(bdaddr))); + if((pcb)->wlp_complete != NULL) \ + (ret = (pcb)->wlp_complete((pcb)->cbarg,(bdaddr))); #define HCI_EVENT_CONN_COMPLETE(pcb,bdaddr,ret) \ - if((pcb)->conn_complete != NULL) \ - (ret = (pcb)->conn_complete((pcb)->cbarg,(bdaddr))); + if((pcb)->conn_complete != NULL) \ + (ret = (pcb)->conn_complete((pcb)->cbarg,(bdaddr))); #define HCI_EVENT_AUTH_COMPLETE(pcb,bdaddr,ret) \ - if((pcb)->auth_complete != NULL) \ - (ret = (pcb)->auth_complete((pcb)->cbarg,(bdaddr))); + if((pcb)->auth_complete != NULL) \ + (ret = (pcb)->auth_complete((pcb)->cbarg,(bdaddr))); #define HCI_EVENT_CMD_COMPLETE(pcb,ogf,ocf,result,ret) \ - if((pcb)->cmd_complete != NULL) \ - (ret = (pcb)->cmd_complete((pcb)->cbarg,(pcb),(ogf),(ocf),(result))) + if((pcb)->cmd_complete != NULL) \ + (ret = (pcb)->cmd_complete((pcb)->cbarg,(pcb),(ogf),(ocf),(result))) #define HCI_EVENT_REMOTE_NAME_REQ_COMPLETE(pcb,bdaddr,name,result,ret) \ - if((pcb)->remote_name_req_complete != NULL) \ - (ret = (pcb)->remote_name_req_complete((pcb)->cbarg,(bdaddr),(name),(result))) + if((pcb)->remote_name_req_complete != NULL) \ + (ret = (pcb)->remote_name_req_complete((pcb)->cbarg,(bdaddr),(name),(result))) #define HCI_EVENT_SYNC_BTN(pcb, held) \ - if((pcb)->sync_btn != NULL) \ - ((pcb)->sync_btn(held)) + if((pcb)->sync_btn != NULL) \ + ((pcb)->sync_btn(held)) /* The HCI LINK lists. */ extern struct hci_link *hci_active_links; /* List of all active HCI LINKs */ extern struct hci_link *hci_tmp_link; /* Only used for temporary storage. */ -extern struct hci_link_key *hci_tmp_key; #define HCI_REG(links, nlink) do { \ u32 level; \ _CPU_ISR_Disable(level); \ - nlink->next = *links; \ - *links = nlink; \ + nlink->next = *links; \ + *links = nlink; \ _CPU_ISR_Restore(level); \ - } while(0) + } while(0) #define HCI_RMV(links, nlink) do { \ u32 level; \ _CPU_ISR_Disable(level);\ - if(*links == nlink) { \ - *links = (*links)->next; \ - } else for(hci_tmp_link = *links; hci_tmp_link != NULL; hci_tmp_link = hci_tmp_link->next) { \ - if(hci_tmp_link->next != NULL && hci_tmp_link->next == nlink) { \ - hci_tmp_link->next = nlink->next; \ - break; \ - } \ - } \ - nlink->next = NULL; \ + if(*links == nlink) { \ + *links = (*links)->next; \ + } else for(hci_tmp_link = *links; hci_tmp_link != NULL; hci_tmp_link = hci_tmp_link->next) { \ + if(hci_tmp_link->next != NULL && hci_tmp_link->next == nlink) { \ + hci_tmp_link->next = nlink->next; \ + break; \ + } \ + } \ + nlink->next = NULL; \ _CPU_ISR_Restore(level); \ - } while(0) + } while(0) #endif diff --git a/lwbt/physbusif.c b/lwbt/physbusif.c index cda055c9a..5960ff00f 100644 --- a/lwbt/physbusif.c +++ b/lwbt/physbusif.c @@ -47,12 +47,6 @@ static s32 __issue_intrread(void); extern u32 __IPC_ClntInit(void); -static s32 __usb_closeCB(s32 result,void *usrdata) -{ - __usbdev.fd = -1; - return result; -} - static s32 __writectrlmsgCB(s32 result,void *usrdata) { if(usrdata!=NULL) btmemb_free(&ctrlbufs,usrdata); @@ -299,9 +293,7 @@ void physbusif_close(void) void physbusif_shutdown(void) { if(__usbdev.openstate!=0x0004) return; - //USB_CloseDeviceAsync(&__usbdev.fd,__usb_closeCB,NULL); USB_CloseDevice(&__usbdev.fd); - __usbdev.fd = -1; } void physbusif_reset_all(void) diff --git a/wiiuse/events.c b/wiiuse/events.c index 45ad5b018..8aa3006da 100644 --- a/wiiuse/events.c +++ b/wiiuse/events.c @@ -85,15 +85,11 @@ static void event_ack(struct wiimote_t *wm,ubyte *msg) if(!cmd) return; if(!cmd || cmd->state!=CMD_SENT || cmd->data[0]==WM_CMD_READ_DATA || cmd->data[0]==WM_CMD_CTRL_STATUS || cmd->data[0]!=msg[2]) { WIIUSE_WARNING("Unsolicited event ack: report %02x status %02x", msg[2], msg[3]); - //return; + return; } if(msg[3]) { WIIUSE_WARNING("Command %02x %02x%02x%02x%02x failed: status %02x", cmd->data[0], cmd->data[1], cmd->data[2], cmd->data[3], cmd->data[4], msg[3]); - cmd->state = CMD_FAILED; - //return; - } - else { - cmd->state = CMD_DONE; + return; } WIIUSE_DEBUG("Received ack for command %02x %02x", cmd->data[0], cmd->data[1]); @@ -101,8 +97,8 @@ static void event_ack(struct wiimote_t *wm,ubyte *msg) wm->cmd_head = cmd->next; wm->event = WIIUSE_ACK; - //cmd->state = CMD_DONE; - if(cmd->state != CMD_FAILED && cmd->cb) cmd->cb(wm,NULL,0); + cmd->state = CMD_DONE; + if(cmd->cb) cmd->cb(wm,NULL,0); __lwp_queue_append(&wm->cmdq,&cmd->node); wiiuse_send_next_command(wm); diff --git a/wiiuse/io_wii.c b/wiiuse/io_wii.c index 5020d75f4..07eb852ec 100644 --- a/wiiuse/io_wii.c +++ b/wiiuse/io_wii.c @@ -39,7 +39,6 @@ static s32 __wiiuse_disconnected(void *arg,struct bte_pcb *pcb,u8 err) if(!wm) return ERR_OK; - //printf("wiimote disconnected\n"); WIIMOTE_DISABLE_STATE(wm, (WIIMOTE_STATE_IR|WIIMOTE_STATE_IR_INIT)); WIIMOTE_DISABLE_STATE(wm, (WIIMOTE_STATE_SPEAKER|WIIMOTE_STATE_SPEAKER_INIT)); WIIMOTE_DISABLE_STATE(wm, (WIIMOTE_STATE_EXP|WIIMOTE_STATE_EXP_HANDSHAKE|WIIMOTE_STATE_EXP_FAILED)); @@ -64,7 +63,7 @@ static s32 __wiiuse_receive(void *arg,void *buffer,u16 len) if(!wm || !buffer || len==0) return ERR_OK; - //printf("__wiiuse_receive[%02x]\n",*(char*)buffer); + WIIUSE_DEBUG("__wiiuse_receive[%02x]",*(char*)buffer); wm->event = WIIUSE_NONE; memcpy(wm->event_buf,buffer,len); @@ -83,7 +82,7 @@ static s32 __wiiuse_connected(void *arg,struct bte_pcb *pcb,u8 err) struct wiimote_listen_t *wml = (struct wiimote_listen_t*)arg; struct wiimote_t *wm; - //printf("__wiiuse_connected(%d)\n", err); + WIIUSE_INFO("__wiiuse_connected(%d)", err); wm = wml->assign_cb(wml, err); if(!wm) { @@ -96,7 +95,6 @@ static s32 __wiiuse_connected(void *arg,struct bte_pcb *pcb,u8 err) wm->sock = wml->sock; wm->bdaddr = wml->bdaddr; - //printf("__wiiuse_connected()\n"); WIIMOTE_ENABLE_STATE(wm,(WIIMOTE_STATE_CONNECTED|WIIMOTE_STATE_HANDSHAKE)); wm->handshake_state = 0; @@ -107,7 +105,7 @@ static s32 __wiiuse_connected(void *arg,struct bte_pcb *pcb,u8 err) static s32 __wiiuse_connect_step2(void *arg,struct bte_pcb *pcb,u8 err) { - //printf("__wiiuse_connect_step2(%d)\n", err); + WIIUSE_INFO("__wiiuse_connect_step2(%d)", err); if (err!=ERR_OK) { bte_disconnect(pcb); return ERR_OK; @@ -117,13 +115,13 @@ static s32 __wiiuse_connect_step2(void *arg,struct bte_pcb *pcb,u8 err) if(err==ERR_OK) return ERR_OK; - printf("__wiiuse_connect_step2: bte_connectasync_step2 failed(%d)\n", err); + WIIUSE_ERROR("__wiiuse_connect_step2: bte_connectasync_step2 failed(%d)", err); return err; } static s32 __wiiuse_accept_step2(void *arg,struct bte_pcb *pcb,u8 err) { - //printf("__wiiuse_accept_step2(%d)\n", err); + WIIUSE_INFO("__wiiuse_accept_step2(%d)", err); if (err!=ERR_OK) { bte_disconnect(pcb); return ERR_OK; @@ -133,7 +131,7 @@ static s32 __wiiuse_accept_step2(void *arg,struct bte_pcb *pcb,u8 err) if(err==ERR_OK) return ERR_OK; - printf("__wiiuse_accept_step2: bte_listenasync_step2 failed(%d)\n", err); + WIIUSE_ERROR("__wiiuse_accept_step2: bte_listenasync_step2 failed(%d)", err); return err; } @@ -154,11 +152,11 @@ int wiiuse_accept(struct wiimote_listen_t *wml, struct bd_addr *bdaddr, u8 *name s32 err; if(!wml || !bdaddr || !name || !assign_cb) return 0; - - //printf("wiiuse_accept %p, bdaddr: %02x:%02x:%02x:%02x:%02x:%02x\n",wml,bdaddr->addr[5],bdaddr->addr[4],bdaddr->addr[3],bdaddr->addr[2],bdaddr->addr[1],bdaddr->addr[0]); + + WIIUSE_INFO("wiiuse_accept %p, bdaddr: %02x:%02x:%02x:%02x:%02x:%02x",wml,bdaddr->addr[5],bdaddr->addr[4],bdaddr->addr[3],bdaddr->addr[2],bdaddr->addr[1],bdaddr->addr[0]); if(wml->sock!=NULL) { - printf("wiiuse_accept: wml->sock was not NULL!\n"); + WIIUSE_ERROR("wiiuse_accept: wml->sock was not NULL!"); return 0; } @@ -175,7 +173,7 @@ int wiiuse_accept(struct wiimote_listen_t *wml, struct bd_addr *bdaddr, u8 *name wml->sock = bte_new(); if (wml->sock==NULL) { - printf("wiiuse_accept: bte_new failed to alloc new sock\n"); + WIIUSE_ERROR("wiiuse_accept: bte_new failed to alloc new sock"); return 0; } @@ -186,7 +184,7 @@ int wiiuse_accept(struct wiimote_listen_t *wml, struct bd_addr *bdaddr, u8 *name err = bte_listenasync(wml->sock,bdaddr,__wiiuse_accept_step2); if(err==ERR_OK) return 1; - printf("wiiuse_accept: bte_listenasync failed(%d)\n", err); + WIIUSE_ERROR("wiiuse_accept: bte_listenasync failed(%d)", err); return 0; } @@ -196,10 +194,10 @@ int wiiuse_connect(struct wiimote_listen_t *wml, struct bd_addr *bdaddr, u8 *nam if(!wml || !bdaddr|| !assign_cb) return 0; - //printf("wiiuse_connect %p, bdaddr: %02x:%02x:%02x:%02x:%02x:%02x\n",wml,bdaddr->addr[5],bdaddr->addr[4],bdaddr->addr[3],bdaddr->addr[2],bdaddr->addr[1],bdaddr->addr[0]); + WIIUSE_INFO("wiiuse_connect %p, bdaddr: %02x:%02x:%02x:%02x:%02x:%02x",wml,bdaddr->addr[5],bdaddr->addr[4],bdaddr->addr[3],bdaddr->addr[2],bdaddr->addr[1],bdaddr->addr[0]); if(wml->sock!=NULL) { - printf("wiiuse_connect: wml->sock was not NULL!\n"); + WIIUSE_ERROR("wiiuse_connect: wml->sock was not NULL!"); return 0; } @@ -216,7 +214,7 @@ int wiiuse_connect(struct wiimote_listen_t *wml, struct bd_addr *bdaddr, u8 *nam wml->sock = bte_new(); if (wml->sock==NULL) { - printf("wiiuse_connect: bte_new failed to alloc new sock\n"); + WIIUSE_ERROR("wiiuse_connect: bte_new failed to alloc new sock"); return 0; } @@ -224,18 +222,18 @@ int wiiuse_connect(struct wiimote_listen_t *wml, struct bd_addr *bdaddr, u8 *nam bte_received(wml->sock,__wiiuse_receive); bte_disconnected(wml->sock,__wiiuse_disconnected); - //printf("wiiuse_connect\n"); + WIIUSE_INFO("wiiuse_connect"); err = bte_connectasync(wml->sock,bdaddr,__wiiuse_connect_step2); if(err==ERR_OK) return 1; - printf("wiiuse_connect: bte_listenasync failed(%d)\n", err); + WIIUSE_ERROR("wiiuse_connect: bte_listenasync failed(%d)", err); return 0; } void wiiuse_disconnect(struct wiimote_t *wm) { - //printf("wiiuse_disconnect\n"); + WIIUSE_INFO("wiiuse_disconnect"); if(wm==NULL || wm->sock==NULL) return; diff --git a/wiiuse/wpad.c b/wiiuse/wpad.c index 17fb683fb..4a51254c3 100644 --- a/wiiuse/wpad.c +++ b/wiiuse/wpad.c @@ -2,10 +2,11 @@ wpad.c -- Wiimote Application Programmers Interface -Copyright (C) 2008 +Copyright (C) 2008-2025 Michael Wiedenbauer (shagkur) Dave Murphy (WinterMute) Hector Martin (marcan) +Zarithya This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any @@ -61,7 +62,7 @@ distribution. #define DISCONNECT_IDLE_TIMEOUT 0x16 /* HCI_CONN_TERMINATED_BY_LOCAL_HOST */ #define DISCONNECT_REPEATED_ATTEMPTS 0x17 /* HCI_REPEATED_ATTEMPTS */ -struct _wpad_thresh{ +struct _wpad_thresh { s32 btns; s32 ir; s32 js; @@ -135,7 +136,7 @@ static sys_resetinfo __wpad_resetinfo = { static s32 __wpad_onreset(s32 final) { - //printf("__wpad_onreset(%d)\n",final); + WIIUSE_INFO("__wpad_onreset(%d)",final); if(final==FALSE) { WPAD_Shutdown(); } @@ -231,20 +232,19 @@ wiimote *__wpad_assign_slot(wiimote_listen *wml, u8 err) if (i >= WPAD_MAX_DEVICES) { - //printf("WPAD Listen Slot Not Valid\n"); + WIIUSE_ERROR("WPAD Listen Slot %d Not Valid\n", i); _CPU_ISR_Restore(level); return NULL; } if (err) { - //printf("WPAD Connection Error %d\n", (s8)err); + WIIUSE_ERROR("WPAD Connection Error %d\n", (s8)err); __wpads_used &= ~(0x01<bdaddr.addr[5],wml->bdaddr.addr[4],wml->bdaddr.addr[3],wml->bdaddr.addr[2],wml->bdaddr.addr[1],wml->bdaddr.addr[0]); + WIIUSE_INFO("WPAD Assigning Slot %d (used: 0x%02x)", i, __wpads_used); if(i>=WPAD_BALANCE_BOARD) { BYTES_FROM_BD_ADDR(__wpad_devs.balance_board.bdaddr, &wml->bdaddr); memcpy(__wpad_devs.balance_board.name, wml->name, sizeof(__wpad_devs.balance_board.name)); @@ -299,10 +299,10 @@ wiimote *__wpad_register_new(wiimote_listen *wml, u8 err) if (wm) { // Search for wml->bdaddr in guest registration list - for(i=0; ibdaddr,&bdaddr)) { - //printf("Wiimote guest in slot %d\n", i); + WIIUSE_INFO("Wiimote guest in slot %d", i); guestEntry = i; break; } @@ -312,7 +312,7 @@ wiimote *__wpad_register_new(wiimote_listen *wml, u8 err) for(i=0; i<__wpad_devs.num_registered; i++) { BD_ADDR_FROM_BYTES(&(bdaddr),__wpad_devs.registered[i].bdaddr); if(bd_addr_cmp(&wml->bdaddr,&bdaddr)) { - //printf("Wiimote currently registered in slot %d\n", i); + WIIUSE_INFO("Wiimote currently registered in slot %d", i); registeredEntry = i; break; } @@ -330,7 +330,7 @@ wiimote *__wpad_register_new(wiimote_listen *wml, u8 err) memset(&__wpad_guests.guests[--__wpad_guests.num_guests], 0, sizeof(conf_pad_guest_device)); } - //printf("Registering Wiimote '%s' with system...\n", wml->name); + WIIUSE_INFO("Registering Wiimote '%s' with system...", wml->name); memmove(&__wpad_devs.registered[1], &__wpad_devs.registered[0], sizeof(conf_pad_device)*(CONF_PAD_MAX_REGISTERED-1)); BYTES_FROM_BD_ADDR(__wpad_devs.registered[0].bdaddr, &wml->bdaddr); memcpy(__wpad_devs.registered[0].name, wml->name, sizeof(__wpad_devs.registered[0].name)); @@ -341,7 +341,7 @@ wiimote *__wpad_register_new(wiimote_listen *wml, u8 err) } else if(registeredEntry >= CONF_PAD_MAX_REGISTERED) { // Not permanent pair, need to save bdaddr and link key as guest controller if(guestEntry >= CONF_PAD_MAX_ACTIVE) { - //printf("Saving Wiimote '%s' as guest...\n", wml->name); + WIIUSE_INFO("Saving Wiimote '%s' as guest...", wml->name); memmove(&__wpad_guests.guests[1], &__wpad_guests.guests[0], sizeof(conf_pad_guest_device)*(CONF_PAD_MAX_ACTIVE-1)); BYTES_FROM_BD_ADDR(__wpad_guests.guests[0].bdaddr, &wml->bdaddr); memcpy(__wpad_guests.guests[0].name, wml->name, sizeof(__wpad_guests.guests[0].name)); @@ -353,9 +353,8 @@ wiimote *__wpad_register_new(wiimote_listen *wml, u8 err) u8 *src = __wpad_guest_keys[i].key; u8 *dst = __wpad_guests.guests[0].link_key; // Keys are stored in config backwards, like bdaddrs - //printf("Writing guest key: %02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x\n",__wpad_guest_keys[i].key[0],__wpad_guest_keys[i].key[1],__wpad_guest_keys[i].key[2],__wpad_guest_keys[i].key[3],__wpad_guest_keys[i].key[4],__wpad_guest_keys[i].key[5],__wpad_guest_keys[i].key[6],__wpad_guest_keys[i].key[7],__wpad_guest_keys[i].key[8],__wpad_guest_keys[i].key[9],__wpad_guest_keys[i].key[10],__wpad_guest_keys[i].key[11],__wpad_guest_keys[i].key[12],__wpad_guest_keys[i].key[13],__wpad_guest_keys[i].key[14],__wpad_guest_keys[i].key[15]); - for (j=0;j<16;j++) { - dst[j] = src[15 - j]; + for (j=0;jname, 13)) { - //printf("Found controller %s:\n", info->name); - //printf(" bdaddr: %02x:%02x:%02x:%02x:%02x:%02x\n",info->bdaddr.addr[5],info->bdaddr.addr[4],info->bdaddr.addr[3],info->bdaddr.addr[2],info->bdaddr.addr[1],info->bdaddr.addr[0]); - + // Found Wii accessory, is it controller or something else? if (!strncmp("Nintendo RVL-CNT-", (char *)info->name, 17)) { // Check active list for(i=0; ibdaddr,&bdaddr)) { - //printf("Wiimote already active in slot %d\n", i); + WIIUSE_INFO("Wiimote already active in slot %d", i); slot = i; break; } @@ -886,47 +882,38 @@ s32 __wpad_read_remote_name_finished(s32 result,void *userdata) if(slot >= CONF_PAD_MAX_ACTIVE) { for(i=0; ibdaddr,&bdaddr)) { - //printf("Non-Wiimote already active in slot %d\n", i); - slot = i; - break; - } + // Check for balance board + BD_ADDR_FROM_BYTES(&(bdaddr),__wpad_devs.balance_board.bdaddr); + if(bd_addr_cmp(&info->bdaddr,&bdaddr)) { + WIIUSE_INFO("Balance Board already registered"); + slot = WPAD_BALANCE_BOARD; } // Not active, try to make active - if(slot >= CONF_PAD_MAX_ACTIVE) { - for(i=CONF_PAD_MAX_ACTIVE; ibdaddr,info->name,__wpad_register_new); __wpads_used |= (0x01<name); - //printf(" bdaddr: %02x:%02x:%02x:%02x:%02x:%02x\n",info->bdaddr.addr[5],info->bdaddr.addr[4],info->bdaddr.addr[3],info->bdaddr.addr[2],info->bdaddr.addr[1],info->bdaddr.addr[0]); result = ERR_ARG; } } @@ -995,7 +982,7 @@ static s8 __wpad_connreqCB(void *arg,struct bd_addr *pad_addr,u8 *cod,u8 link_ty struct bd_addr bdaddr; u8 *name = NULL; - //printf("__wpad_connreqCB\n"); + WIIUSE_INFO("__wpad_connreqCB"); _CPU_ISR_Disable(level); // Only accept connection requests (i.e. "press any button") if not doing guest pairing @@ -1005,7 +992,7 @@ static s8 __wpad_connreqCB(void *arg,struct bd_addr *pad_addr,u8 *cod,u8 link_ty BD_ADDR_FROM_BYTES(&bdaddr,__wpad_devs.active[i].bdaddr); if(bd_addr_cmp(pad_addr,&bdaddr)) { name = (u8 *)__wpad_devs.active[i].name; - //printf("Active Wiimote %s found in slot %d\n", name, i); + WIIUSE_INFO("Active Wiimote %s found in slot %d", name, i); slot = i; break; } @@ -1016,13 +1003,13 @@ static s8 __wpad_connreqCB(void *arg,struct bd_addr *pad_addr,u8 *cod,u8 link_ty BD_ADDR_FROM_BYTES(&bdaddr,__wpad_devs.registered[i].bdaddr); if(bd_addr_cmp(pad_addr,&bdaddr)) { name = (u8 *)__wpad_devs.registered[i].name; - //printf("Registered Wiimote %s found in slot %d\n", name, i); + WIIUSE_INFO("Registered Wiimote %s found in slot %d", name, i); // Not active, try to make active if(!strncmp("Nintendo RVL-CNT-", __wpad_devs.registered[i].name, 17)) { for(j=0; jaddr[5],pad_addr->addr[4],pad_addr->addr[3],pad_addr->addr[2],pad_addr->addr[1],pad_addr->addr[0]); + _CPU_ISR_Restore(level); return ERR_VAL; } @@ -1068,14 +1053,12 @@ static s8 __wpad_linkkeyreqCB(void *arg,struct bd_addr *pad_addr) { bool found = false; int i; - //printf("__wpad_linkkeyreqCB\n"); + + WIIUSE_INFO("__wpad_linkkeyreqCB"); for(i=0; i<__wpads_bonded; i++) { if(bd_addr_cmp(pad_addr,&__wpad_keys[i].bdaddr)) { found = true; - //printf("Found key for bdaddr: %02x:%02x:%02x:%02x:%02x:%02x\n",pad_addr->addr[5],pad_addr->addr[4],pad_addr->addr[3],pad_addr->addr[2],pad_addr->addr[1],pad_addr->addr[0]); - //printf(" %02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x\n",__wpad_keys[i].key[0],__wpad_keys[i].key[1],__wpad_keys[i].key[2],__wpad_keys[i].key[3],__wpad_keys[i].key[4],__wpad_keys[i].key[5],__wpad_keys[i].key[6],__wpad_keys[i].key[7],__wpad_keys[i].key[8],__wpad_keys[i].key[9],__wpad_keys[i].key[10],__wpad_keys[i].key[11],__wpad_keys[i].key[12],__wpad_keys[i].key[13],__wpad_keys[i].key[14],__wpad_keys[i].key[15]); - BTE_LinkKeyRequestReply(pad_addr,__wpad_keys[i].key); break; } @@ -1085,10 +1068,6 @@ static s8 __wpad_linkkeyreqCB(void *arg,struct bd_addr *pad_addr) for(i=0; iaddr[5],pad_addr->addr[4],pad_addr->addr[3],pad_addr->addr[2],pad_addr->addr[1],pad_addr->addr[0]); - //printf(" %02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x\n",__wpad_keys[i].key[0],__wpad_keys[i].key[1],__wpad_keys[i].key[2],__wpad_keys[i].key[3],__wpad_keys[i].key[4],__wpad_keys[i].key[5],__wpad_keys[i].key[6],__wpad_keys[i].key[7],__wpad_keys[i].key[8],__wpad_keys[i].key[9],__wpad_keys[i].key[10],__wpad_keys[i].key[11],__wpad_keys[i].key[12],__wpad_keys[i].key[13],__wpad_keys[i].key[14],__wpad_keys[i].key[15]); - BTE_LinkKeyRequestReply(pad_addr,__wpad_guest_keys[i].key); break; } @@ -1104,8 +1083,8 @@ static s8 __wpad_linkkeyreqCB(void *arg,struct bd_addr *pad_addr) static s8 __wpad_linkkeynotCB(void *arg,struct bd_addr *pad_addr,u8 *key) { int i; - - //printf("__wpad_linkkeynotCB\n"); + + WIIUSE_INFO("__wpad_linkkeynotCB"); // Only write link key to controller if not doing guest pairing if(BTE_GetPairMode() == PAIR_MODE_NORMAL) { @@ -1151,16 +1130,14 @@ s32 __wpad_inquiry_finished(s32 result,void *userdata) int i; struct pad_name_info *padinfo; struct inquiry_res *inq_res = (struct inquiry_res *)userdata; - //printf("__wpad_inquiry_finished %d\n", inq_res->count); if(result == ERR_OK && inq_res != NULL) { // Filter out weird null values - for(i = 0; i < inq_res->count; i++) { + for(i=0;icount;i++) { struct inquiry_info_ex *info = &inq_res->info[i]; if(!bd_addr_cmp(&info->bdaddr,BD_ADDR_ANY)) { - // Read name of first valid controller - //printf("Attempting to read name for bdaddr: %02x:%02x:%02x:%02x:%02x:%02x\n",info->bdaddr.addr[5],info->bdaddr.addr[4],info->bdaddr.addr[3],info->bdaddr.addr[2],info->bdaddr.addr[1],info->bdaddr.addr[0]); + // Read name of first valid device padinfo = (struct pad_name_info *)malloc(sizeof(struct pad_name_info)); if (padinfo == NULL) return ERR_MEM; @@ -1179,7 +1156,7 @@ s32 WPAD_StartPairing(void) u32 level; _CPU_ISR_Disable(level); - //printf("Pairing...\n"); + WIIUSE_INFO("Pairing..."); BTE_Inquiry(BD_MAX_INQUIRY_DEVS, TRUE, __wpad_inquiry_finished); _CPU_ISR_Restore(level); @@ -1192,7 +1169,7 @@ s32 WPAD_WipeSavedControllers(void) int i; _CPU_ISR_Disable(level); - //printf("Wiping saved controllers...\n"); + WIIUSE_INFO("Wiping saved controllers..."); for(i=0;iname); - printf(" bdaddr: %02x:%02x:%02x:%02x:%02x:%02x\n",device->bdaddr[0],device->bdaddr[1],device->bdaddr[2],device->bdaddr[3],device->bdaddr[4],device->bdaddr[5]); - } - - printf("BT.DINF num_registered %d\n", __wpad_devs.num_registered); - - for(i=0;i<__wpad_devs.num_registered;i++) { - conf_pad_device *device = &__wpad_devs.registered[i]; - printf("Registered Wiimote %s:\n", device->name); - printf(" bdaddr: %02x:%02x:%02x:%02x:%02x:%02x\n",device->bdaddr[0],device->bdaddr[1],device->bdaddr[2],device->bdaddr[3],device->bdaddr[4],device->bdaddr[5]); - } - - printf("BT.CDIF num_guests %d\n", __wpad_guests.num_guests); - - for(i=0;i<__wpad_guests.num_guests;i++) { - conf_pad_guest_device *device = &__wpad_guests.guests[i]; - printf("Guest Wiimote %s:\n", device->name); - printf(" bdaddr: %02x:%02x:%02x:%02x:%02x:%02x\n",device->bdaddr[0],device->bdaddr[1],device->bdaddr[2],device->bdaddr[3],device->bdaddr[4],device->bdaddr[5]); - }*/ - __wpads = wiiuse_init(WPAD_MAX_DEVICES,__wpad_eventCB); if(__wpads==NULL) { WPAD_Shutdown(); @@ -1797,8 +1753,8 @@ s32 WPAD_Shutdown(void) u32 level; struct _wpad_cb *wpdcb = NULL; - //printf("WPAD_Shutdown\n"); - + WIIUSE_INFO("WPAD_Shutdown"); + _CPU_ISR_Disable(level); BTE_Close(); From 6fed5dc7efea102ae306328edf1c8be3186bc497 Mon Sep 17 00:00:00 2001 From: Zarithya Date: Sat, 14 Jun 2025 03:08:02 -0700 Subject: [PATCH 20/27] Move bte_free calls to more logical places --- lwbt/bte.c | 3 +- lwbt/btopt.h | 2 +- wiiuse/io_wii.c | 27 +++++++++----- wiiuse/wpad.c | 98 +++++++++++++++++++++++-------------------------- 4 files changed, 65 insertions(+), 65 deletions(-) diff --git a/lwbt/bte.c b/lwbt/bte.c index fa46bea32..833ec195f 100644 --- a/lwbt/bte.c +++ b/lwbt/bte.c @@ -760,10 +760,11 @@ s32 bte_disconnect(struct bte_pcb *pcb) _CPU_ISR_Disable(level); pcb->state = (u32)STATE_DISCONNECTING; - if(pcb->data_pcb!=NULL ) + if(pcb->data_pcb!=NULL) err = l2ca_disconnect_req(pcb->data_pcb,l2cap_disconnect_cfm); else if(pcb->ctl_pcb!=NULL) err = l2ca_disconnect_req(pcb->ctl_pcb,l2cap_disconnect_cfm); + bte_free(pcb); _CPU_ISR_Restore(level); return err; diff --git a/lwbt/btopt.h b/lwbt/btopt.h index 28485f10b..6fa38ad59 100644 --- a/lwbt/btopt.h +++ b/lwbt/btopt.h @@ -181,7 +181,7 @@ typedef s8 err_t; * \hideinitializer */ #define LOGGING 0 -#define ERRORING 0 +#define ERRORING 1 /** * Print out a uIP log message. diff --git a/wiiuse/io_wii.c b/wiiuse/io_wii.c index 07eb852ec..11cbe6aca 100644 --- a/wiiuse/io_wii.c +++ b/wiiuse/io_wii.c @@ -53,6 +53,9 @@ static s32 __wiiuse_disconnected(void *arg,struct bte_pcb *pcb,u8 err) if(wm->event_cb) wm->event_cb(wm,WIIUSE_DISCONNECT); wml->wm = NULL; + + bte_free(wml->sock); + wml->sock = NULL; return ERR_OK; } @@ -82,11 +85,12 @@ static s32 __wiiuse_connected(void *arg,struct bte_pcb *pcb,u8 err) struct wiimote_listen_t *wml = (struct wiimote_listen_t*)arg; struct wiimote_t *wm; - WIIUSE_INFO("__wiiuse_connected(%d)", err); + WIIUSE_DEBUG("__wiiuse_connected(%d)", err); wm = wml->assign_cb(wml, err); if(!wm) { bte_disconnect(wml->sock); + wml->sock = NULL; return ERR_OK; } @@ -105,7 +109,7 @@ static s32 __wiiuse_connected(void *arg,struct bte_pcb *pcb,u8 err) static s32 __wiiuse_connect_step2(void *arg,struct bte_pcb *pcb,u8 err) { - WIIUSE_INFO("__wiiuse_connect_step2(%d)", err); + WIIUSE_DEBUG("__wiiuse_connect_step2(%d)", err); if (err!=ERR_OK) { bte_disconnect(pcb); return ERR_OK; @@ -121,7 +125,7 @@ static s32 __wiiuse_connect_step2(void *arg,struct bte_pcb *pcb,u8 err) static s32 __wiiuse_accept_step2(void *arg,struct bte_pcb *pcb,u8 err) { - WIIUSE_INFO("__wiiuse_accept_step2(%d)", err); + WIIUSE_DEBUG("__wiiuse_accept_step2(%d)", err); if (err!=ERR_OK) { bte_disconnect(pcb); return ERR_OK; @@ -151,9 +155,9 @@ int wiiuse_accept(struct wiimote_listen_t *wml, struct bd_addr *bdaddr, u8 *name { s32 err; - if(!wml || !bdaddr || !name || !assign_cb) return 0; + if(!wml || !bdaddr || !assign_cb) return 0; - WIIUSE_INFO("wiiuse_accept %p, bdaddr: %02x:%02x:%02x:%02x:%02x:%02x",wml,bdaddr->addr[5],bdaddr->addr[4],bdaddr->addr[3],bdaddr->addr[2],bdaddr->addr[1],bdaddr->addr[0]); + WIIUSE_DEBUG("wiiuse_accept %p, bdaddr: %02x:%02x:%02x:%02x:%02x:%02x",wml,bdaddr->addr[5],bdaddr->addr[4],bdaddr->addr[3],bdaddr->addr[2],bdaddr->addr[1],bdaddr->addr[0]); if(wml->sock!=NULL) { WIIUSE_ERROR("wiiuse_accept: wml->sock was not NULL!"); @@ -185,6 +189,8 @@ int wiiuse_accept(struct wiimote_listen_t *wml, struct bd_addr *bdaddr, u8 *name if(err==ERR_OK) return 1; WIIUSE_ERROR("wiiuse_accept: bte_listenasync failed(%d)", err); + bte_free(wml->sock); + wml->sock = NULL; return 0; } @@ -194,7 +200,7 @@ int wiiuse_connect(struct wiimote_listen_t *wml, struct bd_addr *bdaddr, u8 *nam if(!wml || !bdaddr|| !assign_cb) return 0; - WIIUSE_INFO("wiiuse_connect %p, bdaddr: %02x:%02x:%02x:%02x:%02x:%02x",wml,bdaddr->addr[5],bdaddr->addr[4],bdaddr->addr[3],bdaddr->addr[2],bdaddr->addr[1],bdaddr->addr[0]); + WIIUSE_DEBUG("wiiuse_connect %p, bdaddr: %02x:%02x:%02x:%02x:%02x:%02x",wml,bdaddr->addr[5],bdaddr->addr[4],bdaddr->addr[3],bdaddr->addr[2],bdaddr->addr[1],bdaddr->addr[0]); if(wml->sock!=NULL) { WIIUSE_ERROR("wiiuse_connect: wml->sock was not NULL!"); @@ -222,23 +228,24 @@ int wiiuse_connect(struct wiimote_listen_t *wml, struct bd_addr *bdaddr, u8 *nam bte_received(wml->sock,__wiiuse_receive); bte_disconnected(wml->sock,__wiiuse_disconnected); - WIIUSE_INFO("wiiuse_connect"); - err = bte_connectasync(wml->sock,bdaddr,__wiiuse_connect_step2); if(err==ERR_OK) return 1; - WIIUSE_ERROR("wiiuse_connect: bte_listenasync failed(%d)", err); + WIIUSE_ERROR("wiiuse_connect: bte_connectasync failed(%d)", err); + bte_free(wml->sock); + wml->sock = NULL; return 0; } void wiiuse_disconnect(struct wiimote_t *wm) { - WIIUSE_INFO("wiiuse_disconnect"); + WIIUSE_DEBUG("wiiuse_disconnect"); if(wm==NULL || wm->sock==NULL) return; WIIMOTE_DISABLE_STATE(wm,WIIMOTE_STATE_CONNECTED); bte_disconnect(wm->sock); + wml->sock = NULL; } void wiiuse_sensorbar_enable(int enable) diff --git a/wiiuse/wpad.c b/wiiuse/wpad.c index 4a51254c3..561aebd9e 100644 --- a/wiiuse/wpad.c +++ b/wiiuse/wpad.c @@ -136,7 +136,7 @@ static sys_resetinfo __wpad_resetinfo = { static s32 __wpad_onreset(s32 final) { - WIIUSE_INFO("__wpad_onreset(%d)",final); + WIIUSE_DEBUG("__wpad_onreset(%d)",final); if(final==FALSE) { WPAD_Shutdown(); } @@ -244,7 +244,7 @@ wiimote *__wpad_assign_slot(wiimote_listen *wml, u8 err) return NULL; } - WIIUSE_INFO("WPAD Assigning Slot %d (used: 0x%02x)", i, __wpads_used); + WIIUSE_DEBUG("WPAD Assigning Slot %d (used: 0x%02x)", i, __wpads_used); if(i>=WPAD_BALANCE_BOARD) { BYTES_FROM_BD_ADDR(__wpad_devs.balance_board.bdaddr, &wml->bdaddr); memcpy(__wpad_devs.balance_board.name, wml->name, sizeof(__wpad_devs.balance_board.name)); @@ -302,7 +302,7 @@ wiimote *__wpad_register_new(wiimote_listen *wml, u8 err) for(i=0; i<__wpad_guests.num_guests; i++) { BD_ADDR_FROM_BYTES(&(bdaddr),__wpad_guests.guests[i].bdaddr); if(bd_addr_cmp(&wml->bdaddr,&bdaddr)) { - WIIUSE_INFO("Wiimote guest in slot %d", i); + WIIUSE_DEBUG("Wiimote guest in slot %d", i); guestEntry = i; break; } @@ -312,7 +312,7 @@ wiimote *__wpad_register_new(wiimote_listen *wml, u8 err) for(i=0; i<__wpad_devs.num_registered; i++) { BD_ADDR_FROM_BYTES(&(bdaddr),__wpad_devs.registered[i].bdaddr); if(bd_addr_cmp(&wml->bdaddr,&bdaddr)) { - WIIUSE_INFO("Wiimote currently registered in slot %d", i); + WIIUSE_DEBUG("Wiimote currently registered in slot %d", i); registeredEntry = i; break; } @@ -330,7 +330,7 @@ wiimote *__wpad_register_new(wiimote_listen *wml, u8 err) memset(&__wpad_guests.guests[--__wpad_guests.num_guests], 0, sizeof(conf_pad_guest_device)); } - WIIUSE_INFO("Registering Wiimote '%s' with system...", wml->name); + WIIUSE_DEBUG("Registering Wiimote '%s' with system...", wml->name); memmove(&__wpad_devs.registered[1], &__wpad_devs.registered[0], sizeof(conf_pad_device)*(CONF_PAD_MAX_REGISTERED-1)); BYTES_FROM_BD_ADDR(__wpad_devs.registered[0].bdaddr, &wml->bdaddr); memcpy(__wpad_devs.registered[0].name, wml->name, sizeof(__wpad_devs.registered[0].name)); @@ -341,14 +341,14 @@ wiimote *__wpad_register_new(wiimote_listen *wml, u8 err) } else if(registeredEntry >= CONF_PAD_MAX_REGISTERED) { // Not permanent pair, need to save bdaddr and link key as guest controller if(guestEntry >= CONF_PAD_MAX_ACTIVE) { - WIIUSE_INFO("Saving Wiimote '%s' as guest...", wml->name); + WIIUSE_DEBUG("Saving Wiimote '%s' as guest...", wml->name); memmove(&__wpad_guests.guests[1], &__wpad_guests.guests[0], sizeof(conf_pad_guest_device)*(CONF_PAD_MAX_ACTIVE-1)); BYTES_FROM_BD_ADDR(__wpad_guests.guests[0].bdaddr, &wml->bdaddr); memcpy(__wpad_guests.guests[0].name, wml->name, sizeof(__wpad_guests.guests[0].name)); if (__wpad_guests.num_guests < CONF_PAD_MAX_ACTIVE) __wpad_guests.num_guests++; - for(i=0; ibdaddr,&__wpad_guest_keys[i].bdaddr)) { u8 *src = __wpad_guest_keys[i].key; u8 *dst = __wpad_guests.guests[0].link_key; @@ -372,7 +372,7 @@ static s32 __wpad_setevtfilter_finished(s32 result,void *usrdata) { u32 level; - WIIUSE_INFO("__wpad_setevtfilter_finished(%d)",result); + WIIUSE_DEBUG("__wpad_setevtfilter_finished(%d)",result); _CPU_ISR_Disable(level); if((result==ERR_OK) && (__wpads_inited==WPAD_STATE_ENABLING)) { @@ -386,7 +386,7 @@ static s32 __wpad_init_finished(s32 result,void *usrdata) { u32 level; - WIIUSE_INFO("__wpad_init_finished(%d)",result); + WIIUSE_DEBUG("__wpad_init_finished(%d)",result); _CPU_ISR_Disable(level); if(__wpads_inited==WPAD_STATE_ENABLING) { @@ -400,7 +400,7 @@ static s32 __wpad_patch_finished(s32 result,void *usrdata) { u32 level; - WIIUSE_INFO("__wpad_patch_finished(%d)",result); + WIIUSE_DEBUG("__wpad_patch_finished(%d)",result); _CPU_ISR_Disable(level); if(__wpads_inited==WPAD_STATE_ENABLING) { @@ -414,7 +414,7 @@ static s32 __readlinkkey_finished(s32 result,void *usrdata) { u32 i, j, level; - WIIUSE_INFO("__readlinkkey_finished(%d)",result); + WIIUSE_DEBUG("__readlinkkey_finished(%d)",result); _CPU_ISR_Disable(level); if(__wpads_inited==WPAD_STATE_ENABLING) { @@ -440,7 +440,7 @@ static s32 __initcore_finished(s32 result,void *usrdata) { u32 level; - WIIUSE_INFO("__initcore_finished(%d)",result); + WIIUSE_DEBUG("__initcore_finished(%d)",result); _CPU_ISR_Disable(level); if((result==ERR_OK) && (__wpads_inited==WPAD_STATE_ENABLING)) { @@ -454,7 +454,7 @@ static s32 __wpad_disconnect(struct _wpad_cb *wpdcb) { struct wiimote_t *wm; - WIIUSE_INFO("__wpad_disconnect"); + WIIUSE_DEBUG("__wpad_disconnect"); if(wpdcb==NULL) return 0; @@ -789,7 +789,7 @@ static void __wpad_eventCB(struct wiimote_t *wm,s32 event) case WIIUSE_ACK: break; default: - WIIUSE_INFO("__wpad_eventCB(%02x)", event); + WIIUSE_DEBUG("__wpad_eventCB(%02x)", event); break; } } @@ -801,7 +801,7 @@ void __wpad_disconnectCB(struct bd_addr *pad_addr, u8 reason) int i; u32 level; - WIIUSE_INFO("__wpad_disconnectCB(%d)", reason); + WIIUSE_DEBUG("__wpad_disconnectCB(%d)", reason); _CPU_ISR_Disable(level); if(__wpads_inited == WPAD_STATE_ENABLED) { @@ -833,8 +833,6 @@ void __wpad_disconnectCB(struct bd_addr *pad_addr, u8 reason) printf("WPAD Unknown Disconnect Reason(%d)\n", reason); break; } - bte_free(__wpads_listen[i].sock); - __wpads_listen[i].sock = NULL; __wpads_used &= ~(0x01<bdaddr,&bdaddr)) { - WIIUSE_INFO("Wiimote already active in slot %d", i); + WIIUSE_DEBUG("Wiimote already active in slot %d", i); slot = i; break; } @@ -882,7 +880,7 @@ s32 __wpad_read_remote_name_finished(s32 result,void *userdata) if(slot >= CONF_PAD_MAX_ACTIVE) { for(i=0; ibdaddr,&bdaddr)) { - WIIUSE_INFO("Balance Board already registered"); + WIIUSE_DEBUG("Balance Board already registered"); slot = WPAD_BALANCE_BOARD; } // Not active, try to make active if(slot != WPAD_BALANCE_BOARD) { if(!(__wpads_used & (1<= CONF_PAD_MAX_ACTIVE) { + if(slot >= WPAD_MAX_DEVICES) { for(i=0; i= CONF_PAD_MAX_ACTIVE) { - slot = CONF_PAD_MAX_ACTIVE; + if(slot >= WPAD_BALANCE_BOARD) { + slot = WPAD_MAX_DEVICES; } } else { - for(j=CONF_PAD_MAX_ACTIVE; jsound_alarm); - bte_free(__wpads_listen[i].sock); - __wpads_listen[i].sock = NULL; } __wiiuse_sensorbar_enable(0); From 2322b939138ce343c964f70130a1953c71923702 Mon Sep 17 00:00:00 2001 From: Zarithya Date: Tue, 17 Jun 2025 14:50:48 -0700 Subject: [PATCH 21/27] General disconnect CB --- gc/wiiuse/wiiuse.h | 4 +- gc/wiiuse/wpad.h | 15 +++++- lwbt/bte.c | 1 + wiiuse/events.c | 7 ++- wiiuse/io_wii.c | 14 +++-- wiiuse/wiiuse_internal.h | 4 +- wiiuse/wpad.c | 108 ++++++++++++++++++++++----------------- 7 files changed, 96 insertions(+), 57 deletions(-) diff --git a/gc/wiiuse/wiiuse.h b/gc/wiiuse/wiiuse.h index 615d85d70..49ed06282 100644 --- a/gc/wiiuse/wiiuse.h +++ b/gc/wiiuse/wiiuse.h @@ -699,8 +699,8 @@ WIIUSE_EXPORT extern const char* wiiuse_version(); #ifndef GEKKO WIIUSE_EXPORT extern struct wiimote_t** wiiuse_init(int wiimotes); #else -WIIUSE_EXPORT extern int wiiuse_accept(struct wiimote_listen_t *wml, struct bd_addr *bdaddr, u8 *name, struct wiimote_t *(*assign_cb)(struct wiimote_listen_t *wml, u8 err)); -WIIUSE_EXPORT extern int wiiuse_connect(struct wiimote_listen_t *wml, struct bd_addr *bdaddr, u8 *name, struct wiimote_t *(*assign_cb)(struct wiimote_listen_t *wml, u8 err)); +WIIUSE_EXPORT extern int wiiuse_accept(struct wiimote_listen_t *wml, struct bd_addr *bdaddr, u8 *name, struct wiimote_t *(*assign_cb)(wiimote_listen *wml, u8 err)); +WIIUSE_EXPORT extern int wiiuse_connect(struct wiimote_listen_t *wml, struct bd_addr *bdaddr, u8 *name, struct wiimote_t *(*assign_cb)(wiimote_listen *wml, u8 err)); WIIUSE_EXPORT extern struct wiimote_t** wiiuse_init(int wiimotes, wii_event_cb event_cb); WIIUSE_EXPORT extern void wiiuse_sensorbar_enable(int enable); #endif diff --git a/gc/wiiuse/wpad.h b/gc/wiiuse/wpad.h index f0167d02a..daddd9a2d 100644 --- a/gc/wiiuse/wpad.h +++ b/gc/wiiuse/wpad.h @@ -140,6 +140,14 @@ enum { #define WPAD_THRESH_DEFAULT_BALANCEBOARD 60 #define WPAD_THRESH_DEFAULT_MOTION_PLUS 100 +#define WPAD_DISCON_AUTH_FAILURE 0x05 /* HCI_AUTHENTICATION_FAILURE */ +#define WPAD_DISCON_TIMEOUT 0x08 /* HCI_CONN_TIMEOUT */ +#define WPAD_DISCON_SYNC_PRESSED 0x13 /* HCI_OTHER_END_TERMINATED_CONN_USER_ENDED */ +#define WPAD_DISCON_BATTERY_DIED 0x14 /* HCI_OTHER_END_TERMINATED_CONN_LOW_RESOURCES */ +#define WPAD_DISCON_POWER_OFF 0x15 /* HCI_OTHER_END_TERMINATED_CONN_ABOUT_TO_POWER_OFF */ +#define WPAD_DISCON_IDLE_TIMEOUT 0x16 /* HCI_CONN_TERMINATED_BY_LOCAL_HOST */ +#define WPAD_DISCON_REPEATED_ATTEMPTS 0x17 /* HCI_REPEATED_ATTEMPTS */ + #ifdef __cplusplus extern "C" { #endif /* __cplusplus */ @@ -170,6 +178,8 @@ typedef struct _wpad_encstatus typedef void (*WPADDataCallback)(s32 chan, const WPADData *data); typedef void (*WPADShutdownCallback)(s32 chan); +typedef void (*WPADDisconnectCallback)(s32 chan, u8 reason); +typedef void (*WPADStatusCallback)(s32 chan); typedef void (*WPADHostSyncBtnCallback)(u32 held); s32 WPAD_Init(void); @@ -195,8 +205,9 @@ s32 WPAD_Shutdown(void); void WPAD_SetIdleTimeout(u32 seconds); void WPAD_SetPowerButtonCallback(WPADShutdownCallback cb); void WPAD_SetBatteryDeadCallback(WPADShutdownCallback cb); -void WPAD_SetIdleTimeoutCallback(WPADShutdownCallback cb); +void WPAD_SetDisconnectCallback(WPADDisconnectCallback cb); void WPAD_SetHostSyncButtonCallback(WPADHostSyncBtnCallback cb); +void WPAD_SetStatusCallback(WPADStatusCallback cb); s32 WPAD_ScanPads(void); s32 WPAD_Rumble(s32 chan, int status); s32 WPAD_SetIdleThresholds(s32 chan, s32 btns, s32 ir, s32 accel, s32 js, s32 wb, s32 mp); @@ -211,6 +222,8 @@ void WPAD_Orientation(int chan, struct orient_t *orient); void WPAD_GForce(int chan, struct gforce_t *gforce); void WPAD_Accel(int chan, struct vec3w_t *accel); void WPAD_Expansion(int chan, struct expansion_t *exp); +void WPAD_PadStatus(int chan); +bool WPAD_IsBatteryCritical(int chan); #ifdef __cplusplus } diff --git a/lwbt/bte.c b/lwbt/bte.c index 833ec195f..ba09c203a 100644 --- a/lwbt/bte.c +++ b/lwbt/bte.c @@ -764,6 +764,7 @@ s32 bte_disconnect(struct bte_pcb *pcb) err = l2ca_disconnect_req(pcb->data_pcb,l2cap_disconnect_cfm); else if(pcb->ctl_pcb!=NULL) err = l2ca_disconnect_req(pcb->ctl_pcb,l2cap_disconnect_cfm); + printf("bte_disconnect: freed\n"); bte_free(pcb); _CPU_ISR_Restore(level); diff --git a/wiiuse/events.c b/wiiuse/events.c index 8aa3006da..fbf30369a 100644 --- a/wiiuse/events.c +++ b/wiiuse/events.c @@ -106,9 +106,10 @@ static void event_ack(struct wiimote_t *wm,ubyte *msg) static void event_status(struct wiimote_t *wm,ubyte *msg) { - int ir = 0; + int critical = 0; int attachment = 0; int speaker = 0; + int ir = 0; //int led[4]= {0}; struct cmd_blk_t *cmd = wm->cmd_head; @@ -120,12 +121,16 @@ static void event_status(struct wiimote_t *wm,ubyte *msg) //if(msg[2]&WM_CTRL_STATUS_BYTE1_LED_3) led[2] = 1; //if(msg[2]&WM_CTRL_STATUS_BYTE1_LED_4) led[3] = 1; + if((msg[2]&WM_CTRL_STATUS_BYTE1_BATTERY_CRITICAL)==WM_CTRL_STATUS_BYTE1_BATTERY_CRITICAL) critical = 1; if((msg[2]&WM_CTRL_STATUS_BYTE1_ATTACHMENT)==WM_CTRL_STATUS_BYTE1_ATTACHMENT) attachment = 1; if((msg[2]&WM_CTRL_STATUS_BYTE1_SPEAKER_ENABLED)==WM_CTRL_STATUS_BYTE1_SPEAKER_ENABLED) speaker = 1; if((msg[2]&WM_CTRL_STATUS_BYTE1_IR_ENABLED)==WM_CTRL_STATUS_BYTE1_IR_ENABLED) ir = 1; wm->battery_level = msg[5]; + if(critical && !WIIMOTE_IS_SET(wm,WIIMOTE_STATE_BATTERY_CRITICAL)) WIIMOTE_ENABLE_STATE(wm,WIIMOTE_STATE_BATTERY_CRITICAL); + else if(!critical && WIIMOTE_IS_SET(wm,WIIMOTE_STATE_BATTERY_CRITICAL)) WIIMOTE_DISABLE_STATE(wm,WIIMOTE_STATE_BATTERY_CRITICAL); + if(!ir && WIIMOTE_IS_SET(wm,WIIMOTE_STATE_IR_INIT)) { WIIMOTE_DISABLE_STATE(wm, WIIMOTE_STATE_IR_INIT); wiiuse_set_ir(wm, 1); diff --git a/wiiuse/io_wii.c b/wiiuse/io_wii.c index 11cbe6aca..d95a70e93 100644 --- a/wiiuse/io_wii.c +++ b/wiiuse/io_wii.c @@ -54,6 +54,7 @@ static s32 __wiiuse_disconnected(void *arg,struct bte_pcb *pcb,u8 err) wml->wm = NULL; + printf("__wiiuse_disconnected: freed\n"); bte_free(wml->sock); wml->sock = NULL; return ERR_OK; @@ -151,7 +152,7 @@ void __wiiuse_sensorbar_enable(int enable) IRQ_Restore(level); } -int wiiuse_accept(struct wiimote_listen_t *wml, struct bd_addr *bdaddr, u8 *name, struct wiimote_t *(*assign_cb)(struct wiimote_listen_t *wml, u8 err)) +int wiiuse_accept(struct wiimote_listen_t *wml, struct bd_addr *bdaddr, u8 *name, struct wiimote_t *(*assign_cb)(wiimote_listen *wml, u8 err)) { s32 err; @@ -174,6 +175,7 @@ int wiiuse_accept(struct wiimote_listen_t *wml, struct bd_addr *bdaddr, u8 *name } wml->assign_cb = assign_cb; + printf("wiiuse_accept: create\n"); wml->sock = bte_new(); if (wml->sock==NULL) { @@ -189,12 +191,14 @@ int wiiuse_accept(struct wiimote_listen_t *wml, struct bd_addr *bdaddr, u8 *name if(err==ERR_OK) return 1; WIIUSE_ERROR("wiiuse_accept: bte_listenasync failed(%d)", err); + + printf("wiiuse_accept: freed\n"); bte_free(wml->sock); wml->sock = NULL; return 0; } -int wiiuse_connect(struct wiimote_listen_t *wml, struct bd_addr *bdaddr, u8 *name, struct wiimote_t *(*assign_cb)(struct wiimote_listen_t *wml, u8 err)) +int wiiuse_connect(struct wiimote_listen_t *wml, struct bd_addr *bdaddr, u8 *name, struct wiimote_t *(*assign_cb)(wiimote_listen *wml, u8 err)) { s32 err; @@ -217,6 +221,7 @@ int wiiuse_connect(struct wiimote_listen_t *wml, struct bd_addr *bdaddr, u8 *nam } wml->assign_cb = assign_cb; + printf("wiiuse_connect: create\n"); wml->sock = bte_new(); if (wml->sock==NULL) { @@ -232,6 +237,8 @@ int wiiuse_connect(struct wiimote_listen_t *wml, struct bd_addr *bdaddr, u8 *nam if(err==ERR_OK) return 1; WIIUSE_ERROR("wiiuse_connect: bte_connectasync failed(%d)", err); + + printf("wiiuse_connect: freed\n"); bte_free(wml->sock); wml->sock = NULL; return 0; @@ -245,7 +252,7 @@ void wiiuse_disconnect(struct wiimote_t *wm) WIIMOTE_DISABLE_STATE(wm,WIIMOTE_STATE_CONNECTED); bte_disconnect(wm->sock); - wml->sock = NULL; + wm->sock = NULL; } void wiiuse_sensorbar_enable(int enable) @@ -253,7 +260,6 @@ void wiiuse_sensorbar_enable(int enable) __wiiuse_sensorbar_enable(enable); } - void wiiuse_init_cmd_queue(struct wiimote_t *wm) { u32 size; diff --git a/wiiuse/wiiuse_internal.h b/wiiuse/wiiuse_internal.h index f95e056b3..9c0013b1b 100644 --- a/wiiuse/wiiuse_internal.h +++ b/wiiuse/wiiuse_internal.h @@ -143,7 +143,7 @@ #define WM_IR_TYPE_FULL 0x05 /* controller status flags for the first message byte */ -/* bit 1 is unknown */ +#define WM_CTRL_STATUS_BYTE1_BATTERY_CRITICAL 0x01 #define WM_CTRL_STATUS_BYTE1_ATTACHMENT 0x02 #define WM_CTRL_STATUS_BYTE1_SPEAKER_ENABLED 0x04 #define WM_CTRL_STATUS_BYTE1_IR_ENABLED 0x08 @@ -189,7 +189,7 @@ /* wiimote state flags - (some duplicated in wiiuse.h)*/ #define WIIMOTE_STATE_DEV_FOUND 0x000001 -//#define WIIMOTE_STATE_DEV_REGISTER 0x000002 +#define WIIMOTE_STATE_BATTERY_CRITICAL 0x000002 #define WIIMOTE_STATE_HANDSHAKE 0x000004 /* actual connection exists but no handshake yet */ #define WIIMOTE_STATE_HANDSHAKE_COMPLETE 0x000008 /* actual connection exists but no handshake yet */ #define WIIMOTE_STATE_CONNECTED 0x000010 diff --git a/wiiuse/wpad.c b/wiiuse/wpad.c index 561aebd9e..e1fec27d6 100644 --- a/wiiuse/wpad.c +++ b/wiiuse/wpad.c @@ -54,14 +54,6 @@ distribution. #define MAX_STREAMDATA_LEN 20 #define EVENTQUEUE_LENGTH 16 -#define DISCONNECT_AUTH_FAILURE 0x05 /* HCI_AUTHENTICATION_FAILURE */ -#define DISCONNECT_TIMEOUT 0x08 /* HCI_CONN_TIMEOUT */ -#define DISCONNECT_SYNC_PRESSED 0x13 /* HCI_OTHER_END_TERMINATED_CONN_USER_ENDED */ -#define DISCONNECT_BATTERY_DIED 0x14 /* HCI_OTHER_END_TERMINATED_CONN_LOW_RESOURCES */ -#define DISCONNECT_POWER_OFF 0x15 /* HCI_OTHER_END_TERMINATED_CONN_ABOUT_TO_POWER_OFF */ -#define DISCONNECT_IDLE_TIMEOUT 0x16 /* HCI_CONN_TERMINATED_BY_LOCAL_HOST */ -#define DISCONNECT_REPEATED_ATTEMPTS 0x17 /* HCI_REPEATED_ATTEMPTS */ - struct _wpad_thresh { s32 btns; s32 ir; @@ -121,9 +113,9 @@ static void __wpad_def_powcb(s32 chan); static void __wpad_def_hostsynccb(u32 held); static WPADShutdownCallback __wpad_batcb = NULL; static WPADShutdownCallback __wpad_powcb = __wpad_def_powcb; -static WPADShutdownCallback __wpad_synccb = NULL; -static WPADShutdownCallback __wpad_idletimeoutcb = NULL; +static WPADDisconnectCallback __wpad_disconncb = NULL; static WPADHostSyncBtnCallback __wpad_hostsynccb = __wpad_def_hostsynccb; +static WPADStatusCallback __wpad_statuscb = NULL; extern void __wiiuse_sensorbar_enable(int enable); extern void __SYS_DoPowerCB(void); @@ -232,7 +224,7 @@ wiimote *__wpad_assign_slot(wiimote_listen *wml, u8 err) if (i >= WPAD_MAX_DEVICES) { - WIIUSE_ERROR("WPAD Listen Slot %d Not Valid\n", i); + WIIUSE_ERROR("WPAD Slot %d Not Valid\n", i); _CPU_ISR_Restore(level); return NULL; } @@ -298,7 +290,7 @@ wiimote *__wpad_register_new(wiimote_listen *wml, u8 err) wm = __wpad_assign_slot(wml, err); if (wm) { - // Search for wml->bdaddr in guest registration list + // Search for bdaddr in guest registration list for(i=0; i<__wpad_guests.num_guests; i++) { BD_ADDR_FROM_BYTES(&(bdaddr),__wpad_guests.guests[i].bdaddr); if(bd_addr_cmp(&wml->bdaddr,&bdaddr)) { @@ -308,7 +300,7 @@ wiimote *__wpad_register_new(wiimote_listen *wml, u8 err) } } - // Search for wml->bdaddr in permanent registration list + // Search for bdaddr in permanent registration list for(i=0; i<__wpad_devs.num_registered; i++) { BD_ADDR_FROM_BYTES(&(bdaddr),__wpad_devs.registered[i].bdaddr); if(bd_addr_cmp(&wml->bdaddr,&bdaddr)) { @@ -319,7 +311,7 @@ wiimote *__wpad_register_new(wiimote_listen *wml, u8 err) } if(BTE_GetPairMode() == PAIR_MODE_NORMAL) { - // Permanent pair, need to save wml->bdaddr as known controller + // Permanent pair, need to save bdaddr as known controller if(registeredEntry >= __wpad_devs.num_registered) { // If currently guest, we want to allow for upgrade to permanent pair if(guestEntry < CONF_PAD_MAX_ACTIVE) { @@ -348,7 +340,7 @@ wiimote *__wpad_register_new(wiimote_listen *wml, u8 err) if (__wpad_guests.num_guests < CONF_PAD_MAX_ACTIVE) __wpad_guests.num_guests++; - for(i=0; ibdaddr,&__wpad_guest_keys[i].bdaddr)) { u8 *src = __wpad_guest_keys[i].key; u8 *dst = __wpad_guests.guests[0].link_key; @@ -794,8 +786,6 @@ static void __wpad_eventCB(struct wiimote_t *wm,s32 event) } } -// TODO: Expose to user instead of handling it here? (so user can be aware of any and all disconnects) -// Or should user just be polling? void __wpad_disconnectCB(struct bd_addr *pad_addr, u8 reason) { int i; @@ -807,31 +797,18 @@ void __wpad_disconnectCB(struct bd_addr *pad_addr, u8 reason) if(__wpads_inited == WPAD_STATE_ENABLED) { for(i=0;i CONF_PAD_ACTIVE_AND_OTHER) { + if(__wpad_guests.num_guests > CONF_PAD_MAX_ACTIVE) { WPAD_Shutdown(); _CPU_ISR_Restore(level); return WPAD_ERR_BADCONF; @@ -1671,6 +1648,7 @@ s32 WPAD_SetEventBufs(s32 chan, WPADData *bufs, u32 cnt) return WPAD_ERR_NONE; } +[[deprecated]] void WPAD_SetPowerButtonCallback(WPADShutdownCallback cb) { u32 level; @@ -1683,6 +1661,7 @@ void WPAD_SetPowerButtonCallback(WPADShutdownCallback cb) _CPU_ISR_Restore(level); } +[[deprecated]] void WPAD_SetBatteryDeadCallback(WPADShutdownCallback cb) { u32 level; @@ -1692,12 +1671,12 @@ void WPAD_SetBatteryDeadCallback(WPADShutdownCallback cb) _CPU_ISR_Restore(level); } -void WPAD_SetIdleTimeoutCallback(WPADShutdownCallback cb) +void WPAD_SetDisconnectCallback(WPADDisconnectCallback cb) { u32 level; _CPU_ISR_Disable(level); - __wpad_idletimeoutcb = cb; + __wpad_disconncb = cb; _CPU_ISR_Restore(level); } @@ -1713,6 +1692,15 @@ void WPAD_SetHostSyncButtonCallback(WPADHostSyncBtnCallback cb) _CPU_ISR_Restore(level); } +void WPAD_SetStatusCallback(WPADStatusCallback cb) +{ + u32 level; + + _CPU_ISR_Disable(level); + __wpad_statuscb = cb; + _CPU_ISR_Restore(level); +} + s32 WPAD_Disconnect(s32 chan) { s32 err = WPAD_ERR_NONE; @@ -2010,3 +1998,29 @@ void WPAD_Expansion(int chan, struct expansion_t *exp) if(chan<0 || chan>=WPAD_MAX_DEVICES || exp==NULL ) return; *exp = wpaddata[chan].exp; } + +void __wpad_status_finished(struct wiimote_t *wm,ubyte *data,uword len) +{ + u32 level; + + _CPU_ISR_Disable(level); + if (wm && __wpad_statuscb) __wpad_statuscb(wm->unid); + _CPU_ISR_Restore(level); +} + +void WPAD_PadStatus(int chan) +{ + u32 level; + + _CPU_ISR_Disable(level); + if(chan<0 || chan>=WPAD_MAX_DEVICES) return; + if(__wpads[chan] && WIIMOTE_IS_SET(__wpads[chan],WIIMOTE_STATE_CONNECTED)) wiiuse_status(__wpads[chan], __wpad_status_finished); + + _CPU_ISR_Restore(level); +} + +bool WPAD_IsBatteryCritical(int chan) +{ + if(chan<0 || chan>=WPAD_MAX_DEVICES) return false; + return WIIMOTE_IS_SET(__wpads[chan],WIIMOTE_STATE_BATTERY_CRITICAL); +} From b7cd820a263cfddace301f61579e92f8fa301f35 Mon Sep 17 00:00:00 2001 From: Zarithya Date: Tue, 24 Jun 2025 16:30:09 -0700 Subject: [PATCH 22/27] Clear critical battery state on disconnect --- wiiuse/io_wii.c | 1 + 1 file changed, 1 insertion(+) diff --git a/wiiuse/io_wii.c b/wiiuse/io_wii.c index d95a70e93..8e8e05636 100644 --- a/wiiuse/io_wii.c +++ b/wiiuse/io_wii.c @@ -39,6 +39,7 @@ static s32 __wiiuse_disconnected(void *arg,struct bte_pcb *pcb,u8 err) if(!wm) return ERR_OK; + WIIMOTE_DISABLE_STATE(wm, (WIIMOTE_STATE_BATTERY_CRITICAL)); WIIMOTE_DISABLE_STATE(wm, (WIIMOTE_STATE_IR|WIIMOTE_STATE_IR_INIT)); WIIMOTE_DISABLE_STATE(wm, (WIIMOTE_STATE_SPEAKER|WIIMOTE_STATE_SPEAKER_INIT)); WIIMOTE_DISABLE_STATE(wm, (WIIMOTE_STATE_EXP|WIIMOTE_STATE_EXP_HANDSHAKE|WIIMOTE_STATE_EXP_FAILED)); From ddb380dd9fc88fe0c85681b403dd2afa842f4f3e Mon Sep 17 00:00:00 2001 From: Zarithya Date: Tue, 24 Jun 2025 16:44:53 -0700 Subject: [PATCH 23/27] Clear sock on shutdown --- wiiuse/io_wii.c | 7 +------ wiiuse/wpad.c | 2 ++ 2 files changed, 3 insertions(+), 6 deletions(-) diff --git a/wiiuse/io_wii.c b/wiiuse/io_wii.c index 8e8e05636..d297e3ce2 100644 --- a/wiiuse/io_wii.c +++ b/wiiuse/io_wii.c @@ -55,7 +55,6 @@ static s32 __wiiuse_disconnected(void *arg,struct bte_pcb *pcb,u8 err) wml->wm = NULL; - printf("__wiiuse_disconnected: freed\n"); bte_free(wml->sock); wml->sock = NULL; return ERR_OK; @@ -176,7 +175,6 @@ int wiiuse_accept(struct wiimote_listen_t *wml, struct bd_addr *bdaddr, u8 *name } wml->assign_cb = assign_cb; - printf("wiiuse_accept: create\n"); wml->sock = bte_new(); if (wml->sock==NULL) { @@ -192,8 +190,7 @@ int wiiuse_accept(struct wiimote_listen_t *wml, struct bd_addr *bdaddr, u8 *name if(err==ERR_OK) return 1; WIIUSE_ERROR("wiiuse_accept: bte_listenasync failed(%d)", err); - - printf("wiiuse_accept: freed\n"); + bte_free(wml->sock); wml->sock = NULL; return 0; @@ -222,7 +219,6 @@ int wiiuse_connect(struct wiimote_listen_t *wml, struct bd_addr *bdaddr, u8 *nam } wml->assign_cb = assign_cb; - printf("wiiuse_connect: create\n"); wml->sock = bte_new(); if (wml->sock==NULL) { @@ -239,7 +235,6 @@ int wiiuse_connect(struct wiimote_listen_t *wml, struct bd_addr *bdaddr, u8 *nam WIIUSE_ERROR("wiiuse_connect: bte_connectasync failed(%d)", err); - printf("wiiuse_connect: freed\n"); bte_free(wml->sock); wml->sock = NULL; return 0; diff --git a/wiiuse/wpad.c b/wiiuse/wpad.c index e1fec27d6..7fc8c7103 100644 --- a/wiiuse/wpad.c +++ b/wiiuse/wpad.c @@ -1749,6 +1749,8 @@ s32 WPAD_Shutdown(void) for(i=0;isound_alarm); + bte_free(__wpads_listen[i].sock); + __wpads_listen[i].sock = NULL; } __wiiuse_sensorbar_enable(0); From 4f8f311111afe12b745f841091a7344b38b726f7 Mon Sep 17 00:00:00 2001 From: Zarithya Date: Tue, 24 Jun 2025 17:41:33 -0700 Subject: [PATCH 24/27] Cleanup --- gc/bte/bte.h | 20 ++++++++++---------- lwbt/btarch.h | 8 ++++---- lwbt/bte.c | 1 - lwbt/btopt.h | 16 ++++++++-------- wiiuse/definitions.h | 22 +++++++++++++++++++--- 5 files changed, 41 insertions(+), 26 deletions(-) diff --git a/gc/bte/bte.h b/gc/bte/bte.h index a209fa9cc..31adbaeb5 100644 --- a/gc/bte/bte.h +++ b/gc/bte/bte.h @@ -56,18 +56,18 @@ #define HIDP_CTRL_VC_UNPLUG 0x05 /* HIDP data transaction headers */ -#define HIDP_DATA_RTYPE_MASK 0x03 -#define HIDP_DATA_RSRVD_MASK 0x0c -#define HIDP_DATA_RTYPE_OTHER 0x00 -#define HIDP_DATA_RTYPE_INPUT 0x01 -#define HIDP_DATA_RTYPE_OUPUT 0x02 -#define HIDP_DATA_RTYPE_FEATURE 0x03 +#define HIDP_DATA_RTYPE_MASK 0x03 +#define HIDP_DATA_RSRVD_MASK 0x0c +#define HIDP_DATA_RTYPE_OTHER 0x00 +#define HIDP_DATA_RTYPE_INPUT 0x01 +#define HIDP_DATA_RTYPE_OUPUT 0x02 +#define HIDP_DATA_RTYPE_FEATURE 0x03 #define HIDP_PROTO_BOOT 0x00 #define HIDP_PROTO_REPORT 0x01 -#define BD_LINK_KEY_LEN 16 -#define BD_NAME_LEN 248 +#define BD_LINK_KEY_LEN 16 +#define BD_NAME_LEN 248 #define BD_MAX_INQUIRY_DEVS 255 enum pair_mode { @@ -76,7 +76,7 @@ enum pair_mode { }; #ifdef __cplusplus - extern "C" { + extern "C" { #endif /* __cplusplus */ struct l2cap_pcb; @@ -182,7 +182,7 @@ s32 bte_sendmessage(struct bte_pcb *pcb,void *message,u16 len); s32 bte_sendmessageasync(struct bte_pcb *pcb,void *message,u16 len,s32 (*sent)(void *arg,struct bte_pcb *pcb,u8 err)); #ifdef __cplusplus - } + } #endif /* __cplusplus */ #endif diff --git a/lwbt/btarch.h b/lwbt/btarch.h index 7697f32b2..9abf7ba61 100644 --- a/lwbt/btarch.h +++ b/lwbt/btarch.h @@ -137,19 +137,19 @@ static __inline__ void __memset(void *dest,s32_t c,s32_t len) #define MEMSET memset #endif -#if LOGGING == 1 +#if BT_LOGGING == 1 #include #define LOG(fmt, ...) fprintf(stderr, "[BTLOG] " __FILE__ ":%i: " fmt "\n", __LINE__, ##__VA_ARGS__) #else #define LOG(fmt, ...) -#endif /* LOGGING == 1 */ +#endif /* BT_LOGGING == 1 */ -#if ERRORING == 1 +#if BT_ERRORING == 1 #include #define ERROR(fmt,...) fprintf(stderr, "[BTERR] " __FILE__ ":%i: " fmt "\n", __LINE__, ##__VA_ARGS__) #else #define ERROR(fmt, ...) -#endif /* ERRORING == 1 */ +#endif /* BT_ERRORING == 1 */ /** @} */ diff --git a/lwbt/bte.c b/lwbt/bte.c index ba09c203a..833ec195f 100644 --- a/lwbt/bte.c +++ b/lwbt/bte.c @@ -764,7 +764,6 @@ s32 bte_disconnect(struct bte_pcb *pcb) err = l2ca_disconnect_req(pcb->data_pcb,l2cap_disconnect_cfm); else if(pcb->ctl_pcb!=NULL) err = l2ca_disconnect_req(pcb->ctl_pcb,l2cap_disconnect_cfm); - printf("bte_disconnect: freed\n"); bte_free(pcb); _CPU_ISR_Restore(level); diff --git a/lwbt/btopt.h b/lwbt/btopt.h index 6fa38ad59..4e94d4f5c 100644 --- a/lwbt/btopt.h +++ b/lwbt/btopt.h @@ -169,7 +169,7 @@ typedef s8 err_t; * * \hideinitializer */ -#define STATISTICS 0 +#define STATISTICS 0 /** * Determines if logging of certain events should be compiled in. @@ -180,8 +180,8 @@ typedef s8 err_t; * * \hideinitializer */ -#define LOGGING 0 -#define ERRORING 1 +#define BT_LOGGING 0 +#define BT_ERRORING 0 /** * Print out a uIP log message. @@ -200,7 +200,7 @@ void bt_log(const char *filename,int line_nb,char *msg); * * \hideinitializer */ -#define LL_HLEN 16 +#define LL_HLEN 16 #define TCPIP_HLEN 40 /** @} */ @@ -216,10 +216,10 @@ void bt_log(const char *filename,int line_nb,char *msg); * reflect the CPU architecture on which uIP is to be run. */ #ifndef LITTLE_ENDIAN -#define LITTLE_ENDIAN 3412 +#define LITTLE_ENDIAN 3412 #endif /* LITTLE_ENDIAN */ #ifndef BIG_ENDIAN -#define BIG_ENDIAN 1234 +#define BIG_ENDIAN 1234 #endif /* BIGE_ENDIAN */ /** @@ -231,7 +231,7 @@ void bt_log(const char *filename,int line_nb,char *msg); * \hideinitializer */ #ifndef BYTE_ORDER -#define BYTE_ORDER BIG_ENDIAN +#define BYTE_ORDER BIG_ENDIAN #endif /* BYTE_ORDER */ /** @} */ @@ -241,7 +241,7 @@ void bt_log(const char *filename,int line_nb,char *msg); /* ---------- Memory options ---------- */ #define MAX_NUM_CLIENTS 6 /* Maximum number of connected Bluetooth clients. No more than 6 */ -#define MAX_NUM_OPT_CLIENTS 10 /* Maximum number of possible Bluetooth clients we might listen to */ +#define MAX_NUM_OPT_CLIENTS 10 /* Maximum number of possible Bluetooth clients we might listen to */ #define MEMB_NUM_HCI_PCB 1 /* Always set to one */ #define MEMB_NUM_HCI_LINK MAX_NUM_CLIENTS /* One for DT + One per ACL connection */ diff --git a/wiiuse/definitions.h b/wiiuse/definitions.h index 04dc5be6d..979b2fd33 100644 --- a/wiiuse/definitions.h +++ b/wiiuse/definitions.h @@ -7,14 +7,30 @@ //#define WITH_WIIUSE_DEBUG +#define WIIUSE_LOGGING 0 +#define WIIUSE_ERRORING 0 + /* Error output macros */ -#define WIIUSE_ERROR(fmt, ...) fprintf(stderr, "[ERROR] " fmt "\n", ##__VA_ARGS__) +#if WIIUSE_ERRORING == 1 + #define WIIUSE_ERROR(fmt, ...) fprintf(stderr, "[ERROR] " fmt "\n", ##__VA_ARGS__) +#else + #define WIIUSE_ERROR(fmt, ...) +#endif /* WIIUSE_ERRORING == 1 */ /* Warning output macros */ -#define WIIUSE_WARNING(fmt, ...) fprintf(stderr, "[WARNING] " fmt "\n", ##__VA_ARGS__) +#if WIIUSE_ERRORING == 1 + #define WIIUSE_WARNING(fmt, ...) fprintf(stderr, "[WARNING] " fmt "\n", ##__VA_ARGS__) +#else + #define WIIUSE_WARNING(fmt, ...) +#endif /* WIIUSE_ERRORING == 1 */ + /* Information output macros */ -#define WIIUSE_INFO(fmt, ...) fprintf(stderr, "[INFO] " fmt "\n", ##__VA_ARGS__) +#if WIIUSE_LOGGING == 1 + #define WIIUSE_INFO(fmt, ...) fprintf(stderr, "[INFO] " fmt "\n", ##__VA_ARGS__) +#else + #define WIIUSE_INFO(fmt, ...) +#endif /* WIIUSE_LOGGING == 1 */ #ifdef WITH_WIIUSE_DEBUG #ifdef WIN32 From d10c65b53fa825e1b4e05d97b4a1f402d7d9c5a4 Mon Sep 17 00:00:00 2001 From: Zarithya Date: Sun, 3 Aug 2025 04:29:49 -0700 Subject: [PATCH 25/27] Disambiguate front panel power button from auth'd Wiimote power button --- gc/ogc/system.h | 16 +++++++++------- libogc/system.c | 31 +++++++++++++++++++++---------- wiiuse/io_wii.c | 5 +++++ wiiuse/wpad.c | 40 ++++++++++------------------------------ 4 files changed, 45 insertions(+), 47 deletions(-) diff --git a/gc/ogc/system.h b/gc/ogc/system.h index 5493ed8a6..73cdb85c0 100644 --- a/gc/ogc/system.h +++ b/gc/ogc/system.h @@ -286,7 +286,7 @@ void SYS_ResetPMC(void); \brief Create/initialize sysalarm structure \param[in] thealarm pointer to the handle to store the created alarm context identifier -\return 0 on succuess, non-zero on error +\return 0 on success, non-zero on error */ s32 SYS_CreateAlarm(syswd_t *thealarm); @@ -297,7 +297,7 @@ s32 SYS_CreateAlarm(syswd_t *thealarm); \param[in] tp pointer to timespec structure holding the time to fire the alarm \param[in] cb pointer to callback which is called when the alarm fires. -\return 0 on succuess, non-zero on error +\return 0 on success, non-zero on error */ s32 SYS_SetAlarm(syswd_t thealarm,const struct timespec *tp,alarmcallback cb,void *cbarg); @@ -305,11 +305,11 @@ s32 SYS_SetAlarm(syswd_t thealarm,const struct timespec *tp,alarmcallback cb,voi /*! \fn s32 SYS_SetPeriodicAlarm(syswd_t thealarm,const struct timespec *tp_start,const struct timespec *tp_period,alarmcallback cb) \brief Set the alarm parameters for a periodioc alarm, add to the list of alarms and start. The alarm and interval persists as long as SYS_CancelAlarm() isn't called. \param[in] thealarm identifier to the alarm context to be initialized for a periodic alarm -\param[in] tp_start pointer to timespec structure holding the time to fire first time the alarm +\param[in] tp_start pointer to timespec structure holding the time to fire the alarm for first time \param[in] tp_period pointer to timespec structure holding the interval for all following alarm triggers. \param[in] cb pointer to callback which is called when the alarm fires. -\return 0 on succuess, non-zero on error +\return 0 on success, non-zero on error */ s32 SYS_SetPeriodicAlarm(syswd_t thealarm,const struct timespec *tp_start,const struct timespec *tp_period,alarmcallback cb,void *cbarg); @@ -318,15 +318,15 @@ s32 SYS_SetPeriodicAlarm(syswd_t thealarm,const struct timespec *tp_start,const \brief Remove the given alarm context from the list of contexts and destroy it \param[in] thealarm identifier to the alarm context to be removed and destroyed -\return 0 on succuess, non-zero on error +\return 0 on success, non-zero on error */ s32 SYS_RemoveAlarm(syswd_t thealarm); /*! \fn s32 SYS_CancelAlarm(syswd_t thealarm) \brief Cancel the alarm, but do not remove from the list of contexts. -\param[in] thealarm identifier to the alram context to be canceled +\param[in] thealarm identifier to the alarm context to be cancelled -\return 0 on succuess, non-zero on error +\return 0 on success, non-zero on error */ s32 SYS_CancelAlarm(syswd_t thealarm); @@ -391,6 +391,8 @@ void* SYS_GetArena2Hi(void); void SYS_SetArena2Hi(void *newHi); u32 SYS_GetArena2Size(void); powercallback SYS_SetPowerCallback(powercallback cb); +void SYS_DisablePowerButton(u32 duration); +void SYS_DoPowerCB(void); #endif /* \fn u64 SYS_Time(void) diff --git a/libogc/system.c b/libogc/system.c index 504625e1b..04040f0ab 100644 --- a/libogc/system.c +++ b/libogc/system.c @@ -156,6 +156,8 @@ static void __POWDefaultHandler(void); static powercallback __POWCallback = NULL; static u32 __sys_resetdown = 0; +static u64 __sys_powerenabletime = 0; +static u64 __sys_powercbtime = 0; #endif static vu64* const _bootTime = (u64*)0x800030d8; @@ -455,11 +457,18 @@ static void __STMEventHandler(u32 event) } if(event==STM_EVENT_POWER) { - _CPU_ISR_Disable(level); - __POWCallback(); - _CPU_ISR_Restore(level); + if(gettime() >= __sys_powerenabletime) { + _CPU_ISR_Disable(level); + SYS_DoPowerCB(); + _CPU_ISR_Restore(level); + } } } + +void SYS_DisablePowerButton(u32 disableTime) +{ + __sys_powerenabletime = gettime() + millisecs_to_ticks(disableTime); +} #endif void * __attribute__ ((weak)) __myArena1Lo = 0; @@ -1019,16 +1028,18 @@ void _V_EXPORTNAME(void) { __sys_versionbuild = _V_STRING; __sys_versiondate = _V_DATE_; } #if defined(HW_RVL) -void __SYS_DoPowerCB(void) +void SYS_DoPowerCB(void) { u32 level; - powercallback powcb; - _CPU_ISR_Disable(level); - powcb = __POWCallback; - __POWCallback = __POWDefaultHandler; - powcb(); - _CPU_ISR_Restore(level); + // Power button events fire repeatedly for one second after button is pressed + // Throttle events so only one callback gets called per button press + if(gettime() >= __sys_powercbtime) { + _CPU_ISR_Disable(level); + __POWCallback(); + _CPU_ISR_Restore(level); + } + __sys_powercbtime = gettime() + millisecs_to_ticks(10); } #endif diff --git a/wiiuse/io_wii.c b/wiiuse/io_wii.c index d297e3ce2..5f9858500 100644 --- a/wiiuse/io_wii.c +++ b/wiiuse/io_wii.c @@ -39,6 +39,11 @@ static s32 __wiiuse_disconnected(void *arg,struct bte_pcb *pcb,u8 err) if(!wm) return ERR_OK; + // Disable system power button events for 1100ms after Wiimote disconnection + // BT module hardware will trigger power button press in GPIO just like front panel + // if auth'd Wiimote power button pressed, so this is the only way to disambiguate + SYS_DisablePowerButton(1100); + WIIMOTE_DISABLE_STATE(wm, (WIIMOTE_STATE_BATTERY_CRITICAL)); WIIMOTE_DISABLE_STATE(wm, (WIIMOTE_STATE_IR|WIIMOTE_STATE_IR_INIT)); WIIMOTE_DISABLE_STATE(wm, (WIIMOTE_STATE_SPEAKER|WIIMOTE_STATE_SPEAKER_INIT)); diff --git a/wiiuse/wpad.c b/wiiuse/wpad.c index 7fc8c7103..c9e03f1ef 100644 --- a/wiiuse/wpad.c +++ b/wiiuse/wpad.c @@ -109,6 +109,9 @@ static s32 __wpad_onreset(s32 final); static s32 __wpad_disconnect(struct _wpad_cb *wpdcb); static void __wpad_eventCB(struct wiimote_t *wm,s32 event); +static s32 GetGuestSlot(struct bd_addr *pad_addr); +static s32 GetRegisteredSlot(struct bd_addr *pad_addr); + static void __wpad_def_powcb(s32 chan); static void __wpad_def_hostsynccb(u32 held); static WPADShutdownCallback __wpad_batcb = NULL; @@ -118,7 +121,6 @@ static WPADHostSyncBtnCallback __wpad_hostsynccb = __wpad_def_hostsynccb; static WPADStatusCallback __wpad_statuscb = NULL; extern void __wiiuse_sensorbar_enable(int enable); -extern void __SYS_DoPowerCB(void); static sys_resetinfo __wpad_resetinfo = { {}, @@ -137,7 +139,7 @@ static s32 __wpad_onreset(s32 final) static void __wpad_def_powcb(s32 chan) { - __SYS_DoPowerCB(); + SYS_DoPowerCB(); } static void __wpad_timeouthandler(syswd_t alarm,void *cbarg) @@ -280,7 +282,6 @@ static void __wpad_confsave_thread_stop(void) wiimote *__wpad_register_new(wiimote_listen *wml, u8 err) { u32 i,j,level; - struct bd_addr bdaddr; wiimote *wm; int guestEntry = CONF_PAD_MAX_ACTIVE; @@ -290,25 +291,8 @@ wiimote *__wpad_register_new(wiimote_listen *wml, u8 err) wm = __wpad_assign_slot(wml, err); if (wm) { - // Search for bdaddr in guest registration list - for(i=0; i<__wpad_guests.num_guests; i++) { - BD_ADDR_FROM_BYTES(&(bdaddr),__wpad_guests.guests[i].bdaddr); - if(bd_addr_cmp(&wml->bdaddr,&bdaddr)) { - WIIUSE_DEBUG("Wiimote guest in slot %d", i); - guestEntry = i; - break; - } - } - - // Search for bdaddr in permanent registration list - for(i=0; i<__wpad_devs.num_registered; i++) { - BD_ADDR_FROM_BYTES(&(bdaddr),__wpad_devs.registered[i].bdaddr); - if(bd_addr_cmp(&wml->bdaddr,&bdaddr)) { - WIIUSE_DEBUG("Wiimote currently registered in slot %d", i); - registeredEntry = i; - break; - } - } + guestEntry = GetGuestSlot(&wml->bdaddr); + registeredEntry = GetRegisteredSlot(&wml->bdaddr); if(BTE_GetPairMode() == PAIR_MODE_NORMAL) { // Permanent pair, need to save bdaddr as known controller @@ -963,14 +947,10 @@ static s8 __wpad_connreqCB(void *arg,struct bd_addr *pad_addr,u8 *cod,u8 link_ty // Only accept connection requests (i.e. "press any button") if not doing guest pairing if(BTE_GetPairMode() == PAIR_MODE_NORMAL) { if(!bd_addr_cmp(pad_addr,BD_ADDR_ANY)) { - for(i=0; i= WPAD_MAX_DEVICES) { From 9590478747b705f7aec288fc11b17678c711a45c Mon Sep 17 00:00:00 2001 From: Zarithya Date: Sun, 3 Aug 2025 14:32:42 -0700 Subject: [PATCH 26/27] Improve power button disable/throttle code --- gc/ogc/system.h | 1 - libogc/system.c | 23 ++++++++++------------- wiiuse/io_wii.c | 8 ++++++-- 3 files changed, 16 insertions(+), 16 deletions(-) diff --git a/gc/ogc/system.h b/gc/ogc/system.h index 73cdb85c0..329d3190e 100644 --- a/gc/ogc/system.h +++ b/gc/ogc/system.h @@ -391,7 +391,6 @@ void* SYS_GetArena2Hi(void); void SYS_SetArena2Hi(void *newHi); u32 SYS_GetArena2Size(void); powercallback SYS_SetPowerCallback(powercallback cb); -void SYS_DisablePowerButton(u32 duration); void SYS_DoPowerCB(void); #endif diff --git a/libogc/system.c b/libogc/system.c index 04040f0ab..41bff36c7 100644 --- a/libogc/system.c +++ b/libogc/system.c @@ -157,7 +157,6 @@ static powercallback __POWCallback = NULL; static u32 __sys_resetdown = 0; static u64 __sys_powerenabletime = 0; -static u64 __sys_powercbtime = 0; #endif static vu64* const _bootTime = (u64*)0x800030d8; @@ -457,18 +456,11 @@ static void __STMEventHandler(u32 event) } if(event==STM_EVENT_POWER) { - if(gettime() >= __sys_powerenabletime) { - _CPU_ISR_Disable(level); - SYS_DoPowerCB(); - _CPU_ISR_Restore(level); - } + _CPU_ISR_Disable(level); + SYS_DoPowerCB(); + _CPU_ISR_Restore(level); } } - -void SYS_DisablePowerButton(u32 disableTime) -{ - __sys_powerenabletime = gettime() + millisecs_to_ticks(disableTime); -} #endif void * __attribute__ ((weak)) __myArena1Lo = 0; @@ -1034,12 +1026,17 @@ void SYS_DoPowerCB(void) // Power button events fire repeatedly for one second after button is pressed // Throttle events so only one callback gets called per button press - if(gettime() >= __sys_powercbtime) { + if(gettime() >= __sys_powerenabletime) { _CPU_ISR_Disable(level); __POWCallback(); _CPU_ISR_Restore(level); } - __sys_powercbtime = gettime() + millisecs_to_ticks(10); + __sys_powerenabletime = gettime() + millisecs_to_ticks(50); +} + +void __SYS_DisablePowerButton(u32 disableTime) +{ + __sys_powerenabletime = gettime() + millisecs_to_ticks(disableTime); } #endif diff --git a/wiiuse/io_wii.c b/wiiuse/io_wii.c index 5f9858500..5cea497a8 100644 --- a/wiiuse/io_wii.c +++ b/wiiuse/io_wii.c @@ -22,6 +22,8 @@ extern void parse_event(struct wiimote_t *wm); extern void idle_cycle(struct wiimote_t* wm); extern void hexdump(void *d, int len); +extern void __SYS_DisablePowerButton(u32 duration); + static __inline__ u32 ACR_ReadReg(u32 reg) { return _ipcReg[reg>>2]; @@ -39,10 +41,12 @@ static s32 __wiiuse_disconnected(void *arg,struct bte_pcb *pcb,u8 err) if(!wm) return ERR_OK; - // Disable system power button events for 1100ms after Wiimote disconnection + // Disable system power button events for a bit after Wiimote disconnection // BT module hardware will trigger power button press in GPIO just like front panel // if auth'd Wiimote power button pressed, so this is the only way to disambiguate - SYS_DisablePowerButton(1100); + // It sends power button events for ~1s, but if we disable for 200ms, we can get + // power button event throttling to take care of the rest + __SYS_DisablePowerButton(200); WIIMOTE_DISABLE_STATE(wm, (WIIMOTE_STATE_BATTERY_CRITICAL)); WIIMOTE_DISABLE_STATE(wm, (WIIMOTE_STATE_IR|WIIMOTE_STATE_IR_INIT)); From 5221304a074b0df5119a698e195b7e75cea87b77 Mon Sep 17 00:00:00 2001 From: DacoTaco Date: Fri, 8 Aug 2025 20:42:18 +0200 Subject: [PATCH 27/27] rename inquiry_res --- gc/bte/bte.h | 2 +- lwbt/bte.c | 4 ++-- wiiuse/wpad.c | 2 +- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/gc/bte/bte.h b/gc/bte/bte.h index 31adbaeb5..012315e21 100644 --- a/gc/bte/bte.h +++ b/gc/bte/bte.h @@ -97,7 +97,7 @@ struct inquiry_info_ex u16 co; }; -struct inquiry_res +struct bte_inquiry_res { u8 count; struct inquiry_info_ex *info; diff --git a/lwbt/bte.c b/lwbt/bte.c index 833ec195f..7c50f436a 100644 --- a/lwbt/bte.c +++ b/lwbt/bte.c @@ -44,7 +44,7 @@ struct bt_state u8_t pair_mode; - struct inquiry_res inq_res; + struct bte_inquiry_res inq_res; btecallback cb; btecallback inq_complete_cb; @@ -1183,7 +1183,7 @@ err_t bte_inquiry_complete(void *arg,struct hci_pcb *pcb,struct hci_inq_res *ire u8_t i; struct hci_inq_res *p; struct bt_state *state = (struct bt_state*)arg; - struct inquiry_res *inq_res = &btstate.inq_res; + struct bte_inquiry_res *inq_res = &btstate.inq_res; if(result==HCI_SUCCESS) { if(ires!=NULL) { diff --git a/wiiuse/wpad.c b/wiiuse/wpad.c index c9e03f1ef..d09d4a67f 100644 --- a/wiiuse/wpad.c +++ b/wiiuse/wpad.c @@ -1082,7 +1082,7 @@ s32 __wpad_inquiry_finished(s32 result,void *userdata) { int i; struct pad_name_info *padinfo; - struct inquiry_res *inq_res = (struct inquiry_res *)userdata; + struct bte_inquiry_res *inq_res = (struct bte_inquiry_res *)userdata; if(result == ERR_OK && inq_res != NULL) { // Filter out weird null values