Backport auf gcc 4.6
[hackover2013-badge-firmware.git] / core / gpio / gpio.c
index 3809a5e..2f03e9a 100644 (file)
 #include "gpio.h"
 
 #ifdef CFG_CHIBI
-#include "drivers/chibi/chb_drvr.h"
+#include "drivers/rf/chibi/chb_drvr.h"
 volatile uint32_t chibi_counter  = 0;
 #endif
 
+#ifdef CFG_ALTRESET
+#include "core/cpu/cpu.h"
+#endif
+
 static bool _gpioInitialised = false;
 
 /**************************************************************************/
 /*! 
     @brief IRQ Handler for GPIO port 0 (currently checks pin 0.1)
+
+    @note  By default, this IRQ handler is probably disabled in
+           projectconfig.h (see GPIO_ENABLE_IRQ0), but you can use
+           the code below as a model to implement this interrupt
+           handler in an appropriate place in your project.
 */
 /**************************************************************************/
+#if defined GPIO_ENABLE_IRQ0
 void PIOINT0_IRQHandler(void)
 {
   uint32_t regVal;
@@ -65,16 +75,27 @@ void PIOINT0_IRQHandler(void)
   }            
   return;
 }
+#endif
 
 /**************************************************************************/
 /*! 
     @brief IRQ Handler for GPIO port 1 (currently checks pin 1.1)
 */
 /**************************************************************************/
+#if defined GPIO_ENABLE_IRQ1
 void PIOINT1_IRQHandler(void)
 {
   uint32_t regVal;
 
+#if defined CFG_ALTRESET && CFG_ALTRESET_PORT == 1
+  regVal = gpioIntStatus(CFG_ALTRESET_PORT, CFG_ALTRESET_PIN);
+  if (regVal)
+  {
+    // Cause a reset and wait
+    cpuReset();
+  }
+#endif
+
 #ifdef CFG_CHIBI
   // Check for interrupt on 1.8
   regVal = gpioIntStatus(1, 8);
@@ -94,12 +115,19 @@ void PIOINT1_IRQHandler(void)
 
   return;
 }
+#endif
 
 /**************************************************************************/
 /*! 
     @brief IRQ Handler for GPIO port 2 (currently checks pin 2.1)
+
+    @note  By default, this IRQ handler is probably disabled in
+           projectconfig.h (see GPIO_ENABLE_IRQ2), but you can use
+           the code below as a model to implement this interrupt
+           handler in an appropriate place in your project.
 */
 /**************************************************************************/
+#if defined GPIO_ENABLE_IRQ2
 void PIOINT2_IRQHandler(void)
 {
   uint32_t regVal;
@@ -111,12 +139,19 @@ void PIOINT2_IRQHandler(void)
   }            
   return;
 }
+#endif
 
 /**************************************************************************/
 /*! 
     @brief IRQ Handler for GPIO port 3 (currently checks pin 3.1)
+
+    @note  By default, this IRQ handler is probably disabled in
+           projectconfig.h (see GPIO_ENABLE_IRQ3), but you can use
+           the code below as a model to implement this interrupt
+           handler in an appropriate place in your project.
 */
 /**************************************************************************/
+#if defined GPIO_ENABLE_IRQ3
 void PIOINT3_IRQHandler(void)
 {
   uint32_t regVal;
@@ -128,6 +163,7 @@ void PIOINT3_IRQHandler(void)
   }            
   return;
 }
+#endif
 
 /**************************************************************************/
 /*! 
@@ -191,85 +227,6 @@ void gpioSetDir (uint32_t portNum, uint32_t bitPos, gpioDirection_t dir)
   dir == gpioDirection_Output ? (*gpiodir |= (1 << bitPos)) : (*gpiodir &= ~(1 << bitPos));
 }
 
-/**************************************************************************/
-/*! 
-    @brief Gets the value for a specific port pin
-
-    @param[in]  portNum
-                The port number (0..3)
-    @param[in]  bitPos
-                The bit position (0..31)
-
-    @return     The current value for the specified port pin (0..1)
-*/
-/**************************************************************************/
-uint32_t gpioGetValue (uint32_t portNum, uint32_t bitPos)
-{
-  if (!_gpioInitialised) gpioInit();
-
-  uint32_t value = 0;
-
-  switch (portNum)
-  {
-    case 0:
-      value = (GPIO_GPIO0DATA & (1 << bitPos)) ? 1 : 0;
-      break;
-    case 1:
-      value = (GPIO_GPIO1DATA & (1 << bitPos)) ? 1 : 0;
-      break;
-    case 2:
-      value = (GPIO_GPIO2DATA & (1 << bitPos)) ? 1 : 0;
-      break;
-    case 3:
-      value = (GPIO_GPIO3DATA & (1 << bitPos)) ? 1 : 0;
-      break;
-    default:
-      break;
-  }
-
-  return value;
-}
-
-/**************************************************************************/
-/*! 
-    @brief Sets the value for a specific port pin (only relevant when a
-           pin is configured as output).
-
-    @param[in]  portNum
-                The port number (0..3)
-    @param[in]  bitPos
-                The bit position (0..31)
-    @param[in]  bitValue
-                The value to set for the specified bit (0..1).  0 will set
-                the pin low and 1 will set the pin high.
-*/
-/**************************************************************************/
-void gpioSetValue (uint32_t portNum, uint32_t bitPos, uint32_t bitVal)
-{
-  if (!_gpioInitialised) gpioInit();
-
-  // Get the appropriate register (handled this way to optimise code size)
-  REG32 *gpiodata = &GPIO_GPIO0DATA;
-  switch (portNum)
-  {
-    case 0:
-      gpiodata = &GPIO_GPIO0DATA;
-      break;
-    case 1:
-      gpiodata = &GPIO_GPIO1DATA;
-      break;
-    case 2:
-      gpiodata = &GPIO_GPIO2DATA;
-      break;
-    case 3:
-      gpiodata = &GPIO_GPIO3DATA;
-      break;
-  }
-
-  // Toggle value
-  bitVal == 1 ? (*gpiodata |= (1 << bitPos)) : (*gpiodata &= ~(1 << bitPos));
-}
-
 /**************************************************************************/
 /*! 
     @brief Sets the interrupt sense, event, etc.
@@ -312,9 +269,9 @@ void gpioSetInterrupt (uint32_t portNum, uint32_t bitPos, gpioInterruptSense_t s
   if (!_gpioInitialised) gpioInit();
 
   // Get the appropriate register (handled this way to optimise code size)
-  REG32 *gpiois  = &GPIO_GPIO0IS;
-  REG32 *gpioibe = &GPIO_GPIO0IBE;
-  REG32 *gpioiev = &GPIO_GPIO0IEV;
+  REG32 *gpiois  = &GPIO_GPIO0IS;   // Interrupt sense (edge or level sensitive)
+  REG32 *gpioibe = &GPIO_GPIO0IBE;  // Interrupt both edges (0 = int controlled by GPIOIEV, 1 = both edges trigger interrupt)
+  REG32 *gpioiev = &GPIO_GPIO0IEV;  // 0 = falling edge or low, 1 = rising edge or high (depending on GPIOIS)
   switch (portNum)
   {
     case 0:
@@ -339,18 +296,17 @@ void gpioSetInterrupt (uint32_t portNum, uint32_t bitPos, gpioInterruptSense_t s
       break;
   }
 
-  if (gpioInterruptSense_Edge)
+  if (sense == gpioInterruptSense_Edge)
   {
     *gpiois &= ~(0x1<<bitPos);
-    /* single or double only applies when sense is 0(edge trigger). */
-    gpioInterruptEdge_Single ? (*gpioibe &= ~(0x1<<bitPos)) : (*gpioibe |= (0x1<<bitPos));
+    edge == gpioInterruptEdge_Single ? (*gpioibe &= ~(0x1<<bitPos)) : (*gpioibe |= (0x1<<bitPos));
   }
   else
   {
     *gpiois |= (0x1<<bitPos);
   }
 
-  gpioInterruptEvent_ActiveHigh ? (*gpioiev &= ~(0x1<<bitPos)) : (*gpioiev |= (0x1<<bitPos));
+  event == gpioInterruptEvent_ActiveLow ? (*gpioiev &= ~(0x1<<bitPos)) : (*gpioiev |= (0x1<<bitPos));
 
   return;
 }
This page took 0.029484 seconds and 4 git commands to generate.