Files
TAIXIN/project/wifi.c

172 lines
5.4 KiB
C
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#include "sys_config.h"
#include "basic_include.h"
#include "hal/adc.h"
#include "lib/rpc/cpurpc.h"
#include "lib/atcmd/libatcmd.h"
#include "lib/common/atcmd.h"
#include "lib/umac/ieee80211.h"
#include "lib/lmac/lmac.h"
#include "syscfg.h"
__init static void sys_wifi_start_acs(void)
{
void *ops = NULL; //另外一个CPU处理
struct lmac_acs_ctl acs_ctl;
if (sys_cfgs.wifi_mode == WIFI_MODE_AP) {
if (sys_cfgs.channel == 0) {
acs_ctl.enable = 1;
acs_ctl.scan_ms = WIFI_ACS_SCAN_TIME;;
acs_ctl.chn_bitmap = WIFI_ACS_CHAN_LISTS;
lmac_start_async_acs(ops, &acs_ctl);
}
}
}
__init static void sys_wifi_parameter_init(void)
{
void *ops = NULL; //另外一个CPU处理
lmac_set_rf_pwr_level(ops, WIFI_RF_PWR_LEVEL);
#if WIFI_FEM_CHIP != LMAC_FEM_NONE
lmac_fem_pin_func(1);
lmac_set_fem(ops, WIFI_FEM_CHIP); //初始化FEM之后不能进行RF档位选择
#endif
lmac_set_rts(ops, WIFI_RTS_THRESHOLD);
lmac_set_retry_cnt(ops, WIFI_TX_MAX_RETRY, WIFI_RTS_MAX_RETRY);
lmac_set_supp_rate(ops, WIFI_TX_SUPP_RATE);
lmac_set_mcast_dup_txcnt(ops, WIFI_MULICAST_RETRY);
lmac_set_tx_duty_cycle(ops, WIFI_TX_DUTY_CYCLE);
#if WIFI_SSID_FILTER_EN
lmac_set_ssid_filter(ops, sys_cfgs.ssid, strlen(sys_cfgs.ssid));
#endif
#if WIFI_PREVENT_PS_MODE_EN
lmac_set_prevent_ps_mode(ops, WIFI_PREVENT_PS_MODE_EN);
#endif
lmac_set_ps_no_frm_loss(ops, WIFI_PS_NO_FRM_LOSS_EN);
#ifdef RATE_CONTROL_SELECT
lmac_rate_ctrl_type(ops, RATE_CONTROL_SELECT);
#endif
#if !WIFI_METER_TEST_EN
uint8 gain_table[] = {
125, 125, 100, 100, 80, 80, 56, 56, // NON HT OFDM
125, 100, 100, 80, 80, 56, 56, 56, // HT
80, 80, 80, 80, // DSSS
};
lmac_set_tx_modulation_gain(ops, gain_table, sizeof(gain_table));
lmac_set_temperature_compesate_en(ops, WIFI_TEMPERATURE_COMPESATE_EN);
#endif
lmac_set_freq_offset_track_mode(ops, WIFI_FREQ_OFFSET_TRACK_MODE);
#if WIFI_HIGH_PRIORITY_TX_MODE_EN
struct lmac_txq_param txq_max;
struct lmac_txq_param txq_min;
txq_max.aifs = 0xFF; //不限制aifs
txq_max.txop = 0xFFFF; //不限制txop
txq_max.cw_min = 3; //cwmin最大值。如果觉得冲突太厉害可以改大
txq_max.cw_max = 511; //cwmax最大值。如果觉得冲突太厉害可以改大
lmac_set_edca_max(ops, &txq_max);
lmac_set_tx_edca_slot_time(ops, 6); //6us是其他客户推荐的值
lmac_set_nav_max(ops, 10*1000); //NAV最大限制为10ms
txq_min.aifs = 0;
txq_min.txop = 100; //txop最小值限制为100
txq_min.cw_min = 0;
txq_min.cw_max = 0;
lmac_set_edca_min(ops, &txq_min);
#endif
#if WIFI_TX_AGG_EN == 0
lmac_set_aggcnt(ops, 0);
#endif
#if WIFI_RX_AGG_EN == 0
lmac_set_rx_aggcnt(ops, 0);
#endif
#ifdef CONFIG_SLEEP
void *bgn_dsleep_init(void *ops);
bgn_dsleep_init(ops);
#endif
}
__init void sys_wifi_test_mode_init(void)
{
uint8 default_gain_table[] = { //gain默认值
56, 56, 56, 56, 56, 56, 56, 56, //OFDM
56, 56, 56, 56, 56, 56, 56, 56, //HT
56, 56, 56, 56, //DSSS
};
lmac_set_mac_addr(NULL, 0, sys_cfgs.mac);
lmac_set_tx_modulation_gain(NULL, default_gain_table, sizeof(default_gain_table));
#if WIFI_FEM_CHIP != LMAC_FEM_NONE
lmac_fem_pin_func(1);
lmac_set_fem(NULL, WIFI_FEM_CHIP); //初始化FEM之后不能进行RF档位选择
#endif
}
__init static void sys_wifi_ap_init(void)
{
ieee80211_iface_create_ap(WIFI_MODE_AP, IEEE80211_BAND_2GHZ);
if (sys_cfgs.wifi_mode == WIFI_MODE_AP) {
wificfg_flush(WIFI_MODE_AP);
ieee80211_conf_set_psdata_cnt(WIFI_MODE_AP, 100);
ieee80211_iface_start(WIFI_MODE_AP);
}
}
__init static void sys_wifi_sta_init(void)
{
ieee80211_iface_create_sta(WIFI_MODE_STA, IEEE80211_BAND_2GHZ);
if (sys_cfgs.wifi_mode == WIFI_MODE_STA) {
wificfg_flush(WIFI_MODE_STA);
ieee80211_iface_start(WIFI_MODE_STA);
}
}
/* p2p功能需要使用 AP/STA 功能p2p默认复用了AP/STA接口。
如果需要同时使用AP/STA功能和p2p功能则需要为 p2p 创建专用的ap/sta接口WIFI_WORK_MODE为p2p添加定义
*/
__init static void sys_wifi_p2p_init(void)
{
#if WIFI_P2P_SUPPORT
ieee80211_iface_create_ap(WIFI_MODE_AP, IEEE80211_BAND_2GHZ);
//wificfg_flush(WIFI_MODE_AP);
ieee80211_conf_set_mac(WIFI_MODE_AP, sys_cfgs.mac);
ieee80211_iface_create_sta(WIFI_MODE_STA, IEEE80211_BAND_2GHZ);
ieee80211_conf_stabr_table(WIFI_MODE_STA, 128, 10 * 60);
//wificfg_flush(WIFI_MODE_STA);
ieee80211_conf_set_mac(WIFI_MODE_STA, sys_cfgs.mac);
ieee80211_iface_create_p2pdev(WIFI_MODE_P2P, IEEE80211_BAND_2GHZ, WIFI_MODE_AP, WIFI_MODE_STA);
//wificfg_flush(WIFI_MODE_P2P);
ieee80211_conf_set_mac(WIFI_MODE_P2P, sys_cfgs.mac);
ieee80211_conf_set_ssid(WIFI_MODE_P2P, sys_cfgs.ssid);
ieee80211_conf_set_keymgmt(WIFI_MODE_P2P, sys_cfgs.key_mgmt);
ieee80211_conf_set_psk(WIFI_MODE_P2P, sys_cfgs.psk);
ieee80211_iface_start(WIFI_MODE_P2P);
#endif
}
__init void sys_wifi_init(void)
{
sys_wifi_parameter_init();
ieee80211_deliver_init(16, 60);
#if WIFI_AP_SUPPORT
sys_wifi_ap_init();
#endif
#if WIFI_STA_SUPPORT
sys_wifi_sta_init();
#endif
#if WIFI_P2P_SUPPORT
sys_wifi_p2p_init();
#endif
sys_wifi_start_acs();
}