#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); }