Extending the X_NUCLEO_IDW01M1 to allow configuration of the board as an access point

Dependents:   X_NUCLEO_IDW01M1_AP_Test

Fork of X_NUCLEO_IDW01M1 by ST

Committer:
mridup
Date:
Sat May 14 08:31:39 2016 +0000
Revision:
12:3799f8475c8a
Parent:
8:0f302a13e21b
Child:
22:a1276b7d3b2d
comments added.

Who changed what in which revision?

UserRevisionLine numberNew contents of line
mridup 0:dc55f40eb04f 1 /**
mridup 0:dc55f40eb04f 2 ******************************************************************************
mridup 0:dc55f40eb04f 3 * @file wifi_driver.c
mridup 0:dc55f40eb04f 4 * @author Central LAB
mridup 0:dc55f40eb04f 5 * @version V2.0.0
mridup 0:dc55f40eb04f 6 * @date 01-March-2016
mridup 0:dc55f40eb04f 7 * @brief Enable Wi-Fi functionality using AT cmd set
mridup 0:dc55f40eb04f 8 ******************************************************************************
mridup 0:dc55f40eb04f 9 * @attention
mridup 0:dc55f40eb04f 10 *
mridup 0:dc55f40eb04f 11 * <h2><center>&copy; COPYRIGHT(c) 2015 STMicroelectronics</center></h2>
mridup 0:dc55f40eb04f 12 *
mridup 0:dc55f40eb04f 13 * Redistribution and use in source and binary forms, with or without modification,
mridup 0:dc55f40eb04f 14 * are permitted provided that the following conditions are met:
mridup 0:dc55f40eb04f 15 * 1. Redistributions of source code must retain the above copyright notice,
mridup 0:dc55f40eb04f 16 * this list of conditions and the following disclaimer.
mridup 0:dc55f40eb04f 17 * 2. Redistributions in binary form must reproduce the above copyright notice,
mridup 0:dc55f40eb04f 18 * this list of conditions and the following disclaimer in the documentation
mridup 0:dc55f40eb04f 19 * and/or other materials provided with the distribution.
mridup 0:dc55f40eb04f 20 * 3. Neither the name of STMicroelectronics nor the names of its contributors
mridup 0:dc55f40eb04f 21 * may be used to endorse or promote products derived from this software
mridup 0:dc55f40eb04f 22 * without specific prior written permission.
mridup 0:dc55f40eb04f 23 *
mridup 0:dc55f40eb04f 24 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
mridup 0:dc55f40eb04f 25 * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
mridup 0:dc55f40eb04f 26 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
mridup 0:dc55f40eb04f 27 * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
mridup 0:dc55f40eb04f 28 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
mridup 0:dc55f40eb04f 29 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
mridup 0:dc55f40eb04f 30 * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
mridup 0:dc55f40eb04f 31 * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
mridup 0:dc55f40eb04f 32 * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
mridup 0:dc55f40eb04f 33 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
mridup 0:dc55f40eb04f 34 *
mridup 0:dc55f40eb04f 35 ******************************************************************************
mridup 0:dc55f40eb04f 36 */
mridup 0:dc55f40eb04f 37 /* Includes ------------------------------------------------------------------*/
mridup 0:dc55f40eb04f 38
mridup 0:dc55f40eb04f 39 #include <stddef.h>
mridup 0:dc55f40eb04f 40 #include "wifi_module.h"
mridup 0:dc55f40eb04f 41 #include "ring_buffer.h"
mridup 0:dc55f40eb04f 42 #include "device.h"
mridup 0:dc55f40eb04f 43 #include "wait_api.h"
mridup 0:dc55f40eb04f 44 #include "stdio.h"
mridup 0:dc55f40eb04f 45 #include "string.h"
mridup 0:dc55f40eb04f 46 #include "wifi_driver.h"
mridup 0:dc55f40eb04f 47
mridup 12:3799f8475c8a 48 /**
mridup 12:3799f8475c8a 49 * @brief Wi-Fi System Tick IRQ handler
mridup 12:3799f8475c8a 50 * retrieves byte(s) from the ring buffer
mridup 12:3799f8475c8a 51 * @param None
mridup 12:3799f8475c8a 52 * @retval None
mridup 12:3799f8475c8a 53 */
mridup 0:dc55f40eb04f 54 void Wifi_ticker(void)
mridup 0:dc55f40eb04f 55 {
mridup 0:dc55f40eb04f 56 Wifi_SysTick_Isr();
mridup 0:dc55f40eb04f 57 }
mridup 0:dc55f40eb04f 58
mridup 12:3799f8475c8a 59 /**
mridup 12:3799f8475c8a 60 * @brief Wi-Fi Scheduler handler
mridup 12:3799f8475c8a 61 * Fetches events from event buffer/makes callbacks to User
mridup 12:3799f8475c8a 62 * @param None
mridup 12:3799f8475c8a 63 * @retval None
mridup 12:3799f8475c8a 64 */
mridup 0:dc55f40eb04f 65 void Wifi_scheduler(void)
mridup 0:dc55f40eb04f 66 {
mridup 0:dc55f40eb04f 67 Wifi_TIM_Handler();
mridup 0:dc55f40eb04f 68 }
mridup 0:dc55f40eb04f 69
mridup 12:3799f8475c8a 70 /**
mridup 12:3799f8475c8a 71 * @brief UART RX IRQ handler
mridup 12:3799f8475c8a 72 * stores a byte to the ring buffer
mridup 12:3799f8475c8a 73 * @param None
mridup 12:3799f8475c8a 74 * @retval None
mridup 12:3799f8475c8a 75 */
mridup 0:dc55f40eb04f 76 void Rx_irq_handler(void)
mridup 0:dc55f40eb04f 77 {
mridup 0:dc55f40eb04f 78
mridup 0:dc55f40eb04f 79 uint8_t data_byte = (uint8_t)callSpwfSADevice_getChar(spwf_dev);
mridup 0:dc55f40eb04f 80
mridup 0:dc55f40eb04f 81 status_flag.Uartx_Rx_Processing = WIFI_FALSE;
mridup 0:dc55f40eb04f 82
mridup 0:dc55f40eb04f 83 Stop_Timer();
mridup 0:dc55f40eb04f 84 __disable_irq();
mridup 0:dc55f40eb04f 85 push_buffer(&big_buff, &data_byte);
mridup 0:dc55f40eb04f 86 __enable_irq();
mridup 0:dc55f40eb04f 87 Start_Timer();
mridup 0:dc55f40eb04f 88
mridup 0:dc55f40eb04f 89 status_flag.Uartx_Rx_Processing = WIFI_TRUE;
mridup 0:dc55f40eb04f 90
mridup 0:dc55f40eb04f 91 /*if(is_half_full(&big_buff))
mridup 0:dc55f40eb04f 92 {
mridup 0:dc55f40eb04f 93 status_flag.resume_receive_data = WIFI_TRUE;
mridup 0:dc55f40eb04f 94 if(callSpwfSADevice_read_rts(spwf_dev))
mridup 0:dc55f40eb04f 95 callSpwfSADevice_rts(spwf_dev, GPIO_PIN_SET);
mridup 0:dc55f40eb04f 96 //callSpwfSADevice_attach(0);
mridup 0:dc55f40eb04f 97 } else
mridup 0:dc55f40eb04f 98 {
mridup 0:dc55f40eb04f 99 if(status_flag.AT_Cmd_Processing == WIFI_FALSE)
mridup 0:dc55f40eb04f 100 {
mridup 0:dc55f40eb04f 101 status_flag.Uartx_Rx_Processing = WIFI_TRUE;
mridup 0:dc55f40eb04f 102 }
mridup 0:dc55f40eb04f 103 }*/
mridup 0:dc55f40eb04f 104 }
mridup 0:dc55f40eb04f 105
mridup 0:dc55f40eb04f 106
mridup 0:dc55f40eb04f 107 /**
mridup 0:dc55f40eb04f 108 * @brief wifi_reset
mridup 0:dc55f40eb04f 109 * Reset WiFi module using PC12 gpio pin
mridup 0:dc55f40eb04f 110 * @param None
mridup 0:dc55f40eb04f 111 * @retval None
mridup 0:dc55f40eb04f 112 */
mridup 0:dc55f40eb04f 113 void wifi_reset(void)
mridup 0:dc55f40eb04f 114 {
mridup 0:dc55f40eb04f 115 WiFi_Module_State = Process_Event;
mridup 0:dc55f40eb04f 116 WiFi_WIND_State.WiFiHWStarted = WIFI_FALSE;
mridup 0:dc55f40eb04f 117 wifi_connected = 0; //reset wifi_connected to get user callback
mridup 0:dc55f40eb04f 118 memset((void*)&WiFi_WIND_State,0x00,sizeof(WiFi_WIND_State)); /*reset the WIND State?*/
mridup 0:dc55f40eb04f 119
mridup 0:dc55f40eb04f 120 /* === RESET PIN - PC12 ===*/
mridup 0:dc55f40eb04f 121
mridup 0:dc55f40eb04f 122 callSpwfSADevice_reset(spwf_dev, 0);
mridup 1:bd9db471d47d 123 wait_ms(200);
mridup 0:dc55f40eb04f 124
mridup 0:dc55f40eb04f 125 callSpwfSADevice_reset(spwf_dev, 1);
mridup 0:dc55f40eb04f 126 wait_ms(100);
mridup 0:dc55f40eb04f 127
mridup 0:dc55f40eb04f 128 while(WiFi_WIND_State.WiFiHWStarted != WIFI_TRUE)
mridup 0:dc55f40eb04f 129 {
mridup 0:dc55f40eb04f 130 //nothing to do
mridup 0:dc55f40eb04f 131 __NOP();
mridup 0:dc55f40eb04f 132 }
mridup 0:dc55f40eb04f 133 }
mridup 0:dc55f40eb04f 134
mridup 0:dc55f40eb04f 135
mridup 0:dc55f40eb04f 136 /**
mridup 0:dc55f40eb04f 137 * @brief PowerUp_WiFi_Module
mridup 0:dc55f40eb04f 138 * Power up Wi-Fi module,SET GPIO PA0 pin
mridup 0:dc55f40eb04f 139 * @param None
mridup 0:dc55f40eb04f 140 * @retval None
mridup 0:dc55f40eb04f 141 */
mridup 0:dc55f40eb04f 142 void PowerUp_WiFi_Module(void)
mridup 0:dc55f40eb04f 143 {
mridup 0:dc55f40eb04f 144 /* === SET PIN - PC12 ===*/
mridup 0:dc55f40eb04f 145 callSpwfSADevice_reset(spwf_dev, 1);
mridup 0:dc55f40eb04f 146 wait_ms(50);
mridup 0:dc55f40eb04f 147 }
mridup 0:dc55f40eb04f 148
mridup 0:dc55f40eb04f 149 /**
mridup 0:dc55f40eb04f 150 * @brief Receive_Data
mridup 0:dc55f40eb04f 151 * Receive data from UART port
mridup 0:dc55f40eb04f 152 * @param uint8_t number of bytes to be received
mridup 0:dc55f40eb04f 153 * @retval None
mridup 0:dc55f40eb04f 154 */
mridup 0:dc55f40eb04f 155 void Receive_Data(void)
mridup 0:dc55f40eb04f 156 {
mridup 0:dc55f40eb04f 157 callSpwfSADevice_rts(spwf_dev, 0);
mridup 0:dc55f40eb04f 158 }
mridup 0:dc55f40eb04f 159
mridup 0:dc55f40eb04f 160
mridup 0:dc55f40eb04f 161 /**
mridup 0:dc55f40eb04f 162 * @brief USART_Transmit_AT_Cmd
mridup 0:dc55f40eb04f 163 * send AT cmd on UART port of wifi module.
mridup 0:dc55f40eb04f 164 * @param size size of the AT command
mridup 0:dc55f40eb04f 165 * @retval WiFi_Status_t : status of AT cmd
mridup 0:dc55f40eb04f 166 */
mridup 0:dc55f40eb04f 167 WiFi_Status_t USART_Transmit_AT_Cmd(uint16_t size)
mridup 0:dc55f40eb04f 168 {
mridup 0:dc55f40eb04f 169 //Check for Hardware Started
mridup 0:dc55f40eb04f 170 if(status_flag.WiFi_Enabled == WIFI_FALSE)
mridup 0:dc55f40eb04f 171 return WiFi_NOT_READY;
mridup 0:dc55f40eb04f 172 //Check for Deep-Sleep or Standby Mode, return error if true
mridup 0:dc55f40eb04f 173 if (status_flag.Standby_Enabled == WIFI_TRUE || status_flag.Deep_Sleep_Enabled == WIFI_TRUE)
mridup 0:dc55f40eb04f 174 return WiFi_IN_LOW_POWER_ERROR;
mridup 0:dc55f40eb04f 175
mridup 0:dc55f40eb04f 176 status_flag.AT_Cmd_Processing = WIFI_TRUE;//Stop Any Rx between the TX call
mridup 0:dc55f40eb04f 177
mridup 0:dc55f40eb04f 178 if (size == 0)
mridup 0:dc55f40eb04f 179 {
mridup 0:dc55f40eb04f 180 return WiFi_UNHANDLED_IND_ERROR;
mridup 0:dc55f40eb04f 181 }
mridup 0:dc55f40eb04f 182
mridup 0:dc55f40eb04f 183 #if defined(USART3_INT_MODE)
mridup 0:dc55f40eb04f 184 if(HAL_UART_Transmit_IT(&UartWiFiHandle, (uint8_t *)WiFi_AT_Cmd_Buff, size)!= HAL_OK)
mridup 0:dc55f40eb04f 185 {
mridup 0:dc55f40eb04f 186 Error_Handler();
mridup 0:dc55f40eb04f 187 return WiFi_HAL_UART_ERROR;
mridup 0:dc55f40eb04f 188 }
mridup 0:dc55f40eb04f 189 while (UartReady != SET);
mridup 0:dc55f40eb04f 190 UartReady = RESET;
mridup 0:dc55f40eb04f 191
mridup 0:dc55f40eb04f 192 #elif defined(USART3_POLLING_MODE)
mridup 0:dc55f40eb04f 193
mridup 8:0f302a13e21b 194 write_size = callSpwfSADevice_write(spwf_dev, (const char *) WiFi_AT_Cmd_Buff, size);
mridup 0:dc55f40eb04f 195
mridup 0:dc55f40eb04f 196 #else
mridup 0:dc55f40eb04f 197 #error "Please select USART mode in your application (in wifi_module.h file)"
mridup 0:dc55f40eb04f 198 #endif
mridup 0:dc55f40eb04f 199
mridup 0:dc55f40eb04f 200 status_flag.AT_Cmd_Processing = WIFI_FALSE;//Re-enable Rx for UART
mridup 0:dc55f40eb04f 201 if(status_flag.Uartx_Rx_Processing == WIFI_FALSE)
mridup 0:dc55f40eb04f 202 Receive_Data();//Start receiving Rx from the UART again, if and only if it was stopped in the previous Uartx_Rx_Handler
mridup 0:dc55f40eb04f 203 return WiFi_MODULE_SUCCESS;
mridup 0:dc55f40eb04f 204 }
mridup 0:dc55f40eb04f 205
mridup 6:e7a3fca2df10 206 /**
mridup 6:e7a3fca2df10 207 * @brief wifi_socket_server_write
mridup 6:e7a3fca2df10 208 * Write to a Server socket
mridup 6:e7a3fca2df10 209 * @param None
mridup 6:e7a3fca2df10 210 * @retval WiFi_Status_t : return status of server socket request
mridup 6:e7a3fca2df10 211 */
mridup 8:0f302a13e21b 212 int wifi_socket_server_write(uint16_t DataLength,char * pData)
mridup 6:e7a3fca2df10 213 {
mridup 6:e7a3fca2df10 214 WiFi_Status_t status = WiFi_MODULE_SUCCESS;
mridup 6:e7a3fca2df10 215 /*Can only write if there is a client connected*/
mridup 6:e7a3fca2df10 216 if(!wifi_client_connected)
mridup 6:e7a3fca2df10 217 {
mridup 6:e7a3fca2df10 218 return WiFi_NOT_READY;
mridup 6:e7a3fca2df10 219 }
mridup 6:e7a3fca2df10 220 __disable_irq();
mridup 6:e7a3fca2df10 221
mridup 6:e7a3fca2df10 222 status_flag.do_not_reset_push_WIFI_event = WIFI_TRUE;
mridup 6:e7a3fca2df10 223 status_flag.prevent_push_WIFI_event = WIFI_TRUE;
mridup 6:e7a3fca2df10 224 __enable_irq();
mridup 6:e7a3fca2df10 225
mridup 6:e7a3fca2df10 226 while(status_flag.sock_read_ongoing || WIND64_count!= 0)//wait till any pending data is read
mridup 6:e7a3fca2df10 227 {
mridup 6:e7a3fca2df10 228 asm("NOP");
mridup 6:e7a3fca2df10 229 }
mridup 6:e7a3fca2df10 230
mridup 6:e7a3fca2df10 231 wait_for_command_mode();
mridup 6:e7a3fca2df10 232
mridup 6:e7a3fca2df10 233 /*to make sure that by default the mode is not switched to command mode from data mode*/
mridup 6:e7a3fca2df10 234 status_flag.switch_by_default_to_command_mode = WIFI_FALSE;
mridup 6:e7a3fca2df10 235
mridup 6:e7a3fca2df10 236 /*Switch to Data Mode first*/
mridup 6:e7a3fca2df10 237 if(!status_flag.data_mode)
mridup 6:e7a3fca2df10 238 {
mridup 6:e7a3fca2df10 239 WiFi_switch_to_data_mode();//switch by default
mridup 6:e7a3fca2df10 240 while(!status_flag.data_mode)
mridup 6:e7a3fca2df10 241 {
mridup 6:e7a3fca2df10 242 //Wait till data_mode is active
mridup 6:e7a3fca2df10 243 asm("NOP");
mridup 6:e7a3fca2df10 244 }
mridup 6:e7a3fca2df10 245 }
mridup 6:e7a3fca2df10 246
mridup 8:0f302a13e21b 247 write_size = callSpwfSADevice_write(spwf_dev, (const char *) pData, DataLength);
mridup 6:e7a3fca2df10 248
mridup 6:e7a3fca2df10 249 /*Write the data on the uart*/
mridup 6:e7a3fca2df10 250 /*if(HAL_UART_Transmit(&UartWiFiHandle, (uint8_t *)pData, DataLength,1000)!= HAL_OK)
mridup 6:e7a3fca2df10 251 {
mridup 6:e7a3fca2df10 252 Error_Handler();
mridup 6:e7a3fca2df10 253 return WiFi_HAL_UART_ERROR;
mridup 6:e7a3fca2df10 254 }*/
mridup 6:e7a3fca2df10 255 //HAL_Delay(100);//Wait for tx before switching back to command mode
mridup 6:e7a3fca2df10 256
mridup 6:e7a3fca2df10 257 /*Switch back to Command Mode*/
mridup 6:e7a3fca2df10 258 if(!status_flag.command_mode)
mridup 6:e7a3fca2df10 259 {
mridup 6:e7a3fca2df10 260 WiFi_switch_to_command_mode();//switch by default
mridup 6:e7a3fca2df10 261 while(!status_flag.command_mode)
mridup 6:e7a3fca2df10 262 {
mridup 6:e7a3fca2df10 263 //Wait till command_mode is active
mridup 6:e7a3fca2df10 264 asm("NOP");
mridup 6:e7a3fca2df10 265 }
mridup 6:e7a3fca2df10 266 }
mridup 6:e7a3fca2df10 267
mridup 6:e7a3fca2df10 268 status_flag.switch_by_default_to_command_mode = WIFI_TRUE; /*back to default behaviour*/
mridup 6:e7a3fca2df10 269
mridup 6:e7a3fca2df10 270 __disable_irq();
mridup 6:e7a3fca2df10 271 status_flag.prevent_push_WIFI_event = WIFI_FALSE;
mridup 6:e7a3fca2df10 272 status_flag.do_not_reset_push_WIFI_event = WIFI_FALSE;
mridup 6:e7a3fca2df10 273 __enable_irq();
mridup 6:e7a3fca2df10 274
mridup 8:0f302a13e21b 275 if(status==WiFi_MODULE_SUCCESS)
mridup 8:0f302a13e21b 276 return write_size;
mridup 8:0f302a13e21b 277 else
mridup 8:0f302a13e21b 278 return -1;
mridup 8:0f302a13e21b 279 //return status;
mridup 6:e7a3fca2df10 280 }