feat(wifi): refactor and add more wifi feature for 11n certificate

This commit is contained in:
Zhang Jun Hao
2019-08-12 14:06:25 +08:00
parent f12b37bdf5
commit 53813599e9
7 changed files with 204 additions and 41 deletions

View File

@ -323,7 +323,7 @@ config ESP_ERR_TO_NAME_LOOKUP
endmenu endmenu
menu WIFI menu Wi-Fi
config SCAN_AP_MAX config SCAN_AP_MAX
int "Max scan AP number" int "Max scan AP number"
@ -336,12 +336,84 @@ config SCAN_AP_MAX
User can use own function "esp_wifi_scan_get_ap_num_max" to determin how many AP to scan , too. User can use own function "esp_wifi_scan_get_ap_num_max" to determin how many AP to scan , too.
config WIFI_TX_RATE_SEQUENCE_FROM_HIGH config WIFI_TX_RATE_SEQUENCE_FROM_HIGH
bool "Set wifi tx rate from 54M to 1M" bool "Set WiFi TX rate from 54M to 1M"
default y default y
help help
If this option is enabled, Wifi will try to send packets first from high rate(54M). If it fails, it will If this option is enabled, WiFi will try to send packets first from high rate(54M). If it fails, it will
try at low rate until the transmission is successful. try at low rate until the transmission is successful.
config ESP8266_WIFI_QOS_ENABLED
bool "WiFi QoS"
default n
help
Select this option to enable QoS feature
config ESP8266_WIFI_AMPDU_RX_ENABLED
bool "WiFi AMPDU RX"
default n
help
Select this option to enable AMPDU RX feature
config ESP8266_WIFI_RX_BA_WIN_SIZE
int "WiFi AMPDU RX BA window size"
depends on ESP8266_WIFI_AMPDU_RX_ENABLED
range 0 16
default 6
help
Set the size of WiFi Block Ack RX window. Generally a bigger value means higher throughput and better
compatibility but more memory.
config ESP8266_WIFI_AMSDU_ENABLED
bool "WiFi AMSDU RX"
default n
help
Select this option to enable AMSDU feature
config ESP8266_WIFI_RX_BUFFER_NUM
int "Max number of WiFi RX buffers"
range 14 28
default 16
help
Set the number of WiFi RX buffers. Each buffer takes approximately ESP8266_WIFI_RX_BUFFER_LEN bytes of RAM.
WiFi hardware use these buffers to receive all 802.11 frames.
A higher number may allow higher throughput but increases memory use. If ESP8266_WIFI_AMPDU_RX_ENABLED
is enabled, this value is recommended to set equal or bigger than 8*1024/ESP8266_WIFI_RX_BUFFER_LEN in order
to achieve better throughput and compatibility with both stations and APs.
Most of time we should NOT change the default value unless special reason, e.g. test the maximum UDP RX
throughput with iperf etc. For iperf test in shieldbox, the recommended value is 26.
config ESP8266_WIFI_LEFT_CONTINUOUS_RX_BUFFER_NUM
int "The min number of WiFi continuous RX buffer"
range 0 16
default 4
help
Set the number of WiFi continuous RX buffer num.
The smaller the value, the easier RX hang will appear. Most of time we should NOT change the default
value unless special reason.
config ESP8266_WIFI_RX_PKT_NUM
int "Max number of WiFi RX packets"
range 4 16
default 7
help
Set the max number of signle WiFi packet.
config ESP8266_WIFI_TX_PKT_NUM
int "Max number of WiFi TX packets"
range 4 16
default 6
help
Set the number of WiFi TX packets. Each buffer takes approximately 1.6KB of RAM.
For some applications especially UDP applications, the upper layer can deliver frames faster than WiFi
layer can transmit. In these cases, we may run out of TX packets.
config ESP8266_WIFI_NVS_ENABLED
bool "WiFi NVS flash"
default y
help
Select this option to enable WiFi NVS flash
config ESP8266_WIFI_DEBUG_LOG_ENABLE config ESP8266_WIFI_DEBUG_LOG_ENABLE
bool "Enable WiFi debug log" bool "Enable WiFi debug log"
default n default n
@ -463,6 +535,27 @@ config ESP8266_WIFI_DEBUG_LOG_SUBMODULE_WPS
help help
When this option is enabled, log for wps module will be enabled. When this option is enabled, log for wps module will be enabled.
config ESP8266_WIFI_DEBUG_LOG_SUBMODULE_AMPDU
depends on ESP8266_WIFI_DEBUG_LOG_SUBMODULE
bool "ampdu"
default n
help
When this option is enabled, log for ampdu module will be enabled.
config ESP8266_WIFI_DEBUG_LOG_SUBMODULE_AMSDU
depends on ESP8266_WIFI_DEBUG_LOG_SUBMODULE
bool "amsdu"
default n
help
When this option is enabled, log for amsdu module will be enabled.
config ESP8266_WIFI_DEBUG_LOG_SUBMODULE_FRAG
depends on ESP8266_WIFI_DEBUG_LOG_SUBMODULE
bool "fragment"
default n
help
When this option is enabled, log for frag module will be enabled.
endmenu endmenu
menu PHY menu PHY

View File

@ -99,38 +99,75 @@ extern "C" {
typedef struct { typedef struct {
system_event_handler_t event_handler; /**< WiFi event handler */ system_event_handler_t event_handler; /**< WiFi event handler */
void* osi_funcs; /**< WiFi OS functions */ void* osi_funcs; /**< WiFi OS functions */
int static_rx_buf_num; /**< WiFi static RX buffer number */ uint8_t qos_enable; /**< WiFi QOS feature enable flag */
int dynamic_rx_buf_num; /**< WiFi dynamic RX buffer number */ uint8_t ampdu_rx_enable; /**< WiFi AMPDU RX feature enable flag */
int tx_buf_type; /**< WiFi TX buffer type */ uint8_t rx_ba_win; /**< WiFi Block Ack RX window size */
int static_tx_buf_num; /**< WiFi static TX buffer number */ uint8_t rx_ampdu_buf_num; /**< WiFi AMPDU RX buffer number */
int dynamic_tx_buf_num; /**< WiFi dynamic TX buffer number */ uint32_t rx_ampdu_buf_len; /**< WiFi AMPDU RX buffer length */
int csi_enable; /**< WiFi channel state information enable flag */ uint32_t rx_max_single_pkt_len; /**< WiFi RX max single packet size */
int ampdu_rx_enable; /**< WiFi AMPDU RX feature enable flag */ uint32_t rx_buf_len; /**< WiFi RX buffer size */
int ampdu_tx_enable; /**< WiFi AMPDU TX feature enable flag */ uint8_t amsdu_rx_enable; /**< WiFi AMSDU RX feature enable flag */
int nvs_enable; /**< WiFi NVS flash enable flag */ uint8_t rx_buf_num; /**< WiFi RX buffer number */
int nano_enable; /**< Nano option for printf/scan family enable flag */ uint8_t rx_pkt_num; /**< WiFi RX packet number */
int tx_ba_win; /**< WiFi Block Ack TX window size */ uint8_t left_continuous_rx_buf_num; /**< WiFi Rx left continuous rx buffer number */
int rx_ba_win; /**< WiFi Block Ack RX window size */ uint8_t tx_buf_num; /**< WiFi TX buffer number */
int magic; /**< WiFi init magic number, it should be the last field */ uint8_t nvs_enable; /**< WiFi NVS flash enable flag */
uint8_t nano_enable; /**< Nano option for printf/scan family enable flag */
uint32_t magic; /**< WiFi init magic number, it should be the last field */
} wifi_init_config_t; } wifi_init_config_t;
#if CONFIG_ESP8266_WIFI_AMPDU_RX_ENABLED
#define WIFI_AMPDU_RX_ENABLED 1
#define WIFI_AMPDU_RX_BA_WIN CONFIG_ESP8266_WIFI_RX_BA_WIN_SIZE
#define WIFI_RX_MAX_SINGLE_PKT_LEN 1600
#else
#define WIFI_AMPDU_RX_ENABLED 0
#define WIFI_AMPDU_RX_BA_WIN 0 /* unused if ampdu_rx_enable == false */
#define WIFI_RX_MAX_SINGLE_PKT_LEN (1600 - 524)
#endif
#define WIFI_AMPDU_RX_AMPDU_BUF_LEN 72
#define WIFI_AMPDU_RX_AMPDU_BUF_NUM 3
#define WIFI_HW_RX_BUFFER_LEN 524
#if CONFIG_ESP8266_WIFI_QOS_ENABLED
#define WIFI_QOS_ENABLED 1
#else
#define WIFI_QOS_ENABLED 0
#endif
#if CONFIG_ESP8266_WIFI_AMSDU_ENABLED
#define WIFI_AMSDU_RX_ENABLED 1
#undef WIFI_RX_MAX_SINGLE_PKT_LEN
#define WIFI_RX_MAX_SINGLE_PKT_LEN 3000
#else
#define WIFI_AMSDU_RX_ENABLED 0
#endif
#if CONFIG_ESP8266_WIFI_NVS_ENABLED
#define WIFI_NVS_ENABLED 1
#else
#define WIFI_NVS_ENABLED 0
#endif
#define WIFI_INIT_CONFIG_MAGIC 0x1F2F3F4F #define WIFI_INIT_CONFIG_MAGIC 0x1F2F3F4F
#define WIFI_INIT_CONFIG_DEFAULT() { \ #define WIFI_INIT_CONFIG_DEFAULT() { \
.event_handler = &esp_event_send, \ .event_handler = &esp_event_send, \
.osi_funcs = NULL, \ .osi_funcs = NULL, \
.static_rx_buf_num = 5,\ .qos_enable = WIFI_QOS_ENABLED,\
.dynamic_rx_buf_num = 0,\ .ampdu_rx_enable = WIFI_AMPDU_RX_ENABLED,\
.tx_buf_type = 0,\ .rx_ampdu_buf_len = WIFI_AMPDU_RX_AMPDU_BUF_LEN,\
.static_tx_buf_num = 6,\ .rx_ampdu_buf_num = WIFI_AMPDU_RX_AMPDU_BUF_NUM,\
.dynamic_tx_buf_num = 0,\ .amsdu_rx_enable = WIFI_AMSDU_RX_ENABLED,\
.csi_enable = 0,\ .rx_ba_win = WIFI_AMPDU_RX_BA_WIN,\
.ampdu_rx_enable = 0,\ .rx_max_single_pkt_len = WIFI_RX_MAX_SINGLE_PKT_LEN,\
.ampdu_tx_enable = 0,\ .rx_buf_len = WIFI_HW_RX_BUFFER_LEN,\
.nvs_enable = 1,\ .rx_buf_num = CONFIG_ESP8266_WIFI_RX_BUFFER_NUM,\
.left_continuous_rx_buf_num = CONFIG_ESP8266_WIFI_LEFT_CONTINUOUS_RX_BUFFER_NUM,\
.rx_pkt_num = CONFIG_ESP8266_WIFI_RX_PKT_NUM,\
.tx_buf_num = CONFIG_ESP8266_WIFI_TX_PKT_NUM,\
.nvs_enable = WIFI_NVS_ENABLED,\
.nano_enable = 0,\ .nano_enable = 0,\
.tx_ba_win = 0,\
.rx_ba_win = 0,\
.magic = WIFI_INIT_CONFIG_MAGIC\ .magic = WIFI_INIT_CONFIG_MAGIC\
}; };

View File

@ -53,7 +53,9 @@ typedef enum {
#define WIFI_LOG_SUBMODULE_MAC (1<<9) #define WIFI_LOG_SUBMODULE_MAC (1<<9)
#define WIFI_LOG_SUBMODULE_WPA (1<<10) #define WIFI_LOG_SUBMODULE_WPA (1<<10)
#define WIFI_LOG_SUBMODULE_WPS (1<<11) #define WIFI_LOG_SUBMODULE_WPS (1<<11)
#define WIFI_LOG_SUBMODULE_AMPDU (1<<12)
#define WIFI_LOG_SUBMODULE_AMSDU (1<<13)
#define WIFI_LOG_SUBMODULE_FRAG (1<<14)
/** /**
* @brief Set WIFI received TCP/IP data cache ram type * @brief Set WIFI received TCP/IP data cache ram type
* *

View File

@ -76,6 +76,15 @@ static void esp_wifi_set_debug_log()
#endif #endif
#if CONFIG_ESP8266_WIFI_DEBUG_LOG_SUBMODULE_WPS #if CONFIG_ESP8266_WIFI_DEBUG_LOG_SUBMODULE_WPS
wifi_log_submodule |= WIFI_LOG_SUBMODULE_WPS; wifi_log_submodule |= WIFI_LOG_SUBMODULE_WPS;
#endif
#if CONFIG_ESP8266_WIFI_DEBUG_LOG_SUBMODULE_AMPDU
wifi_log_submodule |= WIFI_LOG_SUBMODULE_AMPDU;
#endif
#if CONFIG_ESP8266_WIFI_DEBUG_LOG_SUBMODULE_AMSDU
wifi_log_submodule |= WIFI_LOG_SUBMODULE_AMSDU;
#endif
#if CONFIG_ESP8266_WIFI_DEBUG_LOG_SUBMODULE_FRAG
wifi_log_submodule |= WIFI_LOG_SUBMODULE_FRAG;
#endif #endif
esp_wifi_internal_set_log_level(wifi_log_level); esp_wifi_internal_set_log_level(wifi_log_level);
esp_wifi_internal_set_log_mod(wifi_log_submodule); esp_wifi_internal_set_log_mod(wifi_log_submodule);

View File

@ -29,6 +29,8 @@ void phy_afterwake_set_rfoption(uint8_t);
void write_data_to_rtc(uint8_t *); void write_data_to_rtc(uint8_t *);
void get_data_from_rtc(uint8_t *); void get_data_from_rtc(uint8_t *);
int register_chipv6_phy(uint8_t* );
void phy_disable_agc();
uint8_t chip_init(uint8_t* init_data, uint8_t *mac, uint32_t uart_baudrate); uint8_t chip_init(uint8_t* init_data, uint8_t *mac, uint32_t uart_baudrate);

View File

@ -68,12 +68,7 @@ esp_err_t esp_phy_rf_init(const esp_phy_init_data_t* init_data, esp_phy_calibrat
{ {
esp_err_t status = ESP_OK; esp_err_t status = ESP_OK;
uint8_t sta_mac[6]; uint8_t sta_mac[6];
uint8_t* local_init_data = calloc(1, 256); uint8_t *local_init_data = calloc(1, 256);
#ifdef CONFIG_CONSOLE_UART_BAUDRATE
const uint32_t uart_baudrate = CONFIG_CONSOLE_UART_BAUDRATE;
#else
const uint32_t uart_baudrate = 74880; // ROM default baudrate
#endif
memcpy(local_init_data, init_data->params, 128); memcpy(local_init_data, init_data->params, 128);
@ -89,9 +84,16 @@ esp_err_t esp_phy_rf_init(const esp_phy_init_data_t* init_data, esp_phy_calibrat
} }
esp_efuse_mac_get_default(sta_mac); esp_efuse_mac_get_default(sta_mac);
chip_init(local_init_data, sta_mac, uart_baudrate);
ESP_LOGI(TAG, "phy ver: %d_%d", (READ_PERI_REG(0x6000107C) >> 16) & 0xFFF, READ_PERI_REG(0x6000107C) >> 28); int ret = register_chipv6_phy(local_init_data);
get_data_from_rtc((uint8_t*)calibration_data); if (ret) {
ESP_LOGI(TAG, "phy register error, ret:%d", ret);
}
phy_disable_agc();
ESP_LOGI(TAG, "phy ver: %d_%d", (READ_PERI_REG(0x6000107C)>>16)&0xFFF, READ_PERI_REG(0x6000107C)>>28);
get_data_from_rtc((uint8_t *)calibration_data);
memcpy(rx_gain_dc_table, calibration_data->rx_gain_dc_table, 4 * 125); memcpy(rx_gain_dc_table, calibration_data->rx_gain_dc_table, 4 * 125);
phy_rx_gain_dc_table = rx_gain_dc_table; phy_rx_gain_dc_table = rx_gain_dc_table;

View File

@ -30,6 +30,7 @@
#include "internal/esp_wifi_internal.h" #include "internal/esp_wifi_internal.h"
#include "internal/esp_system_internal.h" #include "internal/esp_system_internal.h"
#include "esp8266/eagle_soc.h" #include "esp8266/eagle_soc.h"
#include "esp8266/uart_register.h"
#include "FreeRTOS.h" #include "FreeRTOS.h"
#include "task.h" #include "task.h"
@ -47,6 +48,7 @@ extern int wifi_timer_init(void);
extern int wifi_nvs_init(void); extern int wifi_nvs_init(void);
extern esp_err_t esp_pthread_init(void); extern esp_err_t esp_pthread_init(void);
extern void phy_get_bb_evm(void); extern void phy_get_bb_evm(void);
extern void uart_div_modify(uint8_t uart_no, uint16_t DivLatchValue);
static inline int should_load(uint32_t load_addr) static inline int should_load(uint32_t load_addr)
{ {
@ -61,6 +63,19 @@ static inline int should_load(uint32_t load_addr)
return 1; return 1;
} }
static inline void uart_init()
{
#ifdef CONFIG_CONSOLE_UART_BAUDRATE
const uint32_t uart_baudrate = CONFIG_CONSOLE_UART_BAUDRATE;
#else
const uint32_t uart_baudrate = 74880; // ROM default baudrate
#endif
while (READ_PERI_REG(UART_STATUS(0)) & (UART_TXFIFO_CNT << UART_TXFIFO_CNT_S));
while (READ_PERI_REG(UART_STATUS(1)) & (UART_TXFIFO_CNT << UART_TXFIFO_CNT_S));
uart_div_modify(0, UART_CLK_FREQ / uart_baudrate);
uart_div_modify(1, UART_CLK_FREQ / uart_baudrate);
}
static void user_init_entry(void *param) static void user_init_entry(void *param)
{ {
void (**func)(void); void (**func)(void);
@ -76,13 +91,16 @@ static void user_init_entry(void *param)
phy_get_bb_evm(); phy_get_bb_evm();
/*enable tsf0 interrupt for pwm*/
REG_WRITE(PERIPHS_DPORT_BASEADDR, (REG_READ(PERIPHS_DPORT_BASEADDR) & ~0x1F) | 0x1);
REG_WRITE(INT_ENA_WDEV, REG_READ(INT_ENA_WDEV) | WDEV_TSF0_REACH_INT);
assert(nvs_flash_init() == 0); assert(nvs_flash_init() == 0);
assert(wifi_nvs_init() == 0);
assert(rtc_init() == 0); assert(rtc_init() == 0);
assert(mac_init() == 0); assert(mac_init() == 0);
uart_init();
assert(base_gpio_init() == 0); assert(base_gpio_init() == 0);
esp_phy_load_cal_and_init(0); esp_phy_load_cal_and_init(0);
assert(wifi_timer_init() == 0);
esp_wifi_set_rx_pbuf_mem_type(WIFI_RX_PBUF_DRAM); esp_wifi_set_rx_pbuf_mem_type(WIFI_RX_PBUF_DRAM);