X-Git-Url: http://rtime.felk.cvut.cz/gitweb/pes-rpp/rpp-lib.git/blobdiff_plain/70cb8ee4c1219d5a8bb476f73d1d5aad533eac14..389491eb271c6219c1e3c9bfff425b38e35287ab:/rpp/src/rpp/gio.c diff --git a/rpp/src/rpp/gio.c b/rpp/src/rpp/gio.c index 4c4baad..4cbdefc 100644 --- a/rpp/src/rpp/gio.c +++ b/rpp/src/rpp/gio.c @@ -1,6 +1,7 @@ /* Copyright (C) 2013-2015 Czech Technical University in Prague * Authors: * - Michal Horn + * - Michal Sojka * * This document contains proprietary information belonging to Czech * Technical University in Prague. Passing on and copying of this @@ -9,31 +10,69 @@ * */ +#include "base.h" #include "rpp/gio.h" +#include "drv/gio_tab.h" static uint32_t ports_initialized = 0; /* Configuration consistency check */ -#if RPP_GIO_PORT_GIOA != (1 << PORT_ID_GIOA) || \ - RPP_GIO_PORT_GIOB != (1 << PORT_ID_GIOB) || \ - RPP_GIO_PORT_NHET1 != (1 << PORT_ID_HET1) -#error Port configuration is not consistent. -#endif +STATIC_ASSERT(RPP_GIO_PORT_GIOA == (1 << GIO_PORT_GIOA) && + RPP_GIO_PORT_GIOB == (1 << GIO_PORT_GIOB) && + RPP_GIO_PORT_NHET1 == (1 << GIO_PORT_HET1), + Port_configuration_is_not_consistent); int8_t rpp_gio_init(uint32_t init_ports) { - unsigned pin; + enum pin_name pin; gioREG->GCR0 = 1; // Bring GIO out of reset - for (pin = 0; pin < sizeof(pin_map)/sizeof(*pin_map); pin++) { - int port_num = hal_gpio_pin_get_port_num(pin_map[pin].pin_desc); + for (pin = (enum pin_name)0; pin < _PIN_COUNT; pin++) { + int port_num = gio_port(gio_table[pin].pin_dsc); if ((init_ports & (1 << port_num)) && !(ports_initialized & (1 << port_num))) - hal_gpio_pin_conf(pin_map[pin].pin_desc); + gio_setup(gio_table[pin].pin_dsc); } ports_initialized |= init_ports; return SUCCESS; } + +int8_t rpp_gio_set(enum pin_name pin, boolean_t value) +{ + if (ports_initialized == 0 || pin >= _PIN_COUNT || pin < 0) + return FAILURE; + + gio_tab_set(pin, value); + return SUCCESS; +} + +int8_t rpp_gio_get(enum pin_name pin) +{ + if (ports_initialized == 0 || pin >= _PIN_COUNT || pin < 0) + return FAILURE; + + return gio_tab_get(pin) ? 1 : 0; +} + +int8_t rpp_gio_setup(enum pin_name pin, enum rpp_gio_io io, enum rpp_gio_in_mode in_mode, + boolean_t open_drain) +{ + if (ports_initialized == 0 || pin >= _PIN_COUNT || pin < 0) + return FAILURE; + + uint32_t mode_flags[] = { + [RPP_GIO_MODE_PULLDIS] = GIO_PIN_CONF_MODE_PDIS, + [RPP_GIO_MODE_PULLUP] = GIO_PIN_CONF_MODE_PU | GIO_PIN_CONF_MODE_PEN, + [RPP_GIO_MODE_PULLDOWN] = GIO_PIN_CONF_MODE_PD | GIO_PIN_CONF_MODE_PEN, + }; + uint32_t dsc = gio_table[pin].pin_dsc & ~GIO_PIN_CONF_MASK; + dsc |= (io == RPP_GIO_OUT) ? GIO_PIN_CONF_DIR_OUT : GIO_PIN_CONF_DIR_IN; + dsc |= mode_flags[in_mode]; + dsc |= open_drain ? GIO_PIN_CONF_OD_ON : GIO_PIN_CONF_OD_OFF; + + gio_setup(dsc); + return SUCCESS; +}