/********************************************************************************* * Copyright: (C) 2021 LingYun IoT System Studio * All rights reserved. * * Filename: led.c * Description: This file is used to control RGB 3-colors LED * * pi@raspberrypi:~ $ gpio readall #show RPi pin map * * LED #PIN BCM * I ---- 39 ---- GND * G ---- 37 ---- 26 * R ---- 35 ---- 19 * B ---- 33 ---- 13 * * Version: 1.0.0(2012/11/03) * Author: Guo Wenxue * ChangeLog: 1, Release initial version on "2021/11/03 12:13:26" * ********************************************************************************/ #include #include #include #include #include #include #include #include #include #define msleep(x) usleep( 1000*(x) ) #define DELAY 500 #define ON 1 #define OFF 0 /* Three LEDs code */ enum { LED_R = 0, LED_G, LED_B, LED_MAX, }; /* RGB 3-color LED BCM pin number */ static int led_gpio[LED_MAX]= { 19, 26, 13 }; void init_led(void); int turn_led(int which, int cmd); int main(int argc, char *argv[]) { init_led(); while(1) { turn_led(LED_R, ON); turn_led(LED_R, OFF); turn_led(LED_G, ON); turn_led(LED_G, OFF); turn_led(LED_B, ON); turn_led(LED_B, OFF); } return 0; } #if 1 /* Use libgpiod lowlevel API */ struct gpiod_chip* chip; void init_led(void) { chip = gpiod_chip_open_by_name("gpiochip0"); if( !chip ) { printf("gpiod open chip failure, maybe you need running as root\n"); exit(1); } } int turn_led(int which, int cmd) { int rv = 0; struct gpiod_line* line; line = gpiod_chip_get_line(chip, led_gpio[which]); if( !line ) { rv = -2; } gpiod_line_request_output(line, "led", 0); if( OFF == cmd ) { gpiod_line_set_value(line, 0); } else { gpiod_line_set_value(line, 1); } msleep(DELAY); } #else /* use libgpiod ctxless high level API */ void init_led(void) { } static void gpiod_ctxless_cb(void *data) { sleep(1); } int turn_led(int which, int cmd) { if( OFF == cmd ) gpiod_ctxless_set_value("gpiochip0", led_gpio[which], 0, false, "led", gpiod_ctxless_cb, NULL); else gpiod_ctxless_set_value("gpiochip0", led_gpio[which], 1, false, "led", gpiod_ctxless_cb, NULL); } #endif