#include "gpio.h" gpio_port *get_gpio_dev(char port) { switch (port) { case 'a': case 'A': return ((gpio_port *)(GPIO_BASE)); case 'b': case 'B': return ((gpio_port *)(GPIO_BASE + 0xC)); case 'c': case 'C': return ((gpio_port *)(GPIO_BASE + 0x18)); case 'd': case 'D': return ((gpio_port *)(GPIO_BASE + 0x24)); }; return 0; } enum ERL_ERROR gpio_pin_config(char port, int pin, int val, int dir, int ctl) { gpio_port *gport = get_gpio_dev(port); if (!gport) { return ERL_SYSTEM_ERROR; } if ((pin < 0) || (pin > 31)) { return ERL_SYSTEM_ERROR; } if (val) gport->port_dr._val |= (1 << pin); else gport->port_dr._val &= ~(1 << pin); if (dir) gport->port_ddr._val |= (1 << pin); else gport->port_ddr._val &= ~(1 << pin); if (ctl) gport->port_ctl._val |= (1 << pin); else gport->port_ctl._val &= ~(1 << pin); return ERL_NO_ERROR; } enum ERL_ERROR gpio_pin_set(char port, int pin, int val) { gpio_port *gport = get_gpio_dev(port); if (!gport) { return ERL_SYSTEM_ERROR; } if ((pin < 0) || (pin > 31)) { return ERL_SYSTEM_ERROR; } if (val) gport->port_dr._val |= (1 << pin); else gport->port_dr._val &= ~(1 << pin); return ERL_NO_ERROR; } enum ERL_ERROR gpio_pin_invert(char port, int pin) { gpio_port *gport = get_gpio_dev(port); if (!gport) { return ERL_SYSTEM_ERROR; } if ((pin < 0) || (pin > 31)) { return ERL_SYSTEM_ERROR; } gport->port_dr._val ^= (1 << pin); return ERL_NO_ERROR; }