void ds3wiibt_listen(struct ds3wiibt_context *ctx) { u32 level = IRQ_Disable(); if (ctx->status == DS3WIIBT_STATUS_DISCONNECTED) { ctx->status = DS3WIIBT_STATUS_LISTENING; ctx->ctrl_pcb = l2cap_new(); ctx->data_pcb = l2cap_new(); l2cap_arg(ctx->ctrl_pcb, ctx); l2cap_arg(ctx->data_pcb, ctx); l2cap_connect_ind(ctx->ctrl_pcb, &ctx->bdaddr, HIDP_PSM, l2ca_connect_ind_cb); l2cap_connect_ind(ctx->data_pcb, &ctx->bdaddr, INTR_PSM, l2ca_connect_ind_cb); } IRQ_Restore(level); }
err_t bt_spp_init(void) { struct l2cap_pcb *l2cappcb; struct rfcomm_pcb *rfcommpcb; struct sdp_record *record; if((l2cappcb = l2cap_new()) == NULL) { LWIP_DEBUGF(BT_SPP_DEBUG, ("bt_spp_init: Could not alloc L2CAP PCB for SDP_PSM\n")); return ERR_MEM; } l2cap_connect_ind(l2cappcb, SDP_PSM, bt_connect_ind); if((l2cappcb = l2cap_new()) == NULL) { LWIP_DEBUGF(BT_SPP_DEBUG, ("bt_spp_init: Could not alloc L2CAP PCB for RFCOMM_PSM\n")); return ERR_MEM; } l2cap_connect_ind(l2cappcb, RFCOMM_PSM, bt_connect_ind); LWIP_DEBUGF(RFCOMM_DEBUG, ("bt_spp_init: Allocate RFCOMM PCB for CN 0\n")); if((rfcommpcb = rfcomm_new(NULL)) == NULL) { LWIP_DEBUGF(BT_SPP_DEBUG, ("bt_spp_init: Could not alloc RFCOMM PCB for channel 0\n")); return ERR_MEM; } rfcomm_listen(rfcommpcb, 0, rfcomm_accept); LWIP_DEBUGF(RFCOMM_DEBUG, ("bt_spp_init: Allocate RFCOMM PCB for CN 1\n")); if((rfcommpcb = rfcomm_new(NULL)) == NULL) { LWIP_DEBUGF(BT_SPP_DEBUG, ("lap_init: Could not alloc RFCOMM PCB for channel 1\n")); return ERR_MEM; } rfcomm_listen(rfcommpcb, 1, rfcomm_accept); if((record = sdp_record_new((u8_t *)spp_service_record, sizeof(spp_service_record))) == NULL) { LWIP_DEBUGF(BT_SPP_DEBUG, ("bt_spp_init: Could not alloc SDP record\n")); return ERR_MEM; } else { sdp_register_service(record); } LWIP_DEBUGF(BT_SPP_DEBUG, ("SPP initialized\n")); return ERR_OK; }