From c38de34a211cf210fd4c7d651e53af756e439fb4 Mon Sep 17 00:00:00 2001 From: Sebastien Bourdeauducq Date: Fri, 17 Feb 2012 18:47:04 +0100 Subject: [PATCH] bios: DDR initialization skeleton --- software/bios/Makefile | 2 +- software/bios/ddrinit.c | 63 +++++++++++++++++++++++++++++++++++++++++ software/bios/ddrinit.h | 23 +++++++++++++++ software/bios/main.c | 9 ++++-- 4 files changed, 93 insertions(+), 4 deletions(-) create mode 100644 software/bios/ddrinit.c create mode 100644 software/bios/ddrinit.h diff --git a/software/bios/Makefile b/software/bios/Makefile index ad4eec73..e7f00154 100644 --- a/software/bios/Makefile +++ b/software/bios/Makefile @@ -1,7 +1,7 @@ M2DIR=../.. include $(M2DIR)/software/include.mak -OBJECTS=crt0.o isr.o main.o +OBJECTS=crt0.o isr.o ddrinit.o main.o all: bios.bin diff --git a/software/bios/ddrinit.c b/software/bios/ddrinit.c new file mode 100644 index 00000000..24352a7c --- /dev/null +++ b/software/bios/ddrinit.c @@ -0,0 +1,63 @@ +/* + * Milkymist SoC (Software) + * Copyright (C) 2012 Sebastien Bourdeauducq + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, version 3 of the License. + * + * This program 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 General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +#include + +#include + +#include "ddrinit.h" + +static void init_sequence(void) +{ + printf("Sending initialization sequence...\n"); + // TODO +} + +static void calibrate_phy(void) +{ + int requests; + int addr; + + printf("Calibrating PHY...\n"); + while(!(CSR_DDRPHY_STATUS & DDRPHY_STATUS_PHY_CAL_DONE)) { + requests = CSR_DDRPHY_REQUESTS; + addr = CSR_DDRPHY_REQADDR; + + if(requests & DDRPHY_REQUEST_READ) { + printf("R %d\n", addr); + // TODO + } + if(requests & DDRPHY_REQUEST_WRITE) { + printf("W %d\n", addr); + // TODO + } + + CSR_DDRPHY_REQUESTS = requests; + } +} + +int ddrinit(void) +{ + printf("Initializing DDR SDRAM...\n"); + + CSR_DDRPHY_STATUS = DDRPHY_STATUS_RESETN; + init_sequence(); + CSR_DDRPHY_STATUS = DDRPHY_STATUS_RESETN|DDRPHY_STATUS_INIT_DONE; + calibrate_phy(); + + return 1; +} diff --git a/software/bios/ddrinit.h b/software/bios/ddrinit.h new file mode 100644 index 00000000..7ef4a215 --- /dev/null +++ b/software/bios/ddrinit.h @@ -0,0 +1,23 @@ +/* + * Milkymist SoC (Software) + * Copyright (C) 2012 Sebastien Bourdeauducq + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, version 3 of the License. + * + * This program 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 General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +#ifndef __DDRINIT_H +#define __DDRINIT_H + +int ddrinit(void); + +#endif /* __DDRINIT_H */ diff --git a/software/bios/main.c b/software/bios/main.c index c408b8e3..4b700b54 100644 --- a/software/bios/main.c +++ b/software/bios/main.c @@ -27,6 +27,8 @@ #include +#include "ddrinit.h" + enum { CSR_IE = 1, CSR_IM, CSR_IP, CSR_ICC, CSR_DCC, CSR_CC, CSR_CFG, CSR_EBA, CSR_DC, CSR_DEBA, CSR_JTX, CSR_JRX, CSR_BP0, CSR_BP1, CSR_BP2, CSR_BP3, @@ -440,11 +442,12 @@ int main(int i, char **c) uart_init(); printf(banner); crcbios(); - + print_mac(); + ddrinit(); + if(rescue) printf("I: Booting in rescue mode\n"); - - print_mac(); + while(1) { putsnonl("\e[1mBIOS>\e[0m "); readstr(buffer, 64); -- 2.30.2