LWIPBP3595Interface library for mbed-os.

Dependents:   LWIPBP3595Interface_STA_for_mbed-os

Fork of LWIPBP3595Interface by Rohm

Committer:
dkato
Date:
Thu Oct 27 09:30:15 2016 +0000
Revision:
3:2ff2514e4fca
Parent:
2:c7e325599570
Child:
4:b49b4b36aaa4
Supports mbed os 5.2.

Who changed what in which revision?

UserRevisionLine numberNew contents of line
tousaki 0:a933851e5d22 1 /* LWIP implementation of NetworkInterfaceAPI
tousaki 0:a933851e5d22 2 * Copyright (c) 2015 ARM Limited
tousaki 0:a933851e5d22 3 *
tousaki 0:a933851e5d22 4 * Licensed under the Apache License, Version 2.0 (the "License");
tousaki 0:a933851e5d22 5 * you may not use this file except in compliance with the License.
tousaki 0:a933851e5d22 6 * You may obtain a copy of the License at
tousaki 0:a933851e5d22 7 *
tousaki 0:a933851e5d22 8 * http://www.apache.org/licenses/LICENSE-2.0
tousaki 0:a933851e5d22 9 *
tousaki 0:a933851e5d22 10 * Unless required by applicable law or agreed to in writing, software
tousaki 0:a933851e5d22 11 * distributed under the License is distributed on an "AS IS" BASIS,
tousaki 0:a933851e5d22 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
tousaki 0:a933851e5d22 13 * See the License for the specific language governing permissions and
tousaki 0:a933851e5d22 14 * limitations under the License.
tousaki 0:a933851e5d22 15 */
tousaki 0:a933851e5d22 16
tousaki 0:a933851e5d22 17 #include "LWIPBP3595Interface.h"
tousaki 0:a933851e5d22 18 #include "LWIPBP3595Interface_BssType.h"
dkato 2:c7e325599570 19 #include "lwip_wifi_stack.h"
tousaki 0:a933851e5d22 20 #include "WlanBP3595.h"
tousaki 0:a933851e5d22 21
tousaki 0:a933851e5d22 22 static void _wlan_inf_callback(uint8_t ucType, uint16_t usWid, uint16_t usSize, uint8_t *pucData) {
tousaki 0:a933851e5d22 23 if ((ucType == 'I') && (usWid == 0x0005)) {
tousaki 0:a933851e5d22 24 if (pucData[0] == 0x01) { // CONNECTED
dkato 3:2ff2514e4fca 25 /* Notify the LWIPBP3595Interface driver that WLAN was connected */
tousaki 0:a933851e5d22 26 WlanBP3595_Connected();
tousaki 0:a933851e5d22 27 } else {
dkato 3:2ff2514e4fca 28 /* Notify the LWIPBP3595Interface driver that WLAN was disconnected */
tousaki 0:a933851e5d22 29 WlanBP3595_Disconnected();
tousaki 0:a933851e5d22 30 }
tousaki 0:a933851e5d22 31 }
tousaki 0:a933851e5d22 32 }
tousaki 0:a933851e5d22 33
tousaki 0:a933851e5d22 34 static int _wlan_init() {
tousaki 0:a933851e5d22 35 uint32_t status;
tousaki 0:a933851e5d22 36
tousaki 0:a933851e5d22 37 /* Initialize WlanBP3595 */
tousaki 0:a933851e5d22 38 if (WlanBP3595_Init(&_wlan_inf_callback) != 0) {
tousaki 0:a933851e5d22 39 return -1;
tousaki 0:a933851e5d22 40 }
tousaki 0:a933851e5d22 41
tousaki 0:a933851e5d22 42 /* Wait until WLAN_BP3595_START timeout 60s */
tousaki 0:a933851e5d22 43 while (1) {
tousaki 0:a933851e5d22 44 Thread::wait(200);
tousaki 0:a933851e5d22 45 status = WlanBP3595_GetWlanSts();
tousaki 0:a933851e5d22 46 if (status == WLAN_BP3595_START) {
tousaki 0:a933851e5d22 47 break;
tousaki 0:a933851e5d22 48 }
tousaki 0:a933851e5d22 49 }
tousaki 0:a933851e5d22 50
tousaki 0:a933851e5d22 51 return 0;
tousaki 0:a933851e5d22 52 }
tousaki 0:a933851e5d22 53
tousaki 0:a933851e5d22 54 static int _wlan_setting(const char *ssid, const char *pass, nsapi_security_t security)
tousaki 0:a933851e5d22 55 {
tousaki 0:a933851e5d22 56 int ret;
tousaki 0:a933851e5d22 57 grp_u8 ucWidData8; // 8bit wid data
tousaki 0:a933851e5d22 58 grp_wld_byte_array tBAWidData; // byte array wid data
tousaki 0:a933851e5d22 59
tousaki 0:a933851e5d22 60 // Set BSS type
tousaki 0:a933851e5d22 61 ucWidData8 = BSS_TYPE;
tousaki 0:a933851e5d22 62 ret = WlanBP3595_Ioctl(GRP_WLD_IOCTL_SET_BSS_TYPE, &ucWidData8);
tousaki 0:a933851e5d22 63 if (ret != 0) {
tousaki 0:a933851e5d22 64 return -1;
tousaki 0:a933851e5d22 65 }
tousaki 0:a933851e5d22 66
tousaki 0:a933851e5d22 67 // Set SSID
tousaki 0:a933851e5d22 68 tBAWidData.pucData = (grp_u8 *)ssid;
tousaki 0:a933851e5d22 69 tBAWidData.ulSize = strlen((char *)tBAWidData.pucData);
tousaki 0:a933851e5d22 70 ret = WlanBP3595_Ioctl(GRP_WLD_IOCTL_SET_SSID, &tBAWidData);
tousaki 0:a933851e5d22 71 if (ret != 0) {
tousaki 0:a933851e5d22 72 return -1;
tousaki 0:a933851e5d22 73 }
tousaki 0:a933851e5d22 74
tousaki 0:a933851e5d22 75 if ((security == NSAPI_SECURITY_WPA) || (security == NSAPI_SECURITY_WPA2)) {
tousaki 0:a933851e5d22 76 // Set PSK
tousaki 0:a933851e5d22 77 tBAWidData.pucData = (grp_u8 *)pass;
tousaki 0:a933851e5d22 78 tBAWidData.ulSize = strlen((char *)tBAWidData.pucData);
tousaki 0:a933851e5d22 79 ret = WlanBP3595_Ioctl(GRP_WLD_IOCTL_SET_11I_PSK, &tBAWidData);
tousaki 0:a933851e5d22 80 if (ret != 0) {
tousaki 0:a933851e5d22 81 return -1;
tousaki 0:a933851e5d22 82 }
tousaki 0:a933851e5d22 83 }
tousaki 0:a933851e5d22 84
tousaki 0:a933851e5d22 85 // Set 11i mode
tousaki 0:a933851e5d22 86 switch (security) {
tousaki 0:a933851e5d22 87 case NSAPI_SECURITY_WEP:
tousaki 0:a933851e5d22 88 ret = strlen(pass);
tousaki 0:a933851e5d22 89 if (ret == 5) {
tousaki 0:a933851e5d22 90 ucWidData8 = 0x03; // WEP64
tousaki 0:a933851e5d22 91 } else if (ret == 13) {
tousaki 0:a933851e5d22 92 ucWidData8 = 0x07; // WEP128
tousaki 0:a933851e5d22 93 } else {
tousaki 0:a933851e5d22 94 return -1;
tousaki 0:a933851e5d22 95 }
tousaki 0:a933851e5d22 96 break;
tousaki 0:a933851e5d22 97 case NSAPI_SECURITY_WPA:
tousaki 0:a933851e5d22 98 case NSAPI_SECURITY_WPA2:
tousaki 0:a933851e5d22 99 ucWidData8 = 0x79; // WPA/WPA2 Mixed
tousaki 0:a933851e5d22 100 break;
tousaki 0:a933851e5d22 101 case NSAPI_SECURITY_NONE:
tousaki 0:a933851e5d22 102 default:
tousaki 0:a933851e5d22 103 ucWidData8 = 0x00;
tousaki 0:a933851e5d22 104 break;
tousaki 0:a933851e5d22 105 }
tousaki 0:a933851e5d22 106 ret = WlanBP3595_Ioctl(GRP_WLD_IOCTL_SET_11I_MODE, &ucWidData8);
tousaki 0:a933851e5d22 107 if (ret != 0) {
tousaki 0:a933851e5d22 108 return -1;
tousaki 0:a933851e5d22 109 }
tousaki 0:a933851e5d22 110
tousaki 0:a933851e5d22 111 if (security == NSAPI_SECURITY_WEP) {
tousaki 0:a933851e5d22 112 // Set WEP KEY
tousaki 0:a933851e5d22 113 tBAWidData.pucData = (grp_u8 *)pass;
tousaki 0:a933851e5d22 114 tBAWidData.ulSize = strlen((char *)tBAWidData.pucData);
tousaki 0:a933851e5d22 115 ret = WlanBP3595_Ioctl(GRP_WLD_IOCTL_SET_WEP_KEY, &tBAWidData);
tousaki 0:a933851e5d22 116 if (ret != 0) {
tousaki 0:a933851e5d22 117 return -1;
tousaki 0:a933851e5d22 118 }
tousaki 0:a933851e5d22 119 }
tousaki 0:a933851e5d22 120
tousaki 0:a933851e5d22 121 return 0;
tousaki 0:a933851e5d22 122 }
tousaki 0:a933851e5d22 123
dkato 2:c7e325599570 124 /* Interface implementation */
dkato 3:2ff2514e4fca 125 LWIPBP3595Interface::LWIPBP3595Interface()
dkato 3:2ff2514e4fca 126 : _dhcp(true), _ip_address(), _netmask(), _gateway(), _ssid(NULL), _pass(NULL), _security()
dkato 3:2ff2514e4fca 127 {
dkato 3:2ff2514e4fca 128 }
dkato 3:2ff2514e4fca 129
dkato 3:2ff2514e4fca 130 LWIPBP3595Interface::~LWIPBP3595Interface() {
dkato 3:2ff2514e4fca 131 if (_ssid != NULL) {
dkato 3:2ff2514e4fca 132 delete []_ssid;
dkato 3:2ff2514e4fca 133 }
dkato 3:2ff2514e4fca 134 if (_pass != NULL) {
dkato 3:2ff2514e4fca 135 delete []_pass;
dkato 3:2ff2514e4fca 136 }
dkato 3:2ff2514e4fca 137 }
dkato 3:2ff2514e4fca 138
dkato 3:2ff2514e4fca 139 int LWIPBP3595Interface::set_network(const char *ip_address, const char *netmask, const char *gateway)
dkato 3:2ff2514e4fca 140 {
dkato 3:2ff2514e4fca 141 _dhcp = false;
dkato 3:2ff2514e4fca 142 strncpy(_ip_address, ip_address ? ip_address : "", sizeof(_ip_address));
dkato 3:2ff2514e4fca 143 strncpy(_netmask, netmask ? netmask : "", sizeof(_netmask));
dkato 3:2ff2514e4fca 144 strncpy(_gateway, gateway ? gateway : "", sizeof(_gateway));
dkato 3:2ff2514e4fca 145 return 0;
dkato 3:2ff2514e4fca 146 }
dkato 3:2ff2514e4fca 147
dkato 3:2ff2514e4fca 148 int LWIPBP3595Interface::set_dhcp(bool dhcp)
dkato 3:2ff2514e4fca 149 {
dkato 3:2ff2514e4fca 150 _dhcp = dhcp;
dkato 3:2ff2514e4fca 151 return 0;
dkato 3:2ff2514e4fca 152 }
dkato 3:2ff2514e4fca 153
dkato 3:2ff2514e4fca 154 int LWIPBP3595Interface::set_credentials(const char *ssid, const char *pass, nsapi_security_t security)
dkato 3:2ff2514e4fca 155 {
dkato 3:2ff2514e4fca 156 if (_ssid != NULL) {
dkato 3:2ff2514e4fca 157 delete []_ssid;
dkato 3:2ff2514e4fca 158 }
dkato 3:2ff2514e4fca 159 _ssid = new char[strlen(ssid) + 1];
dkato 3:2ff2514e4fca 160 if (_ssid != NULL) {
dkato 3:2ff2514e4fca 161 strcpy(_ssid, ssid);
dkato 3:2ff2514e4fca 162 }
dkato 3:2ff2514e4fca 163
dkato 3:2ff2514e4fca 164 if (_pass != NULL) {
dkato 3:2ff2514e4fca 165 delete []_pass;
dkato 3:2ff2514e4fca 166 }
dkato 3:2ff2514e4fca 167 _pass = new char[strlen(pass) + 1];
dkato 3:2ff2514e4fca 168 if (_pass != NULL) {
dkato 3:2ff2514e4fca 169 strcpy(_pass, pass);
dkato 3:2ff2514e4fca 170 }
dkato 3:2ff2514e4fca 171
dkato 3:2ff2514e4fca 172 _security = security;
dkato 3:2ff2514e4fca 173
dkato 3:2ff2514e4fca 174 if ((_ssid == NULL) || (_pass == NULL)) {
dkato 3:2ff2514e4fca 175 return -1;
dkato 3:2ff2514e4fca 176 }
dkato 3:2ff2514e4fca 177 return 0;
dkato 3:2ff2514e4fca 178 }
dkato 3:2ff2514e4fca 179
dkato 3:2ff2514e4fca 180 int LWIPBP3595Interface::set_channel(uint8_t channel)
dkato 3:2ff2514e4fca 181 {
dkato 3:2ff2514e4fca 182 return 0;
dkato 3:2ff2514e4fca 183 }
dkato 3:2ff2514e4fca 184
dkato 3:2ff2514e4fca 185 int8_t LWIPBP3595Interface::get_rssi()
dkato 3:2ff2514e4fca 186 {
dkato 3:2ff2514e4fca 187 return 0;
dkato 3:2ff2514e4fca 188 }
dkato 3:2ff2514e4fca 189
dkato 3:2ff2514e4fca 190 int LWIPBP3595Interface::connect(const char *ssid, const char *pass, nsapi_security_t security, uint8_t channel)
dkato 3:2ff2514e4fca 191 {
dkato 3:2ff2514e4fca 192 set_credentials(ssid, pass, security);
dkato 3:2ff2514e4fca 193 set_channel(channel);
dkato 3:2ff2514e4fca 194 return connect();
dkato 3:2ff2514e4fca 195 }
dkato 3:2ff2514e4fca 196
dkato 3:2ff2514e4fca 197 int LWIPBP3595Interface::connect()
tousaki 0:a933851e5d22 198 {
tousaki 0:a933851e5d22 199 _wlan_init();
dkato 3:2ff2514e4fca 200 if (mbed_lwip_wifi_init(NULL) == 0) {
dkato 3:2ff2514e4fca 201 _wlan_setting(_ssid, _pass, _security);
tousaki 0:a933851e5d22 202 }
tousaki 0:a933851e5d22 203
dkato 3:2ff2514e4fca 204 return mbed_lwip_wifi_bringup(_dhcp,
dkato 3:2ff2514e4fca 205 _ip_address[0] ? _ip_address : 0,
dkato 3:2ff2514e4fca 206 _netmask[0] ? _netmask : 0,
dkato 3:2ff2514e4fca 207 _gateway[0] ? _gateway : 0);
tousaki 0:a933851e5d22 208 }
tousaki 0:a933851e5d22 209
tousaki 0:a933851e5d22 210 int LWIPBP3595Interface::disconnect()
tousaki 0:a933851e5d22 211 {
dkato 3:2ff2514e4fca 212 return mbed_lwip_wifi_bringdown();
dkato 3:2ff2514e4fca 213 }
dkato 3:2ff2514e4fca 214
dkato 3:2ff2514e4fca 215 int LWIPBP3595Interface::scan(WiFiAccessPoint *res, unsigned count)
dkato 3:2ff2514e4fca 216 {
dkato 3:2ff2514e4fca 217 return NSAPI_ERROR_UNSUPPORTED;
dkato 3:2ff2514e4fca 218 }
dkato 3:2ff2514e4fca 219
dkato 3:2ff2514e4fca 220 const char *LWIPBP3595Interface::get_mac_address()
dkato 3:2ff2514e4fca 221 {
dkato 3:2ff2514e4fca 222 return mbed_lwip_wifi_get_mac_address();
tousaki 0:a933851e5d22 223 }
tousaki 0:a933851e5d22 224
tousaki 0:a933851e5d22 225 const char *LWIPBP3595Interface::get_ip_address()
tousaki 0:a933851e5d22 226 {
dkato 3:2ff2514e4fca 227 if (mbed_lwip_wifi_get_ip_address(_ip_address, sizeof _ip_address)) {
dkato 3:2ff2514e4fca 228 return _ip_address;
dkato 3:2ff2514e4fca 229 }
dkato 3:2ff2514e4fca 230
dkato 3:2ff2514e4fca 231 return 0;
tousaki 0:a933851e5d22 232 }
tousaki 0:a933851e5d22 233
dkato 3:2ff2514e4fca 234 const char *LWIPBP3595Interface::get_netmask()
tousaki 0:a933851e5d22 235 {
dkato 3:2ff2514e4fca 236 if (mbed_lwip_wifi_get_netmask(_netmask, sizeof _netmask)) {
dkato 3:2ff2514e4fca 237 return _netmask;
dkato 3:2ff2514e4fca 238 }
dkato 3:2ff2514e4fca 239
dkato 3:2ff2514e4fca 240 return 0;
dkato 3:2ff2514e4fca 241 }
dkato 3:2ff2514e4fca 242
dkato 3:2ff2514e4fca 243 const char *LWIPBP3595Interface::get_gateway()
dkato 3:2ff2514e4fca 244 {
dkato 3:2ff2514e4fca 245 if (mbed_lwip_wifi_get_gateway(_gateway, sizeof _gateway)) {
dkato 3:2ff2514e4fca 246 return _gateway;
dkato 3:2ff2514e4fca 247 }
dkato 3:2ff2514e4fca 248
dkato 3:2ff2514e4fca 249 return 0;
tousaki 0:a933851e5d22 250 }
dkato 2:c7e325599570 251
dkato 2:c7e325599570 252 NetworkStack *LWIPBP3595Interface::get_stack()
dkato 2:c7e325599570 253 {
dkato 2:c7e325599570 254 return nsapi_create_stack(&lwip_wifi_stack);
dkato 2:c7e325599570 255 }