Example #1
0
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;
}
Example #2
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;
}
Example #3
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;
}
Example #4
0
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;
}