Skip to content

Commit 026457a

Browse files
author
Sebastien Bourdeauducq
committedFeb 18, 2012
Send SDRAM initialization sequence and answer PHY read/write requests. Obstinately refuses to work, unfortunately.
1 parent 5bc840b commit 026457a

File tree

3 files changed

+79
-5
lines changed

3 files changed

+79
-5
lines changed
 

‎milkymist/dfii/__init__.py

+6-1
Original file line numberDiff line numberDiff line change
@@ -83,7 +83,6 @@ def get_fragment(self):
8383
phase.we_n.eq(1),
8484
phase.cas_n.eq(1),
8585
phase.ras_n.eq(1)
86-
8786
]
8887

8988
# commands
@@ -101,6 +100,12 @@ def get_fragment(self):
101100
)
102101
]
103102

103+
# addresses
104+
comb += [
105+
cmdphase.address.eq(self._address.field.r),
106+
cmdphase.bank.eq(self._baddress.field.r)
107+
]
108+
104109
# data enables
105110
sync += _data_en(self._command.re & self._rddata.r,
106111
rddata_en,

‎software/bios/ddrinit.c

+72-3
Original file line numberDiff line numberDiff line change
@@ -18,13 +18,65 @@
1818
#include <stdio.h>
1919

2020
#include <hw/s6ddrphy.h>
21+
#include <hw/dfii.h>
2122

2223
#include "ddrinit.h"
2324

25+
static void cdelay(int i)
26+
{
27+
while(i > 0) {
28+
__asm__ volatile("nop");
29+
i--;
30+
}
31+
}
32+
33+
static void setaddr(int a)
34+
{
35+
CSR_DFII_AH = (a & 0x1fe0) >> 5;
36+
CSR_DFII_AL = a & 0x001f;
37+
}
38+
2439
static void init_sequence(void)
2540
{
41+
int i;
42+
2643
printf("Sending initialization sequence...\n");
27-
// TODO
44+
45+
/* Bring CKE high */
46+
setaddr(0x0000);
47+
CSR_DFII_BA = 0;
48+
CSR_DFII_CONTROL = DFII_CONTROL_CKE;
49+
50+
/* Precharge All */
51+
setaddr(0x0400);
52+
CSR_DFII_COMMAND = DFII_COMMAND_RAS|DFII_COMMAND_WE|DFII_COMMAND_CS;
53+
54+
/* Load Extended Mode Register */
55+
CSR_DFII_BA = 1;
56+
setaddr(0x0000);
57+
CSR_DFII_COMMAND = DFII_COMMAND_RAS|DFII_COMMAND_CAS|DFII_COMMAND_WE|DFII_COMMAND_CS;
58+
CSR_DFII_BA = 0;
59+
60+
/* Load Mode Register */
61+
setaddr(0x0132); /* Reset DLL, CL=3, BL=4 */
62+
CSR_DFII_COMMAND = DFII_COMMAND_RAS|DFII_COMMAND_CAS|DFII_COMMAND_WE|DFII_COMMAND_CS;
63+
cdelay(200);
64+
65+
/* Precharge All */
66+
setaddr(0x0400);
67+
CSR_DFII_COMMAND = DFII_COMMAND_RAS|DFII_COMMAND_WE|DFII_COMMAND_CS;
68+
69+
/* 2x Auto Refresh */
70+
for(i=0;i<2;i++) {
71+
setaddr(0);
72+
CSR_DFII_COMMAND = DFII_COMMAND_RAS|DFII_COMMAND_CAS|DFII_COMMAND_CS;
73+
cdelay(4);
74+
}
75+
76+
/* Load Mode Register */
77+
setaddr(0x0032); /* CL=3, BL=4 */
78+
CSR_DFII_COMMAND = DFII_COMMAND_RAS|DFII_COMMAND_CAS|DFII_COMMAND_WE|DFII_COMMAND_CS;
79+
cdelay(200);
2880
}
2981

3082
static void calibrate_phy(void)
@@ -33,21 +85,38 @@ static void calibrate_phy(void)
3385
int addr;
3486

3587
printf("Calibrating PHY...\n");
88+
89+
CSR_DFII_WRDELAY = 4;
90+
CSR_DFII_WRDURATION = 1;
91+
CSR_DFII_RDDELAY = 7;
92+
CSR_DFII_RDDURATION = 1;
93+
94+
/* Use bank 0, activate row 0 */
95+
CSR_DFII_BA = 0;
96+
setaddr(0x0000);
97+
CSR_DFII_COMMAND = DFII_COMMAND_RAS|DFII_COMMAND_CS;
98+
3699
while(!(CSR_DDRPHY_STATUS & DDRPHY_STATUS_PHY_CAL_DONE)) {
100+
cdelay(20);
37101
requests = CSR_DDRPHY_REQUESTS;
38102
addr = CSR_DDRPHY_REQADDR;
39103

104+
setaddr(addr << 2);
40105
if(requests & DDRPHY_REQUEST_READ) {
41106
printf("R %d\n", addr);
42-
// TODO
107+
CSR_DFII_COMMAND = DFII_COMMAND_RDDATA|DFII_COMMAND_CAS|DFII_COMMAND_CS;
43108
}
44109
if(requests & DDRPHY_REQUEST_WRITE) {
45110
printf("W %d\n", addr);
46-
// TODO
111+
CSR_DFII_COMMAND = DFII_COMMAND_WRDATA|DFII_COMMAND_CAS|DFII_COMMAND_WE|DFII_COMMAND_CS;
47112
}
48113

49114
CSR_DDRPHY_REQUESTS = requests;
50115
}
116+
117+
/* Precharge All */
118+
setaddr(0x0400);
119+
CSR_DFII_COMMAND = DFII_COMMAND_RAS|DFII_COMMAND_WE|DFII_COMMAND_CS;
51120
}
52121

53122
int ddrinit(void)

‎top.py

+1-1
Original file line numberDiff line numberDiff line change
@@ -43,7 +43,7 @@ def get():
4343
# DFI
4444
#
4545
ddrphy0 = s6ddrphy.S6DDRPHY(1, dfi_a, dfi_ba, dfi_d)
46-
dfii0 = dfii.DFIInjector(2, dfi_a, dfi_ba, dfi_d, 2)
46+
dfii0 = dfii.DFIInjector(2, dfi_a, dfi_ba, dfi_d, 1)
4747
dficon0 = dfi.Interconnect(dfii0.master, ddrphy0.dfi)
4848

4949
#

0 commit comments

Comments
 (0)
Please sign in to comment.