| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170 |
- /*****************************************************************************
- * | File : RPI_GPIOD.c
- * | Author : Waveshare team
- * | Function : Drive GPIO
- * | Info : Read and write gpio
- *----------------
- * | This version: V1.0
- * | Date : 2023-11-15
- * | Info : Basic version
- *
- #
- # Permission is hereby granted, free of charge, to any person obtaining a copy
- # of this software and associated documnetation files (the "Software"), to deal
- # GPIOD_IN the Software without restriction, including without limitation the rights
- # to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
- # copies of the Software, and to permit persons to whom the Software is
- # furished to do so, subject to the folGPIOD_LOWing conditions:
- #
- # The above copyright notice and this permission notice shall be included GPIOD_IN
- # all copies or substantial portions of the Software.
- #
- # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- # IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- # FITNESS OR A PARTICULAR PURPOSE AND NONINFRINGEMENT. GPIOD_IN NO EVENT SHALL THE
- # AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- # LIABILITY WHETHER GPIOD_IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- # GPIOD_OUT OF OR GPIOD_IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS GPIOD_IN
- # THE SOFTWARE.
- #
- ******************************************************************************/
- #include "RPI_gpiod.h"
- #include <sys/stat.h>
- #include <sys/types.h>
- #include <fcntl.h>
- #include <stdio.h>
- #include <stdlib.h>
- #include <string.h>
- #include <unistd.h>
- #include <gpiod.h>
- struct gpiod_chip *gpiochip;
- struct gpiod_line *gpioline;
- int ret;
- int GPIOD_Export()
- {
- char buffer[NUM_MAXBUF];
- FILE *fp;
- fp = popen("cat /proc/cpuinfo | grep 'Raspberry Pi 5'", "r");
- if (fp == NULL) {
- GPIOD_Debug("It is not possible to determine the model of the Raspberry PI\n");
- return -1;
- }
- if(fgets(buffer, sizeof(buffer), fp) != NULL)
- {
- gpiochip = gpiod_chip_open("/dev/gpiochip4");
- if (gpiochip == NULL)
- {
- GPIOD_Debug( "gpiochip4 Export Failed\n");
- return -1;
- }
- }
- else
- {
- gpiochip = gpiod_chip_open("/dev/gpiochip0");
- if (gpiochip == NULL)
- {
- GPIOD_Debug( "gpiochip0 Export Failed\n");
- return -1;
- }
- }
-
- return 0;
- }
- int GPIOD_Unexport(int Pin)
- {
- gpioline = gpiod_chip_get_line(gpiochip, Pin);
- if (gpioline == NULL)
- {
- GPIOD_Debug( "Export Failed: Pin%d\n", Pin);
- return -1;
- }
- gpiod_line_release(gpioline);
-
- GPIOD_Debug( "Unexport: Pin%d\r\n", Pin);
-
- return 0;
- }
- int GPIOD_Unexport_GPIO(void)
- {
- gpiod_line_release(gpioline);
- gpiod_chip_close(gpiochip);
- return 0;
- }
- int GPIOD_Direction(int Pin, int Dir)
- {
- gpioline = gpiod_chip_get_line(gpiochip, Pin);
- if (gpioline == NULL)
- {
- GPIOD_Debug( "Export Failed: Pin%d\n", Pin);
- return -1;
- }
- if(Dir == GPIOD_IN)
- {
- ret = gpiod_line_request_input(gpioline, "gpio");
- if (ret != 0)
- {
- GPIOD_Debug( "Export Failed: Pin%d\n", Pin);
- return -1;
- }
- GPIOD_Debug("Pin%d:intput\r\n", Pin);
- }
- else
- {
- ret = gpiod_line_request_output(gpioline, "gpio", 0);
- if (ret != 0)
- {
- GPIOD_Debug( "Export Failed: Pin%d\n", Pin);
- return -1;
- }
- GPIOD_Debug("Pin%d:Output\r\n", Pin);
- }
- return 0;
- }
- int GPIOD_Read(int Pin)
- {
- gpioline = gpiod_chip_get_line(gpiochip, Pin);
- if (gpioline == NULL)
- {
- GPIOD_Debug( "Export Failed: Pin%d\n", Pin);
- return -1;
- }
- ret = gpiod_line_get_value(gpioline);
- if (ret < 0)
- {
- GPIOD_Debug( "failed to read value!\n");
- return -1;
- }
- return(ret);
- }
- int GPIOD_Write(int Pin, int value)
- {
- gpioline = gpiod_chip_get_line(gpiochip, Pin);
- if (gpioline == NULL)
- {
- GPIOD_Debug( "Export Failed: Pin%d\n", Pin);
- return -1;
- }
- ret = gpiod_line_set_value(gpioline, value);
- if (ret != 0)
- {
- GPIOD_Debug( "failed to write value! : Pin%d\n", Pin);
- return -1;
- }
- return 0;
- }
|