You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

262 lines
9.3 KiB
Zig

const std = @import("std");
const MicroZig = @import("microzig-build");
pub const microzig_board_support = MicroZig.registerBoardSupport(@This());
fn root() []const u8 {
return comptime (std.fs.path.dirname(@src().file) orelse ".");
}
const build_root = root();
const KiB = 1024;
////////////////////////////////////////
// MicroZig Gen 2 Interface //
////////////////////////////////////////
pub fn build(b: *std.Build) !void {
_ = b;
// Dummy func to make package manager happy
}
pub const chips = struct {
pub const stm32f103x8 = MicroZig.Target{
.preferred_format = .elf,
.chip = .{
.name = "STM32F103",
.cpu = .cortex_m3,
.memory_regions = &.{
.{ .offset = 0x08000000, .length = 64 * KiB, .kind = .flash },
.{ .offset = 0x20000000, .length = 20 * KiB, .kind = .ram },
},
.register_definition = .{
.json = .{ .cwd_relative = build_root ++ "/src/chips/STM32F103.json" },
},
},
.hal = .{
.source_file = .{ .cwd_relative = build_root ++ "/src/hals/STM32F103/hal.zig" },
},
};
pub const stm32f303vc = MicroZig.Target{
.preferred_format = .elf,
.chip = .{
.name = "STM32F303",
.cpu = .cortex_m4,
.memory_regions = &.{
.{ .offset = 0x08000000, .length = 256 * KiB, .kind = .flash },
.{ .offset = 0x20000000, .length = 40 * KiB, .kind = .ram },
},
.register_definition = .{
.json = .{ .cwd_relative = build_root ++ "/src/chips/STM32F303.json" },
},
},
};
pub const stm32f407vg = MicroZig.Target{
.preferred_format = .elf,
.chip = .{
.name = "STM32F407",
.cpu = .cortex_m4,
.memory_regions = &.{
.{ .offset = 0x08000000, .length = 1024 * KiB, .kind = .flash },
.{ .offset = 0x20000000, .length = 128 * KiB, .kind = .ram },
.{ .offset = 0x10000000, .length = 64 * KiB, .kind = .ram }, // CCM RAM
},
.register_definition = .{
.json = .{ .cwd_relative = build_root ++ "/src/chips/STM32F407.json" },
},
},
};
pub const stm32f429zit6u = MicroZig.Target{
.preferred_format = .elf,
.chip = .{
.name = "STM32F429",
.cpu = .cortex_m4,
.memory_regions = &.{
.{ .offset = 0x08000000, .length = 2048 * KiB, .kind = .flash },
.{ .offset = 0x20000000, .length = 192 * KiB, .kind = .ram },
.{ .offset = 0x10000000, .length = 64 * KiB, .kind = .ram }, // CCM RAM
},
.register_definition = .{
.json = .{ .cwd_relative = build_root ++ "/src/chips/STM32F429.json" },
},
},
};
// All STM32L0x1 series MCUs differ only in memory size. So we create a comptime function
// to generate all MCU variants as per https://www.st.com/en/microcontrollers-microprocessors/stm32l0x1.html
fn stm32l0x1(comptime rom_size: u64, comptime ram_size: u64) MicroZig.Target {
return MicroZig.Target{
.preferred_format = .elf,
.chip = .{
.name = "STM32L0x1",
.cpu = .cortex_m0plus,
.memory_regions = &.{
.{ .offset = 0x08000000, .length = rom_size, .kind = .flash },
.{ .offset = 0x20000000, .length = ram_size, .kind = .ram },
},
.register_definition = .{
.svd = .{ .cwd_relative = build_root ++ "/src/chips/STM32L0x1.svd" },
},
},
};
}
pub const stm32l011x3 = stm32l0x1(8 * KiB, 2 * KiB);
pub const stm32l011x4 = stm32l0x1(16 * KiB, 2 * KiB);
pub const stm32l021x4 = stm32l0x1(16 * KiB, 2 * KiB);
pub const stm32l031x4 = stm32l0x1(16 * KiB, 8 * KiB);
pub const stm32l031x6 = stm32l0x1(32 * KiB, 8 * KiB);
pub const stm32l041x6 = stm32l0x1(32 * KiB, 8 * KiB);
pub const stm32l051x6 = stm32l0x1(32 * KiB, 8 * KiB);
pub const stm32l051x8 = stm32l0x1(64 * KiB, 8 * KiB);
pub const stm32l071x8 = stm32l0x1(64 * KiB, 20 * KiB);
pub const stm32l071xb = stm32l0x1(128 * KiB, 20 * KiB);
pub const stm32l081cb = stm32l0x1(128 * KiB, 20 * KiB);
pub const stm32l071xz = stm32l0x1(192 * KiB, 20 * KiB);
pub const stm32l081xz = stm32l0x1(192 * KiB, 20 * KiB);
// All STM32L0x2 series MCUs differ only in memory size. So we create a comptime function
// to generate all MCU variants as per https://www.st.com/en/microcontrollers-microprocessors/stm32l0x2.html
fn stm32l0x2(comptime rom_size: u64, comptime ram_size: u64) MicroZig.Target {
return MicroZig.Target{
.preferred_format = .elf,
.chip = .{
.name = "STM32L0x2",
.cpu = .cortex_m0plus,
.memory_regions = &.{
.{ .offset = 0x08000000, .length = rom_size, .kind = .flash },
.{ .offset = 0x20000000, .length = ram_size, .kind = .ram },
},
.register_definition = .{
.svd = .{ .cwd_relative = build_root ++ "/src/chips/STM32L0x2.svd" },
},
},
};
}
pub const stm32l052x6 = stm32l0x2(32 * KiB, 8 * KiB);
pub const stm32l052x8 = stm32l0x2(64 * KiB, 8 * KiB);
pub const stm32l062x8 = stm32l0x2(64 * KiB, 8 * KiB);
pub const stm32l072v8 = stm32l0x2(64 * KiB, 20 * KiB);
pub const stm32l072xb = stm32l0x2(128 * KiB, 20 * KiB);
pub const stm32l082xb = stm32l0x2(128 * KiB, 20 * KiB);
pub const stm32l072xz = stm32l0x2(192 * KiB, 20 * KiB);
pub const stm32l082xz = stm32l0x2(192 * KiB, 20 * KiB);
// All STM32L0x2 series MCUs differ only in memory size. So we create a comptime function
// to generate all MCU variants as per https://www.st.com/en/microcontrollers-microprocessors/stm32l0x3.html
fn stm32l0x3(comptime rom_size: u64, comptime ram_size: u64) MicroZig.Target {
return MicroZig.Target{
.preferred_format = .elf,
.chip = .{
.name = "STM32L0x3",
.cpu = .cortex_m0plus,
.memory_regions = &.{
.{ .offset = 0x08000000, .length = rom_size, .kind = .flash },
.{ .offset = 0x20000000, .length = ram_size, .kind = .ram },
},
.register_definition = .{
.svd = .{ .cwd_relative = build_root ++ "/src/chips/STM32L0x3.svd" },
},
},
};
}
pub const stm32l053x6 = stm32l0x2(32 * KiB, 8 * KiB);
pub const stm32l053x8 = stm32l0x2(64 * KiB, 8 * KiB);
pub const stm32l063x8 = stm32l0x2(64 * KiB, 8 * KiB);
pub const stm32l073v8 = stm32l0x2(64 * KiB, 20 * KiB);
pub const stm32l083v8 = stm32l0x2(64 * KiB, 20 * KiB);
pub const stm32l073xb = stm32l0x2(128 * KiB, 20 * KiB);
pub const stm32l083xb = stm32l0x2(128 * KiB, 20 * KiB);
pub const stm32l073xz = stm32l0x2(192 * KiB, 20 * KiB);
pub const stm32l083xz = stm32l0x2(192 * KiB, 20 * KiB);
};
pub const boards = struct {
pub const stm32f3discovery = MicroZig.Target{
.preferred_format = .elf,
.chip = chips.stm32f303vc.chip,
.board = .{
.name = "STM32F3DISCOVERY",
.source_file = .{ .path = build_root ++ "/src/boards/STM32F3DISCOVERY.zig" },
},
};
pub const stm32f4discovery = MicroZig.Target{
.preferred_format = .elf,
.chip = chips.stm32f407vg.chip,
.board = .{
.name = "STM32F4DISCOVERY",
.source_file = .{ .path = build_root ++ "/src/boards/STM32F4DISCOVERY.zig" },
},
};
pub const stm3240geval = MicroZig.Target{
.preferred_format = .elf,
.chip = chips.stm32f407vg.chip,
.board = .{
.name = "STM3240G_EVAL",
.source_file = .{ .path = build_root ++ "/src/boards/STM3240G_EVAL.zig" },
},
};
pub const stm32f429idiscovery = MicroZig.Target{
.preferred_format = .elf,
.chip = chips.stm32f429zit6u.chip,
.board = .{
.name = "STM32F429IDISCOVERY",
.source_file = .{ .path = build_root ++ "/src/boards/STM32F429IDISCOVERY.zig" },
},
};
};
// pub fn build(b: *std.build.Builder) void {
// _ = b;
// const optimize = b.standardOptimizeOption(.{});
// inline for (@typeInfo(boards).Struct.decls) |decl| {
// if (!decl.is_pub)
// continue;
// const exe = microzig.addEmbeddedExecutable(b, .{
// .name = @field(boards, decl.name).name ++ ".minimal",
// .source_file = .{
// .path = "test/programs/minimal.zig",
// },
// .backing = .{ .board = @field(boards, decl.name) },
// .optimize = optimize,
// });
// exe.installArtifact(b);
// }
// inline for (@typeInfo(chips).Struct.decls) |decl| {
// if (!decl.is_pub)
// continue;
// const exe = microzig.addEmbeddedExecutable(b, .{
// .name = @field(chips, decl.name).name ++ ".minimal",
// .source_file = .{
// .path = "test/programs/minimal.zig",
// },
// .backing = .{ .chip = @field(chips, decl.name) },
// .optimize = optimize,
// });
// exe.installArtifact(b);
// }
// }