Files
TAIXIN/project/syscfg.c

198 lines
7.2 KiB
C
Raw Normal View History

#include "sys_config.h"
#include "typesdef.h"
#include "list.h"
#include "dev.h"
#include "devid.h"
#include "osal/string.h"
#include "osal/semaphore.h"
#include "osal/mutex.h"
#include "osal/irq.h"
#include "osal/task.h"
#include "osal/sleep.h"
#include "osal/timer.h"
#include "osal/work.h"
#include "hal/gpio.h"
#include "hal/uart.h"
#include "lib/common/common.h"
#include "lib/umac/ieee80211.h"
#include "lib/syscfg/syscfg.h"
#include "lib/atcmd/libatcmd.h"
#include "lib/net/dhcpd/dhcpd.h"
#include "lwip/ip_addr.h"
#include "lwip/netdb.h"
#include "netif/ethernetif.h"
#include "syscfg.h"
#define SYSCFG_WIFI_MODE(mode) ((mode) == WIFI_MODE_STA ? "sta" : ((mode) == WIFI_MODE_AP ? "ap" : "apsta"))
struct sys_config sys_cfgs = {
.wifi_mode = WIFI_MODE_DEFAULT,
.wifi_hwmode = WIFI_HWMODE_DEFAULT,
.channel = WIFI_CHANNEL_DEFAULT,
.beacon_int = BEACON_INTVAL_DEFAULT,
.dtim_period = DTIM_PERIOD_DEFAULT,
.bss_max_idle = BSS_MAX_IDLE_DEFAULT,
.key_mgmt = KEY_MGMT_DEFAULT,
.bss_bw = WIFI_BSSBW_DEFAULT,
.ipaddr = NET_IP_ADDR_DEFAULT,
.netmask = NET_MASK_DEFAULT,
.gw_ip = NET_GW_IP_DEFAULT,
.dhcpd_startip = DHCPD_START_IP_DEFAULT,
.dhcpd_endip = DHCPD_END_IP_DEFAULT,
.dhcpd_lease_time = DHCPD_LEASETIME_DEFAULT,
.dhcpd_dns1 = DHCPD_DNS1_DEFAULT,
.dhcpd_dns2 = DHCPD_DNS2_DEFAULT,
.dhcpd_router = DHCPD_ROUTER_DEFAULT,
.dhcpd_en = DHCPD_EN,
.dhcpc_en = DHCPC_EN,
.mipi_csi0_hs_zero_cnt = 0,
.mipi_csi1_hs_zero_cnt = 0,
};
extern void sys_dhcpd_start(void);
static void wificfg_custom_ap_wmm_param(uint8 ifidx)
{
#ifdef SYS_CUSTOM_APWMM
const uint8 txq[][8] = { //使用自定义的wmm 参数
{0x4F, 0x00, 0x02, 0x00, 0x09, 0x00, 0x01, 0x00,},
{0x4F, 0x00, 0x02, 0x00, 0x09, 0x00, 0x01, 0x01,},
{0x80, 0x00, 0x02, 0x00, 0x04, 0x00, 0x01, 0x02,},
{0x41, 0x00, 0x02, 0x00, 0x03, 0x00, 0x01, 0x03,},
};
if (sys_cfgs.wifi_mode == WIFI_MODE_AP && ifidx == WIFI_MODE_AP) {
ieee80211_conf_set_wmm_param(WIFI_MODE_AP, 0xf0, (struct ieee80211_wmm_param *)&txq[0]);
ieee80211_conf_set_wmm_param(WIFI_MODE_AP, 0xf1, (struct ieee80211_wmm_param *)&txq[1]);
ieee80211_conf_set_wmm_param(WIFI_MODE_AP, 0xf2, (struct ieee80211_wmm_param *)&txq[2]);
ieee80211_conf_set_wmm_param(WIFI_MODE_AP, 0xf3, (struct ieee80211_wmm_param *)&txq[3]);
}
#endif
}
int32 wificfg_flush(uint8 ifidx)
{
wificfg_custom_ap_wmm_param(ifidx);
if (sys_cfgs.wifi_hwmode) {
ieee80211_conf_set_hwmode(ifidx, sys_cfgs.wifi_hwmode);
}
if (ifidx == WIFI_MODE_AP) {
if (sys_cfgs.channel == 0 && sys_status.channel) {
ieee80211_conf_set_channel(ifidx, sys_status.channel);
} else {
ieee80211_conf_set_channel(ifidx, sys_cfgs.channel);
}
}
ieee80211_conf_set_mac(ifidx, sys_cfgs.mac);
ieee80211_conf_set_hwmode(ifidx, sys_cfgs.wifi_hwmode);
ieee80211_conf_set_channel(ifidx, sys_status.channel);
ieee80211_conf_set_beacon_int(ifidx, sys_cfgs.beacon_int);
ieee80211_conf_set_dtim_int(ifidx, sys_cfgs.dtim_period);
ieee80211_conf_set_bss_max_idle(ifidx, sys_cfgs.bss_max_idle);
ieee80211_conf_set_aphide(ifidx, sys_cfgs.ap_hide);
ieee80211_conf_set_bssbw(ifidx, sys_cfgs.bss_bw);
if (ifidx == WIFI_MODE_AP && sys_cfgs.wifi_mode == WIFI_MODE_APSTA && sys_cfgs.cfg_init) {
//ieee80211_conf_set_ssid(ifidx, sys_cfgs.r_ssid);
//ieee80211_conf_set_keymgmt(ifidx, sys_cfgs.r_key_mgmt);
//ieee80211_conf_set_psk(ifidx, sys_cfgs.r_psk);
//ieee80211_conf_set_passwd(ifidx, sys_cfgs.r_passwd);
} else {
ieee80211_conf_set_ssid(ifidx, sys_cfgs.ssid);
ieee80211_conf_set_keymgmt(ifidx, sys_cfgs.key_mgmt);
ieee80211_conf_set_psk(ifidx, sys_cfgs.psk);
ieee80211_conf_set_passwd(ifidx, (char*)sys_cfgs.passwd);
}
if (sys_cfgs.wifi_mode == WIFI_MODE_APSTA) {
//ieee80211_conf_set_relay_mode(WIFI_MODE_AP, sys_cfgs.relay_en, sys_cfgs.relay_level, sys_cfgs.relay_mcast);
//ieee80211_conf_set_relay_mode(WIFI_MODE_STA, sys_cfgs.relay_en, sys_cfgs.relay_level, sys_cfgs.relay_mcast);
} else {
//ieee80211_conf_set_relay_mode(ifidx, 0, 0, 0);
}
netdev_set_wifi_mode((struct netdev *)dev_get(HG_WIFI0_DEVID), sys_cfgs.wifi_mode);
return 0;
}
void netcfg_flush(void)
{
ip_addr_t ipaddr, netmask, gw;
ipaddr.addr = sys_cfgs.ipaddr;
netmask.addr = sys_cfgs.netmask;
gw.addr = sys_cfgs.gw_ip;
lwip_netif_set_dhcp2("w0", sys_cfgs.dhcpc_en);
lwip_netif_set_ip2("w0", &ipaddr, &netmask, &gw);
if (sys_cfgs.dhcpd_en) {
sys_dhcpd_start();
} else {
dhcpd_stop();
}
}
void syscfg_flush(int32 reset)
{
if (reset) {
ieee80211_iface_stop(WIFI_MODE_STA);
ieee80211_iface_stop(WIFI_MODE_AP);
}
if (sys_cfgs.wifi_mode == WIFI_MODE_APSTA) {
wificfg_flush(WIFI_MODE_AP);
wificfg_flush(WIFI_MODE_STA);
if (reset) {
ieee80211_iface_start(WIFI_MODE_STA);
ieee80211_iface_start(WIFI_MODE_AP);
}
} else {
wificfg_flush(sys_cfgs.wifi_mode);
if (reset) {
ieee80211_iface_start(sys_cfgs.wifi_mode);
}
}
if (!sys_cfgs.dhcpc_en) {
sys_status.dhcpc_result.ipaddr = sys_cfgs.ipaddr;
sys_status.dhcpc_result.netmask = sys_cfgs.netmask;
sys_status.dhcpc_result.router = sys_cfgs.gw_ip;
}
}
int32 syscfg_save(void)
{
return syscfg_write("syscfg", &sys_cfgs, sizeof(sys_cfgs));
}
void syscfg_default()
{
sysctrl_efuse_mac_addr_calc(sys_cfgs.mac);
if (IS_ZERO_ADDR(sys_cfgs.mac)) {
os_random_bytes(sys_cfgs.mac, 6);
sys_cfgs.mac[0] &= 0xfe;
os_printf(KERN_WARNING"use random mac "MACSTR"\r\n", MAC2STR(sys_cfgs.mac));
}
os_snprintf((char *)sys_cfgs.ssid, SSID_MAX_LEN, WIFI_SSID_PREFIX"%02X%02X%02X", sys_cfgs.mac[3], sys_cfgs.mac[4], sys_cfgs.mac[5]);
os_strcpy(sys_cfgs.passwd, WIFI_PASSWD_DEFAULT);
wpa_passphrase(sys_cfgs.ssid, (char*)sys_cfgs.passwd, sys_cfgs.psk);
}
void syscfg_dump()
{
VERSION_SHOW();
_os_printf("System Settings:\r\n");
_os_printf(" mac:"MACSTR", dhcpc_en:%d, dhcpd_en:%d\r\n", MAC2STR(sys_cfgs.mac), sys_cfgs.dhcpc_en, sys_cfgs.dhcpd_en);
_os_printf(" wifi:\r\n");
_os_printf(" mode:%s, bw%d, channel:%d(%d)\r\n", SYSCFG_WIFI_MODE(sys_cfgs.wifi_mode), sys_cfgs.bss_bw, sys_cfgs.channel, sys_status.channel);
_os_printf(" ssid:%s, passwd:%s, keymgmt:0x%x\r\n", sys_cfgs.ssid, sys_cfgs.passwd, sys_cfgs.key_mgmt);
_os_printf(" bss_maxidle:%d, beacon_int:%d, dtim_period:%d\r\n", sys_cfgs.bss_max_idle, sys_cfgs.beacon_int, sys_cfgs.dtim_period);
_os_printf(" network:\r\n");
_os_printf(" ipaddr:"IPSTR", netmask:"IPSTR", gw:"IPSTR"\n", IP2STR_N(sys_cfgs.ipaddr), IP2STR_N(sys_cfgs.netmask), IP2STR_N(sys_cfgs.gw_ip));
_os_printf(" dhcpserver: "IPSTR"-"IPSTR", leaseTime:%d\n", IP2STR_N(sys_cfgs.dhcpd_startip), IP2STR_N(sys_cfgs.dhcpd_endip), sys_cfgs.dhcpd_lease_time);
}