reduce versa_ecp5 clock freq to 50 mhz, reduce bit-width of XICS addressing
authorLuke Kenneth Casson Leighton <lkcl@lkcl.net>
Thu, 14 Apr 2022 18:45:41 +0000 (19:45 +0100)
committerLuke Kenneth Casson Leighton <lkcl@lkcl.net>
Thu, 14 Apr 2022 18:45:41 +0000 (19:45 +0100)
hello_world/Makefile
hello_world/hello_world.c
src/ls2.py

index 88c2fb7ed1452a3469e8704b8e914f3fb259871b..50f039112f54165f8f6f7421ac62be1661889576 100644 (file)
@@ -5,7 +5,8 @@ ifneq ("$(ARCH)", "ppc64le")
 endif
 endif
 
-BOOT_INIT_BASE ?= 0xf0000000 # at QSPI address
+#BOOT_INIT_BASE ?= 0xf0000000 # at QSPI address
+BOOT_INIT_BASE ?= 0x00600000 # inside DRAM address space
 # BOOT_INIT_BASE ?= 0xff000000   # at ROM hi address (with coldboot firmware)
 # BOOT_INIT_BASE ?= 0x0        # start at zero (usual)
 
index 0f08631fe4779486ff78e9fc0ffec500d8a489b8..a9d074f0098948ed5677c74925d069154f3541e4 100644 (file)
@@ -15,12 +15,53 @@ static char mw_logo[] =
 "    ;..;      \n"
 "    `ww'   \n";
 
+static inline uint32_t readl(unsigned long addr)
+{
+    uint32_t val;
+    __asm__ volatile("sync; lwzcix %0,0,%1" : "=r" (val) : "r" (addr) : "memory");
+    return val;
+}
+
+static inline void writel(uint32_t val, unsigned long addr)
+{
+    __asm__ volatile("sync; stwcix %0,0,%1" : : "r" (val), "r" (addr) : "memory");
+}
+
+void uart_writeuint32(uint32_t val) {
+    const char lut[] = { '0', '1', '2', '3', '4', '5', '6', '7',
+                         '8', '9', 'A', 'B', 'C', 'D', 'E', 'F' };
+    uint8_t *val_arr = (uint8_t*)(&val);
+    size_t i;
+
+    for (i = 0; i < 4; i++) {
+        putchar(lut[(val_arr[3-i] >> 4) & 0xF]);
+        putchar(lut[val_arr[3-i] & 0xF]);
+    }
+}
+
+
 int main(void)
 {
        console_init();
 
        puts(mw_logo);
 
+    volatile uint32_t *sram = 0x0;
+    int count = 26;
+       puts("writing\n");
+    for (int i = 0; i < count; i++) {
+        uart_writeuint32(i);
+        puts("\n");
+        writel(0xBEEF0000+i, &(sram[1<<i]));
+    }
+       puts("reading\n");
+    for (int i = 0; i < count; i++) {
+        int val = readl(&(sram[1<<i]));
+        uart_writeuint32(i);
+        puts(" ");
+        uart_writeuint32(val);
+        puts("\n");
+    }
        while (1) {
                unsigned char c = getchar();
                putchar(c);
index e046a49685654d9e7ad249d67b8a947c672acd9b..50d69e1e5cf337642067fbb82b9a0a22c3c0ec75 100644 (file)
@@ -312,12 +312,12 @@ class DDR3SoC(SoC, Elaboratable):
             self.int_level_i = self.xics_ics.int_level_i
 
             self.pbus = pbus = wishbone.Interface(name="xics_icp_bus",
-                                         addr_width=10, data_width=32,
+                                         addr_width=6, data_width=32,
                                          granularity=8, features={'stall'})
             self.sbus = sbus = wishbone.Interface(name="xics_ics_bus",
                                          addr_width=10, data_width=32,
                                          granularity=8, features={'stall'})
-            pmap = MemoryMap(addr_width=12, data_width=8, name="icp_map")
+            pmap = MemoryMap(addr_width=8, data_width=8, name="icp_map")
             pbus.memory_map = pmap
             self._decoder.add(pbus, addr=xics_icp_addr) # ICP addr
 
@@ -739,7 +739,7 @@ def build_platform(fpga, firmware):
     if fpga == 'isim':
         clk_freq = 55e6 # below 50 mhz, stops DRAM being enabled
     if fpga == 'versa_ecp5':
-        clk_freq = 55e6 # crank right down to test hyperram
+        clk_freq = 50e6 # crank right down to test hyperram
     if fpga == 'versa_ecp5_85':
         # 50MHz works.  100MHz works.  55MHz does NOT work.
         # Stick with multiples of 50MHz...