static void bcmgpio_timercb (bcm_timer_id tid, int gpio_pin) { unsigned long bitmask; if (bcmgpio_info[gpio_pin].strobing) { bitmask = (unsigned long) 1 << gpio_pin; bcmgpio_info[gpio_pin].timer_count++; if (bcmgpio_info[gpio_pin].timer_count == bcmgpio_info[gpio_pin].on_time) { bcmgpio_toggle (bitmask); } else if (bcmgpio_info[gpio_pin].timer_count > bcmgpio_info[gpio_pin].on_time) { if (bcmgpio_info[gpio_pin].timer_count == bcmgpio_info[gpio_pin].strobe_period) { bcmgpio_info[gpio_pin].timer_count = 0; if (bcmgpio_info[gpio_pin].tot_strobes > 0) { bcmgpio_info[gpio_pin].strobe_count++; if (bcmgpio_info[gpio_pin].strobe_count == bcmgpio_info[gpio_pin].tot_strobes) { bcmgpio_strobe_stop (gpio_pin); bcmgpio_out (bitmask, bcmgpio_info[gpio_pin].orig_state); if (bcmgpio_info[gpio_pin].strobe_done != NULL) *(bcmgpio_info[gpio_pin].strobe_done) = 1; return; } } bcmgpio_toggle (bitmask); } } } }
static void wps_gpio_led_multi_color_set_active(wps_blinktype_t blinktype) { unsigned long led_mask; unsigned long value; int new_gpio_active, new_assertlvl_active; int old_gpio_active = BCMGPIO_UNDEFINED; int old_assertlvl_active = WPS_LED_ASSERTLVL; new_gpio_active = wps_led.gpio; new_assertlvl_active = wps_led.assertlvl; switch ((int)blinktype) { case WPS_BLINKTYPE_INPROGRESS: /* Multi-color yellow */ if (wps_led.y_gpio != BCMGPIO_UNDEFINED) { new_gpio_active = wps_led.y_gpio; new_assertlvl_active = wps_led.y_assertlvl; } break; case WPS_BLINKTYPE_ERROR: /* Multi-color red */ case WPS_BLINKTYPE_OVERLAP: /* Multi-color red */ if (wps_led.r_gpio != BCMGPIO_UNDEFINED) { new_gpio_active = wps_led.r_gpio; new_assertlvl_active = wps_led.r_assertlvl; } break; case WPS_BLINKTYPE_SUCCESS: /* Multi-color green */ if (wps_led.g_gpio != BCMGPIO_UNDEFINED) { new_gpio_active = wps_led.g_gpio; new_assertlvl_active = wps_led.g_assertlvl; } break; default: new_gpio_active = BCMGPIO_UNDEFINED; new_assertlvl_active = WPS_LED_ASSERTLVL; break; } if (wps_led.gpio_active != new_gpio_active) { old_gpio_active = wps_led.gpio_active; old_assertlvl_active = wps_led.assertlvl_active; } /* change active led first */ wps_led.gpio_active = new_gpio_active; wps_led.assertlvl_active = new_assertlvl_active; /* then off old active led */ if (old_gpio_active == BCMGPIO_UNDEFINED) return; led_mask = ((unsigned long)1 << old_gpio_active); value = ((unsigned long) ~old_assertlvl_active << old_gpio_active); value &= led_mask; bcmgpio_out(led_mask, value); return; }
static void wps_gpio_led_on() { unsigned long led_mask; unsigned long value; if (wps_led.gpio_active == BCMGPIO_UNDEFINED) return; led_mask = ((unsigned long)1 << wps_led.gpio_active); value = ((unsigned long) wps_led.assertlvl_active << wps_led.gpio_active); bcmgpio_out(led_mask, value); }
static void wps_gpio_led_off(int gpio_active, int assertlvl_active) { unsigned long led_mask; unsigned long value; if (gpio_active == BCMGPIO_UNDEFINED) return; led_mask = ((unsigned long)1 << gpio_active); value = ((unsigned long) ~assertlvl_active << gpio_active); value &= led_mask; bcmgpio_out(led_mask, value); }