int gpio_init(gpio_t pin, gpio_mode_t mode) { switch (mode) { case GPIO_OUT: _SFR_MEM8(_ddr_addr(pin)) |= (1 << _pin_num(pin)); break; case GPIO_IN: _SFR_MEM8(_ddr_addr(pin)) &= ~(1 << _pin_num(pin)); _SFR_MEM8(_port_addr(pin)) &= ~(1 << _pin_num(pin)); break; case GPIO_IN_PU: _SFR_MEM8(_port_addr(pin)) |= (1 << _pin_num(pin)); break; default: return -1; } return 0; }
/** * @brief Generate the DDRx address of the given pin */ static inline uint16_t _ddr_addr(gpio_t pin) { return (_port_addr(pin) - 0x01); }
void gpio_clear(gpio_t pin) { _SFR_MEM8(_port_addr(pin)) &= ~(1 << _pin_num(pin)); }
void gpio_set(gpio_t pin) { _SFR_MEM8(_port_addr(pin)) |= (1 << _pin_num(pin)); }
/** * @brief Generate the PINx address of the given pin. */ static inline uint16_t _pin_addr(gpio_t pin) { return (_port_addr(pin) - 0x02); }