summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--examples/rules.mk10
-rw-r--r--hw/bsp/f1c100s/board.mk7
-rw-r--r--hw/mcu/allwinner/f1c100s/f1c100s.ld19
-rw-r--r--tools/mksunxi.py48
4 files changed, 69 insertions, 15 deletions
diff --git a/examples/rules.mk b/examples/rules.mk
index 6314380ec..55e39f4ed 100644
--- a/examples/rules.mk
+++ b/examples/rules.mk
@@ -182,10 +182,12 @@ flash-jlink: $(BUILD)/$(PROJECT).hex
flash-stlink: $(BUILD)/$(PROJECT).elf
STM32_Programmer_CLI --connect port=swd --write $< --go
-flash-xfel: $(BUILD)/$(PROJECT).bin
- xfel ddr
- xfel write 0x80000000 $<
- xfel exec 0x80000000
+$(BUILD)/$(PROJECT)-sunxi.bin: $(BUILD)/$(PROJECT).bin
+ $(PYTHON) $(TOP)/tools/mksunxi.py $< $@
+
+flash-xfel: $(BUILD)/$(PROJECT)-sunxi.bin
+ xfel spinor write 0 $<
+ xfel reset
# Flash using pyocd
PYOCD_OPTION ?=
diff --git a/hw/bsp/f1c100s/board.mk b/hw/bsp/f1c100s/board.mk
index 993aa0d24..9bd9380a7 100644
--- a/hw/bsp/f1c100s/board.mk
+++ b/hw/bsp/f1c100s/board.mk
@@ -41,5 +41,10 @@ INC += \
$(TOP)/$(MCU_DIR)/include \
$(TOP)/$(BOARD_PATH)
-# flash target using on-board stlink
+# flash target using xfel
flash: flash-xfel
+
+exec: $(BUILD)/$(PROJECT).bin
+ xfel ddr
+ xfel write 0x80000000 $<
+ xfel exec 0x80000000 \ No newline at end of file
diff --git a/hw/mcu/allwinner/f1c100s/f1c100s.ld b/hw/mcu/allwinner/f1c100s/f1c100s.ld
index a261618e5..43c353bbd 100644
--- a/hw/mcu/allwinner/f1c100s/f1c100s.ld
+++ b/hw/mcu/allwinner/f1c100s/f1c100s.ld
@@ -21,15 +21,15 @@ SECTIONS
PROVIDE(__bootloader_start = .);
PROVIDE(__image_start = .);
PROVIDE(__text_start = .);
- */machine/start.o (.text)
- */lib/memcpy.o (.text)
- */lib/memset.o (.text)
- */machine/sys-uart.o (.text)
- */machine/sys-clock.o (.text)
- */machine/sys-dram.o (.text)
- */machine/sys-mmu.o (.text)
- */machine/sys-spi-flash.o (.text)
- */machine/sys-copyself.o (.text)
+ _build/*/obj/hw/mcu/allwinner/*/machine/start_asm.o (.text)
+ _build/*/obj/hw/mcu/allwinner/*/lib/memcpy_asm.o (.text)
+ _build/*/obj/hw/mcu/allwinner/*/lib/memset_asm.o (.text)
+ _build/*/obj/hw/mcu/allwinner/*/machine/sys-uart.o (.text*)
+ _build/*/obj/hw/mcu/allwinner/*/machine/sys-clock.o (.text*)
+ _build/*/obj/hw/mcu/allwinner/*/machine/sys-dram.o (.text*)
+ _build/*/obj/hw/mcu/allwinner/*/machine/sys-mmu.o (.text*)
+ _build/*/obj/hw/mcu/allwinner/*/machine/sys-spi-flash.o (.text*)
+ _build/*/obj/hw/mcu/allwinner/*/machine/sys-copyself.o (.text*)
PROVIDE(__bootloader_end = .);
} > ram
@@ -37,7 +37,6 @@ SECTIONS
.text :
{
- */main.o (.text)
*(.text*)
*(.glue*)
*(.note.gnu.build-id)
diff --git a/tools/mksunxi.py b/tools/mksunxi.py
new file mode 100644
index 000000000..04786f429
--- /dev/null
+++ b/tools/mksunxi.py
@@ -0,0 +1,48 @@
+#!/usr/bin/env python3
+import sys
+import struct
+
+def align(num, alignment):
+ if num % alignment != 0:
+ num += (alignment - num % alignment)
+ return num
+
+
+def process_file(input, output):
+ with open(input, 'rb') as fin:
+ content = bytearray(fin.read())
+
+ align_value = 512
+ padded_length = align(len(content), align_value)
+ # pad file to actual length
+ content += b'\x00' * (padded_length - len(content))
+
+ struct_format = '<L8sLL'
+ (instruction, magic, checksum, length) = struct.unpack_from(struct_format, content)
+
+ if magic != b'eGON.BT0':
+ print("Magic is invalid:", magic)
+ return 2
+
+ checksum = 0x5F0A6C39
+ length = align(length, align_value)
+
+ struct.pack_into(struct_format, content, 0, instruction, magic, checksum, length)
+
+ checksum = 0
+ for i in range(0, length, 4):
+ (n, ) = struct.unpack_from('<L', content, i)
+ checksum += n
+ checksum %= 4294967296
+
+ struct.pack_into(struct_format, content, 0, instruction, magic, checksum, length)
+
+ with open(output, 'wb') as fout:
+ fout.write(content)
+ return 0
+
+if __name__ == "__main__":
+ if len(sys.argv) != 3:
+ print("Usage: mksunxi.py input.bin output.bin")
+ exit(1)
+ exit(process_file(sys.argv[1], sys.argv[2])) \ No newline at end of file