Преглед на файлове

abcmem: update the MMU setup; overlay test image with dram_bss

abcmem: actually present a reasonable memory map, and reserve memory
for the ABC80 extension memory.

max80.ld: overlay dram_bss with the test image. Once we load the test
image there is no going back anyway, and the big thing is to have it
in ROM.
H. Peter Anvin преди 3 години
родител
ревизия
a5b7b041ad
променени са 11 файла, в които са добавени 5252 реда и са изтрити 5217 реда
  1. BIN
      fpga/output_files/max80.jbc
  2. BIN
      fpga/output_files/max80.jic
  3. BIN
      fpga/output_files/max80.pof
  4. BIN
      fpga/output_files/max80.sof
  5. 2 2
      fw/Makefile
  6. 2 0
      fw/abcio.h
  7. 43 0
      fw/abcmem.c
  8. 5192 5192
      fw/boot.mif
  9. 0 2
      fw/diskcache.c
  10. 1 17
      fw/main.c
  11. 12 4
      fw/max80.ld

BIN
fpga/output_files/max80.jbc


BIN
fpga/output_files/max80.jic


BIN
fpga/output_files/max80.pof


BIN
fpga/output_files/max80.sof


+ 2 - 2
fw/Makefile

@@ -42,7 +42,7 @@ ROMOBJS  = $(ROMS:.rom=.o)
 max80.elf: head.o die.o main.o dummy.o irqtable.o irqasm.o sbrk.o \
 	  console.o rtc.o romcopy.o \
 	  sdcard.o diskcache.o \
-	  abcio.o abcdisk.o \
+	  abcio.o abcdisk.o abcmem.o \
 	  memset.o memcpy.o \
 	  runtest.o start_test.o \
 	  $(ROMOBJS) \
@@ -52,7 +52,7 @@ max80.elf: head.o die.o main.o dummy.o irqtable.o irqasm.o sbrk.o \
 testimg.elf: head.o die.o test/main.o dummy.o irqtable.o irqasm.o sbrk.o \
 	  console.o rtc.o romcopy.o \
 	  sdcard.o diskcache.o \
-	  abcio.o abcdisk.o \
+	  abcio.o abcdisk.o abcmem.o \
 	  memset.o memcpy.o \
 	  testdata.o \
 	  fatfs.a

+ 2 - 0
fw/abcio.h

@@ -45,4 +45,6 @@ void abc_init(void);
 void abcdisk_init(void);
 void abcdisk_io_poll(void);
 
+void abc_init_memmap(void);
+
 #endif /* ABCIO_H */

+ 43 - 0
fw/abcmem.c

@@ -0,0 +1,43 @@
+#include "fw.h"
+#include "io.h"
+#include "abcio.h"
+#include "sys.h"
+
+/* Configure ABC memory map */
+struct abc_mem_init {
+    unsigned int addr;
+    uint16_t len;
+    uint8_t flags;
+    const char *data;		/* May not be const, but... */
+};
+#define RD (ABCMEMMAP_RD >> 24)
+#define WR (ABCMEMMAP_WR >> 24)
+
+extern const char rom_ufddos80[];
+
+static char __dram_bss abc80_extmem[16 << 10];
+
+static const struct abc_mem_init mem_init[] = {
+    { 0x5800,  2 << 10, RD, rom_ufddos80 },
+    { 0x8000, 16 << 10, RD|WR, abc80_extmem },
+    { -1U, 0, 0, NULL }
+};
+
+void abc_init_memmap(void)
+{
+
+    volatile uint32_t *pg = &ABCMEMMAP_PAGE(0);
+    const struct abc_mem_init *next = &mem_init[0];
+
+    for (unsigned int addr = 0; addr < 0x10000; addr += 512) {
+	if (addr >= next->addr + next->len)
+	    next++;
+
+	if (addr < next->addr) {
+	    *pg++ = 0;
+	} else {
+	    *pg++ = ((size_t)(next->data + (addr - next->addr))
+		     & SDRAM_MASK) | (next->flags << 24);
+	}
+    }
+}

Файловите разлики са ограничени, защото са твърде много
+ 5192 - 5192
fw/boot.mif


+ 0 - 2
fw/diskcache.c

@@ -221,8 +221,6 @@ int disk_init(void)
     con_printf("sdcard: %u/%u clusters free, clusters = %u bytes\n",
 	       freeclust, fs->n_fatent - 2, fs->csize << 9);
 
-    abcdisk_init();
-
     return 0;
 }
 

+ 1 - 17
fw/main.c

@@ -14,22 +14,6 @@ IRQHANDLER(sysclock)
     set_led(count >> 3); /* 4 Hz */
 }
 
-/* Configure ABC memory map */
-static void init_abc_memmap(void)
-{
-    volatile uint32_t *pg = &ABCMEMMAP_PAGE(0);
-
-    for (unsigned int addr = 0; addr < 0x10000; addr += 512) {
-	if (addr >= 0x5800 && addr < 0x6000) {
-	    *pg++ = ABCMEMMAP_RD | addr;
-	} else if (addr >= 0x8000 && addr < 0xc000) {
-	    *pg++ = ABCMEMMAP_RD | ABCMEMMAP_WR | addr;
-	} else {
-	    *pg++ = addr;	/* Disabled */
-	}
-    }
-}
-
 static no_return killed(const char *how, size_t pc)
 {
     con_printf("ERROR: %s at 0x%08x\n", how, pc);
@@ -63,8 +47,8 @@ static void init(void)
     con_set_baudrate(115200);
     con_puts(hello);
 
+    abc_init_memmap();
     abc_init();
-    init_abc_memmap();
 
     timer_irq_count = 0;
     timer_irq_start = rdtime();

+ 12 - 4
fw/max80.ld

@@ -14,6 +14,7 @@ MEMORY
 {
 	SRAM	: org = SRAM_ADDR,  len = SRAM_SIZE
 	DRAM	: org = SDRAM_ADDR, len = SDRAM_SIZE
+	DRAM2   : org = SDRAM_ADDR+SDRAM_SIZE, len = SDRAM_SIZE
 }
 
 SECTIONS
@@ -202,10 +203,17 @@ SECTIONS
 	__dram_init_end = .;
 	__dram_init_len = __dram_init_end - __dram_init_start;
 
-	/* Test program image */
-	.dram.test : ALIGN(4) {
-		KEEP(*(.dram.test*))
-	} >DRAM
+	/* Keeps ld from getting confused */
+	. = . + SDRAM_SIZE;
+
+	/* Test program image - overlays */
+	.dram.test __dram_init_end + SDRAM_SIZE :
+		   AT(SRAM_SIZE + __dram_init_len) ALIGN(4) {
+		   KEEP(*(.dram.test*))
+	} >DRAM2
+
+	/* bss can overlay the test program image */
+	. = __dram_init_end;
 
 	__dram_bss_start = .;
 	.dram.bss (NOLOAD) : ALIGN(8) {

Някои файлове не бяха показани, защото твърде много файлове са промени