commit d9c1ea959de741d9412808d73e344d99afd40b8f
parent 7c133958420c19f0164d3bab656879df546bc793
Author: Sylvia Ivory <git@sivory.net>
Date: Mon, 9 Feb 2026 21:49:58 -0800
Remove Zig bootloader
Diffstat:
4 files changed, 1 insertion(+), 217 deletions(-)
diff --git a/build.zig b/build.zig
@@ -133,45 +133,9 @@ fn build_program(b: *std.Build, target: std.Build.ResolvedTarget, optimize: std.
try build_program_inner(b, target, optimize, program, null);
}
-fn build_installer(b: *std.Build, target: std.Build.ResolvedTarget, optimize: std.builtin.OptimizeMode) !void {
- const shared = b.addModule("shared", .{
- .root_source_file = b.path("shared/root.zig"),
- .optimize = optimize,
- .target = target,
- });
-
- const installer = b.addModule("pi-installer", .{
- .root_source_file = b.path("installer/root.zig"),
- .link_libc = true,
- .optimize = optimize,
- .target = target,
- });
-
- installer.addImport("shared", shared);
-
- const clap = b.dependency("clap", .{});
- installer.addImport("clap", clap.module("clap"));
-
- const serial = b.dependency("serial", .{});
- installer.addImport("serial", serial.module("serial"));
-
- const exe = b.addExecutable(.{
- .name = "pi-install",
- .root_module = installer,
- });
-
- b.installArtifact(exe);
-
- const run_exe = b.addRunArtifact(exe);
- const run_step = b.step("pi-install", "run the pi installer");
- run_step.dependOn(&run_exe.step);
-}
-
pub fn build(b: *std.Build) !void {
const pi_target = pi_zero_target(b);
- const local_target = b.standardTargetOptions(.{});
const optimize = b.standardOptimizeOption(.{ .preferred_optimize_mode = .ReleaseFast });
- try build_installer(b, local_target, optimize);
try build_program(b, pi_target, optimize);
}
diff --git a/build.zig.zon b/build.zig.zon
@@ -31,16 +31,7 @@
// `zig build --fetch` can be used to fetch all dependencies of a package, recursively.
// Once all dependencies are fetched, `zig build` no longer requires
// internet connectivity.
- .dependencies = .{
- .clap = .{
- .url = "https://github.com/Hejsil/zig-clap/archive/refs/tags/0.11.0.tar.gz",
- .hash = "clap-0.11.0-oBajB-HnAQDPCKYzwF7rO3qDFwRcD39Q0DALlTSz5H7e",
- },
- .serial = .{
- .url = "https://github.com/ZigEmbeddedGroup/serial/archive/fbd7389ff8bbc9fa362aa74081588755b5d028a0.tar.gz",
- .hash = "serial-0.0.1-PoeRzF60AAAN8Iu0yXTIX-t3DVzsnmN7vWHKM2HA2Zbq",
- },
- },
+ .dependencies = .{},
// Specifies the set of files and directories that are included in this package.
// Only files and directories listed here are included in the `hash` that
// is computed for this package. Only files listed here will remain on disk
diff --git a/installer/bootloader.zig b/installer/bootloader.zig
@@ -1,82 +0,0 @@
-const std = @import("std");
-
-const net = @import("shared").bootloader_protocol;
-
-const Message = net.Message;
-const Error = net.Error;
-
-// w - UART (unsafe)
-// r - UART (unsafe)
-pub fn boot(w: *std.Io.Writer, r: *std.Io.Reader, code: []u8, base_addr: u32) !void {
- const checksum = std.hash.Crc32.hash(code);
-
- std.debug.print("crc32={x}", .{checksum});
-
- const parent_progress = std.Progress.start(.{});
-
- const header: net.Header = .{
- .arm_base = base_addr,
- .checksum = checksum,
- .n_bytes = @truncate(code.len),
- };
-
- parent_progress.setName("waiting for a start");
-
- while (try net.get_u32(r) != @intFromEnum(Message.GET_PROG_INFO)) {
- const byte = try net.get_u8(r);
- std.debug.print("got invalid GET_PROG_INFO: 0x{X}\n", .{byte});
- }
-
- parent_progress.setName("sending header");
-
- try net.transmit_header(w, header);
-
- parent_progress.setName("waiting for response");
-
- while (true) {
- switch (try net.get_u32(r)) {
- @intFromEnum(Message.GET_CODE) => break,
- @intFromEnum(Message.BAD_CODE_ADDR) => return Error.BadAddress,
- else => continue,
- }
- }
-
- const checksum_return = try net.get_u32(r);
-
- if (checksum != checksum_return) {
- return Error.BadChecksum;
- }
-
- parent_progress.setName("got response, sending code");
-
- const transmit_progress = parent_progress.start("uploading", code.len);
- try net.transmit_code(w, transmit_progress, code);
-
- parent_progress.setName("waiting for response");
-
- while (true) {
- const b = try net.get_u32(r);
- switch (b) {
- @intFromEnum(Message.BOOT_SUCCESS) => break,
- @intFromEnum(Message.BAD_CODE_CKSUM) => return Error.BadChecksum,
- else => {
- var buffer: [4]u8 = undefined;
- std.mem.writeInt(u32, &buffer, b, .little);
- std.debug.print("{s}", .{buffer});
- },
- }
- }
-
- var stdout_buffer: [1024]u8 = undefined;
- var stdout = std.fs.File.stdout().writer(&stdout_buffer);
- const stdout_writer = &stdout.interface;
-
- parent_progress.setName("got response, booting");
- parent_progress.end();
-
- while (true) {
- const b = try net.get_u8(r);
- try stdout_writer.writeByte(b);
- try stdout_writer.flush();
- }
-}
diff --git a/installer/root.zig b/installer/root.zig
@@ -1,89 +0,0 @@
-const std = @import("std");
-const clap = @import("clap");
-const serial = @import("serial");
-
-const bootloader = @import("./bootloader.zig");
-
-pub fn main() !void {
- var gpa: std.heap.GeneralPurposeAllocator(.{}) = .init;
- const allocator = gpa.allocator();
- defer _ = gpa.deinit();
-
- const params = comptime clap.parseParamsComptime(
- \\-h, --help display this help and exit
- \\-b, --baud <baud> baud rate
- \\-d, --device <device> device path
- \\-t, --timeout <float> UART timeout
- \\-b, --arm-base <addr> executable base address
- \\<file> binary to run
- \\
- );
-
- const parsers = .{
- .baud = clap.parsers.int(u32, 10),
- .file = clap.parsers.string,
- .device = clap.parsers.string,
- .float = clap.parsers.float(f64),
- .addr = clap.parsers.int(u32, 16),
- };
-
- var diagnostics: clap.Diagnostic = .{};
- var res = clap.parse(clap.Help, ¶ms, parsers, .{
- .diagnostic = &diagnostics,
- .allocator = allocator,
- }) catch |e| {
- try diagnostics.reportToFile(.stderr(), e);
- return e;
- };
- defer res.deinit();
-
- if (res.args.help != 0) {
- std.debug.print("pi-install ", .{});
- try clap.usageToFile(.stderr(), clap.Help, ¶ms);
- std.debug.print("\n", .{});
-
- return clap.helpToFile(.stderr(), clap.Help, ¶ms, .{
- .description_on_new_line = false,
- .spacing_between_parameters = 0,
- });
- }
-
- const tty_path = res.args.device orelse "/dev/ttyUSB0";
- const baud = res.args.baud orelse 921600;
- const path = res.positionals[0] orelse return error.MissingFile;
- const base_addr = res.args.@"arm-base" orelse 0x8000;
- const timeout = res.args.timeout orelse 10.0;
-
- std.debug.print("tty-usb=<{s}> baud=<{d}> program=<{s}> base-addr=<0x{X}> timeout=<{d}s>\n", .{ tty_path, baud, path, base_addr, timeout });
-
- const tty = try std.fs.openFileAbsolute(tty_path, .{ .allow_ctty = true, .mode = .read_write });
-
- try serial.configureSerialPort(tty, .{ .baud_rate = baud, .handshake = .none, .parity = .none, .stop_bits = .one, .word_size = .eight });
-
- var code: []u8 = undefined;
-
- {
- const cwd = std.fs.cwd();
-
- var reader_buffer: [1024]u8 = undefined;
- var code_file = try cwd.openFile(path, .{ .mode = .read_only });
- var code_reader = code_file.reader(&reader_buffer);
- var r = &code_reader.interface;
-
- const size = (try code_file.stat()).size;
-
- code = try r.readAlloc(allocator, size);
- }
-
- defer allocator.free(code);
-
- var reader_buffer: [1024]u8 = undefined;
- var file_reader = tty.reader(&reader_buffer);
- const r = &file_reader.interface;
-
- var writer_buffer: [1024]u8 = undefined;
- var file_writer = tty.writer(&writer_buffer);
- const w = &file_writer.interface;
-
- try bootloader.boot(w, r, code, base_addr);
-}