LWIPBP3595Interface library for mbed-os.

Dependents:   LWIPBP3595Interface_STA_for_mbed-os

Fork of LWIPBP3595Interface by Rohm

Committer:
dkato
Date:
Tue Sep 13 09:31:41 2016 +0000
Revision:
2:c7e325599570
Parent:
0:a933851e5d22
Child:
3:2ff2514e4fca
Change for mbed-os.

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
tousaki 0:a933851e5d22 25 /* Notify the EthernetInterface driver that WLAN was connected */
tousaki 0:a933851e5d22 26 WlanBP3595_Connected();
tousaki 0:a933851e5d22 27 } else {
tousaki 0:a933851e5d22 28 /* Notify the EthernetInterface 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 2:c7e325599570 125 int LWIPBP3595Interface::connect(const char *ssid, const char *pass, nsapi_security_t security)
tousaki 0:a933851e5d22 126 {
tousaki 0:a933851e5d22 127 _wlan_init();
dkato 2:c7e325599570 128 if (lwip_wifi_init() == 0) {
dkato 2:c7e325599570 129 _wlan_setting(ssid, pass, security);
tousaki 0:a933851e5d22 130 }
tousaki 0:a933851e5d22 131
dkato 2:c7e325599570 132 return lwip_wifi_bringup();
tousaki 0:a933851e5d22 133 }
tousaki 0:a933851e5d22 134
tousaki 0:a933851e5d22 135 int LWIPBP3595Interface::disconnect()
tousaki 0:a933851e5d22 136 {
dkato 2:c7e325599570 137 lwip_wifi_bringdown();
tousaki 0:a933851e5d22 138 return 0;
tousaki 0:a933851e5d22 139 }
tousaki 0:a933851e5d22 140
tousaki 0:a933851e5d22 141 const char *LWIPBP3595Interface::get_ip_address()
tousaki 0:a933851e5d22 142 {
dkato 2:c7e325599570 143 return lwip_wifi_get_ip_address();
tousaki 0:a933851e5d22 144 }
tousaki 0:a933851e5d22 145
tousaki 0:a933851e5d22 146 const char *LWIPBP3595Interface::get_mac_address()
tousaki 0:a933851e5d22 147 {
dkato 2:c7e325599570 148 return lwip_wifi_get_mac_address();
tousaki 0:a933851e5d22 149 }
dkato 2:c7e325599570 150
dkato 2:c7e325599570 151 NetworkStack *LWIPBP3595Interface::get_stack()
dkato 2:c7e325599570 152 {
dkato 2:c7e325599570 153 return nsapi_create_stack(&lwip_wifi_stack);
dkato 2:c7e325599570 154 }