Compare commits

9 Commits

Author SHA1 Message Date
Filipriec
e0b3573be9 finally working oh my gash 2026-04-13 09:35:15 +02:00
Filipriec
bee9777a4b blinky 2026-03-23 09:41:11 +01:00
Filipriec
20dade6168 zig build 2026-03-09 12:20:46 +01:00
Filipriec
6706055229 working doom emacs zls 2026-03-09 11:32:08 +01:00
Filipriec
cfea6e031a zls 2026-03-09 11:03:12 +01:00
Filipriec
f3e7cbb83a working zig on tiva tm4c 2026-03-09 10:20:42 +01:00
Filipriec
d8b4c8e8cf build.zig and memory.x as ld file for tivatm4c123g 2026-03-09 09:06:04 +01:00
Filipriec
27704a2f16 gitignore 2026-03-07 09:55:45 +01:00
Filipriec
54237c8ade building zig tutorial 2026-03-07 09:46:09 +01:00
13 changed files with 271 additions and 2 deletions

4
.gitignore vendored Normal file
View File

@@ -0,0 +1,4 @@
.zig-cache/
main
test/
test.zip

2
basics/.gitignore vendored Normal file
View File

@@ -0,0 +1,2 @@
.zig-cache/
zig-out/

23
basics/build.zig Normal file
View File

@@ -0,0 +1,23 @@
const std = @import("std");
pub fn build(b: *std.Build) void {
const target = b.standardTargetOptions(.{});
const optimize = b.standardOptimizeOption(.{});
const root_module = b.createModule(.{
.root_source_file = b.path("src/main.zig"),
.target = target,
.optimize = optimize,
});
const exe = b.addExecutable(.{
.name = "HAL-9000",
.root_module = root_module,
});
b.installArtifact(exe);
const run_cmd = b.addRunArtifact(exe);
const run_step = b.step("run", "Run the app");
run_step.dependOn(&run_cmd.step);
}

16
basics/src/calc.zig Normal file
View File

@@ -0,0 +1,16 @@
pub fn add(a: i32, b: i32) i32 {
return a + b;
}
pub fn sub(a: i32, b: i32) i32 {
return a - b;
}
pub fn mul(a: i32, b: i32) i32 {
return a * b;
}
pub fn divFloor(a: i32, b: i32) i32 {
return @divFloor(a, b);
}

26
basics/src/main.zig Normal file
View File

@@ -0,0 +1,26 @@
// src/main.zig
const std = @import("std");
fn sumUpTo(comptime n: u32) u64 {
var sum: u64 = 0;
var i: usize = 0;
while (i < n+1) : (i+=1) {
sum = sum + i;
}
return sum;
}
fn sumUpTo2(comptime n: u32) u64 {
var sum: u64 = 0;
for (0..n + 1) |i| {
sum += i;
}
return sum;
}
pub fn main() !void {
const r1 = comptime sumUpTo(100);
const r2 = sumUpTo2(1_000_000);
std.debug.print("{d}\n", .{r1});
std.debug.print("{d}\n", .{r2});
}

View File

@@ -12,14 +12,15 @@
system = "x86_64-linux";
pkgs = nixpkgs.legacyPackages.${system};
zig = zig-overlay.packages.${system}.master;
zls = zls-overlay.packages.${system}.zls;
zls = pkgs.zls;
in {
devShells.${system}.default = pkgs.mkShell {
buildInputs = [ zig zls ];
buildInputs = [ zig zls pkgs.openocd ];
shellHook = ''
echo "Entering Zig Master Environment"
echo "Zig: $(zig version)"
echo "ZLS: $(zls --version)"
echo "openocd -f board/ek-tm4c123gxl.cfg -c \"program tiva/zig-out/bin/tiva-app verify reset exit\""
'';
};
};

3
tiva/.dir-locals.el Normal file
View File

@@ -0,0 +1,3 @@
((zig-mode . ((ffap-c-path . ("/home/priec/programs/CMSIS/CMSIS/Include"
"/home/priec/programs/CMSIS/Device/TI/TM4C/Include"
"/usr/include")))))

2
tiva/.gitignore vendored Normal file
View File

@@ -0,0 +1,2 @@
.zig-cache/
zig-out/

51
tiva/build.zig Normal file
View File

@@ -0,0 +1,51 @@
const std = @import("std");
pub fn build(b: *std.Build) void {
const target = b.resolveTargetQuery(.{
.cpu_arch = .thumb,
.os_tag = .freestanding,
.abi = .eabihf,
.cpu_model = .{ .explicit = &std.Target.arm.cpu.cortex_m4 },
});
const optimize = b.standardOptimizeOption(.{});
// Create the module separately
const tiva_module = b.createModule(.{
.root_source_file = b.path("src/main.zig"),
.target = target,
.optimize = optimize,
});
const cmsis_path = "/home/priec/programs/CMSIS";
// Generic CMSIS Core (for core_cm4.h)
tiva_module.addIncludePath(.{ .cwd_relative = cmsis_path ++ "/Include" });
// TM4C Device Specific (for TM4C123GH6PM.h)
tiva_module.addIncludePath(.{ .cwd_relative = cmsis_path ++ "/Device/TI/TM4C/Include" });
const elf = b.addExecutable(.{
.name = "tiva-app",
.root_module = tiva_module,
});
const bin = elf.addObjCopy(.{ .format = .bin });
const install_bin = b.addInstallBinFile(bin.getOutput(), "tiva-app.bin");
b.getInstallStep().dependOn(&install_bin.step);
elf.root_module.strip = true;
elf.root_module.omit_frame_pointer = true;
elf.root_module.unwind_tables = .none;
// Disable red zone for bare metal
elf.root_module.red_zone = false;
// Provide basic built-in functions
elf.bundle_compiler_rt = true;
elf.link_gc_sections = true;
// Use your custom linker script
elf.setLinkerScript(b.path("layout.ld"));
b.installArtifact(elf);
}

11
tiva/build.zig.zon Normal file
View File

@@ -0,0 +1,11 @@
.{
.name = .tiva_app,
.version = "0.0.1",
.fingerprint = 0x8f7e4f3ddce5d838,
.paths = .{
"build.zig",
"build.zig.zon",
"src",
},
.dependencies = .{},
}

72
tiva/layout.ld Normal file
View File

@@ -0,0 +1,72 @@
/*
* Copyright (c) 2018, Shawn D'silva <shawn@shawndsilva.com>
* All rights reserved.
*
* This file is free software: you can redistribute it and/or modify
* it under the terms of the GNU Lesser General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This file is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public License
* along with this library. If not, see <http://www.gnu.org/licenses/>.
*
* File: TM4C123GH6PHM.ld
* Author: Shawn D'silva <https://www.shawndsilva.com>.
* Version: 1.0.0.
* Description: linker file for the TM4C Launchpad
*/
MEMORY
{
FLASH (rx) : ORIGIN = 0x00000000, LENGTH = 256K /* FLASH size 256KB */
RAM (rwx) : ORIGIN = 0x20000000, LENGTH = 32K/* RAM size 32KB */
}
SECTIONS
{
/*
* initial stack pointer pointing to top of stack,starts from higher addresses
* i.e ORIGIN(RAM) + LENGTH(RAM)-1 in this case 0x20007FFF to lower addesses i.e
* those lesser than 0x20007FFF to 0x2000000,which is the origina address of RAM,
* until it comes in contact with .bss or .data in which case a buffer overflow occurs
*/
PROVIDE( _stack_ptr = ORIGIN(RAM) + LENGTH(RAM));
/* constants and other code stored in FLASH */
.text :
{
_text = .; /* beginning of .text segment,also called code memory */
KEEP(*(.vector_table)) /* vector table defined in startup.c to be included */
*(.text*) /* other code */
*(.rodata*) /* constants go here */
_etext = .; /* end of .text segment */
} > FLASH
/* data, initialized variables, to be copied to RAM upon <RESET> by startup.c */
.data :
{
_data = .; /* beginning of .data segment */
*(.data*) /* data goes here */
_edata = .; /* end of .data segment */
} > RAM AT >FLASH /* .data segment starts directly after the .text section in FLASH */
/* uninitialized data which is initialized to 0 upon <RESET> by startup.c */
.bss :
{
_bss = .; /* beginning of .bss segment */
*(.bss*) /* .bss content goes here */
*(COMMON)
_ebss = .; /* end of .bss segment */
} > RAM
}

54
tiva/src/main.zig Normal file
View File

@@ -0,0 +1,54 @@
const cmsis = @cImport({
@cDefine("TM4C123GH6PM", "");
@cInclude("TM4C123GH6PM.h");
});
const GPIO_PORTF_CLK_EN = @as(u32, 0x20); // Bit 5 (Port F)
const GPIO_PORTF_PIN1_EN = @as(u32, 0x02); // Bit 1
const LED_RED = @as(u32, 0x02);
// export const vector_table linksection(".isr_vector") = [2]usize{
// 0x20008000,
// @intFromPtr(&_start),
// };
const VectorEntry = extern union {
stack_top: u32,
handler: *const fn () callconv(.c) noreturn,
};
export const vector_table linksection(".vector_table") = [_]VectorEntry{
.{ .stack_top = 0x20008000 },
.{ .handler = &_start },
};
export fn _start() callconv(.c) noreturn {
cmsis.SYSCTL.*.RCGC2 |= GPIO_PORTF_CLK_EN;
cmsis.SYSCTL.*.RCGCGPIO |= GPIO_PORTF_CLK_EN;
_ = cmsis.SYSCTL.*.RCGCGPIO;
_ = cmsis.SYSCTL.*.RCGCGPIO;
_ = cmsis.SYSCTL.*.RCGCGPIO;
cmsis.SYSCTL.*.GPIOHBCTL |= GPIO_PORTF_CLK_EN;
cmsis.GPIOF_AHB.*.DEN |= GPIO_PORTF_PIN1_EN;
cmsis.GPIOF_AHB.*.DIR |= GPIO_PORTF_PIN1_EN;
// cmsis.GPIOF_AHB.*.DATA ^= LED_RED;
const gpiof_data_pf1: *volatile u32 = @ptrFromInt(@intFromPtr(cmsis.GPIOF_AHB) + (LED_RED << 2));
const DELAY_VALUE = 400000;
while (true) {
gpiof_data_pf1.* = LED_RED; // LED On
Delay(DELAY_VALUE);
gpiof_data_pf1.* = 0; // LED off
Delay(DELAY_VALUE);
}
}
fn Delay(delay: usize) void {
for (0..delay) |_| {
asm volatile ("nop");
}
}

4
tiva/zls.json Normal file
View File

@@ -0,0 +1,4 @@
{
"enable_autofix": true,
"enable_build_on_save": true
}