STM32: USB: endpoint buffer must be 4-bytes aligned
[bertos.git] / bertos / cpu / cortex-m3 / drv / gpio_lm3s.c
index 770e55b4fd376283d228fae3dcdf68d4303fed8e..6ed16e47340010be936bb36b20bbb2b1f2ba10b8 100644 (file)
  * \author Andrea Righi <arighi@develer.com>
  */
 
+
+#include "gpio_lm3s.h"
+
 #include <cfg/compiler.h>
 #include <cfg/debug.h>
-#include "io/lm3s.h"
-#include "gpio_lm3s.h"
 
-/* Write a value to the specified pin(s) */
-void lm3s_gpio_pin_write(uint32_t port, uint8_t pins, uint8_t val)
-{
-       HWREG(port + (GPIO_O_DATA + (pins << 2))) = val;
-}
+#include <io/lm3s.h>
 
-/**
- * Configure a GPIO pin
- *
- * @port: the base address of the GPIO port
- * @pins: the bit-packed representation of the pin(s)
- * @mode: the pin(s) configuration mode
- * @strength: the output drive strength
- * @type: the pin(s) type
- *
- * Return 0 on success, otherwise a negative value.
- */
-int lm3s_gpio_pin_config(uint32_t port, uint8_t pins,
-               uint32_t mode, uint32_t strength, uint32_t type)
+
+/* Set the pin(s) direction and mode */
+INLINE int lm3s_gpioPinConfigMode(uint32_t port, uint8_t pins, uint32_t mode)
 {
-       /* Set the pin direction and mode */
-       switch (mode)
+       if (mode == GPIO_DIR_MODE_IN)
        {
-       case GPIO_DIR_MODE_IN:
                HWREG(port + GPIO_O_DIR)   &= ~pins;
                HWREG(port + GPIO_O_AFSEL) &= ~pins;
-               break;
-       case GPIO_DIR_MODE_OUT:
+       }
+       else if (mode == GPIO_DIR_MODE_OUT)
+       {
                HWREG(port + GPIO_O_DIR)   |= pins;
                HWREG(port + GPIO_O_AFSEL) &= ~pins;
-               break;
-       case GPIO_DIR_MODE_HW:
+       }
+       else if (mode == GPIO_DIR_MODE_HW)
+       {
                HWREG(port + GPIO_O_DIR)   &= ~pins;
                HWREG(port + GPIO_O_AFSEL) |= pins;
-               break;
-       default:
+       }
+       else
+       {
                ASSERT(0);
                return -1;
        }
-       /* Set the output strength */
-       switch (strength)
+       return 0;
+}
+
+/* Set the pin(s) output strength */
+INLINE int
+lm3s_gpioPinConfigStrength(uint32_t port, uint8_t pins, uint32_t strength)
+{
+       if (strength == GPIO_STRENGTH_2MA)
        {
-       case GPIO_STRENGTH_2MA:
                HWREG(port + GPIO_O_DR2R) |= pins;
                HWREG(port + GPIO_O_DR4R) &= ~pins;
                HWREG(port + GPIO_O_DR8R) &= ~pins;
                HWREG(port + GPIO_O_SLR)  &= ~pins;
-               break;
-       case GPIO_STRENGTH_4MA:
+       }
+       else if (strength == GPIO_STRENGTH_4MA)
+       {
                HWREG(port + GPIO_O_DR2R) &= ~pins;
                HWREG(port + GPIO_O_DR4R) |= pins;
                HWREG(port + GPIO_O_DR8R) &= ~pins;
                HWREG(port + GPIO_O_SLR)  &= ~pins;
-               break;
-       case GPIO_STRENGTH_8MA:
+       }
+       else if (strength == GPIO_STRENGTH_8MA)
+       {
                HWREG(port + GPIO_O_DR2R) &= ~pins;
                HWREG(port + GPIO_O_DR4R) &= ~pins;
                HWREG(port + GPIO_O_DR8R) |= pins;
                HWREG(port + GPIO_O_SLR)  &= ~pins;
-               break;
-       case GPIO_STRENGTH_8MA_SC:
+       }
+       else if (strength == GPIO_STRENGTH_8MA_SC)
+       {
                HWREG(port + GPIO_O_DR2R) &= ~pins;
                HWREG(port + GPIO_O_DR4R) &= ~pins;
                HWREG(port + GPIO_O_DR8R) |= pins;
                HWREG(port + GPIO_O_SLR)  |= pins;
-               break;
-       default:
+       }
+       else
+       {
                ASSERT(0);
                return -1;
        }
-       /* Set the pin type */
-       switch (type)
+       return 0;
+}
+
+/* Set the pin(s) type */
+INLINE int lm3s_gpioPinConfigType(uint32_t port, uint8_t pins, uint32_t type)
+{
+       if (type == GPIO_PIN_TYPE_STD)
        {
-       case GPIO_PIN_TYPE_STD:
                HWREG(port + GPIO_O_ODR)   &= ~pins;
                HWREG(port + GPIO_O_PUR)   &= ~pins;
                HWREG(port + GPIO_O_PDR)   &= ~pins;
                HWREG(port + GPIO_O_DEN)   |= pins;
                HWREG(port + GPIO_O_AMSEL) &= ~pins;
-               break;
-       case GPIO_PIN_TYPE_STD_WPU:
+       }
+       else if (type == GPIO_PIN_TYPE_STD_WPU)
+       {
                HWREG(port + GPIO_O_ODR)   &= ~pins;
                HWREG(port + GPIO_O_PUR)   |= pins;
                HWREG(port + GPIO_O_PDR)   &= ~pins;
                HWREG(port + GPIO_O_DEN)   |= pins;
                HWREG(port + GPIO_O_AMSEL) &= ~pins;
-               break;
-       case GPIO_PIN_TYPE_STD_WPD:
+       }
+       else if (type == GPIO_PIN_TYPE_STD_WPD)
+       {
                HWREG(port + GPIO_O_ODR)   &= ~pins;
                HWREG(port + GPIO_O_PUR)   &= ~pins;
                HWREG(port + GPIO_O_PDR)   |= pins;
                HWREG(port + GPIO_O_DEN)   |= pins;
                HWREG(port + GPIO_O_AMSEL) &= ~pins;
-               break;
-       case GPIO_PIN_TYPE_OD:
+       }
+       else if (type == GPIO_PIN_TYPE_OD)
+       {
                HWREG(port + GPIO_O_ODR)   |= pins;
                HWREG(port + GPIO_O_PUR)   &= ~pins;
                HWREG(port + GPIO_O_PDR)   &= ~pins;
                HWREG(port + GPIO_O_DEN)   |= pins;
                HWREG(port + GPIO_O_AMSEL) &= ~pins;
-               break;
-       case GPIO_PIN_TYPE_OD_WPU:
+       }
+       else if (type == GPIO_PIN_TYPE_OD_WPU)
+       {
                HWREG(port + GPIO_O_ODR)   |= pins;
                HWREG(port + GPIO_O_PUR)   |= pins;
                HWREG(port + GPIO_O_PDR)   &= ~pins;
                HWREG(port + GPIO_O_DEN)   |= pins;
                HWREG(port + GPIO_O_AMSEL) &= ~pins;
-               break;
-       case GPIO_PIN_TYPE_OD_WPD:
+       }
+       else if (type == GPIO_PIN_TYPE_OD_WPD)
+       {
                HWREG(port + GPIO_O_ODR)   |= pins;
                HWREG(port + GPIO_O_PUR)   &= pins;
                HWREG(port + GPIO_O_PDR)   |= pins;
                HWREG(port + GPIO_O_DEN)   |= pins;
                HWREG(port + GPIO_O_AMSEL) &= ~pins;
-               break;
-       case GPIO_PIN_TYPE_ANALOG:
+       }
+       else if (type == GPIO_PIN_TYPE_ANALOG)
+       {
                HWREG(port + GPIO_O_ODR)   &= ~pins;
                HWREG(port + GPIO_O_PUR)   &= ~pins;
                HWREG(port + GPIO_O_PDR)   &= ~pins;
                HWREG(port + GPIO_O_DEN)   &= ~pins;
                HWREG(port + GPIO_O_AMSEL) |= pins;
-       default:
+       }
+       else
+       {
                ASSERT(0);
                return -1;
        }
        return 0;
 }
+
+/**
+ * Configure a GPIO pin
+ *
+ * \param port Base address of the GPIO port
+ * \param pins Bit-packed representation of the pin(s)
+ * \param mode Pin(s) configuration mode
+ * \param strength Output drive strength
+ * \param type Pin(s) type
+ *
+ * Return 0 on success, otherwise a negative value.
+ */
+int lm3s_gpioPinConfig(uint32_t port, uint8_t pins,
+               uint32_t mode, uint32_t strength, uint32_t type)
+{
+       int ret;
+
+       ret = lm3s_gpioPinConfigMode(port, pins, mode);
+       if (UNLIKELY(ret < 0))
+               return ret;
+       ret = lm3s_gpioPinConfigStrength(port, pins, strength);
+       if (UNLIKELY(ret < 0))
+               return ret;
+       ret = lm3s_gpioPinConfigType(port, pins, type);
+       if (UNLIKELY(ret < 0))
+               return ret;
+       return 0;
+}