void LED_Display_Mask(U32 mask, U32 leds) { // Use the LED descriptors to get the connections of a given LED to the MCU. tLED_DESCRIPTOR *led_descriptor = &LED_DESCRIPTOR[0] - 1; volatile avr32_gpio_port_t *led_gpio_port; U8 led_shift; // Make sure only existing LEDs are specified. mask &= (1 << LED_COUNT) - 1; // Update the saved state of all LEDs with the requested changes. Wr_bits(LED_State, mask, leds); // While there are specified LEDs left to manage... while (mask) { // Select the next specified LED and set it to the requested state. led_shift = 1 + ctz(mask); led_descriptor += led_shift; led_gpio_port = &AVR32_GPIO.port[led_descriptor->GPIO.PORT]; leds >>= led_shift - 1; if (leds & 1) { led_gpio_port->ovrc = led_descriptor->GPIO.PIN_MASK; } else { led_gpio_port->ovrs = led_descriptor->GPIO.PIN_MASK; } led_gpio_port->oders = led_descriptor->GPIO.PIN_MASK; led_gpio_port->gpers = led_descriptor->GPIO.PIN_MASK; leds >>= 1; mask >>= led_shift; } }
void LED_Display_Mask(U32 mask, U32 leds) { tLED_DESCRIPTOR *led_descriptor = &LED_DESCRIPTOR[0] - 1; volatile avr32_gpio_port_t *led_gpio_port; U8 led_shift; mask &= (1 << LED_COUNT) - 1; Wr_bits(LED_State, mask, leds); while (mask) { led_shift = 1 + ctz(mask); led_descriptor += led_shift; led_gpio_port = &AVR32_GPIO.port[led_descriptor->GPIO.PORT]; leds >>= led_shift - 1; if (leds & 1) { led_gpio_port->ovrc = led_descriptor->GPIO.PIN_MASK; } else { led_gpio_port->ovrs = led_descriptor->GPIO.PIN_MASK; } led_gpio_port->oders = led_descriptor->GPIO.PIN_MASK; led_gpio_port->gpers = led_descriptor->GPIO.PIN_MASK; leds >>= 1; mask >>= led_shift; } }