smallest cleanup

This commit is contained in:
Polprzewodnikowy 2022-01-18 19:21:49 +01:00
parent 3a75e1240f
commit 7c4b5f7754
13 changed files with 75 additions and 46 deletions

View File

@ -15,6 +15,7 @@ FILES=(
BUILT_CIC=false BUILT_CIC=false
BUILT_N64=false BUILT_N64=false
BUILT_RISCV=false BUILT_RISCV=false
BUILT_SW=false
BUILT_FPGA=false BUILT_FPGA=false
BUILT_UPDATE=false BUILT_UPDATE=false
BUILT_RELEASE=false BUILT_RELEASE=false
@ -44,7 +45,6 @@ build_n64 () {
if [ ! -z "${GIT_BRANCH+x}" ]; then N64_FLAGS+=" -DGIT_BRANCH='\"$GIT_BRANCH\"'"; fi if [ ! -z "${GIT_BRANCH+x}" ]; then N64_FLAGS+=" -DGIT_BRANCH='\"$GIT_BRANCH\"'"; fi
if [ ! -z "${GIT_TAG+x}" ]; then N64_FLAGS+=" -DGIT_TAG='\"$GIT_TAG\"'"; fi if [ ! -z "${GIT_TAG+x}" ]; then N64_FLAGS+=" -DGIT_TAG='\"$GIT_TAG\"'"; fi
if [ ! -z "${GIT_SHA+x}" ]; then N64_FLAGS+=" -DGIT_SHA='\"$GIT_SHA\"'"; fi if [ ! -z "${GIT_SHA+x}" ]; then N64_FLAGS+=" -DGIT_SHA='\"$GIT_SHA\"'"; fi
if [ ! -z "${GIT_MESSAGE+x}" ]; then N64_FLAGS+=" -DGIT_MESSAGE='\"$GIT_MESSAGE\"'"; fi
make all -j USER_FLAGS="$N64_FLAGS" make all -j USER_FLAGS="$N64_FLAGS"
popd > /dev/null popd > /dev/null
@ -64,15 +64,29 @@ build_riscv () {
BUILT_RISCV=true BUILT_RISCV=true
} }
build_fpga () { build_sw () {
if [ "$BUILT_FPGA" = true ]; then return; fi if [ "$BUILT_SW" = true ]; then return; fi
build_n64 build_n64
build_riscv build_riscv
pushd fw > /dev/null
mkdir -p output_files > /dev/null
cat ../sw/n64/build/n64boot.bin ../sw/riscv/build/governor.bin > output_files/SC64_software.bin
objcopy -I binary -O ihex output_files/SC64_software.bin output_files/SC64_software.hex
popd
BUILT_SW=true
}
build_fpga () {
if [ "$BUILT_FPGA" = true ]; then return; fi
build_sw
pushd fw > /dev/null pushd fw > /dev/null
if [ "$SKIP_FPGA_REBUILD" = true ] && [ -f output_files/SummerCart64.sof ]; then if [ "$SKIP_FPGA_REBUILD" = true ] && [ -f output_files/SummerCart64.sof ]; then
quartus_cpf -c SummerCart64.cof echo Skipping FPGA build
else else
if [ "$DEBUG_ENABLED" = true ]; then if [ "$DEBUG_ENABLED" = true ]; then
quartus_sh --set VERILOG_MACRO="DEBUG" ./SummerCart64.qpf quartus_sh --set VERILOG_MACRO="DEBUG" ./SummerCart64.qpf
@ -91,9 +105,8 @@ build_update () {
build_fpga build_fpga
pushd fw/output_files > /dev/null pushd fw/output_files > /dev/null
cat sc64_firmware_ufm_auto.rpd sc64_firmware_cfm0_auto.rpd > SC64_update_tmp.bin objcopy -I binary -O binary --reverse-bytes=4 sc64_firmware_cfm0_auto.rpd SC64_firmware.bin
objcopy -I binary -O binary --reverse-bytes=4 SC64_update_tmp.bin SC64_update.bin cat SC64_software.bin SC64_firmware.bin > SC64_update.bin
rm SC64_update_tmp.bin
popd > /dev/null popd > /dev/null
BUILT_UPDATE=true BUILT_UPDATE=true
@ -120,7 +133,8 @@ print_usage () {
echo " cic - assemble UltraCIC-III software" echo " cic - assemble UltraCIC-III software"
echo " n64 - compile N64 bootloader software" echo " n64 - compile N64 bootloader software"
echo " riscv - compile cart governor software" echo " riscv - compile cart governor software"
echo " fpga - compile FPGA design (triggers 'n64' and 'riscv' build)" echo " sw - compile all software (triggers 'n64' and 'riscv' build)"
echo " fpga - compile FPGA design (triggers 'sw' build)"
echo " update - convert programming .pof file to raw binary for self-upgrade (triggers 'fpga' build)" echo " update - convert programming .pof file to raw binary for self-upgrade (triggers 'fpga' build)"
echo " release - collect and zip files for release (triggers 'cic' and 'update' build)" echo " release - collect and zip files for release (triggers 'cic' and 'update' build)"
echo " -c | --force-clean" echo " -c | --force-clean"
@ -142,6 +156,7 @@ fi
TRIGGER_CIC=false TRIGGER_CIC=false
TRIGGER_N64=false TRIGGER_N64=false
TRIGGER_RISCV=false TRIGGER_RISCV=false
TRIGGER_SW=false
TRIGGER_FPGA=false TRIGGER_FPGA=false
TRIGGER_UPDATE=false TRIGGER_UPDATE=false
TRIGGER_RELEASE=false TRIGGER_RELEASE=false
@ -157,6 +172,9 @@ while test $# -gt 0; do
riscv) riscv)
TRIGGER_RISCV=true TRIGGER_RISCV=true
;; ;;
sw)
TRIGGER_SW=true
;;
fpga) fpga)
TRIGGER_FPGA=true TRIGGER_FPGA=true
;; ;;
@ -193,6 +211,7 @@ if [ "$DEBUG_ENABLED" = true ]; then USER_FLAGS+=" -DDEBUG"; fi
if [ "$TRIGGER_CIC" = true ]; then build_cic; fi if [ "$TRIGGER_CIC" = true ]; then build_cic; fi
if [ "$TRIGGER_N64" = true ]; then build_n64; fi if [ "$TRIGGER_N64" = true ]; then build_n64; fi
if [ "$TRIGGER_RISCV" = true ]; then build_riscv; fi if [ "$TRIGGER_RISCV" = true ]; then build_riscv; fi
if [ "$TRIGGER_SW" = true ]; then build_sw; fi
if [ "$TRIGGER_FPGA" = true ]; then build_fpga; fi if [ "$TRIGGER_FPGA" = true ]; then build_fpga; fi
if [ "$TRIGGER_UPDATE" = true ]; then build_update; fi if [ "$TRIGGER_UPDATE" = true ]; then build_update; fi
if [ "$TRIGGER_RELEASE" = true ]; then build_release; fi if [ "$TRIGGER_RELEASE" = true ]; then build_release; fi

View File

@ -16,7 +16,6 @@ fi
GIT_BRANCH=$(git rev-parse --abbrev-ref HEAD) GIT_BRANCH=$(git rev-parse --abbrev-ref HEAD)
GIT_TAG=$(git describe --tags 2> /dev/null) GIT_TAG=$(git describe --tags 2> /dev/null)
GIT_SHA=$(git rev-parse HEAD) GIT_SHA=$(git rev-parse HEAD)
GIT_MESSAGE=$(git log -1 --pretty=format:%s)
if [ -t 1 ]; then if [ -t 1 ]; then
DOCKER_OPTIONS="-it" DOCKER_OPTIONS="-it"
@ -27,6 +26,5 @@ docker exec \
-e GIT_BRANCH="$GIT_BRANCH" \ -e GIT_BRANCH="$GIT_BRANCH" \
-e GIT_TAG="$GIT_TAG" \ -e GIT_TAG="$GIT_TAG" \
-e GIT_SHA="$GIT_SHA" \ -e GIT_SHA="$GIT_SHA" \
-e GIT_MESSAGE="$GIT_MESSAGE" \
$CONTAINER_NAME \ $CONTAINER_NAME \
./build.sh $@ ./build.sh $@

View File

@ -27,9 +27,7 @@
<verify_protect>0</verify_protect> <verify_protect>0</verify_protect>
<epof>0</epof> <epof>0</epof>
<ufm_source>2</ufm_source> <ufm_source>2</ufm_source>
<ufm_filepath>../sw/n64/build/n64boot.hex</ufm_filepath> <ufm_filepath>output_files/SC64_software.hex</ufm_filepath>
<cfm0_filepath>../sw/riscv/build/governor.hex</cfm0_filepath>
<cfm0_file_start_addr>305152</cfm0_file_start_addr>
</MAX10_device_options> </MAX10_device_options>
<advanced_options> <advanced_options>
<ignore_epcs_id_check>1</ignore_epcs_id_check> <ignore_epcs_id_check>1</ignore_epcs_id_check>

View File

@ -89,7 +89,7 @@ module n64_bootloader (
bus.ack = source_request == T_N64 && data_ack; bus.ack = source_request == T_N64 && data_ack;
bus.rdata = 16'd0; bus.rdata = 16'd0;
if (bus.ack && bus.address >= 32'h10000000 && bus.address < 32'h10016800) begin if (bus.ack && bus.address >= 32'h10000000 && bus.address < 32'h10010000) begin
if (bus.address[1]) bus.rdata = {data_rdata[23:16], data_rdata[31:24]}; if (bus.address[1]) bus.rdata = {data_rdata[23:16], data_rdata[31:24]};
else bus.rdata = {data_rdata[7:0], data_rdata[15:8]}; else bus.rdata = {data_rdata[7:0], data_rdata[15:8]};
end end

View File

@ -33,7 +33,7 @@ package sc64;
parameter bit [31:0] SC64_VER = 32'h53437632; parameter bit [31:0] SC64_VER = 32'h53437632;
parameter int CLOCK_FREQUENCY = 32'd100_000_000; parameter int CLOCK_FREQUENCY = 32'd100_000_000;
parameter bit [31:0] CPU_RESET_VECTOR = {4'(ID_CPU_FLASH), 28'h0035800}; parameter bit [31:0] CPU_RESET_VECTOR = {4'(ID_CPU_FLASH), 28'h0010000};
parameter int UART_BAUD_RATE = 32'd1_000_000; parameter int UART_BAUD_RATE = 32'd1_000_000;
`ifdef DEBUG `ifdef DEBUG

View File

@ -15,16 +15,16 @@ BUILD_DIR = build
SRC_FILES = \ SRC_FILES = \
startup.S \ startup.S \
ipl2.S \
exception.S \
boot.c \ boot.c \
crc32.c \ crc32.c \
error.c \ error.c \
exception.c \ exception.c \
exception.S \
font.c \ font.c \
init.c \ init.c \
interrupt.c \ interrupt.c \
io.c \ io.c \
ipl2.S \
main.c \ main.c \
sc64.c \ sc64.c \
storage.c \ storage.c \
@ -56,7 +56,7 @@ $(BUILD_DIR)/n64boot.elf: $(OBJS) N64.ld
$(BUILD_DIR)/n64boot.bin: $(BUILD_DIR)/n64boot.elf $(BUILD_DIR)/n64boot.bin: $(BUILD_DIR)/n64boot.elf
@$(OBJCOPY) -O binary $< $@ @$(OBJCOPY) -O binary $< $@
@chksum64 $@ > /dev/null @chksum64 $@ > /dev/null
@truncate --size=90k $@ @truncate --size=64k $@
$(BUILD_DIR)/n64boot.hex: $(BUILD_DIR)/n64boot.bin $(BUILD_DIR)/n64boot.hex: $(BUILD_DIR)/n64boot.bin
@$(OBJCOPY) -I binary -O ihex $< $@ @$(OBJCOPY) -I binary -O ihex $< $@

View File

@ -1,12 +1,12 @@
MEMORY { MEMORY {
rdram (rwx) : org = 0x80300000, len = 1M rdram (rwx) : org = 0x803E0000, len = 128k
flash (r) : org = 0xB0000000, len = 90k flash (r) : org = 0xB0000000, len = 64k
} }
ENTRY(entry_handler) ENTRY(entry_handler)
__exception_stack_size = 8k; __exception_stack_size = 8k;
__stack_size = 64k; __stack_size = 16k;
SECTIONS { SECTIONS {
.flash : { .flash : {

View File

@ -76,6 +76,8 @@ typedef struct {
#define START_X_OFFSET (19) #define START_X_OFFSET (19)
extern const io32_t entry_handler __attribute__((section(".data")));
static const vi_regs_t vi_config[] = {{ static const vi_regs_t vi_config[] = {{
.CR = VI_CR_TYPE_32, .CR = VI_CR_TYPE_32,
.H_WIDTH = SCREEN_WIDTH, .H_WIDTH = SCREEN_WIDTH,
@ -106,12 +108,14 @@ static const vi_regs_t vi_config[] = {{
.V_SCALE = ((0x100 * SCREEN_HEIGHT) / 60), .V_SCALE = ((0x100 * SCREEN_HEIGHT) / 60),
}}; }};
static io32_t *exception_framebuffer = (io32_t *) (0x0026A000UL); static io32_t *exception_framebuffer;
static void exception_init_screen (void) { static void exception_init_screen (void) {
const vi_regs_t *cfg = &vi_config[OS_INFO->tv_type]; const vi_regs_t *cfg = &vi_config[OS_INFO->tv_type];
exception_framebuffer = (io32_t *) (((io32_t) (&entry_handler)) - (SCREEN_WIDTH * SCREEN_HEIGHT * sizeof(io32_t)));
for (int y = 0; y < SCREEN_HEIGHT; y++) { for (int y = 0; y < SCREEN_HEIGHT; y++) {
for (int x = 0; x < SCREEN_WIDTH; x++) { for (int x = 0; x < SCREEN_WIDTH; x++) {
uint32_t color; uint32_t color;
@ -237,8 +241,7 @@ void exception_fatal_handler (uint32_t exception_code, uint32_t interrupt_mask,
exception_print("----- SummerCart64 n64boot -----\n"); exception_print("----- SummerCart64 n64boot -----\n");
exception_print("branch: %s\n", version->git_branch); exception_print("branch: %s\n", version->git_branch);
exception_print("tag: %s\n", version->git_tag); exception_print("tag: %s\n", version->git_tag);
exception_print("sha: %s\n", version->git_sha); exception_print("sha: %s\n\n", version->git_sha);
exception_print("msg: %s\n\n", version->git_message);
exception_print("%s at pc: 0x%08lX\n", exception_get_description(exception_code), e->epc.u32); exception_print("%s at pc: 0x%08lX\n", exception_get_description(exception_code), e->epc.u32);
exception_print("sr: 0x%08lX cr: 0x%08lX hw: 0x%08lX [%4s]\n", e->sr, e->cr, sc64_version, (char *) (&sc64_version)); exception_print("sr: 0x%08lX cr: 0x%08lX hw: 0x%08lX [%4s]\n", e->sr, e->cr, sc64_version, (char *) (&sc64_version));
exception_print("zr: 0x%08lX at: 0x%08lX v0: 0x%08lX v1: 0x%08lX\n", e->zr.u32, e->at.u32, e->v0.u32, e->v1.u32); exception_print("zr: 0x%08lX at: 0x%08lX v0: 0x%08lX v1: 0x%08lX\n", e->zr.u32, e->at.u32, e->v0.u32, e->v1.u32);

View File

@ -4,6 +4,11 @@
#include "fatfs/ff.h" #include "fatfs/ff.h"
#define ROM_ENTRY_OFFSET (8)
#define ROM_CODE_OFFSET (4096)
#define ROM_MAX_LOAD_SIZE (1 * 1024 * 1024)
static const char *fatfs_error_codes[] = { static const char *fatfs_error_codes[] = {
"Succeeded", "Succeeded",
"A hard error occurred in the low level disk I/O layer", "A hard error occurred in the low level disk I/O layer",
@ -28,35 +33,47 @@ static const char *fatfs_error_codes[] = {
}; };
#define FF_CHECK(x, message) { \ #define FF_CHECK(x, message, ...) { \
FRESULT fatfs_result = x; \ fresult = x; \
if (fatfs_result != FR_OK) { \ if (fresult != FR_OK) { \
error_display("%s:\n %s\n", message, fatfs_error_codes[fatfs_result]); \ error_display(message " [%s]:\n %s\n", __VA_ARGS__ __VA_OPT__(,) #x, fatfs_error_codes[fresult]); \
} \ } \
} }
void storage_run_menu (storage_backend_t storage_backend) { void storage_run_menu (storage_backend_t storage_backend) {
void (* menu)(void);
FRESULT fresult;
FATFS fs; FATFS fs;
FIL fil; FIL fil;
UINT br;
FSIZE_t size = ROM_MAX_LOAD_SIZE;
const TCHAR *path = "";
if (storage_backend == STORAGE_BACKEND_SD) { if (storage_backend == STORAGE_BACKEND_SD) {
FF_CHECK(f_mount(&fs, "0:", 1), "Couldn't mount SD drive"); path = "0:";
FF_CHECK(f_chdrive("0:"), "Couldn't chdrive to SD drive");
} else if (storage_backend == STORAGE_BACKEND_USB) { } else if (storage_backend == STORAGE_BACKEND_USB) {
FF_CHECK(f_mount(&fs, "1:", 1), "Couldn't mount USB drive"); path = "1:";
FF_CHECK(f_chdrive("1:"), "Couldn't chdrive to USB drive");
} else { } else {
error_display("Unknown storage backend [%d]\n", storage_backend); error_display("Unknown storage backend [%d]\n", storage_backend);
} }
FF_CHECK(f_open(&fil, "sc64menu.elf", FA_READ), "Couldn't open menu file"); FF_CHECK(f_mount(&fs, path, 1), "Couldn't mount drive");
FF_CHECK(f_chdrive(path), "Couldn't chdrive");
// TODO: Implement ELF loader here FF_CHECK(f_open(&fil, "sc64menu.n64", FA_READ), "Couldn't open menu file");
FF_CHECK(f_lseek(&fil, ROM_ENTRY_OFFSET), "Couldn't seek to entry point offset");
FF_CHECK(f_read(&fil, &menu, sizeof(menu), &br), "Couldn't read entry point");
FF_CHECK(f_lseek(&fil, ROM_CODE_OFFSET), "Couldn't seek to code start offset");
if ((f_size(&fil) - ROM_CODE_OFFSET) < size) {
size = (f_size(&fil) - ROM_CODE_OFFSET);
}
FF_CHECK(f_read(&fil, menu, size, &br), "Couldn't read menu file");
FF_CHECK(br != size, "Read size is different than expected");
FF_CHECK(f_close(&fil), "Couldn't close menu file"); FF_CHECK(f_close(&fil), "Couldn't close menu file");
deinit(); deinit();
// menu(); menu();
while (1);
} }

View File

@ -1,7 +1,7 @@
#include "version.h" #include "version.h"
version_t version = { static version_t version = {
#ifdef GIT_BRANCH #ifdef GIT_BRANCH
.git_branch = GIT_BRANCH, .git_branch = GIT_BRANCH,
#else #else
@ -17,11 +17,6 @@ version_t version = {
#else #else
#warning "No GIT_SHA provided" #warning "No GIT_SHA provided"
#endif #endif
#ifdef GIT_MESSAGE
.git_message = GIT_MESSAGE,
#else
#warning "No GIT_MESSAGE provided"
#endif
}; };

View File

@ -6,7 +6,6 @@ typedef const struct {
const char *git_branch; const char *git_branch;
const char *git_tag; const char *git_tag;
const char *git_sha; const char *git_sha;
const char *git_message;
} version_t; } version_t;

View File

@ -46,7 +46,7 @@ $(BUILD_DIR)/governor.elf: $(OBJS) SC64.ld
@$(OBJDUMP) -D $@ > $(BUILD_DIR)/governor.lst @$(OBJDUMP) -D $@ > $(BUILD_DIR)/governor.lst
$(BUILD_DIR)/governor.bin: $(BUILD_DIR)/governor.elf $(BUILD_DIR)/governor.bin: $(BUILD_DIR)/governor.elf
@$(OBJCOPY) -O binary $< $@ @$(OBJCOPY) -O binary --gap-fill 0xFF --pad-to 0x10016800 $< $@
$(BUILD_DIR)/governor.hex: $(BUILD_DIR)/governor.bin $(BUILD_DIR)/governor.hex: $(BUILD_DIR)/governor.bin
@$(OBJCOPY) -I binary -O ihex $< $@ @$(OBJCOPY) -I binary -O ihex $< $@

View File

@ -1,6 +1,6 @@
MEMORY { MEMORY {
ram (rwx) : org = 0x00000000, len = 16k ram (rwx) : org = 0x00000000, len = 16k
rom (rx) : org = 0x10035800, len = 16k rom (rx) : org = 0x10010000, len = 26k
} }
ENTRY(reset_handler) ENTRY(reset_handler)