mbed library sources. Supersedes mbed-src.

Dependents:   Nucleo_Hello_Encoder BLE_iBeaconScan AM1805_DEMO DISCO-F429ZI_ExportTemplate1 ... more

Committer:
AnnaBridge
Date:
Wed Feb 20 22:31:08 2019 +0000
Revision:
189:f392fc9709a3
Parent:
188:bcfe06ba3d64
mbed library release version 165

Who changed what in which revision?

UserRevisionLine numberNew contents of line
AnnaBridge 167:e84263d55307 1 /* Ameba implementation of NetworkInterfaceAPI
AnnaBridge 167:e84263d55307 2 * Copyright (c) 2015 ARM Limited
AnnaBridge 167:e84263d55307 3 *
AnnaBridge 167:e84263d55307 4 * Licensed under the Apache License, Version 2.0 (the "License");
AnnaBridge 167:e84263d55307 5 * you may not use this file except in compliance with the License.
AnnaBridge 167:e84263d55307 6 * You may obtain a copy of the License at
AnnaBridge 167:e84263d55307 7 *
AnnaBridge 167:e84263d55307 8 * http://www.apache.org/licenses/LICENSE-2.0
AnnaBridge 167:e84263d55307 9 *
AnnaBridge 167:e84263d55307 10 * Unless required by applicable law or agreed to in writing, software
AnnaBridge 167:e84263d55307 11 * distributed under the License is distributed on an "AS IS" BASIS,
AnnaBridge 167:e84263d55307 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
AnnaBridge 167:e84263d55307 13 * See the License for the specific language governing permissions and
AnnaBridge 167:e84263d55307 14 * limitations under the License.
AnnaBridge 167:e84263d55307 15 */
AnnaBridge 167:e84263d55307 16
AnnaBridge 167:e84263d55307 17 #include "mbed.h"
AnnaBridge 167:e84263d55307 18 #include "rtos.h"
AnnaBridge 167:e84263d55307 19
AnnaBridge 167:e84263d55307 20 #include "RTWInterface.h"
AnnaBridge 167:e84263d55307 21 #include "mbed_interface.h"
Anna Bridge 186:707f6e361f3e 22
AnnaBridge 167:e84263d55307 23 #include "rtw_emac.h"
Anna Bridge 186:707f6e361f3e 24 #include "EMAC.h"
AnnaBridge 167:e84263d55307 25 #include "wifi_constants.h"
AnnaBridge 167:e84263d55307 26 #include "wifi_conf.h"
AnnaBridge 167:e84263d55307 27
Anna Bridge 186:707f6e361f3e 28 #include "OnboardNetworkStack.h"
Anna Bridge 186:707f6e361f3e 29 #include "EMACMemoryManager.h"
AnnaBridge 167:e84263d55307 30 #include "osdep_service.h"
AnnaBridge 167:e84263d55307 31
AnnaBridge 167:e84263d55307 32 typedef struct _wifi_scan_hdl {
AnnaBridge 174:b96e65c34a4d 33 _sema scan_sema;
AnnaBridge 167:e84263d55307 34 nsapi_size_t ap_num;
AnnaBridge 167:e84263d55307 35 nsapi_size_t scan_num;
AnnaBridge 167:e84263d55307 36 WiFiAccessPoint *ap_details;
AnnaBridge 167:e84263d55307 37 } wifi_scan_hdl;
AnnaBridge 167:e84263d55307 38
AnnaBridge 167:e84263d55307 39 #define MAX_SCAN_TIMEOUT (15000)
AnnaBridge 167:e84263d55307 40
AnnaBridge 167:e84263d55307 41 static rtw_result_t scan_result_handler( rtw_scan_handler_result_t* malloced_scan_result )
AnnaBridge 167:e84263d55307 42 {
AnnaBridge 167:e84263d55307 43 wifi_scan_hdl *scan_handler = (wifi_scan_hdl *)malloced_scan_result->user_data;
AnnaBridge 167:e84263d55307 44 if (malloced_scan_result->scan_complete != RTW_TRUE) {
Anna Bridge 186:707f6e361f3e 45 if (scan_handler->ap_details && scan_handler->scan_num > scan_handler->ap_num) {
Anna Bridge 180:96ed750bd169 46 nsapi_wifi_ap_t ap;
AnnaBridge 167:e84263d55307 47 rtw_scan_result_t* record = &malloced_scan_result->ap_details;
Anna Bridge 180:96ed750bd169 48 record->SSID.val[record->SSID.len] = 0; /* Ensure the SSID is null terminated */
AnnaBridge 167:e84263d55307 49 memset((void*)&ap, 0x00, sizeof(nsapi_wifi_ap_t));
AnnaBridge 167:e84263d55307 50 memcpy(ap.ssid, record->SSID.val, record->SSID.len);
AnnaBridge 167:e84263d55307 51 memcpy(ap.bssid, record->BSSID.octet, 6);
Anna Bridge 186:707f6e361f3e 52 switch (record->security) {
AnnaBridge 167:e84263d55307 53 case RTW_SECURITY_OPEN:
AnnaBridge 167:e84263d55307 54 ap.security = NSAPI_SECURITY_NONE;
AnnaBridge 167:e84263d55307 55 break;
AnnaBridge 167:e84263d55307 56 case RTW_SECURITY_WEP_PSK:
AnnaBridge 167:e84263d55307 57 case RTW_SECURITY_WEP_SHARED:
AnnaBridge 167:e84263d55307 58 ap.security = NSAPI_SECURITY_WEP;
AnnaBridge 167:e84263d55307 59 break;
AnnaBridge 167:e84263d55307 60 case RTW_SECURITY_WPA_TKIP_PSK:
AnnaBridge 167:e84263d55307 61 case RTW_SECURITY_WPA_AES_PSK:
AnnaBridge 167:e84263d55307 62 ap.security = NSAPI_SECURITY_WPA;
AnnaBridge 167:e84263d55307 63 break;
AnnaBridge 167:e84263d55307 64 case RTW_SECURITY_WPA2_AES_PSK:
AnnaBridge 167:e84263d55307 65 case RTW_SECURITY_WPA2_TKIP_PSK:
AnnaBridge 167:e84263d55307 66 case RTW_SECURITY_WPA2_MIXED_PSK:
AnnaBridge 167:e84263d55307 67 ap.security = NSAPI_SECURITY_WPA2;
AnnaBridge 167:e84263d55307 68 break;
AnnaBridge 167:e84263d55307 69 case RTW_SECURITY_WPA_WPA2_MIXED:
AnnaBridge 167:e84263d55307 70 ap.security = NSAPI_SECURITY_WPA_WPA2;
AnnaBridge 167:e84263d55307 71 break;
AnnaBridge 167:e84263d55307 72 default:
AnnaBridge 167:e84263d55307 73 ap.security = NSAPI_SECURITY_UNKNOWN;
AnnaBridge 167:e84263d55307 74 break;
AnnaBridge 167:e84263d55307 75 }
AnnaBridge 167:e84263d55307 76 ap.rssi = record->signal_strength;
AnnaBridge 167:e84263d55307 77 ap.channel = record->channel;
AnnaBridge 172:7d866c31b3c5 78 scan_handler->ap_details[scan_handler->ap_num] = WiFiAccessPoint(ap);
AnnaBridge 167:e84263d55307 79 }
AnnaBridge 167:e84263d55307 80 scan_handler->ap_num++;
Anna Bridge 186:707f6e361f3e 81 } else {
AnnaBridge 167:e84263d55307 82 // scan done
AnnaBridge 167:e84263d55307 83 rtw_up_sema(&scan_handler->scan_sema);
AnnaBridge 167:e84263d55307 84 }
AnnaBridge 167:e84263d55307 85 return RTW_SUCCESS;
AnnaBridge 167:e84263d55307 86 }
AnnaBridge 167:e84263d55307 87
AnnaBridge 189:f392fc9709a3 88 RTWInterface::RTWInterface(RTW_EMAC &get_rtw_emac, OnboardNetworkStack &get_rtw_obn_stack, bool debug) :
AnnaBridge 188:bcfe06ba3d64 89 EMACInterface(get_rtw_emac, get_rtw_obn_stack),
Anna Bridge 186:707f6e361f3e 90 rtw_emac(get_rtw_emac),
AnnaBridge 188:bcfe06ba3d64 91 rtw_obn_stack(get_rtw_obn_stack)
AnnaBridge 167:e84263d55307 92 {
AnnaBridge 189:f392fc9709a3 93 extern __u32 GlobalDebugEnable;
AnnaBridge 189:f392fc9709a3 94 GlobalDebugEnable = debug?1:0; //Conditional statement: display debugging message
Anna Bridge 186:707f6e361f3e 95 rtw_emac.power_up();
AnnaBridge 167:e84263d55307 96 }
AnnaBridge 167:e84263d55307 97
AnnaBridge 167:e84263d55307 98 RTWInterface::~RTWInterface()
AnnaBridge 167:e84263d55307 99 {
Anna Bridge 186:707f6e361f3e 100 rtw_emac.wlan_emac_link_change(false);
AnnaBridge 188:bcfe06ba3d64 101 EMACInterface::disconnect();
AnnaBridge 167:e84263d55307 102 }
AnnaBridge 167:e84263d55307 103
AnnaBridge 167:e84263d55307 104 /*
AnnaBridge 167:e84263d55307 105 * we may call connect multiple times
AnnaBridge 167:e84263d55307 106 */
AnnaBridge 167:e84263d55307 107 nsapi_error_t RTWInterface::set_credentials(const char *ssid, const char *pass, nsapi_security_t security)
AnnaBridge 167:e84263d55307 108 {
AnnaBridge 189:f392fc9709a3 109 _security = security;
AnnaBridge 189:f392fc9709a3 110 // Check if ssid is empty
AnnaBridge 189:f392fc9709a3 111 if (!ssid) {
AnnaBridge 189:f392fc9709a3 112 return NSAPI_ERROR_PARAMETER;
AnnaBridge 189:f392fc9709a3 113 }
AnnaBridge 189:f392fc9709a3 114
AnnaBridge 189:f392fc9709a3 115 // Check if ssid is too long
AnnaBridge 189:f392fc9709a3 116 int ssid_length = strlen(ssid);
AnnaBridge 189:f392fc9709a3 117
AnnaBridge 189:f392fc9709a3 118 if (ssid_length > 0 && ssid_length <= SSID_MAX_LENGTH) {
AnnaBridge 189:f392fc9709a3 119 memset(_ssid, 0, sizeof(_ssid));
AnnaBridge 189:f392fc9709a3 120 strncpy(_ssid, ssid, sizeof(_ssid));
AnnaBridge 189:f392fc9709a3 121 } else {
Anna Bridge 180:96ed750bd169 122 return NSAPI_ERROR_PARAMETER;
Anna Bridge 180:96ed750bd169 123 }
Anna Bridge 180:96ed750bd169 124
AnnaBridge 189:f392fc9709a3 125 // Check if it is an open access point
AnnaBridge 189:f392fc9709a3 126 if (_security != NSAPI_SECURITY_NONE) {
AnnaBridge 189:f392fc9709a3 127 // Check if passphase is empty
AnnaBridge 189:f392fc9709a3 128 if (!pass) {
Anna Bridge 180:96ed750bd169 129 return NSAPI_ERROR_PARAMETER;
AnnaBridge 189:f392fc9709a3 130 }
AnnaBridge 189:f392fc9709a3 131 // Check if passphase too long
AnnaBridge 189:f392fc9709a3 132 if (strlen(pass) >= PASSPHRASE_MIN_LENGTH && strlen(pass) <= PASSPHRASE_MAX_LENGTH ) {
AnnaBridge 189:f392fc9709a3 133 memset(_pass, 0, sizeof(_pass));
AnnaBridge 189:f392fc9709a3 134 strncpy(_pass, pass, sizeof(_pass));
AnnaBridge 189:f392fc9709a3 135 } else {
AnnaBridge 189:f392fc9709a3 136 return NSAPI_ERROR_PARAMETER;
AnnaBridge 189:f392fc9709a3 137 }
AnnaBridge 189:f392fc9709a3 138 } else { // It is an open access point
AnnaBridge 189:f392fc9709a3 139 memset(_pass, 0, sizeof(_pass));
Anna Bridge 180:96ed750bd169 140 }
AnnaBridge 167:e84263d55307 141 return NSAPI_ERROR_OK;
AnnaBridge 167:e84263d55307 142 }
AnnaBridge 167:e84263d55307 143
AnnaBridge 167:e84263d55307 144 nsapi_error_t RTWInterface::connect()
AnnaBridge 167:e84263d55307 145 {
AnnaBridge 167:e84263d55307 146 int ret;
AnnaBridge 167:e84263d55307 147 rtw_security_t sec;
AnnaBridge 167:e84263d55307 148
AnnaBridge 189:f392fc9709a3 149 // Check if the ssid is empty
AnnaBridge 189:f392fc9709a3 150 if (strlen(_ssid) == 0) {
AnnaBridge 189:f392fc9709a3 151 return NSAPI_ERROR_NO_SSID;
AnnaBridge 167:e84263d55307 152 }
AnnaBridge 189:f392fc9709a3 153 // Check the security is empty and the passphase is valid
AnnaBridge 189:f392fc9709a3 154 if ((_security != NSAPI_SECURITY_NONE) && (strlen(_pass) < PASSPHRASE_MIN_LENGTH)) {
AnnaBridge 189:f392fc9709a3 155 return NSAPI_ERROR_PARAMETER;
AnnaBridge 189:f392fc9709a3 156 }
AnnaBridge 189:f392fc9709a3 157 // Based on security type set, adapt to Ameba SDK format
AnnaBridge 167:e84263d55307 158 switch (_security) {
AnnaBridge 167:e84263d55307 159 case NSAPI_SECURITY_WPA:
AnnaBridge 167:e84263d55307 160 case NSAPI_SECURITY_WPA2:
AnnaBridge 167:e84263d55307 161 case NSAPI_SECURITY_WPA_WPA2:
AnnaBridge 167:e84263d55307 162 sec = RTW_SECURITY_WPA_WPA2_MIXED;
AnnaBridge 167:e84263d55307 163 break;
AnnaBridge 167:e84263d55307 164 case NSAPI_SECURITY_WEP:
AnnaBridge 167:e84263d55307 165 sec = RTW_SECURITY_WEP_PSK;
AnnaBridge 167:e84263d55307 166 break;
AnnaBridge 167:e84263d55307 167 case NSAPI_SECURITY_NONE:
AnnaBridge 167:e84263d55307 168 sec = RTW_SECURITY_OPEN;
Anna Bridge 180:96ed750bd169 169 break;
AnnaBridge 167:e84263d55307 170 default:
AnnaBridge 167:e84263d55307 171 return NSAPI_ERROR_PARAMETER;
AnnaBridge 167:e84263d55307 172 }
AnnaBridge 189:f392fc9709a3 173 // Check if channel number is valid
Anna Bridge 186:707f6e361f3e 174 if (_channel > 0 && _channel < 14) {
Anna Bridge 186:707f6e361f3e 175 uint8_t pscan_config = PSCAN_ENABLE;
AnnaBridge 189:f392fc9709a3 176 wifi_set_pscan_chan(&_channel, &pscan_config, 1); // Indicate which channel will be scanned
Anna Bridge 186:707f6e361f3e 177 }
AnnaBridge 189:f392fc9709a3 178 ret = wifi_connect(_ssid, sec, _pass, strlen(_ssid), strlen(_pass), 0, (void *)NULL); // Join a WiFi network
AnnaBridge 189:f392fc9709a3 179 // Check if the WiFi is connected. Return RTW_SUCCESS for succeful; Return RTW_ERROR for error
AnnaBridge 167:e84263d55307 180 if (ret != RTW_SUCCESS) {
AnnaBridge 189:f392fc9709a3 181 if(_ssid == "NULL"){
AnnaBridge 189:f392fc9709a3 182 return NSAPI_ERROR_PARAMETER;
AnnaBridge 189:f392fc9709a3 183 }
AnnaBridge 189:f392fc9709a3 184 else{
AnnaBridge 189:f392fc9709a3 185 printf("failed: %d\r\n", ret);
AnnaBridge 189:f392fc9709a3 186 return NSAPI_ERROR_NO_CONNECTION;
AnnaBridge 189:f392fc9709a3 187 }
AnnaBridge 167:e84263d55307 188 }
Anna Bridge 186:707f6e361f3e 189 rtw_emac.wlan_emac_link_change(true);
AnnaBridge 188:bcfe06ba3d64 190 ret = EMACInterface::connect();
AnnaBridge 188:bcfe06ba3d64 191 return ret;
AnnaBridge 167:e84263d55307 192 }
AnnaBridge 167:e84263d55307 193
AnnaBridge 167:e84263d55307 194 nsapi_error_t RTWInterface::scan(WiFiAccessPoint *res, unsigned count)
AnnaBridge 167:e84263d55307 195 {
AnnaBridge 167:e84263d55307 196 static wifi_scan_hdl scan_handler;
AnnaBridge 167:e84263d55307 197 scan_handler.ap_num = 0;
Anna Bridge 186:707f6e361f3e 198 if (!scan_handler.scan_sema) {
AnnaBridge 167:e84263d55307 199 rtw_init_sema(&scan_handler.scan_sema, 0);
Anna Bridge 186:707f6e361f3e 200 }
AnnaBridge 167:e84263d55307 201 scan_handler.scan_num = count;
AnnaBridge 167:e84263d55307 202 scan_handler.ap_details = res;
Anna Bridge 186:707f6e361f3e 203 if (wifi_scan_networks(scan_result_handler, (void *)&scan_handler) != RTW_SUCCESS) {
AnnaBridge 167:e84263d55307 204 printf("wifi scan failed\n\r");
AnnaBridge 167:e84263d55307 205 return NSAPI_ERROR_DEVICE_ERROR;
AnnaBridge 167:e84263d55307 206 }
Anna Bridge 186:707f6e361f3e 207 if (rtw_down_timeout_sema( &scan_handler.scan_sema, MAX_SCAN_TIMEOUT ) == RTW_FALSE) {
AnnaBridge 167:e84263d55307 208 printf("wifi scan timeout\r\n");
AnnaBridge 167:e84263d55307 209 return NSAPI_ERROR_DEVICE_ERROR;
AnnaBridge 167:e84263d55307 210 }
Anna Bridge 186:707f6e361f3e 211 if (count <= 0 || count > scan_handler.ap_num) {
AnnaBridge 167:e84263d55307 212 count = scan_handler.ap_num;
Anna Bridge 186:707f6e361f3e 213 }
AnnaBridge 167:e84263d55307 214 return count;
AnnaBridge 167:e84263d55307 215 }
AnnaBridge 167:e84263d55307 216
AnnaBridge 167:e84263d55307 217 nsapi_error_t RTWInterface::set_channel(uint8_t channel)
AnnaBridge 167:e84263d55307 218 {
Anna Bridge 186:707f6e361f3e 219 _channel = channel;
AnnaBridge 189:f392fc9709a3 220 return NSAPI_ERROR_UNSUPPORTED;
AnnaBridge 167:e84263d55307 221 }
AnnaBridge 167:e84263d55307 222
AnnaBridge 167:e84263d55307 223 int8_t RTWInterface::get_rssi()
AnnaBridge 167:e84263d55307 224 {
AnnaBridge 167:e84263d55307 225 int rssi = 0;
Anna Bridge 186:707f6e361f3e 226 if (wifi_get_rssi(&rssi) == 0) {
AnnaBridge 167:e84263d55307 227 return (int8_t)rssi;
Anna Bridge 186:707f6e361f3e 228 }
AnnaBridge 167:e84263d55307 229 return NSAPI_ERROR_OK;
AnnaBridge 167:e84263d55307 230 }
AnnaBridge 167:e84263d55307 231
AnnaBridge 167:e84263d55307 232 nsapi_error_t RTWInterface::connect(const char *ssid, const char *pass,
Anna Bridge 180:96ed750bd169 233 nsapi_security_t security, uint8_t channel)
AnnaBridge 167:e84263d55307 234 {
Anna Bridge 186:707f6e361f3e 235 set_channel(channel);
AnnaBridge 189:f392fc9709a3 236 int err = set_credentials(ssid, pass, security);
AnnaBridge 189:f392fc9709a3 237 if(err) {
AnnaBridge 189:f392fc9709a3 238 return err;
AnnaBridge 189:f392fc9709a3 239 }
AnnaBridge 167:e84263d55307 240 return connect();
AnnaBridge 167:e84263d55307 241 }
AnnaBridge 167:e84263d55307 242
AnnaBridge 167:e84263d55307 243 nsapi_error_t RTWInterface::disconnect()
AnnaBridge 167:e84263d55307 244 {
AnnaBridge 167:e84263d55307 245 char essid[33];
AnnaBridge 167:e84263d55307 246
Anna Bridge 186:707f6e361f3e 247 rtw_emac.wlan_emac_link_change(false);
AnnaBridge 188:bcfe06ba3d64 248
AnnaBridge 188:bcfe06ba3d64 249 EMACInterface::disconnect();
AnnaBridge 188:bcfe06ba3d64 250
Anna Bridge 186:707f6e361f3e 251 if (wifi_is_connected_to_ap() != RTW_SUCCESS) {
AnnaBridge 167:e84263d55307 252 return NSAPI_ERROR_NO_CONNECTION;
Anna Bridge 186:707f6e361f3e 253 }
Anna Bridge 186:707f6e361f3e 254 if (wifi_disconnect()<0) {
AnnaBridge 167:e84263d55307 255 return NSAPI_ERROR_DEVICE_ERROR;
AnnaBridge 167:e84263d55307 256 }
Anna Bridge 186:707f6e361f3e 257 while(1) {
Anna Bridge 186:707f6e361f3e 258 if (wext_get_ssid(WLAN0_NAME, (unsigned char *) essid) < 0) {
AnnaBridge 167:e84263d55307 259 break;
AnnaBridge 167:e84263d55307 260 }
AnnaBridge 167:e84263d55307 261 }
AnnaBridge 167:e84263d55307 262 return NSAPI_ERROR_OK;
AnnaBridge 167:e84263d55307 263 }
AnnaBridge 167:e84263d55307 264
AnnaBridge 167:e84263d55307 265 int RTWInterface::is_connected()
AnnaBridge 167:e84263d55307 266 {
AnnaBridge 167:e84263d55307 267 return !wifi_is_connected_to_ap();
AnnaBridge 167:e84263d55307 268 }
AnnaBridge 167:e84263d55307 269
AnnaBridge 167:e84263d55307 270 NetworkStack *RTWInterface::get_stack()
AnnaBridge 167:e84263d55307 271 {
Anna Bridge 186:707f6e361f3e 272 return &rtw_obn_stack;
Anna Bridge 180:96ed750bd169 273 }