/*********************************************************************************
|
* 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
|