mayuresh bharmoria / Mbed OS mbed-os-example-wifi
Committer:
mayur098
Date:
Thu Jun 21 17:50:21 2018 +0000
Revision:
0:8f8e8f3cbd1c
first commit;

Who changed what in which revision?

UserRevisionLine numberNew contents of line
mayur098 0:8f8e8f3cbd1c 1 /* SPWFSA01 Device
mayur098 0:8f8e8f3cbd1c 2 * Copyright (c) 2015 ARM Limited
mayur098 0:8f8e8f3cbd1c 3 *
mayur098 0:8f8e8f3cbd1c 4 * Licensed under the Apache License, Version 2.0 (the "License");
mayur098 0:8f8e8f3cbd1c 5 * you may not use this file except in compliance with the License.
mayur098 0:8f8e8f3cbd1c 6 * You may obtain a copy of the License at
mayur098 0:8f8e8f3cbd1c 7 *
mayur098 0:8f8e8f3cbd1c 8 * http://www.apache.org/licenses/LICENSE-2.0
mayur098 0:8f8e8f3cbd1c 9 *
mayur098 0:8f8e8f3cbd1c 10 * Unless required by applicable law or agreed to in writing, software
mayur098 0:8f8e8f3cbd1c 11 * distributed under the License is distributed on an "AS IS" BASIS,
mayur098 0:8f8e8f3cbd1c 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
mayur098 0:8f8e8f3cbd1c 13 * See the License for the specific language governing permissions and
mayur098 0:8f8e8f3cbd1c 14 * limitations under the License.
mayur098 0:8f8e8f3cbd1c 15 */
mayur098 0:8f8e8f3cbd1c 16
mayur098 0:8f8e8f3cbd1c 17 #include "SPWFSA01.h"
mayur098 0:8f8e8f3cbd1c 18 #include "SpwfSAInterface.h"
mayur098 0:8f8e8f3cbd1c 19 #include "mbed_debug.h"
mayur098 0:8f8e8f3cbd1c 20
mayur098 0:8f8e8f3cbd1c 21 #if MBED_CONF_IDW0XX1_EXPANSION_BOARD == IDW01M1
mayur098 0:8f8e8f3cbd1c 22
mayur098 0:8f8e8f3cbd1c 23 SPWFSA01::SPWFSA01(PinName tx, PinName rx,
mayur098 0:8f8e8f3cbd1c 24 PinName rts, PinName cts,
mayur098 0:8f8e8f3cbd1c 25 SpwfSAInterface &ifce, bool debug,
mayur098 0:8f8e8f3cbd1c 26 PinName wakeup, PinName reset)
mayur098 0:8f8e8f3cbd1c 27 : SPWFSAxx(tx, rx, rts, cts, ifce, debug, wakeup, reset) {
mayur098 0:8f8e8f3cbd1c 28 }
mayur098 0:8f8e8f3cbd1c 29
mayur098 0:8f8e8f3cbd1c 30 bool SPWFSA01::open(const char *type, int* spwf_id, const char* addr, int port)
mayur098 0:8f8e8f3cbd1c 31 {
mayur098 0:8f8e8f3cbd1c 32 int socket_id;
mayur098 0:8f8e8f3cbd1c 33 int value;
mayur098 0:8f8e8f3cbd1c 34 int trials;
mayur098 0:8f8e8f3cbd1c 35
mayur098 0:8f8e8f3cbd1c 36 if(!_parser.send("AT+S.SOCKON=%s,%d,%s,ind", addr, port, type))
mayur098 0:8f8e8f3cbd1c 37 {
mayur098 0:8f8e8f3cbd1c 38 debug_if(_dbg_on, "\r\nSPWF> `SPWFSA01::open`: error opening socket (%d)\r\n", __LINE__);
mayur098 0:8f8e8f3cbd1c 39 return false;
mayur098 0:8f8e8f3cbd1c 40 }
mayur098 0:8f8e8f3cbd1c 41
mayur098 0:8f8e8f3cbd1c 42 /* handle both response possibilities here before returning
mayur098 0:8f8e8f3cbd1c 43 * otherwise module seems to remain in inconsistent state.
mayur098 0:8f8e8f3cbd1c 44 */
mayur098 0:8f8e8f3cbd1c 45
mayur098 0:8f8e8f3cbd1c 46 /* wait for first character */
mayur098 0:8f8e8f3cbd1c 47 trials = 0;
mayur098 0:8f8e8f3cbd1c 48 while((value = _parser.getc()) < 0) {
mayur098 0:8f8e8f3cbd1c 49 if(trials++ > SPWFXX_MAX_TRIALS) {
mayur098 0:8f8e8f3cbd1c 50 debug("\r\nSPWF> error opening socket (%d)\r\n", __LINE__);
mayur098 0:8f8e8f3cbd1c 51 empty_rx_buffer();
mayur098 0:8f8e8f3cbd1c 52 return false;
mayur098 0:8f8e8f3cbd1c 53 }
mayur098 0:8f8e8f3cbd1c 54 }
mayur098 0:8f8e8f3cbd1c 55
mayur098 0:8f8e8f3cbd1c 56 if(value != _cr_) { // Note: this is different to what the spec exactly says
mayur098 0:8f8e8f3cbd1c 57 debug_if(_dbg_on, "\r\nSPWF> error opening socket (%d)\r\n", __LINE__);
mayur098 0:8f8e8f3cbd1c 58 empty_rx_buffer();
mayur098 0:8f8e8f3cbd1c 59 return false;
mayur098 0:8f8e8f3cbd1c 60 }
mayur098 0:8f8e8f3cbd1c 61
mayur098 0:8f8e8f3cbd1c 62 if(!_recv_delim_lf()) { // Note: this is different to what the spec exactly says
mayur098 0:8f8e8f3cbd1c 63 debug_if(_dbg_on, "\r\nSPWF> error opening socket (%d)\r\n", __LINE__);
mayur098 0:8f8e8f3cbd1c 64 empty_rx_buffer();
mayur098 0:8f8e8f3cbd1c 65 return false;
mayur098 0:8f8e8f3cbd1c 66 }
mayur098 0:8f8e8f3cbd1c 67
mayur098 0:8f8e8f3cbd1c 68 value = _parser.getc();
mayur098 0:8f8e8f3cbd1c 69 switch(value) {
mayur098 0:8f8e8f3cbd1c 70 case ' ':
mayur098 0:8f8e8f3cbd1c 71 if(_parser.recv("ID: %d\n", &socket_id)
mayur098 0:8f8e8f3cbd1c 72 && _recv_ok()) {
mayur098 0:8f8e8f3cbd1c 73 debug_if(_dbg_on, "AT^ ID: %d\r\n", socket_id);
mayur098 0:8f8e8f3cbd1c 74
mayur098 0:8f8e8f3cbd1c 75 *spwf_id = socket_id;
mayur098 0:8f8e8f3cbd1c 76 return true;
mayur098 0:8f8e8f3cbd1c 77 } else {
mayur098 0:8f8e8f3cbd1c 78 empty_rx_buffer();
mayur098 0:8f8e8f3cbd1c 79 }
mayur098 0:8f8e8f3cbd1c 80 break;
mayur098 0:8f8e8f3cbd1c 81 case 'E':
mayur098 0:8f8e8f3cbd1c 82 if(_parser.recv("RROR: %[^\n]\n", _msg_buffer) && _recv_delim_lf()) {
mayur098 0:8f8e8f3cbd1c 83 debug_if(_dbg_on, "AT^ ERROR: %s (%d)\r\n", _msg_buffer, __LINE__);
mayur098 0:8f8e8f3cbd1c 84 } else {
mayur098 0:8f8e8f3cbd1c 85 debug_if(_dbg_on, "\r\nSPWF> error opening socket (%d)\r\n", __LINE__);
mayur098 0:8f8e8f3cbd1c 86 empty_rx_buffer();
mayur098 0:8f8e8f3cbd1c 87 }
mayur098 0:8f8e8f3cbd1c 88 break;
mayur098 0:8f8e8f3cbd1c 89 default:
mayur098 0:8f8e8f3cbd1c 90 debug_if(_dbg_on, "\r\nSPWF> error opening socket (value=%d, %d)\r\n", value, __LINE__);
mayur098 0:8f8e8f3cbd1c 91 break;
mayur098 0:8f8e8f3cbd1c 92 }
mayur098 0:8f8e8f3cbd1c 93
mayur098 0:8f8e8f3cbd1c 94 return false;
mayur098 0:8f8e8f3cbd1c 95 }
mayur098 0:8f8e8f3cbd1c 96
mayur098 0:8f8e8f3cbd1c 97 int SPWFSA01::_read_in(char* buffer, int spwf_id, uint32_t amount) {
mayur098 0:8f8e8f3cbd1c 98 int ret = -1;
mayur098 0:8f8e8f3cbd1c 99
mayur098 0:8f8e8f3cbd1c 100 MBED_ASSERT(buffer != NULL);
mayur098 0:8f8e8f3cbd1c 101
mayur098 0:8f8e8f3cbd1c 102 /* block asynchronous indications */
mayur098 0:8f8e8f3cbd1c 103 if(!_winds_off()) {
mayur098 0:8f8e8f3cbd1c 104 return -1;
mayur098 0:8f8e8f3cbd1c 105 }
mayur098 0:8f8e8f3cbd1c 106
mayur098 0:8f8e8f3cbd1c 107 /* read in data */
mayur098 0:8f8e8f3cbd1c 108 if(_parser.send("AT+S.SOCKR=%d,%u", spwf_id, (unsigned int)amount)) {
mayur098 0:8f8e8f3cbd1c 109 /* set high timeout */
mayur098 0:8f8e8f3cbd1c 110 _parser.set_timeout(SPWF_READ_BIN_TIMEOUT);
mayur098 0:8f8e8f3cbd1c 111 /* read in binary data */
mayur098 0:8f8e8f3cbd1c 112 int read = _parser.read(buffer, amount);
mayur098 0:8f8e8f3cbd1c 113 /* reset timeout value */
mayur098 0:8f8e8f3cbd1c 114 _parser.set_timeout(_timeout);
mayur098 0:8f8e8f3cbd1c 115 if(read > 0) {
mayur098 0:8f8e8f3cbd1c 116 if(_recv_ok()) {
mayur098 0:8f8e8f3cbd1c 117 ret = amount;
mayur098 0:8f8e8f3cbd1c 118
mayur098 0:8f8e8f3cbd1c 119 /* remove from pending sizes
mayur098 0:8f8e8f3cbd1c 120 * (MUST be done before next async indications handling (e.g. `_winds_on()`)) */
mayur098 0:8f8e8f3cbd1c 121 _remove_pending_pkt_size(spwf_id, amount);
mayur098 0:8f8e8f3cbd1c 122 } else {
mayur098 0:8f8e8f3cbd1c 123 debug_if(_dbg_on, "%s(%d): failed to receive OK\r\n", __func__, __LINE__);
mayur098 0:8f8e8f3cbd1c 124 empty_rx_buffer();
mayur098 0:8f8e8f3cbd1c 125 }
mayur098 0:8f8e8f3cbd1c 126 } else {
mayur098 0:8f8e8f3cbd1c 127 debug_if(_dbg_on, "%s(%d): failed to read binary data\r\n", __func__, __LINE__);
mayur098 0:8f8e8f3cbd1c 128 empty_rx_buffer();
mayur098 0:8f8e8f3cbd1c 129 }
mayur098 0:8f8e8f3cbd1c 130 } else {
mayur098 0:8f8e8f3cbd1c 131 debug_if(_dbg_on, "%s(%d): failed to send SOCKR\r\n", __func__, __LINE__);
mayur098 0:8f8e8f3cbd1c 132 }
mayur098 0:8f8e8f3cbd1c 133
mayur098 0:8f8e8f3cbd1c 134 debug_if(_dbg_on, "%s():\t%d:%d\r\n", __func__, spwf_id, amount);
mayur098 0:8f8e8f3cbd1c 135
mayur098 0:8f8e8f3cbd1c 136 /* unblock asynchronous indications */
mayur098 0:8f8e8f3cbd1c 137 _winds_on();
mayur098 0:8f8e8f3cbd1c 138
mayur098 0:8f8e8f3cbd1c 139 return ret;
mayur098 0:8f8e8f3cbd1c 140 }
mayur098 0:8f8e8f3cbd1c 141
mayur098 0:8f8e8f3cbd1c 142 /* betzw - TODO: improve performance! */
mayur098 0:8f8e8f3cbd1c 143 bool SPWFSA01::_recv_ap(nsapi_wifi_ap_t *ap)
mayur098 0:8f8e8f3cbd1c 144 {
mayur098 0:8f8e8f3cbd1c 145 bool ret;
mayur098 0:8f8e8f3cbd1c 146 unsigned int channel;
mayur098 0:8f8e8f3cbd1c 147 int trials;
mayur098 0:8f8e8f3cbd1c 148
mayur098 0:8f8e8f3cbd1c 149 ap->security = NSAPI_SECURITY_UNKNOWN;
mayur098 0:8f8e8f3cbd1c 150
mayur098 0:8f8e8f3cbd1c 151 /* check for end of list */
mayur098 0:8f8e8f3cbd1c 152 if(_recv_delim_cr_lf()) {
mayur098 0:8f8e8f3cbd1c 153 return false;
mayur098 0:8f8e8f3cbd1c 154 }
mayur098 0:8f8e8f3cbd1c 155
mayur098 0:8f8e8f3cbd1c 156 /* run to 'horizontal tab' */
mayur098 0:8f8e8f3cbd1c 157 trials = 0;
mayur098 0:8f8e8f3cbd1c 158 while(_parser.getc() != '\x09') {
mayur098 0:8f8e8f3cbd1c 159 if(trials++ > SPWFXX_MAX_TRIALS) {
mayur098 0:8f8e8f3cbd1c 160 debug("%s (%d) - WARNING: might happen in case of RX buffer overflow!\r\n", __func__, __LINE__);
mayur098 0:8f8e8f3cbd1c 161 return false;
mayur098 0:8f8e8f3cbd1c 162 }
mayur098 0:8f8e8f3cbd1c 163 }
mayur098 0:8f8e8f3cbd1c 164
mayur098 0:8f8e8f3cbd1c 165 /* read in next line */
mayur098 0:8f8e8f3cbd1c 166 ret = _parser.recv(" %*s %hhx:%hhx:%hhx:%hhx:%hhx:%hhx CHAN: %u RSSI: %hhd SSID: \'%255[^\']\'",
mayur098 0:8f8e8f3cbd1c 167 &ap->bssid[0], &ap->bssid[1], &ap->bssid[2], &ap->bssid[3], &ap->bssid[4], &ap->bssid[5],
mayur098 0:8f8e8f3cbd1c 168 &channel, &ap->rssi, ssid_buf);
mayur098 0:8f8e8f3cbd1c 169
mayur098 0:8f8e8f3cbd1c 170 if(ret) { // ret == true
mayur098 0:8f8e8f3cbd1c 171 char value;
mayur098 0:8f8e8f3cbd1c 172 char *rest;
mayur098 0:8f8e8f3cbd1c 173 int val_getc;
mayur098 0:8f8e8f3cbd1c 174 unsigned int i;
mayur098 0:8f8e8f3cbd1c 175 size_t first_half;
mayur098 0:8f8e8f3cbd1c 176
mayur098 0:8f8e8f3cbd1c 177 /* read in rest of line */
mayur098 0:8f8e8f3cbd1c 178 first_half = strlen(ssid_buf);
mayur098 0:8f8e8f3cbd1c 179 for(i = first_half; i < sizeof(ssid_buf); i++) {
mayur098 0:8f8e8f3cbd1c 180 val_getc = _parser.getc();
mayur098 0:8f8e8f3cbd1c 181 ssid_buf[i] = (char)val_getc;
mayur098 0:8f8e8f3cbd1c 182 if(val_getc < 0) {
mayur098 0:8f8e8f3cbd1c 183 debug("%s (%d) - WARNING: might happen in case of RX buffer overflow!\r\n", __func__, __LINE__);
mayur098 0:8f8e8f3cbd1c 184 return false;
mayur098 0:8f8e8f3cbd1c 185 } else if(val_getc == _cr_) { // '\r'
mayur098 0:8f8e8f3cbd1c 186 val_getc = _parser.getc();
mayur098 0:8f8e8f3cbd1c 187 if('\n' != (char)val_getc) {
mayur098 0:8f8e8f3cbd1c 188 debug("%s (%d) - WARNING: might happen in case of RX buffer overflow!\r\n", __func__, __LINE__);
mayur098 0:8f8e8f3cbd1c 189 return false;
mayur098 0:8f8e8f3cbd1c 190 }
mayur098 0:8f8e8f3cbd1c 191 break;
mayur098 0:8f8e8f3cbd1c 192 } else if(val_getc == _lf_) { // '\n'; betzw: WORK-AROUND module FW issues
mayur098 0:8f8e8f3cbd1c 193 break;
mayur098 0:8f8e8f3cbd1c 194 }
mayur098 0:8f8e8f3cbd1c 195 }
mayur098 0:8f8e8f3cbd1c 196 ssid_buf[i] = '\0';
mayur098 0:8f8e8f3cbd1c 197
mayur098 0:8f8e8f3cbd1c 198 /* decide about position of `CAPS:` */
mayur098 0:8f8e8f3cbd1c 199 rest = strstr(&ssid_buf[first_half], "CAPS:");
mayur098 0:8f8e8f3cbd1c 200 if(rest == NULL) {
mayur098 0:8f8e8f3cbd1c 201 debug("%s (%d) - WARNING: might happen in case of RX buffer overflow!\r\n", __func__, __LINE__);
mayur098 0:8f8e8f3cbd1c 202 return false;
mayur098 0:8f8e8f3cbd1c 203 }
mayur098 0:8f8e8f3cbd1c 204
mayur098 0:8f8e8f3cbd1c 205 /* substitute <space> with '\0' */
mayur098 0:8f8e8f3cbd1c 206 MBED_ASSERT(&rest[-1] >= &ssid_buf[0]);
mayur098 0:8f8e8f3cbd1c 207 rest[-1] = '\0';
mayur098 0:8f8e8f3cbd1c 208
mayur098 0:8f8e8f3cbd1c 209 /* eventually substitute '\'' with '\0' */
mayur098 0:8f8e8f3cbd1c 210 if((&rest[-2] >= &ssid_buf[0]) && (rest[-2] == '\'')) {
mayur098 0:8f8e8f3cbd1c 211 rest[-2] = '\0';
mayur098 0:8f8e8f3cbd1c 212 }
mayur098 0:8f8e8f3cbd1c 213
mayur098 0:8f8e8f3cbd1c 214 /* copy values */
mayur098 0:8f8e8f3cbd1c 215 memcpy(&ap->ssid, ssid_buf, 32);
mayur098 0:8f8e8f3cbd1c 216 ap->ssid[32] = '\0';
mayur098 0:8f8e8f3cbd1c 217 ap->channel = channel;
mayur098 0:8f8e8f3cbd1c 218
mayur098 0:8f8e8f3cbd1c 219 /* skip `CAPS: 0421 ` */
mayur098 0:8f8e8f3cbd1c 220 if(strlen(rest) < 11) {
mayur098 0:8f8e8f3cbd1c 221 debug("%s (%d) - WARNING: might happen in case of RX buffer overflow!\r\n", __func__, __LINE__);
mayur098 0:8f8e8f3cbd1c 222 return false;
mayur098 0:8f8e8f3cbd1c 223 }
mayur098 0:8f8e8f3cbd1c 224 rest += 11;
mayur098 0:8f8e8f3cbd1c 225
mayur098 0:8f8e8f3cbd1c 226 /* get next character */
mayur098 0:8f8e8f3cbd1c 227 value = *rest++;
mayur098 0:8f8e8f3cbd1c 228 if(value != 'W') { // no security
mayur098 0:8f8e8f3cbd1c 229 ap->security = NSAPI_SECURITY_NONE;
mayur098 0:8f8e8f3cbd1c 230 return true;
mayur098 0:8f8e8f3cbd1c 231 }
mayur098 0:8f8e8f3cbd1c 232
mayur098 0:8f8e8f3cbd1c 233 /* determine security */
mayur098 0:8f8e8f3cbd1c 234 {
mayur098 0:8f8e8f3cbd1c 235 char buffer[10];
mayur098 0:8f8e8f3cbd1c 236
mayur098 0:8f8e8f3cbd1c 237 if(!(sscanf(rest, "%s%*[\x20]", (char*)&buffer) > 0)) { // '\0x20' == <space>
mayur098 0:8f8e8f3cbd1c 238 return true;
mayur098 0:8f8e8f3cbd1c 239 } else if(strncmp("EP", buffer, 10) == 0) {
mayur098 0:8f8e8f3cbd1c 240 ap->security = NSAPI_SECURITY_WEP;
mayur098 0:8f8e8f3cbd1c 241 return true;
mayur098 0:8f8e8f3cbd1c 242 } else if(strncmp("PA2", buffer, 10) == 0) {
mayur098 0:8f8e8f3cbd1c 243 ap->security = NSAPI_SECURITY_WPA2;
mayur098 0:8f8e8f3cbd1c 244 return true;
mayur098 0:8f8e8f3cbd1c 245 } else if(strncmp("PA", buffer, 10) != 0) {
mayur098 0:8f8e8f3cbd1c 246 return true;
mayur098 0:8f8e8f3cbd1c 247 }
mayur098 0:8f8e8f3cbd1c 248
mayur098 0:8f8e8f3cbd1c 249 /* got a "WPA", check for "WPA2" */
mayur098 0:8f8e8f3cbd1c 250 rest += strlen(buffer);
mayur098 0:8f8e8f3cbd1c 251 value = *rest++;
mayur098 0:8f8e8f3cbd1c 252 if(value == '\0') { // no further protocol
mayur098 0:8f8e8f3cbd1c 253 ap->security = NSAPI_SECURITY_WPA;
mayur098 0:8f8e8f3cbd1c 254 return true;
mayur098 0:8f8e8f3cbd1c 255 } else { // assume "WPA2"
mayur098 0:8f8e8f3cbd1c 256 ap->security = NSAPI_SECURITY_WPA_WPA2;
mayur098 0:8f8e8f3cbd1c 257 return true;
mayur098 0:8f8e8f3cbd1c 258 }
mayur098 0:8f8e8f3cbd1c 259 }
mayur098 0:8f8e8f3cbd1c 260 } else { // ret == false
mayur098 0:8f8e8f3cbd1c 261 debug("%s (%d) - WARNING: might happen in case of RX buffer overflow!\r\n", __func__, __LINE__);
mayur098 0:8f8e8f3cbd1c 262 }
mayur098 0:8f8e8f3cbd1c 263
mayur098 0:8f8e8f3cbd1c 264 return ret;
mayur098 0:8f8e8f3cbd1c 265 }
mayur098 0:8f8e8f3cbd1c 266
mayur098 0:8f8e8f3cbd1c 267 int SPWFSA01::scan(WiFiAccessPoint *res, unsigned limit)
mayur098 0:8f8e8f3cbd1c 268 {
mayur098 0:8f8e8f3cbd1c 269 unsigned cnt = 0;
mayur098 0:8f8e8f3cbd1c 270 nsapi_wifi_ap_t ap;
mayur098 0:8f8e8f3cbd1c 271
mayur098 0:8f8e8f3cbd1c 272 if (!_parser.send("AT+S.SCAN=a,s")) {
mayur098 0:8f8e8f3cbd1c 273 return NSAPI_ERROR_DEVICE_ERROR;
mayur098 0:8f8e8f3cbd1c 274 }
mayur098 0:8f8e8f3cbd1c 275
mayur098 0:8f8e8f3cbd1c 276 while (_recv_ap(&ap)) {
mayur098 0:8f8e8f3cbd1c 277 if (cnt < limit) {
mayur098 0:8f8e8f3cbd1c 278 res[cnt] = WiFiAccessPoint(ap);
mayur098 0:8f8e8f3cbd1c 279 }
mayur098 0:8f8e8f3cbd1c 280
mayur098 0:8f8e8f3cbd1c 281 cnt++;
mayur098 0:8f8e8f3cbd1c 282 if (limit != 0 && cnt >= limit) {
mayur098 0:8f8e8f3cbd1c 283 break;
mayur098 0:8f8e8f3cbd1c 284 }
mayur098 0:8f8e8f3cbd1c 285 }
mayur098 0:8f8e8f3cbd1c 286
mayur098 0:8f8e8f3cbd1c 287 if(!_recv_ok()) {
mayur098 0:8f8e8f3cbd1c 288 empty_rx_buffer();
mayur098 0:8f8e8f3cbd1c 289 }
mayur098 0:8f8e8f3cbd1c 290
mayur098 0:8f8e8f3cbd1c 291 return cnt;
mayur098 0:8f8e8f3cbd1c 292 }
mayur098 0:8f8e8f3cbd1c 293
mayur098 0:8f8e8f3cbd1c 294 #endif // MBED_CONF_IDW0XX1_EXPANSION_BOARD