chore: ld
This commit is contained in:
2
.gitignore
vendored
Normal file
2
.gitignore
vendored
Normal file
@@ -0,0 +1,2 @@
|
||||
build/
|
||||
.vscode/
|
||||
3
.gitmodules
vendored
Normal file
3
.gitmodules
vendored
Normal file
@@ -0,0 +1,3 @@
|
||||
[submodule "rtl8710_openocd"]
|
||||
path = rtl8710_openocd
|
||||
url = git@git.hye.su:mira/rtl8710_openocd.git
|
||||
134
Makefile
Normal file
134
Makefile
Normal file
@@ -0,0 +1,134 @@
|
||||
# Toolchain
|
||||
PREFIX = arm-none-eabi-
|
||||
CC = $(PREFIX)gcc
|
||||
AS = $(PREFIX)as
|
||||
LD = $(PREFIX)ld
|
||||
OBJCOPY = $(PREFIX)objcopy
|
||||
SIZE = $(PREFIX)size
|
||||
|
||||
# Project configuration
|
||||
PROJECT = firmware
|
||||
MCU = cortex-m4
|
||||
FLASH_START = 0x00000000
|
||||
LOAD_ADDRESS = 0x10002000
|
||||
LD_FILE=linker.ld
|
||||
|
||||
RAM_START := 0x10002000
|
||||
|
||||
# Compiler flags
|
||||
CFLAGS = -mcpu=$(MCU) -mthumb \
|
||||
-Wall -Wextra -g3 \
|
||||
-Os -ffunction-sections -fdata-sections \
|
||||
-nostartfiles -Wl,-T,$(LD_FILE) -u main -Wl,--gc-sections \
|
||||
-DLOAD_ADDRESS=$(LOAD_ADDRESS)
|
||||
|
||||
ASFLAGS = \
|
||||
-mcpu=$(MCU) -mthumb \
|
||||
-g
|
||||
|
||||
LDFLAGS = \
|
||||
-T linker.ld -Map=$(BUILD_DIR)/$(PROJECT).map \
|
||||
--gc-sections --no-warn-rwx-segments \
|
||||
--defsym=_RAM_START_ADDR=$(RAM_START)
|
||||
|
||||
# Directories
|
||||
SRC_DIR = src
|
||||
BUILD_DIR = build
|
||||
INCLUDE_DIR = include
|
||||
|
||||
# Source files
|
||||
SRCS = $(wildcard $(SRC_DIR)/*.c)
|
||||
ASM_SRCS = $(wildcard $(SRC_DIR)/*.s)
|
||||
OBJS = $(SRCS:$(SRC_DIR)/%.c=$(BUILD_DIR)/%.o)
|
||||
ASM_OBJS = $(ASM_SRCS:$(SRC_DIR)/%.s=$(BUILD_DIR)/%.o)
|
||||
|
||||
# Include paths
|
||||
INCLUDES = -I$(INCLUDE_DIR)
|
||||
|
||||
# Output files
|
||||
ELF = $(BUILD_DIR)/$(PROJECT).elf
|
||||
BIN = $(BUILD_DIR)/$(PROJECT).bin
|
||||
HEX = $(BUILD_DIR)/$(PROJECT).hex
|
||||
|
||||
# flashing
|
||||
INTERFACE = stlink
|
||||
OPENOCD_BASE=openocd -f interface/$(INTERFACE).cfg -f rtl8710_openocd/script/rtl8710.ocd -c "init" -c "reset" -c "halt"
|
||||
FLASH_BIN = $(BUILD_DIR)/$(PROJECT).bin
|
||||
|
||||
.PHONY: all clean flash size
|
||||
|
||||
# Default target
|
||||
all: $(BUILD_DIR) $(ELF) $(BIN) $(HEX) size
|
||||
|
||||
# Create build directory
|
||||
$(BUILD_DIR):
|
||||
mkdir -p $(BUILD_DIR)
|
||||
|
||||
# Compile C files
|
||||
$(BUILD_DIR)/%.o: $(SRC_DIR)/%.c
|
||||
@echo "CC $<"
|
||||
@$(CC) $(CFLAGS) $(INCLUDES) -c $< -o $@
|
||||
|
||||
# Compile assembly files
|
||||
$(BUILD_DIR)/%.o: $(SRC_DIR)/%.s
|
||||
@echo "AS $<"
|
||||
@$(AS) $(ASFLAGS) -c $< -o $@
|
||||
|
||||
# Link
|
||||
$(ELF): $(OBJS) $(ASM_OBJS)
|
||||
@echo "LD $@"
|
||||
@$(LD) $(LDFLAGS) -o $@ $^
|
||||
|
||||
# Generate binary
|
||||
$(BIN): $(ELF)
|
||||
@echo "OBJCOPY $@"
|
||||
@$(OBJCOPY) -O binary $< $@
|
||||
|
||||
# Generate Intel HEX file
|
||||
$(HEX): $(ELF)
|
||||
@echo "OBJCOPY $@"
|
||||
@$(OBJCOPY) -O ihex $< $@
|
||||
|
||||
# Print size information
|
||||
size: $(ELF)
|
||||
@echo
|
||||
@$(SIZE) $<
|
||||
|
||||
# flash commands
|
||||
test:
|
||||
$(OPENOCD_BASE) -c "rtl8710_flash_read_id" -c "shutdown"
|
||||
|
||||
mac:
|
||||
$(OPENOCD_BASE) -c "rtl8710_flash_read_mac" -c "shutdown"
|
||||
|
||||
dump:
|
||||
$(OPENOCD_BASE) -c "rtl8710_flash_read_id" -c "rtl8710_flash_read dump.bin 0 1048576" -c "shutdown"
|
||||
|
||||
dump0:
|
||||
$(OPENOCD_BASE) -c "rtl8710_flash_read_id" -c "rtl8710_flash_read dump0.bin 0 4096" -c "shutdown"
|
||||
|
||||
flash:
|
||||
@$(OPENOCD_BASE) -c 'rtl8710_flash_auto_erase 1' \
|
||||
-c 'rtl8710_flash_auto_verify 1' \
|
||||
-c 'rtl8710_flash_write $(FLASH_BIN) 0' \
|
||||
-c 'rtl8710_reboot' -c 'reset run' -c shutdown
|
||||
|
||||
full_erase:
|
||||
$(OPENOCD_BASE) -c "rtl8710_flash_mass_erase" -c shutdown
|
||||
|
||||
restore:
|
||||
$(OPENOCD_BASE) -c "rtl8710_flash_auto_erase 1" -c "rtl8710_flash_auto_verify 1" -c "rtl8710_flash_write dump.bin 0" -c shutdown
|
||||
|
||||
restore_nae:
|
||||
$(OPENOCD_BASE) -c "rtl8710_flash_auto_erase 0" -c "rtl8710_flash_auto_verify 1" -c "rtl8710_flash_write dump.bin 0" -c shutdown
|
||||
|
||||
verify:
|
||||
$(OPENOCD_BASE) -c "rtl8710_flash_verify dump.bin 0" -c shutdown
|
||||
|
||||
reset:
|
||||
$(OPENOCD_BASE) -c "rtl8710_reboot" -c shutdown
|
||||
|
||||
# Clean build files
|
||||
clean:
|
||||
rm -rf $(BUILD_DIR)
|
||||
|
||||
3
docs/README.md
Normal file
3
docs/README.md
Normal file
@@ -0,0 +1,3 @@
|
||||
# rtl8710bx
|
||||
|
||||
### 1. [ROM boot sequence](./rom-boot-seq.md)
|
||||
|
Before Width: | Height: | Size: 60 KiB After Width: | Height: | Size: 60 KiB |
39
linker.ld
Normal file
39
linker.ld
Normal file
@@ -0,0 +1,39 @@
|
||||
/* from https://github.com/ambiot/amb1_sdk/blob/master/project/realtek_amebaz_va0_example/GCC-RELEASE/export-rom_symbol_v01.txt */
|
||||
INCLUDE "./rtl8710_openocd/export-rom_symbol_v01.txt"
|
||||
|
||||
MEMORY
|
||||
{
|
||||
RAM (rwx) : ORIGIN = (_RAM_START_ADDR - 64), LENGTH = (256K + 64) /* + header */
|
||||
}
|
||||
|
||||
SECTIONS
|
||||
{
|
||||
_stack_top = ORIGIN(RAM) + LENGTH(RAM) - (4 * 1024) - 4;
|
||||
|
||||
.rom_header : {
|
||||
LONG(0x96969999) LONG(0xFC66CC3F)
|
||||
LONG(0)
|
||||
. += 28;
|
||||
LONG(_image_size)
|
||||
LONG(_RAM_START_ADDR)
|
||||
. += 16;
|
||||
}
|
||||
_rom_header_size = SIZEOF(.rom_header);
|
||||
|
||||
.text : {
|
||||
. = ALIGN(4);
|
||||
. += 20;
|
||||
LONG(_init + 1)
|
||||
LONG(0x88167923) /* ROM checks this @ 0x10002018 */
|
||||
. = ALIGN(8);
|
||||
*(.vectors)
|
||||
*(.text* .rodata* .data*)
|
||||
}
|
||||
|
||||
.bss : {
|
||||
. = ALIGN(4);
|
||||
*(.bss* COMMON)
|
||||
} > RAM
|
||||
|
||||
_image_size = SIZEOF(.text);
|
||||
}
|
||||
1
rtl8710_openocd
Submodule
1
rtl8710_openocd
Submodule
Submodule rtl8710_openocd added at fd448caab4
60
src/boot.s
Normal file
60
src/boot.s
Normal file
@@ -0,0 +1,60 @@
|
||||
.syntax unified
|
||||
.cpu cortex-m4
|
||||
|
||||
.section .text
|
||||
.global _init
|
||||
_init:
|
||||
ldr r0, =0x1003E000
|
||||
mov sp, r0
|
||||
|
||||
ldr r0, =_vector_table
|
||||
ldr r1, =0xE000ED08
|
||||
str r0, [r1]
|
||||
|
||||
push.w {r2-r9,r11,lr}
|
||||
bl main
|
||||
pop.w {r2-r9,r11,lr}
|
||||
1: b 1b
|
||||
|
||||
.section .vectors
|
||||
_vector_table:
|
||||
.word _stack_top
|
||||
.word _init
|
||||
.word NMI_Handler
|
||||
.word HardFault_Handler
|
||||
.word MemManage_Handler
|
||||
.word BusFault_Handler
|
||||
.word UsageFault_Handler
|
||||
.word 0 /* Reserved */
|
||||
.word 0 /* Reserved */
|
||||
.word 0 /* Reserved */
|
||||
.word 0 /* Reserved */
|
||||
.word SVC_Handler
|
||||
.word DebugMon_Handler
|
||||
.word 0 /* Reserved */
|
||||
.word PendSV_Handler
|
||||
.word SysTick_Handler
|
||||
|
||||
/* default */
|
||||
.weak NMI_Handler
|
||||
.weak HardFault_Handler
|
||||
.weak MemManage_Handler
|
||||
.weak BusFault_Handler
|
||||
.weak UsageFault_Handler
|
||||
.weak SVC_Handler
|
||||
.weak DebugMon_Handler
|
||||
.weak PendSV_Handler
|
||||
.weak SysTick_Handler
|
||||
|
||||
.thumb_set NMI_Handler, Default_Handler
|
||||
.thumb_set HardFault_Handler, Default_Handler
|
||||
.thumb_set MemManage_Handler, Default_Handler
|
||||
.thumb_set BusFault_Handler, Default_Handler
|
||||
.thumb_set UsageFault_Handler, Default_Handler
|
||||
.thumb_set SVC_Handler, Default_Handler
|
||||
.thumb_set DebugMon_Handler, Default_Handler
|
||||
.thumb_set PendSV_Handler, Default_Handler
|
||||
.thumb_set SysTick_Handler, Default_Handler
|
||||
|
||||
Default_Handler:
|
||||
b Default_Handler
|
||||
31
src/main.c
Normal file
31
src/main.c
Normal file
@@ -0,0 +1,31 @@
|
||||
#include <stdint.h>
|
||||
|
||||
extern uint32_t DiagPrintf(const char *fmt, ...)
|
||||
__attribute__((format(printf, 1, 2)));
|
||||
#define printf DiagPrintf
|
||||
|
||||
// GPIO direction register @ 0x1004 (from GPIO_Direction: 12 * port + 0x40000000
|
||||
// + 0x1000 + 4) For interrupt control: 0x1030: Interrupt enable register
|
||||
// 0x1038: Interrupt trigger type
|
||||
// 0x103C: Interrupt polarity
|
||||
// 0x1048: Interrupt debounce
|
||||
|
||||
#define PERIPH_BASE 0x40000000
|
||||
// 12 * port_number(0) + PERIPH_BASE + 0x1000
|
||||
#define PORT_A_BASE (PERIPH_BASE + 0x1000)
|
||||
|
||||
#define GPIOA_DIR (*(volatile uint32_t *)(PORT_A_BASE + 0x4))
|
||||
#define GPIOA (*(volatile uint32_t *)(PORT_A_BASE + 0x0))
|
||||
|
||||
int main(void) {
|
||||
printf("hello from main\n");
|
||||
// while (1) {
|
||||
// __asm("nop");
|
||||
// }
|
||||
|
||||
GPIOA_DIR |= (1 << 0);
|
||||
while (1) {
|
||||
GPIOA ^= (1 << 0);
|
||||
for (volatile int i = 0; i < 100000; i++);
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user