#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/common/sysevt.h" #include "lib/syscfg/syscfg.h" #include "lib/lmac/lmac.h" #include "lib/skb/skbpool.h" #include "lib/atcmd/libatcmd.h" #include "lib/bus/xmodem/xmodem.h" #include "lib/net/dhcpd/dhcpd.h" #include "lib/umac/ieee80211.h" #include "lib/umac/umac.h" #include "lib/common/atcmd.h" #include "lwip/err.h" #include "lwip/sockets.h" #include "lwip/netdb.h" #include "lwip/sys.h" #include "lwip/ip_addr.h" #include "lwip/tcpip.h" #include "netif/ethernetif.h" #include "syscfg.h" #include "lib/net/eloop/eloop.h" #include "speedTest/speedTest.h" #include "update/ota.h" #include "dhcpd_eloop/dhcpd_eloop.h" #include "sta_interface/sta_interface.h" #include "ota.h" #include "lib/heap/sysheap.h" #include "spook.h" #include "remote_control.h" #include "lib/sdhost/sdhost.h" #include "lib/ble/ble_def.h" #include "lib/ble/ble_demo.h" #include "lib/ble/uble.h" #include "lib/common/dsleepdata.h" #include "dns_eloop/dns_eloop.h" #include "custom_mem/custom_mem.h" #include "lib/video/dvp/jpeg/jpg.h" #include "audio_app/audio_adc.h" #include "audio_app/audio_dac.h" #include "stream_frame.h" #include "test_demo/test_demo.h" //#include "atcmd.c" #include "keyWork.h" #include "flashdisk/flashdisk.h" #include "osal_file.h" #if MP3_EN #include "mp3/mp3_decode.h" #include "third_audio/libmad/global.h" #endif #if LCD_EN #if LVGL_STREAM_ENABLE == 1 #include "app_lcd/app_lcd.h" #include "decode/yuv_stream.h" #else #endif #endif #if RTT_USB_EN #include "rtthread.h" #endif extern uint8_t get_psram_status(); struct system_status sys_status; extern uint32 srampool_start; extern uint32 srampool_end; static struct os_work main_wk; uint8_t mac_adr[6]; void *g_ops = NULL; uint8_t qc_mode = 0; void delay_us(uint32 n); int32 wifi_qc_scan(uint8 ifidx); struct hgic_atcmd_normal { struct atcmd_dataif dataif; }; struct hgic_atcmd_normal *atcmd_uart_normal = NULL; #if NET_PAIR void set_pair_mode(uint8_t enable) { os_printf("%s enable:%d\n",__FUNCTION__,enable); sys_cfgs.net_pair_switch = enable; ieee80211_pairing(sys_cfgs.wifi_mode, sys_cfgs.net_pair_switch); } uint8_t get_net_pair_status() { return sys_cfgs.net_pair_switch; } #endif #ifdef CONFIG_UMAC4 int32 sys_wifi_event(uint8 ifidx, uint16 evt, uint32 param1, uint32 param2) { switch (evt) { case IEEE80211_EVENT_SCAN_START: os_printf("inteface%d: start scanning ...\r\n", ifidx); break; case IEEE80211_EVENT_SCAN_DONE: os_printf("inteface%d: scan done!\r\n", ifidx); break; case IEEE80211_EVENT_CONNECT_START: os_printf("inteface%d: start connecting ...\r\n", ifidx); break; case IEEE80211_EVENT_CONNECTED: os_printf("inteface%d: sta "MACSTR" connected\r\n", ifidx, MAC2STR((uint8 *)param1)); break; case IEEE80211_EVENT_DISCONNECTED: os_printf("inteface%d: sta "MACSTR" disconnected\r\n", ifidx, MAC2STR((uint8 *)param1)); break; case IEEE80211_EVENT_RSSI: //os_printf("inteface%d rssi: %d\r\n", ifidx, param1); break; case IEEE80211_EVENT_NEW_BSS: os_printf("inteface%d find new bss: "MACSTR"-%s\r\n", ifidx, MAC2STR((uint8 *)param1), (uint8 *)param2); break; #if 0 case IEEE80211_EVENT_PRE_AUTH: os_printf("inteface%d pre auth, pair_bssid:"MACSTR",new_bssid: "MACSTR"\r\n", ifidx, MAC2STR((uint8 *)sys_cfgs.bssid), MAC2STR((uint8 *)param1)); if(memcmp(sys_cfgs.bssid,(uint8 *)param1,6)!=0) { return RET_ERR; } break; #endif //这里不一定配对成功,只是代表收到对方消息,但自己的消息对方不一定收到 //这里在AP模式不会自动关闭配对,只有STA模式收到配对信息后,就会关闭配对,去连接网络 case IEEE80211_EVENT_PAIR_SUCCESS: #if NET_PAIR sys_status.pair_success = 1; os_printf("inteface%d pair success, bssid: "MACSTR"\r\n", ifidx, MAC2STR((uint8 *)param1)); if(WIFI_MODE_STA == ifidx) { set_pair_mode(0); sys_event_new(SYS_EVENT(SYS_EVENT_WIFI, SYSEVT_WIFI_PAIR_DONE), 1); } #if 0 else if(WIFI_MODE_AP == ifidx) { os_memcpy(sys_cfgs.bssid,(uint8 *)param1,6); syscfg_save(); } #endif #endif break; //配对结束 case IEEE80211_EVENT_PAIR_DONE: os_printf("inteface%d pair done, bssid: "MACSTR"\r\n", ifidx, MAC2STR((uint8 *)param1)); sys_event_new(SYS_EVENT(SYS_EVENT_WIFI, SYSEVT_WIFI_PAIR_DONE), param2); break; default: break; } return RET_OK; } #endif __init static void sys_cfg_load() { struct sys_config *sys_cfgs_tmp = (struct sys_config*)malloc(sizeof(struct sys_config)); if(sys_cfgs_tmp) { memcpy(sys_cfgs_tmp,&sys_cfgs,sizeof(struct sys_config)); } if (syscfg_init(&sys_cfgs, sizeof(sys_cfgs)) == RET_OK) { os_printf("old cfg_ver:%d\n",sys_cfgs.cfg_ver); if(sys_cfgs.cfg_ver == CFG_VERSION_NUM){ goto sys_cfg_load_end; } sys_cfgs.cfg_ver = CFG_VERSION_NUM; //修改version } if(sys_cfgs_tmp) { memcpy(&sys_cfgs,sys_cfgs_tmp,sizeof(struct sys_config)); } os_printf("use default params(%x).\r\n",sys_cfgs.cfg_ver); syscfg_set_default_val(); syscfg_save(); sys_cfg_load_end: if(sys_cfgs_tmp) { free(sys_cfgs_tmp); } else { os_printf("%s:%d err,malloc sys_config err\n",__FUNCTION__,__LINE__); } } void user_io_preconfig(); void user_protocol(); __weak void user_io_preconfig() { } __weak void user_protocol() { spook_init(); } __weak void user_hardware_config() { } __weak uint8_t set_qc_mode_io() { return 255; } void sys_mode_confirm() { if(qc_mode){ sys_cfgs.wifi_mode = WIFI_MODE_STA; extern void qc_wifi_config(); qc_wifi_config(); }else{ sys_cfgs.wifi_mode = sys_cfgs.default_wifi_mode; } } uint8_t qc_ret = 0; uint8_t mode_io_1 = 0; uint8_t io_dect = 0; //period 100ms __weak int32 is_qc_mode(uint8_t mode_io) { int32 io_direct,io_direct1,io_direct2,io_direct3; io_direct = 0; gpio_iomap_input(mode_io, GPIO_DIR_INPUT); io_direct1 = gpio_get_val(mode_io); delay_us(5000); //delay 5ms io_direct2 = gpio_get_val(mode_io); delay_us(5000); //delay 5ms io_direct3 = gpio_get_val(mode_io); if((io_direct1 == io_direct2)&&(io_direct3 == io_direct2)){ io_direct = io_direct2; delay_us(45000); //delay 45ms }else if((io_direct1 == io_direct2)&&(io_direct3 != io_direct2)){ io_direct = io_direct1; delay_us(40000); //delay 40ms }else if((io_direct1 != io_direct2)&&(io_direct3 == io_direct2)){ io_direct = io_direct3; delay_us(50000); //delay 50ms } if(gpio_get_val(mode_io) == io_direct){ return 0; } delay_us(50000); //delay 50ms if(gpio_get_val(mode_io) != io_direct){ return 0; } delay_us(50000); //delay 50ms if(gpio_get_val(mode_io) == io_direct){ return 0; } delay_us(50000); //delay 50ms if(gpio_get_val(mode_io) != io_direct){ return 0; } //check 200ms,all correct,return true return 1; } void wifi_qc_mode_inspect() { #if (NET_TO_QC == 1) uint8_t wifi_qc_mode_io; wifi_qc_mode_io = set_qc_mode_io(); if(wifi_qc_mode_io != 255){ if(is_qc_mode(wifi_qc_mode_io)){ qc_mode = 1; }else{ qc_mode = 0; } }else{ qc_mode = 0; } #endif } static int32 atcmd_normal_write(struct atcmd_dataif *dataif, uint8 *buf, int32 len) { int32 i = 0; for(i = 0;i < len;i++){ _os_printf("%c",buf[i]); } return 0; } void user_sta_add(char *addr){ memcpy(mac_adr,addr,6); os_printf("user_sta_add:%x %x %x %x %x %x\r\n",addr[0],addr[1],addr[2],addr[3],addr[4],addr[5]); } void user_sta_del(char *addr){ memset(mac_adr,0,6); os_printf("user_sta_del:%x %x %x %x %x %x\r\n",addr[0],addr[1],addr[2],addr[3],addr[4],addr[5]); } void sta_ps_mode_enter(uint16 aid); void sta_ps_mode_exit(uint16 aid); void aid_to_mac(uint16 aid, uint8* mac); sysevt_hdl_res sysevt_wifi_event(uint32 event_id, uint32 data, uint32 priv){ uint8 mac[6]; switch(event_id&0xffff){ case SYSEVT_WIFI_DISCONNECT: aid_to_mac((uint16)data,mac); user_sta_del((char *)mac); sys_status.wifi_connected = 0; break; case SYSEVT_WIFI_CONNECTTED: aid_to_mac((uint16)data,mac); user_sta_add((char *)mac); #if BLE_PAIR_NET == 2 char *ble_pair_network_succ = "network_connect_succ"; struct lmac_ops *lops = (struct lmac_ops *)g_ops; struct bt_ops *bt_ops = (struct bt_ops *)lops->btops; os_printf("notify client: %s\r\n", ble_pair_network_succ); uble_gatt_notify(10, (uint8 *)ble_pair_network_succ, os_strlen(ble_pair_network_succ)); os_sleep(1); ble_demo_stop(bt_ops); ble_set_coexist_en(bt_ops, 0, 0); #endif //240327 if (sys_cfgs.wifi_mode == WIFI_MODE_STA) { if(sys_cfgs.dhcpc_en){//dynamic ip, lwip_netif_set_dhcp2("w0", 1); }else{ //static ip ip_addr_t addr; addr.addr = 0x0101A8C0 + ((data&0xff)<<24); lwip_netif_set_ip2("w0", &addr, NULL, NULL); os_printf("w0_ip= %x\r\n", lwip_netif_get_ip2("w0")); } } sys_status.wifi_connected = 1; { struct ieee80211_bss_wpadata bss_data; uint8_t bssid[6]; ieee80211_conf_get_bssid(WIFI_MODE_STA,bssid); ieee80211_bss_get_wpadata((uint8_t*)bssid,IEEE80211_BAND_2GHZ,&bss_data); int channel = ieee80211_conf_get_channel(WIFI_MODE_STA); #if 0 ieee80211_conf_get_ssid(sys_cfgs.wifi_mode, sys_cfgs.ssid); #endif syscfg_save_AP_msg((uint8_t*)bssid,channel,&bss_data); } break; case SYSEVT_WIFI_STA_DISCONNECT: aid_to_mac((uint16)data,mac); user_sta_del((char *)mac); break; case SYSEVT_WIFI_STA_CONNECTTED: aid_to_mac((uint16)data,mac); user_sta_add((char *)mac); break; case SYSEVT_WIFI_STA_PS_START: //sta_ps_mode_enter((uint16)data); break; case SYSEVT_WIFI_STA_PS_END: //sta_ps_mode_exit((uint16)data); break; case SYSEVT_WIFI_SCAN_DONE: os_printf("scan down.......\r\n"); break; //wifi配对完成事件,暂时没有响应 case SYSEVT_WIFI_PAIR_DONE: if (sys_status.pair_success) { ieee80211_conf_get_ssid(sys_cfgs.wifi_mode, sys_cfgs.ssid); ieee80211_conf_get_psk(sys_cfgs.wifi_mode, sys_cfgs.psk); sys_cfgs.key_mgmt = ieee80211_conf_get_keymgmt(sys_cfgs.wifi_mode); if((int32)data == 1 && sys_cfgs.wifi_mode == WIFI_MODE_STA){ os_printf(KERN_NOTICE"wifi pair done, ngo role AP!\r\n"); sys_cfgs.wifi_mode = WIFI_MODE_AP; ieee80211_iface_stop(WIFI_MODE_STA); wificfg_flush(WIFI_MODE_AP); ieee80211_iface_start(WIFI_MODE_AP); } if((int32)data == -1 && sys_cfgs.wifi_mode == WIFI_MODE_AP){ os_printf(KERN_NOTICE"wifi pair done, ngo role STA!\r\n"); sys_cfgs.wifi_mode = WIFI_MODE_STA; ieee80211_iface_stop(WIFI_MODE_AP); wificfg_flush(WIFI_MODE_STA); ieee80211_iface_start(WIFI_MODE_STA); } if(sys_cfgs.wifi_mode == WIFI_MODE_STA || data){ syscfg_save(); } } break; default: os_printf("no this event(%x)...\r\n",event_id); break; } return SYSEVT_CONTINUE; } sysevt_hdl_res sysevt_network_event(uint32 event_id, uint32 data, uint32 priv) { struct netif *nif; switch (event_id) { case SYS_EVENT(SYS_EVENT_NETWORK, SYSEVT_LWIP_DHCPC_DONE): nif = netif_find("w0"); sys_status.dhcpc_done = 1; #ifdef CONFIG_SLEEP err_t etharp_set_static(ip4_addr_t *ipaddr); err_t etharp_request(struct netif *netif, const ip4_addr_t *ipaddr); if(etharp_set_static(&nif->gw)){ etharp_request(nif, &nif->gw); } #endif os_printf("dhcp done, ip:"IPSTR", mask:"IPSTR", gw:"IPSTR"\r\n", IP2STR_N(nif->ip_addr.addr), IP2STR_N(nif->netmask.addr), IP2STR_N(nif->gw.addr)); break; } return SYSEVT_CONTINUE; } sysevt_hdl_res sysevt_lte_event(uint32 event_id, uint32 data, uint32 priv) { switch (event_id) { case SYS_EVENT(SYS_EVENT_LTE, SYSEVT_LTE_CONNECTED): os_printf("lte connected\r\n"); #ifndef STATIC_RNDIS_NETDEV if (sys_status.wifi_connected == 0) { lwip_netif_set_default((struct netdev *)dev_get(HG_LTE_RNDIS_DEVID)); lwip_netif_set_dhcp2("l0", 1); os_printf("start dhcp client on l0 ...\r\n"); } #endif break; } return SYSEVT_CONTINUE; } sysevt_hdl_res sysevt_ble_event(uint32 event_id, uint32 data, uint32 priv) { switch (event_id) { case SYS_EVENT(SYS_EVENT_BLE, SYSEVT_BLE_NETWORK_CONFIGURED): #if BLE_SUPPORT wpa_passphrase(sys_cfgs.ssid, sys_cfgs.passwd, sys_cfgs.psk); ieee80211_conf_set_ssid(WIFI_MODE_STA, sys_cfgs.ssid); ieee80211_conf_set_psk(WIFI_MODE_STA, sys_cfgs.psk); ieee80211_conf_set_keymgmt(WIFI_MODE_STA, sys_cfgs.key_mgmt); sys_cfgs.wifi_mode = WIFI_MODE_STA; syscfg_save(); ieee80211_iface_stop(WIFI_MODE_AP); ieee80211_iface_stop(WIFI_MODE_STA); wificfg_flush(WIFI_MODE_STA); netdev_set_wifi_mode((struct netdev *)dev_get(HG_WIFI0_DEVID), WIFI_MODE_STA); ieee80211_iface_start(WIFI_MODE_STA); #if BLE_PAIR_NET == 1 struct lmac_ops *lops = (struct lmac_ops *)g_ops; struct bt_ops *bt_ops = (struct bt_ops *)lops->btops; ble_demo_stop(bt_ops); #endif #endif break; } return SYSEVT_CONTINUE; } __init static void sys_wifi_start_acs(void *ops){ int32 ret; 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; ret = lmac_start_acs(ops, &acs_ctl, 1); //阻塞式扫描 if(ret != RET_ERR) { sys_cfgs.channel = ret; } } } } __init static void sys_wifi_parameter_init(void *ops) { lmac_set_rf_pwr_level(ops, WIFI_RF_PWR_LEVEL); #if WIFI_FEM_CHIP != LMAC_FEM_NONE lmac_set_fem(ops, WIFI_FEM_CHIP); //初始化FEM之后,不能进行RF档位选择! #endif #if WIFI_MODULE_80211W_EN lmac_bgn_module_80211w_init(ops); #endif lmac_set_rts(ops, WIFI_RTS_THRESHOLD); lmac_set_retry_cnt(ops, WIFI_TX_MAX_RETRY, WIFI_RTS_MAX_RETRY); lmac_set_txpower(ops, WIFI_TX_MAX_POWER); lmac_set_supp_rate(ops, WIFI_TX_SUPP_RATE); lmac_set_max_sta_cnt(ops, WIFI_MAX_STA_CNT); lmac_set_mcast_dup_txcnt(ops, WIFI_MULICAST_RETRY); lmac_set_max_ps_frame(ops, WIFI_MAX_PS_CNT); 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 #ifdef LMAC_BGN_PCF lmac_set_prevent_ps_mode(ops, 0);//bbm允许sta休眠 #endif #ifdef RATE_CONTROL_SELECT //lmac_rate_ctrl_mcs_mask(ops, 0); lmac_rate_ctrl_type(ops, RATE_CONTROL_SELECT); #endif //使用小电流时,就不使用增大发射功率的功率表 #if (WIFI_RF_PWR_LEVEL != 1) && (WIFI_RF_PWR_LEVEL != 2) #if (WIFI_FEM_CHIP == LMAC_FEM_GSR2701) || (WIFI_FEM_CHIP == LMAC_FEM_KCT8227D) || (WIFI_FEM_CHIP == LMAC_FEM_GSR2701_5V) uint8 gain_table[] = { 96, 96, 96, 96, 88, 88, 64, 64, // NON HT OFDM 96, 96, 96, 88, 88, 64, 64, 64, // HT 64, 64, 64, 64, // DSSS }; #else uint8 gain_table[] = { 125, 125, 105, 100, 85, 85, 64, 64, // NON HT OFDM 125, 105, 105, 85, 85, 64, 64, 64, // HT 80, 80, 80, 80, // DSSS }; #endif lmac_set_tx_modulation_gain(ops, gain_table, sizeof(gain_table)); #endif lmac_set_temperature_compesate_en(ops, WIFI_TEMPERATURE_COMPESATE_EN); 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 = 1; //cwmin最大值。如果觉得冲突太厉害,可以改成3 txq_max.cw_max = 3; //cwmax最大值。如果觉得冲突太厉害,可以改成7 lmac_set_edca_max(ops, &txq_max); lmac_set_tx_edca_slot_time(ops, 6); //6us是其他客户推荐的值 lmac_set_nav_max(ops, 0); //完全关闭NAV功能 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 } __init static void sys_wifi_test_mode_init(void *ops) { uint8 default_gain_table[] = { //gain默认值 64, 64, 64, 64, 64, 64, 64, 64, //OFDM 64, 64, 64, 64, 64, 64, 64, 64, //HT 64, 64, 64, 64, //DSSS }; #if WIFI_FEM_CHIP != LMAC_FEM_NONE lmac_set_fem(ops, WIFI_FEM_CHIP); //初始化FEM之后,不能进行RF档位选择! #endif lmac_set_tx_modulation_gain(ops, default_gain_table, sizeof(default_gain_table)); } __init static void sys_wifi_init() { void *ops; struct lmac_init_param lparam; #if DCDC_EN pmu_dcdc_open(); #endif void *rxbuf = (void*)os_malloc(WIFI_RX_BUFF_SIZE); if(!rxbuf) { os_printf("%s:%d\tmalloc size:%d fail\n",__FUNCTION__,__LINE__,WIFI_RX_BUFF_SIZE); return; } lparam.rxbuf = (uint32_t)rxbuf; lparam.rxbuf_size = WIFI_RX_BUFF_SIZE; ops = lmac_bgn_init(&lparam); #ifdef CONFIG_SLEEP void *bgn_dsleep_init(void *ops); bgn_dsleep_init(ops); #endif #ifdef LMAC_BGN_PCF lmac_set_bbm_mode_init(ops, 1); //init before ieee80211_support_txw80x #endif // enter wifi test mode if(system_is_wifi_test_mode()) { sys_wifi_test_mode_init(ops); return; } lmac_set_aggcnt(ops,0); lmac_set_rx_aggcnt(ops,0); #if BLE_SUPPORT g_ops = ops; ble_ll_init(ops); #endif #if WPA_CRYPTO_OPS #ifdef CONFIG_SAE ieee80211_crypto_bignum_support(); ieee80211_crypto_ec_support(); #endif #ifdef CONFIG_OWE ieee80211_crypto_ecdh_support(); #endif #ifdef CONFIG_WPS ieee80211_crypto_aes_support(); #endif #endif struct ieee80211_initparam param; os_memset(¶m, 0, sizeof(param)); param.vif_maxcnt = 2; param.sta_maxcnt = 2; param.bss_maxcnt = 2; param.bss_lifetime = 300; //300 seconds param.no_rxtask = 1; param.evt_cb = sys_wifi_event; ieee80211_init(¶m); ieee80211_support_txw80x(ops); sys_wifi_parameter_init(ops); ieee80211_iface_create_ap(WIFI_MODE_AP, IEEE80211_BAND_2GHZ); ieee80211_iface_create_sta(WIFI_MODE_STA, IEEE80211_BAND_2GHZ); #if NET_TO_QC == 1 qc_mode = wifi_qc_scan(WIFI_MODE_STA); #endif wificfg_flush(WIFI_MODE_STA); sys_mode_confirm(); sys_wifi_start_acs(ops); wificfg_flush(WIFI_MODE_AP); uint8 txq[][8] = { {0x00, 0x00, 0x01, 0x00, 0x02, 0x00, 0x01, 0x00,}, {0x00, 0x00, 0x01, 0x00, 0x02, 0x00, 0x01, 0x01,}, {0x00, 0x00, 0x01, 0x00, 0x02, 0x00, 0x01, 0x02,}, {0x00, 0x00, 0x01, 0x00, 0x02, 0x00, 0x01, 0x03,}, }; 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]); #if NET_PAIR ieee80211_pair_enable(WIFI_MODE_AP, 0x1234); ieee80211_pair_enable(WIFI_MODE_STA, 0x1234); set_pair_mode(0); #endif } static void sys_dhcpc_check(void) { if (sys_cfgs.dhcpc_en && !sys_status.dhcpc_done) { ip_addr_t ip = lwip_netif_get_ip2("w0"); if (ip.addr == 0) { lwip_netif_set_dhcp2("w0", 1); } } } __init static void sys_dhcpd_start() { //使用eloop机制去实现dhcp,所以要在lwip初始化完成并且eloop启动才能使用 struct dhcpd_param param; os_memset(¶m, 0, sizeof(param)); param.start_ip = sys_cfgs.dhcpd_startip; param.end_ip = sys_cfgs.dhcpd_endip; param.netmask = sys_cfgs.netmask; param.router = sys_cfgs.gw_ip; param.dns1 = sys_cfgs.gw_ip; param.lease_time = sys_cfgs.dhcpd_lease_time; if (dhcpd_start_eloop("w0", ¶m)) { os_printf("dhcpd start error\r\n"); } dns_start_eloop("w0"); } __init static void sys_network_init(void) { ip_addr_t ipaddr, netmask, gw; struct netdev *ndev; int offset = sys_cfgs.wifi_mode == WIFI_MODE_STA?WIFI_MODE_STA:WIFI_MODE_AP; tcpip_init(NULL, NULL); ndev = (struct netdev *)dev_get(HG_WIFI0_DEVID + offset - 1); if (ndev) { ipaddr.addr = sys_cfgs.ipaddr; netmask.addr = sys_cfgs.netmask; gw.addr = sys_cfgs.gw_ip; lwip_netif_add(ndev, "w0", &ipaddr, &netmask, &gw); lwip_netif_set_default(ndev); if (sys_cfgs.wifi_mode == WIFI_MODE_STA && sys_cfgs.dhcpc_en) { sys_status.dhcpc_done = 0; lwip_netif_set_dhcp(ndev, 1); os_printf("start dhcp client ...\r\n"); } os_printf("add w0 interface!\r\n"); }else{ os_printf("**not find wifi device**\r\n"); } } extern u8_t netif_num; void close_wifi(void) { struct netdev *ndev; if (sys_cfgs.wifi_mode == WIFI_MODE_AP) { ndev = (struct netdev *)dev_get(HG_WIFI1_DEVID); } else { ndev = (struct netdev *)dev_get(HG_WIFI0_DEVID); } if (ndev) { lwip_netif_set_dhcp(ndev, 0); os_sleep_ms(1); lwip_netif_remove(ndev); netif_num--; } } void open_wifi(void) { struct netdev *ndev; ip_addr_t ipaddr, netmask, gw; if (sys_cfgs.wifi_mode == WIFI_MODE_AP) { ndev = (struct netdev *)dev_get(HG_WIFI1_DEVID); //wificfg_flush(WIFI_MODE_AP); wifi_create_ap((char*)sys_cfgs.ssid, sys_cfgs.passwd, WPA_KEY_MGMT_NONE, sys_cfgs.channel); } else { ndev = (struct netdev *)dev_get(HG_WIFI0_DEVID); //wificfg_flush(WIFI_MODE_STA); // wifi_create_station("BGN_test", "12345678", WPA_KEY_MGMT_PSK); } if (ndev) { ipaddr.addr = sys_cfgs.ipaddr; netmask.addr = sys_cfgs.netmask; gw.addr = sys_cfgs.gw_ip; lwip_netif_add(ndev, "w0", &ipaddr, &netmask, &gw); lwip_netif_remove_register(ndev); lwip_netif_set_default(ndev); if (sys_cfgs.wifi_mode == WIFI_MODE_STA && sys_cfgs.dhcpc_en) { lwip_netif_set_dhcp(ndev, 1); } if (sys_cfgs.wifi_mode == WIFI_MODE_AP) { _os_printf("dhcpd start.....\r\n"); sys_dhcpd_start(); } os_printf("add w0 interface!\r\n"); } else { os_printf("**not find wifi device**\r\n"); } } void sys_wifi_close_open_thread(){ uint8 wifi_action = 0; while(1){ os_sleep_ms(30000); if(wifi_action){ wifi_action = 0; _os_printf("open wifi..............\r\n"); open_wifi(); }else{ wifi_action = 1; _os_printf("close wifi..............\r\n"); close_wifi(); } } } /* * wifi_exchange_mode: WIFI_MODE_AP or WIFI_MODE_STA */ __init static void sys_net_workmode_exchange(uint8 wifi_exchange_mode) { struct netdev *ndev; ip_addr_t ipaddr, netmask, gw; if(wifi_exchange_mode == sys_cfgs.wifi_mode){ return; } #ifdef CONFIG_UMAC4 if(sys_cfgs.wifi_mode == WIFI_MODE_AP){ ndev = (struct netdev *)dev_get(HG_WIFI1_DEVID); }else{ ndev = (struct netdev *)dev_get(HG_WIFI0_DEVID); } #else ndev = (struct netdev *)dev_get(HG_WIFI0_DEVID); #endif if (ndev){ lwip_netif_remove(ndev); } sys_cfgs.wifi_mode = wifi_exchange_mode; #ifdef CONFIG_UMAC4 if(sys_cfgs.wifi_mode == WIFI_MODE_AP){ ndev = (struct netdev *)dev_get(HG_WIFI1_DEVID); //wificfg_flush(WIFI_MODE_AP); wifi_create_ap("HG_TEST","12345678",WPA_KEY_MGMT_NONE,5); }else{ ndev = (struct netdev *)dev_get(HG_WIFI0_DEVID); //wificfg_flush(WIFI_MODE_STA); wifi_create_station("BGN_test","12345678",WPA_KEY_MGMT_PSK); } #else ndev = (struct netdev *)dev_get(HG_WIFI0_DEVID); #endif if(ndev){ ipaddr.addr = sys_cfgs.ipaddr; netmask.addr = sys_cfgs.netmask; gw.addr = sys_cfgs.gw_ip; lwip_netif_add(ndev, "w0", &ipaddr, &netmask, &gw); lwip_netif_remove_register(ndev); lwip_netif_set_default(ndev); if (sys_cfgs.wifi_mode == WIFI_MODE_STA && sys_cfgs.dhcpc_en) { lwip_netif_set_dhcp(ndev, 1); } if(sys_cfgs.wifi_mode == WIFI_MODE_AP){ sys_dhcpd_start(); } os_printf("add w0 interface!\r\n"); }else{ os_printf("**not find wifi device**\r\n"); } } __init ip_addr_t sys_network_get_ip(void){ return lwip_netif_get_ip2("w0"); } /******************************************** 应用相关的网络应用,eventLoop、默认一些socket 的监听等 ********************************************/ __init static void app_network_init() { #define ELOOP_TASK_HEAP 2048 eloop_init (); os_task_create("eloop_run", user_eloop_run, NULL, OS_TASK_PRIORITY_NORMAL, 0, NULL, ELOOP_TASK_HEAP); os_sleep_ms(1); if (sys_cfgs.wifi_mode == WIFI_MODE_AP) { //AP sys_dhcpd_start(); } //ota_Tcp_Server(); #if NET_TO_QC == 1 if (sys_cfgs.wifi_mode == WIFI_MODE_STA){ sta_send_udp_msg_init(); } #endif #if USB_EN || JPG_EN user_protocol(); #endif //#if SDH_EN && FS_EN && OPENDML_EN // extern void recv_record_Server(int port); // recv_record_Server(43210); // //#endif #ifdef CONFIG_UMAC4 #if BLE_SUPPORT #if BLE_PAIR_NET == 1 //配网仅仅支持station模式 if(sys_cfgs.wifi_mode == WIFI_MODE_STA) { //关闭wifi ieee80211_iface_stop(WIFI_MODE_STA); ieee80211_iface_stop(WIFI_MODE_AP); //启动蓝牙配网 //没有配过网络,先进行网络配置 if(!get_sys_cfgs_ble_pair_status()) { ble_reset_pair_network(38, 1); } //否则直接发送小无线 else { ble_reset_pair_network(38, NULL); } } #elif BLE_PAIR_NET == 2 struct lmac_ops *lops = (struct lmac_ops *)g_ops; struct bt_ops *bt_ops = (struct bt_ops *)lops->btops; ble_set_coexist_en(bt_ops, 1, 0); ble_demo_start(bt_ops, 2); #endif #endif #endif #if LOWPOWER_DEMO == 1 app_lowpower_init(); #endif } uint8 vcam_en() { uint8 ret = TRUE; #if VCAM_EN pmu_vcam_dis(); os_sleep_ms(1); pmu_set_vcam_vol(VCAM_VOL_2V80); pmu_vcam_lc_en(); pmu_vcam_oc_detect_dis(); pmu_vcam_oc_int_dis(); pmu_vcam_discharge_dis(); pmu_vcam_pg_dis(); #ifdef VCAM_33 pmu_set_vcam_vol(VCAM_VOL_3V25); pmu_vcam_en(); os_sleep_ms(1); pmu_vcam_pg_en(); #else pmu_vcam_en(); os_sleep_ms(1); #endif // sys_reset_pending_clr(); pmu_vcam_lc_dis(); #ifndef VCAM_33 pmu_vcam_oc_detect_en(); #endif if(PMU_VCAM_OC_PENDING){ return FALSE; } pmu_vcam_oc_detect_dis(); pmu_vcam_oc_int_dis(); pmu_lvd_oe_en(); #endif return ret; } void hardware_init(uint8 vcam) { //gpio_set_val(PC_7,1); //gpio_iomap_output(PC_7,GPIO_IOMAP_OUTPUT); if(vcam == FALSE) { os_printf("vcam err\n"); return; } //需要workqueue支持 stream_work_queue_start(); #if KEY_MODULE_EN == 1 keyWork_init(10); #endif #if FLASHDISK_EN flash_fatfs_init(); #endif #if JPG_EN //jpg_cfg(HG_JPG1_DEVID,VPP_DATA0); #if 1//SD_SAVE extern void jpg_cfg(uint8 jpgid,enum JPG_SRC_FROM src_from); #if BBM_DEMO jpg_cfg(HG_JPG0_DEVID,VPP_DATA1); #else jpg_cfg(HG_JPG0_DEVID,VPP_DATA0); #endif #endif #endif #if DVP_EN bool csi_ret; bool csi_cfg(); csi_ret = csi_cfg(); #endif //#if LCD_EN // // // #if LVGL_STREAM_ENABLE == 1 // uint16_t w,h; // uint16_t screen_w,screen_h; // uint8_t rotate,video_rotate; // extern stream *lvgl_R_osd_stream(const char *name); // extern stream *osd_show_stream(const char *name); // extern stream *yuv_recv_stream(const char *name); // lcd_hardware_init(&w,&h,&rotate,&screen_w,&screen_h,&video_rotate); // lcd_arg_setting(w,h,rotate,screen_w,screen_h,video_rotate); // lcd_driver_init((void*)lvgl_R_osd_stream(R_OSD_ENCODE),(void*)osd_show_stream(R_OSD_SHOW),(void*)yuv_recv_stream(R_VIDEO_P1),(void*)yuv_stream(R_VIDEO_P0)); // // #else // uint16_t w,h; // uint8_t rotate; // void lcd_module_run(uint16_t *w,uint16_t *h,uint8_t *rotate); // lcd_module_run(&w,&h,&rotate); // #endif //#endif #if DVP_EN bool csi_open(); if(csi_ret) csi_open(); #endif #if SDH_EN && FS_EN extern bool fatfs_register(); sd_open(); fatfs_register(); #endif #if SD_SAVE void sd_save_thread_start(); sd_save_thread_start(); #endif #if AUDIO_EN audio_adc_init(); #endif #if AUDIO_DAC_EN audio_da_init(); #endif //#if (USB_EN && RTT_USB_EN) // #if (USB_DETECT_EN && !USB_HOST_EN) // extern void hg_usb_connect_detect_init(void); // hg_usb_connect_detect_init(); // #else // #if USB_HOST_EN // extern rt_err_t hg_usbh_register(rt_uint32_t devid); // hg_usbh_register(HG_USB_HOST_CONTROLLER_DEVID); // #else // extern void hg_usbd_class_driver_register(); // extern int hg_usbd_register(rt_uint32_t devid); // hg_usbd_class_driver_register(); // hg_usbd_register(HG_USB_DEV_CONTROLLER_DEVID); // #endif // #endif // // //#endif // //#if (USB_EN && !RTT_USB_EN) // void hg_usb_test(void); // hg_usb_test(); //#endif //#if LCD_EN // void lvgl_init(uint16_t w,uint16_t h,uint8_t rotate); // lvgl_init(w,h,rotate); //#endif #if MP3_EN reg_mp3_malloc(custom_malloc_psram,custom_free_psram,custom_calloc_psram); #endif #if PRINTER_EN printer_thread_init(); #endif //user_hardware_config(); } static int32 main_loop(struct os_work *work) { static int8 print_interval = 0; sys_dhcpc_check(); if (print_interval++ >= 5) { uint32 sysheap_freesize(struct sys_heap *heap); os_printf("ip:%x freemem:%d\r\n", lwip_netif_get_ip2("w0").addr,sysheap_freesize(&sram_heap)); print_interval = 0; } #ifdef PSRAM_HEAP print_custom_psram(); #endif print_custom_sram(); os_printf("freemem:%d\r\n", sysheap_freesize(&sram_heap)); #ifdef CONFIG_SLEEP extern void dsleep_ip_addr_set(uint32 ip_addr); dsleep_ip_addr_set(lwip_netif_get_ip2("w0").addr); #endif os_run_work_delay(&main_wk, 1000); return 0; } //如果已经在project_config.h添加了CUSTOM_SIZE,就不需要再次定义 //放这里是为了调整空间的时候不需要修改project_config.h,减少编译时间 #ifndef CUSTOM_SIZE #ifdef PSRAM_HEAP #define CUSTOM_SIZE (5*1024) #else /********************************************************************** * 设置空间默认值(实际根据需求需要修改SYS_HEAP_SIZE以及CUSTOM_SIZE的值 * 这里给的默认值只是图传功能,如果是额外增加其他功能,比如录卡等,需要 * 自定义 * * * usb默认给113K * DVP默认给60K ***********************************************************************/ #if USB_EN == 1 #define CUSTOM_SIZE (113*1024) #elif DVP_EN == 1 #define CUSTOM_SIZE (60*1024) #else #define CUSTOM_SIZE (5*1024) #endif #endif #endif #ifndef SPEED_TEST_DEMO int main(void) { uint32 sysheap_freesize(struct sys_heap *heap); os_printf("freemem:%d\r\n",sysheap_freesize(&sram_heap)); #ifdef PSRAM_HEAP while(!get_psram_status()) { os_printf("psram no ready:%d\n",get_psram_status()); os_sleep_ms(1000); } #endif //sys_watchdog_pre_init(); #ifdef PSRAM_HEAP #ifdef CUSTOM_PSRAM_SIZE #if CUSTOM_PSRAM_SIZE > 0 { void *custom_buf = (void*)os_malloc_psram(CUSTOM_PSRAM_SIZE); custom_mem_psram_init(custom_buf,CUSTOM_PSRAM_SIZE); print_custom_psram(); } #endif #endif #endif #ifdef CUSTOM_SIZE #if CUSTOM_SIZE > 0 { void *custom_buf = (void*)os_malloc(CUSTOM_SIZE); custom_mem_init(custom_buf,CUSTOM_SIZE); print_custom_sram(); } #endif #endif uint8 vcam; //do_global_ctors(); //wifi_qc_mode_inspect(); //sys_watchdog_pre_init(); void *skb_pool_addr = (void*)os_malloc(SKB_POOL_SIZE); if(!skb_pool_addr) { while(1) { os_printf("skb malloc fail,malloc size:%d\tremain size:%d\n",SKB_POOL_SIZE,sysheap_freesize(&sram_heap)); os_sleep_ms(1000); } } skbpool_init((uint32_t)skb_pool_addr, SKB_POOL_SIZE, 80, 0); sys_cfg_load(); vcam = vcam_en(); user_io_preconfig(); sys_event_init(32); sys_event_take(SYS_EVENT(SYS_EVENT_WIFI, 0), sysevt_wifi_event, 0); sys_event_take(SYS_EVENT(SYS_EVENT_NETWORK, 0), sysevt_network_event, 0); sys_event_take(SYS_EVENT(SYS_EVENT_LTE, 0), sysevt_lte_event, 0); sys_event_take(SYS_EVENT(SYS_EVENT_BLE, 0), sysevt_ble_event, 0); //sys_atcmd_init(); sys_wifi_init(); // enter wifi test mode if(system_is_wifi_test_mode()) { system_reboot_normal_mode(); } else { sys_network_init(); //dsleep_test_init(); //udp_kalive_init("192.168.1.100", 60002, SYSTEM_SLEEP_TYPE_SRAM_WIFI, NULL); #if 1 hardware_init(vcam); #endif #ifdef CONFIG_SLEEP #if SYS_APP_DSLEEP_TEST sock_monitor_init(); dsleep_test_init(); #endif #endif app_network_init(); mcu_watchdog_timeout(5); OS_WORK_INIT(&main_wk, main_loop, 0); os_run_work_delay(&main_wk, 1000); } pmu_clr_deadcode_pending(); #ifdef LLM_DEMO extern void llm_demo(void); llm_demo(); #endif return 0; } //测试速率使用,wifi模式:RATE_CONTROL_SELECT请选择RATE_CONTROL_IPC #else #undef SKB_POOL_SIZE #define SKB_POOL_SIZE (150*1024) static int32 main_loop2(struct os_work *work) { struct os_task_info mytsk_info[20]; cpu_loading_print(1,mytsk_info,20); os_run_work_delay(&main_wk, 5000); return 0; } int main() { uint32 sysheap_freesize(struct sys_heap *heap); os_printf("freemem:%d\r\n",sysheap_freesize(&sram_heap)); #ifdef PSRAM_HEAP while(!get_psram_status()) { os_printf("psram no ready:%d\n",get_psram_status()); os_sleep_ms(1000); } #endif #ifdef PSRAM_HEAP #ifdef CUSTOM_PSRAM_SIZE #if CUSTOM_PSRAM_SIZE > 0 { void *custom_buf = (void*)os_malloc_psram(CUSTOM_PSRAM_SIZE); custom_mem_psram_init(custom_buf,CUSTOM_PSRAM_SIZE); print_custom_psram(); } #endif #endif #endif #ifdef CUSTOM_SIZE #if CUSTOM_SIZE > 0 { void *custom_buf = (void*)os_malloc(CUSTOM_SIZE); custom_mem_init(custom_buf,CUSTOM_SIZE); print_custom_sram(); } #endif #endif void *skb_pool_addr = (void*)os_malloc(SKB_POOL_SIZE); if(!skb_pool_addr) { while(1) { os_printf("skb malloc fail,malloc size:%d\tremain size:%d\n",SKB_POOL_SIZE,sysheap_freesize(&sram_heap)); os_sleep_ms(1000); } } skbpool_init((uint32_t)skb_pool_addr, SKB_POOL_SIZE, 80, 0); sys_cfg_load(); sys_event_init(32); sys_event_take(SYS_EVENT(SYS_EVENT_WIFI, 0), sysevt_wifi_event, 0); sys_event_take(SYS_EVENT(SYS_EVENT_LTE, 0), sysevt_lte_event, 0); sys_atcmd_init(); sys_wifi_init(); sys_network_init(); app_network_init(); mcu_watchdog_timeout(5); OS_WORK_INIT(&main_wk, main_loop2, 0); os_run_work_delay(&main_wk, 1000); //speedTest_tcp_server(20202); //speedTest_tcp_rx_server(20203); //Udp_rx_server(20204,1000); //Udp_to_ip("192.168.1.100",20202,0); return 0; } #endif