Allow libgram to run outside a SoC
authorJean THOMAS <git0@pub.jeanthomas.me>
Tue, 16 Jun 2020 07:55:49 +0000 (09:55 +0200)
committerJean THOMAS <git0@pub.jeanthomas.me>
Tue, 16 Jun 2020 07:55:49 +0000 (09:55 +0200)
libgram/Makefile
libgram/README.md
libgram/include/gram.h
libgram/src/dfii.c
libgram/src/memtest.c

index ff51a9ab601b7c48303f7276ee652b861088ad47..de67554d60c9a7e222d8de7f5c05f5b7fd0488c6 100644 (file)
@@ -8,8 +8,13 @@ OBJCOPY := $(TRIPLE)objcopy
 AR := $(TRIPLE)ar
 LD := $(TRIPLE)ld
 
-CFLAGS  := -fvisibility=hidden -march=rv32i -mabi=ilp32 -nostdlib -Os -Iinclude
-LDFLAGS := -melf32lriscv -nostdlib
+CFLAGS += -fvisibility=hidden -nostdlib -Os -Iinclude
+LDFLAGS += -nostdlib
+
+ifeq ($(TRIPLE),riscv64-unknown-elf-)
+CFLAGS += -march=rv32i -mabi=ilp32
+LDFLAGS += -melf32lriscv
+endif
 
 all: libgram.a
 
index 965c663e78a87933c1b7bdad2697402bfbbc2466..b7b3f8167e664ab417a525277c22f00d8611c6e6 100644 (file)
@@ -1,6 +1,6 @@
 # libgram, the C companion for gram
 
-libgram is the C library for gram core initialization.
+libgram is the C library for gram core initialization and memory testing.
 
 ## HowTo
 
@@ -25,3 +25,14 @@ Link it to this library and you should be good to go!
 GRAM_ERR_NONE: No error happened (hardcoded to zero)
 GRAM_ERR_UNDOCUMENTED: Undocumented error, shame on us lazy coders (take a look at the code)
 ```
+
+## Using libgram when you can't directly access the bus
+
+Compile libgram with `CFLAGS="-DGRAM_RW_FUNC"` (run `make clean` beforehand) then define the following functions:
+
+```c
+uint32_t gram_read(struct gramCtx *ctx, void *addr);
+int gram_write(struct gramCtx *ctx, void *addr, uint32_t value);
+```
+
+If you want to use the default compiler on your computer, use `CFLAGS="-DGRAM_RW_FUNC" make TRIPLE=""`.
index de50a54e6a58afc20db43083f34225ad70817308..438c68cce3a0e96471dace3188f010aa90daeaaf 100644 (file)
@@ -1,6 +1,8 @@
 #ifndef GRAM_H
 #define GRAM_H
 
+#include <stdint.h>
+
 enum GramError {
        GRAM_ERR_NONE = 0,
        GRAM_ERR_UNDOCUMENTED,
@@ -13,9 +15,15 @@ struct gramCtx {
        volatile void *ddr_base;
        volatile struct gramCoreRegs *core;
        volatile struct gramPHYRegs *phy;
+       void *user_data;
 };
 
 extern __attribute__((visibility ("default"))) int gram_init(struct gramCtx *ctx, void *ddr_base, void *core_base, void *phy_base);
 extern __attribute__((visibility ("default"))) int gram_memtest(struct gramCtx *ctx);
 
+#ifdef GRAM_RW_FUNC
+extern uint32_t gram_read(struct gramCtx *ctx, void *addr);
+extern int gram_write(struct gramCtx *ctx, void *addr, uint32_t value);
+#endif /* GRAM_RW_FUNC */
+
 #endif /* GRAM_H */
index b9367ba6def10faa4f1452f3af3a09994a8312f7..d2b73349d19d60cd577ef2221a3f92332fee9246 100644 (file)
@@ -6,7 +6,11 @@
 #include "helpers.h"
 
 static void dfii_setcontrol(struct gramCtx *ctx, uint8_t val) {
+#ifdef GRAM_RW_FUNC
+       gram_write(ctx, &(ctx->core->control), val);
+#else
        ctx->core->control = val;
+#endif
 }
 
 void dfii_setsw(struct gramCtx *ctx, bool software_control) {
@@ -18,16 +22,29 @@ void dfii_setsw(struct gramCtx *ctx, bool software_control) {
 }
 
 static void dfii_set_p0_address(struct gramCtx *ctx, uint32_t val) {
+#ifdef GRAM_RW_FUNC
+       gram_write(ctx, &(ctx->core->phases[0].address), val);
+#else
        ctx->core->phases[0].address = val;
+#endif
 }
 
 static void dfii_set_p0_baddress(struct gramCtx *ctx, uint32_t val) {
+#ifdef GRAM_RW_FUNC
+       gram_write(ctx, &(ctx->core->phases[0].baddress), val);
+#else
        ctx->core->phases[0].baddress = val;
+#endif
 }
 
 static void dfii_p0_command(struct gramCtx *ctx, uint32_t cmd) {
+#ifdef GRAM_RW_FUNC
+       gram_write(ctx, &(ctx->core->phases[0].command), cmd);
+       gram_write(ctx, &(ctx->core->phases[0].command_issue), 1);
+#else
        ctx->core->phases[0].command = cmd;
        ctx->core->phases[0].command_issue = 1;
+#endif
 }
 
 /* TODO: those values are hardcoded for ECPIX-5's RAM */
index 55a5fc04f5c8b0cf1fe1d7381423fac130966619..c5e0bee64cee5931f7748b373a648fd72d89eb82 100644 (file)
@@ -1,5 +1,5 @@
 #include <gram.h>
 
 int gram_memtest(struct gramCtx *ctx) {
-       return 0;
+       return GRAM_ERR_NONE;
 }