summaryrefslogtreecommitdiffstats
path: root/c/src/lib/libbsp/arm/lpc32xx/misc
diff options
context:
space:
mode:
authorSebastian Huber <sebastian.huber@embedded-brains.de>2011-03-28 09:00:01 +0000
committerSebastian Huber <sebastian.huber@embedded-brains.de>2011-03-28 09:00:01 +0000
commitf4371073f279beafdee65329ae910e4b87469cf3 (patch)
tree5bc9f1bc8e3e4016f7413ec51069ad27d4e6b055 /c/src/lib/libbsp/arm/lpc32xx/misc
parent2011-03-29 Sebastian Huber <sebastian.huber@embedded-brains.de> (diff)
downloadrtems-f4371073f279beafdee65329ae910e4b87469cf3.tar.bz2
2011-03-29 Sebastian Huber <sebastian.huber@embedded-brains.de>
* configure.ac, include/bspopts.h.in: New BSP option LPC32XX_SCRATCH_AREA_SIZE. Disable BSP option LPC32XX_DISABLE_READ_ONLY_PROTECTION for all BSPs. * include/boot.h: Removed application specific defines. * include/nand-mlc.h, misc/nand-mlc.c: Changed configuration layout. * include/mmu.h, misc/mmu.c: Documentation. Bugfix. * include/bsp.h, startup/bspstarthooks.c, misc/restart.c, startup/linkcmds.lpc32xx_mzx, startup/linkcmds.lpc32xx_mzx_stage_1, startup/linkcmds.lpc32xx_mzx_stage_2, startup/linkcmds.lpc32xx_phycore: Support for scratch area. Moved code into macros for reusability.
Diffstat (limited to 'c/src/lib/libbsp/arm/lpc32xx/misc')
-rw-r--r--c/src/lib/libbsp/arm/lpc32xx/misc/mmu.c46
-rw-r--r--c/src/lib/libbsp/arm/lpc32xx/misc/nand-mlc.c57
-rw-r--r--c/src/lib/libbsp/arm/lpc32xx/misc/restart.c21
3 files changed, 78 insertions, 46 deletions
diff --git a/c/src/lib/libbsp/arm/lpc32xx/misc/mmu.c b/c/src/lib/libbsp/arm/lpc32xx/misc/mmu.c
index e4d1ddd060..a6a06aa8bb 100644
--- a/c/src/lib/libbsp/arm/lpc32xx/misc/mmu.c
+++ b/c/src/lib/libbsp/arm/lpc32xx/misc/mmu.c
@@ -7,7 +7,7 @@
*/
/*
- * Copyright (c) 2010 embedded brains GmbH. All rights reserved.
+ * Copyright (c) 2010-2011 embedded brains GmbH. All rights reserved.
*
* embedded brains GmbH
* Obere Lagerstr. 30
@@ -22,7 +22,26 @@
#include <bsp/mmu.h>
-void lpc32xx_set_translation_table_entries(
+static uint32_t disable_mmu(void)
+{
+ uint32_t ctrl = 0;
+
+ arm_cp15_data_cache_test_and_clean_and_invalidate();
+
+ ctrl = arm_cp15_get_control();
+ arm_cp15_set_control(ctrl & ~ARM_CP15_CTRL_M);
+
+ arm_cp15_tlb_invalidate();
+
+ return ctrl;
+}
+
+static void restore_mmu_control(uint32_t ctrl)
+{
+ arm_cp15_set_control(ctrl);
+}
+
+uint32_t set_translation_table_entries(
const void *begin,
const void *end,
uint32_t section_flags
@@ -31,9 +50,32 @@ void lpc32xx_set_translation_table_entries(
uint32_t *ttb = arm_cp15_get_translation_table_base();
uint32_t i = ARM_MMU_SECT_GET_INDEX(begin);
uint32_t iend = ARM_MMU_SECT_GET_INDEX(ARM_MMU_SECT_MVA_ALIGN_UP(end));
+ uint32_t ctrl = disable_mmu();
+ uint32_t section_flags_of_first_entry = ttb [i];
while (i < iend) {
ttb [i] = (i << ARM_MMU_SECT_BASE_SHIFT) | section_flags;
++i;
}
+
+ restore_mmu_control(ctrl);
+
+ return section_flags_of_first_entry;
+}
+
+uint32_t lpc32xx_set_translation_table_entries(
+ const void *begin,
+ const void *end,
+ uint32_t section_flags
+)
+{
+ rtems_interrupt_level level;
+ uint32_t section_flags_of_first_entry = 0;
+
+ rtems_interrupt_disable(level);
+ section_flags_of_first_entry =
+ set_translation_table_entries(begin, end, section_flags);
+ rtems_interrupt_enable(level);
+
+ return section_flags_of_first_entry;
}
diff --git a/c/src/lib/libbsp/arm/lpc32xx/misc/nand-mlc.c b/c/src/lib/libbsp/arm/lpc32xx/misc/nand-mlc.c
index 16be2c98c2..643987a52a 100644
--- a/c/src/lib/libbsp/arm/lpc32xx/misc/nand-mlc.c
+++ b/c/src/lib/libbsp/arm/lpc32xx/misc/nand-mlc.c
@@ -24,19 +24,30 @@
static volatile lpc32xx_nand_mlc *const mlc = &lpc32xx.nand_mlc;
-static bool mlc_small_pages;
-
-static bool mlc_many_address_cycles;
-
-static bool mlc_normal_blocks;
+static uint32_t mlc_flags;
static uint32_t mlc_block_count;
static uint32_t mlc_page_count;
+static bool mlc_small_pages(void)
+{
+ return (mlc_flags & MLC_SMALL_PAGES) != 0;
+}
+
+static bool mlc_many_address_cycles(void)
+{
+ return (mlc_flags & MLC_MANY_ADDRESS_CYCLES) != 0;
+}
+
+static bool mlc_normal_blocks(void)
+{
+ return (mlc_flags & MLC_NORMAL_BLOCKS) != 0;
+}
+
uint32_t lpc32xx_mlc_page_size(void)
{
- if (mlc_small_pages) {
+ if (mlc_small_pages()) {
return 512;
} else {
return 2048;
@@ -45,10 +56,10 @@ uint32_t lpc32xx_mlc_page_size(void)
uint32_t lpc32xx_mlc_pages_per_block(void)
{
- if (mlc_small_pages) {
+ if (mlc_small_pages()) {
return 32;
} else {
- if (mlc_normal_blocks) {
+ if (mlc_normal_blocks()) {
return 64;
} else {
return 128;
@@ -99,23 +110,23 @@ static bool mlc_was_operation_successful(void)
static void mlc_set_block_address(uint32_t block_index)
{
- if (mlc_small_pages) {
+ if (mlc_small_pages()) {
mlc->addr = (uint8_t) (block_index << 5);
mlc->addr = (uint8_t) (block_index >> 3);
- if (mlc_many_address_cycles) {
+ if (mlc_many_address_cycles()) {
mlc->addr = (uint8_t) (block_index >> 11);
}
} else {
- if (mlc_normal_blocks) {
+ if (mlc_normal_blocks()) {
mlc->addr = (uint8_t) (block_index << 6);
mlc->addr = (uint8_t) (block_index >> 2);
- if (mlc_many_address_cycles) {
+ if (mlc_many_address_cycles()) {
mlc->addr = (uint8_t) (block_index >> 10);
}
} else {
mlc->addr = (uint8_t) (block_index << 7);
mlc->addr = (uint8_t) (block_index >> 1);
- if (mlc_many_address_cycles) {
+ if (mlc_many_address_cycles()) {
mlc->addr = (uint8_t) (block_index >> 9);
}
}
@@ -125,17 +136,17 @@ static void mlc_set_block_address(uint32_t block_index)
static void mlc_set_page_address(uint32_t page_index)
{
mlc->addr = 0;
- if (mlc_small_pages) {
+ if (mlc_small_pages()) {
mlc->addr = (uint8_t) page_index;
mlc->addr = (uint8_t) (page_index >> 8);
- if (mlc_many_address_cycles) {
+ if (mlc_many_address_cycles()) {
mlc->addr = (uint8_t) (page_index >> 16);
}
} else {
mlc->addr = 0;
mlc->addr = (uint8_t) page_index;
mlc->addr = (uint8_t) (page_index >> 8);
- if (mlc_many_address_cycles) {
+ if (mlc_many_address_cycles()) {
mlc->addr = (uint8_t) (page_index >> 16);
}
}
@@ -145,9 +156,7 @@ void lpc32xx_mlc_init(const lpc32xx_mlc_config *cfg)
{
uint32_t icr = 0;
- mlc_small_pages = cfg->small_pages;
- mlc_many_address_cycles = cfg->many_address_cycles;
- mlc_normal_blocks = cfg->normal_blocks;
+ mlc_flags = cfg->flags;
mlc_block_count = cfg->block_count;
mlc_page_count = cfg->block_count * lpc32xx_mlc_pages_per_block();
@@ -159,10 +168,10 @@ void lpc32xx_mlc_init(const lpc32xx_mlc_config *cfg)
mlc->time = cfg->time;
/* Configuration */
- if (!mlc_small_pages) {
+ if (!mlc_small_pages()) {
icr |= MLC_ICR_LARGE_PAGES;
}
- if (mlc_many_address_cycles) {
+ if (mlc_many_address_cycles()) {
icr |= MLC_ICR_ADDR_WORD_COUNT_4_5;
}
mlc_unlock();
@@ -191,7 +200,7 @@ rtems_status_code lpc32xx_mlc_read_page(
)
{
rtems_status_code sc = RTEMS_SUCCESSFUL;
- size_t small_pages_count = mlc_small_pages ? 1 : MLC_SMALL_PAGES_PER_LARGE_PAGE;
+ size_t small_pages_count = mlc_small_pages() ? 1 : MLC_SMALL_PAGES_PER_LARGE_PAGE;
size_t sp = 0;
size_t i = 0;
uint32_t isr = 0;
@@ -202,7 +211,7 @@ rtems_status_code lpc32xx_mlc_read_page(
mlc_wait_until_ready();
mlc->cmd = 0x00;
- if (!mlc_small_pages) {
+ if (!mlc_small_pages()) {
mlc->cmd = 0x30;
}
mlc_set_page_address(page_index);
@@ -284,7 +293,7 @@ rtems_status_code lpc32xx_mlc_write_page_with_ecc(
)
{
rtems_status_code sc = RTEMS_IO_ERROR;
- size_t small_pages_count = mlc_small_pages ? 1 : MLC_SMALL_PAGES_PER_LARGE_PAGE;
+ size_t small_pages_count = mlc_small_pages() ? 1 : MLC_SMALL_PAGES_PER_LARGE_PAGE;
size_t sp = 0;
size_t i = 0;
diff --git a/c/src/lib/libbsp/arm/lpc32xx/misc/restart.c b/c/src/lib/libbsp/arm/lpc32xx/misc/restart.c
index 68bf2c3ba2..2abacf0e38 100644
--- a/c/src/lib/libbsp/arm/lpc32xx/misc/restart.c
+++ b/c/src/lib/libbsp/arm/lpc32xx/misc/restart.c
@@ -30,24 +30,5 @@
void bsp_restart(void *addr)
{
- ARM_SWITCH_REGISTERS;
- rtems_interrupt_level level;
- uint32_t ctrl = 0;
-
- rtems_interrupt_disable(level);
-
- arm_cp15_data_cache_test_and_clean();
- arm_cp15_instruction_cache_invalidate();
-
- ctrl = arm_cp15_get_control();
- ctrl &= ~(ARM_CP15_CTRL_I | ARM_CP15_CTRL_C | ARM_CP15_CTRL_M);
- arm_cp15_set_control(ctrl);
-
- __asm__ volatile (
- ARM_SWITCH_TO_ARM
- "mov pc, %[addr]\n"
- ARM_SWITCH_BACK
- : ARM_SWITCH_OUTPUT
- : [addr] "r" (addr)
- );
+ LPC32XX_DO_RESTART(addr);
}