/* Copyright (C) 2013-2015 Czech Technical University in Prague
* Authors:
* - Michal Horn <hornmich@fel.cvut.cz>
+ * - Michal Sojka <sojkam1@fel.cvut.cz>
*
* This document contains proprietary information belonging to Czech
* Technical University in Prague. Passing on and copying of this
*
*/
+#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;
+}