X-Git-Url: https://codewiz.org/gitweb?a=blobdiff_plain;ds=sidebyside;f=bertos%2Fcpu%2Fcortex-m3%2Fdrv%2Fgpio_lm3s.c;h=6ed16e47340010be936bb36b20bbb2b1f2ba10b8;hb=b12629e93f75e4d8d0d750452d96d803f54489be;hp=770e55b4fd376283d228fae3dcdf68d4303fed8e;hpb=c711ce450d1e5156ba8d3fcfb57291c245e4c96f;p=bertos.git diff --git a/bertos/cpu/cortex-m3/drv/gpio_lm3s.c b/bertos/cpu/cortex-m3/drv/gpio_lm3s.c index 770e55b4..6ed16e47 100644 --- a/bertos/cpu/cortex-m3/drv/gpio_lm3s.c +++ b/bertos/cpu/cortex-m3/drv/gpio_lm3s.c @@ -35,135 +35,172 @@ * \author Andrea Righi */ + +#include "gpio_lm3s.h" + #include #include -#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 -/** - * 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; +}