Better support for creating user board targets
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:
```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:
```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?
0 条评论