-/* Copyright (C) 2013-2014 Czech Technical University in Prague
+/* Copyright (C) 2013-2015 Czech Technical University in Prague
* Authors:
* - Michal Horn <hornmich@fel.cvut.cz>
*
#include "rpp/gio.h"
-static boolean_t gioa_initialized = FALSE;
-static boolean_t giob_initialized = FALSE;
-static boolean_t nhet_initialized = FALSE;
+static uint32_t ports_initialized = 0;
-int8_t rpp_gio_init(uint32_t ports)
+/* 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
+
+int8_t rpp_gio_init(uint32_t init_ports)
{
- uint8_t pin = 0;
-
- if (ports & RPP_GIO_PORT_GIOA && !gioa_initialized) {
- gioREG->GCR0 = 1; // Bring GIO out of reset
- for (pin = PIN_MAP_GIOA_BEGIN; pin <= PIN_MAP_GIOA_END; pin++) {
- hal_gpio_pin_conf(pin_map[pin].pin_desc);
- }
- gioa_initialized = TRUE;
- }
+ unsigned pin;
- if (ports & RPP_GIO_PORT_GIOB && !giob_initialized) {
- gioREG->GCR0 = 1; // Bring GIO out of reset
- for (pin = PIN_MAP_GIOB_BEGIN; pin <= PIN_MAP_GIOB_END; pin++) {
- hal_gpio_pin_conf(pin_map[pin].pin_desc);
- }
- giob_initialized = TRUE;
- }
+ gioREG->GCR0 = 1; // Bring GIO out of reset
+ pin_map_element_t* pin_map = hal_gpio_get_pin_map();
- if (ports & RPP_GIO_PORT_NHET1 && !nhet_initialized) {
- for (pin = PIN_MAP_HET1_BEGIN; pin <= PIN_MAP_HET1_END; pin++) {
- hal_gpio_pin_conf(pin_map[pin].pin_desc);
- }
- nhet_initialized = TRUE;
+
+ for (pin = 0; pin < hal_gpio_get_pin_cnt(); pin++) {
+ int port_num = hal_gpio_pin_get_port_num(pin_map[pin].pin_desc);
+ if ((init_ports & (1 << port_num)) &&
+ !(ports_initialized & (1 << port_num)))
+ hal_gpio_pin_configure(pin_map[pin].pin_desc);
}
+ ports_initialized |= init_ports;
+
return SUCCESS;
}