mirror of
https://github.com/openhwgroup/cvw
synced 2025-02-11 06:05:49 +00:00
Removed old used tests from the custom directory.
This commit is contained in:
parent
1e2a9e3b18
commit
1c1ac94bf1
@ -1,114 +0,0 @@
|
|||||||
CEXT := c
|
|
||||||
CPPEXT := cpp
|
|
||||||
AEXT := s
|
|
||||||
SEXT := S
|
|
||||||
SRCEXT := \([$(CEXT)$(AEXT)$(SEXT)]\|$(CPPEXT)\)
|
|
||||||
OBJEXT := o
|
|
||||||
DEPEXT := d
|
|
||||||
SRCDIR := .
|
|
||||||
BUILDDIR := OBJ
|
|
||||||
|
|
||||||
SOURCES ?= $(shell find $(SRCDIR) -type f -regex ".*\.$(SRCEXT)" | sort)
|
|
||||||
OBJECTS := $(SOURCES:.$(CEXT)=.$(OBJEXT))
|
|
||||||
OBJECTS := $(OBJECTS:.$(AEXT)=.$(OBJEXT))
|
|
||||||
OBJECTS := $(OBJECTS:.$(SEXT)=.$(OBJEXT))
|
|
||||||
OBJECTS := $(OBJECTS:.$(CPPEXT)=.$(OBJEXT))
|
|
||||||
OBJECTS := $(patsubst $(SRCDIR)/%,$(BUILDDIR)/%,$(OBJECTS))
|
|
||||||
|
|
||||||
TARGETDIR := bin
|
|
||||||
TARGET := $(TARGETDIR)/boot
|
|
||||||
ROOT := ..
|
|
||||||
LIBRARY_DIRS :=
|
|
||||||
LIBRARY_FILES :=
|
|
||||||
|
|
||||||
MARCH :=-march=rv64imfdc
|
|
||||||
MABI :=-mabi=lp64d
|
|
||||||
LINK_FLAGS :=$(MARCH) $(MABI) -nostartfiles -L $(RISCV)/riscv64-unknown-elf/lib
|
|
||||||
LINKER :=$(ROOT)/linker1000.x
|
|
||||||
|
|
||||||
|
|
||||||
AFLAGS =$(MARCH) $(MABI) -W
|
|
||||||
# Override directive allows us to prepend other options on the command line
|
|
||||||
# e.g. $ make CFLAGS=-g
|
|
||||||
override CFLAGS +=$(MARCH) $(MABI) -mcmodel=medany -O2 -g
|
|
||||||
AS=riscv64-unknown-elf-as
|
|
||||||
CC=riscv64-unknown-elf-gcc
|
|
||||||
AR=riscv64-unknown-elf-ar
|
|
||||||
|
|
||||||
|
|
||||||
#Default Make
|
|
||||||
all: directories $(TARGET).memfile
|
|
||||||
|
|
||||||
#Remake
|
|
||||||
remake: clean all
|
|
||||||
|
|
||||||
#Make the Directories
|
|
||||||
directories:
|
|
||||||
@mkdir -p $(TARGETDIR)
|
|
||||||
@mkdir -p $(BUILDDIR)
|
|
||||||
|
|
||||||
clean:
|
|
||||||
rm -rf $(BUILDDIR) $(TARGETDIR) *.memfile *.objdump
|
|
||||||
|
|
||||||
|
|
||||||
#Needed for building additional library projects
|
|
||||||
ifdef LIBRARY_DIRS
|
|
||||||
LIBS+=${LIBRARY_DIRS:%=-L%} ${LIBRARY_FILES:%=-l%}
|
|
||||||
INC+=${LIBRARY_DIRS:%=-I%}
|
|
||||||
|
|
||||||
${LIBRARY_DIRS}:
|
|
||||||
$(MAKE) -C $@ -j 1
|
|
||||||
|
|
||||||
.PHONY: $(LIBRARY_DIRS) $(TARGET)
|
|
||||||
endif
|
|
||||||
|
|
||||||
|
|
||||||
#Pull in dependency info for *existing* .o files
|
|
||||||
-include $(OBJECTS:.$(OBJEXT)=.$(DEPEXT))
|
|
||||||
|
|
||||||
#Link
|
|
||||||
$(TARGET): $(OBJECTS) $(LIBRARY_DIRS)
|
|
||||||
$(CC) $(LINK_FLAGS) -g -o $(TARGET) $(OBJECTS) ${LIBS} -T ${LINKER}
|
|
||||||
|
|
||||||
|
|
||||||
#Compile
|
|
||||||
$(BUILDDIR)/%.$(OBJEXT): $(SRCDIR)/%.$(CEXT)
|
|
||||||
@mkdir -p $(dir $@)
|
|
||||||
$(CC) $(CFLAGS) $(INC) -c -o $@ $< > $(BUILDDIR)/$*.list
|
|
||||||
@$(CC) $(CFLAGS) $(INC) -MM $(SRCDIR)/$*.$(CEXT) > $(BUILDDIR)/$*.$(DEPEXT)
|
|
||||||
@cp -f $(BUILDDIR)/$*.$(DEPEXT) $(BUILDDIR)/$*.$(DEPEXT).tmp
|
|
||||||
@sed -e 's|.*:|$(BUILDDIR)/$*.$(OBJEXT):|' < $(BUILDDIR)/$*.$(DEPEXT).tmp > $(BUILDDIR)/$*.$(DEPEXT)
|
|
||||||
@sed -e 's/.*://' -e 's/\\$$//' < $(BUILDDIR)/$*.$(DEPEXT).tmp | fmt -1 | sed -e 's/^ *//' -e 's/$$/:/' >> $(BUILDDIR)/$*.$(DEPEXT)
|
|
||||||
@rm -f $(BUILDDIR)/$*.$(DEPEXT).tmp
|
|
||||||
|
|
||||||
# gcc won't output dependencies for assembly files for some reason
|
|
||||||
# most asm files don't have dependencies so the echo will work for now.
|
|
||||||
$(BUILDDIR)/%.$(OBJEXT): $(SRCDIR)/%.$(AEXT)
|
|
||||||
@mkdir -p $(dir $@)
|
|
||||||
$(CC) $(CFLAGS) -c -o $@ $< > $(BUILDDIR)/$*.list
|
|
||||||
@echo $@: $< > $(BUILDDIR)/$*.$(DEPEXT)
|
|
||||||
|
|
||||||
$(BUILDDIR)/%.$(OBJEXT): $(SRCDIR)/%.$(SEXT)
|
|
||||||
@mkdir -p $(dir $@)
|
|
||||||
$(CC) $(CFLAGS) $(INC) -c -o $@ $< > $(BUILDDIR)/$*.list
|
|
||||||
@echo $@: $< > $(BUILDDIR)/$*.$(DEPEXT)
|
|
||||||
|
|
||||||
# C++
|
|
||||||
$(BUILDDIR)/%.$(OBJEXT): $(SRCDIR)/%.$(CPPEXT)
|
|
||||||
@mkdir -p $(dir $@)
|
|
||||||
$(CC) $(CFLAGS) $(INC) -c -o $@ $< > $(BUILDDIR)/$*.list
|
|
||||||
@$(CC) $(CFLAGS) $(INC) -MM $(SRCDIR)/$*.$(CPPEXT) > $(BUILDDIR)/$*.$(DEPEXT)
|
|
||||||
@cp -f $(BUILDDIR)/$*.$(DEPEXT) $(BUILDDIR)/$*.$(DEPEXT).tmp
|
|
||||||
@sed -e 's|.*:|$(BUILDDIR)/$*.$(OBJEXT):|' < $(BUILDDIR)/$*.$(DEPEXT).tmp > $(BUILDDIR)/$*.$(DEPEXT)
|
|
||||||
@sed -e 's/.*://' -e 's/\\$$//' < $(BUILDDIR)/$*.$(DEPEXT).tmp | fmt -1 | sed -e 's/^ *//' -e 's/$$/:/' >> $(BUILDDIR)/$*.$(DEPEXT)
|
|
||||||
@rm -f $(BUILDDIR)/$*.$(DEPEXT).tmp
|
|
||||||
|
|
||||||
# convert to hex
|
|
||||||
$(TARGET).memfile: $(TARGET)
|
|
||||||
@echo 'Making object dump file.'
|
|
||||||
riscv64-unknown-elf-objdump -DS $< > $<.objdump
|
|
||||||
@echo 'Making memory file'
|
|
||||||
riscv64-unknown-elf-elf2hex --bit-width 64 --input $^ --output $@
|
|
||||||
extractFunctionRadix.sh $<.objdump
|
|
||||||
mkdir -p ../../imperas-riscv-tests/work/rv64BP/
|
|
||||||
cp -f $(TARGETDIR)/* ../../imperas-riscv-tests/work/rv64BP/
|
|
||||||
@ -1,101 +0,0 @@
|
|||||||
PERIOD = 11000000
|
|
||||||
#PERIOD = 20
|
|
||||||
|
|
||||||
.section .init
|
|
||||||
.global _start
|
|
||||||
.type _start, @function
|
|
||||||
|
|
||||||
|
|
||||||
_start:
|
|
||||||
# Initialize global pointer
|
|
||||||
.option push
|
|
||||||
.option norelax
|
|
||||||
1:auipc gp, %pcrel_hi(__global_pointer$)
|
|
||||||
addi gp, gp, %pcrel_lo(1b)
|
|
||||||
.option pop
|
|
||||||
|
|
||||||
li x1, 0
|
|
||||||
li x2, 0
|
|
||||||
li x4, 0
|
|
||||||
li x5, 0
|
|
||||||
li x6, 0
|
|
||||||
li x7, 0
|
|
||||||
li x8, 0
|
|
||||||
li x9, 0
|
|
||||||
li x10, 0
|
|
||||||
li x11, 0
|
|
||||||
li x12, 0
|
|
||||||
li x13, 0
|
|
||||||
li x14, 0
|
|
||||||
li x15, 0
|
|
||||||
li x16, 0
|
|
||||||
li x17, 0
|
|
||||||
li x18, 0
|
|
||||||
li x19, 0
|
|
||||||
li x20, 0
|
|
||||||
li x21, 0
|
|
||||||
li x22, 0
|
|
||||||
li x23, 0
|
|
||||||
li x24, 0
|
|
||||||
li x25, 0
|
|
||||||
li x26, 0
|
|
||||||
li x27, 0
|
|
||||||
li x28, 0
|
|
||||||
li x29, 0
|
|
||||||
li x30, 0
|
|
||||||
li x31, 0
|
|
||||||
|
|
||||||
|
|
||||||
# set the stack pointer to the top of memory - 8 bytes (pointer size)
|
|
||||||
li sp, 0x87FFFFF8
|
|
||||||
|
|
||||||
li a0, 0x00000000
|
|
||||||
li a1, 0x80000000
|
|
||||||
#li a2, 128*1024*1024/512 # copy 128MB
|
|
||||||
li a2, 127*1024*1024/512 # copy 127MB upper 1MB contains the return address (ra)
|
|
||||||
#li a2, 800 # copy 400KB
|
|
||||||
jal ra, copyFlash
|
|
||||||
|
|
||||||
fence.i
|
|
||||||
# now toggle led so we know the copy completed.
|
|
||||||
|
|
||||||
# write to gpio
|
|
||||||
li t2, 0xFF
|
|
||||||
la t3, 0x1006000C
|
|
||||||
li t4, 5
|
|
||||||
|
|
||||||
loop:
|
|
||||||
|
|
||||||
# delay
|
|
||||||
li t0, PERIOD/2
|
|
||||||
delay1:
|
|
||||||
addi t0, t0, -1
|
|
||||||
bge t0, x0, delay1
|
|
||||||
sw t2, 0x0(t3)
|
|
||||||
|
|
||||||
li t0, PERIOD/2
|
|
||||||
delay2:
|
|
||||||
addi t0, t0, -1
|
|
||||||
bge t0, x0, delay2
|
|
||||||
sw x0, 0x0(t3)
|
|
||||||
|
|
||||||
addi t4, t4, -1
|
|
||||||
bgt t4, x0, loop
|
|
||||||
|
|
||||||
|
|
||||||
# now that the card is copied and the led toggled we
|
|
||||||
# jump to the copied contents of the sd card.
|
|
||||||
|
|
||||||
jumpToLinux:
|
|
||||||
csrrs a0, 0xF14, x0 # copy hart ID to a0
|
|
||||||
li a1, 0x87000000 # end of memory? not 100% sure on this but it's 112MB
|
|
||||||
la a2, end_of_bios
|
|
||||||
li t0, 0x80000000 # start of code
|
|
||||||
|
|
||||||
jalr x0, t0, 0
|
|
||||||
|
|
||||||
end_of_bios:
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
@ -1,422 +0,0 @@
|
|||||||
#include <stddef.h>
|
|
||||||
#include "boot.h"
|
|
||||||
#include "gpt.h"
|
|
||||||
|
|
||||||
/* Card type flags (card_type) */
|
|
||||||
#define CT_MMC 0x01 /* MMC ver 3 */
|
|
||||||
#define CT_SD1 0x02 /* SD ver 1 */
|
|
||||||
#define CT_SD2 0x04 /* SD ver 2 */
|
|
||||||
#define CT_SDC (CT_SD1|CT_SD2) /* SD */
|
|
||||||
#define CT_BLOCK 0x08 /* Block addressing */
|
|
||||||
|
|
||||||
#define CMD0 (0) /* GO_IDLE_STATE */
|
|
||||||
#define CMD1 (1) /* SEND_OP_COND */
|
|
||||||
#define CMD2 (2) /* SEND_CID */
|
|
||||||
#define CMD3 (3) /* RELATIVE_ADDR */
|
|
||||||
#define CMD4 (4)
|
|
||||||
#define CMD5 (5) /* SLEEP_WAKE (SDC) */
|
|
||||||
#define CMD6 (6) /* SWITCH_FUNC */
|
|
||||||
#define CMD7 (7) /* SELECT */
|
|
||||||
#define CMD8 (8) /* SEND_IF_COND */
|
|
||||||
#define CMD9 (9) /* SEND_CSD */
|
|
||||||
#define CMD10 (10) /* SEND_CID */
|
|
||||||
#define CMD11 (11)
|
|
||||||
#define CMD12 (12) /* STOP_TRANSMISSION */
|
|
||||||
#define CMD13 (13)
|
|
||||||
#define CMD15 (15)
|
|
||||||
#define CMD16 (16) /* SET_BLOCKLEN */
|
|
||||||
#define CMD17 (17) /* READ_SINGLE_BLOCK */
|
|
||||||
#define CMD18 (18) /* READ_MULTIPLE_BLOCK */
|
|
||||||
#define CMD19 (19)
|
|
||||||
#define CMD20 (20)
|
|
||||||
#define CMD23 (23)
|
|
||||||
#define CMD24 (24)
|
|
||||||
#define CMD25 (25)
|
|
||||||
#define CMD27 (27)
|
|
||||||
#define CMD28 (28)
|
|
||||||
#define CMD29 (29)
|
|
||||||
#define CMD30 (30)
|
|
||||||
#define CMD32 (32)
|
|
||||||
#define CMD33 (33)
|
|
||||||
#define CMD38 (38)
|
|
||||||
#define CMD42 (42)
|
|
||||||
#define CMD55 (55) /* APP_CMD */
|
|
||||||
#define CMD56 (56)
|
|
||||||
#define ACMD6 (0x80+6) /* define the data bus width */
|
|
||||||
#define ACMD41 (0x80+41) /* SEND_OP_COND (ACMD) */
|
|
||||||
|
|
||||||
// Capability bits
|
|
||||||
#define SDC_CAPABILITY_SD_4BIT 0x0001
|
|
||||||
#define SDC_CAPABILITY_SD_RESET 0x0002
|
|
||||||
#define SDC_CAPABILITY_ADDR 0xff00
|
|
||||||
|
|
||||||
// Control bits
|
|
||||||
#define SDC_CONTROL_SD_4BIT 0x0001
|
|
||||||
#define SDC_CONTROL_SD_RESET 0x0002
|
|
||||||
|
|
||||||
// Card detect bits
|
|
||||||
#define SDC_CARD_INSERT_INT_EN 0x0001
|
|
||||||
#define SDC_CARD_INSERT_INT_REQ 0x0002
|
|
||||||
#define SDC_CARD_REMOVE_INT_EN 0x0004
|
|
||||||
#define SDC_CARD_REMOVE_INT_REQ 0x0008
|
|
||||||
|
|
||||||
// Command status bits
|
|
||||||
#define SDC_CMD_INT_STATUS_CC 0x0001 // Command complete
|
|
||||||
#define SDC_CMD_INT_STATUS_EI 0x0002 // Any error
|
|
||||||
#define SDC_CMD_INT_STATUS_CTE 0x0004 // Timeout
|
|
||||||
#define SDC_CMD_INT_STATUS_CCRC 0x0008 // CRC error
|
|
||||||
#define SDC_CMD_INT_STATUS_CIE 0x0010 // Command code check error
|
|
||||||
|
|
||||||
// Data status bits
|
|
||||||
#define SDC_DAT_INT_STATUS_TRS 0x0001 // Transfer complete
|
|
||||||
#define SDC_DAT_INT_STATUS_ERR 0x0002 // Any error
|
|
||||||
#define SDC_DAT_INT_STATUS_CTE 0x0004 // Timeout
|
|
||||||
#define SDC_DAT_INT_STATUS_CRC 0x0008 // CRC error
|
|
||||||
#define SDC_DAT_INT_STATUS_CFE 0x0010 // Data FIFO underrun or overrun
|
|
||||||
|
|
||||||
|
|
||||||
#define ERR_EOF 30
|
|
||||||
#define ERR_NOT_ELF 31
|
|
||||||
#define ERR_ELF_BITS 32
|
|
||||||
#define ERR_ELF_ENDIANNESS 33
|
|
||||||
#define ERR_CMD_CRC 34
|
|
||||||
#define ERR_CMD_CHECK 35
|
|
||||||
#define ERR_DATA_CRC 36
|
|
||||||
#define ERR_DATA_FIFO 37
|
|
||||||
#define ERR_BUF_ALIGNMENT 38
|
|
||||||
#define FR_DISK_ERR 39
|
|
||||||
#define FR_TIMEOUT 40
|
|
||||||
|
|
||||||
struct sdc_regs {
|
|
||||||
volatile uint32_t argument;
|
|
||||||
volatile uint32_t command;
|
|
||||||
volatile uint32_t response1;
|
|
||||||
volatile uint32_t response2;
|
|
||||||
volatile uint32_t response3;
|
|
||||||
volatile uint32_t response4;
|
|
||||||
volatile uint32_t data_timeout;
|
|
||||||
volatile uint32_t control;
|
|
||||||
volatile uint32_t cmd_timeout;
|
|
||||||
volatile uint32_t clock_divider;
|
|
||||||
volatile uint32_t software_reset;
|
|
||||||
volatile uint32_t power_control;
|
|
||||||
volatile uint32_t capability;
|
|
||||||
volatile uint32_t cmd_int_status;
|
|
||||||
volatile uint32_t cmd_int_enable;
|
|
||||||
volatile uint32_t dat_int_status;
|
|
||||||
volatile uint32_t dat_int_enable;
|
|
||||||
volatile uint32_t block_size;
|
|
||||||
volatile uint32_t block_count;
|
|
||||||
volatile uint32_t card_detect;
|
|
||||||
volatile uint32_t res_50;
|
|
||||||
volatile uint32_t res_54;
|
|
||||||
volatile uint32_t res_58;
|
|
||||||
volatile uint32_t res_5c;
|
|
||||||
volatile uint64_t dma_addres;
|
|
||||||
};
|
|
||||||
|
|
||||||
#define MAX_BLOCK_CNT 0x1000
|
|
||||||
|
|
||||||
#define SDC 0x00013000;
|
|
||||||
|
|
||||||
// static struct sdc_regs * const regs __attribute__((section(".rodata"))) = (struct sdc_regs *)0x00013000;
|
|
||||||
|
|
||||||
// static int errno __attribute__((section(".bss")));
|
|
||||||
// static DSTATUS drv_status __attribute__((section(".bss")));
|
|
||||||
// static BYTE card_type __attribute__((section(".bss")));
|
|
||||||
// static uint32_t response[4] __attribute__((section(".bss")));
|
|
||||||
// static int alt_mem __attribute__((section(".bss")));
|
|
||||||
|
|
||||||
/*static const char * errno_to_str(void) {
|
|
||||||
switch (errno) {
|
|
||||||
case ERR_EOF: return "Unexpected EOF";
|
|
||||||
case ERR_NOT_ELF: return "Not an ELF file";
|
|
||||||
case ERR_ELF_BITS: return "Wrong ELF word size";
|
|
||||||
case ERR_ELF_ENDIANNESS: return "Wrong ELF endianness";
|
|
||||||
case ERR_CMD_CRC: return "Command CRC error";
|
|
||||||
case ERR_CMD_CHECK: return "Command code check error";
|
|
||||||
case ERR_DATA_CRC: return "Data CRC error";
|
|
||||||
case ERR_DATA_FIFO: return "Data FIFO error";
|
|
||||||
case ERR_BUF_ALIGNMENT: return "Bad buffer alignment";
|
|
||||||
case FR_DISK_ERR: return "Disk error";
|
|
||||||
case FR_TIMEOUT: return "Timeout";
|
|
||||||
}
|
|
||||||
return "Unknown error code";
|
|
||||||
}*/
|
|
||||||
|
|
||||||
static void usleep(unsigned us) {
|
|
||||||
uintptr_t cycles0;
|
|
||||||
uintptr_t cycles1;
|
|
||||||
asm volatile ("csrr %0, 0xB00" : "=r" (cycles0));
|
|
||||||
for (;;) {
|
|
||||||
asm volatile ("csrr %0, 0xB00" : "=r" (cycles1));
|
|
||||||
if (cycles1 - cycles0 >= us * 100) break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
static int sdc_cmd_finish(unsigned cmd, uint32_t * response) {
|
|
||||||
struct sdc_regs * regs = (struct sdc_regs *)SDC;
|
|
||||||
|
|
||||||
while (1) {
|
|
||||||
unsigned status = regs->cmd_int_status;
|
|
||||||
if (status) {
|
|
||||||
// clear interrupts
|
|
||||||
regs->cmd_int_status = 0;
|
|
||||||
while (regs->software_reset != 0) {}
|
|
||||||
if (status == SDC_CMD_INT_STATUS_CC) {
|
|
||||||
// get response
|
|
||||||
response[0] = regs->response1;
|
|
||||||
response[1] = regs->response2;
|
|
||||||
response[2] = regs->response3;
|
|
||||||
response[3] = regs->response4;
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
/* errno = FR_DISK_ERR;
|
|
||||||
if (status & SDC_CMD_INT_STATUS_CTE) errno = FR_TIMEOUT;
|
|
||||||
if (status & SDC_CMD_INT_STATUS_CCRC) errno = ERR_CMD_CRC;
|
|
||||||
if (status & SDC_CMD_INT_STATUS_CIE) errno = ERR_CMD_CHECK;*/
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
|
|
||||||
static int sdc_data_finish(void) {
|
|
||||||
int status;
|
|
||||||
struct sdc_regs * regs = (struct sdc_regs *)SDC;
|
|
||||||
|
|
||||||
while ((status = regs->dat_int_status) == 0) {}
|
|
||||||
regs->dat_int_status = 0;
|
|
||||||
while (regs->software_reset != 0) {}
|
|
||||||
|
|
||||||
if (status == SDC_DAT_INT_STATUS_TRS) return 0;
|
|
||||||
/* errno = FR_DISK_ERR;
|
|
||||||
if (status & SDC_DAT_INT_STATUS_CTE) errno = FR_TIMEOUT;
|
|
||||||
if (status & SDC_DAT_INT_STATUS_CRC) errno = ERR_DATA_CRC;
|
|
||||||
if (status & SDC_DAT_INT_STATUS_CFE) errno = ERR_DATA_FIFO;*/
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
|
|
||||||
static int send_data_cmd(unsigned cmd, unsigned arg, void * buf, unsigned blocks, uint32_t * response) {
|
|
||||||
struct sdc_regs * regs = (struct sdc_regs *)SDC;
|
|
||||||
|
|
||||||
unsigned command = (cmd & 0x3f) << 8;
|
|
||||||
switch (cmd) {
|
|
||||||
case CMD0:
|
|
||||||
case CMD4:
|
|
||||||
case CMD15:
|
|
||||||
// No responce
|
|
||||||
break;
|
|
||||||
case CMD11:
|
|
||||||
case CMD13:
|
|
||||||
case CMD16:
|
|
||||||
case CMD17:
|
|
||||||
case CMD18:
|
|
||||||
case CMD19:
|
|
||||||
case CMD23:
|
|
||||||
case CMD24:
|
|
||||||
case CMD25:
|
|
||||||
case CMD27:
|
|
||||||
case CMD30:
|
|
||||||
case CMD32:
|
|
||||||
case CMD33:
|
|
||||||
case CMD42:
|
|
||||||
case CMD55:
|
|
||||||
case CMD56:
|
|
||||||
case ACMD6:
|
|
||||||
// R1
|
|
||||||
command |= 1; // 48 bits
|
|
||||||
command |= 1 << 3; // resp CRC
|
|
||||||
command |= 1 << 4; // resp OPCODE
|
|
||||||
break;
|
|
||||||
case CMD7:
|
|
||||||
case CMD12:
|
|
||||||
case CMD20:
|
|
||||||
case CMD28:
|
|
||||||
case CMD29:
|
|
||||||
case CMD38:
|
|
||||||
// R1b
|
|
||||||
command |= 1; // 48 bits
|
|
||||||
command |= 1 << 2; // busy
|
|
||||||
command |= 1 << 3; // resp CRC
|
|
||||||
command |= 1 << 4; // resp OPCODE
|
|
||||||
break;
|
|
||||||
case CMD2:
|
|
||||||
case CMD9:
|
|
||||||
case CMD10:
|
|
||||||
// R2
|
|
||||||
command |= 2; // 136 bits
|
|
||||||
command |= 1 << 3; // resp CRC
|
|
||||||
break;
|
|
||||||
case ACMD41:
|
|
||||||
// R3
|
|
||||||
command |= 1; // 48 bits
|
|
||||||
break;
|
|
||||||
case CMD3:
|
|
||||||
// R6
|
|
||||||
command |= 1; // 48 bits
|
|
||||||
command |= 1 << 2; // busy
|
|
||||||
command |= 1 << 3; // resp CRC
|
|
||||||
command |= 1 << 4; // resp OPCODE
|
|
||||||
break;
|
|
||||||
case CMD8:
|
|
||||||
// R7
|
|
||||||
command |= 1; // 48 bits
|
|
||||||
command |= 1 << 3; // resp CRC
|
|
||||||
command |= 1 << 4; // resp OPCODE
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (blocks) {
|
|
||||||
command |= 1 << 5;
|
|
||||||
if ((intptr_t)buf & 3) {
|
|
||||||
// errno = ERR_BUF_ALIGNMENT;
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
regs->dma_addres = (uint64_t)(intptr_t)buf;
|
|
||||||
regs->block_size = 511;
|
|
||||||
regs->block_count = blocks - 1;
|
|
||||||
regs->data_timeout = 0x1FFFFFF;
|
|
||||||
}
|
|
||||||
|
|
||||||
regs->command = command;
|
|
||||||
regs->cmd_timeout = 0xFFFFF;
|
|
||||||
regs->argument = arg;
|
|
||||||
|
|
||||||
if (sdc_cmd_finish(cmd, response) < 0) return -1;
|
|
||||||
if (blocks) return sdc_data_finish();
|
|
||||||
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
#define send_cmd(cmd, arg, response) send_data_cmd(cmd, arg, NULL, 0, response)
|
|
||||||
|
|
||||||
static BYTE ini_sd(void) {
|
|
||||||
struct sdc_regs * regs = (struct sdc_regs *)SDC;
|
|
||||||
unsigned rca;
|
|
||||||
BYTE card_type;
|
|
||||||
uint32_t response[4];
|
|
||||||
|
|
||||||
/* Reset controller */
|
|
||||||
regs->software_reset = 1;
|
|
||||||
while ((regs->software_reset & 1) == 0) {}
|
|
||||||
|
|
||||||
// This clock divider is meant to initialize the card at
|
|
||||||
// 400kHz
|
|
||||||
|
|
||||||
// 22MHz/400kHz = 55 (base 10) = 0x37 - 0x01 = 0x36
|
|
||||||
regs->clock_divider = 0x36;
|
|
||||||
regs->software_reset = 0;
|
|
||||||
while (regs->software_reset) {}
|
|
||||||
usleep(5000);
|
|
||||||
|
|
||||||
card_type = 0;
|
|
||||||
// drv_status = STA_NOINIT;
|
|
||||||
|
|
||||||
if (regs->capability & SDC_CAPABILITY_SD_RESET) {
|
|
||||||
/* Power cycle SD card */
|
|
||||||
regs->control |= SDC_CONTROL_SD_RESET;
|
|
||||||
usleep(1000000);
|
|
||||||
regs->control &= ~SDC_CONTROL_SD_RESET;
|
|
||||||
usleep(100000);
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Enter Idle state */
|
|
||||||
send_cmd(CMD0, 0, response);
|
|
||||||
|
|
||||||
card_type = CT_SD1;
|
|
||||||
if (send_cmd(CMD8, 0x1AA, response) == 0) {
|
|
||||||
if ((response[0] & 0xfff) != 0x1AA) {
|
|
||||||
// errno = ERR_CMD_CHECK;
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
card_type = CT_SD2;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Wait for leaving idle state (ACMD41 with HCS bit) */
|
|
||||||
while (1) {
|
|
||||||
/* ACMD41, Set Operating Conditions: Host High Capacity & 3.3V */
|
|
||||||
if (send_cmd(CMD55, 0, response) < 0 || send_cmd(ACMD41, 0x40300000, response) < 0) return -1;
|
|
||||||
if (response[0] & (1 << 31)) {
|
|
||||||
if (response[0] & (1 << 30)) card_type |= CT_BLOCK;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Enter Identification state */
|
|
||||||
if (send_cmd(CMD2, 0, response) < 0) return -1;
|
|
||||||
|
|
||||||
/* Get RCA (Relative Card Address) */
|
|
||||||
rca = 0x1234;
|
|
||||||
if (send_cmd(CMD3, rca << 16, response) < 0) return -1;
|
|
||||||
rca = response[0] >> 16;
|
|
||||||
|
|
||||||
/* Select card */
|
|
||||||
if (send_cmd(CMD7, rca << 16, response) < 0) return -1;
|
|
||||||
|
|
||||||
/* Clock 25MHz */
|
|
||||||
// 22Mhz/2 = 11Mhz
|
|
||||||
regs->clock_divider = 1;
|
|
||||||
usleep(10000);
|
|
||||||
|
|
||||||
/* Bus width 1-bit */
|
|
||||||
regs->control = 0;
|
|
||||||
if (send_cmd(CMD55, rca << 16, response) < 0 || send_cmd(ACMD6, 0, response) < 0) return -1;
|
|
||||||
|
|
||||||
/* Set R/W block length to 512 */
|
|
||||||
if (send_cmd(CMD16, 512, response) < 0) return -1;
|
|
||||||
|
|
||||||
// drv_status &= ~STA_NOINIT;
|
|
||||||
return card_type;
|
|
||||||
}
|
|
||||||
|
|
||||||
int disk_read(BYTE * buf, LBA_t sector, UINT count, BYTE card_type) {
|
|
||||||
|
|
||||||
/* This is not needed. This has everything to do with the FAT
|
|
||||||
filesystem stuff that I'm not including. All I need to do is
|
|
||||||
initialize the SD card and read from it. Anything in here that is
|
|
||||||
checking for potential errors, I'm going to have to temporarily
|
|
||||||
do without.
|
|
||||||
*/
|
|
||||||
// if (!count) return RES_PARERR;
|
|
||||||
/* if (drv_status & STA_NOINIT) return RES_NOTRDY; */
|
|
||||||
|
|
||||||
uint32_t response[4];
|
|
||||||
struct sdc_regs * regs = (struct sdc_regs *)SDC;
|
|
||||||
|
|
||||||
/* Convert LBA to byte address if needed */
|
|
||||||
if (!(card_type & CT_BLOCK)) sector *= 512;
|
|
||||||
while (count > 0) {
|
|
||||||
UINT bcnt = count > MAX_BLOCK_CNT ? MAX_BLOCK_CNT : count;
|
|
||||||
unsigned bytes = bcnt * 512;
|
|
||||||
if (send_data_cmd(bcnt == 1 ? CMD17 : CMD18, sector, buf, bcnt, response) < 0) return 1;
|
|
||||||
if (bcnt > 1 && send_cmd(CMD12, 0, response) < 0) return 1;
|
|
||||||
sector += (card_type & CT_BLOCK) ? bcnt : bytes;
|
|
||||||
count -= bcnt;
|
|
||||||
buf += bytes;
|
|
||||||
}
|
|
||||||
|
|
||||||
return 0;;
|
|
||||||
}
|
|
||||||
|
|
||||||
void copyFlash(QWORD address, QWORD * Dst, DWORD numBlocks) {
|
|
||||||
BYTE card_type;
|
|
||||||
int ret = 0;
|
|
||||||
|
|
||||||
card_type = ini_sd();
|
|
||||||
|
|
||||||
// BYTE * buf = (BYTE *)Dst;
|
|
||||||
|
|
||||||
// if (disk_read(buf, (LBA_t)address, (UINT)numBlocks, card_type) < 0) /* UART Print function?*/;
|
|
||||||
|
|
||||||
ret = gpt_load_partitions(card_type);
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
int main() {
|
|
||||||
ini_sd();
|
|
||||||
|
|
||||||
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
*/
|
|
||||||
@ -1,26 +0,0 @@
|
|||||||
#ifndef WALLYBOOT
|
|
||||||
#define WALLYBOOT 10000
|
|
||||||
|
|
||||||
#include <stdint.h>
|
|
||||||
typedef unsigned int UINT; /* int must be 16-bit or 32-bit */
|
|
||||||
typedef unsigned char BYTE; /* char must be 8-bit */
|
|
||||||
typedef uint16_t WORD; /* 16-bit unsigned integer */
|
|
||||||
typedef uint32_t DWORD; /* 32-bit unsigned integer */
|
|
||||||
typedef uint64_t QWORD; /* 64-bit unsigned integer */
|
|
||||||
typedef WORD WCHAR;
|
|
||||||
|
|
||||||
typedef QWORD LBA_t;
|
|
||||||
|
|
||||||
// Define memory locations of boot images =====================
|
|
||||||
// These locations are copied from the generic configuration
|
|
||||||
// of OpenSBI. These addresses can be found in:
|
|
||||||
// buildroot/output/build/opensbi-0.9/platform/generic/config.mk
|
|
||||||
#define FDT_ADDRESS 0x87000000 // FW_JUMP_FDT_ADDR
|
|
||||||
#define OPENSBI_ADDRESS 0x80000000 // FW_TEXT_START
|
|
||||||
#define KERNEL_ADDRESS 0x80200000 // FW_JUMP_ADDR
|
|
||||||
|
|
||||||
// Export disk_read
|
|
||||||
int disk_read(BYTE * buf, LBA_t sector, UINT count, BYTE card_type);
|
|
||||||
|
|
||||||
#endif // WALLYBOOT
|
|
||||||
|
|
||||||
@ -1,46 +0,0 @@
|
|||||||
#include "gpt.h"
|
|
||||||
#include "boot.h"
|
|
||||||
#include <stddef.h>
|
|
||||||
|
|
||||||
/* PSUEDOCODE
|
|
||||||
|
|
||||||
Need to load GPT LBA 1 and read through the partition entries.
|
|
||||||
I need to find each of the relevant partition entries, possibly
|
|
||||||
by their partition names.
|
|
||||||
|
|
||||||
*/
|
|
||||||
|
|
||||||
int gpt_load_partitions(BYTE card_type) {
|
|
||||||
// In this version of the GPT partition code
|
|
||||||
// I'm going to assume that the SD card is already initialized.
|
|
||||||
|
|
||||||
// size_t block_size = 512/8;
|
|
||||||
// long int lba1_buf[block_size];
|
|
||||||
|
|
||||||
BYTE lba1_buf[512];
|
|
||||||
|
|
||||||
int ret = 0;
|
|
||||||
//ret = disk_read(/* BYTE * buf, LBA_t sector, UINT count, BYTE card_type */);
|
|
||||||
ret = disk_read(lba1_buf, 1, 1, card_type);
|
|
||||||
|
|
||||||
/* Possible error handling with UART message
|
|
||||||
if ( ret != 0 ) {
|
|
||||||
|
|
||||||
}*/
|
|
||||||
|
|
||||||
gpt_pth_t *lba1 = (gpt_pth_t *)lba1_buf;
|
|
||||||
|
|
||||||
BYTE lba2_buf[512];
|
|
||||||
ret = disk_read(lba2_buf, (LBA_t)lba1->partition_entries_lba, 1, card_type);
|
|
||||||
|
|
||||||
// Load parition entries for the relevant boot partitions.
|
|
||||||
partition_entries_t *fdt = (partition_entries_t *)(lba2_buf);
|
|
||||||
partition_entries_t *opensbi = (partition_entries_t *)(lba2_buf + 128);
|
|
||||||
partition_entries_t *kernel = (partition_entries_t *)(lba2_buf + 256);
|
|
||||||
|
|
||||||
ret = disk_read((BYTE *)FDT_ADDRESS, fdt->first_lba, fdt->last_lba - fdt->first_lba + 1, card_type);
|
|
||||||
ret = disk_read((BYTE *)OPENSBI_ADDRESS, opensbi->first_lba, opensbi->last_lba - opensbi->first_lba + 1, card_type);
|
|
||||||
ret = disk_read((BYTE *)KERNEL_ADDRESS, kernel->first_lba,kernel->last_lba - kernel->first_lba + 1, card_type);
|
|
||||||
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
@ -1,40 +0,0 @@
|
|||||||
#pragma once
|
|
||||||
|
|
||||||
#include <stdint.h>
|
|
||||||
#include "boot.h"
|
|
||||||
|
|
||||||
// LBA 0: Protective MBR
|
|
||||||
// ignored here
|
|
||||||
|
|
||||||
// Partition Table Header (LBA 1)
|
|
||||||
typedef struct gpt_pth
|
|
||||||
{
|
|
||||||
uint64_t signature;
|
|
||||||
uint32_t revision;
|
|
||||||
uint32_t header_size; //! little endian, usually 0x5c = 92
|
|
||||||
uint32_t crc_header;
|
|
||||||
uint32_t reserved; //! must be 0
|
|
||||||
uint64_t current_lba;
|
|
||||||
uint64_t backup_lba;
|
|
||||||
uint64_t first_usable_lba;
|
|
||||||
uint64_t last_usable_lba;
|
|
||||||
uint8_t disk_guid[16];
|
|
||||||
uint64_t partition_entries_lba;
|
|
||||||
uint32_t nr_partition_entries;
|
|
||||||
uint32_t size_partition_entry; //! usually 0x80 = 128
|
|
||||||
uint32_t crc_partition_entry;
|
|
||||||
} gpt_pth_t;
|
|
||||||
|
|
||||||
// Partition Entries (LBA 2-33)
|
|
||||||
typedef struct partition_entries
|
|
||||||
{
|
|
||||||
uint8_t partition_type_guid[16];
|
|
||||||
uint8_t partition_guid[16];
|
|
||||||
uint64_t first_lba;
|
|
||||||
uint64_t last_lba; //! inclusive
|
|
||||||
uint64_t attributes;
|
|
||||||
uint8_t name[72]; //! utf16 encoded
|
|
||||||
} partition_entries_t;
|
|
||||||
|
|
||||||
// Find boot partition and load it to the destination
|
|
||||||
int gpt_load_partitions(BYTE card_type);
|
|
||||||
@ -1,19 +0,0 @@
|
|||||||
TARGETDIR := cacheTest
|
|
||||||
TARGET := $(TARGETDIR)/$(TARGETDIR).elf
|
|
||||||
ROOT := ..
|
|
||||||
LIBRARY_DIRS := ${ROOT}/crt0
|
|
||||||
LIBRARY_FILES := crt0
|
|
||||||
|
|
||||||
MARCH :=-march=rv64imfdc
|
|
||||||
MABI :=-mabi=lp64d
|
|
||||||
LINKER := ${ROOT}/linker8000-0000.x
|
|
||||||
LINK_FLAGS :=$(MARCH) $(MABI) -nostartfiles -Wl,-Map=$(TARGET).map -L $(RISCV)/riscv64-unknown-elf/lib
|
|
||||||
|
|
||||||
CFLAGS =$(MARCH) $(MABI) -Wa,-alhs -Wa,-L -mcmodel=medany -mstrict-align -O2
|
|
||||||
CC=riscv64-unknown-elf-gcc
|
|
||||||
DA=riscv64-unknown-elf-objdump -d
|
|
||||||
|
|
||||||
|
|
||||||
include $(ROOT)/makefile.inc
|
|
||||||
|
|
||||||
|
|
||||||
@ -1,12 +0,0 @@
|
|||||||
#ifndef __header
|
|
||||||
#define __header
|
|
||||||
|
|
||||||
int fail();
|
|
||||||
int simple_csrbr_test();
|
|
||||||
int lbu_test();
|
|
||||||
int icache_spill_test();
|
|
||||||
void global_hist_0_space_test();
|
|
||||||
void global_hist_1_space_test();
|
|
||||||
void global_hist_2_space_test();
|
|
||||||
void global_hist_3_space_test();
|
|
||||||
#endif
|
|
||||||
@ -1,12 +0,0 @@
|
|||||||
#include "header.h"
|
|
||||||
|
|
||||||
#define LIMIT 8192
|
|
||||||
int main(int argc, char *argv[]){
|
|
||||||
long int array [LIMIT];
|
|
||||||
int index;
|
|
||||||
for(index = 0; index < LIMIT; index++) {
|
|
||||||
array[index] = index;
|
|
||||||
}
|
|
||||||
*argv = array;
|
|
||||||
return array[LIMIT-1] + argc;
|
|
||||||
}
|
|
||||||
@ -1,112 +0,0 @@
|
|||||||
CEXT := c
|
|
||||||
CPPEXT := cpp
|
|
||||||
AEXT := s
|
|
||||||
SEXT := S
|
|
||||||
SRCEXT := \([$(CEXT)$(AEXT)$(SEXT)]\|$(CPPEXT)\)
|
|
||||||
OBJEXT := o
|
|
||||||
DEPEXT := d
|
|
||||||
SRCDIR := .
|
|
||||||
BUILDDIR := OBJ
|
|
||||||
|
|
||||||
SOURCES ?= $(shell find $(SRCDIR) -type f -regex ".*\.$(SRCEXT)" | sort)
|
|
||||||
OBJECTS := $(SOURCES:.$(CEXT)=.$(OBJEXT))
|
|
||||||
OBJECTS := $(OBJECTS:.$(AEXT)=.$(OBJEXT))
|
|
||||||
OBJECTS := $(OBJECTS:.$(SEXT)=.$(OBJEXT))
|
|
||||||
OBJECTS := $(OBJECTS:.$(CPPEXT)=.$(OBJEXT))
|
|
||||||
OBJECTS := $(patsubst $(SRCDIR)/%,$(BUILDDIR)/%,$(OBJECTS))
|
|
||||||
|
|
||||||
TARGETDIR := bin
|
|
||||||
TARGET := $(TARGETDIR)/blink-led
|
|
||||||
ROOT := ..
|
|
||||||
LIBRARY_DIRS :=
|
|
||||||
LIBRARY_FILES :=
|
|
||||||
|
|
||||||
MARCH :=-march=rv64imfdc
|
|
||||||
MABI :=-mabi=lp64d
|
|
||||||
LINK_FLAGS :=$(MARCH) $(MABI) -nostartfiles -L $(RISCV)/riscv64-unknown-elf/lib
|
|
||||||
LINKER :=$(ROOT)/linker1000.x
|
|
||||||
|
|
||||||
|
|
||||||
AFLAGS =$(MARCH) $(MABI) -W
|
|
||||||
CFLAGS =$(MARCH) $(MABI) -mcmodel=medany -O2
|
|
||||||
AS=riscv64-unknown-elf-as
|
|
||||||
CC=riscv64-unknown-elf-gcc
|
|
||||||
AR=riscv64-unknown-elf-ar
|
|
||||||
|
|
||||||
|
|
||||||
#Default Make
|
|
||||||
all: directories $(TARGET).memfile
|
|
||||||
|
|
||||||
#Remake
|
|
||||||
remake: clean all
|
|
||||||
|
|
||||||
#Make the Directories
|
|
||||||
directories:
|
|
||||||
@mkdir -p $(TARGETDIR)
|
|
||||||
@mkdir -p $(BUILDDIR)
|
|
||||||
|
|
||||||
clean:
|
|
||||||
rm -rf $(BUILDDIR) $(TARGETDIR) *.memfile *.objdump
|
|
||||||
|
|
||||||
|
|
||||||
#Needed for building additional library projects
|
|
||||||
ifdef LIBRARY_DIRS
|
|
||||||
LIBS+=${LIBRARY_DIRS:%=-L%} ${LIBRARY_FILES:%=-l%}
|
|
||||||
INC+=${LIBRARY_DIRS:%=-I%}
|
|
||||||
|
|
||||||
${LIBRARY_DIRS}:
|
|
||||||
$(MAKE) -C $@ -j 1
|
|
||||||
|
|
||||||
.PHONY: $(LIBRARY_DIRS) $(TARGET)
|
|
||||||
endif
|
|
||||||
|
|
||||||
|
|
||||||
#Pull in dependency info for *existing* .o files
|
|
||||||
-include $(OBJECTS:.$(OBJEXT)=.$(DEPEXT))
|
|
||||||
|
|
||||||
#Link
|
|
||||||
$(TARGET): $(OBJECTS) $(LIBRARY_DIRS)
|
|
||||||
$(CC) $(LINK_FLAGS) -g -o $(TARGET) $(OBJECTS) ${LIBS} -T ${LINKER}
|
|
||||||
|
|
||||||
|
|
||||||
#Compile
|
|
||||||
$(BUILDDIR)/%.$(OBJEXT): $(SRCDIR)/%.$(CEXT)
|
|
||||||
@mkdir -p $(dir $@)
|
|
||||||
$(CC) $(CFLAGS) $(INC) -c -o $@ $< > $(BUILDDIR)/$*.list
|
|
||||||
@$(CC) $(CFLAGS) $(INC) -MM $(SRCDIR)/$*.$(CEXT) > $(BUILDDIR)/$*.$(DEPEXT)
|
|
||||||
@cp -f $(BUILDDIR)/$*.$(DEPEXT) $(BUILDDIR)/$*.$(DEPEXT).tmp
|
|
||||||
@sed -e 's|.*:|$(BUILDDIR)/$*.$(OBJEXT):|' < $(BUILDDIR)/$*.$(DEPEXT).tmp > $(BUILDDIR)/$*.$(DEPEXT)
|
|
||||||
@sed -e 's/.*://' -e 's/\\$$//' < $(BUILDDIR)/$*.$(DEPEXT).tmp | fmt -1 | sed -e 's/^ *//' -e 's/$$/:/' >> $(BUILDDIR)/$*.$(DEPEXT)
|
|
||||||
@rm -f $(BUILDDIR)/$*.$(DEPEXT).tmp
|
|
||||||
|
|
||||||
# gcc won't output dependencies for assembly files for some reason
|
|
||||||
# most asm files don't have dependencies so the echo will work for now.
|
|
||||||
$(BUILDDIR)/%.$(OBJEXT): $(SRCDIR)/%.$(AEXT)
|
|
||||||
@mkdir -p $(dir $@)
|
|
||||||
$(CC) $(CFLAGS) -c -o $@ $< > $(BUILDDIR)/$*.list
|
|
||||||
@echo $@: $< > $(BUILDDIR)/$*.$(DEPEXT)
|
|
||||||
|
|
||||||
$(BUILDDIR)/%.$(OBJEXT): $(SRCDIR)/%.$(SEXT)
|
|
||||||
@mkdir -p $(dir $@)
|
|
||||||
$(CC) $(CFLAGS) $(INC) -c -o $@ $< > $(BUILDDIR)/$*.list
|
|
||||||
@echo $@: $< > $(BUILDDIR)/$*.$(DEPEXT)
|
|
||||||
|
|
||||||
# C++
|
|
||||||
$(BUILDDIR)/%.$(OBJEXT): $(SRCDIR)/%.$(CPPEXT)
|
|
||||||
@mkdir -p $(dir $@)
|
|
||||||
$(CC) $(CFLAGS) $(INC) -c -o $@ $< > $(BUILDDIR)/$*.list
|
|
||||||
@$(CC) $(CFLAGS) $(INC) -MM $(SRCDIR)/$*.$(CPPEXT) > $(BUILDDIR)/$*.$(DEPEXT)
|
|
||||||
@cp -f $(BUILDDIR)/$*.$(DEPEXT) $(BUILDDIR)/$*.$(DEPEXT).tmp
|
|
||||||
@sed -e 's|.*:|$(BUILDDIR)/$*.$(OBJEXT):|' < $(BUILDDIR)/$*.$(DEPEXT).tmp > $(BUILDDIR)/$*.$(DEPEXT)
|
|
||||||
@sed -e 's/.*://' -e 's/\\$$//' < $(BUILDDIR)/$*.$(DEPEXT).tmp | fmt -1 | sed -e 's/^ *//' -e 's/$$/:/' >> $(BUILDDIR)/$*.$(DEPEXT)
|
|
||||||
@rm -f $(BUILDDIR)/$*.$(DEPEXT).tmp
|
|
||||||
|
|
||||||
# convert to hex
|
|
||||||
$(TARGET).memfile: $(TARGET)
|
|
||||||
@echo 'Making object dump file.'
|
|
||||||
@riscv64-unknown-elf-objdump -D $< > $<.objdump
|
|
||||||
@echo 'Making memory file'
|
|
||||||
exe2memfile0.pl $<
|
|
||||||
extractFunctionRadix.sh $<.objdump
|
|
||||||
mkdir -p ../../imperas-riscv-tests/work/rv64BP/
|
|
||||||
cp -f $(TARGETDIR)/* ../../imperas-riscv-tests/work/rv64BP/
|
|
||||||
@ -1,86 +0,0 @@
|
|||||||
PERIOD = 22000000
|
|
||||||
#PERIOD = 100
|
|
||||||
|
|
||||||
.section .init
|
|
||||||
.global _start
|
|
||||||
.type _start, @function
|
|
||||||
|
|
||||||
|
|
||||||
_start:
|
|
||||||
# Initialize global pointer
|
|
||||||
.option push
|
|
||||||
.option norelax
|
|
||||||
1:auipc gp, %pcrel_hi(__global_pointer$)
|
|
||||||
addi gp, gp, %pcrel_lo(1b)
|
|
||||||
.option pop
|
|
||||||
|
|
||||||
li x1, 0
|
|
||||||
li x2, 0
|
|
||||||
li x4, 0
|
|
||||||
li x5, 0
|
|
||||||
li x6, 0
|
|
||||||
li x7, 0
|
|
||||||
li x8, 0
|
|
||||||
li x9, 0
|
|
||||||
li x10, 0
|
|
||||||
li x11, 0
|
|
||||||
li x12, 0
|
|
||||||
li x13, 0
|
|
||||||
li x14, 0
|
|
||||||
li x15, 0
|
|
||||||
li x16, 0
|
|
||||||
li x17, 0
|
|
||||||
li x18, 0
|
|
||||||
li x19, 0
|
|
||||||
li x20, 0
|
|
||||||
li x21, 0
|
|
||||||
li x22, 0
|
|
||||||
li x23, 0
|
|
||||||
li x24, 0
|
|
||||||
li x25, 0
|
|
||||||
li x26, 0
|
|
||||||
li x27, 0
|
|
||||||
li x28, 0
|
|
||||||
li x29, 0
|
|
||||||
li x30, 0
|
|
||||||
li x31, 0
|
|
||||||
|
|
||||||
# write to gpio
|
|
||||||
li x2, 0xFF
|
|
||||||
la x3, 0x10060000
|
|
||||||
|
|
||||||
# +8 is output enable
|
|
||||||
# +C is output value
|
|
||||||
|
|
||||||
addi x4, x3, 8
|
|
||||||
addi x5, x3, 0xC
|
|
||||||
|
|
||||||
# write initial value of 0xFF to GPO
|
|
||||||
sw x2, 0x0(x5)
|
|
||||||
# enable output
|
|
||||||
sw x2, 0x0(x4)
|
|
||||||
|
|
||||||
loop:
|
|
||||||
|
|
||||||
# delay
|
|
||||||
li x20, PERIOD/2
|
|
||||||
delay1:
|
|
||||||
addi x20, x20, -1
|
|
||||||
bge x20, x0, delay1
|
|
||||||
|
|
||||||
# clear GPO
|
|
||||||
sw x0, 0x0(x5)
|
|
||||||
|
|
||||||
# delay
|
|
||||||
li x20, PERIOD/2
|
|
||||||
delay2:
|
|
||||||
addi x20, x20, -1
|
|
||||||
bge x20, x0, delay2
|
|
||||||
|
|
||||||
# write GPO
|
|
||||||
sw x2, 0x0(x5)
|
|
||||||
|
|
||||||
j loop
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
@ -1,112 +0,0 @@
|
|||||||
CEXT := c
|
|
||||||
CPPEXT := cpp
|
|
||||||
AEXT := s
|
|
||||||
SEXT := S
|
|
||||||
SRCEXT := \([$(CEXT)$(AEXT)$(SEXT)]\|$(CPPEXT)\)
|
|
||||||
OBJEXT := o
|
|
||||||
DEPEXT := d
|
|
||||||
SRCDIR := .
|
|
||||||
BUILDDIR := OBJ
|
|
||||||
|
|
||||||
SOURCES ?= $(shell find $(SRCDIR) -type f -regex ".*\.$(SRCEXT)" | sort)
|
|
||||||
OBJECTS := $(SOURCES:.$(CEXT)=.$(OBJEXT))
|
|
||||||
OBJECTS := $(OBJECTS:.$(AEXT)=.$(OBJEXT))
|
|
||||||
OBJECTS := $(OBJECTS:.$(SEXT)=.$(OBJEXT))
|
|
||||||
OBJECTS := $(OBJECTS:.$(CPPEXT)=.$(OBJEXT))
|
|
||||||
OBJECTS := $(patsubst $(SRCDIR)/%,$(BUILDDIR)/%,$(OBJECTS))
|
|
||||||
|
|
||||||
TARGETDIR := bin
|
|
||||||
TARGET := $(TARGETDIR)/blink-led
|
|
||||||
ROOT := ..
|
|
||||||
LIBRARY_DIRS :=
|
|
||||||
LIBRARY_FILES :=
|
|
||||||
|
|
||||||
MARCH :=-march=rv64imfdc
|
|
||||||
MABI :=-mabi=lp64d
|
|
||||||
LINK_FLAGS :=$(MARCH) $(MABI) -nostartfiles -L $(RISCV)/riscv64-unknown-elf/lib
|
|
||||||
LINKER :=$(ROOT)/linker1000.x
|
|
||||||
|
|
||||||
|
|
||||||
AFLAGS =$(MARCH) $(MABI) -W
|
|
||||||
CFLAGS =$(MARCH) $(MABI) -mcmodel=medany -O2
|
|
||||||
AS=riscv64-unknown-elf-as
|
|
||||||
CC=riscv64-unknown-elf-gcc
|
|
||||||
AR=riscv64-unknown-elf-ar
|
|
||||||
|
|
||||||
|
|
||||||
#Default Make
|
|
||||||
all: directories $(TARGET).memfile
|
|
||||||
|
|
||||||
#Remake
|
|
||||||
remake: clean all
|
|
||||||
|
|
||||||
#Make the Directories
|
|
||||||
directories:
|
|
||||||
@mkdir -p $(TARGETDIR)
|
|
||||||
@mkdir -p $(BUILDDIR)
|
|
||||||
|
|
||||||
clean:
|
|
||||||
rm -rf $(BUILDDIR) $(TARGETDIR) *.memfile *.objdump
|
|
||||||
|
|
||||||
|
|
||||||
#Needed for building additional library projects
|
|
||||||
ifdef LIBRARY_DIRS
|
|
||||||
LIBS+=${LIBRARY_DIRS:%=-L%} ${LIBRARY_FILES:%=-l%}
|
|
||||||
INC+=${LIBRARY_DIRS:%=-I%}
|
|
||||||
|
|
||||||
${LIBRARY_DIRS}:
|
|
||||||
$(MAKE) -C $@ -j 1
|
|
||||||
|
|
||||||
.PHONY: $(LIBRARY_DIRS) $(TARGET)
|
|
||||||
endif
|
|
||||||
|
|
||||||
|
|
||||||
#Pull in dependency info for *existing* .o files
|
|
||||||
-include $(OBJECTS:.$(OBJEXT)=.$(DEPEXT))
|
|
||||||
|
|
||||||
#Link
|
|
||||||
$(TARGET): $(OBJECTS) $(LIBRARY_DIRS)
|
|
||||||
$(CC) $(LINK_FLAGS) -g -o $(TARGET) $(OBJECTS) ${LIBS} -T ${LINKER}
|
|
||||||
|
|
||||||
|
|
||||||
#Compile
|
|
||||||
$(BUILDDIR)/%.$(OBJEXT): $(SRCDIR)/%.$(CEXT)
|
|
||||||
@mkdir -p $(dir $@)
|
|
||||||
$(CC) $(CFLAGS) $(INC) -c -o $@ $< > $(BUILDDIR)/$*.list
|
|
||||||
@$(CC) $(CFLAGS) $(INC) -MM $(SRCDIR)/$*.$(CEXT) > $(BUILDDIR)/$*.$(DEPEXT)
|
|
||||||
@cp -f $(BUILDDIR)/$*.$(DEPEXT) $(BUILDDIR)/$*.$(DEPEXT).tmp
|
|
||||||
@sed -e 's|.*:|$(BUILDDIR)/$*.$(OBJEXT):|' < $(BUILDDIR)/$*.$(DEPEXT).tmp > $(BUILDDIR)/$*.$(DEPEXT)
|
|
||||||
@sed -e 's/.*://' -e 's/\\$$//' < $(BUILDDIR)/$*.$(DEPEXT).tmp | fmt -1 | sed -e 's/^ *//' -e 's/$$/:/' >> $(BUILDDIR)/$*.$(DEPEXT)
|
|
||||||
@rm -f $(BUILDDIR)/$*.$(DEPEXT).tmp
|
|
||||||
|
|
||||||
# gcc won't output dependencies for assembly files for some reason
|
|
||||||
# most asm files don't have dependencies so the echo will work for now.
|
|
||||||
$(BUILDDIR)/%.$(OBJEXT): $(SRCDIR)/%.$(AEXT)
|
|
||||||
@mkdir -p $(dir $@)
|
|
||||||
$(CC) $(CFLAGS) -c -o $@ $< > $(BUILDDIR)/$*.list
|
|
||||||
@echo $@: $< > $(BUILDDIR)/$*.$(DEPEXT)
|
|
||||||
|
|
||||||
$(BUILDDIR)/%.$(OBJEXT): $(SRCDIR)/%.$(SEXT)
|
|
||||||
@mkdir -p $(dir $@)
|
|
||||||
$(CC) $(CFLAGS) $(INC) -c -o $@ $< > $(BUILDDIR)/$*.list
|
|
||||||
@echo $@: $< > $(BUILDDIR)/$*.$(DEPEXT)
|
|
||||||
|
|
||||||
# C++
|
|
||||||
$(BUILDDIR)/%.$(OBJEXT): $(SRCDIR)/%.$(CPPEXT)
|
|
||||||
@mkdir -p $(dir $@)
|
|
||||||
$(CC) $(CFLAGS) $(INC) -c -o $@ $< > $(BUILDDIR)/$*.list
|
|
||||||
@$(CC) $(CFLAGS) $(INC) -MM $(SRCDIR)/$*.$(CPPEXT) > $(BUILDDIR)/$*.$(DEPEXT)
|
|
||||||
@cp -f $(BUILDDIR)/$*.$(DEPEXT) $(BUILDDIR)/$*.$(DEPEXT).tmp
|
|
||||||
@sed -e 's|.*:|$(BUILDDIR)/$*.$(OBJEXT):|' < $(BUILDDIR)/$*.$(DEPEXT).tmp > $(BUILDDIR)/$*.$(DEPEXT)
|
|
||||||
@sed -e 's/.*://' -e 's/\\$$//' < $(BUILDDIR)/$*.$(DEPEXT).tmp | fmt -1 | sed -e 's/^ *//' -e 's/$$/:/' >> $(BUILDDIR)/$*.$(DEPEXT)
|
|
||||||
@rm -f $(BUILDDIR)/$*.$(DEPEXT).tmp
|
|
||||||
|
|
||||||
# convert to hex
|
|
||||||
$(TARGET).memfile: $(TARGET)
|
|
||||||
@echo 'Making object dump file.'
|
|
||||||
@riscv64-unknown-elf-objdump -D $< > $<.objdump
|
|
||||||
@echo 'Making memory file'
|
|
||||||
exe2memfile0.pl $<
|
|
||||||
extractFunctionRadix.sh $<.objdump
|
|
||||||
mkdir -p ../../imperas-riscv-tests/work/rv64BP/
|
|
||||||
cp -f $(TARGETDIR)/* ../../imperas-riscv-tests/work/rv64BP/
|
|
||||||
@ -1,130 +0,0 @@
|
|||||||
PERIOD = 22000000
|
|
||||||
#PERIOD = 100
|
|
||||||
|
|
||||||
.section .init
|
|
||||||
.global _start
|
|
||||||
.type _start, @function
|
|
||||||
|
|
||||||
|
|
||||||
_start:
|
|
||||||
# Initialize global pointer
|
|
||||||
.option push
|
|
||||||
.option norelax
|
|
||||||
1:auipc gp, %pcrel_hi(__global_pointer$)
|
|
||||||
addi gp, gp, %pcrel_lo(1b)
|
|
||||||
.option pop
|
|
||||||
|
|
||||||
li x1, 0
|
|
||||||
li x2, 0
|
|
||||||
li x4, 0
|
|
||||||
li x5, 0
|
|
||||||
li x6, 0
|
|
||||||
li x7, 0
|
|
||||||
li x8, 0
|
|
||||||
li x9, 0
|
|
||||||
li x10, 0
|
|
||||||
li x11, 0
|
|
||||||
li x12, 0
|
|
||||||
li x13, 0
|
|
||||||
li x14, 0
|
|
||||||
li x15, 0
|
|
||||||
li x16, 0
|
|
||||||
li x17, 0
|
|
||||||
li x18, 0
|
|
||||||
li x19, 0
|
|
||||||
li x20, 0
|
|
||||||
li x21, 0
|
|
||||||
li x22, 0
|
|
||||||
li x23, 0
|
|
||||||
li x24, 0
|
|
||||||
li x25, 0
|
|
||||||
li x26, 0
|
|
||||||
li x27, 0
|
|
||||||
li x28, 0
|
|
||||||
li x29, 0
|
|
||||||
li x30, 0
|
|
||||||
li x31, 0
|
|
||||||
|
|
||||||
# write to gpio
|
|
||||||
li x2, 0xFF
|
|
||||||
la x3, 0x10060000
|
|
||||||
|
|
||||||
# +8 is output enable
|
|
||||||
# +C is output value
|
|
||||||
|
|
||||||
addi x4, x3, 8
|
|
||||||
addi x5, x3, 0xC
|
|
||||||
|
|
||||||
# write initial value of 0xFF to GPO
|
|
||||||
sw x2, 0x0(x5)
|
|
||||||
# enable output
|
|
||||||
sw x2, 0x0(x4)
|
|
||||||
|
|
||||||
# before jumping to led loop
|
|
||||||
# lets try writting to dram.
|
|
||||||
|
|
||||||
li x21, 0
|
|
||||||
li x23, 4096*16 # 64KB of data
|
|
||||||
|
|
||||||
li x22, 0x80000000
|
|
||||||
li x24, 0
|
|
||||||
|
|
||||||
write_loop:
|
|
||||||
add x25, x22, x24
|
|
||||||
sw x24, 0(x25)
|
|
||||||
addi x24, x24, 4
|
|
||||||
blt x24, x23, write_loop
|
|
||||||
|
|
||||||
li x24, 0
|
|
||||||
read_loop:
|
|
||||||
add x25, x22, x24
|
|
||||||
lw x21, 0(x25)
|
|
||||||
|
|
||||||
# check value
|
|
||||||
bne x21, x24, fail_loop
|
|
||||||
|
|
||||||
addi x24, x24, 4
|
|
||||||
|
|
||||||
#
|
|
||||||
blt x24, x23, read_loop
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
loop:
|
|
||||||
|
|
||||||
# delay
|
|
||||||
li x20, PERIOD
|
|
||||||
delay1:
|
|
||||||
addi x20, x20, -1
|
|
||||||
bge x20, x0, delay1
|
|
||||||
|
|
||||||
# new GPO
|
|
||||||
addi x2, x2, 1
|
|
||||||
sw x2, 0x0(x5)
|
|
||||||
|
|
||||||
j loop
|
|
||||||
|
|
||||||
|
|
||||||
fail_loop:
|
|
||||||
|
|
||||||
# delay
|
|
||||||
li x20, PERIOD/20
|
|
||||||
fail_delay1:
|
|
||||||
addi x20, x20, -1
|
|
||||||
bge x20, x0, fail_delay1
|
|
||||||
|
|
||||||
# clear GPO
|
|
||||||
sw x0, 0x0(x5)
|
|
||||||
|
|
||||||
# delay
|
|
||||||
li x20, PERIOD/20
|
|
||||||
fail_delay2:
|
|
||||||
addi x20, x20, -1
|
|
||||||
bge x20, x0, fail_delay2
|
|
||||||
|
|
||||||
# write GPO
|
|
||||||
sw x2, 0x0(x5)
|
|
||||||
|
|
||||||
j fail_loop
|
|
||||||
|
|
||||||
|
|
||||||
@ -1,112 +0,0 @@
|
|||||||
CEXT := c
|
|
||||||
CPPEXT := cpp
|
|
||||||
AEXT := s
|
|
||||||
SEXT := S
|
|
||||||
SRCEXT := \([$(CEXT)$(AEXT)$(SEXT)]\|$(CPPEXT)\)
|
|
||||||
OBJEXT := o
|
|
||||||
DEPEXT := d
|
|
||||||
SRCDIR := .
|
|
||||||
BUILDDIR := OBJ
|
|
||||||
|
|
||||||
SOURCES ?= $(shell find $(SRCDIR) -type f -regex ".*\.$(SRCEXT)" | sort)
|
|
||||||
OBJECTS := $(SOURCES:.$(CEXT)=.$(OBJEXT))
|
|
||||||
OBJECTS := $(OBJECTS:.$(AEXT)=.$(OBJEXT))
|
|
||||||
OBJECTS := $(OBJECTS:.$(SEXT)=.$(OBJEXT))
|
|
||||||
OBJECTS := $(OBJECTS:.$(CPPEXT)=.$(OBJEXT))
|
|
||||||
OBJECTS := $(patsubst $(SRCDIR)/%,$(BUILDDIR)/%,$(OBJECTS))
|
|
||||||
|
|
||||||
TARGETDIR := bin
|
|
||||||
TARGET := $(TARGETDIR)/fpga-test-sdc
|
|
||||||
ROOT := ..
|
|
||||||
LIBRARY_DIRS :=
|
|
||||||
LIBRARY_FILES :=
|
|
||||||
|
|
||||||
MARCH :=-march=rv64imfdc
|
|
||||||
MABI :=-mabi=lp64d
|
|
||||||
LINK_FLAGS :=$(MARCH) $(MABI) -nostartfiles -L $(RISCV)/riscv64-unknown-elf/lib
|
|
||||||
LINKER :=$(ROOT)/linker1000.x
|
|
||||||
|
|
||||||
|
|
||||||
AFLAGS =$(MARCH) $(MABI) -W
|
|
||||||
CFLAGS =$(MARCH) $(MABI) -mcmodel=medany -O2
|
|
||||||
AS=riscv64-unknown-elf-as
|
|
||||||
CC=riscv64-unknown-elf-gcc
|
|
||||||
AR=riscv64-unknown-elf-ar
|
|
||||||
|
|
||||||
|
|
||||||
#Default Make
|
|
||||||
all: directories $(TARGET).memfile
|
|
||||||
|
|
||||||
#Remake
|
|
||||||
remake: clean all
|
|
||||||
|
|
||||||
#Make the Directories
|
|
||||||
directories:
|
|
||||||
@mkdir -p $(TARGETDIR)
|
|
||||||
@mkdir -p $(BUILDDIR)
|
|
||||||
|
|
||||||
clean:
|
|
||||||
rm -rf $(BUILDDIR) $(TARGETDIR) *.memfile *.objdump
|
|
||||||
|
|
||||||
|
|
||||||
#Needed for building additional library projects
|
|
||||||
ifdef LIBRARY_DIRS
|
|
||||||
LIBS+=${LIBRARY_DIRS:%=-L%} ${LIBRARY_FILES:%=-l%}
|
|
||||||
INC+=${LIBRARY_DIRS:%=-I%}
|
|
||||||
|
|
||||||
${LIBRARY_DIRS}:
|
|
||||||
$(MAKE) -C $@ -j 1
|
|
||||||
|
|
||||||
.PHONY: $(LIBRARY_DIRS) $(TARGET)
|
|
||||||
endif
|
|
||||||
|
|
||||||
|
|
||||||
#Pull in dependency info for *existing* .o files
|
|
||||||
-include $(OBJECTS:.$(OBJEXT)=.$(DEPEXT))
|
|
||||||
|
|
||||||
#Link
|
|
||||||
$(TARGET): $(OBJECTS) $(LIBRARY_DIRS)
|
|
||||||
$(CC) $(LINK_FLAGS) -g -o $(TARGET) $(OBJECTS) ${LIBS} -T ${LINKER}
|
|
||||||
|
|
||||||
|
|
||||||
#Compile
|
|
||||||
$(BUILDDIR)/%.$(OBJEXT): $(SRCDIR)/%.$(CEXT)
|
|
||||||
@mkdir -p $(dir $@)
|
|
||||||
$(CC) $(CFLAGS) $(INC) -c -o $@ $< > $(BUILDDIR)/$*.list
|
|
||||||
@$(CC) $(CFLAGS) $(INC) -MM $(SRCDIR)/$*.$(CEXT) > $(BUILDDIR)/$*.$(DEPEXT)
|
|
||||||
@cp -f $(BUILDDIR)/$*.$(DEPEXT) $(BUILDDIR)/$*.$(DEPEXT).tmp
|
|
||||||
@sed -e 's|.*:|$(BUILDDIR)/$*.$(OBJEXT):|' < $(BUILDDIR)/$*.$(DEPEXT).tmp > $(BUILDDIR)/$*.$(DEPEXT)
|
|
||||||
@sed -e 's/.*://' -e 's/\\$$//' < $(BUILDDIR)/$*.$(DEPEXT).tmp | fmt -1 | sed -e 's/^ *//' -e 's/$$/:/' >> $(BUILDDIR)/$*.$(DEPEXT)
|
|
||||||
@rm -f $(BUILDDIR)/$*.$(DEPEXT).tmp
|
|
||||||
|
|
||||||
# gcc won't output dependencies for assembly files for some reason
|
|
||||||
# most asm files don't have dependencies so the echo will work for now.
|
|
||||||
$(BUILDDIR)/%.$(OBJEXT): $(SRCDIR)/%.$(AEXT)
|
|
||||||
@mkdir -p $(dir $@)
|
|
||||||
$(CC) $(CFLAGS) -c -o $@ $< > $(BUILDDIR)/$*.list
|
|
||||||
@echo $@: $< > $(BUILDDIR)/$*.$(DEPEXT)
|
|
||||||
|
|
||||||
$(BUILDDIR)/%.$(OBJEXT): $(SRCDIR)/%.$(SEXT)
|
|
||||||
@mkdir -p $(dir $@)
|
|
||||||
$(CC) $(CFLAGS) $(INC) -c -o $@ $< > $(BUILDDIR)/$*.list
|
|
||||||
@echo $@: $< > $(BUILDDIR)/$*.$(DEPEXT)
|
|
||||||
|
|
||||||
# C++
|
|
||||||
$(BUILDDIR)/%.$(OBJEXT): $(SRCDIR)/%.$(CPPEXT)
|
|
||||||
@mkdir -p $(dir $@)
|
|
||||||
$(CC) $(CFLAGS) $(INC) -c -o $@ $< > $(BUILDDIR)/$*.list
|
|
||||||
@$(CC) $(CFLAGS) $(INC) -MM $(SRCDIR)/$*.$(CPPEXT) > $(BUILDDIR)/$*.$(DEPEXT)
|
|
||||||
@cp -f $(BUILDDIR)/$*.$(DEPEXT) $(BUILDDIR)/$*.$(DEPEXT).tmp
|
|
||||||
@sed -e 's|.*:|$(BUILDDIR)/$*.$(OBJEXT):|' < $(BUILDDIR)/$*.$(DEPEXT).tmp > $(BUILDDIR)/$*.$(DEPEXT)
|
|
||||||
@sed -e 's/.*://' -e 's/\\$$//' < $(BUILDDIR)/$*.$(DEPEXT).tmp | fmt -1 | sed -e 's/^ *//' -e 's/$$/:/' >> $(BUILDDIR)/$*.$(DEPEXT)
|
|
||||||
@rm -f $(BUILDDIR)/$*.$(DEPEXT).tmp
|
|
||||||
|
|
||||||
# convert to hex
|
|
||||||
$(TARGET).memfile: $(TARGET)
|
|
||||||
@echo 'Making object dump file.'
|
|
||||||
@riscv64-unknown-elf-objdump -D $< > $<.objdump
|
|
||||||
@echo 'Making memory file'
|
|
||||||
riscv64-unknown-elf-elf2hex --bit-width 64 --input $^ --output $@
|
|
||||||
extractFunctionRadix.sh $<.objdump
|
|
||||||
mkdir -p ../work/
|
|
||||||
cp -f $(TARGETDIR)/* ../work/
|
|
||||||
@ -1,101 +0,0 @@
|
|||||||
PERIOD = 11000000
|
|
||||||
#PERIOD = 20
|
|
||||||
|
|
||||||
.section .init
|
|
||||||
.global _start
|
|
||||||
.type _start, @function
|
|
||||||
|
|
||||||
|
|
||||||
_start:
|
|
||||||
# Initialize global pointer
|
|
||||||
.option push
|
|
||||||
.option norelax
|
|
||||||
1:auipc gp, %pcrel_hi(__global_pointer$)
|
|
||||||
addi gp, gp, %pcrel_lo(1b)
|
|
||||||
.option pop
|
|
||||||
|
|
||||||
li x1, 0
|
|
||||||
li x2, 0
|
|
||||||
li x4, 0
|
|
||||||
li x5, 0
|
|
||||||
li x6, 0
|
|
||||||
li x7, 0
|
|
||||||
li x8, 0
|
|
||||||
li x9, 0
|
|
||||||
li x10, 0
|
|
||||||
li x11, 0
|
|
||||||
li x12, 0
|
|
||||||
li x13, 0
|
|
||||||
li x14, 0
|
|
||||||
li x15, 0
|
|
||||||
li x16, 0
|
|
||||||
li x17, 0
|
|
||||||
li x18, 0
|
|
||||||
li x19, 0
|
|
||||||
li x20, 0
|
|
||||||
li x21, 0
|
|
||||||
li x22, 0
|
|
||||||
li x23, 0
|
|
||||||
li x24, 0
|
|
||||||
li x25, 0
|
|
||||||
li x26, 0
|
|
||||||
li x27, 0
|
|
||||||
li x28, 0
|
|
||||||
li x29, 0
|
|
||||||
li x30, 0
|
|
||||||
li x31, 0
|
|
||||||
|
|
||||||
|
|
||||||
# set the stack pointer to the top of memory - 8 bytes (pointer size)
|
|
||||||
li sp, 0x87FFFFF8
|
|
||||||
|
|
||||||
li a0, 0x00000000
|
|
||||||
li a1, 0x80000000
|
|
||||||
#li a2, 128*1024*1024/512 # copy 128MB
|
|
||||||
li a2, 127*1024*1024/512 # copy 127MB upper 1MB contains the return address (ra)
|
|
||||||
#li a2, 800 # copy 400KB
|
|
||||||
jal ra, copyFlash
|
|
||||||
|
|
||||||
fence.i
|
|
||||||
# now toggle led so we know the copy completed.
|
|
||||||
|
|
||||||
# write to gpio
|
|
||||||
li t2, 0xFF
|
|
||||||
la t3, 0x1006000C
|
|
||||||
li t4, 5
|
|
||||||
|
|
||||||
loop:
|
|
||||||
|
|
||||||
# delay
|
|
||||||
li t0, PERIOD/2
|
|
||||||
delay1:
|
|
||||||
addi t0, t0, -1
|
|
||||||
bge t0, x0, delay1
|
|
||||||
sw t2, 0x0(t3)
|
|
||||||
|
|
||||||
li t0, PERIOD/2
|
|
||||||
delay2:
|
|
||||||
addi t0, t0, -1
|
|
||||||
bge t0, x0, delay2
|
|
||||||
sw x0, 0x0(t3)
|
|
||||||
|
|
||||||
addi t4, t4, -1
|
|
||||||
bgt t4, x0, loop
|
|
||||||
|
|
||||||
|
|
||||||
# now that the card is copied and the led toggled we
|
|
||||||
# jump to the copied contents of the sd card.
|
|
||||||
|
|
||||||
jumpToLinux:
|
|
||||||
csrrs a0, 0xF14, x0 # copy hard ID to a0
|
|
||||||
li a1, 0x87000000 # end of memory? not 100% sure on this but it's 112MB
|
|
||||||
la a2, end_of_bios
|
|
||||||
li t0, 0x80000000 # start of code
|
|
||||||
|
|
||||||
jalr x0, t0, 0
|
|
||||||
|
|
||||||
end_of_bios:
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
@ -1,40 +0,0 @@
|
|||||||
///////////////////////////////////////////
|
|
||||||
// copyFlash.sv
|
|
||||||
//
|
|
||||||
// Written: Rose Thompson September 25, 2021
|
|
||||||
// Modified:
|
|
||||||
//
|
|
||||||
// Purpose: copies flash card into memory
|
|
||||||
//
|
|
||||||
// A component of the Wally configurable RISC-V project.
|
|
||||||
//
|
|
||||||
// Copyright (C) 2021 Harvey Mudd College & Oklahoma State University
|
|
||||||
//
|
|
||||||
// Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation
|
|
||||||
// files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy,
|
|
||||||
// modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software
|
|
||||||
// is furnished to do so, subject to the following conditions:
|
|
||||||
//
|
|
||||||
// The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
|
|
||||||
//
|
|
||||||
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
|
|
||||||
// OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS
|
|
||||||
// BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT
|
|
||||||
// OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
|
||||||
///////////////////////////////////////////
|
|
||||||
|
|
||||||
#include "sdcDriver.h"
|
|
||||||
|
|
||||||
void copyFlash(long int blockAddr, long int * Dst, int numBlocks) {
|
|
||||||
|
|
||||||
setSDCCLK(4); // must be even, 1 gives no division.
|
|
||||||
waitInitSDC();
|
|
||||||
|
|
||||||
int index;
|
|
||||||
|
|
||||||
for(index = 0; index < numBlocks; index++) {
|
|
||||||
copySDC512(blockAddr+(index*512), Dst+(index*512/8));
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
}
|
|
||||||
@ -1,154 +0,0 @@
|
|||||||
# start by writting the clock divider to 4 setting SDC to 25MHz
|
|
||||||
la x3, 0x12100
|
|
||||||
li x4, -4
|
|
||||||
sw x4, 0x0(x3)
|
|
||||||
|
|
||||||
# start by writting the clock divider to 1 setting SDC to 100MHZ
|
|
||||||
la x3, 0x12100
|
|
||||||
li x4, 1
|
|
||||||
sw x4, 0x0(x3)
|
|
||||||
|
|
||||||
|
|
||||||
# wait until the SDC is done with initialization
|
|
||||||
li x4, 0x1
|
|
||||||
wait_sdc_done_init:
|
|
||||||
lw x5, 4(x3)
|
|
||||||
and x5, x5, x4
|
|
||||||
bne x5, x4, wait_sdc_done_init
|
|
||||||
|
|
||||||
# now that it is done lets setup for a read
|
|
||||||
li x6, 0x20000000
|
|
||||||
sd x6, 0x10(x3) # write address register
|
|
||||||
|
|
||||||
# send read by writting to command register
|
|
||||||
li x7, 0x4
|
|
||||||
sw x7, 0x8(x3)
|
|
||||||
|
|
||||||
li x4, 0x2
|
|
||||||
wait_sdc_done_read:
|
|
||||||
lw x5, 4(x3)
|
|
||||||
and x5, x5, x4
|
|
||||||
beq x5, x4, wait_sdc_done_read
|
|
||||||
|
|
||||||
# copy data from mailbox
|
|
||||||
li x11, 0x80000000
|
|
||||||
li x9, 0
|
|
||||||
copy_sdc:
|
|
||||||
li x8, 512/8
|
|
||||||
ld x10, 0x18(x3) # read the mailbox
|
|
||||||
sd x10, 0x0(x11) # write to dram
|
|
||||||
addi x9, x9, 1
|
|
||||||
addi x11, x11, 8
|
|
||||||
blt x9, x8, copy_sdc
|
|
||||||
|
|
||||||
# second read of sdc
|
|
||||||
# now that it is done lets setup for a read
|
|
||||||
li x6, 0x20000200
|
|
||||||
sd x6, 0x10(x3) # write address register
|
|
||||||
|
|
||||||
# send read by writting to command register
|
|
||||||
li x7, 0x4
|
|
||||||
sw x7, 0x8(x3)
|
|
||||||
|
|
||||||
li x4, 0x2
|
|
||||||
wait_sdc_done_read2:
|
|
||||||
lw x5, 4(x3)
|
|
||||||
and x5, x5, x4
|
|
||||||
beq x5, x4, wait_sdc_done_read2
|
|
||||||
|
|
||||||
# copy data from mailbox
|
|
||||||
li x11, 0x80000200
|
|
||||||
li x9, 0
|
|
||||||
copy_sdc2:
|
|
||||||
li x8, 512/8
|
|
||||||
ld x10, 0x18(x3) # read the mailbox
|
|
||||||
sd x10, 0x0(x11) # write to dram
|
|
||||||
addi x9, x9, 1
|
|
||||||
addi x11, x11, 8
|
|
||||||
blt x9, x8, copy_sdc2
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
# write to gpio
|
|
||||||
li x2, 0xFF
|
|
||||||
la x3, 0x10060000
|
|
||||||
|
|
||||||
# +8 is output enable
|
|
||||||
# +C is output value
|
|
||||||
|
|
||||||
addi x4, x3, 8
|
|
||||||
addi x5, x3, 0xC
|
|
||||||
|
|
||||||
# write initial value of 0xFF to GPO
|
|
||||||
sw x2, 0x0(x5)
|
|
||||||
# enable output
|
|
||||||
sw x2, 0x0(x4)
|
|
||||||
|
|
||||||
# before jumping to led loop
|
|
||||||
# lets try writting to dram.
|
|
||||||
|
|
||||||
li x21, 0
|
|
||||||
li x23, 4096*16 # 64KB of data
|
|
||||||
|
|
||||||
li x22, 0x80000000
|
|
||||||
li x24, 0
|
|
||||||
|
|
||||||
write_loop:
|
|
||||||
add x25, x22, x24
|
|
||||||
sw x24, 0(x25)
|
|
||||||
addi x24, x24, 4
|
|
||||||
blt x24, x23, write_loop
|
|
||||||
|
|
||||||
li x24, 0
|
|
||||||
read_loop:
|
|
||||||
add x25, x22, x24
|
|
||||||
lw x21, 0(x25)
|
|
||||||
|
|
||||||
# check value
|
|
||||||
bne x21, x24, fail_loop
|
|
||||||
|
|
||||||
addi x24, x24, 4
|
|
||||||
|
|
||||||
#
|
|
||||||
blt x24, x23, read_loop
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
loop:
|
|
||||||
|
|
||||||
# delay
|
|
||||||
li x20, PERIOD
|
|
||||||
delay1:
|
|
||||||
addi x20, x20, -1
|
|
||||||
bge x20, x0, delay1
|
|
||||||
|
|
||||||
# new GPO
|
|
||||||
addi x2, x2, 1
|
|
||||||
sw x2, 0x0(x5)
|
|
||||||
|
|
||||||
j loop
|
|
||||||
|
|
||||||
|
|
||||||
fail_loop:
|
|
||||||
|
|
||||||
# delay
|
|
||||||
li x20, PERIOD/20
|
|
||||||
fail_delay1:
|
|
||||||
addi x20, x20, -1
|
|
||||||
bge x20, x0, fail_delay1
|
|
||||||
|
|
||||||
# clear GPO
|
|
||||||
sw x0, 0x0(x5)
|
|
||||||
|
|
||||||
# delay
|
|
||||||
li x20, PERIOD/20
|
|
||||||
fail_delay2:
|
|
||||||
addi x20, x20, -1
|
|
||||||
bge x20, x0, fail_delay2
|
|
||||||
|
|
||||||
# write GPO
|
|
||||||
sw x2, 0x0(x5)
|
|
||||||
|
|
||||||
j fail_loop
|
|
||||||
|
|
||||||
|
|
||||||
@ -1,69 +0,0 @@
|
|||||||
///////////////////////////////////////////
|
|
||||||
// SDC.sv
|
|
||||||
//
|
|
||||||
// Written: Rose Thompson September 25, 2021
|
|
||||||
// Modified:
|
|
||||||
//
|
|
||||||
// Purpose: driver for sdc reader.
|
|
||||||
//
|
|
||||||
// A component of the Wally configurable RISC-V project.
|
|
||||||
//
|
|
||||||
// Copyright (C) 2021 Harvey Mudd College & Oklahoma State University
|
|
||||||
//
|
|
||||||
// Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation
|
|
||||||
// files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy,
|
|
||||||
// modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software
|
|
||||||
// is furnished to do so, subject to the following conditions:
|
|
||||||
//
|
|
||||||
// The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
|
|
||||||
//
|
|
||||||
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
|
|
||||||
// OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS
|
|
||||||
// BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT
|
|
||||||
// OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
|
||||||
///////////////////////////////////////////
|
|
||||||
|
|
||||||
|
|
||||||
#include "sdcDriver.h"
|
|
||||||
|
|
||||||
#define SDC_MAIL_BOX 0x12100
|
|
||||||
|
|
||||||
void copySDC512(long int blockAddr, long int * Dst) {
|
|
||||||
|
|
||||||
waitInitSDC();
|
|
||||||
|
|
||||||
volatile long int * mailBoxAddr;
|
|
||||||
volatile int * mailBoxCmd;
|
|
||||||
volatile int * mailBoxStatus;
|
|
||||||
volatile long int * mailBoxReadData;
|
|
||||||
mailBoxStatus = (int *) (SDC_MAIL_BOX + 0x4);
|
|
||||||
mailBoxCmd = (int *) (SDC_MAIL_BOX + 0x8);
|
|
||||||
mailBoxAddr = (long int *) (SDC_MAIL_BOX + 0x10);
|
|
||||||
mailBoxReadData = (long int *) (SDC_MAIL_BOX + 0x18);
|
|
||||||
|
|
||||||
// write the SDC address register with the blockAddr
|
|
||||||
*mailBoxAddr = blockAddr;
|
|
||||||
*mailBoxCmd = 0x4;
|
|
||||||
|
|
||||||
// wait until the mailbox has valid data
|
|
||||||
// this occurs when status[1] = 0
|
|
||||||
while((*mailBoxStatus & 0x2) == 0x2);
|
|
||||||
|
|
||||||
int index;
|
|
||||||
for(index = 0; index < 512/8; index++) {
|
|
||||||
Dst[index] = *mailBoxReadData;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
volatile void waitInitSDC(){
|
|
||||||
volatile int * mailBoxStatus;
|
|
||||||
mailBoxStatus = (int *) (SDC_MAIL_BOX + 0x4);
|
|
||||||
while((*mailBoxStatus & 0x1) != 0x1);
|
|
||||||
}
|
|
||||||
|
|
||||||
void setSDCCLK(int divider){
|
|
||||||
divider = (1 - (divider >> 1));
|
|
||||||
volatile int * mailBoxCLK;
|
|
||||||
mailBoxCLK = (int *) (SDC_MAIL_BOX + 0x0);
|
|
||||||
*mailBoxCLK = divider;
|
|
||||||
}
|
|
||||||
@ -1,9 +0,0 @@
|
|||||||
#ifndef __SDCDRIVER_H
|
|
||||||
#define __SDCDRIVER_H
|
|
||||||
|
|
||||||
|
|
||||||
void copySDC512(long int, long int *);
|
|
||||||
volatile void waitInitSDC();
|
|
||||||
void setSDCCLK(int);
|
|
||||||
|
|
||||||
#endif
|
|
||||||
@ -1,97 +0,0 @@
|
|||||||
#PERIOD = 22000000
|
|
||||||
PERIOD = 20
|
|
||||||
|
|
||||||
.section .init
|
|
||||||
.global _start
|
|
||||||
.type _start, @function
|
|
||||||
|
|
||||||
|
|
||||||
_start:
|
|
||||||
# Initialize global pointer
|
|
||||||
.option push
|
|
||||||
.option norelax
|
|
||||||
1:auipc gp, %pcrel_hi(__global_pointer$)
|
|
||||||
addi gp, gp, %pcrel_lo(1b)
|
|
||||||
.option pop
|
|
||||||
|
|
||||||
li x1, 0
|
|
||||||
li x2, 0
|
|
||||||
li x4, 0
|
|
||||||
li x5, 0
|
|
||||||
li x6, 0
|
|
||||||
li x7, 0
|
|
||||||
li x8, 0
|
|
||||||
li x9, 0
|
|
||||||
li x10, 0
|
|
||||||
li x11, 0
|
|
||||||
li x12, 0
|
|
||||||
li x13, 0
|
|
||||||
li x14, 0
|
|
||||||
li x15, 0
|
|
||||||
li x16, 0
|
|
||||||
li x17, 0
|
|
||||||
li x18, 0
|
|
||||||
li x19, 0
|
|
||||||
li x20, 0
|
|
||||||
li x21, 0
|
|
||||||
li x22, 0
|
|
||||||
li x23, 0
|
|
||||||
li x24, 0
|
|
||||||
li x25, 0
|
|
||||||
li x26, 0
|
|
||||||
li x27, 0
|
|
||||||
li x28, 0
|
|
||||||
li x29, 0
|
|
||||||
li x30, 0
|
|
||||||
li x31, 0
|
|
||||||
|
|
||||||
|
|
||||||
# set the stack pointer to the top of memory - 8 bytes (pointer size)
|
|
||||||
li sp, 0x87FFFFF8
|
|
||||||
|
|
||||||
li a0, 0x20000000
|
|
||||||
li a1, 0x80000000
|
|
||||||
li a2, 2
|
|
||||||
jal ra, copyFlash
|
|
||||||
|
|
||||||
|
|
||||||
# now toggle led so we know the copy completed.
|
|
||||||
|
|
||||||
# write to gpio
|
|
||||||
li t2, 0xFF
|
|
||||||
la t3, 0x1001200C
|
|
||||||
li t4, 5
|
|
||||||
|
|
||||||
loop:
|
|
||||||
|
|
||||||
# delay
|
|
||||||
li t0, PERIOD/2
|
|
||||||
delay1:
|
|
||||||
addi t0, t0, -1
|
|
||||||
bge t0, x0, delay1
|
|
||||||
sw t2, 0x0(t3)
|
|
||||||
|
|
||||||
li t0, PERIOD/2
|
|
||||||
delay2:
|
|
||||||
addi t0, t0, -1
|
|
||||||
bge t0, x0, delay2
|
|
||||||
sw x0, 0x0(t3)
|
|
||||||
|
|
||||||
addi t4, t4, -1
|
|
||||||
bgt t4, x0, loop
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
jal ra, _halt
|
|
||||||
|
|
||||||
.section .text
|
|
||||||
.global _halt
|
|
||||||
.type _halt, @function
|
|
||||||
_halt:
|
|
||||||
li gp, 1
|
|
||||||
li a0, 0
|
|
||||||
ecall
|
|
||||||
j _halt
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
@ -1,3 +0,0 @@
|
|||||||
Matt wrote this using STL.
|
|
||||||
|
|
||||||
It is GPL'ed.
|
|
||||||
@ -1,20 +0,0 @@
|
|||||||
TARGETDIR := qsort
|
|
||||||
TARGET := $(TARGETDIR)/$(TARGETDIR).elf
|
|
||||||
ROOT := ..
|
|
||||||
LIBRARY_DIRS := ${ROOT}/crt0
|
|
||||||
LIBRARY_FILES := crt0
|
|
||||||
|
|
||||||
MARCH :=-march=rv64ic
|
|
||||||
MABI :=-mabi=lp64
|
|
||||||
LINK_FLAGS :=$(MARCH) $(MABI) -nostartfiles -Wl,-Map=$(TARGET).map -L $(RISCV)/riscv64-unknown-elf/lib
|
|
||||||
LINKER := ${ROOT}/linker8000-0000.x
|
|
||||||
|
|
||||||
CFLAGS =$(MARCH) $(MABI) -Wa,-alhs -Wa,-L -mcmodel=medany -mstrict-align -O2
|
|
||||||
|
|
||||||
CC=riscv64-unknown-elf-gcc
|
|
||||||
DA=riscv64-unknown-elf-objdump -d
|
|
||||||
|
|
||||||
|
|
||||||
include $(ROOT)/makefile.inc
|
|
||||||
|
|
||||||
|
|
||||||
File diff suppressed because it is too large
Load Diff
Loading…
Reference in New Issue
Block a user