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

87 lines
2.0 KiB

/**
* @file gpio_control.c
* @brief CLI utility to control GPIOs using the KED GPIO interface (Linux).
*/
#include "../ked/peripherals/gpio/gpio.h"
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define GPIOCHIP_DEFAULT "/dev/gpiochip0"
/**
* @brief Print usage message for the CLI tool.
*/
void print_usage(const char* prog_name) {
printf("Usage: %s -pin <number> -set|-reset|-toggle|-read\n", prog_name);
}
/**
* @brief Entry point for GPIO control CLI.
*/
int main(int argc, char* argv[]) {
if (argc < 4) {
print_usage(argv[0]);
return 1;
}
uint32_t pin = 0;
uint8_t action = 0xFF; // 0=set, 1=reset, 2=toggle, 3=read
for (int i = 1; i < argc; ++i) {
if (strcmp(argv[i], "-pin") == 0 && i + 1 < argc) {
pin = atoi(argv[++i]);
} else if (strcmp(argv[i], "-set") == 0) {
action = 0;
} else if (strcmp(argv[i], "-reset") == 0) {
action = 1;
} else if (strcmp(argv[i], "-toggle") == 0) {
action = 2;
} else if (strcmp(argv[i], "-read") == 0) {
action = 3;
}
}
if (pin == 0 || action == 0xFF) {
print_usage(argv[0]);
return 2;
}
gpio_t gpio_conf = {
.chipname = "/dev/gpiochip0",
.line_offset = pin,
.direction = (action == 3) ? T_GPIO_DIRECTION_INPUT : T_GPIO_DIRECTION_OUTPUT,
.bias = T_GPIO_BIAS_DEFAULT,
.mode = T_GPIO_MODE_DEFAULT,
.status = T_GPIO_STATUS_NOT_INIT
};
gpio_fn_ptr_t led = {0};
gpio_error_t err = ked_gpio_init(&gpio_conf, &led);
if (err != T_GPIO_ERR_OK) {
if (led.on_error) led.on_error(err);
return 1;
}
switch (action) {
case 0:
if (led.set) led.set(1);
break;
case 1:
if (led.set) led.set(0);
break;
case 2:
if (led.toggle) led.toggle();
break;
case 3:
printf("GPIO%u value: %d\n", pin, led.read());
break;
}
// Clean up
return 0;
}