#include #include #include #include #include #include #include #include #include "utils.h" #include "shutils.h" #include "shared.h" #if defined(RTCONFIG_BLINK_LED) #include #endif #ifdef RTCONFIG_RALINK // TODO: make it switch model dependent, not product dependent #include "rtkswitch.h" #endif #if defined(RTCONFIG_EXT_RTL8365MB) || defined(RTCONFIG_EXT_RTL8370MB) #include #endif int led_control(int which, int mode); static int gpio_values_loaded = 0; int btn_rst_gpio = 0x0ff; int btn_wps_gpio = 0xff; int led_gpio_table[LED_ID_MAX]; int wan_port = 0xff; int fan_gpio = 0xff; int have_fan_gpio = 0xff; #ifdef RTCONFIG_WIRELESS_SWITCH int btn_wifi_sw = 0xff; #endif #ifdef RTCONFIG_WIFI_TOG_BTN int btn_wltog_gpio = 0xff; #endif #ifdef RTCONFIG_TURBO int btn_turbo_gpio = 0xff; #endif #ifdef RTCONFIG_LED_BTN int btn_led_gpio = 0xff; #endif #ifdef RTCONFIG_INTERNAL_GOBI int btn_lte_gpio = 0xff; #endif #ifdef RTCONFIG_SWMODE_SWITCH #if defined(PLAC66U) int btn_swmode_sw_router = 0xff; #else int btn_swmode_sw_router = 0xff; int btn_swmode_sw_repeater = 0xff; int btn_swmode_sw_ap = 0xff; #endif /* Model */ #endif /* RTCONFIG_SWMODE_SWITCH */ #ifdef RTCONFIG_QTN int reset_qtn_gpio = 0xff; #endif int extract_gpio_pin(const char *gpio) { char *p; if (!gpio || !(p = nvram_get(gpio))) return -1; return (atoi(p) & GPIO_PIN_MASK); } int init_gpio(void) { char *btn_list[] = { "btn_rst_gpio", "btn_wps_gpio", "fan_gpio", "have_fan_gpio" #ifdef RTCONFIG_WIRELESS_SWITCH , "btn_wifi_gpio" #endif #ifdef RTCONFIG_WIFI_TOG_BTN , "btn_wltog_gpio" #endif #ifdef RTCONFIG_SWMODE_SWITCH #if defined(PLAC66U) , "btn_swmode1_gpio" #else , "btn_swmode1_gpio", "btn_swmode2_gpio", "btn_swmode3_gpio" #endif /* Mode */ #endif /* RTCONFIG_SWMODE_SWITCH */ #ifdef RTCONFIG_TURBO , "btn_turbo_gpio" #endif #ifdef RTCONFIG_LED_BTN , "btn_led_gpio" #endif #ifdef RTCONFIG_INTERNAL_GOBI , "btn_lte_gpio" #endif }; char *led_list[] = { "led_turbo_gpio", "led_pwr_gpio", "led_usb_gpio", "led_wps_gpio", "fan_gpio", "have_fan_gpio", "led_lan_gpio", "led_wan_gpio", "led_usb3_gpio", "led_2g_gpio", "led_5g_gpio" #ifdef RTCONFIG_LAN4WAN_LED , "led_lan1_gpio", "led_lan2_gpio", "led_lan3_gpio", "led_lan4_gpio" #endif /* LAN4WAN_LED */ #ifdef RTCONFIG_LED_ALL , "led_all_gpio" #endif , "led_wan_red_gpio" #ifdef RTCONFIG_QTN , "reset_qtn_gpio" #endif #ifdef RTCONFIG_USBRESET , "pwr_usb_gpio" , "pwr_usb_gpio2" #endif #ifdef RTCONFIG_WIFIPWR , "pwr_2g_gpio" , "pwr_5g_gpio" #endif #ifdef RTCONFIG_INTERNAL_GOBI , "led_3g_gpio", "led_lte_gpio", "led_sig1_gpio", "led_sig2_gpio", "led_sig3_gpio", "led_sig4_gpio" #endif #if (defined(PLN12) || defined(PLAC56)) , "plc_wake_gpio" , "led_pwr_red_gpio" , "led_2g_green_gpio", "led_2g_orange_gpio", "led_2g_red_gpio" , "led_5g_green_gpio", "led_5g_orange_gpio", "led_5g_red_gpio" #endif #ifdef RTCONFIG_MMC_LED , "led_mmc_gpio" #endif #if defined(RTCONFIG_RTAC5300) || defined(RTCONFIG_RTAC5300R) , "rpm_fan_gpio" #endif #ifdef RTCONFIG_RESET_SWITCH , "reset_switch_gpio" #endif }; int use_gpio, gpio_pin; int enable, disable; int i; #ifdef RTCONFIG_INTERNAL_GOBI void get_gpio_values_once(int); get_gpio_values_once(0); // for filling data to led_gpio_table[] #endif /* RTCONFIG_INTERNAL_GOBI */ /* btn input */ for(i = 0; i < ASIZE(btn_list); i++) { if (!nvram_get(btn_list[i])) continue; use_gpio = nvram_get_int(btn_list[i]); if((gpio_pin = use_gpio & 0xff) == 0xff) continue; gpio_dir(gpio_pin, GPIO_DIR_IN); } /* led output */ for(i = 0; i < ASIZE(led_list); i++) { if (!nvram_get(led_list[i])) continue; #if defined(RTCONFIG_ETRON_XHCI_USB3_LED) if (!strcmp(led_list[i], "led_usb3_gpio") && nvram_match("led_usb3_gpio", "etron")) { led_control(LED_USB3, LED_OFF); continue; } #endif use_gpio = nvram_get_int(led_list[i]); if((gpio_pin = use_gpio & 0xff) == 0xff) continue; #if defined(RTCONFIG_RALINK_MT7620) if(gpio_pin == 72) //skip 2g wifi led NOT to be gpio LED continue; #endif disable = (use_gpio&GPIO_ACTIVE_LOW)==0 ? 0: 1; gpio_dir(gpio_pin, GPIO_DIR_OUT); /* If WAN RED LED is defined, keep it on until Internet connection ready in router mode. */ if (!strcmp(led_list[i], "led_wan_red_gpio") && nvram_get_int("sw_mode") == SW_MODE_ROUTER) disable = !disable; set_gpio(gpio_pin, disable); #ifdef RTCONFIG_INTERNAL_GOBI // save setting value { int i; char led[16]; for(i=0; i= LED_ID_MAX || mode < 0 || mode >= LED_FAN_MODE_MAX) return -1; get_gpio_values_once(0); use_gpio = led_gpio_table[which]; gpio_nr = use_gpio & 0xFF; #if defined(RTCONFIG_ETRON_XHCI_USB3_LED) if (which == LED_USB3 && nvram_match("led_usb3_gpio", "etron")) { char *onoff = "2"; /* LED OFF */ if (mode == LED_ON || mode == FAN_ON || mode == HAVE_FAN_ON) onoff = "3"; /* LED ON */ f_write_string("/sys/bus/pci/drivers/xhci_hcd/port_led", onoff, 0, 0); return 0; } #endif #if defined(RTAC56U) || defined(RTAC56S) if (which == LED_5G && nvram_match("5g_fail", "1")) return -1; #endif if (use_gpio < 0 || gpio_nr == 0xFF) return -1; if (use_gpio & GPIO_ACTIVE_LOW) v ^= 1; if (mode == LED_OFF) { stop_bled(use_gpio); } set_gpio(gpio_nr, v); if (mode == LED_ON) { start_bled(use_gpio); } return 0; } #ifdef RTCONFIG_INTERNAL_GOBI void led_control_lte(int percent) { if(percent >= 0) { //high priority led for LTE int LTE_LED[] = { LED_SIG1, LED_SIG2, LED_SIG3, LED_USB, LED_LAN, LED_2G, LED_5G, LED_WAN, LED_LTE, LED_POWER }; int i; nvram_set(LED_CTRL_HIPRIO, "1"); for(i = 0; i < ARRAY_SIZE(LTE_LED); i++) { if((percent/9) > i) do_led_control(LTE_LED[i], LED_ON); else do_led_control(LTE_LED[i], LED_OFF); } } else if(nvram_match(LED_CTRL_HIPRIO, "1")) { //restore int which, mode; char name[16]; char *p; nvram_unset(LED_CTRL_HIPRIO); for(which = 0; which < LED_ID_MAX; which++) { sprintf(name, "led%02d", which); if ((p = nvram_get(name)) != NULL) { mode = atoi(p); do_led_control(which, mode); } } } } #endif /* RTCONFIG_INTERNAL_GOBI */ extern uint32_t get_phy_status(uint32_t portmask); extern uint32_t set_phy_ctrl(uint32_t portmask, int ctrl); int wanport_status(int wan_unit) { #if defined(RTCONFIG_RALINK) || defined(RTCONFIG_QCA) return rtkswitch_wanPort_phyStatus(wan_unit); #else char word[100], *next; int mask; char wan_ports[16]; memset(wan_ports, 0, 16); #ifndef RTN53 if(nvram_get_int("sw_mode") == SW_MODE_AP) strcpy(wan_ports, "lanports"); else #endif if(wan_unit == 1) strcpy(wan_ports, "wan1ports"); else strcpy(wan_ports, "wanports"); mask = 0; foreach(word, nvram_safe_get(wan_ports), next) { mask |= (0x0001<