From 7baed996272cd3c889a5ab714c2b3391703f75f1 Mon Sep 17 00:00:00 2001
From: guowenxue <guowenxue@gmail.com>
Date: Sat, 23 Jan 2021 19:44:10 +0800
Subject: [PATCH] Add gpiod.c for libgpiod output sample code

---
 modules/c/led.c |   68 +++++++++++++++++++++++++++++++++-
 1 files changed, 66 insertions(+), 2 deletions(-)

diff --git a/modules/c/led.c b/modules/c/led.c
index 959edd8..5ef2c0c 100644
--- a/modules/c/led.c
+++ b/modules/c/led.c
@@ -28,11 +28,9 @@
 #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[])
@@ -60,6 +58,9 @@
         return 0;
 }
 
+#ifdef CONFIG_USE_WIRINGPI
+#include <wiringPi.h>
+
 void init_led(void)
 {
 	int         i;
@@ -86,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

--
Gitblit v1.9.1