/** * @file gpio_control.c * @brief CLI utility to control GPIOs using the KED GPIO interface (Linux). */ #include "../ked/peripherals/gpio/gpio.h" #include #include #include #define GPIOCHIP_DEFAULT "/dev/gpiochip0" /** * @brief Print usage message for the CLI tool. */ void print_usage(const char* prog_name) { printf("Usage: %s -pin -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; }