Ecosyste.ms: Awesome
An open API service indexing awesome lists of open source software.
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
- Host: GitHub
- URL: https://github.com/Elara6331/zig-gpio
- Owner: Elara6331
- License: mit
- Created: 2023-12-12T03:21:42.000Z (about 1 year ago)
- Default Branch: master
- Last Pushed: 2024-08-19T02:02:04.000Z (4 months ago)
- Last Synced: 2024-08-19T19:09:14.936Z (4 months ago)
- Topics: gpio, gpiochip, linux, zig
- Language: Zig
- Homepage: https://gitea.elara.ws/Elara6331/zig-gpio
- Size: 39.1 KB
- Stars: 13
- Watchers: 1
- Forks: 4
- Open Issues: 0
-
Metadata Files:
- Readme: README.md
- Funding: .github/FUNDING.yml
- License: LICENSE
Awesome Lists containing this project
- awesome-zig - Elara6331/zig-gpio
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` fileIf 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");`