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 | |
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')
-rw-r--r-- | c/src/lib/libbsp/arm/lpc24xx/ChangeLog | 13 | ||||
-rw-r--r-- | c/src/lib/libbsp/arm/lpc24xx/Makefile.am | 5 | ||||
-rw-r--r-- | c/src/lib/libbsp/arm/lpc24xx/bsp_specs | 2 | ||||
-rw-r--r-- | c/src/lib/libbsp/arm/lpc24xx/include/io.h | 76 | ||||
-rw-r--r-- | c/src/lib/libbsp/arm/lpc24xx/include/lcd.h | 77 | ||||
-rw-r--r-- | c/src/lib/libbsp/arm/lpc24xx/include/lpc24xx.h | 12 | ||||
-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 | ||||
-rw-r--r-- | c/src/lib/libbsp/arm/lpc24xx/preinstall.am | 16 | ||||
-rw-r--r-- | c/src/lib/libbsp/arm/lpc24xx/startup/bspstarthooks.c | 35 | ||||
-rw-r--r-- | c/src/lib/libbsp/arm/lpc24xx/startup/linkcmds.lpc2362 | 12 | ||||
-rw-r--r-- | c/src/lib/libbsp/arm/lpc24xx/startup/linkcmds.lpc23xx_tli800 | 16 | ||||
-rw-r--r-- | c/src/lib/libbsp/arm/lpc24xx/startup/linkcmds.lpc24xx_ea | 8 | ||||
-rw-r--r-- | c/src/lib/libbsp/arm/lpc24xx/startup/linkcmds.lpc24xx_ncs_ram | 8 | ||||
-rw-r--r-- | c/src/lib/libbsp/arm/lpc24xx/startup/linkcmds.lpc24xx_ncs_rom_ext | 2 | ||||
-rw-r--r-- | c/src/lib/libbsp/arm/lpc24xx/startup/linkcmds.lpc24xx_ncs_rom_int | 12 |
16 files changed, 369 insertions, 68 deletions
diff --git a/c/src/lib/libbsp/arm/lpc24xx/ChangeLog b/c/src/lib/libbsp/arm/lpc24xx/ChangeLog index 71cb2ecd5f..967a5180a6 100644 --- a/c/src/lib/libbsp/arm/lpc24xx/ChangeLog +++ b/c/src/lib/libbsp/arm/lpc24xx/ChangeLog @@ -1,3 +1,16 @@ +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. + 2010-11-12 Sebastian Huber <sebastian.huber@embedded-brains.de> * misc/system-clocks.c: Use define instead of function call to allow diff --git a/c/src/lib/libbsp/arm/lpc24xx/Makefile.am b/c/src/lib/libbsp/arm/lpc24xx/Makefile.am index 5de0e98ba7..cfaa62edf5 100644 --- a/c/src/lib/libbsp/arm/lpc24xx/Makefile.am +++ b/c/src/lib/libbsp/arm/lpc24xx/Makefile.am @@ -34,9 +34,9 @@ include_bsp_HEADERS += ../../shared/include/irq-info.h include_bsp_HEADERS += ../../shared/include/stackalloc.h include_bsp_HEADERS += ../../shared/include/uart-output-char.h include_bsp_HEADERS += ../../shared/tod.h -include_bsp_HEADERS += ../shared/include/linker-symbols.h include_bsp_HEADERS += ../shared/include/start.h include_bsp_HEADERS += ../shared/lpc/include/lpc-timer.h +include_bsp_HEADERS += ../shared/lpc/include/lpc-i2s.h include_bsp_HEADERS += include/irq.h include_bsp_HEADERS += include/lpc24xx.h include_bsp_HEADERS += include/system-clocks.h @@ -44,6 +44,7 @@ include_bsp_HEADERS += include/ssp.h include_bsp_HEADERS += include/dma.h include_bsp_HEADERS += include/i2c.h include_bsp_HEADERS += include/io.h +include_bsp_HEADERS += include/lcd.h include_bsp_HEADERS += include/lpc-clock-config.h include_bsp_HEADERS += include/lpc-ethernet-config.h @@ -62,7 +63,6 @@ libbspstart_a_SOURCES = ../shared/start/start.S project_lib_DATA = start.$(OBJEXT) project_lib_DATA += startup/linkcmds -project_lib_DATA += ../shared/startup/linkcmds.base EXTRA_DIST = startup/linkcmds.lpc24xx_ea EXTRA_DIST += startup/linkcmds.lpc24xx_ncs_rom_int EXTRA_DIST += startup/linkcmds.lpc24xx_ncs_rom_ext @@ -123,6 +123,7 @@ libbsp_a_SOURCES += misc/system-clocks.c \ misc/dma-copy.c \ misc/bspidle.c \ misc/io.c \ + misc/lcd.c \ misc/timer.c # SSP diff --git a/c/src/lib/libbsp/arm/lpc24xx/bsp_specs b/c/src/lib/libbsp/arm/lpc24xx/bsp_specs index 9be7e23eb6..082653ad22 100644 --- a/c/src/lib/libbsp/arm/lpc24xx/bsp_specs +++ b/c/src/lib/libbsp/arm/lpc24xx/bsp_specs @@ -4,7 +4,7 @@ *startfile: %{!qrtems: %(old_startfile)} \ -%{!nostdlib: %{qrtems: start.o%s crti.o%s crtbegin.o%s -e start}} +%{!nostdlib: %{qrtems: start.o%s crti.o%s crtbegin.o%s -e _start}} *link: %{!qrtems: %(old_link)} %{qrtems: -dc -dp -N} diff --git a/c/src/lib/libbsp/arm/lpc24xx/include/io.h b/c/src/lib/libbsp/arm/lpc24xx/include/io.h index a29cf44357..6d19eb1c05 100644 --- a/c/src/lib/libbsp/arm/lpc24xx/include/io.h +++ b/c/src/lib/libbsp/arm/lpc24xx/include/io.h @@ -37,6 +37,65 @@ extern "C" { * * @brief Input and output module. * + * <table> + * <tr><th>Module</th><th>Configuration</th><th>First Pin</th><th>Last Pin</th></tr> + * <tr><td>UART 0</td><td>0</td><td>P0.2</td><td>P0.3</td></tr> + * <tr><td rowspan=3>UART 1</td><td>0</td><td>P0.15</td><td>P0.16</td></tr> + * <tr><td>1</td><td>P2.0</td><td>P2.1</td></tr> + * <tr><td>2</td><td>P3.16</td><td>P3.17</td></tr> + * <tr><td rowspan=3>UART 2</td><td>0</td><td>P0.10</td><td>P0.11</td></tr> + * <tr><td>1</td><td>P2.8</td><td>P2.9</td></tr> + * <tr><td>2</td><td>P4.22</td><td>P4.23</td></tr> + * <tr><td rowspan=3>UART 3</td><td>0</td><td>P0.0</td><td>P0.1</td></tr> + * <tr><td>1</td><td>P0.25</td><td>P0.26</td></tr> + * <tr><td>2</td><td>P4.28</td><td>P4.29</td></tr> + * <tr><td rowspan=5>ETHERNET</td><td>0</td><td>P1.0</td><td>P1.17</td></tr> + * <tr><td rowspan=4>1</td><td>P1.0</td><td>P1.1</td></tr> + * <tr><td>P1.4</td><td>P1.4</td></tr> + * <tr><td>P1.8</td><td>P1.10</td></tr> + * <tr><td>P1.14</td><td>P1.17</td></tr> + * <tr><td rowspan=4>ADC</td><td>0</td><td>P0.12</td><td>P0.13</td></tr> + * <tr><td>1</td><td>P0.23</td><td>P0.25</td></tr> + * <tr><td rowspan=2>2</td><td>P0.26</td><td>P0.26</td></tr> + * <tr><td>P1.30</td><td>P1.31</td></tr> + * <tr><td>I2C 0</td><td>0</td><td>P0.27</td><td>P0.28</td></tr> + * <tr><td rowspan=3>I2C 1</td><td>0</td><td>P0.0</td><td>P0.1</td></tr> + * <tr><td>1</td><td>P0.19</td><td>P0.20</td></tr> + * <tr><td>2</td><td>P2.14</td><td>P2.15</td></tr> + * <tr><td rowspan=3>I2C 2</td><td>0</td><td>P0.10</td><td>P0.11</td></tr> + * <tr><td>1</td><td>P2.30</td><td>P2.31</td></tr> + * <tr><td>2</td><td>P4.20</td><td>P4.21</td></tr> + * <tr><td rowspan=3>I2S</td><td>0</td><td>P0.4</td><td>P0.9</td></tr> + * <tr><td rowspan=2>1</td><td>P0.23</td><td>P0.25</td></tr> + * <tr><td>P2.11</td><td>P2.13</td></tr> + * <tr><td rowspan=5>SSP 0</td><td>0</td><td>P0.15</td><td>P0.18</td></tr> + * <tr><td rowspan=2>1</td><td>P1.20</td><td>P0.21</td></tr> + * <tr><td>P1.23</td><td>P0.24</td></tr> + * <tr><td rowspan=2>2</td><td>P2.22</td><td>P2.23</td></tr> + * <tr><td>P2.26</td><td>P2.27</td></tr> + * <tr><td rowspan=5>SSP 1</td><td>0</td><td>P0.6</td><td>P0.9</td></tr> + * <tr><td rowspan=3>1</td><td>P0.12</td><td>P0.13</td></tr> + * <tr><td>P0.14</td><td>P0.14</td></tr> + * <tr><td>P1.31</td><td>P1.31</td></tr> + * <tr><td>2</td><td>P4.20</td><td>P4.23</td></tr> + * <tr><td rowspan=2>USB</td><td rowspan=2>0</td><td>P0.29</td><td>P0.30</td></tr> + * <tr><td>P1.19</td><td>P1.19</td></tr> + * <tr><td>SPI</td><td>0</td><td>P0.15</td><td>P0.18</td></tr> + * <tr><td>PWM 1</td><td>0</td><td>P2.0</td><td>P2.0</td></tr> + * <tr><td rowspan=11>LCD</td><td rowspan=6>0</td><td>P0.4</td><td>P0.9</td></tr> + * <tr><td>P1.20</td><td>P1.29</td></tr> + * <tr><td>P2.0</td><td>P2.3</td></tr> + * <tr><td>P2.5</td><td>P2.9</td></tr> + * <tr><td>P2.12</td><td>P2.13</td></tr> + * <tr><td>P4.28</td><td>P4.29</td></tr> + * <tr><td rowspan=5>1</td><td>P1.20</td><td>P1.29</td></tr> + * <tr><td>P2.0</td><td>P2.3</td></tr> + * <tr><td>P2.5</td><td>P2.9</td></tr> + * <tr><td>P2.12</td><td>P2.13</td></tr> + * <tr><td>P4.28</td><td>P4.29</td></tr> + * <tr><td>DAC</td><td>0</td><td>P0.26</td><td>P0.26</td></tr> + * </table> + * * @{ */ @@ -123,11 +182,28 @@ rtems_status_code lpc24xx_module_disable( lpc24xx_module module ); +/** + * @brief Applies the configuration with index @a config for the @a module. + * + * The pin mode will not be altered. + * + * @retval RTEMS_SUCCESSFUL Successful operation. + * @retval RTEMS_INVALID_ID Invalid module or configuration. + */ rtems_status_code lpc24xx_io_config( lpc24xx_module module, unsigned config ); +/** + * @brief Releases the configuration with index @a config for the @a module. + * + * The pins are set to general purpose IO function. The pin mode will not be + * altered. + * + * @retval RTEMS_SUCCESSFUL Successful operation. + * @retval RTEMS_INVALID_ID Invalid module or configuration. + */ rtems_status_code lpc24xx_io_release( lpc24xx_module module, unsigned config diff --git a/c/src/lib/libbsp/arm/lpc24xx/include/lcd.h b/c/src/lib/libbsp/arm/lpc24xx/include/lcd.h new file mode 100644 index 0000000000..7a0a986259 --- /dev/null +++ b/c/src/lib/libbsp/arm/lpc24xx/include/lcd.h @@ -0,0 +1,77 @@ +/** + * @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. + */ + +#ifndef LIBBSP_ARM_LPC24XX_LCD_H +#define LIBBSP_ARM_LPC24XX_LCD_H + +#include <rtems.h> + +#ifdef __cplusplus +extern "C" { +#endif + +/** + * @defgroup lpc_dma LCD Support + * + * @ingroup lpc24xx + * + * @brief LCD support. + * + * @{ + */ + +typedef enum { + LCD_MODE_STN_4_BIT = 0, + LCD_MODE_STN_8_BIT, + LCD_MODE_STN_DUAL_PANEL_4_BIT, + LCD_MODE_STN_DUAL_PANEL_8_BIT, + LCD_MODE_TFT_12_BIT_4_4_4, + LCD_MODE_TFT_16_BIT_5_6_5, + LCD_MODE_TFT_16_BIT_1_5_5_5, + LCD_MODE_TFT_24_BIT, + LCD_MODE_DISABLED +} lpc24xx_lcd_mode; + +/** + * @brief Set the LCD @a mode. + * + * The pins are configured according to the @a pin_config. + * + * @see lpc24xx_io_config() and lpc24xx_io_release(). + * + * @retval RTEMS_SUCCESSFUL Successful operation. + * @retval RTEMS_IO_ERROR Invalid mode. + */ +rtems_status_code lpc24xx_lcd_set_mode( + lpc24xx_lcd_mode mode, + unsigned pin_config +); + +lpc24xx_lcd_mode lpc24xx_lcd_current_mode(void); + +/** @} */ + +#ifdef __cplusplus +} +#endif /* __cplusplus */ + +#endif /* LIBBSP_ARM_LPC24XX_LCD_H */ diff --git a/c/src/lib/libbsp/arm/lpc24xx/include/lpc24xx.h b/c/src/lib/libbsp/arm/lpc24xx/include/lpc24xx.h index 8fddb3f8f8..fa92d28315 100644 --- a/c/src/lib/libbsp/arm/lpc24xx/include/lpc24xx.h +++ b/c/src/lib/libbsp/arm/lpc24xx/include/lpc24xx.h @@ -22,6 +22,8 @@ #define LIBBSP_ARM_LPC24XX_LPC24XX_H #include <stdint.h> +#include <bsp/utility.h> +#include <bsp/lpc-i2s.h> /** * @defgroup lpc24xx_regs Register Definitions @@ -1980,6 +1982,16 @@ typedef struct { #define PCONP_ETHERNET (1U << 30) #define PCONP_USB (1U << 31) +/* I2S */ + +static volatile lpc_i2s *const lpc24xx_i2s = (lpc_i2s *) I2S_BASE_ADDR; + +/* DAC */ + +#define DAC_STEPS 1024 +#define DAC_VALUE(val) BSP_FLD32(val, 6, 15) +#define DAC_BIAS BSP_BIT32(16) + /** @} */ #endif /* LIBBSP_ARM_LPC24XX_LPC24XX_H */ 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; + } +} diff --git a/c/src/lib/libbsp/arm/lpc24xx/preinstall.am b/c/src/lib/libbsp/arm/lpc24xx/preinstall.am index 1ca0658c91..165c5917e0 100644 --- a/c/src/lib/libbsp/arm/lpc24xx/preinstall.am +++ b/c/src/lib/libbsp/arm/lpc24xx/preinstall.am @@ -82,10 +82,6 @@ $(PROJECT_INCLUDE)/bsp/tod.h: ../../shared/tod.h $(PROJECT_INCLUDE)/bsp/$(dirsta $(INSTALL_DATA) $< $(PROJECT_INCLUDE)/bsp/tod.h PREINSTALL_FILES += $(PROJECT_INCLUDE)/bsp/tod.h -$(PROJECT_INCLUDE)/bsp/linker-symbols.h: ../shared/include/linker-symbols.h $(PROJECT_INCLUDE)/bsp/$(dirstamp) - $(INSTALL_DATA) $< $(PROJECT_INCLUDE)/bsp/linker-symbols.h -PREINSTALL_FILES += $(PROJECT_INCLUDE)/bsp/linker-symbols.h - $(PROJECT_INCLUDE)/bsp/start.h: ../shared/include/start.h $(PROJECT_INCLUDE)/bsp/$(dirstamp) $(INSTALL_DATA) $< $(PROJECT_INCLUDE)/bsp/start.h PREINSTALL_FILES += $(PROJECT_INCLUDE)/bsp/start.h @@ -94,6 +90,10 @@ $(PROJECT_INCLUDE)/bsp/lpc-timer.h: ../shared/lpc/include/lpc-timer.h $(PROJECT_ $(INSTALL_DATA) $< $(PROJECT_INCLUDE)/bsp/lpc-timer.h PREINSTALL_FILES += $(PROJECT_INCLUDE)/bsp/lpc-timer.h +$(PROJECT_INCLUDE)/bsp/lpc-i2s.h: ../shared/lpc/include/lpc-i2s.h $(PROJECT_INCLUDE)/bsp/$(dirstamp) + $(INSTALL_DATA) $< $(PROJECT_INCLUDE)/bsp/lpc-i2s.h +PREINSTALL_FILES += $(PROJECT_INCLUDE)/bsp/lpc-i2s.h + $(PROJECT_INCLUDE)/bsp/irq.h: include/irq.h $(PROJECT_INCLUDE)/bsp/$(dirstamp) $(INSTALL_DATA) $< $(PROJECT_INCLUDE)/bsp/irq.h PREINSTALL_FILES += $(PROJECT_INCLUDE)/bsp/irq.h @@ -122,6 +122,10 @@ $(PROJECT_INCLUDE)/bsp/io.h: include/io.h $(PROJECT_INCLUDE)/bsp/$(dirstamp) $(INSTALL_DATA) $< $(PROJECT_INCLUDE)/bsp/io.h PREINSTALL_FILES += $(PROJECT_INCLUDE)/bsp/io.h +$(PROJECT_INCLUDE)/bsp/lcd.h: include/lcd.h $(PROJECT_INCLUDE)/bsp/$(dirstamp) + $(INSTALL_DATA) $< $(PROJECT_INCLUDE)/bsp/lcd.h +PREINSTALL_FILES += $(PROJECT_INCLUDE)/bsp/lcd.h + $(PROJECT_INCLUDE)/bsp/lpc-clock-config.h: include/lpc-clock-config.h $(PROJECT_INCLUDE)/bsp/$(dirstamp) $(INSTALL_DATA) $< $(PROJECT_INCLUDE)/bsp/lpc-clock-config.h PREINSTALL_FILES += $(PROJECT_INCLUDE)/bsp/lpc-clock-config.h @@ -146,7 +150,3 @@ $(PROJECT_LIB)/linkcmds: startup/linkcmds $(PROJECT_LIB)/$(dirstamp) $(INSTALL_DATA) $< $(PROJECT_LIB)/linkcmds TMPINSTALL_FILES += $(PROJECT_LIB)/linkcmds -$(PROJECT_LIB)/linkcmds.base: ../shared/startup/linkcmds.base $(PROJECT_LIB)/$(dirstamp) - $(INSTALL_DATA) $< $(PROJECT_LIB)/linkcmds.base -TMPINSTALL_FILES += $(PROJECT_LIB)/linkcmds.base - diff --git a/c/src/lib/libbsp/arm/lpc24xx/startup/bspstarthooks.c b/c/src/lib/libbsp/arm/lpc24xx/startup/bspstarthooks.c index d5332e6e82..6a3e967732 100644 --- a/c/src/lib/libbsp/arm/lpc24xx/startup/bspstarthooks.c +++ b/c/src/lib/libbsp/arm/lpc24xx/startup/bspstarthooks.c @@ -31,7 +31,7 @@ #endif #ifdef LPC24XX_EMC_MICRON - static void BSP_START_SECTION lpc24xx_ram_test_32(void) + static void BSP_START_TEXT_SECTION lpc24xx_ram_test_32(void) { #ifdef LPC24XX_EMC_TEST int *begin = (int *) 0xa0000000; @@ -55,7 +55,7 @@ #endif } - static void BSP_START_SECTION lpc24xx_cpu_delay( + static void BSP_START_TEXT_SECTION lpc24xx_cpu_delay( unsigned ticks ) { @@ -73,7 +73,7 @@ /** * @brief EMC initialization hook 0. */ -static void BSP_START_SECTION lpc24xx_init_emc_0(void) +static void BSP_START_TEXT_SECTION lpc24xx_init_emc_0(void) { #ifdef LPC24XX_EMC_NUMONYX /* @@ -137,7 +137,7 @@ static void BSP_START_SECTION lpc24xx_init_emc_0(void) /** * @brief EMC initialization hook 1. */ -static void BSP_START_SECTION lpc24xx_init_emc_1(void) +static void BSP_START_TEXT_SECTION lpc24xx_init_emc_1(void) { #ifdef LPC24XX_EMC_INIT /* Use normal memory map */ @@ -242,7 +242,7 @@ static void BSP_START_SECTION lpc24xx_init_emc_1(void) #endif } -static void BSP_START_SECTION lpc24xx_pll_config( +static void BSP_START_TEXT_SECTION lpc24xx_pll_config( uint32_t val ) { @@ -265,7 +265,7 @@ static void BSP_START_SECTION lpc24xx_pll_config( * @param cclksel Selects the divide value for creating the CPU clock (CCLK) * from the PLL output. */ -static void BSP_START_SECTION lpc24xx_set_pll( +static void BSP_START_TEXT_SECTION lpc24xx_set_pll( unsigned clksrc, unsigned nsel, unsigned msel, @@ -321,7 +321,7 @@ static void BSP_START_SECTION lpc24xx_set_pll( lpc24xx_pll_config(PLLCON_PLLE | PLLCON_PLLC); } -static void BSP_START_SECTION lpc24xx_init_pll(void) +static void BSP_START_TEXT_SECTION lpc24xx_init_pll(void) { /* Enable main oscillator */ if ((SCS & 0x40) == 0) { @@ -341,7 +341,7 @@ static void BSP_START_SECTION lpc24xx_init_pll(void) #endif } -static void BSP_START_SECTION lpc24xx_clear_bss(void) +static void BSP_START_TEXT_SECTION lpc24xx_clear_bss(void) { const int *end = (const int *) bsp_section_bss_end; int *out = (int *) bsp_section_bss_begin; @@ -353,7 +353,7 @@ static void BSP_START_SECTION lpc24xx_clear_bss(void) } } -void BSP_START_SECTION bsp_start_hook_0(void) +void BSP_START_TEXT_SECTION bsp_start_hook_0(void) { /* Initialize PLL */ lpc24xx_init_pll(); @@ -362,7 +362,7 @@ void BSP_START_SECTION bsp_start_hook_0(void) lpc24xx_init_emc_0(); } -void BSP_START_SECTION bsp_start_hook_1(void) +void BSP_START_TEXT_SECTION bsp_start_hook_1(void) { /* Re-map interrupt vectors to internal RAM */ MEMMAP = SET_MEMMAP_MAP(MEMMAP, 2); @@ -442,11 +442,18 @@ void BSP_START_SECTION bsp_start_hook_1(void) (size_t) bsp_section_data_size ); - /* Copy .fast section */ + /* Copy .fast_text section */ bsp_start_memcpy( - (int *) bsp_section_fast_begin, - (const int *) bsp_section_fast_load_begin, - (size_t) bsp_section_fast_size + (int *) bsp_section_fast_text_begin, + (const int *) bsp_section_fast_text_load_begin, + (size_t) bsp_section_fast_text_size + ); + + /* Copy .fast_data section */ + bsp_start_memcpy( + (int *) bsp_section_fast_data_begin, + (const int *) bsp_section_fast_data_load_begin, + (size_t) bsp_section_fast_data_size ); /* Clear .bss section */ diff --git a/c/src/lib/libbsp/arm/lpc24xx/startup/linkcmds.lpc2362 b/c/src/lib/libbsp/arm/lpc24xx/startup/linkcmds.lpc2362 index c323f799e5..eff54e9f74 100644 --- a/c/src/lib/libbsp/arm/lpc24xx/startup/linkcmds.lpc2362 +++ b/c/src/lib/libbsp/arm/lpc24xx/startup/linkcmds.lpc2362 @@ -35,11 +35,11 @@ */ MEMORY { - RAM_INT (AIW) : ORIGIN = 0x40000000, LENGTH = 32k - RAM_USB (AIW) : ORIGIN = 0x7fd00000, LENGTH = 8k - RAM_ETH (AIW) : ORIGIN = 0x7fe00000, LENGTH = 16k - ROM_INT (RX) : ORIGIN = 0x00000000, LENGTH = 128k - NIRVANA : ORIGIN = 0, LENGTH = 0 + RAM_INT (AIW) : ORIGIN = 0x40000000, LENGTH = 32k + RAM_USB (AIW) : ORIGIN = 0x7fd00000, LENGTH = 8k + RAM_ETH (AIW) : ORIGIN = 0x7fe00000, LENGTH = 16k + ROM_INT (RX) : ORIGIN = 0x00000000, LENGTH = 128k + NIRVANA : ORIGIN = 0, LENGTH = 0 } REGION_ALIAS ("REGION_START", ROM_INT); @@ -64,4 +64,4 @@ lpc24xx_region_heap_1_begin = ORIGIN (RAM_USB); lpc24xx_region_heap_1_size = LENGTH (RAM_USB); lpc24xx_region_heap_1_end = lpc24xx_region_heap_1_begin + lpc24xx_region_heap_1_size; -INCLUDE linkcmds.base +INCLUDE linkcmds.armv4 diff --git a/c/src/lib/libbsp/arm/lpc24xx/startup/linkcmds.lpc23xx_tli800 b/c/src/lib/libbsp/arm/lpc24xx/startup/linkcmds.lpc23xx_tli800 index d0d97d3d2a..f0cc1a6321 100644 --- a/c/src/lib/libbsp/arm/lpc24xx/startup/linkcmds.lpc23xx_tli800 +++ b/c/src/lib/libbsp/arm/lpc24xx/startup/linkcmds.lpc23xx_tli800 @@ -37,13 +37,13 @@ */ MEMORY { - RAM_INT (AIW) : ORIGIN = 0x40000000, LENGTH = 32k - RAM_USB (AIW) : ORIGIN = 0x7fd00000, LENGTH = 8k - RAM_ETH (AIW) : ORIGIN = 0x7fe00000, LENGTH = 16k - ROM_BOOT (RX) : ORIGIN = 0x00000000, LENGTH = 4k - ROM_CFG (RX) : ORIGIN = 0x00001000, LENGTH = 4k - ROM_INT (RX) : ORIGIN = 0x00002000, LENGTH = 120k - NIRVANA : ORIGIN = 0, LENGTH = 0 + RAM_INT (AIW) : ORIGIN = 0x40000000, LENGTH = 32k + RAM_USB (AIW) : ORIGIN = 0x7fd00000, LENGTH = 8k + RAM_ETH (AIW) : ORIGIN = 0x7fe00000, LENGTH = 16k + ROM_BOOT (RX) : ORIGIN = 0x00000000, LENGTH = 4k + ROM_CFG (RX) : ORIGIN = 0x00001000, LENGTH = 4k + ROM_INT (RX) : ORIGIN = 0x00002000, LENGTH = 120k + NIRVANA : ORIGIN = 0, LENGTH = 0 } REGION_ALIAS ("REGION_START", ROM_BOOT); @@ -68,4 +68,4 @@ lpc24xx_region_heap_1_begin = ORIGIN (RAM_USB); lpc24xx_region_heap_1_size = LENGTH (RAM_USB); lpc24xx_region_heap_1_end = lpc24xx_region_heap_1_begin + lpc24xx_region_heap_1_size; -INCLUDE linkcmds.base +INCLUDE linkcmds.armv4 diff --git a/c/src/lib/libbsp/arm/lpc24xx/startup/linkcmds.lpc24xx_ea b/c/src/lib/libbsp/arm/lpc24xx/startup/linkcmds.lpc24xx_ea index afad88d747..6b3be532cf 100644 --- a/c/src/lib/libbsp/arm/lpc24xx/startup/linkcmds.lpc24xx_ea +++ b/c/src/lib/libbsp/arm/lpc24xx/startup/linkcmds.lpc24xx_ea @@ -34,9 +34,9 @@ */ MEMORY { - RAM_INT (AIW) : ORIGIN = 0x40000000, LENGTH = 64k - RAM_EXT (AIW) : ORIGIN = 0xa0000000, LENGTH = 32M - NIRVANA : ORIGIN = 0, LENGTH = 0 + RAM_INT (AIW) : ORIGIN = 0x40000000, LENGTH = 64k + RAM_EXT (AIW) : ORIGIN = 0xa0000000, LENGTH = 32M + NIRVANA : ORIGIN = 0, LENGTH = 0 } REGION_ALIAS ("REGION_START", RAM_EXT); @@ -53,4 +53,4 @@ REGION_ALIAS ("REGION_BSS", RAM_EXT); REGION_ALIAS ("REGION_WORK", RAM_EXT); REGION_ALIAS ("REGION_STACK", RAM_INT); -INCLUDE linkcmds.base +INCLUDE linkcmds.armv4 diff --git a/c/src/lib/libbsp/arm/lpc24xx/startup/linkcmds.lpc24xx_ncs_ram b/c/src/lib/libbsp/arm/lpc24xx/startup/linkcmds.lpc24xx_ncs_ram index c3f908b907..714642768a 100644 --- a/c/src/lib/libbsp/arm/lpc24xx/startup/linkcmds.lpc24xx_ncs_ram +++ b/c/src/lib/libbsp/arm/lpc24xx/startup/linkcmds.lpc24xx_ncs_ram @@ -34,9 +34,9 @@ */ MEMORY { - RAM_INT (AIW) : ORIGIN = 0x40000000, LENGTH = 64k - RAM_EXT (AIW) : ORIGIN = 0xa0000000, LENGTH = 8M - NIRVANA : ORIGIN = 0, LENGTH = 0 + RAM_INT (AIW) : ORIGIN = 0x40000000, LENGTH = 64k + RAM_EXT (AIW) : ORIGIN = 0xa0000000, LENGTH = 8M + NIRVANA : ORIGIN = 0, LENGTH = 0 } REGION_ALIAS ("REGION_START", RAM_EXT); @@ -53,4 +53,4 @@ REGION_ALIAS ("REGION_BSS", RAM_EXT); REGION_ALIAS ("REGION_WORK", RAM_EXT); REGION_ALIAS ("REGION_STACK", RAM_INT); -INCLUDE linkcmds.base +INCLUDE linkcmds.armv4 diff --git a/c/src/lib/libbsp/arm/lpc24xx/startup/linkcmds.lpc24xx_ncs_rom_ext b/c/src/lib/libbsp/arm/lpc24xx/startup/linkcmds.lpc24xx_ncs_rom_ext index d35d8cd10d..5a66b6a579 100644 --- a/c/src/lib/libbsp/arm/lpc24xx/startup/linkcmds.lpc24xx_ncs_rom_ext +++ b/c/src/lib/libbsp/arm/lpc24xx/startup/linkcmds.lpc24xx_ncs_rom_ext @@ -57,4 +57,4 @@ REGION_ALIAS ("REGION_BSS", RAM_EXT); REGION_ALIAS ("REGION_WORK", RAM_EXT); REGION_ALIAS ("REGION_STACK", RAM_INT); -INCLUDE linkcmds.base +INCLUDE linkcmds.armv4 diff --git a/c/src/lib/libbsp/arm/lpc24xx/startup/linkcmds.lpc24xx_ncs_rom_int b/c/src/lib/libbsp/arm/lpc24xx/startup/linkcmds.lpc24xx_ncs_rom_int index 044131ba30..efe50f8f0e 100644 --- a/c/src/lib/libbsp/arm/lpc24xx/startup/linkcmds.lpc24xx_ncs_rom_int +++ b/c/src/lib/libbsp/arm/lpc24xx/startup/linkcmds.lpc24xx_ncs_rom_int @@ -36,11 +36,11 @@ MEMORY { - RAM_VEC (AIW) : ORIGIN = 0x40000000, LENGTH = 32k - RAM_INT (AIW) : ORIGIN = 0x40008000, LENGTH = 32k - RAM_EXT (AIW) : ORIGIN = 0xa0400000, LENGTH = 4M - ROM_INT (RX) : ORIGIN = 0x00000000, LENGTH = 512k - 8k - NIRVANA : ORIGIN = 0, LENGTH = 0 + RAM_VEC (AIW) : ORIGIN = 0x40000000, LENGTH = 32k + RAM_INT (AIW) : ORIGIN = 0x40008000, LENGTH = 32k + RAM_EXT (AIW) : ORIGIN = 0xa0400000, LENGTH = 4M + ROM_INT (RX) : ORIGIN = 0x00000000, LENGTH = 512k - 8k + NIRVANA : ORIGIN = 0, LENGTH = 0 } REGION_ALIAS ("REGION_START", ROM_INT); @@ -57,4 +57,4 @@ REGION_ALIAS ("REGION_BSS", RAM_EXT); REGION_ALIAS ("REGION_WORK", RAM_EXT); REGION_ALIAS ("REGION_STACK", RAM_INT); -INCLUDE linkcmds.base +INCLUDE linkcmds.armv4 |