GSwifiInterface library (interface for GainSpan Wi-Fi GS1011 modules) Please see https://mbed.org/users/gsfan/notebook/GSwifiInterface/

Dependents:   GSwifiInterface_HelloWorld GSwifiInterface_HelloServo GSwifiInterface_UDPEchoServer GSwifiInterface_UDPEchoClient ... more

Fork of WiflyInterface by mbed official

GainSpan Wi-Fi library

The GS1011/GS2100 is an ultra low power 802.11b wireless module from GainSpan.

mbed RTOS supported.

/media/uploads/gsfan/gs_im_002.jpg /media/uploads/gsfan/gs1011m_2.jpg

ゲインスパン Wi-Fi モジュール ライブラリ

ゲインスパン社の低電力 Wi-Fiモジュール(無線LAN) GS1011/GS2100 シリーズ用のライブラリです。

mbed RTOS に対応しています。(mbed2.0)

Committer:
gsfan
Date:
Tue Sep 24 06:24:37 2019 +0000
Revision:
22:d25a5a0d2497
Parent:
19:d035412a7803
UART Command and SPI Data supported.; bug fix.;

Who changed what in which revision?

UserRevisionLine numberNew contents of line
gsfan 8:64184a968e3b 1 /* Copyright (C) 2013 gsfan, MIT License
gsfan 8:64184a968e3b 2 *
gsfan 8:64184a968e3b 3 * Permission is hereby granted, free of charge, to any person obtaining a copy of this software
gsfan 8:64184a968e3b 4 * and associated documentation files (the "Software"), to deal in the Software without restriction,
gsfan 8:64184a968e3b 5 * including without limitation the rights to use, copy, modify, merge, publish, distribute,
gsfan 8:64184a968e3b 6 * sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is
gsfan 8:64184a968e3b 7 * furnished to do so, subject to the following conditions:
gsfan 8:64184a968e3b 8 *
gsfan 8:64184a968e3b 9 * The above copyright notice and this permission notice shall be included in all copies or
gsfan 8:64184a968e3b 10 * substantial portions of the Software.
gsfan 8:64184a968e3b 11 *
gsfan 8:64184a968e3b 12 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING
gsfan 8:64184a968e3b 13 * BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
gsfan 8:64184a968e3b 14 * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
gsfan 8:64184a968e3b 15 * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
gsfan 8:64184a968e3b 16 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
gsfan 8:64184a968e3b 17 */
gsfan 8:64184a968e3b 18
gsfan 8:64184a968e3b 19 #include "GSwifi.h"
gsfan 8:64184a968e3b 20
gsfan 8:64184a968e3b 21 void GSwifi::setReset (bool flg) {
gsfan 8:64184a968e3b 22 if (flg) {
gsfan 8:64184a968e3b 23 // low
gsfan 8:64184a968e3b 24 _reset.output();
gsfan 8:64184a968e3b 25 _reset = 0;
gsfan 8:64184a968e3b 26 } else {
gsfan 8:64184a968e3b 27 // high z
gsfan 8:64184a968e3b 28 _reset.input();
gsfan 8:64184a968e3b 29 _reset.mode(PullNone);
gsfan 8:64184a968e3b 30 }
gsfan 8:64184a968e3b 31 }
gsfan 8:64184a968e3b 32
gsfan 8:64184a968e3b 33 void GSwifi::setAlarm (bool flg) {
gsfan 8:64184a968e3b 34 if (_alarm == NULL) return;
gsfan 8:64184a968e3b 35
gsfan 8:64184a968e3b 36 if (flg) {
gsfan 8:64184a968e3b 37 // low
gsfan 8:64184a968e3b 38 _alarm->output(); // low
gsfan 8:64184a968e3b 39 _alarm->write(0);
gsfan 8:64184a968e3b 40 } else {
gsfan 8:64184a968e3b 41 // high
gsfan 8:64184a968e3b 42 _alarm->input(); // high
gsfan 8:64184a968e3b 43 _alarm->mode(PullUp);
gsfan 8:64184a968e3b 44 }
gsfan 8:64184a968e3b 45 }
gsfan 8:64184a968e3b 46
gsfan 8:64184a968e3b 47 void GSwifi::isrUart () {
gsfan 8:64184a968e3b 48 recvData(getUart());
gsfan 8:64184a968e3b 49 }
gsfan 8:64184a968e3b 50
gsfan 8:64184a968e3b 51 int GSwifi::getUart () {
gsfan 8:64184a968e3b 52 #ifdef CFG_UART_DIRECT
gsfan 8:64184a968e3b 53 return _uart->RBR;
gsfan 8:64184a968e3b 54 #else
gsfan 8:64184a968e3b 55 return _gs.getc();
gsfan 8:64184a968e3b 56 #endif
gsfan 8:64184a968e3b 57 }
gsfan 8:64184a968e3b 58
gsfan 8:64184a968e3b 59 void GSwifi::putUart (char c) {
gsfan 8:64184a968e3b 60 #ifdef CFG_UART_DIRECT
gsfan 8:64184a968e3b 61 while(!(_uart->LSR & (1<<5)));
gsfan 8:64184a968e3b 62 _uart->THR = c;
gsfan 8:64184a968e3b 63 #else
gsfan 8:64184a968e3b 64 _gs.putc(c);
gsfan 8:64184a968e3b 65 #endif
gsfan 8:64184a968e3b 66 }
gsfan 8:64184a968e3b 67
gsfan 8:64184a968e3b 68 void GSwifi::setRts (bool flg) {
gsfan 8:64184a968e3b 69 if (flg) {
gsfan 8:64184a968e3b 70 // low
gsfan 8:64184a968e3b 71 if (_flow == 1) {
gsfan 16:105b56570533 72 #if defined(TARGET_LPC1768) || defined(TARGET_LPC2368) || defined(TARGET_LPC11U24) || defined(TARGET_LPC4088) || defined(TARGET_LPC176X) || defined(TARGET_LPC11UXX) || defined(TARGET_LPC408X)
gsfan 8:64184a968e3b 73 _uart->MCR |= (1<<6); // RTSEN
gsfan 8:64184a968e3b 74 #endif
gsfan 8:64184a968e3b 75 } else
gsfan 8:64184a968e3b 76 if (_flow == 2) {
gsfan 8:64184a968e3b 77 if (_rts) {
gsfan 8:64184a968e3b 78 _rts->write(0); // low
gsfan 8:64184a968e3b 79 }
gsfan 8:64184a968e3b 80 }
gsfan 8:64184a968e3b 81 } else {
gsfan 8:64184a968e3b 82 // high
gsfan 8:64184a968e3b 83 if (_flow == 1) {
gsfan 16:105b56570533 84 #if defined(TARGET_LPC1768) || defined(TARGET_LPC2368) || defined(TARGET_LPC11U24) || defined(TARGET_LPC4088) || defined(TARGET_LPC176X) || defined(TARGET_LPC11UXX) || defined(TARGET_LPC408X)
gsfan 8:64184a968e3b 85 _uart->MCR &= ~(1<<6); // RTS off
gsfan 8:64184a968e3b 86 _uart->MCR &= ~(1<<1);
gsfan 8:64184a968e3b 87 #endif
gsfan 8:64184a968e3b 88 } else
gsfan 8:64184a968e3b 89 if (_flow == 2) {
gsfan 8:64184a968e3b 90 if (_rts) {
gsfan 8:64184a968e3b 91 _rts->write(1); // high
gsfan 8:64184a968e3b 92 }
gsfan 8:64184a968e3b 93 }
gsfan 8:64184a968e3b 94 }
gsfan 8:64184a968e3b 95 }
gsfan 8:64184a968e3b 96
gsfan 8:64184a968e3b 97 int GSwifi::lockUart (int ms) {
gsfan 8:64184a968e3b 98 Timer t;
gsfan 8:64184a968e3b 99
gsfan 8:64184a968e3b 100 if (_state.mode != MODE_COMMAND) {
gsfan 8:64184a968e3b 101 t.start();
gsfan 8:64184a968e3b 102 while (_state.mode != MODE_COMMAND) {
gsfan 8:64184a968e3b 103 if (t.read_ms() >= ms) {
gsfan 12:057089026a20 104 WARN("lock timeout (%d)\r\n", _state.mode);
gsfan 8:64184a968e3b 105 return -1;
gsfan 8:64184a968e3b 106 }
gsfan 8:64184a968e3b 107 }
gsfan 8:64184a968e3b 108 }
gsfan 8:64184a968e3b 109
gsfan 11:71d67fea5ace 110 #ifdef CFG_ENABLE_RTOS
gsfan 8:64184a968e3b 111 if (_mutexUart.lock(ms) != osOK) return -1;
gsfan 8:64184a968e3b 112 #endif
gsfan 8:64184a968e3b 113
gsfan 8:64184a968e3b 114 if (_flow == 1) {
gsfan 16:105b56570533 115 #if defined(TARGET_LPC1768) || defined(TARGET_LPC2368) || defined(TARGET_LPC11U24) || defined(TARGET_LPC4088) || defined(TARGET_LPC176X) || defined(TARGET_LPC11UXX) || defined(TARGET_LPC408X)
gsfan 8:64184a968e3b 116 if (!(_uart->MSR & (1<<4))) {
gsfan 8:64184a968e3b 117 // CTS check
gsfan 8:64184a968e3b 118 t.start();
gsfan 8:64184a968e3b 119 while (!(_uart->MSR & (1<<4))) {
gsfan 8:64184a968e3b 120 if (t.read_ms() >= ms) {
gsfan 8:64184a968e3b 121 DBG("cts timeout\r\n");
gsfan 8:64184a968e3b 122 return -1;
gsfan 8:64184a968e3b 123 }
gsfan 8:64184a968e3b 124 }
gsfan 8:64184a968e3b 125 }
gsfan 8:64184a968e3b 126 #endif
gsfan 8:64184a968e3b 127 } else
gsfan 8:64184a968e3b 128 if (_flow == 2) {
gsfan 8:64184a968e3b 129 if (_cts && _cts->read()) {
gsfan 8:64184a968e3b 130 // CTS check
gsfan 8:64184a968e3b 131 t.start();
gsfan 8:64184a968e3b 132 while (_cts->read()) {
gsfan 8:64184a968e3b 133 if (t.read_ms() >= ms) {
gsfan 8:64184a968e3b 134 DBG("cts timeout\r\n");
gsfan 8:64184a968e3b 135 return -1;
gsfan 8:64184a968e3b 136 }
gsfan 8:64184a968e3b 137 }
gsfan 8:64184a968e3b 138 }
gsfan 8:64184a968e3b 139 }
gsfan 11:71d67fea5ace 140
gsfan 8:64184a968e3b 141 setRts(false);
gsfan 8:64184a968e3b 142 return 0;
gsfan 8:64184a968e3b 143 }
gsfan 8:64184a968e3b 144
gsfan 8:64184a968e3b 145 void GSwifi::unlockUart () {
gsfan 8:64184a968e3b 146 setRts(true);
gsfan 11:71d67fea5ace 147 #ifdef CFG_ENABLE_RTOS
gsfan 8:64184a968e3b 148 _mutexUart.unlock();
gsfan 8:64184a968e3b 149 #endif
gsfan 8:64184a968e3b 150 }
gsfan 8:64184a968e3b 151
gsfan 8:64184a968e3b 152 void GSwifi::initUart (PinName cts, PinName rts, PinName alarm, int baud) {
gsfan 8:64184a968e3b 153
gsfan 8:64184a968e3b 154 _baud = baud;
gsfan 8:64184a968e3b 155 if (_baud) _gs.baud(_baud);
gsfan 8:64184a968e3b 156 _gs.attach(this, &GSwifi::isrUart, Serial::RxIrq);
gsfan 8:64184a968e3b 157
gsfan 8:64184a968e3b 158 _cts = NULL;
gsfan 8:64184a968e3b 159 _rts = NULL;
gsfan 8:64184a968e3b 160 _flow = 0;
gsfan 16:105b56570533 161 #if defined(TARGET_LPC1768) || defined(TARGET_LPC2368) || defined(TARGET_LPC176X)
gsfan 8:64184a968e3b 162 _uart = LPC_UART1;
gsfan 8:64184a968e3b 163 if (cts == p12) { // CTS input (P0_17)
gsfan 8:64184a968e3b 164 _uart->MCR |= (1<<7); // CTSEN
gsfan 8:64184a968e3b 165 LPC_PINCON->PINSEL1 &= ~(3 << 2);
gsfan 8:64184a968e3b 166 LPC_PINCON->PINSEL1 |= (1 << 2); // UART CTS
gsfan 8:64184a968e3b 167 } else
gsfan 8:64184a968e3b 168 if (cts != NC) {
gsfan 8:64184a968e3b 169 _cts = new DigitalIn(cts);
gsfan 8:64184a968e3b 170 }
gsfan 8:64184a968e3b 171 if (rts == P0_22) { // RTS output (P0_22)
gsfan 8:64184a968e3b 172 _uart->MCR |= (1<<6); // RTSEN
gsfan 8:64184a968e3b 173 LPC_PINCON->PINSEL1 &= ~(3 << 12);
gsfan 8:64184a968e3b 174 LPC_PINCON->PINSEL1 |= (1 << 12); // UART RTS
gsfan 8:64184a968e3b 175 _flow = 1;
gsfan 8:64184a968e3b 176 } else
gsfan 8:64184a968e3b 177 if (rts != NC) {
gsfan 8:64184a968e3b 178 _rts = new DigitalOut(rts);
gsfan 8:64184a968e3b 179 _flow = 2;
gsfan 8:64184a968e3b 180 }
gsfan 16:105b56570533 181 #elif defined(TARGET_LPC11U24) || defined(TARGET_LPC11UXX)
gsfan 8:64184a968e3b 182 _uart = LPC_USART;
gsfan 8:64184a968e3b 183 if (cts == p21) { // CTS input (P0_7)
gsfan 8:64184a968e3b 184 _uart->MCR |= (1<<7); // CTSEN
gsfan 8:64184a968e3b 185 LPC_IOCON->PIO0_7 &= ~0x07;
gsfan 8:64184a968e3b 186 LPC_IOCON->PIO0_7 |= 0x01; // UART CTS
gsfan 8:64184a968e3b 187 } else
gsfan 8:64184a968e3b 188 if (cts != NC) {
gsfan 8:64184a968e3b 189 _cts = new DigitalIn(cts);
gsfan 8:64184a968e3b 190 }
gsfan 8:64184a968e3b 191 if (rts == p22) { // RTS output (P0_17)
gsfan 8:64184a968e3b 192 _uart->MCR |= (1<<6); // RTSEN
gsfan 8:64184a968e3b 193 LPC_IOCON->PIO0_17 &= ~0x07;
gsfan 8:64184a968e3b 194 LPC_IOCON->PIO0_17 |= 0x01; // UART RTS
gsfan 8:64184a968e3b 195 _flow = 1;
gsfan 8:64184a968e3b 196 } else
gsfan 8:64184a968e3b 197 if (rts != NC) {
gsfan 8:64184a968e3b 198 _rts = new DigitalOut(rts);
gsfan 8:64184a968e3b 199 _flow = 2;
gsfan 8:64184a968e3b 200 }
gsfan 16:105b56570533 201 #elif defined(TARGET_LPC4088) || defined(TARGET_LPC408X)
gsfan 19:d035412a7803 202 _uart = (LPC_UART1_TypeDef*)LPC_UART2;
gsfan 15:086d1a33a197 203 if (cts != NC) {
gsfan 8:64184a968e3b 204 _cts = new DigitalIn(cts);
gsfan 15:086d1a33a197 205 }
gsfan 15:086d1a33a197 206 if (rts != NC) {
gsfan 8:64184a968e3b 207 _rts = new DigitalOut(rts);
gsfan 8:64184a968e3b 208 _flow = 2;
gsfan 8:64184a968e3b 209 }
gsfan 8:64184a968e3b 210 #else
gsfan 15:086d1a33a197 211 if (cts != NC) {
gsfan 8:64184a968e3b 212 _cts = new DigitalIn(cts);
gsfan 15:086d1a33a197 213 }
gsfan 15:086d1a33a197 214 if (rts != NC) {
gsfan 8:64184a968e3b 215 _rts = new DigitalOut(rts);
gsfan 8:64184a968e3b 216 _flow = 2;
gsfan 8:64184a968e3b 217 }
gsfan 8:64184a968e3b 218 #endif
gsfan 8:64184a968e3b 219
gsfan 8:64184a968e3b 220 if (alarm != NC) {
gsfan 8:64184a968e3b 221 _alarm = new DigitalInOut(alarm);
gsfan 8:64184a968e3b 222 } else {
gsfan 8:64184a968e3b 223 _alarm = NULL;
gsfan 8:64184a968e3b 224 }
gsfan 8:64184a968e3b 225 }
gsfan 22:d25a5a0d2497 226
gsfan 22:d25a5a0d2497 227 #ifdef CFG_SPI_DATAINTERFACE
gsfan 22:d25a5a0d2497 228 void GSwifi::putSpi (char c) {
gsfan 22:d25a5a0d2497 229 _spi.write(c);
gsfan 22:d25a5a0d2497 230 }
gsfan 22:d25a5a0d2497 231
gsfan 22:d25a5a0d2497 232 void GSwifi::isrSpi () {
gsfan 22:d25a5a0d2497 233 char c;
gsfan 22:d25a5a0d2497 234
gsfan 22:d25a5a0d2497 235 while (_wake == 1) {
gsfan 22:d25a5a0d2497 236 c = _spi.write(0xf5);
gsfan 22:d25a5a0d2497 237 recvData(c);
gsfan 22:d25a5a0d2497 238 }
gsfan 22:d25a5a0d2497 239 }
gsfan 22:d25a5a0d2497 240
gsfan 22:d25a5a0d2497 241 int GSwifi::lockSpi (int ms) {
gsfan 22:d25a5a0d2497 242 Timer t;
gsfan 22:d25a5a0d2497 243
gsfan 22:d25a5a0d2497 244 if (_state.mode != MODE_COMMAND) {
gsfan 22:d25a5a0d2497 245 t.start();
gsfan 22:d25a5a0d2497 246 while (_state.mode != MODE_COMMAND) {
gsfan 22:d25a5a0d2497 247 if (t.read_ms() >= ms) {
gsfan 22:d25a5a0d2497 248 WARN("lock timeout (%d)\r\n", _state.mode);
gsfan 22:d25a5a0d2497 249 return -1;
gsfan 22:d25a5a0d2497 250 }
gsfan 22:d25a5a0d2497 251 }
gsfan 22:d25a5a0d2497 252 }
gsfan 22:d25a5a0d2497 253
gsfan 22:d25a5a0d2497 254 #ifdef CFG_ENABLE_RTOS
gsfan 22:d25a5a0d2497 255 if (_mutexSpi.lock(ms) != osOK) return -1;
gsfan 22:d25a5a0d2497 256 #endif
gsfan 22:d25a5a0d2497 257
gsfan 22:d25a5a0d2497 258 if (_wake.read()) {
gsfan 22:d25a5a0d2497 259 t.start();
gsfan 22:d25a5a0d2497 260 while (_wake.read()) {
gsfan 22:d25a5a0d2497 261 if (t.read_ms() >= ms) {
gsfan 22:d25a5a0d2497 262 DBG("hostwake timeout\r\n");
gsfan 22:d25a5a0d2497 263 return -1;
gsfan 22:d25a5a0d2497 264 }
gsfan 22:d25a5a0d2497 265 }
gsfan 22:d25a5a0d2497 266 }
gsfan 22:d25a5a0d2497 267 return 0;
gsfan 22:d25a5a0d2497 268 }
gsfan 22:d25a5a0d2497 269
gsfan 22:d25a5a0d2497 270 void GSwifi::unlockSpi () {
gsfan 22:d25a5a0d2497 271 #ifdef CFG_ENABLE_RTOS
gsfan 22:d25a5a0d2497 272 _mutexSpi.unlock();
gsfan 22:d25a5a0d2497 273 #endif
gsfan 22:d25a5a0d2497 274 }
gsfan 22:d25a5a0d2497 275
gsfan 22:d25a5a0d2497 276 void GSwifi::initSpi (PinName cs, int freq) {
gsfan 22:d25a5a0d2497 277 _spi.format(8, 0);
gsfan 22:d25a5a0d2497 278 _spi.frequency(freq);
gsfan 22:d25a5a0d2497 279 _wake.mode(PullDown);
gsfan 22:d25a5a0d2497 280 _wake.rise(this, &GSwifi::isrSpi);
gsfan 22:d25a5a0d2497 281
gsfan 22:d25a5a0d2497 282 #if defined(TARGET_LPC1768) || defined(TARGET_LPC2368) || defined(TARGET_LPC176X)
gsfan 22:d25a5a0d2497 283 if (cs == p8) { // SPI_1 (P0_6)
gsfan 22:d25a5a0d2497 284 LPC_PINCON->PINSEL0 &= ~(3 << 12);
gsfan 22:d25a5a0d2497 285 LPC_PINCON->PINSEL0 |= (2 << 12); // SSEL1
gsfan 22:d25a5a0d2497 286 } else
gsfan 22:d25a5a0d2497 287 if (cs == p14) { // (SPI_0) P0_16
gsfan 22:d25a5a0d2497 288 LPC_PINCON->PINSEL1 &= ~(3 << 0);
gsfan 22:d25a5a0d2497 289 LPC_PINCON->PINSEL1 |= (2 << 0); // SSEL0
gsfan 22:d25a5a0d2497 290 } else
gsfan 22:d25a5a0d2497 291 if (cs == P1_21) { // (SPI_0) P1_21
gsfan 22:d25a5a0d2497 292 LPC_PINCON->PINSEL3 &= ~(3 << 10);
gsfan 22:d25a5a0d2497 293 LPC_PINCON->PINSEL3 |= (3 << 10); // SSEL0
gsfan 22:d25a5a0d2497 294 }
gsfan 22:d25a5a0d2497 295 #endif
gsfan 22:d25a5a0d2497 296 }
gsfan 22:d25a5a0d2497 297 #endif