summaryrefslogtreecommitdiffstats
path: root/libopencm3/include/libopencm3/stm32/f4/fmc.h
blob: 4741dd3837988ebf1019223041abcac26ca59a92 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
/*
 * This file is part of the libopencm3 project.
 *
 * Copyright (C) 2013 Chuck McManis <cmcmanis@mcmanis.com>
 *
 * This library is free software: you can redistribute it and/or modify
 * it under the terms of the GNU Lesser General Public License as published by
 * the Free Software Foundation, either version 3 of the License, or
 * (at your option) any later version.
 *
 * This library is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU Lesser General Public License for more details.
 *
 * You should have received a copy of the GNU Lesser General Public License
 * along with this library.  If not, see <http://www.gnu.org/licenses/>.
 */

#ifndef LIBOPENCM3_FMC_H
#define LIBOPENCM3_FMC_H

#ifndef LIBOPENCM3_FSMC_H
error "This file should not be included directly, it is included with fsmc.h"
#endif

/* --- Convenience macros -------------------------------------------------- */

#define FMC_BANK5_BASE			0xa0000000U
#define FMC_BANK6_BASE			0xb0000000U
#define FMC_BANK7_BASE			0xc0000000U
#define FMC_BANK8_BASE			0xd0000000U

/* --- FMC registers ------------------------------------------------------ */

/* SDRAM Control Registers 1 .. 2 */
#define FMC_SDCR(x)			MMIO32(FSMC_BASE + 0x140 + 4 * x)
#define FMC_SDCR1			FMC_SDCR(0)
#define FMC_SDCR2			FMC_SDCR(1)


/* SDRAM Timing Registers 1 .. 2 */
#define FMC_SDTR(x)			MMIO32(FSMC_BASE + 0x148 + 4 * x)
#define FMC_SDTR1			FMC_SDTR(0)
#define FMC_SDTR2			FMC_SDTR(1)

/* SDRAM Command Mode Register */
#define FMC_SDCMR			MMIO32(FSMC_BASE + (uint32_t) 0x150)

/* SDRAM Refresh Timer Register */
#define FMC_SDRTR			MMIO32(FSMC_BASE + 0x154)

/* SDRAM Status Register */
#define FMC_SDSR			MMIO32(FSMC_BASE + (uint32_t) 0x158)

/* --- FMC_SDCRx values ---------------------------------------------------- */

/* Bits [31:15]: Reserved. */

/* RPIPE: Read Pipe */
#define FMC_SDCR_RPIPE_SHIFT		(1 << 13)
#define FMC_SDCR_RPIPE_MASK		(3 << 13)
#define FMC_SDCR_RPIPE_NONE		(0x0)       /* No Delay */
#define FMC_SDCR_RPIPE_1CLK		(1 << 13)   /* one clock */
#define FMC_SDCR_RPIPE_2CLK		(2 << 13)   /* two clocks */

/* RBURST: Burst Read */
#define FMC_SDCR_RBURST			(1 << 12)

/* SDCLK: SDRAM Clock Configuration */
#define FMC_SDCR_SDCLK_SHIFT		(1 << 10)
#define FMC_SDCR_SDCLK_MASK		(3 << 10)
#define FMC_SDCR_SDCLK_DISABLE		(0)
#define FMC_SDCR_SDCLK_2HCLK		(2 << 10)
#define FMC_SDCR_SDCLK_3HCLK		(3 << 10)

/* WP: Write Protect */
#define FMC_SDCR_WP_ENABLE		(1 << 9)

/* CAS: CAS Latency */
#define FMC_SDCR_CAS_SHIFT		(1 << 7)
#define FMC_SDCR_CAS_1CYC		(1 << 7)
#define FMC_SDCR_CAS_2CYC		(2 << 7)
#define FMC_SDCR_CAS_3CYC		(3 << 7)

/* NB: Number of Internal banks */
#define FMC_SDCR_NB2			0
#define FMC_SDCR_NB4			(1 << 6)

/* MWID: Memory width */
#define FMC_SDCR_MWID_SHIFT		(1 << 4)
#define FMC_SDCR_MWID_8b		(0 << 4)
#define FMC_SDCR_MWID_16b		(1 << 4)
#define FMC_SDCR_MWID_32b		(2 << 4)

/* NR: Number of rows */
#define FMC_SDCR_NR_SHIFT		(1 << 2)
#define FMC_SDCR_NR_11			(0 << 2)
#define FMC_SDCR_NR_12			(1 << 2)
#define FMC_SDCR_NR_13			(2 << 2)

/* NC: Number of Columns */
#define FMC_SDCR_NC_SHIFT		(1 << 0)
#define FMC_SDCR_NC_8			(0 << 0)
#define FMC_SDCR_NC_9			(1 << 0)
#define FMC_SDCR_NC_10			(2 << 0)
#define FMC_SDCR_NC_11			(3 << 0)

/* --- FMC_SDTRx values --------------------------------------------------- */

/* Bits [31:28]: Reserved. */

/* TRCD: Row to Column Delay */
#define FMC_SDTR_TRCD_SHIFT		(1 << 24)
#define FMC_SDTR_TRCD_MASK		(15 << 24)

/* TRP: Row Precharge Delay */
#define FMC_SDTR_TRP_SHIFT		(1 << 20)
#define FMC_SDTR_TRP_MASK		(15 << 20)

/* TWR: Recovery Delay */
#define FMC_SDTR_TWR_SHIFT		(1 << 16)
#define FMC_SDTR_TWR_MASK		(15 << 16)

/* TRC: Row Cycle Delay */
#define FMC_SDTR_TRC_SHIFT		(1 << 12)
#define FMC_SDTR_TRC_MASK		(15 << 12)

/* TRAS: Self Refresh Time */
#define FMC_SDTR_TRAS_SHIFT		(1 << 8)
#define FMC_SDTR_TRAS_MASK		(15 << 8)

/* TXSR: Exit Self-refresh Delay */
#define FMC_SDTR_TXSR_SHIFT		(1 << 4)
#define FMC_SDTR_TXSR_MASK		(15 << 4)

/* TRMD: Load Mode Register to Active */
#define FMC_SDTR_TMRD_SHIFT		(1 << 0)
#define FMC_SDTR_TMRD_MASK		(15 << 0)

/*
 * Some config bits only count in CR1 or TR1, even if you
 * are just configuring bank 2, so these masks let you copy
 * out those bits after you have computed values for CR2 and
 * TR2 and put them into CR1 and TR1
 */
#define FMC_SDTR_DNC_MASK	( FMC_SDTR_TRP_MASK| FMC_SDTR_TRC_MASK )
#define FMC_SDCR_DNC_MASK	( FMC_SDCR_SDCLK_MASK |\
				  FMC_SDCR_RPIPE_MASK  |\
				  FMC_SDCR_RBURST )

/* --- FMC_SDCMR values --------------------------------------------------- */

/* Bits [31:22]: Reserved. */

/* MRD: Mode Register Definition */
#define FMC_SDCMR_MRD_SHIFT		(1 << 9)
#define FMC_SDCMR_MRD_MASK		(0x1fff << 9)

/* NRFS: Number of Auto-refresh */
#define FMC_SDCMR_NRFS_SHIFT		(1 << 5)
#define FMC_SDCMR_NRFS_MASK		(15 << 5)

/* CTB1: Command Target Bank 1 */
#define FMC_SDCMR_CTB1			(1 << 4)

/* CTB2: Command Target Bank 2 */
#define FMC_SDCMR_CTB2			(1 << 3)

/* MODE: Command Mode */
#define FMC_SDCMR_MODE_SHIFT		(1 << 0)
#define FMC_SDCMR_MODE_MASK		(7 << 0)
#define FMC_SDCMR_MODE_NORMAL			0
#define FMC_SDCMR_MODE_CLOCK_CONFIG_ENA		1
#define FMC_SDCMR_MODE_PALL			2
#define FMC_SDCMR_MODE_AUTO_REFRESH		3
#define FMC_SDCMR_MODE_LOAD_MODE_REGISTER	4
#define FMC_SDCMR_MODE_SELF_REFRESH		5
#define FMC_SDCMR_MODE_POWER_DOWN		6

/* --- FMC_SDRTR values ---------------------------------------------------- */

/* Bits [31:15]: Reserved. */

/* REIE: Refresh Error Interrupt Enable */
#define FMC_SDRTR_REIE			(1 << 14)

/* COUNT: Refresh Timer Count */
#define FMC_SDRTR_COUNT_SHIFT		(1 << 1)
#define FMC_SDRTR_COUNT_MASK		(0x1fff << 1)

/* CRE: Clear Refresh Error Flag */
#define FMC_SDRTR_CRE			(1 << 0)

/* --- FMC_SDSR values ---------------------------------------------------- */

/* Bits [31:6]: Reserved. */

/* BUSY: Set if the SDRAM is working on the command */
#define FMC_SDSR_BUSY			(1 << 5)

/* MODES: Status modes */
#define FMC_SDSR_MODE_NORMAL		0
#define FMC_SDSR_MODE_SELF_REFRESH	1
#define FMC_SDSR_MODE_POWER_DOWN	2

/* Mode shift */
#define FMC_SDSR_MODE2_SHIFT		( 1 << 3)
#define FMC_SDSR_MODE1_SHIFT		( 1 << 1)

/* RE: Refresh Error */
#define FMC_SDSR_RE			(1 << 0)

/* Helper function for setting the timing parameters */
struct sdram_timing {
	int trcd;		/* RCD Delay */
	int trp;		/* RP Delay */
	int twr;		/* Write Recovery Time */
	int trc;		/* Row Cycle Delay */
	int tras;		/* Self Refresh TIme */
	int txsr;		/* Exit Self Refresh Time */
	int tmrd;		/* Load to Active delay */
};

/* Mode register parameters */
#define SDRAM_MODE_BURST_LENGTH_1		((uint16_t)0x0000)
#define SDRAM_MODE_BURST_LENGTH_2		((uint16_t)0x0001)
#define SDRAM_MODE_BURST_LENGTH_4		((uint16_t)0x0002)
#define SDRAM_MODE_BURST_LENGTH_8		((uint16_t)0x0004)
#define SDRAM_MODE_BURST_TYPE_SEQUENTIAL	((uint16_t)0x0000)
#define SDRAM_MODE_BURST_TYPE_INTERLEAVED	((uint16_t)0x0008)
#define SDRAM_MODE_CAS_LATENCY_2		((uint16_t)0x0020)
#define SDRAM_MODE_CAS_LATENCY_3		((uint16_t)0x0030)
#define SDRAM_MODE_OPERATING_MODE_STANDARD	((uint16_t)0x0000)
#define SDRAM_MODE_WRITEBURST_MODE_PROGRAMMED	((uint16_t)0x0000)
#define SDRAM_MODE_WRITEBURST_MODE_SINGLE	((uint16_t)0x0200)

enum fmc_sdram_bank { SDRAM_BANK1, SDRAM_BANK2, SDRAM_BOTH_BANKS };
enum fmc_sdram_command { SDRAM_CLK_CONF, SDRAM_NORMAL, SDRAM_PALL,
			 SDRAM_AUTO_REFRESH, SDRAM_LOAD_MODE,
			 SDRAM_SELF_REFRESH, SDRAM_POWER_DOWN };

/* Send an array of timing parameters (indices above) to create SDTR register value */
uint32_t sdram_timing(struct sdram_timing *t);
void sdram_command(enum fmc_sdram_bank bank, enum fmc_sdram_command cmd,
			int autorefresh, int modereg);
#endif