563221a117c3880eec0cb2529890272bf32111d5
2 * Milkymist SoC (Software)
3 * Copyright (C) 2012 Sebastien Bourdeauducq
5 * This program is free software: you can redistribute it and/or modify
6 * it under the terms of the GNU General Public License as published by
7 * the Free Software Foundation, version 3 of the License.
9 * This program is distributed in the hope that it will be useful,
10 * but WITHOUT ANY WARRANTY; without even the implied warranty of
11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12 * GNU General Public License for more details.
14 * You should have received a copy of the GNU General Public License
15 * along with this program. If not, see <http://www.gnu.org/licenses/>.
25 static void cdelay(int i
)
28 __asm__
volatile("nop");
33 static void setaddr(int a
)
35 CSR_DFII_AH_P0
= (a
& 0x1fe0) >> 5;
36 CSR_DFII_AL_P0
= a
& 0x001f;
37 CSR_DFII_AH_P1
= (a
& 0x1fe0) >> 5;
38 CSR_DFII_AL_P1
= a
& 0x001f;
41 static void init_sequence(void)
45 printf("Sending initialization sequence...\n");
50 CSR_DFII_CONTROL
= DFII_CONTROL_CKE
;
54 CSR_DFII_COMMAND_P0
= DFII_COMMAND_RAS
|DFII_COMMAND_WE
|DFII_COMMAND_CS
;
56 /* Load Extended Mode Register */
59 CSR_DFII_COMMAND_P0
= DFII_COMMAND_RAS
|DFII_COMMAND_CAS
|DFII_COMMAND_WE
|DFII_COMMAND_CS
;
62 /* Load Mode Register */
63 setaddr(0x0132); /* Reset DLL, CL=3, BL=4 */
64 CSR_DFII_COMMAND_P0
= DFII_COMMAND_RAS
|DFII_COMMAND_CAS
|DFII_COMMAND_WE
|DFII_COMMAND_CS
;
69 CSR_DFII_COMMAND_P0
= DFII_COMMAND_RAS
|DFII_COMMAND_WE
|DFII_COMMAND_CS
;
74 CSR_DFII_COMMAND_P0
= DFII_COMMAND_RAS
|DFII_COMMAND_CAS
|DFII_COMMAND_CS
;
78 /* Load Mode Register */
79 setaddr(0x0032); /* CL=3, BL=4 */
80 CSR_DFII_COMMAND_P0
= DFII_COMMAND_RAS
|DFII_COMMAND_CAS
|DFII_COMMAND_WE
|DFII_COMMAND_CS
;
84 void ddrrd(char *startaddr
)
91 printf("ddrrd <address>\n");
94 addr
= strtoul(startaddr
, &c
, 0);
96 printf("incorrect address\n");
102 CSR_DFII_COMMAND_P0
= DFII_COMMAND_CAS
|DFII_COMMAND_CS
|DFII_COMMAND_RDDATA
;
106 printf("%02x", MMPTR(0xe0000834+4*i
));
108 printf("%02x", MMPTR(0xe0000884+4*i
));
112 void ddrwr(char *startaddr
)
118 if(*startaddr
== 0) {
119 printf("ddrrd <address>\n");
122 addr
= strtoul(startaddr
, &c
, 0);
124 printf("incorrect address\n");
129 MMPTR(0xe0000814+4*i
) = i
;
130 MMPTR(0xe0000864+4*i
) = 0xf0 + i
;
135 CSR_DFII_COMMAND_P1
= DFII_COMMAND_CAS
|DFII_COMMAND_WE
|DFII_COMMAND_CS
|DFII_COMMAND_WRDATA
;
140 printf("Initializing DDR SDRAM...\n");
146 CSR_DFII_COMMAND_P0
= DFII_COMMAND_RAS
|DFII_COMMAND_CS
;