diff --git a/build_sdk.py b/build_sdk.py index d8e3f07a..7f2be1b9 100644 --- a/build_sdk.py +++ b/build_sdk.py @@ -81,6 +81,19 @@ class ConfigInfo: "hello": Path("example/zcu102/hello") } ), + BoardInfo( + name="maaxboard", + gcc_cpu="cortex-a53", + loader_link_address=0x40480000, + kernel_options={ + "KernelPlatform": "maaxboard", + "KernelIsMCS": True, + "KernelArmExportPCNTUser": True, + }, + examples={ + "hello": Path("example/maaxboard/hello") + } + ), # BoardInfo( # name="imx8mm", # gcc_cpu="cortex-a53", diff --git a/docs/manual.md b/docs/manual.md index 6501799a..0391c282 100644 --- a/docs/manual.md +++ b/docs/manual.md @@ -514,6 +514,14 @@ The `id` should be passed to the `microkit_notify` and `microkit_ppcall` functio This chapter describes the board support packages that are available in the SDK. +## MaaXBoard + +The MaaXBoard is a low-cost ARM SBC based on the NXP i.MX8MQ system-on-chip. + +Microkit produces a raw binary file, so when using U-Boot you must execute the image using: + + => go 0x40480000 + ## TQMa8XQP 1GB The TQMa8XQP is a system-on-module designed by TQ-Systems GmbH. diff --git a/example/maaxboard/hello/Makefile b/example/maaxboard/hello/Makefile new file mode 100644 index 00000000..b78ab030 --- /dev/null +++ b/example/maaxboard/hello/Makefile @@ -0,0 +1,55 @@ +# +# Copyright 2021, Breakaway Consulting Pty. Ltd. +# +# SPDX-License-Identifier: BSD-2-Clause +# +ifeq ($(strip $(BUILD_DIR)),) +$(error BUILD_DIR must be specified) +endif + +ifeq ($(strip $(MICROKIT_SDK)),) +$(error MICROKIT_SDK must be specified) +endif + +ifeq ($(strip $(MICROKIT_BOARD)),) +$(error MICROKIT_BOARD must be specified) +endif + +ifeq ($(strip $(MICROKIT_CONFIG)),) +$(error MICROKIT_CONFIG must be specified) +endif + +TOOLCHAIN := aarch64-none-elf + +CPU := cortex-a53 + +CC := $(TOOLCHAIN)-gcc +LD := $(TOOLCHAIN)-ld +AS := $(TOOLCHAIN)-as +MICROKIT_TOOL ?= $(MICROKIT_SDK)/bin/microkit + +HELLO_OBJS := hello.o + +BOARD_DIR := $(MICROKIT_SDK)/board/$(MICROKIT_BOARD)/$(MICROKIT_CONFIG) + +IMAGES := hello.elf +CFLAGS := -mcpu=$(CPU) -mstrict-align -nostdlib -ffreestanding -g3 -O3 -Wall -Wno-unused-function -Werror -I$(BOARD_DIR)/include +LDFLAGS := -L$(BOARD_DIR)/lib +LIBS := -lmicrokit -Tmicrokit.ld + +IMAGE_FILE = $(BUILD_DIR)/loader.img +REPORT_FILE = $(BUILD_DIR)/report.txt + +all: $(IMAGE_FILE) + +$(BUILD_DIR)/%.o: %.c Makefile + $(CC) -c $(CFLAGS) $< -o $@ + +$(BUILD_DIR)/%.o: %.s Makefile + $(AS) -g3 -mcpu=$(CPU) $< -o $@ + +$(BUILD_DIR)/hello.elf: $(addprefix $(BUILD_DIR)/, $(HELLO_OBJS)) + $(LD) $(LDFLAGS) $^ $(LIBS) -o $@ + +$(IMAGE_FILE) $(REPORT_FILE): $(addprefix $(BUILD_DIR)/, $(IMAGES)) hello.system + $(MICROKIT_TOOL) hello.system --search-path $(BUILD_DIR) --board $(MICROKIT_BOARD) --config $(MICROKIT_CONFIG) -o $(IMAGE_FILE) -r $(REPORT_FILE) diff --git a/example/maaxboard/hello/hello.c b/example/maaxboard/hello/hello.c new file mode 100644 index 00000000..9519a6cb --- /dev/null +++ b/example/maaxboard/hello/hello.c @@ -0,0 +1,18 @@ +/* + * Copyright 2021, Breakaway Consulting Pty. Ltd. + * + * SPDX-License-Identifier: BSD-2-Clause + */ +#include +#include + +void +init(void) +{ + microkit_dbg_puts("hello, world\n"); +} + +void +notified(microkit_channel ch) +{ +} \ No newline at end of file diff --git a/example/maaxboard/hello/hello.system b/example/maaxboard/hello/hello.system new file mode 100644 index 00000000..146da4ba --- /dev/null +++ b/example/maaxboard/hello/hello.system @@ -0,0 +1,11 @@ + + + + + + + \ No newline at end of file diff --git a/loader/src/loader.c b/loader/src/loader.c index 09840993..3459edfe 100644 --- a/loader/src/loader.c +++ b/loader/src/loader.c @@ -143,6 +143,25 @@ putc(uint8_t ch) { *((volatile uint32_t *)(0x00FF000030)) = ch; } +#elif defined(BOARD_maaxboard) +#define UART_BASE 0x30860000 +#define STAT 0x98 +#define TRANSMIT 0x40 +#define STAT_TDRE (1 << 14) + +static void +putc(uint8_t ch) +{ + if (ch == '\n') { + // ensure FIFO has space + while (!(*UART_REG(STAT) & STAT_TDRE)) { } + *UART_REG(TRANSMIT) = '\r'; + } + + // ensure FIFO has space + while (!(*UART_REG(STAT) & STAT_TDRE)) { } + *UART_REG(TRANSMIT) = ch; +} #else #error Board not defined #endif