/********************************************************************************* * Copyright: (C) 2021 LingYun IoT System Studio * All rights reserved. * * Filename: led.c * Description: This file is used to control RGB 3-colors LED * compatible with libgpiod-1.x.x, not compatible with 2.x.x * * * Pin connection: * RGB Led Module Raspberry Pi Board * R <-----> #Pin33(BCM GPIO13) * G <-----> #Pin35(BCM GPIO19) * B <-----> #Pin37(BCM GPIO26) * GND <-----> GND * * System install: * sudo apt install -y libgpiod-dev gpiod * * ********************************************************************************/ #include #include #include #include #include #include #include #include #include #include #include "logger.h" #include "leds.h" #define DELAY 500 static led_info_t leds_info[LED_CNT] = { {"red", 13, 1, NULL }, {"green", 19, 1, NULL }, {"blue", 26, 1, NULL }, }; int init_led(led_ctx_t *ctx, int which) { int i, rv; led_info_t *led; if( !ctx ) { log_error("Invalid input arguments\n"); return -1; } ctx->leds = leds_info; ctx->count = LED_CNT; ctx->chip = gpiod_chip_open_by_name("gpiochip0"); if( !ctx->chip ) { log_error("open gpiochip failure, maybe you need running as root\n"); return -2; } for(i=0; icount; i++) { if( which == i ) { led = &ctx->leds[i]; led->line = gpiod_chip_get_line(ctx->chip, led->gpio); if( !led->line ) { log_error("open gpioline for %s[%d] failed\n", led->name, led->gpio); rv = -3; goto failed; } rv = gpiod_line_request_output(led->line, led->name, !led->active); if( rv ) { log_error("request gpio output for %5s[%d] failed: %s\n", led->name, led->gpio, strerror(errno)); rv = -4; goto failed; } log_debug("request %5s led[%d] for gpio output okay\n", led->name, led->gpio); } } return 0; failed: term_led(ctx, which); return rv; } int term_led(led_ctx_t *ctx, int which) { int i; led_info_t *led; log_warn("terminate RGB Led gpios\n"); if( !ctx ) { log_error("Invalid input arguments\n"); return -1; } if( !ctx->chip ) return 0; for(i=0; icount; i++) { if( which == i ) { led = &ctx->leds[i]; if( led->line ) gpiod_line_release(led->line); } } gpiod_chip_close(ctx->chip); return 0; } int turn_led(int which, int cmd) { int rv = 0; led_ctx_t ctx; led_info_t *led; if( which<0 || which>=LED_CNT ) { log_error("Invalid input arguments\n"); return -1; } if( (rv=init_led(&ctx, which)) < 0 ) { log_error("Initial RGB leds failure, rv=%d\n", rv); return -2; } led = &ctx.leds[which]; if( OFF == cmd ) { gpiod_line_set_value(led->line, !led->active); } else { gpiod_line_set_value(led->line, led->active); } term_led(&ctx, which); return 0; }