Skip to content

Commit 61ccdb8

Browse files
committed
board: add Nuvoton MA35D1 NuMaker IoT board support
Add support for Nuvoton MA35D1 SoC family: - ARM Cortex-A35 dual-core @ 800MHz + Cortex-M4 heterogeneous - NuMaker IoT MA35D16F90 board (512MB DDR) - Vendor kernel 5.10.140 from Nuvoton GitHub - TF-A (BL2/BL31) + OP-TEE (BL32) + U-Boot (BL33) boot chain - SD card boot support Vendor kernel modules (pending): Nuvoton provides closed-source Verisilicon licensed drivers: - dcultrafb.ko (DCUltra display controller) - ma35d1-vc8000.ko (H.264 video codec) - galcore.ko (GPU driver) These modules require exact kernel vermagic match: 5.10.140-vendor-nuvoton-ma35d1 SMP mod_unload aarch64 Nuvoton is preparing custom builds of these modules for Armbian. Signed-off-by: TuAFBogey <[email protected]>
1 parent 7abef3e commit 61ccdb8

File tree

9 files changed

+1473
-0
lines changed

9 files changed

+1473
-0
lines changed
Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
# Nuvoton MA35D16F90 dual-core Cortex-A35 + Cortex-M4, 512MB DDR
2+
BOARD_NAME="NuMaker IoT MA35D16F90"
3+
BOARD_VENDOR="nuvoton"
4+
BOARDFAMILY="nuvoton-ma35d1"
5+
BOARD_MAINTAINER=""
6+
# SD card boot (sdcard1 = SD1 slot on NuMaker IoT board)
7+
BOOTCONFIG="ma35d1_sdcard1_defconfig"
8+
KERNEL_TARGET="vendor"
9+
FULL_DESKTOP="no"
10+
BOOT_LOGO="no"
11+
BOOT_FDT_FILE="nuvoton/ma35d1-iot-512m.dtb"
12+
BOOT_SCENARIO="blobless"
13+
IMAGE_PARTITION_TABLE="msdos"
14+
DEFAULT_CONSOLE="serial"
15+
16+
# Hardware features
17+
HAS_VIDEO_OUTPUT="yes"
18+
19+
function post_family_tweaks__numaker_iot_ma35d16f90() {
20+
display_alert "$BOARD" "Applying NuMaker IoT MA35D16F90 tweaks" "info"
21+
22+
# Serial console 115200 baud
23+
mkdir -p "$SDCARD/etc/systemd/system/[email protected]/"
24+
cat <<- EOF > "$SDCARD/etc/systemd/system/[email protected]/override.conf"
25+
[Service]
26+
ExecStart=
27+
ExecStart=-/sbin/agetty -o '-p -- \\u' 115200 ttyS0 linux
28+
EOF
29+
30+
return 0
31+
}

config/bootenv/nuvoton-ma35d1.txt

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
verbosity=7
2+
bootlogo=false
3+
console=serial
4+
fdtfile=nuvoton/ma35d1-iot-512m.dtb
Lines changed: 153 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,153 @@
1+
# DO NOT EDIT THIS FILE
2+
#
3+
# Please edit /boot/armbianEnv.txt to set supported parameters
4+
#
5+
# Nuvoton MA35D1 boot script for Armbian
6+
7+
setenv overlay_error "false"
8+
# default values
9+
setenv rootdev "LABEL=armbi_root"
10+
setenv verbosity "7"
11+
setenv console "serial"
12+
setenv bootlogo "false"
13+
setenv rootfstype "ext4"
14+
setenv docker_optimizations "on"
15+
setenv earlycon "off"
16+
17+
# MA35D1 memory map - load addresses
18+
# Memory layout (avoiding overlaps):
19+
# 0x80000000 - Kernel (~15MB, ends ~0x80F00000)
20+
# 0x81000000 - Temp load address for env/overlays
21+
# 0x82000000 - Ramdisk (~20MB max, ends ~0x83400000)
22+
# 0x84000000 - DTB (~64KB)
23+
setenv load_addr "0x81000000"
24+
setenv kernel_addr_r "0x80000000"
25+
setenv ramdisk_addr_r "0x82000000"
26+
setenv fdt_addr_r "0x84000000"
27+
28+
# Set default fdtfile if not set by U-Boot
29+
test -n "${fdtfile}" || setenv fdtfile "nuvoton/ma35d1-iot-512m.dtb"
30+
31+
test -n "${distro_bootpart}" || setenv distro_bootpart 1
32+
33+
echo "Boot script loaded from ${devtype} ${devnum}:${distro_bootpart}"
34+
35+
# get PARTUUID of first partition on SD/eMMC the boot script was loaded from
36+
echo "Detecting PARTUUID for ${devtype} device ${devnum}:${distro_bootpart}..."
37+
setenv partuuid
38+
39+
if test "${devtype}" = "mmc"; then
40+
part uuid ${devtype} ${devnum}:${distro_bootpart} partuuid
41+
fi
42+
43+
# Use PARTUUID if available (more reliable), otherwise fall back to rootdev label
44+
if test -n "${partuuid}"; then
45+
setenv rootdev "PARTUUID=${partuuid}"
46+
fi
47+
48+
# Load armbianEnv.txt if it exists
49+
echo "Attempting to load ${prefix}armbianEnv.txt from ${devtype} ${devnum}:${distro_bootpart} to ${load_addr}..."
50+
if load ${devtype} ${devnum}:${distro_bootpart} ${load_addr} ${prefix}armbianEnv.txt; then
51+
echo "Successfully loaded armbianEnv.txt (${filesize} bytes)"
52+
if env import -t ${load_addr} ${filesize}; then
53+
echo "Successfully imported environment from armbianEnv.txt"
54+
else
55+
echo "Warning: Failed to import environment from armbianEnv.txt"
56+
fi
57+
else
58+
echo "armbianEnv.txt not found or failed to load - using default environment"
59+
fi
60+
61+
echo "Final rootdev: ${rootdev}"
62+
63+
# Set console arguments
64+
setenv consoleargs ""
65+
if test "${console}" = "display" || test "${console}" = "both"; then
66+
setenv consoleargs "console=tty1 ${consoleargs}"
67+
fi
68+
if test "${console}" = "serial" || test "${console}" = "both"; then
69+
setenv consoleargs "console=ttyS0,115200n8 ${consoleargs}"
70+
fi
71+
if test "${earlycon}" = "on"; then
72+
setenv consoleargs "earlycon ${consoleargs}"
73+
fi
74+
75+
if test "${bootlogo}" = "true"; then
76+
setenv consoleargs "splash plymouth.ignore-serial-consoles ${consoleargs}"
77+
else
78+
setenv consoleargs "splash=verbose ${consoleargs}"
79+
fi
80+
81+
# MA35D1 specific: limit kernel memory if needed (for OP-TEE reserved memory)
82+
# OP-TEE reserves 0x8f800000-0x90000000 (8MB)
83+
setenv bootargs "root=${rootdev} rootwait rootfstype=${rootfstype} ${consoleargs} consoleblank=0 loglevel=${verbosity} ubootpart=${partuuid} ${extraargs} ${extraboardargs}"
84+
85+
if test "${docker_optimizations}" = "on"; then
86+
setenv bootargs "${bootargs} cgroup_enable=cpuset cgroup_memory=1 cgroup_enable=memory"
87+
fi
88+
89+
echo "Final bootargs: ${bootargs}"
90+
91+
# Load kernel
92+
echo "Loading kernel image to ${kernel_addr_r}..."
93+
if load ${devtype} ${devnum}:${distro_bootpart} ${kernel_addr_r} ${prefix}Image; then
94+
echo "Kernel loaded successfully"
95+
else
96+
echo "ERROR: Failed to load kernel!"
97+
exit
98+
fi
99+
100+
# Load initramfs
101+
echo "Loading initramfs to ${ramdisk_addr_r}..."
102+
if load ${devtype} ${devnum}:${distro_bootpart} ${ramdisk_addr_r} ${prefix}uInitrd; then
103+
setenv ramdisk_arg "${ramdisk_addr_r}:${filesize}"
104+
echo "Initramfs loaded successfully (${filesize} bytes)"
105+
else
106+
echo "Warning: Failed to load initramfs, booting without it"
107+
setenv ramdisk_arg "-"
108+
fi
109+
110+
# Load device tree
111+
echo "Loading device tree ${fdtfile} to ${fdt_addr_r}..."
112+
if load ${devtype} ${devnum}:${distro_bootpart} ${fdt_addr_r} ${prefix}dtb/${fdtfile}; then
113+
echo "DTB loaded successfully"
114+
else
115+
echo "ERROR: Failed to load device tree!"
116+
exit
117+
fi
118+
119+
# Setup FDT for overlays
120+
fdt addr ${fdt_addr_r}
121+
fdt resize 65536
122+
123+
# Apply overlays if specified
124+
for overlay_file in ${overlays}; do
125+
if load ${devtype} ${devnum}:${distro_bootpart} ${load_addr} ${prefix}dtb/nuvoton/overlay/${overlay_file}.dtbo; then
126+
echo "Applying kernel provided DT overlay ${overlay_file}.dtbo"
127+
fdt apply ${load_addr} || setenv overlay_error "true"
128+
fi
129+
done
130+
131+
for overlay_file in ${user_overlays}; do
132+
if load ${devtype} ${devnum}:${distro_bootpart} ${load_addr} ${prefix}overlay-user/${overlay_file}.dtbo; then
133+
echo "Applying user provided DT overlay ${overlay_file}.dtbo"
134+
fdt apply ${load_addr} || setenv overlay_error "true"
135+
fi
136+
done
137+
138+
if test "${overlay_error}" = "true"; then
139+
echo "Error applying DT overlays, restoring original DT"
140+
load ${devtype} ${devnum}:${distro_bootpart} ${fdt_addr_r} ${prefix}dtb/${fdtfile}
141+
fi
142+
143+
# Resize FDT to actual size
144+
fdt resize
145+
146+
echo "Booting kernel..."
147+
echo " kernel: ${kernel_addr_r}"
148+
echo " initrd: ${ramdisk_arg}"
149+
echo " dtb: ${fdt_addr_r}"
150+
booti ${kernel_addr_r} ${ramdisk_arg} ${fdt_addr_r}
151+
152+
# Recompile with:
153+
# mkimage -C none -A arm -T script -d /boot/boot.cmd /boot/boot.scr

0 commit comments

Comments
 (0)