| /********************************************************************************* | 
|  *      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 <guowenxue@gmail.com> | 
|  *      ChangeLog:  1, Release initial version on "2021/11/03 12:13:26" | 
|  *                  | 
|  ********************************************************************************/ | 
|   | 
| #include <stdio.h> | 
| #include <stdlib.h> | 
| #include <unistd.h> | 
| #include <fcntl.h> | 
| #include <dirent.h> | 
| #include <string.h> | 
| #include <time.h> | 
| #include <errno.h> | 
|   | 
| #include <gpiod.h> | 
|   | 
| #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 |