summaryrefslogtreecommitdiffstats
path: root/c/src/lib/libbsp/arm/lpc32xx/misc/mmu.c
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/mmu.c
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 '')
-rw-r--r--c/src/lib/libbsp/arm/lpc32xx/misc/mmu.c46
1 files changed, 44 insertions, 2 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;
}