guowenxue
2021-01-23 d28311ba087748eabe8d93ba1d382dd713f4096c
modules/c/led.c
@@ -8,9 +8,9 @@
 *     pi@raspberrypi:~ $ gpio readall show BCM and wPi pinmap  
 *
 *                 LED      BCM           wPi 
 *                  B ---- GPIO.13  ---- GPIO.23
 *                  G ---- GPIO.13  ---- GPIO.23
 *                  R ---- GPIO.19  ---- GPIO.24    
 *                  G ---- GPIO.26  ---- GPIO.25
 *                  B ---- GPIO.26  ---- GPIO.25
 *                  I ---- GND      ----
 *                 
 *        Version:  1.0.0(2018/10/14)
@@ -28,9 +28,10 @@
#include <time.h>
#include <errno.h>
#include <wiringPi.h>
#include "led.h"
#define msleep(x) usleep( 1000*(x) )
#define DELAY     500
int main(int argc, char *argv[])
{
@@ -39,23 +40,26 @@
   while(1)
   {
      turn_led(LED_R, ON);
      sleep(1);
      msleep(DELAY);
      turn_led(LED_R, OFF);
      sleep(1);
      msleep(DELAY);
      turn_led(LED_G, ON);
      sleep(1);
      msleep(DELAY);
      turn_led(LED_G, OFF);
      sleep(1);
      msleep(DELAY);
      turn_led(LED_B, ON);
      sleep(1);
      msleep(DELAY);
      turn_led(LED_B, OFF);
      sleep(1);
      msleep(DELAY);
   }
        return 0;
}
#ifdef CONFIG_USE_WIRINGPI
#include <wiringPi.h>
void init_led(void)
{
@@ -83,4 +87,67 @@
   return 0;
}
#else /* use libgpiod library */
#include <gpiod.h>
#if 0 /* 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);
   }
}
#else /* use libgpiod ctxless high level API */
void init_led(void)
{
}
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
#endif