Skip to content

Better support for creating user board targets #919

@sluubb

Description

@sluubb

When attempting to create a custom, project-specific board target for the XIAO RP2040 I found that it was very difficult to reuse parts from predefined boards that use the RP2040 chip. More specifically, it required a very roundabout way to setup the bootloader.

build.zig:

const std = @import("std");
const microzig = @import("microzig");

const MicroBuild = microzig.MicroBuild(.{
    .rp2xxx = true,
});

pub fn build(b: *std.Build) void {
    const mz_dep = b.dependency("microzig", .{});
    const mb = MicroBuild.init(b, mz_dep) orelse return;

    const pico_board = mb.ports.rp2xxx.boards.raspberrypi.pico.board orelse return;
    const target = mb.ports.rp2xxx.chips.rp2040.derive(.{
        .board = .{
            .name = "XIAO RP2040",
            .root_source_file = b.path("boards/xiao_rp2040.zig"),
            .imports = pico_board.imports,
        },
    });

    const firmware = mb.add_firmware(.{
        .name = "main",
        .target = target,
        .optimize = .ReleaseSmall,
        .root_source_file = b.path("src/main.zig"),
    });

    mb.install_firmware(firmware, .{});
}

boards/xiao_rp2040.zig:

const microzig = @import("microzig");
const hal = microzig.hal;

pub const xosc_freq = 12_000_000;

pub const bootrom = @import("shared/rp2040_bootrom.zig");

comptime {
    _ = bootrom;
}

pub const pin_config = hal.pins.GlobalConfiguration{
    .GPIO12 = .{ .name = "rgb_led", .direction = .out },
    .GPIO17 = .{ .name = "user_led_r", .direction = .out },
    .GPIO16 = .{ .name = "user_led_g", .direction = .out },
    .GPIO25 = .{ .name = "user_led_b", .direction = .out },
};

I find I'm having to reference the generated bootloader for rp2040 boards though other boards (here the rp pico) and copy over the rp2040_bootrom.zig to my project for it to compile, which feels convoluted. Is it possible to streamline this process by, for example, exposing the bootloader generation to the user?

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions