Junichi Katsu / Mbed 2 deprecated BLEControl

Dependencies:   FatFileSystem TB6612FNG2 mbed

Committer:
mbed_Cookbook_SE
Date:
Mon Nov 30 09:32:15 2015 +0000
Revision:
0:de03cbbcd0ff
??

Who changed what in which revision?

UserRevisionLine numberNew contents of line
mbed_Cookbook_SE 0:de03cbbcd0ff 1 /*
mbed_Cookbook_SE 0:de03cbbcd0ff 2 * Copyright (C) 2009-2012 by Matthias Ringwald
mbed_Cookbook_SE 0:de03cbbcd0ff 3 *
mbed_Cookbook_SE 0:de03cbbcd0ff 4 * Redistribution and use in source and binary forms, with or without
mbed_Cookbook_SE 0:de03cbbcd0ff 5 * modification, are permitted provided that the following conditions
mbed_Cookbook_SE 0:de03cbbcd0ff 6 * are met:
mbed_Cookbook_SE 0:de03cbbcd0ff 7 *
mbed_Cookbook_SE 0:de03cbbcd0ff 8 * 1. Redistributions of source code must retain the above copyright
mbed_Cookbook_SE 0:de03cbbcd0ff 9 * notice, this list of conditions and the following disclaimer.
mbed_Cookbook_SE 0:de03cbbcd0ff 10 * 2. Redistributions in binary form must reproduce the above copyright
mbed_Cookbook_SE 0:de03cbbcd0ff 11 * notice, this list of conditions and the following disclaimer in the
mbed_Cookbook_SE 0:de03cbbcd0ff 12 * documentation and/or other materials provided with the distribution.
mbed_Cookbook_SE 0:de03cbbcd0ff 13 * 3. Neither the name of the copyright holders nor the names of
mbed_Cookbook_SE 0:de03cbbcd0ff 14 * contributors may be used to endorse or promote products derived
mbed_Cookbook_SE 0:de03cbbcd0ff 15 * from this software without specific prior written permission.
mbed_Cookbook_SE 0:de03cbbcd0ff 16 * 4. Any redistribution, use, or modification is done solely for
mbed_Cookbook_SE 0:de03cbbcd0ff 17 * personal benefit and not for any commercial purpose or for
mbed_Cookbook_SE 0:de03cbbcd0ff 18 * monetary gain.
mbed_Cookbook_SE 0:de03cbbcd0ff 19 *
mbed_Cookbook_SE 0:de03cbbcd0ff 20 * THIS SOFTWARE IS PROVIDED BY MATTHIAS RINGWALD AND CONTRIBUTORS
mbed_Cookbook_SE 0:de03cbbcd0ff 21 * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
mbed_Cookbook_SE 0:de03cbbcd0ff 22 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
mbed_Cookbook_SE 0:de03cbbcd0ff 23 * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL MATTHIAS
mbed_Cookbook_SE 0:de03cbbcd0ff 24 * RINGWALD OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
mbed_Cookbook_SE 0:de03cbbcd0ff 25 * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
mbed_Cookbook_SE 0:de03cbbcd0ff 26 * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
mbed_Cookbook_SE 0:de03cbbcd0ff 27 * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
mbed_Cookbook_SE 0:de03cbbcd0ff 28 * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
mbed_Cookbook_SE 0:de03cbbcd0ff 29 * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF
mbed_Cookbook_SE 0:de03cbbcd0ff 30 * THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
mbed_Cookbook_SE 0:de03cbbcd0ff 31 * SUCH DAMAGE.
mbed_Cookbook_SE 0:de03cbbcd0ff 32 *
mbed_Cookbook_SE 0:de03cbbcd0ff 33 * Please inquire about commercial licensing options at btstack@ringwald.ch
mbed_Cookbook_SE 0:de03cbbcd0ff 34 *
mbed_Cookbook_SE 0:de03cbbcd0ff 35 */
mbed_Cookbook_SE 0:de03cbbcd0ff 36
mbed_Cookbook_SE 0:de03cbbcd0ff 37 /*
mbed_Cookbook_SE 0:de03cbbcd0ff 38 * l2cap.h
mbed_Cookbook_SE 0:de03cbbcd0ff 39 *
mbed_Cookbook_SE 0:de03cbbcd0ff 40 * Logical Link Control and Adaption Protocl (L2CAP)
mbed_Cookbook_SE 0:de03cbbcd0ff 41 *
mbed_Cookbook_SE 0:de03cbbcd0ff 42 * Created by Matthias Ringwald on 5/16/09.
mbed_Cookbook_SE 0:de03cbbcd0ff 43 */
mbed_Cookbook_SE 0:de03cbbcd0ff 44
mbed_Cookbook_SE 0:de03cbbcd0ff 45 #pragma once
mbed_Cookbook_SE 0:de03cbbcd0ff 46
mbed_Cookbook_SE 0:de03cbbcd0ff 47 #include "hci.h"
mbed_Cookbook_SE 0:de03cbbcd0ff 48 #include "l2cap_signaling.h"
mbed_Cookbook_SE 0:de03cbbcd0ff 49 #include <btstack/utils.h>
mbed_Cookbook_SE 0:de03cbbcd0ff 50 #include <btstack/btstack.h>
mbed_Cookbook_SE 0:de03cbbcd0ff 51
mbed_Cookbook_SE 0:de03cbbcd0ff 52 #if defined __cplusplus
mbed_Cookbook_SE 0:de03cbbcd0ff 53 extern "C" {
mbed_Cookbook_SE 0:de03cbbcd0ff 54 #endif
mbed_Cookbook_SE 0:de03cbbcd0ff 55
mbed_Cookbook_SE 0:de03cbbcd0ff 56 #define L2CAP_SIG_ID_INVALID 0
mbed_Cookbook_SE 0:de03cbbcd0ff 57
mbed_Cookbook_SE 0:de03cbbcd0ff 58 #define L2CAP_HEADER_SIZE 4
mbed_Cookbook_SE 0:de03cbbcd0ff 59
mbed_Cookbook_SE 0:de03cbbcd0ff 60 // size of HCI ACL + L2CAP Header for regular data packets (8)
mbed_Cookbook_SE 0:de03cbbcd0ff 61 #define COMPLETE_L2CAP_HEADER (HCI_ACL_HEADER_SIZE + L2CAP_HEADER_SIZE)
mbed_Cookbook_SE 0:de03cbbcd0ff 62
mbed_Cookbook_SE 0:de03cbbcd0ff 63 // minimum signaling MTU
mbed_Cookbook_SE 0:de03cbbcd0ff 64 #define L2CAP_MINIMAL_MTU 48
mbed_Cookbook_SE 0:de03cbbcd0ff 65 #define L2CAP_DEFAULT_MTU 672
mbed_Cookbook_SE 0:de03cbbcd0ff 66
mbed_Cookbook_SE 0:de03cbbcd0ff 67 // check L2CAP MTU
mbed_Cookbook_SE 0:de03cbbcd0ff 68 #if (L2CAP_MINIMAL_MTU + L2CAP_HEADER_SIZE) > HCI_ACL_PAYLOAD_SIZE
mbed_Cookbook_SE 0:de03cbbcd0ff 69 #error "HCI_ACL_PAYLOAD_SIZE too small for minimal L2CAP MTU of 48 bytes"
mbed_Cookbook_SE 0:de03cbbcd0ff 70 #endif
mbed_Cookbook_SE 0:de03cbbcd0ff 71
mbed_Cookbook_SE 0:de03cbbcd0ff 72 // L2CAP Fixed Channel IDs
mbed_Cookbook_SE 0:de03cbbcd0ff 73 #define L2CAP_CID_SIGNALING 0x0001
mbed_Cookbook_SE 0:de03cbbcd0ff 74 #define L2CAP_CID_CONNECTIONLESS_CHANNEL 0x0002
mbed_Cookbook_SE 0:de03cbbcd0ff 75 #define L2CAP_CID_ATTRIBUTE_PROTOCOL 0x0004
mbed_Cookbook_SE 0:de03cbbcd0ff 76 #define L2CAP_CID_SIGNALING_LE 0x0005
mbed_Cookbook_SE 0:de03cbbcd0ff 77 #define L2CAP_CID_SECURITY_MANAGER_PROTOCOL 0x0006
mbed_Cookbook_SE 0:de03cbbcd0ff 78
mbed_Cookbook_SE 0:de03cbbcd0ff 79 void l2cap_init(void);
mbed_Cookbook_SE 0:de03cbbcd0ff 80 void l2cap_register_packet_handler(void (*handler)(void * connection, uint8_t packet_type, uint16_t channel, uint8_t *packet, uint16_t size));
mbed_Cookbook_SE 0:de03cbbcd0ff 81 void l2cap_create_channel_internal(void * connection, btstack_packet_handler_t packet_handler, bd_addr_t address, uint16_t psm, uint16_t mtu);
mbed_Cookbook_SE 0:de03cbbcd0ff 82 void l2cap_disconnect_internal(uint16_t local_cid, uint8_t reason);
mbed_Cookbook_SE 0:de03cbbcd0ff 83 uint16_t l2cap_get_remote_mtu_for_local_cid(uint16_t local_cid);
mbed_Cookbook_SE 0:de03cbbcd0ff 84 uint16_t l2cap_max_mtu(void);
mbed_Cookbook_SE 0:de03cbbcd0ff 85
mbed_Cookbook_SE 0:de03cbbcd0ff 86 void l2cap_block_new_credits(uint8_t blocked);
mbed_Cookbook_SE 0:de03cbbcd0ff 87 int l2cap_can_send_packet_now(uint16_t local_cid); // non-blocking UART write
mbed_Cookbook_SE 0:de03cbbcd0ff 88
mbed_Cookbook_SE 0:de03cbbcd0ff 89 // get outgoing buffer and prepare data
mbed_Cookbook_SE 0:de03cbbcd0ff 90 uint8_t *l2cap_get_outgoing_buffer(void);
mbed_Cookbook_SE 0:de03cbbcd0ff 91
mbed_Cookbook_SE 0:de03cbbcd0ff 92 int l2cap_send_prepared(uint16_t local_cid, uint16_t len);
mbed_Cookbook_SE 0:de03cbbcd0ff 93 int l2cap_send_internal(uint16_t local_cid, uint8_t *data, uint16_t len);
mbed_Cookbook_SE 0:de03cbbcd0ff 94
mbed_Cookbook_SE 0:de03cbbcd0ff 95 int l2cap_send_prepared_connectionless(uint16_t handle, uint16_t cid, uint16_t len);
mbed_Cookbook_SE 0:de03cbbcd0ff 96 int l2cap_send_connectionless(uint16_t handle, uint16_t cid, uint8_t *data, uint16_t len);
mbed_Cookbook_SE 0:de03cbbcd0ff 97
mbed_Cookbook_SE 0:de03cbbcd0ff 98 void l2cap_close_connection(void *connection);
mbed_Cookbook_SE 0:de03cbbcd0ff 99
mbed_Cookbook_SE 0:de03cbbcd0ff 100 void l2cap_register_service_internal(void *connection, btstack_packet_handler_t packet_handler, uint16_t psm, uint16_t mtu);
mbed_Cookbook_SE 0:de03cbbcd0ff 101 void l2cap_unregister_service_internal(void *connection, uint16_t psm);
mbed_Cookbook_SE 0:de03cbbcd0ff 102
mbed_Cookbook_SE 0:de03cbbcd0ff 103 void l2cap_accept_connection_internal(uint16_t local_cid);
mbed_Cookbook_SE 0:de03cbbcd0ff 104 void l2cap_decline_connection_internal(uint16_t local_cid, uint8_t reason);
mbed_Cookbook_SE 0:de03cbbcd0ff 105
mbed_Cookbook_SE 0:de03cbbcd0ff 106 // Bluetooth 4.0 - allows to register handler for Attribute Protocol and Security Manager Protocol
mbed_Cookbook_SE 0:de03cbbcd0ff 107 void l2cap_register_fixed_channel(btstack_packet_handler_t packet_handler, uint16_t channel_id);
mbed_Cookbook_SE 0:de03cbbcd0ff 108
mbed_Cookbook_SE 0:de03cbbcd0ff 109
mbed_Cookbook_SE 0:de03cbbcd0ff 110 // private structs
mbed_Cookbook_SE 0:de03cbbcd0ff 111 typedef enum {
mbed_Cookbook_SE 0:de03cbbcd0ff 112 L2CAP_STATE_CLOSED = 1, // no baseband
mbed_Cookbook_SE 0:de03cbbcd0ff 113 L2CAP_STATE_WILL_SEND_CREATE_CONNECTION,
mbed_Cookbook_SE 0:de03cbbcd0ff 114 L2CAP_STATE_WAIT_CONNECTION_COMPLETE,
mbed_Cookbook_SE 0:de03cbbcd0ff 115 L2CAP_STATE_WAIT_CLIENT_ACCEPT_OR_REJECT,
mbed_Cookbook_SE 0:de03cbbcd0ff 116 L2CAP_STATE_WAIT_CONNECT_RSP, // from peer
mbed_Cookbook_SE 0:de03cbbcd0ff 117 L2CAP_STATE_CONFIG,
mbed_Cookbook_SE 0:de03cbbcd0ff 118 L2CAP_STATE_OPEN,
mbed_Cookbook_SE 0:de03cbbcd0ff 119 L2CAP_STATE_WAIT_DISCONNECT, // from application
mbed_Cookbook_SE 0:de03cbbcd0ff 120 L2CAP_STATE_WILL_SEND_CONNECTION_REQUEST,
mbed_Cookbook_SE 0:de03cbbcd0ff 121 L2CAP_STATE_WILL_SEND_CONNECTION_RESPONSE_DECLINE,
mbed_Cookbook_SE 0:de03cbbcd0ff 122 L2CAP_STATE_WILL_SEND_CONNECTION_RESPONSE_ACCEPT,
mbed_Cookbook_SE 0:de03cbbcd0ff 123 L2CAP_STATE_WILL_SEND_DISCONNECT_REQUEST,
mbed_Cookbook_SE 0:de03cbbcd0ff 124 L2CAP_STATE_WILL_SEND_DISCONNECT_RESPONSE,
mbed_Cookbook_SE 0:de03cbbcd0ff 125 } L2CAP_STATE;
mbed_Cookbook_SE 0:de03cbbcd0ff 126
mbed_Cookbook_SE 0:de03cbbcd0ff 127 typedef enum {
mbed_Cookbook_SE 0:de03cbbcd0ff 128 L2CAP_CHANNEL_STATE_VAR_NONE = 0,
mbed_Cookbook_SE 0:de03cbbcd0ff 129 L2CAP_CHANNEL_STATE_VAR_RCVD_CONF_REQ = 1 << 0,
mbed_Cookbook_SE 0:de03cbbcd0ff 130 L2CAP_CHANNEL_STATE_VAR_RCVD_CONF_RSP = 1 << 1,
mbed_Cookbook_SE 0:de03cbbcd0ff 131 L2CAP_CHANNEL_STATE_VAR_SEND_CONF_REQ = 1 << 2,
mbed_Cookbook_SE 0:de03cbbcd0ff 132 L2CAP_CHANNEL_STATE_VAR_SEND_CONF_RSP = 1 << 3,
mbed_Cookbook_SE 0:de03cbbcd0ff 133 L2CAP_CHANNEL_STATE_VAR_SENT_CONF_REQ = 1 << 4,
mbed_Cookbook_SE 0:de03cbbcd0ff 134 L2CAP_CHANNEL_STATE_VAR_SENT_CONF_RSP = 1 << 5,
mbed_Cookbook_SE 0:de03cbbcd0ff 135 } L2CAP_CHANNEL_STATE_VAR;
mbed_Cookbook_SE 0:de03cbbcd0ff 136
mbed_Cookbook_SE 0:de03cbbcd0ff 137 // info regarding an actual coneection
mbed_Cookbook_SE 0:de03cbbcd0ff 138 typedef struct {
mbed_Cookbook_SE 0:de03cbbcd0ff 139 // linked list - assert: first field
mbed_Cookbook_SE 0:de03cbbcd0ff 140 linked_item_t item;
mbed_Cookbook_SE 0:de03cbbcd0ff 141
mbed_Cookbook_SE 0:de03cbbcd0ff 142 L2CAP_STATE state;
mbed_Cookbook_SE 0:de03cbbcd0ff 143 L2CAP_CHANNEL_STATE_VAR state_var;
mbed_Cookbook_SE 0:de03cbbcd0ff 144
mbed_Cookbook_SE 0:de03cbbcd0ff 145 bd_addr_t address;
mbed_Cookbook_SE 0:de03cbbcd0ff 146 hci_con_handle_t handle;
mbed_Cookbook_SE 0:de03cbbcd0ff 147
mbed_Cookbook_SE 0:de03cbbcd0ff 148 uint8_t remote_sig_id; // used by other side, needed for delayed response
mbed_Cookbook_SE 0:de03cbbcd0ff 149 uint8_t local_sig_id; // own signaling identifier
mbed_Cookbook_SE 0:de03cbbcd0ff 150
mbed_Cookbook_SE 0:de03cbbcd0ff 151 uint16_t local_cid;
mbed_Cookbook_SE 0:de03cbbcd0ff 152 uint16_t remote_cid;
mbed_Cookbook_SE 0:de03cbbcd0ff 153
mbed_Cookbook_SE 0:de03cbbcd0ff 154 uint16_t local_mtu;
mbed_Cookbook_SE 0:de03cbbcd0ff 155 uint16_t remote_mtu;
mbed_Cookbook_SE 0:de03cbbcd0ff 156
mbed_Cookbook_SE 0:de03cbbcd0ff 157 uint16_t psm;
mbed_Cookbook_SE 0:de03cbbcd0ff 158
mbed_Cookbook_SE 0:de03cbbcd0ff 159 uint8_t packets_granted; // number of L2CAP/ACL packets client is allowed to send
mbed_Cookbook_SE 0:de03cbbcd0ff 160
mbed_Cookbook_SE 0:de03cbbcd0ff 161 uint8_t reason; // used in decline internal
mbed_Cookbook_SE 0:de03cbbcd0ff 162
mbed_Cookbook_SE 0:de03cbbcd0ff 163 // client connection
mbed_Cookbook_SE 0:de03cbbcd0ff 164 void * connection;
mbed_Cookbook_SE 0:de03cbbcd0ff 165
mbed_Cookbook_SE 0:de03cbbcd0ff 166 // internal connection
mbed_Cookbook_SE 0:de03cbbcd0ff 167 btstack_packet_handler_t packet_handler;
mbed_Cookbook_SE 0:de03cbbcd0ff 168
mbed_Cookbook_SE 0:de03cbbcd0ff 169 } l2cap_channel_t;
mbed_Cookbook_SE 0:de03cbbcd0ff 170
mbed_Cookbook_SE 0:de03cbbcd0ff 171 // info regarding potential connections
mbed_Cookbook_SE 0:de03cbbcd0ff 172 typedef struct {
mbed_Cookbook_SE 0:de03cbbcd0ff 173 // linked list - assert: first field
mbed_Cookbook_SE 0:de03cbbcd0ff 174 linked_item_t item;
mbed_Cookbook_SE 0:de03cbbcd0ff 175
mbed_Cookbook_SE 0:de03cbbcd0ff 176 // service id
mbed_Cookbook_SE 0:de03cbbcd0ff 177 uint16_t psm;
mbed_Cookbook_SE 0:de03cbbcd0ff 178
mbed_Cookbook_SE 0:de03cbbcd0ff 179 // incoming MTU
mbed_Cookbook_SE 0:de03cbbcd0ff 180 uint16_t mtu;
mbed_Cookbook_SE 0:de03cbbcd0ff 181
mbed_Cookbook_SE 0:de03cbbcd0ff 182 // client connection
mbed_Cookbook_SE 0:de03cbbcd0ff 183 void *connection;
mbed_Cookbook_SE 0:de03cbbcd0ff 184
mbed_Cookbook_SE 0:de03cbbcd0ff 185 // internal connection
mbed_Cookbook_SE 0:de03cbbcd0ff 186 btstack_packet_handler_t packet_handler;
mbed_Cookbook_SE 0:de03cbbcd0ff 187
mbed_Cookbook_SE 0:de03cbbcd0ff 188 } l2cap_service_t;
mbed_Cookbook_SE 0:de03cbbcd0ff 189
mbed_Cookbook_SE 0:de03cbbcd0ff 190
mbed_Cookbook_SE 0:de03cbbcd0ff 191 typedef struct l2cap_signaling_response {
mbed_Cookbook_SE 0:de03cbbcd0ff 192 hci_con_handle_t handle;
mbed_Cookbook_SE 0:de03cbbcd0ff 193 uint8_t sig_id;
mbed_Cookbook_SE 0:de03cbbcd0ff 194 uint8_t code;
mbed_Cookbook_SE 0:de03cbbcd0ff 195 uint16_t data; // infoType for INFORMATION REQUEST, result for CONNECTION request
mbed_Cookbook_SE 0:de03cbbcd0ff 196 } l2cap_signaling_response_t;
mbed_Cookbook_SE 0:de03cbbcd0ff 197
mbed_Cookbook_SE 0:de03cbbcd0ff 198
mbed_Cookbook_SE 0:de03cbbcd0ff 199 #if defined __cplusplus
mbed_Cookbook_SE 0:de03cbbcd0ff 200 }
mbed_Cookbook_SE 0:de03cbbcd0ff 201 #endif