diff options
author | Sebastian Huber <sebastian.huber@embedded-brains.de> | 2010-12-03 09:56:48 +0000 |
---|---|---|
committer | Sebastian Huber <sebastian.huber@embedded-brains.de> | 2010-12-03 09:56:48 +0000 |
commit | dd853a397350c0eecf3b47871c18b9a33a759cde (patch) | |
tree | 4d8c45debc9b73efa2efaa5013e85375149125c4 /c/src/lib/libbsp/arm/lpc24xx/misc | |
parent | 2010-12-03 Sebastian Huber <sebastian.huber@embedded-brains.de> (diff) | |
download | rtems-dd853a397350c0eecf3b47871c18b9a33a759cde.tar.bz2 |
2010-12-03 Sebastian Huber <sebastian.huber@embedded-brains.de>
* include/lcd.h, misc/lcd.c: New files.
* misc/io.c, include/io.h: Documentation, bug fixes, more
configurations.
* include/lpc24xx.h: Added DAC and I2S.
* Makefile.am, bsp_specs, preinstall.am, startup/bspstarthooks.c,
startup/linkcmds.lpc2362, startup/linkcmds.lpc23xx_tli800,
startup/linkcmds.lpc24xx_ea, startup/linkcmds.lpc24xx_ncs_ram,
startup/linkcmds.lpc24xx_ncs_rom_ext,
startup/linkcmds.lpc24xx_ncs_rom_int: Update due to linker command
file changes.
Diffstat (limited to 'c/src/lib/libbsp/arm/lpc24xx/misc')
-rw-r--r-- | c/src/lib/libbsp/arm/lpc24xx/misc/io.c | 40 | ||||
-rw-r--r-- | c/src/lib/libbsp/arm/lpc24xx/misc/lcd.c | 103 |
2 files changed, 129 insertions, 14 deletions
diff --git a/c/src/lib/libbsp/arm/lpc24xx/misc/io.c b/c/src/lib/libbsp/arm/lpc24xx/misc/io.c index 7d2198d4cd..6af279efad 100644 --- a/c/src/lib/libbsp/arm/lpc24xx/misc/io.c +++ b/c/src/lib/libbsp/arm/lpc24xx/misc/io.c @@ -53,7 +53,7 @@ typedef struct { unsigned pin_function : 3; } lpc24xx_io_entry; -typedef void (*lpc24xx_io_iterate_routine)(unsigned /* pin */, unsigned /* function */); +typedef void (*lpc24xx_io_iterate_routine)(unsigned pin, unsigned function); static const lpc24xx_io_entry lpc24xx_io_config_table [] = { /* UART */ @@ -78,6 +78,8 @@ static const lpc24xx_io_entry lpc24xx_io_config_table [] = { /* ADC */ LPC24XX_IO_ENTRY(LPC24XX_MODULE_ADC, 0, 0, 12, 0, 13, LPC24XX_IO_ALTERNATE_2), LPC24XX_IO_ENTRY(LPC24XX_MODULE_ADC, 1, 0, 23, 0, 25, LPC24XX_IO_ALTERNATE_0), + LPC24XX_IO_ENTRY(LPC24XX_MODULE_ADC, 2, 0, 26, 0, 26, LPC24XX_IO_ALTERNATE_0), + LPC24XX_IO_ENTRY(LPC24XX_MODULE_ADC, 2, 1, 30, 1, 31, LPC24XX_IO_ALTERNATE_2), /* I2C */ LPC24XX_IO_ENTRY(LPC24XX_MODULE_I2C_0, 0, 0, 27, 0, 28, LPC24XX_IO_ALTERNATE_0), @@ -88,6 +90,11 @@ static const lpc24xx_io_entry lpc24xx_io_config_table [] = { LPC24XX_IO_ENTRY(LPC24XX_MODULE_I2C_2, 1, 2, 30, 2, 31, LPC24XX_IO_ALTERNATE_2), LPC24XX_IO_ENTRY(LPC24XX_MODULE_I2C_2, 2, 4, 20, 4, 21, LPC24XX_IO_ALTERNATE_1), + /* I2S */ + LPC24XX_IO_ENTRY(LPC24XX_MODULE_I2S, 0, 0, 4, 0, 9, LPC24XX_IO_ALTERNATE_0), + LPC24XX_IO_ENTRY(LPC24XX_MODULE_I2S, 1, 0, 23, 0, 25, LPC24XX_IO_ALTERNATE_1), + LPC24XX_IO_ENTRY(LPC24XX_MODULE_I2S, 1, 2, 11, 2, 13, LPC24XX_IO_ALTERNATE_2), + /* SSP */ LPC24XX_IO_ENTRY(LPC24XX_MODULE_SSP_0, 0, 0, 15, 0, 18, LPC24XX_IO_ALTERNATE_1), LPC24XX_IO_ENTRY(LPC24XX_MODULE_SSP_0, 1, 1, 20, 0, 21, LPC24XX_IO_ALTERNATE_2), @@ -117,6 +124,14 @@ static const lpc24xx_io_entry lpc24xx_io_config_table [] = { LPC24XX_IO_ENTRY(LPC24XX_MODULE_LCD, 0, 2, 5, 2, 9, LPC24XX_IO_ALTERNATE_2), LPC24XX_IO_ENTRY(LPC24XX_MODULE_LCD, 0, 2, 12, 2, 13, LPC24XX_IO_ALTERNATE_0), LPC24XX_IO_ENTRY(LPC24XX_MODULE_LCD, 0, 4, 28, 4, 29, LPC24XX_IO_ALTERNATE_1), + LPC24XX_IO_ENTRY(LPC24XX_MODULE_LCD, 1, 1, 20, 1, 29, LPC24XX_IO_ALTERNATE_0), + LPC24XX_IO_ENTRY(LPC24XX_MODULE_LCD, 1, 2, 0, 2, 3, LPC24XX_IO_ALTERNATE_2), + LPC24XX_IO_ENTRY(LPC24XX_MODULE_LCD, 1, 2, 5, 2, 9, LPC24XX_IO_ALTERNATE_2), + LPC24XX_IO_ENTRY(LPC24XX_MODULE_LCD, 1, 2, 12, 2, 13, LPC24XX_IO_ALTERNATE_0), + LPC24XX_IO_ENTRY(LPC24XX_MODULE_LCD, 1, 4, 28, 4, 29, LPC24XX_IO_ALTERNATE_1), + + /* DAC */ + LPC24XX_IO_ENTRY(LPC24XX_MODULE_DAC, 0, 0, 26, 0, 26, LPC24XX_IO_ALTERNATE_1), /* Terminate */ LPC24XX_IO_ENTRY(LPC24XX_MODULE_COUNT, 0, 0, 0, 0, 0, 0) @@ -128,7 +143,7 @@ static rtems_status_code lpc24xx_io_iterate( lpc24xx_io_iterate_routine routine ) { - rtems_status_code sc = RTEMS_INVALID_ID; + rtems_status_code sc = RTEMS_SUCCESSFUL; const lpc24xx_io_entry *e = &lpc24xx_io_config_table [0]; while (e->module != LPC24XX_MODULE_COUNT) { @@ -156,17 +171,14 @@ static void lpc24xx_io_do_config(unsigned pin, unsigned function) rtems_interrupt_level level; unsigned select = LPC24XX_IO_SELECT(pin); unsigned shift = LPC24XX_IO_SELECT_SHIFT(pin); + unsigned mask = LPC24XX_IO_SELECT_MASK << shift; + unsigned pinsel = 0; rtems_interrupt_disable(level); - - LPC24XX_PINSEL [select] = - (LPC24XX_PINSEL [select] & ~(LPC24XX_IO_SELECT_MASK << shift)) - | ((function & LPC24XX_IO_SELECT_MASK) << shift); - - rtems_interrupt_flash(level); - - LPC24XX_PINMODE [select] &= ~(LPC24XX_IO_SELECT_MASK << shift); - + pinsel = LPC24XX_PINSEL [select]; + pinsel &= ~mask; + pinsel |= (function & LPC24XX_IO_SELECT_MASK) << shift; + LPC24XX_PINSEL [select] = pinsel; rtems_interrupt_enable(level); } @@ -175,10 +187,10 @@ static void lpc24xx_io_do_release(unsigned pin, unsigned function) rtems_interrupt_level level; unsigned select = LPC24XX_IO_SELECT(pin); unsigned shift = LPC24XX_IO_SELECT_SHIFT(pin); + unsigned mask = LPC24XX_IO_SELECT_MASK << shift; rtems_interrupt_disable(level); - LPC24XX_PINSEL [select] = - (LPC24XX_PINSEL [select] & ~(LPC24XX_IO_SELECT_MASK << shift)); + LPC24XX_PINSEL [select] &= ~mask; rtems_interrupt_enable(level); } @@ -277,7 +289,7 @@ static const lpc24xx_module_entry lpc24xx_module_table [] = { LPC24XX_MODULE_ENTRY(LPC24XX_MODULE_I2C_1, 1, 1, 19), LPC24XX_MODULE_ENTRY(LPC24XX_MODULE_I2C_2, 1, 1, 26), LPC24XX_MODULE_ENTRY(LPC24XX_MODULE_I2S, 1, 1, 27), - LPC24XX_MODULE_ENTRY(LPC24XX_MODULE_LCD, 1, 1, 20), + LPC24XX_MODULE_ENTRY(LPC24XX_MODULE_LCD, 1, 0, 20), LPC24XX_MODULE_ENTRY(LPC24XX_MODULE_MCI, 1, 1, 28), LPC24XX_MODULE_ENTRY(LPC24XX_MODULE_PCB, 0, 1, 18), LPC24XX_MODULE_ENTRY(LPC24XX_MODULE_PWM_0, 1, 1, 5), diff --git a/c/src/lib/libbsp/arm/lpc24xx/misc/lcd.c b/c/src/lib/libbsp/arm/lpc24xx/misc/lcd.c new file mode 100644 index 0000000000..d16f274625 --- /dev/null +++ b/c/src/lib/libbsp/arm/lpc24xx/misc/lcd.c @@ -0,0 +1,103 @@ +/** + * @file + * + * @ingroup lpc24xx_lcd + * + * @brief LCD support. + */ + +/* + * Copyright (c) 2010 embedded brains GmbH. All rights reserved. + * + * embedded brains GmbH + * Obere Lagerstr. 30 + * 82178 Puchheim + * Germany + * <rtems@embedded-brains.de> + * + * The license and distribution terms for this file may be + * found in the file LICENSE in this distribution or at + * http://www.rtems.com/license/LICENSE. + */ + +#include <assert.h> + +#include <bsp/lpc24xx.h> +#include <bsp/io.h> +#include <bsp/lcd.h> +#include <bsp/utility.h> +#include <bsp/system-clocks.h> + +#define LCD_ENABLE BSP_BIT32(0) + +rtems_status_code lpc24xx_lcd_set_mode(lpc24xx_lcd_mode mode, unsigned pin_config) +{ + rtems_status_code sc = RTEMS_SUCCESSFUL; + bool enable = false; + + switch (mode) { + case LCD_MODE_STN_4_BIT: + case LCD_MODE_STN_8_BIT: + case LCD_MODE_STN_DUAL_PANEL_4_BIT: + case LCD_MODE_STN_DUAL_PANEL_8_BIT: + case LCD_MODE_TFT_12_BIT_4_4_4: + case LCD_MODE_TFT_16_BIT_5_6_5: + case LCD_MODE_TFT_16_BIT_1_5_5_5: + case LCD_MODE_TFT_24_BIT: + enable = true; + break; + case LCD_MODE_DISABLED: + enable = false; + break; + default: + sc = RTEMS_IO_ERROR; + break; + } + + if (sc == RTEMS_SUCCESSFUL) { + if (enable) { + sc = lpc24xx_module_enable(LPC24XX_MODULE_LCD, LPC24XX_MODULE_PCLK_DEFAULT); + assert(sc == RTEMS_SUCCESSFUL); + + PINSEL11 = BSP_FLD32(mode, 1, 3) | LCD_ENABLE; + + sc = lpc24xx_io_config(LPC24XX_MODULE_LCD, pin_config); + assert(sc == RTEMS_SUCCESSFUL); + } else { + if (lpc24xx_lcd_current_mode() != LCD_MODE_DISABLED) { + uint32_t lcd_ctrl = LCD_CTRL; + + /* Disable power */ + lcd_ctrl &= ~BSP_BIT32(11); + LCD_CTRL = lcd_ctrl; + + lpc24xx_micro_seconds_delay(100000); + + /* Disable all signals */ + lcd_ctrl &= ~BSP_BIT32(0); + LCD_CTRL = lcd_ctrl; + } + + sc = lpc24xx_io_release(LPC24XX_MODULE_LCD, pin_config); + assert(sc == RTEMS_SUCCESSFUL); + + PINSEL11 = 0; + + sc = lpc24xx_module_disable(LPC24XX_MODULE_LCD); + assert(sc == RTEMS_SUCCESSFUL); + } + } + + return sc; +} + +lpc24xx_lcd_mode lpc24xx_lcd_current_mode(void) +{ + uint32_t pinsel11 = PINSEL11; + + if ((PCONP & BSP_BIT32(20)) != 0 && (pinsel11 & LCD_ENABLE) != 0) { + return BSP_FLD32GET(pinsel11, 1, 3); + } else { + return LCD_MODE_DISABLED; + } +} |