static int wps_gpio_led_multi_color_init(char *nv_wps_led, int *gpio_pin, char *nv_led_assertlvl, int *led_assertlvl) { char *value; *gpio_pin = bcmgpio_getpin(nv_wps_led, BCMGPIO_UNDEFINED); if (*gpio_pin != BCMGPIO_UNDEFINED) { WPS_GPIO("Using pin %d for %s output\n", *gpio_pin, nv_wps_led); if (bcmgpio_connect(*gpio_pin, BCMGPIO_DIRN_OUT) != 0) { WPS_GPIO("Error connecting GPIO %d to %s\n", *gpio_pin, nv_wps_led); *gpio_pin = BCMGPIO_UNDEFINED; return -1; } value = nvram_get(nv_led_assertlvl); if (value) { *led_assertlvl = atoi(value) ? 1 : 0; WPS_GPIO("Using assertlvl %d for %s\n", *led_assertlvl, nv_wps_led); } } return 0; }
int wps_gpio_btn_init() { char *value; /* Reset wps_btn structure */ memset(&wps_btn, 0, sizeof(wps_btn)); wps_btn.gpio = BCMGPIO_UNDEFINED; wps_btn.assertlvl = WPS_BTN_ASSERTLVL; wps_btn.status = WPS_NO_BTNPRESS; wps_btn.first_time = TRUE; wps_btn.prev_assertval = wps_btn.assertlvl ? 0 : 1; /* Determine the GPIO pins for the WPS Button */ wps_btn.gpio = bcmgpio_getpin(WPS_GPIO_BUTTON_VALUE, BCMGPIO_UNDEFINED); if (wps_btn.gpio != BCMGPIO_UNDEFINED) { WPS_GPIO("Using pin %d for wps button input\n", wps_btn.gpio); if (bcmgpio_connect(wps_btn.gpio, BCMGPIO_DIRN_IN) != 0) { WPS_ERROR("Error connecting GPIO %d to wps button\n", wps_btn.gpio); return -1; } value = nvram_get(WPS_NV_BTN_ASSERTLVL); if (value) { wps_btn.assertlvl = atoi(value) ? 1 : 0; wps_btn.prev_assertval = wps_btn.assertlvl ? 0 : 1; WPS_GPIO("Using assertlvl %d for wps button\n", wps_btn.assertlvl); } } return 0; }
int BCMINITFN(nvram_resetgpio_init)(void *si) { int gpio; si_t *sih; sih = (si_t *)si; gpio = bcmgpio_getpin(WPS_GPIO_BUTTON_VALUE); if ((gpio > 31) || (gpio < 0)) return -1; /* Setup GPIO input */ si_gpioouten(sih, ((uint32) 1 << gpio), 0, GPIO_DRV_PRIORITY); return gpio; }
int wps_gpio_led_init() { char *wps_led_def; /* Reset wps_led structure */ memset(&wps_led, 0, sizeof(wps_led)); wps_led.gpio = BCMGPIO_UNDEFINED; wps_led.y_gpio = BCMGPIO_UNDEFINED; wps_led.r_gpio = BCMGPIO_UNDEFINED; wps_led.g_gpio = BCMGPIO_UNDEFINED; wps_led.assertlvl = WPS_LED_ASSERTLVL; wps_led.y_assertlvl = WPS_LED_ASSERTLVL; wps_led.r_assertlvl = WPS_LED_ASSERTLVL; wps_led.g_assertlvl = WPS_LED_ASSERTLVL; wps_led.count = 0; wps_led.gpio_active = BCMGPIO_UNDEFINED; wps_led.assertlvl_active = WPS_LED_ASSERTLVL; /* Determine the GPIO pins for the WPS led */ /* * WPS led configuration rules: * 1. if "wps_led_y" && "wps_led_r" && "wps_led_g" are valid then "wps_led" is unused. * 2. if two of ("wps_led_y", "wps_led_r", "wps_led_g") are valid then wps_led_def is used * to indicate the default wps led. * 3. if none of ("wps_led_y", "wps_led_r", "wps_led_g") are valid then "wps_led" is used. * 4. if one of the initializations failed, return -1. */ if ((wps_led.y_gpio = bcmgpio_getpin(WPS_GPIO_LED_Y_VALUE, BCMGPIO_UNDEFINED)) != BCMGPIO_UNDEFINED) wps_led.count++; if ((wps_led.r_gpio = bcmgpio_getpin(WPS_GPIO_LED_R_VALUE, BCMGPIO_UNDEFINED)) != BCMGPIO_UNDEFINED) wps_led.count++; if ((wps_led.g_gpio = bcmgpio_getpin(WPS_GPIO_LED_G_VALUE, BCMGPIO_UNDEFINED)) != BCMGPIO_UNDEFINED) wps_led.count++; switch (wps_led.count) { case 0: wps_led.gpio = bcmgpio_getpin(WPS_GPIO_LED_VALUE, BCMGPIO_UNDEFINED); if (wps_led.gpio == BCMGPIO_UNDEFINED) { WPS_GPIO("No default wps led configuration\n"); return -1; } else { return wps_gpio_led_multi_color_init(WPS_GPIO_LED_VALUE, &wps_led.gpio, WPS_NV_LED_ASSERTLVL, &wps_led.assertlvl); } case 2: /* does default wps led match one of two */ wps_led_def = nvram_get(WPS_GPIO_LED_DEF_NAME); if (wps_led_def == NULL) { WPS_GPIO("No default wps led configuration\n"); return -1; } else { wps_led.gpio = atoi(wps_led_def); if (wps_led.y_gpio != wps_led.gpio && wps_led.r_gpio != wps_led.gpio && wps_led.g_gpio != wps_led.gpio) { WPS_GPIO("Default wps led configuration does not match" "any multi-color led\n"); return -1; } WPS_GPIO("Using pin %d for wps led default\n", wps_led.gpio); } /* do multi-color init */ if (wps_led.y_gpio != BCMGPIO_UNDEFINED && wps_gpio_led_multi_color_init(WPS_GPIO_LED_Y_VALUE, &wps_led.y_gpio, WPS_NV_LED_Y_ASSERTLVL, &wps_led.y_assertlvl) != 0) { return -1; } else if (wps_led.r_gpio != BCMGPIO_UNDEFINED && wps_gpio_led_multi_color_init(WPS_GPIO_LED_R_VALUE, &wps_led.r_gpio, WPS_NV_LED_R_ASSERTLVL, &wps_led.r_assertlvl) != 0) { if (wps_led.y_gpio != BCMGPIO_UNDEFINED) wps_gpio_led_multi_color_cleanup(&wps_led.y_gpio); return -1; } else if (wps_led.g_gpio != BCMGPIO_UNDEFINED && wps_gpio_led_multi_color_init(WPS_GPIO_LED_G_VALUE, &wps_led.g_gpio, WPS_NV_LED_G_ASSERTLVL, &wps_led.g_assertlvl) != 0) { if (wps_led.y_gpio != BCMGPIO_UNDEFINED) wps_gpio_led_multi_color_cleanup(&wps_led.y_gpio); if (wps_led.r_gpio != BCMGPIO_UNDEFINED) wps_gpio_led_multi_color_cleanup(&wps_led.r_gpio); return -1; } break; case 3: if (wps_gpio_led_multi_color_init(WPS_GPIO_LED_Y_VALUE, &wps_led.y_gpio, WPS_NV_LED_Y_ASSERTLVL, &wps_led.y_assertlvl) != 0) { return -1; } else if (wps_gpio_led_multi_color_init(WPS_GPIO_LED_R_VALUE, &wps_led.r_gpio, WPS_NV_LED_R_ASSERTLVL, &wps_led.r_assertlvl) != 0) { wps_gpio_led_multi_color_cleanup(&wps_led.y_gpio); return -1; } else if (wps_gpio_led_multi_color_init(WPS_GPIO_LED_G_VALUE, &wps_led.g_gpio, WPS_NV_LED_G_ASSERTLVL, &wps_led.g_assertlvl) != 0) { wps_gpio_led_multi_color_cleanup(&wps_led.y_gpio); wps_gpio_led_multi_color_cleanup(&wps_led.r_gpio); return -1; } /* * set default wps led to wps_led.y_gpio, we use wps_led.gpio * to indicate wps gpio led init successed. */ wps_led.gpio = wps_led.y_gpio; break; default: WPS_GPIO("Wrong wps led NV configuration, count %d\n", wps_led.count); return -1; } return 0; }