summaryrefslogtreecommitdiffstats
path: root/c/src/lib/libbsp/arm/lpc24xx/misc
diff options
context:
space:
mode:
authorSebastian Huber <sebastian.huber@embedded-brains.de>2010-12-03 09:56:48 +0000
committerSebastian Huber <sebastian.huber@embedded-brains.de>2010-12-03 09:56:48 +0000
commitdd853a397350c0eecf3b47871c18b9a33a759cde (patch)
tree4d8c45debc9b73efa2efaa5013e85375149125c4 /c/src/lib/libbsp/arm/lpc24xx/misc
parent2010-12-03 Sebastian Huber <sebastian.huber@embedded-brains.de> (diff)
downloadrtems-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.c40
-rw-r--r--c/src/lib/libbsp/arm/lpc24xx/misc/lcd.c103
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;
+ }
+}