New reset system
authorlekernel <sebastien.bourdeauducq@lekernel.net>
Wed, 13 Jan 2010 23:33:16 +0000 (00:33 +0100)
committerlekernel <sebastien.bourdeauducq@lekernel.net>
Wed, 13 Jan 2010 23:33:16 +0000 (00:33 +0100)
14 files changed:
boards/avnet-sp3aevl/rtl/system.v
boards/milkymist-one/rtl/system.v
boards/xilinx-ml401/rtl/system.v
cores/conbus/rtl/conbus.v
cores/conbus/rtl/conbus_arb.v
cores/sysctl/doc/sysctl.tex
cores/sysctl/rtl/sysctl.v
software/bios/crt0.S
software/bios/main.c
software/demo/shell.c
software/include/hw/common.h
software/include/hw/sysctl.h
software/libbase/Makefile
software/libbase/system.c

index a0cc01b..178cfb1 100644 (file)
@@ -1,6 +1,6 @@
 /*
  * Milkymist VJ SoC
- * Copyright (C) 2007, 2008, 2009 Sebastien Bourdeauducq
+ * Copyright (C) 2007, 2008, 2009, 2010 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
@@ -43,6 +43,7 @@ module system(
 // Clock and Reset Generation
 //------------------------------------------------------------------
 wire sys_clk;
+wire hard_reset;
 
 `ifndef SIMULATION
 DCM_SP #(
@@ -98,7 +99,7 @@ reg sys_rst;
 initial rst_debounce <= 20'hFFFFF;
 initial sys_rst <= 1'b1;
 always @(posedge sys_clk) begin
-       if(rst1)
+       if(rst1 | hard_reset)
                rst_debounce <= 20'hFFFFF;
        else if(rst_debounce != 20'd0)
                rst_debounce <= rst_debounce - 20'd1;
@@ -510,7 +511,9 @@ sysctl #(
        .csr_do(csr_dr_sysctl),
 
        .gpio_inputs(btn),
-       .gpio_outputs(led[3:2]) /* LED0 and LED1 are used as TX/RX indicators */
+       .gpio_outputs(led[3:2]), /* LED0 and LED1 are used as TX/RX indicators */
+
+       .hard_reset(hard_reset)
 );
 
 endmodule
index 6b10f8a..dee7e01 100644 (file)
@@ -1,6 +1,6 @@
 /*
  * Milkymist VJ SoC
- * Copyright (C) 2007, 2008, 2009 Sebastien Bourdeauducq
+ * Copyright (C) 2007, 2008, 2009, 2010 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
@@ -91,6 +91,7 @@ module system(
 //------------------------------------------------------------------
 wire sys_clk;
 wire sys_clk_n;
+wire hard_reset;
 
 `ifndef SIMULATION
 wire sys_clk_dcm;
@@ -158,7 +159,7 @@ reg sys_rst;
 initial rst_debounce <= 20'hFFFFF;
 initial sys_rst <= 1'b1;
 always @(posedge sys_clk) begin
-       if(~rst1) /* reset is active low */
+       if(rst1 | hard_reset)
                rst_debounce <= 20'hFFFFF;
        else if(rst_debounce != 20'd0)
                rst_debounce <= rst_debounce - 20'd1;
@@ -749,7 +750,9 @@ sysctl #(
        .csr_do(csr_dr_sysctl),
 
        .gpio_inputs(dipsw),
-       .gpio_outputs(led[3:2]) /* LED0 and LED1 are used as TX/RX indicators. */
+       .gpio_outputs(led[3:2]), /* LED0 and LED1 are used as TX/RX indicators. */
+
+       .hard_reset(hard_reset)
 );
 
 //---------------------------------------------------------------------------
index 2988290..52d4a1f 100644 (file)
@@ -1,6 +1,6 @@
 /*
  * Milkymist VJ SoC
- * Copyright (C) 2007, 2008, 2009 Sebastien Bourdeauducq
+ * Copyright (C) 2007, 2008, 2009, 2010 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
@@ -119,6 +119,7 @@ module system(
 // Clock and Reset Generation
 //------------------------------------------------------------------
 wire sys_clk;
+wire hard_reset;
 
 `ifndef SIMULATION
 BUFG clkbuf(
@@ -144,7 +145,7 @@ reg sys_rst;
 initial rst_debounce <= 20'hFFFFF;
 initial sys_rst <= 1'b1;
 always @(posedge sys_clk) begin
-       if(~rst1) /* reset is active low */
+       if(~rst1 | hard_reset) /* reset pin is active low */
                rst_debounce <= 20'hFFFFF;
        else if(rst_debounce != 20'd0)
                rst_debounce <= rst_debounce - 20'd1;
@@ -798,7 +799,9 @@ sysctl #(
        .csr_do(csr_dr_sysctl),
 
        .gpio_inputs({dipsw, btn}),
-       .gpio_outputs(gpio_outputs)
+       .gpio_outputs(gpio_outputs),
+
+       .hard_reset(hard_reset)
 );
 
 /* LED0 and LED1 are used as TX/RX indicators. */
@@ -1166,15 +1169,12 @@ eth_top ethernet(
 
 assign phy_mii_data = md_padoe_o ? md_pad_o : 1'bz;
 assign md_pad_i = phy_mii_data;
-
 `else
-
 assign phy_tx_data = 4'b0;
 assign phy_tx_en = 1'b0;
 assign phy_tx_er = 1'b0;
 assign phy_mii_clk = 1'b0;
 assign phy_mii_data = 1'bz;
-
 `endif
 
 endmodule
index 70dcbfe..3b47907 100644 (file)
@@ -1,6 +1,6 @@
 /*
  * Wishbone Arbiter and Address Decoder
- * Copyright (C) 2008, 2009 Sebastien Bourdeauducq - http://lekernel.net
+ * Copyright (C) 2008, 2009, 2010 Sebastien Bourdeauducq
  * Copyright (C) 2000 Johny Chi - chisuhua@yahoo.com.cn
  * This file is part of Milkymist.
  *
index 6e14fc3..5b6fb49 100644 (file)
@@ -1,6 +1,6 @@
 /*
  * Milkymist VJ SoC
- * Copyright (C) 2007, 2008, 2009 Sebastien Bourdeauducq
+ * Copyright (C) 2007, 2008, 2009, 2010 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
index 11dbb27..35236be 100644 (file)
@@ -13,7 +13,7 @@
 
 \title{System controller}
 \author{S\'ebastien Bourdeauducq}
-\date{December 2009}
+\date{January 2010}
 \begin{document}
 \setlength{\parindent}{0pt}
 \setlength{\parskip}{5pt}
@@ -71,8 +71,10 @@ Writing it does not clear the trigger bit (bit 0 of the timer control register).
 \section{System identification}
 The system controller provides a 32-bit value defined at synthesis time that can be used to identify bitstreams or boards. The value is set by the \verb!systemid! Verilog parameter and read using the register 0x2c.
 
+Writing any value to this register sends a hard system reset by asserting the \verb!hard_reset! output.
+
 \section*{Copyright notice}
-Copyright \copyright 2007-2009 S\'ebastien Bourdeauducq. \\
+Copyright \copyright 2007-2010 S\'ebastien Bourdeauducq. \\
 Permission is granted to copy, distribute and/or modify this document under the terms of the GNU Free Documentation License, Version 1.3; with no Invariant Sections, no Front-Cover Texts, and no Back-Cover Texts. A copy of the license is included in the LICENSE.FDL file at the root of the Milkymist source distribution.
 
 \end{document}
index cca95b2..e615674 100644 (file)
@@ -1,6 +1,6 @@
 /*
  * Milkymist VJ SoC
- * Copyright (C) 2007, 2008, 2009 Sebastien Bourdeauducq
+ * Copyright (C) 2007, 2008, 2009, 2010 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
@@ -37,7 +37,9 @@ module sysctl #(
        
        /* GPIO */
        input [ninputs-1:0] gpio_inputs,
-       output reg [noutputs-1:0] gpio_outputs
+       output reg [noutputs-1:0] gpio_outputs,
+
+       output reg hard_reset
 );
 
 /*
@@ -100,6 +102,8 @@ always @(posedge sys_clk) begin
                counter1 <= 32'd0;
                compare0 <= 32'hFFFFFFFF;
                compare1 <= 32'hFFFFFFFF;
+
+               hard_reset <= 1'b0;
        end else begin
                timer0_irq <= 1'b0;
                timer1_irq <= 1'b0;
@@ -141,6 +145,8 @@ always @(posedge sys_clk) begin
                                        end
                                        4'b1001: compare1 <= csr_di;
                                        4'b1010: counter1 <= csr_di;
+
+                                       4'b1111: hard_reset <= 1'b1;
                                endcase
                        end
                
index ba71f18..470336e 100644 (file)
@@ -71,16 +71,6 @@ _system_call_handler:
        nop; nop; nop; nop
        nop; nop; nop; nop
 
-_warm_boot_handler:
-       xor     r0, r0, r0
-       wcsr    IE, r0
-       mvhi    r1, hi(_reset_handler)
-       ori     r1, r1, lo(_reset_handler)
-       wcsr    EBA, r1
-       mvi     r2, 1
-       calli   _crt0
-       nop
-
 _crt0:
        /* Setup stack and global pointer */
        mvhi    sp, hi(_fstack)
index 266a076..13d3d20 100644 (file)
@@ -1,6 +1,6 @@
 /*
  * Milkymist VJ SoC (Software)
- * Copyright (C) 2007, 2008, 2009 Sebastien Bourdeauducq
+ * Copyright (C) 2007, 2008, 2009, 2010 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
@@ -445,6 +445,7 @@ static void help()
        puts("load       - load a file from the memory card");
        puts("serialboot - attempt SFL boot");
        puts("cardboot   - attempt booting from memory card");
+       puts("reboot     - system reset");
 }
 
 static char *get_token(char **str)
@@ -484,6 +485,8 @@ static void do_command(char *c)
        
        else if(strcmp(token, "serialboot") == 0) serialboot();
        else if(strcmp(token, "cardboot") == 0) cardboot(0);
+
+       else if(strcmp(token, "reboot") == 0) reboot();
        
        else if(strcmp(token, "help") == 0) help();
        
@@ -565,7 +568,7 @@ static void boot_sequence()
        }
 }
 
-int main(int warm_boot, char **dummy)
+int main(int i, char **c)
 {
        char buffer[64];
 
@@ -585,26 +588,20 @@ int main(int warm_boot, char **dummy)
 
        sdram_enabled = 1;
        
-       if(!warm_boot) {
-               if(brd_desc->sdram_size > 0) {
-                       if(plltest()) {
-                               ddrinit();
-                               flush_bridge_cache();
-
-                               if(memtest(8))
-                                       boot_sequence();
-                               else
-                                       printf("E: Aborted boot on memory error\n");
-                       } else
-                               printf("E: Faulty SDRAM clocking\n");
-               } else {
-                       printf("I: No SDRAM on this evaluation board, not booting\n");
-                       sdram_enabled = 0;
-               }
+       if(brd_desc->sdram_size > 0) {
+               if(plltest()) {
+                       ddrinit();
+                       flush_bridge_cache();
+
+                       if(memtest(8))
+                               boot_sequence();
+                       else
+                               printf("E: Aborted boot on memory error\n");
+               } else
+                       printf("E: Faulty SDRAM clocking\n");
        } else {
-               printf("I: Warm boot\n");
+               printf("I: No SDRAM on this evaluation board, not booting\n");
                sdram_enabled = 0;
-               boot_sequence();
        }
 
        splash_showerr();
index e3c7916..72b3cd1 100644 (file)
@@ -1,6 +1,6 @@
 /*
  * Milkymist VJ SoC (Software)
- * Copyright (C) 2007, 2008, 2009 Sebastien Bourdeauducq
+ * Copyright (C) 2007, 2008, 2009, 2010 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
@@ -206,7 +206,7 @@ static void help()
        puts("stop       - stop renderer");
        puts("spam       - start/stop advertising");
        puts("stats      - print system stats");
-       puts("reboot     - warm reboot");
+       puts("reboot     - system reset");
 }
 
 /*
index 411ccd9..b99692c 100644 (file)
@@ -1,16 +1,16 @@
 /*
  * Milkymist VJ SoC (Software)
- * Copyright (C) 2007, 2008, 2009 Sebastien Bourdeauducq
- * 
+ * Copyright (C) 2007, 2008, 2009, 2010 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 <http://www.gnu.org/licenses/>.
  */
index 8a6f662..1c7e534 100644 (file)
@@ -1,16 +1,16 @@
 /*
  * Milkymist VJ SoC (Software)
- * Copyright (C) 2007, 2008, 2009 Sebastien Bourdeauducq
- * 
+ * Copyright (C) 2007, 2008, 2009, 2010 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 <http://www.gnu.org/licenses/>.
  */
index 13cc2b8..b44d041 100644 (file)
@@ -50,7 +50,9 @@ malloc.o: ../../software/include/malloc.h
 softfloat-glue.o: softfloat.h
 softfloat.o: milieu.h softfloat.h softfloat-macros.h softfloat-specialize.h
 system.o: ../../software/include/irq.h ../../software/include/uart.h
-system.o: ../../software/include/hw/fmlbrg.h ../../software/include/system.h
+system.o: ../../software/include/hw/fmlbrg.h
+system.o: ../../software/include/hw/sysctl.h
+system.o: ../../software/include/hw/common.h ../../software/include/system.h
 uart-async.o: ../../software/include/uart.h ../../software/include/irq.h
 uart-async.o: ../../software/include/hw/uart.h
 uart-async.o: ../../software/include/hw/common.h
index d0cf84c..0f4e9b1 100644 (file)
@@ -18,6 +18,7 @@
 #include <irq.h>
 #include <uart.h>
 #include <hw/fmlbrg.h>
+#include <hw/sysctl.h>
 
 #include <system.h>
 
@@ -38,8 +39,6 @@ __attribute__((noreturn)) void reboot()
        uart_force_sync(1); /* flush UART buffers */
        irq_setmask(0);
        irq_enable(0);
-       asm volatile(
-               "ori r1, r0, 0x0100\n"
-               "call r1\n"
-       );
+       CSR_SYSTEM_ID = 1; /* Writing to CSR_SYSTEM_ID causes a system reset */
+       while(1);
 }