mbed library sources. Supersedes mbed-src.
Dependents: Nucleo_Hello_Encoder BLE_iBeaconScan AM1805_DEMO DISCO-F429ZI_ExportTemplate1 ... more
targets/TARGET_Realtek/TARGET_AMEBA/RTWInterface.cpp@188:bcfe06ba3d64, 2018-11-08 (annotated)
- Committer:
- AnnaBridge
- Date:
- Thu Nov 08 11:46:34 2018 +0000
- Revision:
- 188:bcfe06ba3d64
- Parent:
- 186:707f6e361f3e
- Child:
- 189:f392fc9709a3
mbed-dev library. Release version 164
Who changed what in which revision?
User | Revision | Line number | New 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 | |
Anna Bridge |
186:707f6e361f3e | 88 | RTWInterface::RTWInterface(RTW_EMAC &get_rtw_emac, OnboardNetworkStack &get_rtw_obn_stack) : |
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 | { |
Anna Bridge |
186:707f6e361f3e | 93 | rtw_emac.power_up(); |
AnnaBridge | 167:e84263d55307 | 94 | } |
AnnaBridge | 167:e84263d55307 | 95 | |
AnnaBridge | 167:e84263d55307 | 96 | RTWInterface::~RTWInterface() |
AnnaBridge | 167:e84263d55307 | 97 | { |
Anna Bridge |
186:707f6e361f3e | 98 | rtw_emac.wlan_emac_link_change(false); |
AnnaBridge | 188:bcfe06ba3d64 | 99 | EMACInterface::disconnect(); |
AnnaBridge | 167:e84263d55307 | 100 | } |
AnnaBridge | 167:e84263d55307 | 101 | |
AnnaBridge | 167:e84263d55307 | 102 | /* |
AnnaBridge | 167:e84263d55307 | 103 | * we may call connect multiple times |
AnnaBridge | 167:e84263d55307 | 104 | */ |
AnnaBridge | 167:e84263d55307 | 105 | nsapi_error_t RTWInterface::set_credentials(const char *ssid, const char *pass, nsapi_security_t security) |
AnnaBridge | 167:e84263d55307 | 106 | { |
Anna Bridge |
186:707f6e361f3e | 107 | if (!ssid) { |
Anna Bridge |
180:96ed750bd169 | 108 | return NSAPI_ERROR_PARAMETER; |
Anna Bridge |
180:96ed750bd169 | 109 | } |
Anna Bridge |
180:96ed750bd169 | 110 | |
Anna Bridge |
180:96ed750bd169 | 111 | switch (security) { |
Anna Bridge |
180:96ed750bd169 | 112 | case NSAPI_SECURITY_WPA: |
Anna Bridge |
180:96ed750bd169 | 113 | case NSAPI_SECURITY_WPA2: |
Anna Bridge |
180:96ed750bd169 | 114 | case NSAPI_SECURITY_WPA_WPA2: |
Anna Bridge |
180:96ed750bd169 | 115 | case NSAPI_SECURITY_WEP: |
Anna Bridge |
186:707f6e361f3e | 116 | if ((strlen(pass) < 8) || (strlen(pass) > 63)) { // 802.11 password 8-63 characters |
Anna Bridge |
180:96ed750bd169 | 117 | return NSAPI_ERROR_PARAMETER; |
Anna Bridge |
180:96ed750bd169 | 118 | } |
Anna Bridge |
180:96ed750bd169 | 119 | break; |
Anna Bridge |
180:96ed750bd169 | 120 | case NSAPI_SECURITY_NONE: |
Anna Bridge |
180:96ed750bd169 | 121 | break; |
Anna Bridge |
180:96ed750bd169 | 122 | default: |
Anna Bridge |
180:96ed750bd169 | 123 | return NSAPI_ERROR_PARAMETER; |
Anna Bridge |
180:96ed750bd169 | 124 | } |
Anna Bridge |
180:96ed750bd169 | 125 | |
AnnaBridge | 167:e84263d55307 | 126 | strncpy(_ssid, ssid, 255); |
AnnaBridge | 167:e84263d55307 | 127 | strncpy(_pass, pass, 255); |
AnnaBridge | 167:e84263d55307 | 128 | _security = security; |
AnnaBridge | 167:e84263d55307 | 129 | |
AnnaBridge | 167:e84263d55307 | 130 | return NSAPI_ERROR_OK; |
AnnaBridge | 167:e84263d55307 | 131 | } |
AnnaBridge | 167:e84263d55307 | 132 | |
AnnaBridge | 167:e84263d55307 | 133 | nsapi_error_t RTWInterface::connect() |
AnnaBridge | 167:e84263d55307 | 134 | { |
AnnaBridge | 167:e84263d55307 | 135 | int ret; |
AnnaBridge | 167:e84263d55307 | 136 | rtw_security_t sec; |
AnnaBridge | 167:e84263d55307 | 137 | |
Anna Bridge |
186:707f6e361f3e | 138 | if (!_ssid || (!_pass && _security != NSAPI_SECURITY_NONE)) { |
AnnaBridge | 167:e84263d55307 | 139 | printf("Invalid credentials\r\n"); |
AnnaBridge | 167:e84263d55307 | 140 | return NSAPI_ERROR_PARAMETER; |
AnnaBridge | 167:e84263d55307 | 141 | } |
AnnaBridge | 167:e84263d55307 | 142 | |
AnnaBridge | 167:e84263d55307 | 143 | switch (_security) { |
AnnaBridge | 167:e84263d55307 | 144 | case NSAPI_SECURITY_WPA: |
AnnaBridge | 167:e84263d55307 | 145 | case NSAPI_SECURITY_WPA2: |
AnnaBridge | 167:e84263d55307 | 146 | case NSAPI_SECURITY_WPA_WPA2: |
AnnaBridge | 167:e84263d55307 | 147 | sec = RTW_SECURITY_WPA_WPA2_MIXED; |
AnnaBridge | 167:e84263d55307 | 148 | break; |
AnnaBridge | 167:e84263d55307 | 149 | case NSAPI_SECURITY_WEP: |
AnnaBridge | 167:e84263d55307 | 150 | sec = RTW_SECURITY_WEP_PSK; |
AnnaBridge | 167:e84263d55307 | 151 | break; |
AnnaBridge | 167:e84263d55307 | 152 | case NSAPI_SECURITY_NONE: |
AnnaBridge | 167:e84263d55307 | 153 | sec = RTW_SECURITY_OPEN; |
Anna Bridge |
180:96ed750bd169 | 154 | break; |
AnnaBridge | 167:e84263d55307 | 155 | default: |
AnnaBridge | 167:e84263d55307 | 156 | return NSAPI_ERROR_PARAMETER; |
AnnaBridge | 167:e84263d55307 | 157 | } |
AnnaBridge | 167:e84263d55307 | 158 | |
Anna Bridge |
186:707f6e361f3e | 159 | if (_channel > 0 && _channel < 14) { |
Anna Bridge |
186:707f6e361f3e | 160 | uint8_t pscan_config = PSCAN_ENABLE; |
Anna Bridge |
186:707f6e361f3e | 161 | wifi_set_pscan_chan(&_channel, &pscan_config, 1); |
Anna Bridge |
186:707f6e361f3e | 162 | } |
Anna Bridge |
186:707f6e361f3e | 163 | |
AnnaBridge | 167:e84263d55307 | 164 | ret = wifi_connect(_ssid, sec, _pass, strlen(_ssid), strlen(_pass), 0, (void *)NULL); |
AnnaBridge | 167:e84263d55307 | 165 | if (ret != RTW_SUCCESS) { |
AnnaBridge | 167:e84263d55307 | 166 | printf("failed: %d\r\n", ret); |
AnnaBridge | 167:e84263d55307 | 167 | return NSAPI_ERROR_NO_CONNECTION; |
AnnaBridge | 167:e84263d55307 | 168 | } |
AnnaBridge | 167:e84263d55307 | 169 | |
Anna Bridge |
186:707f6e361f3e | 170 | rtw_emac.wlan_emac_link_change(true); |
Anna Bridge |
186:707f6e361f3e | 171 | |
AnnaBridge | 188:bcfe06ba3d64 | 172 | ret = EMACInterface::connect(); |
AnnaBridge | 188:bcfe06ba3d64 | 173 | |
AnnaBridge | 188:bcfe06ba3d64 | 174 | return ret; |
AnnaBridge | 167:e84263d55307 | 175 | } |
AnnaBridge | 167:e84263d55307 | 176 | |
AnnaBridge | 167:e84263d55307 | 177 | nsapi_error_t RTWInterface::scan(WiFiAccessPoint *res, unsigned count) |
AnnaBridge | 167:e84263d55307 | 178 | { |
AnnaBridge | 167:e84263d55307 | 179 | static wifi_scan_hdl scan_handler; |
AnnaBridge | 167:e84263d55307 | 180 | scan_handler.ap_num = 0; |
Anna Bridge |
186:707f6e361f3e | 181 | if (!scan_handler.scan_sema) { |
AnnaBridge | 167:e84263d55307 | 182 | rtw_init_sema(&scan_handler.scan_sema, 0); |
Anna Bridge |
186:707f6e361f3e | 183 | } |
AnnaBridge | 167:e84263d55307 | 184 | scan_handler.scan_num = count; |
AnnaBridge | 167:e84263d55307 | 185 | scan_handler.ap_details = res; |
Anna Bridge |
186:707f6e361f3e | 186 | if (wifi_scan_networks(scan_result_handler, (void *)&scan_handler) != RTW_SUCCESS) { |
AnnaBridge | 167:e84263d55307 | 187 | printf("wifi scan failed\n\r"); |
AnnaBridge | 167:e84263d55307 | 188 | return NSAPI_ERROR_DEVICE_ERROR; |
AnnaBridge | 167:e84263d55307 | 189 | } |
Anna Bridge |
186:707f6e361f3e | 190 | if (rtw_down_timeout_sema( &scan_handler.scan_sema, MAX_SCAN_TIMEOUT ) == RTW_FALSE) { |
AnnaBridge | 167:e84263d55307 | 191 | printf("wifi scan timeout\r\n"); |
AnnaBridge | 167:e84263d55307 | 192 | return NSAPI_ERROR_DEVICE_ERROR; |
AnnaBridge | 167:e84263d55307 | 193 | } |
Anna Bridge |
186:707f6e361f3e | 194 | if (count <= 0 || count > scan_handler.ap_num) { |
AnnaBridge | 167:e84263d55307 | 195 | count = scan_handler.ap_num; |
Anna Bridge |
186:707f6e361f3e | 196 | } |
AnnaBridge | 167:e84263d55307 | 197 | return count; |
AnnaBridge | 167:e84263d55307 | 198 | } |
AnnaBridge | 167:e84263d55307 | 199 | |
AnnaBridge | 167:e84263d55307 | 200 | nsapi_error_t RTWInterface::set_channel(uint8_t channel) |
AnnaBridge | 167:e84263d55307 | 201 | { |
Anna Bridge |
186:707f6e361f3e | 202 | _channel = channel; |
AnnaBridge | 167:e84263d55307 | 203 | return NSAPI_ERROR_OK; |
AnnaBridge | 167:e84263d55307 | 204 | } |
AnnaBridge | 167:e84263d55307 | 205 | |
AnnaBridge | 167:e84263d55307 | 206 | int8_t RTWInterface::get_rssi() |
AnnaBridge | 167:e84263d55307 | 207 | { |
AnnaBridge | 167:e84263d55307 | 208 | int rssi = 0; |
Anna Bridge |
186:707f6e361f3e | 209 | if (wifi_get_rssi(&rssi) == 0) { |
AnnaBridge | 167:e84263d55307 | 210 | return (int8_t)rssi; |
Anna Bridge |
186:707f6e361f3e | 211 | } |
AnnaBridge | 167:e84263d55307 | 212 | return NSAPI_ERROR_OK; |
AnnaBridge | 167:e84263d55307 | 213 | } |
AnnaBridge | 167:e84263d55307 | 214 | |
AnnaBridge | 167:e84263d55307 | 215 | nsapi_error_t RTWInterface::connect(const char *ssid, const char *pass, |
Anna Bridge |
180:96ed750bd169 | 216 | nsapi_security_t security, uint8_t channel) |
AnnaBridge | 167:e84263d55307 | 217 | { |
Anna Bridge |
186:707f6e361f3e | 218 | set_credentials(ssid, pass, security); |
Anna Bridge |
186:707f6e361f3e | 219 | set_channel(channel); |
AnnaBridge | 167:e84263d55307 | 220 | return connect(); |
AnnaBridge | 167:e84263d55307 | 221 | } |
AnnaBridge | 167:e84263d55307 | 222 | |
AnnaBridge | 167:e84263d55307 | 223 | nsapi_error_t RTWInterface::disconnect() |
AnnaBridge | 167:e84263d55307 | 224 | { |
AnnaBridge | 167:e84263d55307 | 225 | char essid[33]; |
AnnaBridge | 167:e84263d55307 | 226 | |
Anna Bridge |
186:707f6e361f3e | 227 | rtw_emac.wlan_emac_link_change(false); |
AnnaBridge | 188:bcfe06ba3d64 | 228 | |
AnnaBridge | 188:bcfe06ba3d64 | 229 | EMACInterface::disconnect(); |
AnnaBridge | 188:bcfe06ba3d64 | 230 | |
Anna Bridge |
186:707f6e361f3e | 231 | if (wifi_is_connected_to_ap() != RTW_SUCCESS) { |
AnnaBridge | 167:e84263d55307 | 232 | return NSAPI_ERROR_NO_CONNECTION; |
Anna Bridge |
186:707f6e361f3e | 233 | } |
Anna Bridge |
186:707f6e361f3e | 234 | if (wifi_disconnect()<0) { |
AnnaBridge | 167:e84263d55307 | 235 | return NSAPI_ERROR_DEVICE_ERROR; |
AnnaBridge | 167:e84263d55307 | 236 | } |
Anna Bridge |
186:707f6e361f3e | 237 | while(1) { |
Anna Bridge |
186:707f6e361f3e | 238 | if (wext_get_ssid(WLAN0_NAME, (unsigned char *) essid) < 0) { |
AnnaBridge | 167:e84263d55307 | 239 | break; |
AnnaBridge | 167:e84263d55307 | 240 | } |
AnnaBridge | 167:e84263d55307 | 241 | } |
AnnaBridge | 167:e84263d55307 | 242 | return NSAPI_ERROR_OK; |
AnnaBridge | 167:e84263d55307 | 243 | } |
AnnaBridge | 167:e84263d55307 | 244 | |
AnnaBridge | 167:e84263d55307 | 245 | int RTWInterface::is_connected() |
AnnaBridge | 167:e84263d55307 | 246 | { |
AnnaBridge | 167:e84263d55307 | 247 | return !wifi_is_connected_to_ap(); |
AnnaBridge | 167:e84263d55307 | 248 | } |
AnnaBridge | 167:e84263d55307 | 249 | |
AnnaBridge | 167:e84263d55307 | 250 | NetworkStack *RTWInterface::get_stack() |
AnnaBridge | 167:e84263d55307 | 251 | { |
Anna Bridge |
186:707f6e361f3e | 252 | return &rtw_obn_stack; |
Anna Bridge |
180:96ed750bd169 | 253 | } |