Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
26 commits
Select commit Hold shift + click to select a range
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
8 changes: 8 additions & 0 deletions .github/workflows/build-rpi-baremetal.yml
Original file line number Diff line number Diff line change
Expand Up @@ -29,3 +29,11 @@ jobs:
- name: Build ${{ matrix.example }}
working-directory: ${{ matrix.example }}
run: make

- name: Upload build files artifacts
uses: actions/upload-artifact@v4
with:
name: ${{ matrix.example }}-binary
path: |
${{ matrix.example }}/kernel8*
retention-days: 30
2 changes: 1 addition & 1 deletion .swift-version
Original file line number Diff line number Diff line change
@@ -1 +1 @@
main-snapshot-2025-04-12
main-snapshot-2025-11-26
19 changes: 19 additions & 0 deletions Tools/Toolsets/rpi-5-elf.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
{
"schemaVersion": "1.0",
"swiftCompiler": {
"extraCLIOptions": [
"-Xfrontend", "-disable-stack-protector",
"-Xfrontend", "-function-sections",
"-enable-experimental-feature", "Embedded",
"-Xfrontend", "-mergeable-symbols",
"-Xclang-linker", "-fuse-ld=lld",
"-Xclang-linker", "-nostdlib"
]
},
"linker": {
"extraCLIOptions": [
"-T", "Sources/Support/linkerscript.ld",
"--unresolved-symbols=ignore-in-object-files"
]
}
}
61 changes: 40 additions & 21 deletions rpi-4b-blink/Makefile
Original file line number Diff line number Diff line change
@@ -1,28 +1,47 @@
SWIFT_EXEC ?= $(shell if [ "$(shell uname)" = "Darwin" ]; then xcrun -f swift; else which swift; fi)
CLANG ?= $(shell if [ "$(shell uname)" = "Darwin" ]; then xcrun -f clang; else which clang; fi)
LLVM_OBJCOPY ?= $(shell if [ "$(shell uname)" = "Darwin" ]; then xcrun -f llvm-objcopy; else which llvm-objcopy; fi)
##===----------------------------------------------------------------------===##
##
## This source file is part of the Swift open source project
##
## Copyright (c) 2025 Apple Inc. and the Swift project authors.
## Licensed under Apache License v2.0 with Runtime Library Exception
##
## See https://swift.org/LICENSE.txt for license information
##
##===----------------------------------------------------------------------===##

BUILDROOT := $(shell $(SWIFT_EXEC) build --triple aarch64-none-none-elf -Xswiftc -Xfrontend -Xswiftc -disable-stack-protector --show-bin-path)
# Paths
REPOROOT := $(shell git rev-parse --show-toplevel)
TOOLSROOT := $(REPOROOT)/Tools
TOOLSET := $(TOOLSROOT)/Toolsets/rpi-5-elf.json
LLVM_OBJCOPY := llvm-objcopy
SWIFT_BUILD := swift build

.PHONY: all clean
# Flags
ARCH := aarch64
TARGET := $(ARCH)-none-none-elf
SWIFT_BUILD_ARGS := \
--configuration release \
--triple $(TARGET) \
--toolset $(TOOLSET) \
--disable-local-rpath
BUILDROOT := $(shell $(SWIFT_BUILD) $(SWIFT_BUILD_ARGS) --show-bin-path)

all: kernel8.img
.PHONY: build
build:
@echo "building..."
$(SWIFT_BUILD) \
$(SWIFT_BUILD_ARGS) \
--verbose

kernel8.img: kernel8.elf
@echo "💾 Converting to binary kernel image with llvm-objcopy..."
$(LLVM_OBJCOPY) -O binary kernel8.elf kernel8.img
@echo ""
@echo "🥳 Done! kernel8.img was saved to this directory."
@echo "extracting binary..."
$(LLVM_OBJCOPY) \
-O binary \
"$(BUILDROOT)/Application" \
"$(BUILDROOT)/Application.bin" \

kernel8.elf: $(BUILDROOT)/libMainApp.a $(BUILDROOT)/Support.build/boot.S.o link.ld
@echo "🔗 Linking with clang..."
$(CLANG) --target=aarch64-elf -o kernel8.elf $< $^ -fuse-ld=lld -nostdlib -Wl,--unresolved-symbols=ignore-in-object-files -Wl,-T ./link.ld
@echo ""

$(BUILDROOT)/libMainApp.a $(BUILDROOT)/Support.build/boot.S.o:
@echo "🛠️ Building with Swift Package Manager..."
$(SWIFT_EXEC) build --triple aarch64-none-none-elf -Xswiftc -Xfrontend -Xswiftc -disable-stack-protector
@echo ""

.PHONY: clean
clean:
rm -rf kernel8.elf kernel8.img .build
@echo "cleaning..."
@swift package clean
@rm -rf .build
6 changes: 3 additions & 3 deletions rpi-4b-blink/Package.resolved

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

29 changes: 7 additions & 22 deletions rpi-4b-blink/Package.swift
Original file line number Diff line number Diff line change
Expand Up @@ -3,33 +3,18 @@
import PackageDescription

let package = Package(
name: "RPi4B-Blink",
platforms: [
.macOS(.v14)
],
name: "rpi-4b-blink",
products: [
.library(
name: "MainApp",
type: .static,
targets: ["MainApp"])
.executable(name: "Application", targets: ["Application"])
],
dependencies: [
.package(
url: "https://github.com/apple/swift-mmio.git",
branch: "swift-embedded-examples")
.package(url: "https://github.com/apple/swift-mmio.git", branch: "main")
],
targets: [
.target(
name: "MainApp",
.executableTarget(
name: "Application",
dependencies: [
.product(name: "MMIO", package: "swift-mmio")
],
swiftSettings: [
.enableExperimentalFeature("Embedded"),
.unsafeFlags(["-Xfrontend", "-function-sections"]),
]
),
]),
.target(name: "Support"),

]
)
])
2 changes: 0 additions & 2 deletions rpi-4b-blink/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -14,11 +14,9 @@
- Build the program, then copy the kernel image to the SD card.
``` console
$ cd rpi-4b-blink
$ export TOOLCHAINS='<toolchain-identifier>' # Your Swift nightly toolchain identifier
$ make
$ cp kernel8.img /Volumes/bootfs
```
- If your original OS is not 64-bit, make sure to set `arm_64bit=1` in `config.txt`.
- Place the SD card in your Raspberry Pi 4B, and connect it to power.
- After the boot sequence, the green (ACT) led will start blinking in a regular pattern.

Original file line number Diff line number Diff line change
Expand Up @@ -67,11 +67,9 @@ func ledOff() {
}

@main
struct Main {

struct Application {
static func main() {
setLedOutput()

while true {
ledOn()
for _ in 1..<100000 {} // just a delay
Expand Down
File renamed without changes.
61 changes: 40 additions & 21 deletions rpi-5-blink/Makefile
Original file line number Diff line number Diff line change
@@ -1,28 +1,47 @@
SWIFT_EXEC ?= $(shell if [ "$(shell uname)" = "Darwin" ]; then xcrun -f swift; else which swift; fi)
CLANG ?= $(shell if [ "$(shell uname)" = "Darwin" ]; then xcrun -f clang; else which clang; fi)
LLVM_OBJCOPY ?= $(shell if [ "$(shell uname)" = "Darwin" ]; then xcrun -f llvm-objcopy; else which llvm-objcopy; fi)
##===----------------------------------------------------------------------===##
##
## This source file is part of the Swift open source project
##
## Copyright (c) 2025 Apple Inc. and the Swift project authors.
## Licensed under Apache License v2.0 with Runtime Library Exception
##
## See https://swift.org/LICENSE.txt for license information
##
##===----------------------------------------------------------------------===##

BUILDROOT := $(shell $(SWIFT_EXEC) build --triple aarch64-none-none-elf -Xswiftc -Xfrontend -Xswiftc -disable-stack-protector --show-bin-path)
# Paths
REPOROOT := $(shell git rev-parse --show-toplevel)
TOOLSROOT := $(REPOROOT)/Tools
TOOLSET := $(TOOLSROOT)/Toolsets/rpi-5-elf.json
LLVM_OBJCOPY := llvm-objcopy
SWIFT_BUILD := swift build

.PHONY: all clean
# Flags
ARCH := aarch64
TARGET := $(ARCH)-none-none-elf
SWIFT_BUILD_ARGS := \
--configuration release \
--triple $(TARGET) \
--toolset $(TOOLSET) \
--disable-local-rpath
BUILDROOT := $(shell $(SWIFT_BUILD) $(SWIFT_BUILD_ARGS) --show-bin-path)

all: kernel8.img
.PHONY: build
build:
@echo "building..."
$(SWIFT_BUILD) \
$(SWIFT_BUILD_ARGS) \
--verbose

kernel8.img: kernel8.elf
@echo "💾 Converting to binary kernel image with llvm-objcopy..."
$(LLVM_OBJCOPY) -O binary kernel8.elf kernel8.img
@echo ""
@echo "🥳 Done! kernel8.img was saved to this directory."
@echo "extracting binary..."
$(LLVM_OBJCOPY) \
-O binary \
"$(BUILDROOT)/Application" \
"$(BUILDROOT)/Application.bin" \

kernel8.elf: $(BUILDROOT)/libMainApp.a $(BUILDROOT)/Support.build/boot.S.o link.ld
@echo "🔗 Linking with clang..."
$(CLANG) --target=aarch64-elf -o kernel8.elf $< $^ -fuse-ld=lld -nostdlib -Wl,--unresolved-symbols=ignore-in-object-files -Wl,-T ./link.ld
@echo ""

$(BUILDROOT)/libMainApp.a $(BUILDROOT)/Support.build/boot.S.o:
@echo "🛠️ Building with Swift Package Manager..."
$(SWIFT_EXEC) build --triple aarch64-none-none-elf -Xswiftc -Xfrontend -Xswiftc -disable-stack-protector
@echo ""

.PHONY: clean
clean:
rm -rf kernel8.elf kernel8.img .build
@echo "cleaning..."
@swift package clean
@rm -rf .build
6 changes: 3 additions & 3 deletions rpi-5-blink/Package.resolved

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

32 changes: 9 additions & 23 deletions rpi-5-blink/Package.swift
Original file line number Diff line number Diff line change
Expand Up @@ -3,33 +3,19 @@
import PackageDescription

let package = Package(
name: "RPi5-Blink",
platforms: [
.macOS(.v14)
],
name: "rpi-5-blink",
products: [
.library(
name: "MainApp",
type: .static,
targets: ["MainApp"])
.executable(name: "Application", targets: ["Application"])
],
dependencies: [
.package(
url: "https://github.com/apple/swift-mmio.git",
branch: "swift-embedded-examples")
.package(url: "https://github.com/apple/swift-mmio.git", branch: "main")
],
targets: [
.target(
name: "MainApp",
.executableTarget(
name: "Application",
dependencies: [
.product(name: "MMIO", package: "swift-mmio")
],
swiftSettings: [
.enableExperimentalFeature("Embedded"),
.unsafeFlags(["-Xfrontend", "-function-sections"]),
]
),
.product(name: "MMIO", package: "swift-mmio"),
"Support"
]),
.target(name: "Support"),

]
)
])
2 changes: 0 additions & 2 deletions rpi-5-blink/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -14,12 +14,10 @@
- Build the program, then copy the kernel image to the SD card.
``` console
$ cd rpi-5-blink
$ export TOOLCHAINS='<toolchain-identifier>' # Your Swift nightly toolchain identifier
$ make
$ cp kernel8.img /Volumes/bootfs # Copy kernel image to SD card
$ rm /Volumes/bootfs/kernel_2712.img # Delete this kernel image so our kernel8.img is used
$ # You can also rename our kernel8.img to kernel_2712.img, or set it to anything you want and specify "kernel=[your-img-name]" in config.txt.
```
- Place the SD card in your Raspberry Pi 5, and connect it to power.
- After the boot sequence, the green (ACT) led will start blinking in a regular pattern.

Original file line number Diff line number Diff line change
Expand Up @@ -41,11 +41,9 @@ func ledOff() {
}

@main
struct Main {

struct Application {
static func main() {
setLedOutput()

while true {
ledOn()
for _ in 1..<100000 {} // just a delay
Expand Down
File renamed without changes.