source: rtems/c/src/lib/libbsp/arm/lpc32xx/misc/emc.c @ f140fdc

4.115
Last change on this file since f140fdc was f140fdc, checked in by Sebastian Huber <sebastian.huber@…>, on 09/28/10 at 14:38:26

2010-09-28 Sebastian Huber <sebastian.huber@…>

  • misc/mmu.c: New file.
  • Makefile.am: Reflect change above.
  • configure.ac, include/bspopts.h.in, include/irq.h, include/lpc32xx.h, include/mmu.h, misc/emc.c, misc/restart.c, startup/bspstarthooks.c: Changes throughout.
  • Property mode set to 100644
File size: 2.9 KB
Line 
1/**
2 * @file
3 *
4 * @ingroup lpc32xx_emc
5 *
6 * @brief EMC support implementation.
7 */
8
9/*
10 * Copyright (c) 2010
11 * embedded brains GmbH
12 * Obere Lagerstr. 30
13 * D-82178 Puchheim
14 * Germany
15 * <rtems@embedded-brains.de>
16 *
17 * The license and distribution terms for this file may be
18 * found in the file LICENSE in this distribution or at
19 * http://www.rtems.com/license/LICENSE.
20 */
21
22#include <bsp/emc.h>
23
24#include <bsp.h>
25#include <bsp/mmu.h>
26
27static volatile lpc32xx_emc *const emc = &lpc32xx.emc;
28
29static void dynamic_init(const lpc32xx_emc_dynamic_config *cfg)
30{
31  uint32_t chip_begin = LPC32XX_BASE_EMC_DYCS_0;
32  uint32_t dynamiccontrol = (cfg->control | EMC_DYN_CTRL_CE | EMC_DYN_CTRL_CS)
33    & ~EMC_DYN_CTRL_I_MASK;
34  size_t i = 0;
35
36  LPC32XX_SDRAMCLK_CTRL = cfg->sdramclk_ctrl;
37
38  emc->dynamicreadconfig = cfg->readconfig;
39
40  /* Timings */
41  emc->dynamictrp = cfg->trp;
42  emc->dynamictras = cfg->tras;
43  emc->dynamictsrex = cfg->tsrex;
44  emc->dynamictwr = cfg->twr;
45  emc->dynamictrc = cfg->trc;
46  emc->dynamictrfc = cfg->trfc;
47  emc->dynamictxsr = cfg->txsr;
48  emc->dynamictrrd = cfg->trrd;
49  emc->dynamictmrd = cfg->tmrd;
50  emc->dynamictcdlr = cfg->tcdlr;
51  for (i = 0; i < EMC_DYN_CHIP_COUNT; ++i) {
52    if (cfg->chip [i].size != 0) {
53      emc->dynamic [i].config = cfg->chip [i].config;
54      emc->dynamic [i].rascas = cfg->chip [i].rascas;
55    }
56  }
57
58  /* NOP period */
59  emc->dynamiccontrol = dynamiccontrol | EMC_DYN_CTRL_I_NOP;
60  lpc32xx_micro_seconds_delay(cfg->nop_time_in_us);
61
62  /* Precharge */
63  emc->dynamiccontrol = dynamiccontrol | EMC_DYN_CTRL_I_PALL;
64  emc->dynamicrefresh = 1;
65  /* FIXME: Why a delay, why this value? */
66  lpc32xx_micro_seconds_delay(10);
67
68  /* Refresh timing */
69  emc->dynamicrefresh = cfg->refresh;
70  /* FIXME: Why a delay, why this value? */
71  lpc32xx_micro_seconds_delay(16);
72
73  /* Set modes */
74  for (i = 0; i < EMC_DYN_CHIP_COUNT; ++i) {
75    if (cfg->chip [i].size != 0) {
76      lpc32xx_set_translation_table_entries(
77        (void *) chip_begin,
78        (void *) (chip_begin + cfg->chip [i].size),
79        LPC32XX_MMU_READ_WRITE
80      );
81      emc->dynamiccontrol = dynamiccontrol | EMC_DYN_CTRL_I_MODE;
82      *(volatile uint32_t *)(chip_begin + cfg->chip [i].mode);
83      emc->dynamiccontrol = dynamiccontrol | EMC_DYN_CTRL_I_MODE;
84      *(volatile uint32_t *)(chip_begin + cfg->chip [i].extmode);
85    }
86    chip_begin += 0x20000000;
87  }
88
89  emc->dynamiccontrol = cfg->control;
90}
91
92void lpc32xx_emc_init(const lpc32xx_emc_dynamic_config *dyn_cfg)
93{
94  /* Enable clock */
95  LPC32XX_HCLKDIV_CTRL |= HCLK_DIV_DDRAM_CLK(1);
96
97  /* Enable buffers in AHB ports */
98  emc->ahb [0].control = EMC_AHB_PORT_BUFF_EN;
99  emc->ahb [3].control = EMC_AHB_PORT_BUFF_EN;
100  emc->ahb [4].control = EMC_AHB_PORT_BUFF_EN;
101
102  /* Set AHB port timeouts */
103  emc->ahb [0].timeout = EMC_AHB_TIMEOUT(32);
104  emc->ahb [3].timeout = EMC_AHB_TIMEOUT(32);
105  emc->ahb [4].timeout = EMC_AHB_TIMEOUT(32);
106
107  /* Enable EMC */
108  emc->control = EMC_CTRL_EN,
109  emc->config = 0;
110
111  dynamic_init(dyn_cfg);
112}
Note: See TracBrowser for help on using the repository browser.