mirror of
https://github.com/Polprzewodnikowy/SummerCart64.git
synced 2024-11-25 15:16:53 +01:00
[SC64][SW] Bootloader fixes
This commit is contained in:
parent
40a4b3e222
commit
65baa521b4
12
build.sh
12
build.sh
@ -30,12 +30,12 @@ build_bootloader () {
|
|||||||
if [ "$FORCE_CLEAN" = true ]; then
|
if [ "$FORCE_CLEAN" = true ]; then
|
||||||
make clean
|
make clean
|
||||||
fi
|
fi
|
||||||
FLAGS="$USER_FLAGS"
|
VERSION=""
|
||||||
if [ ! -z "${GIT_BRANCH+x}" ]; then FLAGS+=" -DGIT_BRANCH='\"$GIT_BRANCH\"'"; fi
|
if [ ! -z "${GIT_BRANCH+x}" ]; then VERSION+=" -DGIT_BRANCH='\"$GIT_BRANCH\"'"; fi
|
||||||
if [ ! -z "${GIT_TAG+x}" ]; then FLAGS+=" -DGIT_TAG='\"$GIT_TAG\"'"; fi
|
if [ ! -z "${GIT_TAG+x}" ]; then VERSION+=" -DGIT_TAG='\"$GIT_TAG\"'"; fi
|
||||||
if [ ! -z "${GIT_SHA+x}" ]; then FLAGS+=" -DGIT_SHA='\"$GIT_SHA\"'"; fi
|
if [ ! -z "${GIT_SHA+x}" ]; then VERSION+=" -DGIT_SHA='\"$GIT_SHA\"'"; fi
|
||||||
if [ ! -z "${GIT_MESSAGE+x}" ]; then FLAGS+=" -DGIT_MESSAGE='\"$GIT_MESSAGE\"'"; fi
|
if [ ! -z "${GIT_MESSAGE+x}" ]; then VERSION+=" -DGIT_MESSAGE='\"$GIT_MESSAGE\"'"; fi
|
||||||
make all -j USER_FLAGS="$FLAGS"
|
make all -j VERSION="$VERSION" USER_FLAGS="$USER_FLAGS"
|
||||||
popd > /dev/null
|
popd > /dev/null
|
||||||
|
|
||||||
BUILT_BOOTLOADER=true
|
BUILT_BOOTLOADER=true
|
||||||
|
@ -10,6 +10,7 @@ FLAGS = -march=vr4300 -mtune=vr4300 $(USER_FLAGS)
|
|||||||
CFLAGS = -Os -Wall -ffunction-sections -fdata-sections -ffreestanding -MMD -MP
|
CFLAGS = -Os -Wall -ffunction-sections -fdata-sections -ffreestanding -MMD -MP
|
||||||
ASFLAGS = -Wa,-I$(N64_INST)/mips64-elf/lib
|
ASFLAGS = -Wa,-I$(N64_INST)/mips64-elf/lib
|
||||||
LDFLAGS = -lc -nostartfiles -Wl,--gc-sections
|
LDFLAGS = -lc -nostartfiles -Wl,--gc-sections
|
||||||
|
VERSION ?=
|
||||||
|
|
||||||
SRC_DIR = src
|
SRC_DIR = src
|
||||||
ASSET_DIR = assets
|
ASSET_DIR = assets
|
||||||
@ -57,6 +58,9 @@ $(BUILD_DIR)/%.S.o: %.S
|
|||||||
$(BUILD_DIR)/%.c.o: %.c
|
$(BUILD_DIR)/%.c.o: %.c
|
||||||
$(CC) $(FLAGS) $(CFLAGS) -c $< -o $@
|
$(CC) $(FLAGS) $(CFLAGS) -c $< -o $@
|
||||||
|
|
||||||
|
$(BUILD_DIR)/version.c.o: version.c .FORCE
|
||||||
|
$(CC) $(FLAGS) $(CFLAGS) $(VERSION) -c $< -o $@
|
||||||
|
|
||||||
$(BUILD_DIR)/%.asset: $(ASSET_DIR)/%.png tools/asset_converter.py
|
$(BUILD_DIR)/%.asset: $(ASSET_DIR)/%.png tools/asset_converter.py
|
||||||
$(PYTHON) tools/asset_converter.py $< $@ --compress
|
$(PYTHON) tools/asset_converter.py $< $@ --compress
|
||||||
|
|
||||||
@ -67,13 +71,9 @@ $(BUILD_DIR)/bootloader.elf: $(OBJS) N64.ld
|
|||||||
$(CXX) $(FLAGS) $(LDFLAGS) -TN64.ld $(OBJS) -o $@
|
$(CXX) $(FLAGS) $(LDFLAGS) -TN64.ld $(OBJS) -o $@
|
||||||
@$(OBJDUMP) -S $@ > $(BUILD_DIR)/bootloader.lst
|
@$(OBJDUMP) -S $@ > $(BUILD_DIR)/bootloader.lst
|
||||||
|
|
||||||
$(BUILD_DIR)/bootloader.bin: $(BUILD_DIR)/bootloader.elf tools/strip.py
|
$(BUILD_DIR)/bootloader.bin: $(BUILD_DIR)/bootloader.elf tools/finalize.py
|
||||||
@$(OBJCOPY) -O binary $< $@
|
@$(OBJCOPY) -O binary $< $@
|
||||||
@chksum64 $@ > /dev/null
|
@$(PYTHON) tools/finalize.py $@ > /dev/null
|
||||||
@$(PYTHON) tools/strip.py $@ 1024
|
|
||||||
|
|
||||||
$(BUILD_DIR)/bootloader.hex: $(BUILD_DIR)/bootloader.bin
|
|
||||||
@$(OBJCOPY) -I binary -O ihex $< $@
|
|
||||||
|
|
||||||
print_size: $(BUILD_DIR)/bootloader.elf
|
print_size: $(BUILD_DIR)/bootloader.elf
|
||||||
@echo 'Size of modules:'
|
@echo 'Size of modules:'
|
||||||
@ -81,13 +81,11 @@ print_size: $(BUILD_DIR)/bootloader.elf
|
|||||||
@echo 'Size of bootloader:'
|
@echo 'Size of bootloader:'
|
||||||
@$(SIZE) -B -d $<
|
@$(SIZE) -B -d $<
|
||||||
|
|
||||||
all: $(BUILD_DIR)/bootloader.hex print_size
|
all: $(BUILD_DIR)/bootloader.bin print_size
|
||||||
|
|
||||||
clean:
|
clean:
|
||||||
@rm -rf ./$(BUILD_DIR)/*
|
@rm -rf ./$(BUILD_DIR)/*
|
||||||
|
|
||||||
$(BUILD_DIR)/version.c.o: .FORCE
|
|
||||||
|
|
||||||
.FORCE:
|
.FORCE:
|
||||||
|
|
||||||
.PHONY: .FORCE all clean print_size
|
.PHONY: .FORCE all clean print_size
|
||||||
|
@ -45,12 +45,6 @@ SECTIONS {
|
|||||||
_ebss = .;
|
_ebss = .;
|
||||||
} > ram
|
} > ram
|
||||||
|
|
||||||
.fill : {
|
|
||||||
FILL(0xFF);
|
|
||||||
BYTE(0xFF);
|
|
||||||
. = ORIGIN(rom) + LENGTH(rom);
|
|
||||||
} > rom
|
|
||||||
|
|
||||||
_sheap = .;
|
_sheap = .;
|
||||||
. = ORIGIN(ram) + LENGTH(ram) - __exception_stack_size - __stack_size;
|
. = ORIGIN(ram) + LENGTH(ram) - __exception_stack_size - __stack_size;
|
||||||
_eheap = .;
|
_eheap = .;
|
||||||
|
@ -1,4 +1,5 @@
|
|||||||
.section .assets.@sym@
|
.section .assets.@sym@, "a", %progbits
|
||||||
|
.type assets_@sym@, %object
|
||||||
.global assets_@sym@
|
.global assets_@sym@
|
||||||
assets_@sym@:
|
assets_@sym@:
|
||||||
.incbin "@file@"
|
.incbin "@file@"
|
||||||
|
@ -14,7 +14,7 @@
|
|||||||
#define LINE_SPACING (2)
|
#define LINE_SPACING (2)
|
||||||
|
|
||||||
|
|
||||||
static io32_t display_framebuffer[SCREEN_WIDTH * SCREEN_HEIGHT] __attribute__((section(".framebuffer")));
|
static io32_t display_framebuffer[SCREEN_WIDTH * SCREEN_HEIGHT] __attribute__((section(".framebuffer, \"aw\", %nobits#")));
|
||||||
static int char_x;
|
static int char_x;
|
||||||
static int char_y;
|
static int char_y;
|
||||||
static const vi_regs_t vi_config[] = {{
|
static const vi_regs_t vi_config[] = {{
|
||||||
|
@ -7,6 +7,7 @@
|
|||||||
#define VECTOR_SIZE (0x80)
|
#define VECTOR_SIZE (0x80)
|
||||||
#define VECTOR_NUM (4)
|
#define VECTOR_NUM (4)
|
||||||
|
|
||||||
|
#define ZR_OFFSET (0)
|
||||||
#define AT_OFFSET (8)
|
#define AT_OFFSET (8)
|
||||||
#define V0_OFFSET (16)
|
#define V0_OFFSET (16)
|
||||||
#define V1_OFFSET (24)
|
#define V1_OFFSET (24)
|
||||||
@ -49,6 +50,7 @@
|
|||||||
exception_handler:
|
exception_handler:
|
||||||
.set noat
|
.set noat
|
||||||
la $k0, (_esp - SAVE_REGISTERS_SIZE)
|
la $k0, (_esp - SAVE_REGISTERS_SIZE)
|
||||||
|
sd $zero, ZR_OFFSET($k0)
|
||||||
sd $at, AT_OFFSET($k0)
|
sd $at, AT_OFFSET($k0)
|
||||||
sd $v0, V0_OFFSET($k0)
|
sd $v0, V0_OFFSET($k0)
|
||||||
sd $v1, V1_OFFSET($k0)
|
sd $v1, V1_OFFSET($k0)
|
||||||
|
@ -2,7 +2,8 @@
|
|||||||
.set noreorder
|
.set noreorder
|
||||||
|
|
||||||
|
|
||||||
.section .data.ipl2
|
.section .text.ipl2, "ax", %progbits
|
||||||
|
.type ipl2, %object
|
||||||
ipl2:
|
ipl2:
|
||||||
.global ipl2
|
.global ipl2
|
||||||
lui $t5, 0xBFC0
|
lui $t5, 0xBFC0
|
||||||
|
@ -6,21 +6,25 @@ static version_t version = {
|
|||||||
.git_branch = GIT_BRANCH,
|
.git_branch = GIT_BRANCH,
|
||||||
#else
|
#else
|
||||||
#warning "No GIT_BRANCH provided"
|
#warning "No GIT_BRANCH provided"
|
||||||
|
.git_branch = "GIT_BRANCH",
|
||||||
#endif
|
#endif
|
||||||
#ifdef GIT_TAG
|
#ifdef GIT_TAG
|
||||||
.git_tag = GIT_TAG,
|
.git_tag = GIT_TAG,
|
||||||
#else
|
#else
|
||||||
#warning "No GIT_TAG provided"
|
#warning "No GIT_TAG provided"
|
||||||
|
.git_tag = "GIT_TAG",
|
||||||
#endif
|
#endif
|
||||||
#ifdef GIT_SHA
|
#ifdef GIT_SHA
|
||||||
.git_sha = GIT_SHA,
|
.git_sha = GIT_SHA,
|
||||||
#else
|
#else
|
||||||
#warning "No GIT_SHA provided"
|
#warning "No GIT_SHA provided"
|
||||||
|
.git_sha = "GIT_SHA",
|
||||||
#endif
|
#endif
|
||||||
#ifdef GIT_MESSAGE
|
#ifdef GIT_MESSAGE
|
||||||
.git_message = GIT_MESSAGE,
|
.git_message = GIT_MESSAGE,
|
||||||
#else
|
#else
|
||||||
#warning "No GIT_MESSAGE provided"
|
#warning "No GIT_MESSAGE provided"
|
||||||
|
.git_message = "GIT_MESSAGE",
|
||||||
#endif
|
#endif
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -33,9 +33,9 @@ def compress(data: bytes, step_size: int=4) -> bytes:
|
|||||||
return compressed_data
|
return compressed_data
|
||||||
|
|
||||||
|
|
||||||
if __name__ == "__main__":
|
if __name__ == '__main__':
|
||||||
if (len(sys.argv) < 3):
|
if (len(sys.argv) < 3):
|
||||||
print(f"Usage: python {sys.argv[0]} input_path output_path [--compress]")
|
print(f'Usage: python {sys.argv[0]} input_path output_path [--compress]')
|
||||||
sys.exit(1)
|
sys.exit(1)
|
||||||
|
|
||||||
asset_input = sys.argv[1]
|
asset_input = sys.argv[1]
|
||||||
@ -47,17 +47,22 @@ if __name__ == "__main__":
|
|||||||
|
|
||||||
try:
|
try:
|
||||||
source_asset = Image.open(asset_input)
|
source_asset = Image.open(asset_input)
|
||||||
converted_asset = source_asset.convert("RGBA").tobytes()
|
converted_asset = source_asset.convert('RGBA').tobytes()
|
||||||
|
|
||||||
if (asset_compress):
|
if (asset_compress):
|
||||||
converted_asset = compress(converted_asset)
|
converted_asset = compress(converted_asset)
|
||||||
final_asset = open(asset_output, "wb")
|
|
||||||
|
final_asset = open(asset_output, 'wb')
|
||||||
final_asset.write(converted_asset)
|
final_asset.write(converted_asset)
|
||||||
|
|
||||||
except FileNotFoundError:
|
except FileNotFoundError:
|
||||||
print(f"Couldn't open file \"{asset_input}\"")
|
print(f'Couldn\'t open file "{asset_input}"')
|
||||||
sys.exit(2)
|
sys.exit(2)
|
||||||
|
|
||||||
except Exception as e:
|
except Exception as e:
|
||||||
print(e)
|
print(e)
|
||||||
sys.exit(3)
|
sys.exit(3)
|
||||||
|
|
||||||
finally:
|
finally:
|
||||||
if (source_asset):
|
if (source_asset):
|
||||||
source_asset.close()
|
source_asset.close()
|
||||||
|
50
sw/bootloader/tools/finalize.py
Normal file
50
sw/bootloader/tools/finalize.py
Normal file
@ -0,0 +1,50 @@
|
|||||||
|
#!/usr/bin/env python3
|
||||||
|
|
||||||
|
import subprocess
|
||||||
|
import sys
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
if __name__ == '__main__':
|
||||||
|
if (len(sys.argv) != 2):
|
||||||
|
print(f'Usage: python {sys.argv[0]} file_path')
|
||||||
|
sys.exit(1)
|
||||||
|
|
||||||
|
ALIGN = 1024
|
||||||
|
CHECKSUM_SIZE = 0x101000
|
||||||
|
|
||||||
|
bin_file = sys.argv[1]
|
||||||
|
|
||||||
|
try:
|
||||||
|
bin_data = b''
|
||||||
|
|
||||||
|
with open(bin_file, 'rb') as f:
|
||||||
|
bin_data = f.read()
|
||||||
|
|
||||||
|
pad_size = CHECKSUM_SIZE - len(bin_data)
|
||||||
|
|
||||||
|
if (pad_size > 0):
|
||||||
|
bin_data += b'\xFF' * pad_size
|
||||||
|
with open(bin_file, 'wb') as f:
|
||||||
|
f.write(bin_data)
|
||||||
|
|
||||||
|
subprocess.run(['chksum64', bin_file])
|
||||||
|
|
||||||
|
with open(bin_file, 'rb') as f:
|
||||||
|
bin_data = f.read()
|
||||||
|
|
||||||
|
bin_data = bin_data.strip(b'\xFF')
|
||||||
|
modulo = len(bin_data) % ALIGN
|
||||||
|
if (modulo > 0):
|
||||||
|
bin_data += b'\xFF' * (ALIGN - modulo)
|
||||||
|
|
||||||
|
with open(bin_file, 'wb') as f:
|
||||||
|
f.write(bin_data)
|
||||||
|
|
||||||
|
except FileNotFoundError as e:
|
||||||
|
print(f'Couldn\'t open file "{bin_file}" {e}')
|
||||||
|
sys.exit(2)
|
||||||
|
|
||||||
|
except Exception as e:
|
||||||
|
print(e)
|
||||||
|
sys.exit(3)
|
@ -1,28 +0,0 @@
|
|||||||
#!/usr/bin/env python3
|
|
||||||
|
|
||||||
import sys
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
if __name__ == "__main__":
|
|
||||||
if (len(sys.argv) != 3):
|
|
||||||
print(f"Usage: python {sys.argv[0]} file_path align")
|
|
||||||
sys.exit(1)
|
|
||||||
|
|
||||||
file = sys.argv[1]
|
|
||||||
align = int(sys.argv[2], base=0)
|
|
||||||
|
|
||||||
try:
|
|
||||||
data = b''
|
|
||||||
with open(file, 'rb') as f:
|
|
||||||
data = f.read().strip(b'\xFF')
|
|
||||||
with open(file, 'wb') as f:
|
|
||||||
modulo = (len(data) % align) if (align > 0) else 0
|
|
||||||
data += b'\xFF' * ((align - modulo) if (modulo != 0) else 0)
|
|
||||||
f.write(data)
|
|
||||||
except FileNotFoundError:
|
|
||||||
print(f"Couldn't open file \"{file}\"")
|
|
||||||
sys.exit(2)
|
|
||||||
except Exception as e:
|
|
||||||
print(e)
|
|
||||||
sys.exit(3)
|
|
Loading…
Reference in New Issue
Block a user