void gpio_set_level(enum gpio_signal signal, int value) { if (value) IT83XX_GPIO_DATA(gpio_list[signal].port) |= gpio_list[signal].mask; else IT83XX_GPIO_DATA(gpio_list[signal].port) &= ~gpio_list[signal].mask; }
void gpio_set_level(enum gpio_signal signal, int value) { uint32_t int_mask = get_int_mask(); /* critical section with interrupts off */ interrupt_disable(); if (value) IT83XX_GPIO_DATA(gpio_list[signal].port) |= gpio_list[signal].mask; else IT83XX_GPIO_DATA(gpio_list[signal].port) &= ~gpio_list[signal].mask; /* restore interrupts */ set_int_mask(int_mask); }
void gpio_set_flags_by_mask(uint32_t port, uint32_t mask, uint32_t flags) { uint32_t pin = 0; uint32_t mask_copy = mask; int irq; /* * Select open drain first, so that we don't glitch the signal * when changing the line to an output. */ if (flags & GPIO_OPEN_DRAIN) IT83XX_GPIO_GPOT(port) |= mask; else IT83XX_GPIO_GPOT(port) &= ~mask; /* To select 1.8v or 3.3v support. */ gpio_1p8v_3p3v_sel(port, mask, flags); /* If output, set level before changing type to an output. */ if (flags & GPIO_OUTPUT) { if (flags & GPIO_HIGH) IT83XX_GPIO_DATA(port) |= mask; else if (flags & GPIO_LOW) IT83XX_GPIO_DATA(port) &= ~mask; } /* For each bit high in the mask, set input/output and pullup/down. */ while (mask_copy > 0) { if (mask_copy & 1) { /* Set input or output. */ if (flags & GPIO_OUTPUT) IT83XX_GPIO_CTRL(CTRL_BASE(port), pin) = (IT83XX_GPIO_CTRL(CTRL_BASE(port), pin) | 0x40) & ~0x80; else IT83XX_GPIO_CTRL(CTRL_BASE(port), pin) = (IT83XX_GPIO_CTRL(CTRL_BASE(port), pin) | 0x80) & ~0x40; /* Handle pullup / pulldown */ if (flags & GPIO_PULL_UP) { IT83XX_GPIO_CTRL(CTRL_BASE(port), pin) = (IT83XX_GPIO_CTRL(CTRL_BASE(port), pin) | 0x04) & ~0x02; } else if (flags & GPIO_PULL_DOWN) { IT83XX_GPIO_CTRL(CTRL_BASE(port), pin) = (IT83XX_GPIO_CTRL(CTRL_BASE(port), pin) | 0x02) & ~0x04; } else { /* No pull up/down */ IT83XX_GPIO_CTRL(CTRL_BASE(port), pin) &= ~0x06; } } pin++; mask_copy >>= 1; } /* Set rising edge interrupt. */ if (flags & GPIO_INT_F_RISING) { irq = gpio_to_irq(port, mask); *(wuemr(gpio_irqs[irq].wuc_group)) &= ~gpio_irqs[irq].wuc_mask; } /* * Set falling edge or both edges interrupt. Note that pins in WUC * groups 7, 10, and 12 can only declare a falling edge trigger. All * other pins can only declare both edges as the trigger. * * TODO: use an assert to catch if a developer tries to declare one * type of interrupt on a pin that doesn't support that type. */ if (flags & GPIO_INT_F_FALLING) { irq = gpio_to_irq(port, mask); *(wuemr(gpio_irqs[irq].wuc_group)) |= gpio_irqs[irq].wuc_mask; } }
test_mockable int gpio_get_level(enum gpio_signal signal) { return (IT83XX_GPIO_DATA(gpio_list[signal].port) & gpio_list[signal].mask) ? 1 : 0; }