From bebb9a61bf160633573113c110c7dca3aea9458a Mon Sep 17 00:00:00 2001 From: Sebastien Bourdeauducq <sebastien@milkymist.org> Date: Sun, 23 Oct 2011 20:04:23 +0200 Subject: [PATCH] demo: cleanup software --- demo/boards/spec/rtl/system.v | 8 +- demo/software/bios/boot.c | 187 ------------------------- demo/software/bios/boot.h | 24 ---- demo/software/{bios => demo}/Makefile | 25 ++-- demo/software/{bios => demo}/crt0.S | 0 demo/software/{bios => demo}/linker.ld | 0 demo/software/{bios => demo}/main.c | 78 +---------- demo/software/include/board.h | 32 ----- demo/software/include/version.h | 6 - demo/software/libbase/Makefile | 5 +- demo/software/libbase/board.c | 44 ------ demo/software/update_depend.sh | 2 +- 12 files changed, 22 insertions(+), 389 deletions(-) delete mode 100644 demo/software/bios/boot.c delete mode 100644 demo/software/bios/boot.h rename demo/software/{bios => demo}/Makefile (54%) rename demo/software/{bios => demo}/crt0.S (100%) rename demo/software/{bios => demo}/linker.ld (100%) rename demo/software/{bios => demo}/main.c (75%) delete mode 100644 demo/software/include/board.h delete mode 100644 demo/software/include/version.h delete mode 100644 demo/software/libbase/board.c diff --git a/demo/boards/spec/rtl/system.v b/demo/boards/spec/rtl/system.v index 3fa5661..88bcaf9 100644 --- a/demo/boards/spec/rtl/system.v +++ b/demo/boards/spec/rtl/system.v @@ -369,10 +369,10 @@ lm32_top cpu( //--------------------------------------------------------------------------- bram #( .adr_width(14), - .init0("../../../software/bios/bios.h0"), - .init1("../../../software/bios/bios.h1"), - .init2("../../../software/bios/bios.h2"), - .init3("../../../software/bios/bios.h3") + .init0("../../../software/demo/demo.h0"), + .init1("../../../software/demo/demo.h1"), + .init2("../../../software/demo/demo.h2"), + .init3("../../../software/demo/demo.h3") ) bram ( .sys_clk(sys_clk), .sys_rst(sys_rst), diff --git a/demo/software/bios/boot.c b/demo/software/bios/boot.c deleted file mode 100644 index 350b637..0000000 --- a/demo/software/bios/boot.c +++ /dev/null @@ -1,187 +0,0 @@ -/* - * Milkymist SoC (Software) - * Copyright (C) 2007, 2008, 2009 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/>. - */ - -#include <stdio.h> -#include <console.h> -#include <uart.h> -#include <system.h> -#include <board.h> -#include <crc.h> -#include <sfl.h> - -#include "boot.h" - -extern const struct board_desc *brd_desc; - -/* - * HACK: by defining this function as not inlinable, GCC will automatically - * put the values we want into the good registers because it has to respect - * the LM32 calling conventions. - */ -static void __attribute__((noinline)) __attribute__((noreturn)) boot(unsigned int r1, unsigned int r2, unsigned int r3, unsigned int addr) -{ - asm volatile( /* Invalidate instruction cache */ - "wcsr ICC, r0\n" - "nop\n" - "nop\n" - "nop\n" - "nop\n" - "call r4\n" - ); -} - -/* Note that we do not use the hw timer so that this function works - * even if the system controller has been disabled at synthesis. - */ -static int check_ack() -{ - int timeout; - int recognized; - static const char str[SFL_MAGIC_LEN] = SFL_MAGIC_ACK; - - timeout = 4500000; - recognized = 0; - while(timeout > 0) { - if(readchar_nonblock()) { - char c; - c = readchar(); - if(c == str[recognized]) { - recognized++; - if(recognized == SFL_MAGIC_LEN) - return 1; - } else { - if(c == str[0]) - recognized = 1; - else - recognized = 0; - } - } - timeout--; - } - return 0; -} - -#define MAX_FAILED 5 - -void serialboot() -{ - struct sfl_frame frame; - int failed; - unsigned int cmdline_adr, initrdstart_adr, initrdend_adr; - - printf("I: Attempting serial firmware loading\n"); - putsnonl(SFL_MAGIC_REQ); - if(!check_ack()) { - printf("E: Timeout\n"); - return; - } - - failed = 0; - cmdline_adr = initrdstart_adr = initrdend_adr = 0; - while(1) { - int i; - int actualcrc; - int goodcrc; - - /* Grab one frame */ - frame.length = readchar(); - frame.crc[0] = readchar(); - frame.crc[1] = readchar(); - frame.cmd = readchar(); - for(i=0;i<frame.length;i++) - frame.payload[i] = readchar(); - - /* Check CRC */ - actualcrc = ((int)frame.crc[0] << 8)|(int)frame.crc[1]; - goodcrc = crc16(&frame.cmd, frame.length+1); - if(actualcrc != goodcrc) { - failed++; - if(failed == MAX_FAILED) { - printf("E: Too many consecutive errors, aborting"); - return; - } - writechar(SFL_ACK_CRCERROR); - continue; - } - - /* CRC OK */ - switch(frame.cmd) { - case SFL_CMD_ABORT: - failed = 0; - writechar(SFL_ACK_SUCCESS); - return; - case SFL_CMD_LOAD: { - char *writepointer; - - failed = 0; - writepointer = (char *)( - ((unsigned int)frame.payload[0] << 24) - |((unsigned int)frame.payload[1] << 16) - |((unsigned int)frame.payload[2] << 8) - |((unsigned int)frame.payload[3] << 0)); - for(i=4;i<frame.length;i++) - *(writepointer++) = frame.payload[i]; - writechar(SFL_ACK_SUCCESS); - break; - } - case SFL_CMD_JUMP: { - unsigned int addr; - - failed = 0; - addr = ((unsigned int)frame.payload[0] << 24) - |((unsigned int)frame.payload[1] << 16) - |((unsigned int)frame.payload[2] << 8) - |((unsigned int)frame.payload[3] << 0); - writechar(SFL_ACK_SUCCESS); - boot(cmdline_adr, initrdstart_adr, initrdend_adr, addr); - break; - } - case SFL_CMD_CMDLINE: - failed = 0; - cmdline_adr = ((unsigned int)frame.payload[0] << 24) - |((unsigned int)frame.payload[1] << 16) - |((unsigned int)frame.payload[2] << 8) - |((unsigned int)frame.payload[3] << 0); - writechar(SFL_ACK_SUCCESS); - break; - case SFL_CMD_INITRDSTART: - failed = 0; - initrdstart_adr = ((unsigned int)frame.payload[0] << 24) - |((unsigned int)frame.payload[1] << 16) - |((unsigned int)frame.payload[2] << 8) - |((unsigned int)frame.payload[3] << 0); - writechar(SFL_ACK_SUCCESS); - break; - case SFL_CMD_INITRDEND: - failed = 0; - initrdend_adr = ((unsigned int)frame.payload[0] << 24) - |((unsigned int)frame.payload[1] << 16) - |((unsigned int)frame.payload[2] << 8) - |((unsigned int)frame.payload[3] << 0); - writechar(SFL_ACK_SUCCESS); - break; - default: - failed++; - if(failed == MAX_FAILED) { - printf("E: Too many consecutive errors, aborting"); - return; - } - writechar(SFL_ACK_UNKNOWN); - break; - } - } -} diff --git a/demo/software/bios/boot.h b/demo/software/bios/boot.h deleted file mode 100644 index 9230988..0000000 --- a/demo/software/bios/boot.h +++ /dev/null @@ -1,24 +0,0 @@ -/* - * Milkymist SoC (Software) - * Copyright (C) 2007, 2008, 2009 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/>. - */ - -#ifndef __BOOT_H -#define __BOOT_H - -void cardboot(int alt); -void serialboot(); - -#endif /* __BOOT_H */ diff --git a/demo/software/bios/Makefile b/demo/software/demo/Makefile similarity index 54% rename from demo/software/bios/Makefile rename to demo/software/demo/Makefile index be5a27d..1924e0e 100644 --- a/demo/software/bios/Makefile +++ b/demo/software/demo/Makefile @@ -1,21 +1,21 @@ MMDIR=../.. include $(MMDIR)/software/include.mak -OBJECTS=crt0.o main.o boot.o +OBJECTS=crt0.o main.o SEGMENTS=-j .text -j .data -j .rodata -all: bios.bin bios.h0 bios.h1 bios.h2 bios.h3 +all: demo.bin demo.h0 demo.h1 demo.h2 demo.h3 -bios.h0: bios.bin +demo.h0: demo.bin $(MMDIR)/tools/bin2hex $< $@ 4096 4 -bios.h1: bios.bin +demo.h1: demo.bin $(MMDIR)/tools/bin2hex $< $@ 4096 3 -bios.h2: bios.bin +demo.h2: demo.bin $(MMDIR)/tools/bin2hex $< $@ 4096 2 -bios.h3: bios.bin +demo.h3: demo.bin $(MMDIR)/tools/bin2hex $< $@ 4096 1 %.bin: %.elf @@ -23,7 +23,7 @@ bios.h3: bios.bin chmod -x $@ $(MMDIR)/tools/crc32 $@ write -bios.elf: linker.ld $(OBJECTS) +demo.elf: linker.ld $(OBJECTS) $(LD) $(LDFLAGS) -T linker.ld -N -o $@ $(OBJECTS) -L$(MMDIR)/software/libbase -lbase chmod -x $@ @@ -33,18 +33,13 @@ depend: makedepend -Y -- $(CFLAGS) -- *.c clean: - rm -f *.o bios.elf bios.bin bios.h0 bios.h1 bios.h2 bios.h3 .*~ *~ Makefile.bak + rm -f *.o demo.elf demo.bin demo.h0 demo.h1 demo.h2 demo.h3 .*~ *~ Makefile.bak # DO NOT DELETE -boot.o: ../../software/include/stdio.h ../../software/include/stdlib.h -boot.o: ../../software/include/console.h ../../software/include/uart.h -boot.o: ../../software/include/system.h ../../software/include/board.h -boot.o: ../../software/include/crc.h ../../tools/sfl.h boot.h main.o: ../../software/include/stdio.h ../../software/include/stdlib.h main.o: ../../software/include/console.h ../../software/include/string.h main.o: ../../software/include/uart.h ../../software/include/crc.h -main.o: ../../software/include/system.h ../../software/include/board.h -main.o: ../../software/include/version.h ../../software/include/hw/sysctl.h +main.o: ../../software/include/system.h ../../software/include/hw/sysctl.h main.o: ../../software/include/hw/common.h ../../software/include/hw/gpio.h -main.o: ../../software/include/hw/uart.h boot.h +main.o: ../../software/include/hw/uart.h diff --git a/demo/software/bios/crt0.S b/demo/software/demo/crt0.S similarity index 100% rename from demo/software/bios/crt0.S rename to demo/software/demo/crt0.S diff --git a/demo/software/bios/linker.ld b/demo/software/demo/linker.ld similarity index 100% rename from demo/software/bios/linker.ld rename to demo/software/demo/linker.ld diff --git a/demo/software/bios/main.c b/demo/software/demo/main.c similarity index 75% rename from demo/software/bios/main.c rename to demo/software/demo/main.c index e9bd94c..8c3955a 100644 --- a/demo/software/bios/main.c +++ b/demo/software/demo/main.c @@ -21,16 +21,10 @@ #include <uart.h> #include <crc.h> #include <system.h> -#include <board.h> -#include <version.h> #include <hw/sysctl.h> #include <hw/gpio.h> #include <hw/uart.h> -#include "boot.h" - -const struct board_desc *brd_desc; - /* General address space functions */ #define NUMBER_OF_BYTES_ON_A_LINE 16 @@ -193,18 +187,6 @@ static void crc(char *startaddr, char *len) /* Init + command line */ -static void help() -{ - puts("This is the Milkymist BIOS debug shell."); - puts("Available commands:"); - puts("mr - read address space"); - puts("mw - write address space"); - puts("mc - copy address space"); - puts("crc - compute CRC32 of a part of the address space"); - puts("serialboot - attempt SFL boot"); - puts("reboot - system reset"); -} - static char *get_token(char **str) { char *c, *d; @@ -232,37 +214,15 @@ static void do_command(char *c) else if(strcmp(token, "mc") == 0) mc(get_token(&c), get_token(&c), get_token(&c)); else if(strcmp(token, "crc") == 0) crc(get_token(&c), get_token(&c)); - else if(strcmp(token, "serialboot") == 0) serialboot(); - else if(strcmp(token, "reboot") == 0) reboot(); - else if(strcmp(token, "help") == 0) help(); - else if(strcmp(token, "") != 0) printf("Command not found\n"); } -static int test_user_abort() -{ - unsigned int i; - char c; - - puts("I: Press Q to abort boot"); - for(i=0;i<4000000;i++) { - if(readchar_nonblock()) { - c = readchar(); - if(c == 'Q') { - puts("I: Aborted boot on user request"); - return 0; - } - } - } - return 1; -} - extern unsigned int _edata; -static void crcbios() +static void crcsw() { unsigned int length; unsigned int expected_crc; @@ -278,53 +238,27 @@ static void crcbios() length = (unsigned int)&_edata; actual_crc = crc32((unsigned char *)0, length); if(expected_crc == actual_crc) - printf("I: BIOS CRC passed (%08x)\n", actual_crc); + printf("I: SW CRC passed (%08x)\n", actual_crc); else { - printf("W: BIOS CRC failed (expected %08x, got %08x)\n", expected_crc, actual_crc); + printf("W: SW CRC failed (expected %08x, got %08x)\n", expected_crc, actual_crc); printf("W: The system will continue, but expect problems.\n"); } } -static void display_board() -{ - if(brd_desc == NULL) { - printf("E: Running on unknown board (ID=0x%08x), startup aborted.\n", CSR_SYSTEM_ID); - while(1); - } - printf("I: Running on %s\n", brd_desc->name); -} - static const char banner[] = - "\nMILKYMIST(tm) v"VERSION" BIOS\thttp://www.milkymist.org\n" - "(c) 2007, 2008, 2009, 2011 Sebastien Bourdeauducq\n\n" - "This program is free software: you can redistribute it and/or modify\n" - "it under the terms of the GNU General Public License as published by\n" - "the Free Software Foundation, version 3 of the License.\n\n"; - -static void boot_sequence() -{ - if(test_user_abort()) { - serialboot(1); - printf("E: No boot medium found\n"); - } -} + "\nTime to Digital Converter demo\n\n"; int main(int i, char **c) { char buffer[64]; - brd_desc = get_board_desc(); - /*Â Display a banner as soon as possible to show that the system is alive */ putsnonl(banner); - crcbios(); - display_board(); - - boot_sequence(); + crcsw(); while(1) { - putsnonl("\e[1mBIOS>\e[0m "); + putsnonl("\e[1mTDC>\e[0m "); readstr(buffer, 64); do_command(buffer); } diff --git a/demo/software/include/board.h b/demo/software/include/board.h deleted file mode 100644 index 86a568c..0000000 --- a/demo/software/include/board.h +++ /dev/null @@ -1,32 +0,0 @@ -/* - * Milkymist SoC (Software) - * Copyright (C) 2007, 2008, 2009, 2011 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/>. - */ - -#ifndef __BOARD_H -#define __BOARD_H - -#define BOARD_NAME_LEN 32 - -struct board_desc { - unsigned int id; - char name[BOARD_NAME_LEN]; - unsigned int clk_frequency; -}; - -const struct board_desc *get_board_desc_id(unsigned int id); -const struct board_desc *get_board_desc(); - -#endif /* __BOARD_H */ diff --git a/demo/software/include/version.h b/demo/software/include/version.h deleted file mode 100644 index 69c72b9..0000000 --- a/demo/software/include/version.h +++ /dev/null @@ -1,6 +0,0 @@ -#ifndef __VERSION_H -#define __VERSION_H - -#define VERSION "0.2-tdc" - -#endif /* __VERSION_H */ diff --git a/demo/software/libbase/Makefile b/demo/software/libbase/Makefile index b158a4a..ec13a90 100644 --- a/demo/software/libbase/Makefile +++ b/demo/software/libbase/Makefile @@ -2,7 +2,7 @@ MMDIR=../.. include $(MMDIR)/software/include.mak OBJECTS=_ashlsi3.o _divsi3.o _modsi3.o _udivmodsi4.o _umodsi3.o _ashrsi3.o _lshrsi3.o _mulsi3.o _udivsi3.o -OBJECTS+=libc.o crc16.o crc32.o console.o system.o board.o irq.o vsnprintf-nofloat.o uart.o +OBJECTS+=libc.o crc16.o crc32.o console.o system.o irq.o vsnprintf-nofloat.o uart.o all: libbase.a @@ -20,9 +20,6 @@ clean: # DO NOT DELETE -board.o: ../../software/include/hw/sysctl.h -board.o: ../../software/include/hw/common.h ../../software/include/stdlib.h -board.o: ../../software/include/board.h console.o: ../../software/include/uart.h ../../software/include/console.h console.o: ../../software/include/stdio.h ../../software/include/stdlib.h console.o: ../../software/include/stdarg.h diff --git a/demo/software/libbase/board.c b/demo/software/libbase/board.c deleted file mode 100644 index 2480d77..0000000 --- a/demo/software/libbase/board.c +++ /dev/null @@ -1,44 +0,0 @@ -/* - * Milkymist SoC (Software) - * Copyright (C) 2007, 2008, 2009 Sebastien Bourdeauducq - * Copyright (C) 2011 CERN - * - * 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/>. - */ - -#include <hw/sysctl.h> -#include <stdlib.h> -#include <board.h> - -static const struct board_desc boards[1] = { - { - .id = 0x53504543, /* SPEC */ - .name = "SPEC", - .clk_frequency = 125000000, - }, -}; - -const struct board_desc *get_board_desc_id(unsigned int id) -{ - unsigned int i; - - for(i=0;i<sizeof(boards)/sizeof(boards[0]);i++) - if(boards[i].id == id) - return &boards[i]; - return NULL; -} - -const struct board_desc *get_board_desc() -{ - return get_board_desc_id(CSR_SYSTEM_ID); -} diff --git a/demo/software/update_depend.sh b/demo/software/update_depend.sh index 9eac8ac..c545382 100755 --- a/demo/software/update_depend.sh +++ b/demo/software/update_depend.sh @@ -1,4 +1,4 @@ #!/bin/bash make -C libbase depend -make -C bios depend +make -C demo depend -- GitLab