blob: 526e22c751a69f9eb8f6ab65f8ada77693932115 [file] [log] [blame]
/*
*
* Copyright (c) 2022 Project CHIP Authors
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
#pragma once
#include "sl_si91x_types.h"
#include "stdbool.h"
#include "wfx_msgs.h"
/* LwIP includes. */
#include "lwip/apps/httpd.h"
#include "lwip/ip_addr.h"
#include "lwip/netif.h"
#include "lwip/netifapi.h"
#include "lwip/tcpip.h"
#include "sl_wifi_constants.h"
#include "sl_status.h"
#include "rsi_common_apis.h"
#include "sl_wifi_device.h"
#define SL_WIFI_ALLOCATE_COMMAND_BUFFER_WAIT_TIME_MS 1000
/* Wi-Fi events*/
#define SL_WFX_STARTUP_IND_ID (1)
#define SL_WFX_CONNECT_IND_ID (2)
#define SL_WFX_DISCONNECT_IND_ID (3)
#define SL_WFX_SCAN_COMPLETE_ID (4)
#define WFX_RSI_SSID_SIZE (64)
/* Wi-Fi bitmask events - for the task */
#define SL_WFX_CONNECT (1 << 1)
#define SL_WFX_DISCONNECT (1 << 2)
#define SL_WFX_START_AP (1 << 3)
#define SL_WFX_STOP_AP (1 << 4)
#define SL_WFX_SCAN_START (1 << 5)
#define SL_WFX_SCAN_COMPLETE (1 << 6)
#define SL_WFX_RETRY_CONNECT (1 << 7)
#define WLAN_TASK_STACK_SIZE (1024)
#define WLAN_TASK_PRIORITY (3)
#define WLAN_DRIVER_TASK_PRIORITY (2)
#define MAX_JOIN_RETRIES_COUNT (5)
// WLAN retry time intervals in milli seconds
#define WLAN_MAX_RETRY_TIMER_MS 30000
#define WLAN_MIN_RETRY_TIMER_MS 1000
#define WLAN_RETRY_TIMER_MS 5000
#define CONVERT_MS_TO_SEC(TimeInMS) (TimeInMS / 1000)
// WLAN related Macros
#define ETH_FRAME (0)
#define CMP_SUCCESS (0)
#define BSSID_MAX_STR_LEN (6)
#define MAC_ADDRESS_FIRST_OCTET (6)
#define AP_START_SUCCESS (0)
#define BITS_TO_WAIT (0)
#define CONNECTION_STATUS_SUCCESS (1)
#define IP_STATUS_FAIL (0)
#define GET_IPV6_SUCCESS (1)
#define GET_IPV6_FAIL (0)
#define BEACON_1 (0)
#define CHANNEL_LIST ((const uint8_t *) 0)
#define CHANNEL_COUNT (0)
#define IE_DATA ((const uint8_t *) 0)
#define IE_DATA_LENGTH (0)
#define BSSID_SCAN ((const uint8_t *) 0)
#define CHANNEL_0 (0)
#define PREVENT_ROAMING (1)
#define DISABLE_PMF_MODE (0)
#define STA_IP_FAIL (0)
#define IP_STATUS_SUCCESS (1)
#define ACTIVE_CHANNEL_TIME_100 (100)
#define PASSIVE_CHANNEL_TIME_0 (0)
#define PROBE_NUM_REQ_1 (1)
#define PINOUT_CLEAR_STATUS (0)
#define TICKS_TO_WAIT_0 (0)
#define TICKS_TO_WAIT_3 (3)
#define TICKS_TO_WAIT_1 (1)
#define TICKS_TO_WAIT_500 (500)
// TASK and Interrupt Macros
#define SUCCESS_STATUS (1)
#define LINK_UP (1)
#define LINK_DOWN (0)
#define MAC_48_BIT_SET (1)
#define STRUCT_PBUF ((struct pbuf *) 0)
#define PRIORITY_0 (0)
#define HEX_VALUE_FF (0XFF)
// Timer Delay
#define MAX_XLEN (16)
#define MIN_XLEN (0)
#define PINOUT_CLEAR (0)
#define PINOUT_SET (1)
#define WFX_SPI_NVIC_PRIORITY (5)
#define WFX_GPIO_NVIC_PRIORITY (5)
#define CB_VALUE ((DMADRV_Callback_t) 0)
/* TIMER_TICKS_TO_WAIT Specifies the time, in ticks, that the calling task should
* be held in the Blocked state to wait for the start command to be successfully
* sent to the timer command queue.
*/
#define CONVERT_SEC_TO_MSEC (1000)
#define CONVERT_USEC_TO_MSEC (1 / 1000)
#define RSI_RESPONSE_MAX_SIZE (28)
#define RSI_RESPONSE_HOLD_BUFF_SIZE (128)
#define RSI_DRIVER_STATUS (0)
#define OPER_MODE_0 (0)
#define COEX_MODE_0 (0)
#define RESP_BUFF_SIZE (6)
#define AP_CHANNEL_NO_0 (0)
#define SCAN_BITMAP_OPTN_1 (1)
#define IP_CONF_RSP_BUFF_LENGTH_4 (4)
#define STATION (0)
#define SPI_CONFIG_SUCCESS (0)
typedef enum
{
WIFI_EVENT,
IP_EVENT,
} wfx_event_base_t;
typedef enum
{
IP_EVENT_STA_GOT_IP,
IP_EVENT_GOT_IP6,
IP_EVENT_STA_LOST_IP,
} ip_event_id_t;
/* Note that these are same as RSI_security */
typedef enum
{
WFX_SEC_UNSPECIFIED = 0,
WFX_SEC_NONE = 1,
WFX_SEC_WEP = 2,
WFX_SEC_WPA = 3,
WFX_SEC_WPA2 = 4,
WFX_SEC_WPA3 = 5
} wfx_sec_t;
typedef struct
{
char ssid[32 + 1];
char passkey[64 + 1];
wfx_sec_t security;
} wfx_wifi_provision_t;
typedef enum
{
WIFI_MODE_NULL = 0,
WIFI_MODE_STA,
WIFI_MODE_AP,
WIFI_MODE_APSTA,
WIFI_MODE_MAX,
} wifi_mode_t;
typedef struct wfx_wifi_scan_result
{
char ssid[32 + 1];
wfx_sec_t security;
uint8_t bssid[6];
uint8_t chan;
int16_t rssi; /* I suspect this is in dBm - so signed */
} wfx_wifi_scan_result_t;
typedef struct wfx_wifi_scan_ext
{
uint32_t beacon_lost_count;
uint32_t beacon_rx_count;
uint32_t mcast_rx_count;
uint32_t mcast_tx_count;
uint32_t ucast_rx_count;
uint32_t ucast_tx_count;
uint32_t overrun_count;
} wfx_wifi_scan_ext_t;
typedef enum
{
SL_WFX_STA_INTERFACE = 0, ///< Interface 0, linked to the station
SL_WFX_SOFTAP_INTERFACE = 1, ///< Interface 1, linked to the softap
} sl_wfx_interface_t;
#ifdef __cplusplus
extern "C" {
#endif
sl_status_t wfx_wifi_start(void);
void wfx_enable_sta_mode(void);
void wfx_get_wifi_mac_addr(sl_wfx_interface_t interface, sl_wfx_mac_address_t * addr);
void wfx_set_wifi_provision(wfx_wifi_provision_t * wifiConfig);
bool wfx_get_wifi_provision(wfx_wifi_provision_t * wifiConfig);
bool wfx_is_sta_mode_enabled(void);
int32_t wfx_get_ap_info(wfx_wifi_scan_result_t * ap);
int32_t wfx_get_ap_ext(wfx_wifi_scan_ext_t * extra_info);
int32_t wfx_reset_counts();
void wfx_clear_wifi_provision(void);
sl_status_t wfx_connect_to_ap(void);
void wfx_setup_ip6_link_local(sl_wfx_interface_t);
bool wfx_is_sta_connected(void);
sl_status_t wfx_sta_discon(void);
#if CHIP_DEVICE_CONFIG_ENABLE_IPV4
bool wfx_have_ipv4_addr(sl_wfx_interface_t);
#endif /* CHIP_DEVICE_CONFIG_ENABLE_IPV4 */
bool wfx_have_ipv6_addr(sl_wfx_interface_t);
wifi_mode_t wfx_get_wifi_mode(void);
bool wfx_start_scan(char * ssid, void (*scan_cb)(wfx_wifi_scan_result_t *)); /* true returned if successfully started */
void wfx_cancel_scan(void);
/*
* Call backs into the Matter Platform code
*/
void wfx_started_notify(void);
void wfx_connected_notify(int32_t status, sl_wfx_mac_address_t * ap);
void wfx_disconnected_notify(int32_t status);
/* Implemented for LWIP */
void wfx_host_received_sta_frame_cb(uint8_t * buf, int len);
void wfx_lwip_set_sta_link_up(void);
void wfx_lwip_set_sta_link_down(void);
void wfx_lwip_start(void);
struct netif * wfx_get_netif(sl_wfx_interface_t interface);
bool wfx_hw_ready(void);
#if CHIP_DEVICE_CONFIG_ENABLE_IPV4
void wfx_dhcp_got_ipv4(uint32_t);
void wfx_ip_changed_notify(int got_ip);
#endif /* CHIP_DEVICE_CONFIG_ENABLE_IPV4 */
#if SL_ICD_ENABLED
sl_status_t wfx_power_save(rsi_power_save_profile_mode_t sl_si91x_ble_state, sl_si91x_performance_profile_t sl_si91x_wifi_state);
void sl_button_on_change(uint8_t btn, uint8_t btnAction);
#endif /* SL_ICD_ENABLED */
void wfx_ipv6_notify(int got_ip);
/* RSI for LWIP */
void wfx_rsi_pkt_add_data(void * p, uint8_t * buf, uint16_t len, uint16_t off);
int32_t wfx_rsi_send_data(void * p, uint16_t len);
sl_status_t sl_si91x_driver_send_data_packet(sl_si91x_queue_type_t queue_type, sl_wifi_buffer_t * buffer, uint32_t wait_time);
sl_status_t sl_si91x_allocate_command_buffer(sl_wifi_buffer_t ** host_buffer, void ** buffer, uint32_t requested_buffer_size,
uint32_t wait_duration_ms);
void wfx_retry_interval_handler(bool is_wifi_disconnection_event, uint16_t retryJoin);
#ifdef __cplusplus
}
#endif