cc3000 hostdriver with the mbed socket interface

Dependents:   cc3000_hello_world_demo cc3000_simple_socket_demo cc3000_ntp_demo cc3000_ping_demo ... more

Committer:
SolderSplashLabs
Date:
Thu Oct 03 21:00:00 2013 +0000
Revision:
23:fed7f64dd520
Parent:
4:15b58c119a0a
Child:
37:3332f57b7f1e
Added separate debug messages and VT100 formatting

Who changed what in which revision?

UserRevisionLine numberNew contents of line
SolderSplashLabs 23:fed7f64dd520 1 /*****************************************************************************
SolderSplashLabs 23:fed7f64dd520 2 *
SolderSplashLabs 23:fed7f64dd520 3 * C++ interface/implementation created by Martin Kojtal (0xc0170). Thanks to
SolderSplashLabs 23:fed7f64dd520 4 * Jim Carver and Frank Vannieuwkerke for their inital cc3000 mbed port and
SolderSplashLabs 23:fed7f64dd520 5 * provided help.
SolderSplashLabs 23:fed7f64dd520 6 *
SolderSplashLabs 23:fed7f64dd520 7 * This version of "host driver" uses CC3000 Host Driver Implementation. Thus
SolderSplashLabs 23:fed7f64dd520 8 * read the following copyright:
SolderSplashLabs 23:fed7f64dd520 9 *
SolderSplashLabs 23:fed7f64dd520 10 * Copyright (C) 2011 Texas Instruments Incorporated - http://www.ti.com/
SolderSplashLabs 23:fed7f64dd520 11 *
SolderSplashLabs 23:fed7f64dd520 12 * Redistribution and use in source and binary forms, with or without
SolderSplashLabs 23:fed7f64dd520 13 * modification, are permitted provided that the following conditions
SolderSplashLabs 23:fed7f64dd520 14 * are met:
SolderSplashLabs 23:fed7f64dd520 15 *
SolderSplashLabs 23:fed7f64dd520 16 * Redistributions of source code must retain the above copyright
SolderSplashLabs 23:fed7f64dd520 17 * notice, this list of conditions and the following disclaimer.
SolderSplashLabs 23:fed7f64dd520 18 *
SolderSplashLabs 23:fed7f64dd520 19 * Redistributions in binary form must reproduce the above copyright
SolderSplashLabs 23:fed7f64dd520 20 * notice, this list of conditions and the following disclaimer in the
SolderSplashLabs 23:fed7f64dd520 21 * documentation and/or other materials provided with the
SolderSplashLabs 23:fed7f64dd520 22 * distribution.
SolderSplashLabs 23:fed7f64dd520 23 *
SolderSplashLabs 23:fed7f64dd520 24 * Neither the name of Texas Instruments Incorporated nor the names of
SolderSplashLabs 23:fed7f64dd520 25 * its contributors may be used to endorse or promote products derived
SolderSplashLabs 23:fed7f64dd520 26 * from this software without specific prior written permission.
SolderSplashLabs 23:fed7f64dd520 27 *
SolderSplashLabs 23:fed7f64dd520 28 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
SolderSplashLabs 23:fed7f64dd520 29 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
SolderSplashLabs 23:fed7f64dd520 30 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
SolderSplashLabs 23:fed7f64dd520 31 * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
SolderSplashLabs 23:fed7f64dd520 32 * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
SolderSplashLabs 23:fed7f64dd520 33 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
SolderSplashLabs 23:fed7f64dd520 34 * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
SolderSplashLabs 23:fed7f64dd520 35 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
SolderSplashLabs 23:fed7f64dd520 36 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
SolderSplashLabs 23:fed7f64dd520 37 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
SolderSplashLabs 23:fed7f64dd520 38 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
SolderSplashLabs 23:fed7f64dd520 39 *
SolderSplashLabs 23:fed7f64dd520 40 *****************************************************************************/
SolderSplashLabs 23:fed7f64dd520 41 #ifndef CC3000_SOCKET_H
SolderSplashLabs 23:fed7f64dd520 42 #define CC3000_SOCKET_H
SolderSplashLabs 23:fed7f64dd520 43
SolderSplashLabs 23:fed7f64dd520 44 #define SOCKET_MAX_FREE_BUFFERS 6
SolderSplashLabs 23:fed7f64dd520 45
SolderSplashLabs 23:fed7f64dd520 46 #define SOCKET_STATUS_ACTIVE 0
SolderSplashLabs 23:fed7f64dd520 47 #define SOCKET_STATUS_INACTIVE 1
SolderSplashLabs 23:fed7f64dd520 48
SolderSplashLabs 23:fed7f64dd520 49 #define SOCKET_STATUS_INIT_VAL 0xFFFF
SolderSplashLabs 23:fed7f64dd520 50 #define M_IS_VALID_SD(sd) ((0 <= (sd)) && ((sd) <= 7))
SolderSplashLabs 23:fed7f64dd520 51 #define M_IS_VALID_STATUS(status) (((status) == SOCKET_STATUS_ACTIVE)||((status) == SOCKET_STATUS_INACTIVE))
SolderSplashLabs 23:fed7f64dd520 52
SolderSplashLabs 23:fed7f64dd520 53 #ifdef _API_USE_BSD_CLOSE
SolderSplashLabs 23:fed7f64dd520 54 #define close(sd) closesocket(sd)
SolderSplashLabs 23:fed7f64dd520 55 #endif
SolderSplashLabs 23:fed7f64dd520 56
SolderSplashLabs 23:fed7f64dd520 57 //Enable this flag if and only if you must comply with BSD socket read() and
SolderSplashLabs 23:fed7f64dd520 58 //write() functions
SolderSplashLabs 23:fed7f64dd520 59 #ifdef _API_USE_BSD_READ_WRITE
SolderSplashLabs 23:fed7f64dd520 60 #define read(sd, buf, len, flags) recv(sd, buf, len, flags)
SolderSplashLabs 23:fed7f64dd520 61 #define write(sd, buf, len, flags) send(sd, buf, len, flags)
SolderSplashLabs 23:fed7f64dd520 62 #endif
SolderSplashLabs 23:fed7f64dd520 63
SolderSplashLabs 23:fed7f64dd520 64 #define SOCKET_OPEN_PARAMS_LEN (12)
SolderSplashLabs 23:fed7f64dd520 65 #define SOCKET_CLOSE_PARAMS_LEN (4)
SolderSplashLabs 23:fed7f64dd520 66 #define SOCKET_ACCEPT_PARAMS_LEN (4)
SolderSplashLabs 23:fed7f64dd520 67 #define SOCKET_BIND_PARAMS_LEN (20)
SolderSplashLabs 23:fed7f64dd520 68 #define SOCKET_LISTEN_PARAMS_LEN (8)
SolderSplashLabs 23:fed7f64dd520 69 #define SOCKET_GET_HOST_BY_NAME_PARAMS_LEN (9)
SolderSplashLabs 23:fed7f64dd520 70 #define SOCKET_CONNECT_PARAMS_LEN (20)
SolderSplashLabs 23:fed7f64dd520 71 #define SOCKET_SELECT_PARAMS_LEN (44)
SolderSplashLabs 23:fed7f64dd520 72 #define SOCKET_SET_SOCK_OPT_PARAMS_LEN (20)
SolderSplashLabs 23:fed7f64dd520 73 #define SOCKET_GET_SOCK_OPT_PARAMS_LEN (12)
SolderSplashLabs 23:fed7f64dd520 74 #define SOCKET_RECV_FROM_PARAMS_LEN (12)
SolderSplashLabs 23:fed7f64dd520 75 #define SOCKET_SENDTO_PARAMS_LEN (24)
SolderSplashLabs 23:fed7f64dd520 76 #define SOCKET_MDNS_ADVERTISE_PARAMS_LEN (12)
SolderSplashLabs 23:fed7f64dd520 77
SolderSplashLabs 23:fed7f64dd520 78 //#define NULL 0
SolderSplashLabs 23:fed7f64dd520 79
SolderSplashLabs 23:fed7f64dd520 80 // The legnth of arguments for the SEND command: sd + buff_offset + len + flags,
SolderSplashLabs 23:fed7f64dd520 81 // while size of each parameter is 32 bit - so the total length is 16 bytes;
SolderSplashLabs 23:fed7f64dd520 82
SolderSplashLabs 23:fed7f64dd520 83 #define HCI_CMND_SEND_ARG_LENGTH (16)
SolderSplashLabs 23:fed7f64dd520 84 #define SELECT_TIMEOUT_MIN_MICRO_SECONDS 5000
SolderSplashLabs 23:fed7f64dd520 85 #define HEADERS_SIZE_DATA (SPI_HEADER_SIZE + 5)
SolderSplashLabs 23:fed7f64dd520 86 #define SIMPLE_LINK_HCI_CMND_TRANSPORT_HEADER_SIZE (SPI_HEADER_SIZE + SIMPLE_LINK_HCI_CMND_HEADER_SIZE)
SolderSplashLabs 23:fed7f64dd520 87 #define MDNS_DEVICE_SERVICE_MAX_LENGTH (32)
SolderSplashLabs 23:fed7f64dd520 88
SolderSplashLabs 23:fed7f64dd520 89
SolderSplashLabs 23:fed7f64dd520 90 #define HOSTNAME_MAX_LENGTH (230) // 230 bytes + header shouldn't exceed 8 bit value
SolderSplashLabs 23:fed7f64dd520 91
SolderSplashLabs 23:fed7f64dd520 92 //--------- Address Families --------
SolderSplashLabs 23:fed7f64dd520 93
SolderSplashLabs 23:fed7f64dd520 94 #define AF_INET 2
SolderSplashLabs 23:fed7f64dd520 95 #define AF_INET6 23
SolderSplashLabs 23:fed7f64dd520 96
SolderSplashLabs 23:fed7f64dd520 97 //------------ Socket Types ------------
SolderSplashLabs 23:fed7f64dd520 98
SolderSplashLabs 23:fed7f64dd520 99 #define SOCK_STREAM 1
SolderSplashLabs 23:fed7f64dd520 100 #define SOCK_DGRAM 2
SolderSplashLabs 23:fed7f64dd520 101 #define SOCK_RAW 3 // Raw sockets allow new IPv4 protocols to be implemented in user space. A raw socket receives or sends the raw datagram not including link level headers
SolderSplashLabs 23:fed7f64dd520 102 #define SOCK_RDM 4
SolderSplashLabs 23:fed7f64dd520 103 #define SOCK_SEQPACKET 5
SolderSplashLabs 23:fed7f64dd520 104
SolderSplashLabs 23:fed7f64dd520 105 //----------- Socket Protocol ----------
SolderSplashLabs 23:fed7f64dd520 106
SolderSplashLabs 23:fed7f64dd520 107 #define IPPROTO_IP 0 // dummy for IP
SolderSplashLabs 23:fed7f64dd520 108 #define IPPROTO_ICMP 1 // control message protocol
SolderSplashLabs 23:fed7f64dd520 109 #define IPPROTO_IPV4 IPPROTO_IP // IP inside IP
SolderSplashLabs 23:fed7f64dd520 110 #define IPPROTO_TCP 6 // tcp
SolderSplashLabs 23:fed7f64dd520 111 #define IPPROTO_UDP 17 // user datagram protocol
SolderSplashLabs 23:fed7f64dd520 112 #define IPPROTO_IPV6 41 // IPv6 in IPv6
SolderSplashLabs 23:fed7f64dd520 113 #define IPPROTO_NONE 59 // No next header
SolderSplashLabs 23:fed7f64dd520 114 #define IPPROTO_RAW 255 // raw IP packet
SolderSplashLabs 23:fed7f64dd520 115 #define IPPROTO_MAX 256
SolderSplashLabs 23:fed7f64dd520 116
SolderSplashLabs 23:fed7f64dd520 117 //----------- Socket retunr codes -----------
SolderSplashLabs 23:fed7f64dd520 118
SolderSplashLabs 23:fed7f64dd520 119 #define SOC_ERROR (-1) // error
SolderSplashLabs 23:fed7f64dd520 120 #define SOC_IN_PROGRESS (-2) // socket in progress
SolderSplashLabs 23:fed7f64dd520 121
SolderSplashLabs 23:fed7f64dd520 122 //----------- Socket Options -----------
SolderSplashLabs 23:fed7f64dd520 123 #define SOL_SOCKET 0xffff // socket level
SolderSplashLabs 23:fed7f64dd520 124 #define SOCKOPT_RECV_TIMEOUT 1 // optname to configure recv and recvfromtimeout
SolderSplashLabs 23:fed7f64dd520 125 #define SOCKOPT_NONBLOCK 2 // accept non block mode set SOCK_ON or SOCK_OFF (default block mode )
SolderSplashLabs 23:fed7f64dd520 126 #define SOCK_ON 0 // socket non-blocking mode is enabled
SolderSplashLabs 23:fed7f64dd520 127 #define SOCK_OFF 1 // socket blocking mode is enabled
SolderSplashLabs 23:fed7f64dd520 128
SolderSplashLabs 23:fed7f64dd520 129 #define TCP_NODELAY 0x0001
SolderSplashLabs 23:fed7f64dd520 130 #define TCP_BSDURGENT 0x7000
SolderSplashLabs 23:fed7f64dd520 131
SolderSplashLabs 23:fed7f64dd520 132 #define MAX_PACKET_SIZE 1500
SolderSplashLabs 23:fed7f64dd520 133 #define MAX_LISTEN_QUEUE 4
SolderSplashLabs 23:fed7f64dd520 134
SolderSplashLabs 23:fed7f64dd520 135 #define IOCTL_SOCKET_EVENTMASK
SolderSplashLabs 23:fed7f64dd520 136
SolderSplashLabs 23:fed7f64dd520 137 #define ENOBUFS 55 // No buffer space available
SolderSplashLabs 23:fed7f64dd520 138
SolderSplashLabs 23:fed7f64dd520 139 #define __FD_SETSIZE 32
SolderSplashLabs 23:fed7f64dd520 140
SolderSplashLabs 23:fed7f64dd520 141 #define ASIC_ADDR_LEN 8
SolderSplashLabs 23:fed7f64dd520 142
SolderSplashLabs 23:fed7f64dd520 143 #define NO_QUERY_RECIVED -3
SolderSplashLabs 23:fed7f64dd520 144
SolderSplashLabs 23:fed7f64dd520 145
SolderSplashLabs 23:fed7f64dd520 146 typedef struct _in_addr_t
SolderSplashLabs 23:fed7f64dd520 147 {
SolderSplashLabs 23:fed7f64dd520 148 uint32_t s_addr; // load with inet_aton()
SolderSplashLabs 23:fed7f64dd520 149 } in_addr;
SolderSplashLabs 23:fed7f64dd520 150
SolderSplashLabs 23:fed7f64dd520 151 /*typedef struct _sockaddr_t
SolderSplashLabs 23:fed7f64dd520 152 {
SolderSplashLabs 23:fed7f64dd520 153 unsigned short int sa_family;
SolderSplashLabs 23:fed7f64dd520 154 unsigned char sa_data[14];
SolderSplashLabs 23:fed7f64dd520 155 } sockaddr;*/
SolderSplashLabs 23:fed7f64dd520 156
SolderSplashLabs 23:fed7f64dd520 157 typedef struct _sockaddr_in_t
SolderSplashLabs 23:fed7f64dd520 158 {
SolderSplashLabs 23:fed7f64dd520 159 int16_t sin_family; // e.g. AF_INET
SolderSplashLabs 23:fed7f64dd520 160 uint16_t sin_port; // e.g. htons(3490)
SolderSplashLabs 23:fed7f64dd520 161 in_addr sin_addr; // see struct in_addr, below
SolderSplashLabs 23:fed7f64dd520 162 uint8_t sin_zero[8]; // zero this if you want to
SolderSplashLabs 23:fed7f64dd520 163 } sockaddr_in;
SolderSplashLabs 23:fed7f64dd520 164
SolderSplashLabs 23:fed7f64dd520 165 typedef uint32_t socklen_t;
SolderSplashLabs 23:fed7f64dd520 166
SolderSplashLabs 23:fed7f64dd520 167 // The fd_set member is required to be an array of longs.
SolderSplashLabs 23:fed7f64dd520 168 typedef int32_t __fd_mask;
SolderSplashLabs 23:fed7f64dd520 169
SolderSplashLabs 23:fed7f64dd520 170 // It's easier to assume 8-bit bytes than to get CHAR_BIT.
SolderSplashLabs 23:fed7f64dd520 171 #define __NFDBITS (8 * sizeof (__fd_mask))
SolderSplashLabs 23:fed7f64dd520 172 #define __FDELT(d) ((d) / __NFDBITS)
SolderSplashLabs 23:fed7f64dd520 173 #define __FDMASK(d) ((__fd_mask) 1 << ((d) % __NFDBITS))
SolderSplashLabs 23:fed7f64dd520 174
SolderSplashLabs 23:fed7f64dd520 175 // fd_set for select and pselect.
SolderSplashLabs 23:fed7f64dd520 176 typedef struct
SolderSplashLabs 23:fed7f64dd520 177 {
SolderSplashLabs 23:fed7f64dd520 178 __fd_mask fds_bits[__FD_SETSIZE / __NFDBITS];
SolderSplashLabs 23:fed7f64dd520 179 #define __FDS_BITS(set) ((set)->fds_bits)
SolderSplashLabs 23:fed7f64dd520 180 } fd_set;
SolderSplashLabs 23:fed7f64dd520 181
SolderSplashLabs 23:fed7f64dd520 182 // We don't use `memset' because this would require a prototype and
SolderSplashLabs 23:fed7f64dd520 183 // the array isn't too big.
SolderSplashLabs 23:fed7f64dd520 184 #define __FD_ZERO(set) \
SolderSplashLabs 23:fed7f64dd520 185 do { \
SolderSplashLabs 23:fed7f64dd520 186 uint32_t __i; \
SolderSplashLabs 23:fed7f64dd520 187 fd_set *__arr = (set); \
SolderSplashLabs 23:fed7f64dd520 188 for (__i = 0; __i < sizeof (fd_set) / sizeof (__fd_mask); ++__i) \
SolderSplashLabs 23:fed7f64dd520 189 __FDS_BITS (__arr)[__i] = 0; \
SolderSplashLabs 23:fed7f64dd520 190 } while (0)
SolderSplashLabs 23:fed7f64dd520 191 #define __FD_SET(d, set) (__FDS_BITS (set)[__FDELT (d)] |= __FDMASK (d))
SolderSplashLabs 23:fed7f64dd520 192 #define __FD_CLR(d, set) (__FDS_BITS (set)[__FDELT (d)] &= ~__FDMASK (d))
SolderSplashLabs 23:fed7f64dd520 193 #define __FD_ISSET(d, set) (__FDS_BITS (set)[__FDELT (d)] & __FDMASK (d))
SolderSplashLabs 23:fed7f64dd520 194
SolderSplashLabs 23:fed7f64dd520 195 // Access macros for 'fd_set'.
SolderSplashLabs 23:fed7f64dd520 196 #define FD_SET(fd, fdsetp) __FD_SET (fd, fdsetp)
SolderSplashLabs 23:fed7f64dd520 197 #define FD_CLR(fd, fdsetp) __FD_CLR (fd, fdsetp)
SolderSplashLabs 23:fed7f64dd520 198 #define FD_ISSET(fd, fdsetp) __FD_ISSET (fd, fdsetp)
SolderSplashLabs 23:fed7f64dd520 199 #define FD_ZERO(fdsetp) __FD_ZERO (fdsetp)
SolderSplashLabs 23:fed7f64dd520 200
SolderSplashLabs 23:fed7f64dd520 201 //Use in case of Big Endian only
SolderSplashLabs 23:fed7f64dd520 202
SolderSplashLabs 23:fed7f64dd520 203 #define htonl(A) ((((uint32_t)(A) & 0xff000000) >> 24) | \
SolderSplashLabs 23:fed7f64dd520 204 (((uint32_t)(A) & 0x00ff0000) >> 8) | \
SolderSplashLabs 23:fed7f64dd520 205 (((uint32_t)(A) & 0x0000ff00) << 8) | \
SolderSplashLabs 23:fed7f64dd520 206 (((uint32_t)(A) & 0x000000ff) << 24))
SolderSplashLabs 23:fed7f64dd520 207
SolderSplashLabs 23:fed7f64dd520 208 #define ntohl htonl
SolderSplashLabs 23:fed7f64dd520 209
SolderSplashLabs 23:fed7f64dd520 210 //Use in case of Big Endian only
SolderSplashLabs 23:fed7f64dd520 211 #define htons(A) ((((uint32_t)(A) & 0xff00) >> 8) | \
SolderSplashLabs 23:fed7f64dd520 212 (((uint32_t)(A) & 0x00ff) << 8))
SolderSplashLabs 23:fed7f64dd520 213
SolderSplashLabs 23:fed7f64dd520 214
SolderSplashLabs 23:fed7f64dd520 215 #define ntohs htons
SolderSplashLabs 23:fed7f64dd520 216
SolderSplashLabs 23:fed7f64dd520 217 // mDNS port - 5353 mDNS multicast address - 224.0.0.251
SolderSplashLabs 23:fed7f64dd520 218 #define SET_mDNS_ADD(sockaddr) sockaddr.sa_data[0] = 0x14; \
SolderSplashLabs 23:fed7f64dd520 219 sockaddr.sa_data[1] = 0xe9; \
SolderSplashLabs 23:fed7f64dd520 220 sockaddr.sa_data[2] = 0xe0; \
SolderSplashLabs 23:fed7f64dd520 221 sockaddr.sa_data[3] = 0x0; \
SolderSplashLabs 23:fed7f64dd520 222 sockaddr.sa_data[4] = 0x0; \
SolderSplashLabs 23:fed7f64dd520 223 sockaddr.sa_data[5] = 0xfb;
SolderSplashLabs 23:fed7f64dd520 224
SolderSplashLabs 23:fed7f64dd520 225 #endif