From: arighi Date: Wed, 7 Apr 2010 10:54:08 +0000 (+0000) Subject: lm3s1968: add generic GPIO configuration subsystem. X-Git-Tag: 2.5.0~508 X-Git-Url: https://codewiz.org/gitweb?a=commitdiff_plain;h=c711ce450d1e5156ba8d3fcfb57291c245e4c96f;p=bertos.git lm3s1968: add generic GPIO configuration subsystem. git-svn-id: https://src.develer.com/svnoss/bertos/trunk@3400 38d2e660-2303-0410-9eaa-f027e97ec537 --- diff --git a/bertos/cpu/cortex-m3/drv/gpio_lm3s.c b/bertos/cpu/cortex-m3/drv/gpio_lm3s.c new file mode 100644 index 00000000..770e55b4 --- /dev/null +++ b/bertos/cpu/cortex-m3/drv/gpio_lm3s.c @@ -0,0 +1,169 @@ +/** + * \file + * + * + * \brief LM3S1968 GPIO control interface. + * + * \author Andrea Righi + */ + +#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; +} + +/** + * 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 direction and mode */ + switch (mode) + { + case GPIO_DIR_MODE_IN: + HWREG(port + GPIO_O_DIR) &= ~pins; + HWREG(port + GPIO_O_AFSEL) &= ~pins; + break; + case GPIO_DIR_MODE_OUT: + HWREG(port + GPIO_O_DIR) |= pins; + HWREG(port + GPIO_O_AFSEL) &= ~pins; + break; + case GPIO_DIR_MODE_HW: + HWREG(port + GPIO_O_DIR) &= ~pins; + HWREG(port + GPIO_O_AFSEL) |= pins; + break; + default: + ASSERT(0); + return -1; + } + /* Set the output strength */ + switch (strength) + { + 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: + 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: + 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: + 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: + ASSERT(0); + return -1; + } + /* Set the pin type */ + switch (type) + { + 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: + 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: + 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: + 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: + 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: + 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: + 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: + ASSERT(0); + return -1; + } + return 0; +} diff --git a/bertos/cpu/cortex-m3/drv/gpio_lm3s.h b/bertos/cpu/cortex-m3/drv/gpio_lm3s.h new file mode 100644 index 00000000..70179cfc --- /dev/null +++ b/bertos/cpu/cortex-m3/drv/gpio_lm3s.h @@ -0,0 +1,75 @@ +/** + * \file + * + * + * \brief LM3S1968 GPIO control interface. + */ + +#ifndef GPIO_LM3S_H +#define GPIO_LM3S_H + +/** + * GPIO mode + */ +/*\{*/ +#define GPIO_DIR_MODE_IN 0x00000000 //< Pin is a GPIO input +#define GPIO_DIR_MODE_OUT 0x00000001 //< Pin is a GPIO output +#define GPIO_DIR_MODE_HW 0x00000002 //< Pin is a peripheral function +/*\}*/ + +/** + * GPIO strenght + */ +/*\{*/ +#define GPIO_STRENGTH_2MA 0x00000001 //< 2mA drive strength +#define GPIO_STRENGTH_4MA 0x00000002 //< 4mA drive strength +#define GPIO_STRENGTH_8MA 0x00000004 //< 8mA drive strength +#define GPIO_STRENGTH_8MA_SC 0x0000000C //< 8mA drive with slew rate control +/*\}*/ + +/** + * GPIO type + */ +/*\{*/ +#define GPIO_PIN_TYPE_STD 0x00000008 //< Push-pull +#define GPIO_PIN_TYPE_STD_WPU 0x0000000A //< Push-pull with weak pull-up +#define GPIO_PIN_TYPE_STD_WPD 0x0000000C //< Push-pull with weak pull-down +#define GPIO_PIN_TYPE_OD 0x00000009 //< Open-drain +#define GPIO_PIN_TYPE_OD_WPU 0x0000000B //< Open-drain with weak pull-up +#define GPIO_PIN_TYPE_OD_WPD 0x0000000D //< Open-drain with weak pull-down +#define GPIO_PIN_TYPE_ANALOG 0x00000000 //< Analog comparator +/*\}*/ + +int lm3s_gpio_pin_config(uint32_t port, uint8_t pins, + uint32_t mode, uint32_t strength, uint32_t type); +void lm3s_gpio_pin_write(uint32_t port, uint8_t pins, uint8_t val); + +#endif /* GPIO_LM3S_H */ diff --git a/bertos/cpu/cortex-m3/drv/kdebug_lm3s.c b/bertos/cpu/cortex-m3/drv/kdebug_lm3s.c index 7bcfc9ba..a0c7209f 100644 --- a/bertos/cpu/cortex-m3/drv/kdebug_lm3s.c +++ b/bertos/cpu/cortex-m3/drv/kdebug_lm3s.c @@ -40,6 +40,7 @@ #include "clock_lm3s.h" /* __delay() */ #include "cfg/cfg_debug.h" #include "io/lm3s.h" +#include "gpio_lm3s.h" INLINE void uart_disable(size_t base) { @@ -125,14 +126,9 @@ INLINE void kdbg_hw_init(void) SYSCTL_RCGC1_R |= SYSCTL_RCGC1_UART0; SYSCTL_RCGC2_R |= SYSCTL_RCGC2_GPIOA; __delay(512); - /* Set GPIO A0 and A1 as UART pins */ - HWREG(GPIO_PORTA_BASE + GPIO_O_DIR) |= BV(0) | BV(1); - HWREG(GPIO_PORTA_BASE + GPIO_O_AFSEL) |= BV(0) | BV(1); - HWREG(GPIO_PORTA_BASE + GPIO_O_DR2R) |= BV(0) | BV(1); - HWREG(GPIO_PORTA_BASE + GPIO_O_DEN) |= BV(0) | BV(1); - HWREG(GPIO_PORTA_BASE + GPIO_O_AMSEL) &= ~(BV(0) | BV(1)); - + lm3s_gpio_pin_config(GPIO_PORTA_BASE, BV(0) | BV(1), + GPIO_DIR_MODE_HW, GPIO_STRENGTH_2MA, GPIO_PIN_TYPE_STD); /* 115.200, 8-bit word, no parity, one stop bit */ uart_config(UART0_BASE, CONFIG_KDEBUG_BAUDRATE, UART_LCRH_WLEN_8); } diff --git a/bertos/cpu/cortex-m3/drv/ssi_lm3s.h b/bertos/cpu/cortex-m3/drv/ssi_lm3s.h index 69b88ac2..901f6288 100644 --- a/bertos/cpu/cortex-m3/drv/ssi_lm3s.h +++ b/bertos/cpu/cortex-m3/drv/ssi_lm3s.h @@ -75,4 +75,4 @@ INLINE void lm3s_ssi_wait_txdone(uint32_t base) cpu_relax(); } -#endif /* LM3S_SSI_H */ +#endif /* SSI_LM3S_H */