Ecosyste.ms: Awesome

An open API service indexing awesome lists of open source software.

Awesome Lists | Featured Topics | Projects

https://github.com/Elara6331/zig-gpio

A Zig library for controlling GPIO lines on Linux systems
https://github.com/Elara6331/zig-gpio

gpio gpiochip linux zig

Last synced: 29 days ago
JSON representation

A Zig library for controlling GPIO lines on Linux systems

Awesome Lists containing this project

README

        

# zig-gpio

**zig-gpio** is a Zig library for controlling GPIO lines on Linux systems

This library can be used to access GPIO on devices such as [Raspberry Pis](https://www.raspberrypi.com/) or the [Milk-V Duo](https://milkv.io/duo) (which is the board I created it for and tested it with).

This is my first Zig project, so I'm open to any suggestions!

_There's a companion article available on my website: https://www.elara.ws/articles/milkv-duo._

## Compatibility

**zig-gpio** uses the v2 character device API, which means it will work on any Linux system running kernel 5.10 or above. All you need to do is find out which `gpiochip` device controls which pin and what the offsets are, which you can do by either finding documentation online, or using the `gpiodetect` and `gpioinfo` tools from this repo or from `libgpiod`.

## Commands

**zig-gpio** provides replacements for some of the `libgpiod` tools, such as `gpiodetect` and `gpioinfo`. You can build all of them using `zig build commands` or specific ones using `zig build ` (for example: `zig build gpiodetect`).

## Try it yourself!

Here's an example of a really simple program that requests pin 22 from `gpiochip2` and makes it blink at a 1 second interval. That pin offset is the LED of a Milk-V Duo board, so if you're using a different board, make sure to change it.

```zig
const std = @import("std");
const gpio = @import("gpio");

pub fn main() !void {
var chip = try gpio.getChip("/dev/gpiochip2");
defer chip.close();
std.debug.print("Chip Name: {s}\n", .{chip.name});

var line = try chip.requestLine(22, .{ .output = true });
defer line.close();
while (true) {
try line.setHigh();
std.time.sleep(std.time.ns_per_s);
try line.setLow();
std.time.sleep(std.time.ns_per_s);
}
}
```

For more examples, see the [_examples](_examples) directory. You can build all the examples using the `zig build examples` command.

## Using zig-gpio in your project

If you don't have a zig project already, you can create one by running `zig init-exe` in a new folder.

To add `zig-gpio` as a dependency, there are two steps:

1. Add `zig-gpio` to your `build.zig.zon` file
2. Add `zig-gpio` to your `build.zig` file

If you don't have a `build.zig.zon` file, create one. If you do, just add `zig-gpio` as a dependency. Here's what it should look like:

```zig
.{
.name = "my_project",
.version = "0.0.1",

.dependencies = .{
.gpio = .{
.url = "https://gitea.elara.ws/Elara6331/zig-gpio/archive/v0.0.2.tar.gz",
.hash = "1220e3af3194d1154217423d60124ae3a46537c2253dbfb8057e9b550526d2885df1",
}
}
}
```

Then, in your `build.zig` file, add the following before `b.installArtifact(exe)`:

```zig
const gpio = b.dependency("gpio", .{
.target = target,
.optimize = optimize,
});
exe.root_module.addImport("gpio", gpio.module("gpio"));
```

And that's it! You should now be able to use `zig-gpio` via `@import("gpio");`