00001
00038 #ifndef BOARD_SDRAM_H_INCLUDED
00039 #define BOARD_SDRAM_H_INCLUDED
00040
00041 #include <util.h>
00042 #include <interrupt.h>
00043
00044 #include <clk/sys.h>
00045
00046 #include <regs/xmega_ebi.h>
00047
00074
00075 #define BOARD_SDRAM_INITDLY (100 * 2 * CONFIG_CPU_HZ / 1000000)
00076
00078 #define BOARD_SDRAM_REFRESH (16 * 2 * CONFIG_CPU_HZ / 1000000)
00079
00080 #define BOARD_SDRAM_BASE CONFIG_EXTRAM_BASE
00081
00082 #define BOARD_SDRAM_SIZE (CONFIG_EXTRAM_END - CONFIG_EXTRAM_BASE + 1)
00083
00087 static inline void board_enable_sdram(void)
00088 {
00089 sysclk_enable_module(SYSCLK_PORT_GEN, SYSCLK_EBI);
00090
00091
00092 ebi_write_reg(CTRL, EBI_BF(SDDATAW, EBI_SDDATAW_4BIT)
00093 | EBI_BF(IFMODE, EBI_IFMODE_3PORT));
00094
00095
00096 ebi_write_reg(SDRAMCTRLA, EBI_BIT(SDCAS) | EBI_BIT(SDROW)
00097 | EBI_BF(SDCOL, EBI_SDCOL_10BIT));
00098 ebi_write_reg(SDRAMCTRLB, EBI_BF(MRDLY, 2) | EBI_BF(ROWCYCDLY, 7)
00099 | EBI_BF(RPDLY, 7));
00100 ebi_write_reg(SDRAMCTRLC, EBI_BF(WRDLY, 1) | EBI_BF(ESRDLY, 7)
00101 | EBI_BF(ROWCOLDLY, 7));
00102 ebi_write_word_reg(REFRESH, EBI_BF(REFRESH, BOARD_SDRAM_REFRESH));
00103 ebi_write_word_reg(INITDLY, EBI_BF(INITDLY, BOARD_SDRAM_INITDLY));
00104
00105
00106 ebics_write_reg(CS3, CTRLB, EBICS_BF(SDMODE, EBICS_SDMODE_NORMAL));
00107 ebics_write_word_reg(CS3, BASEADDR, EBICS_BF(BASEADDR,
00108 (BOARD_SDRAM_BASE >> 12)));
00109 ebics_write_reg(CS3, CTRLA, EBICS_BF(ASIZE,
00110 ilog2(BOARD_SDRAM_SIZE) - 8)
00111 | EBICS_BF(MODE, EBICS_MODE_SDRAM));
00112
00113 do {
00114
00115 } while (!(ebics_read_reg(CS3, CTRLB) & EBICS_BIT(SDINITDONE)));
00116 }
00117
00121 static inline void board_disable_sdram(void)
00122 {
00123
00124 ebics_write_reg(CS3, CTRLA, EBICS_BF(MODE, EBICS_MODE_DISABLE));
00125
00126
00127 ebi_write_reg(CTRL, EBI_BF(IFMODE, EBI_IFMODE_DISABLED));
00128
00129 sysclk_disable_module(SYSCLK_PORT_GEN, SYSCLK_EBI);
00130 }
00131
00139 static inline void board_enable_sdram_selfrefresh(void)
00140 {
00141 irqflags_t flags;
00142 uint8_t val;
00143
00144 flags = cpu_irq_save();
00145
00146 val = ebics_read_reg(CS3, CTRLB);
00147 val |= EBICS_BIT(SDSREN);
00148 ebics_write_reg(CS3, CTRLB, val);
00149
00150 cpu_irq_restore(flags);
00151 }
00152
00159 static inline void board_disable_sdram_selfrefresh(void)
00160 {
00161 irqflags_t flags;
00162 uint8_t val;
00163
00164 flags = cpu_irq_save();
00165
00166 val = ebics_read_reg(CS3, CTRLB);
00167 val &= ~EBICS_BIT(SDSREN);
00168 ebics_write_reg(CS3, CTRLB, val);
00169
00170 cpu_irq_restore(flags);
00171 }
00172
00174
00175 #endif