From 4b08e7ff715552cd25591b6a9385c641ecb4e86c Mon Sep 17 00:00:00 2001 From: joshua-yang Date: Thu, 21 Feb 2019 12:05:24 +0900 Subject: [PATCH] wiringPi: Refactor source codes including fixes for collisions that'd occur Replace WiringPi header files to the ODROID specific files - Note: To avoid unforeseen errors when working with Python Wrapper. Python Wrapper doesn't recognize the ODROID specific header files and its introduced functions, declarations. So just thought that fixing Python Wrapper is much more complicated than replacing the header files and it seems more suitable for the later updates. Fix messaging implicit declaration of core functions Fix collisions of functions/declarations by header files - Note: In each ODROID sources, the prefix '_' have to be added to the core functions in order to avoid the collisions that non-static function follows static function. This is because of importing "wiringPi.h" header file that has extern core functions which names the same as listed in each ODROID source code file. So the core functions that exported from here must have that prefix, and only to be assigned its pointer to the "libodroid" structure. Change-Id: Ia927c7946cfb6ca6ce3a02530936325e1acb0620 --- gpio/Makefile | 11 - gpio/gpio.c | 1661 +++++++---------- gpio/gpio_odroid.c | 1225 ------------ gpio/readall.c | 687 ++++--- gpio/readall_odroid.c | 471 ----- wiringPi/Makefile | 41 +- wiringPi/odroid_template.c | 62 +- wiringPi/odroidc1.c | 338 ++-- wiringPi/odroidc1.h | 66 +- wiringPi/odroidc2.c | 284 +-- wiringPi/odroidc2.h | 34 +- wiringPi/odroidn1.c | 190 +- wiringPi/odroidn1.h | 46 +- wiringPi/odroidn2.c | 100 +- wiringPi/odroidn2.h | 16 +- wiringPi/odroidxu3.c | 264 +-- wiringPi/odroidxu3.h | 80 +- wiringPi/wiringOdroid.h | 246 --- wiringPi/wiringOdroidI2C.h | 42 - wiringPi/wiringOdroidSPI.h | 36 - wiringPi/{wiringOdroid.c => wiringPi.c} | 2 +- wiringPi/wiringPi.h | 308 ++- wiringPi/{wiringOdroidI2C.c => wiringPiI2C.c} | 0 wiringPi/wiringPiI2C.h | 43 +- wiringPi/{wiringOdroidSPI.c => wiringPiSPI.c} | 0 wiringPi/wiringPiSPI.h | 37 +- 26 files changed, 2225 insertions(+), 4065 deletions(-) mode change 100644 => 100755 gpio/gpio.c delete mode 100755 gpio/gpio_odroid.c mode change 100644 => 100755 gpio/readall.c delete mode 100755 gpio/readall_odroid.c delete mode 100755 wiringPi/wiringOdroid.h delete mode 100644 wiringPi/wiringOdroidI2C.h delete mode 100644 wiringPi/wiringOdroidSPI.h rename wiringPi/{wiringOdroid.c => wiringPi.c} (99%) mode change 120000 => 100755 wiringPi/wiringPi.h rename wiringPi/{wiringOdroidI2C.c => wiringPiI2C.c} (100%) mode change 120000 => 100644 wiringPi/wiringPiI2C.h rename wiringPi/{wiringOdroidSPI.c => wiringPiSPI.c} (100%) mode change 120000 => 100644 wiringPi/wiringPiSPI.h diff --git a/gpio/Makefile b/gpio/Makefile index 0b43204..1e8f10e 100755 --- a/gpio/Makefile +++ b/gpio/Makefile @@ -30,9 +30,6 @@ ifneq ($V,1) Q ?= @ endif -# BRAND_NAME = Pi -BRAND_NAME = Odroid - #DEBUG = -g -O0 DEBUG = -O2 CC = gcc @@ -44,16 +41,8 @@ LIBS = -lwiringPi -lwiringPiDev -lpthread -lrt -lm -lcrypt # May not need to alter anything below this line ############################################################################### -ifeq ($(BRAND_NAME), Odroid) - -SRC = gpio_odroid.c readall_odroid.c pins.c - -else - SRC = gpio.c readall.c pins.c -endif - OBJ = $(SRC:.c=.o) all: gpio diff --git a/gpio/gpio.c b/gpio/gpio.c old mode 100644 new mode 100755 index 6fd71f8..b28fe4f --- a/gpio/gpio.c +++ b/gpio/gpio.c @@ -21,8 +21,6 @@ * along with wiringPi. If not, see . *********************************************************************** */ - - #include #include #include @@ -49,6 +47,7 @@ extern int wiringPiDebug ; extern void doReadall (void) ; extern void doAllReadall (void) ; extern void doPins (void) ; +extern void doUnexport (int argc, char *agrv []); #ifndef TRUE # define TRUE (1==1) @@ -56,36 +55,36 @@ extern void doPins (void) ; #endif #define PI_USB_POWER_CONTROL 38 -#define I2CDETECT "/usr/sbin/i2cdetect" -#define MODPROBE "/sbin/modprobe" -#define RMMOD "/sbin/rmmod" +#define I2CDETECT "i2cdetect" +#define MODPROBE "modprobe" +#define RMMOD "rmmod" int wpMode ; char *usage = "Usage: gpio -v\n" - " gpio -h\n" - " gpio [-g|-1] ...\n" - " gpio [-d] ...\n" - " [-x extension:params] [[ -x ...]] ...\n" - " gpio [-p] ...\n" - " gpio ...\n" - " gpio \n" - " gpio readall/reset\n" - " gpio unexportall/exports\n" - " gpio export/edge/unexport ...\n" - " gpio wfi \n" - " gpio drive \n" - " gpio pwm-bal/pwm-ms \n" - " gpio pwmr \n" - " gpio pwmc \n" - " gpio load spi/i2c\n" - " gpio unload spi/i2c\n" - " gpio i2cd/i2cdetect\n" - " gpio rbx/rbd\n" - " gpio wb \n" - " gpio usbp high/low\n" - " gpio gbr \n" - " gpio gbw " ; // No trailing newline needed here. + " gpio -h\n" + " gpio [-g|-1] ...\n" + " gpio [-d] ...\n" + " [-x extension:params] [[ -x ...]] ...\n" + " gpio [-p] ...\n" + " gpio ...\n" + " gpio \n" + " gpio readall/reset\n" + " gpio unexportall/exports\n" + " gpio export/edge/unexport ...\n" + " gpio wfi \n" + " gpio drive \n" + " gpio pwm-bal/pwm-ms \n" + " gpio pwmr \n" + " gpio pwmc \n" + " gpio load spi/i2c\n" + " gpio unload spi/i2c\n" + " gpio i2cd/i2cdetect\n" + " gpio rbx/rbd\n" + " gpio wb \n" + " gpio usbp high/low\n" + " gpio gbr \n" + " gpio gbw " ; // No trailing newline needed here. #ifdef NOT_FOR_NOW @@ -95,16 +94,13 @@ char *usage = "Usage: gpio -v\n" * one of the Pi's on-board pins. ********************************************************************************* */ - static int decodePin (const char *str) { + // The first case - see if it's a number: + if (isdigit (str [0])) + return atoi (str) ; -// The first case - see if it's a number: - - if (isdigit (str [0])) - return atoi (str) ; - - return 0 ; + return 0 ; } #endif @@ -117,34 +113,31 @@ static int decodePin (const char *str) * which may be a security issue when this program is run a set-uid-root. ********************************************************************************* */ - static const char *searchPath [] = { - "/sbin", - "/usr/sbin", - "/bin", - "/usr/bin", - NULL, + "/sbin", + "/usr/sbin", + "/bin", + "/usr/bin", + NULL, } ; static char *findExecutable (const char *progName) { - static char *path = NULL ; - int len = strlen (progName) ; - int i = 0 ; - struct stat statBuf ; + static char *path = NULL ; + int len = strlen (progName) ; + int i = 0 ; + struct stat statBuf ; - for (i = 0 ; searchPath [i] != NULL ; ++i) - { - path = malloc (strlen (searchPath [i]) + len + 2) ; - sprintf (path, "%s/%s", searchPath [i], progName) ; + for (i = 0 ; searchPath [i] != NULL ; ++i) { + path = malloc (strlen (searchPath [i]) + len + 2) ; + sprintf (path, "%s/%s", searchPath [i], progName) ; - if (stat (path, &statBuf) == 0) - return path ; - free (path) ; - } - - return NULL ; + if (stat (path, &statBuf) == 0) + return path ; + free (path) ; + } + return NULL ; } @@ -154,153 +147,45 @@ static char *findExecutable (const char *progName) * program so we can access it. ********************************************************************************* */ - static void changeOwner (char *cmd, char *file) { - uid_t uid = getuid () ; - uid_t gid = getgid () ; + uid_t uid = getuid () ; + uid_t gid = getgid () ; - if (chown (file, uid, gid) != 0) - { - -// Removed (ignoring) the check for not existing as I'm fed-up with morons telling me that -// the warning message is an error. - - if (errno != ENOENT) - fprintf (stderr, "%s: Unable to change ownership of %s: %s\n", cmd, file, strerror (errno)) ; - } + if (chown (file, uid, gid) != 0) { + // Removed (ignoring) the check for not existing as I'm fed-up with morons telling me that + // the warning message is an error. + if (errno != ENOENT) + fprintf (stderr, "%s: Unable to change ownership of %s: %s\n", + cmd, file, strerror (errno)) ; + } } - -/* - * moduleLoaded: - * Return true/false if the supplied module is loaded - ********************************************************************************* - */ - -static int moduleLoaded (char *modName) -{ - int len = strlen (modName) ; - int found = FALSE ; - FILE *fd = fopen ("/proc/modules", "r") ; - char line [80] ; - - if (fd == NULL) - { - fprintf (stderr, "gpio: Unable to check /proc/modules: %s\n", strerror (errno)) ; - exit (1) ; - } - - while (fgets (line, 80, fd) != NULL) - { - if (strncmp (line, modName, len) != 0) - continue ; - - found = TRUE ; - break ; - } - - fclose (fd) ; - - return found ; -} - - /* * doLoad: * Load either the spi or i2c modules and change device ownerships, etc. ********************************************************************************* */ - static void checkDevTree (char *argv []) { - struct stat statBuf ; + struct stat statBuf ; - if (stat ("/proc/device-tree", &statBuf) == 0) // We're on a devtree system ... - { - fprintf (stderr, -"%s: Unable to load/unload modules as this Pi has the device tree enabled.\n" -" You need to run the raspi-config program (as root) and select the\n" -" modules (SPI or I2C) that you wish to load/unload there and reboot.\n" -" There is more information here:\n" -" https://www.raspberrypi.org/forums/viewtopic.php?f=28&t=97314\n", argv [0]) ; - exit (1) ; - } -} - -static void _doLoadUsage (char *argv []) -{ - fprintf (stderr, "Usage: %s load [I2C baudrate in Kb/sec]\n", argv [0]) ; - exit (1) ; + // We're on a devtree system ... + if (stat ("/proc/device-tree", &statBuf) == 0) { + fprintf (stderr, + "%s: Unable to load/unload modules as this kernel has the device tree enabled.\n" + " You need to edit /etc/modprobe.d/blacklist-odroid.conf or update /media/models.dts file.\n" + " If you want to use SPI, you should find out spidev module line at the blacklist-odroid.conf\n" + " and uncomment that. Then reboot to enable the module.\n\n" + " Please refer to our wiki page:\n" + " https://wiki.odroid.com/start\n", argv [0]) ; + exit (1) ; + } } static void doLoad (int argc, char *argv []) { - char *module1, *module2 ; - char cmd [80] ; - char *file1, *file2 ; - char args1 [32], args2 [32] ; - - checkDevTree (argv) ; - - if (argc < 3) - _doLoadUsage (argv) ; - - args1 [0] = args2 [0] = 0 ; - - /**/ if (strcasecmp (argv [2], "spi") == 0) - { - module1 = "spidev" ; - module2 = "spi_bcm2708" ; - file1 = "/dev/spidev0.0" ; - file2 = "/dev/spidev0.1" ; - if (argc == 4) - { - fprintf (stderr, "%s: Unable to set the buffer size now. Load aborted. Please see the man page.\n", argv [0]) ; - exit (1) ; - } - else if (argc > 4) - _doLoadUsage (argv) ; - } - else if (strcasecmp (argv [2], "i2c") == 0) - { - module1 = "i2c_dev" ; - module2 = "i2c_bcm2708" ; - file1 = "/dev/i2c-0" ; - file2 = "/dev/i2c-1" ; - if (argc == 4) - sprintf (args2, " baudrate=%d", atoi (argv [3]) * 1000) ; - else if (argc > 4) - _doLoadUsage (argv) ; - } - else - _doLoadUsage (argv) ; - - if (findExecutable ("modprobe") == NULL) - printf ("No found\n") ; - - if (!moduleLoaded (module1)) - { - sprintf (cmd, "%s %s%s", findExecutable (MODPROBE), module1, args1) ; - system (cmd) ; - } - - if (!moduleLoaded (module2)) - { - sprintf (cmd, "%s %s%s", findExecutable (MODPROBE), module2, args2) ; - system (cmd) ; - } - - if (!moduleLoaded (module2)) - { - fprintf (stderr, "%s: Unable to load %s\n", argv [0], module2) ; - exit (1) ; - } - - sleep (1) ; // To let things get settled - - changeOwner (argv [0], file1) ; - changeOwner (argv [0], file2) ; + checkDevTree (argv) ; } @@ -309,47 +194,9 @@ static void doLoad (int argc, char *argv []) * Un-Load either the spi or i2c modules and change device ownerships, etc. ********************************************************************************* */ - -static void _doUnLoadUsage (char *argv []) -{ - fprintf (stderr, "Usage: %s unload \n", argv [0]) ; - exit (1) ; -} - static void doUnLoad (int argc, char *argv []) { - char *module1, *module2 ; - char cmd [80] ; - - checkDevTree (argv) ; - - if (argc != 3) - _doUnLoadUsage (argv) ; - - /**/ if (strcasecmp (argv [2], "spi") == 0) - { - module1 = "spidev" ; - module2 = "spi_bcm2708" ; - } - else if (strcasecmp (argv [2], "i2c") == 0) - { - module1 = "i2c_dev" ; - module2 = "i2c_bcm2708" ; - } - else - _doUnLoadUsage (argv) ; - - if (moduleLoaded (module1)) - { - sprintf (cmd, "%s %s", findExecutable (RMMOD), module1) ; - system (cmd) ; - } - - if (moduleLoaded (module2)) - { - sprintf (cmd, "%s %s", findExecutable (RMMOD), module2) ; - system (cmd) ; - } + checkDevTree (argv) ; } @@ -358,29 +205,50 @@ static void doUnLoad (int argc, char *argv []) * Run the i2cdetect command with the right runes for this Pi revision ********************************************************************************* */ - static void doI2Cdetect (UNU int argc, char *argv []) { - int port = piGpioLayout () == 1 ? 0 : 1 ; - char *c, *command ; + int model, rev, mem, maker, overVolted, port; + const char *device = NULL; + char *c, *command ; - if ((c = findExecutable (I2CDETECT)) == NULL) - { - fprintf (stderr, "%s: Unable to find i2cdetect command: %s\n", argv [0], strerror (errno)) ; - return ; - } + piBoardId(&model, &rev, &mem, &maker, &overVolted); - if (!moduleLoaded ("i2c_dev")) - { - fprintf (stderr, "%s: The I2C kernel module(s) are not loaded.\n", argv [0]) ; - return ; - } + switch (model) { + case MODEL_ODROID_C1: case MODEL_ODROID_C2: + case MODEL_ODROID_XU3: + device = "/dev/i2c-1"; + port = 1; + break; + case MODEL_ODROID_N1: + device = "/dev/i2c-4"; + port = 4; + break; + case MODEL_ODROID_N2: + device = "/dev/i2c-3"; + port = 3; + default: + break; + } - command = malloc (strlen (c) + 16) ; - sprintf (command, "%s -y %d", c, port) ; - if (system (command) < 0) - fprintf (stderr, "%s: Unable to run i2cdetect: %s\n", argv [0], strerror (errno)) ; + if ((c = findExecutable (I2CDETECT)) == NULL) { + fprintf (stderr, "%s: Unable to find i2cdetect command: %s\n", argv [0], strerror (errno)) ; + return ; + } + switch (maker) { + case MAKER_AMLOGIC: + if (!moduleLoaded (AML_MODULE_I2C)) { + fprintf (stderr, "%s: The I2C kernel module(s) are not loaded.\n", argv [0]) ; + return ; + } + default: + break; + } + + command = malloc (strlen (c) + 16) ; + sprintf (command, "%s -y %d", c, port) ; + if (system (command) < 0) + fprintf (stderr, "%s: Unable to run i2cdetect: %s\n", argv [0], strerror (errno)) ; } @@ -389,80 +257,67 @@ static void doI2Cdetect (UNU int argc, char *argv []) * List all GPIO exports ********************************************************************************* */ - static void doExports (UNU int argc, UNU char *argv []) { - int fd ; - int i, l, first ; - char fName [128] ; - char buf [16] ; + int fd ; + int i, l, first ; + char fName [128] ; + char buf [16] ; - for (first = 0, i = 0 ; i < 64 ; ++i) // Crude, but effective - { + // Crude, but effective + for (first = 0, i = 0 ; i < 256 ; ++i) { + // Try to read the direction + sprintf (fName, "/sys/class/gpio/gpio%d/direction", i) ; + if ((fd = open (fName, O_RDONLY)) == -1) + continue ; -// Try to read the direction + if (first == 0) { + ++first ; + printf ("GPIO Pins exported:\n") ; + } + printf ("%4d: ", i) ; - sprintf (fName, "/sys/class/gpio/gpio%d/direction", i) ; - if ((fd = open (fName, O_RDONLY)) == -1) - continue ; - - if (first == 0) - { - ++first ; - printf ("GPIO Pins exported:\n") ; - } - - printf ("%4d: ", i) ; - - if ((l = read (fd, buf, 16)) == 0) - sprintf (buf, "%s", "?") ; + if ((l = read (fd, buf, 16)) == 0) + sprintf (buf, "%s", "?") ; - buf [l] = 0 ; - if ((buf [strlen (buf) - 1]) == '\n') - buf [strlen (buf) - 1] = 0 ; + buf [l] = 0 ; + if ((buf [strlen (buf) - 1]) == '\n') + buf [strlen (buf) - 1] = 0 ; + printf ("%-3s", buf) ; + close (fd) ; - printf ("%-3s", buf) ; + // Try to Read the value + sprintf (fName, "/sys/class/gpio/gpio%d/value", i) ; + if ((fd = open (fName, O_RDONLY)) == -1) { + printf ("No Value file (huh?)\n") ; + continue ; + } - close (fd) ; + if ((l = read (fd, buf, 16)) == 0) + sprintf (buf, "%s", "?") ; -// Try to Read the value + buf [l] = 0 ; + if ((buf [strlen (buf) - 1]) == '\n') + buf [strlen (buf) - 1] = 0 ; + printf (" %s", buf) ; + close (fd) ; - sprintf (fName, "/sys/class/gpio/gpio%d/value", i) ; - if ((fd = open (fName, O_RDONLY)) == -1) - { - printf ("No Value file (huh?)\n") ; - continue ; - } + // Read any edge trigger file + sprintf (fName, "/sys/class/gpio/gpio%d/edge", i) ; + if ((fd = open (fName, O_RDONLY)) == -1) { + printf ("\n") ; + continue ; + } - if ((l = read (fd, buf, 16)) == 0) - sprintf (buf, "%s", "?") ; + if ((l = read (fd, buf, 16)) == 0) + sprintf (buf, "%s", "?") ; - buf [l] = 0 ; - if ((buf [strlen (buf) - 1]) == '\n') - buf [strlen (buf) - 1] = 0 ; - - printf (" %s", buf) ; - -// Read any edge trigger file - - sprintf (fName, "/sys/class/gpio/gpio%d/edge", i) ; - if ((fd = open (fName, O_RDONLY)) == -1) - { - printf ("\n") ; - continue ; - } - - if ((l = read (fd, buf, 16)) == 0) - sprintf (buf, "%s", "?") ; - - buf [l] = 0 ; - if ((buf [strlen (buf) - 1]) == '\n') - buf [strlen (buf) - 1] = 0 ; - - printf (" %-8s\n", buf) ; - - close (fd) ; - } + buf [l] = 0 ; + if ((buf [strlen (buf) - 1]) == '\n') + buf [strlen (buf) - 1] = 0 ; + printf (" %-8s\n", buf) ; + close (fd) ; + } } @@ -472,64 +327,55 @@ static void doExports (UNU int argc, UNU char *argv []) * This uses the /sys/class/gpio device interface. ********************************************************************************* */ - void doExport (int argc, char *argv []) { - FILE *fd ; - int pin ; - char *mode ; - char fName [128] ; + FILE *fd ; + int pin ; + char *mode ; + char fName [128] ; - if (argc != 4) - { - fprintf (stderr, "Usage: %s export pin mode\n", argv [0]) ; - exit (1) ; - } + if (argc != 4) { + fprintf (stderr, "Usage: %s export pin mode\n", argv [0]) ; + exit (1) ; + } - pin = atoi (argv [2]) ; + pin = atoi (argv [2]) ; + mode = argv [3] ; - mode = argv [3] ; + if ((fd = fopen ("/sys/class/gpio/export", "w")) == NULL) { + fprintf (stderr, "%s: Unable to open GPIO export interface: %s\n", argv [0], strerror (errno)) ; + exit (1) ; + } - if ((fd = fopen ("/sys/class/gpio/export", "w")) == NULL) - { - fprintf (stderr, "%s: Unable to open GPIO export interface: %s\n", argv [0], strerror (errno)) ; - exit (1) ; - } + fprintf (fd, "%d\n", pin) ; + fclose (fd) ; - fprintf (fd, "%d\n", pin) ; - fclose (fd) ; + sprintf (fName, "/sys/class/gpio/gpio%d/direction", pin) ; + if ((fd = fopen (fName, "w")) == NULL) { + fprintf (stderr, "%s: Unable to open GPIO direction interface for pin %d: %s\n", argv [0], pin, strerror (errno)) ; + exit (1) ; + } - sprintf (fName, "/sys/class/gpio/gpio%d/direction", pin) ; - if ((fd = fopen (fName, "w")) == NULL) - { - fprintf (stderr, "%s: Unable to open GPIO direction interface for pin %d: %s\n", argv [0], pin, strerror (errno)) ; - exit (1) ; - } + if ((strcasecmp (mode, "in") == 0) || (strcasecmp (mode, "input") == 0)) + fprintf (fd, "in\n") ; + else if ((strcasecmp (mode, "out") == 0) || (strcasecmp (mode, "output") == 0)) + fprintf (fd, "out\n") ; + else if ((strcasecmp (mode, "high") == 0) || (strcasecmp (mode, "up") == 0)) + fprintf (fd, "high\n") ; + else if ((strcasecmp (mode, "low") == 0) || (strcasecmp (mode, "down") == 0)) + fprintf (fd, "low\n") ; + else { + fprintf (stderr, "%s: Invalid mode: %s. Should be in, out, high or low\n", argv [1], mode) ; + exit (1) ; + } + fclose (fd) ; - /**/ if ((strcasecmp (mode, "in") == 0) || (strcasecmp (mode, "input") == 0)) - fprintf (fd, "in\n") ; - else if ((strcasecmp (mode, "out") == 0) || (strcasecmp (mode, "output") == 0)) - fprintf (fd, "out\n") ; - else if ((strcasecmp (mode, "high") == 0) || (strcasecmp (mode, "up") == 0)) - fprintf (fd, "high\n") ; - else if ((strcasecmp (mode, "low") == 0) || (strcasecmp (mode, "down") == 0)) - fprintf (fd, "low\n") ; - else - { - fprintf (stderr, "%s: Invalid mode: %s. Should be in, out, high or low\n", argv [1], mode) ; - exit (1) ; - } - - fclose (fd) ; - -// Change ownership so the current user can actually use it - - sprintf (fName, "/sys/class/gpio/gpio%d/value", pin) ; - changeOwner (argv [0], fName) ; - - sprintf (fName, "/sys/class/gpio/gpio%d/edge", pin) ; - changeOwner (argv [0], fName) ; + // Change ownership so the current user can actually use it + sprintf (fName, "/sys/class/gpio/gpio%d/value", pin) ; + changeOwner (argv [0], fName) ; + sprintf (fName, "/sys/class/gpio/gpio%d/edge", pin) ; + changeOwner (argv [0], fName) ; } @@ -542,43 +388,37 @@ void doExport (int argc, char *argv []) * to exit the program. Crude but effective. ********************************************************************************* */ - -static void wfi (void) - { exit (0) ; } +static void wfi (void) { exit (0) ; } void doWfi (int argc, char *argv []) { - int pin, mode ; + int pin, mode ; - if (argc != 4) - { - fprintf (stderr, "Usage: %s wfi pin mode\n", argv [0]) ; - exit (1) ; - } + if (argc != 4) { + fprintf (stderr, "Usage: %s wfi pin mode\n", argv [0]) ; + exit (1) ; + } - pin = atoi (argv [2]) ; + pin = atoi (argv [2]) ; - /**/ if (strcasecmp (argv [3], "rising") == 0) mode = INT_EDGE_RISING ; - else if (strcasecmp (argv [3], "falling") == 0) mode = INT_EDGE_FALLING ; - else if (strcasecmp (argv [3], "both") == 0) mode = INT_EDGE_BOTH ; - else - { - fprintf (stderr, "%s: wfi: Invalid mode: %s. Should be rising, falling or both\n", argv [1], argv [3]) ; - exit (1) ; - } + if (strcasecmp (argv [3], "rising") == 0) mode = INT_EDGE_RISING ; + else if (strcasecmp (argv [3], "falling") == 0) mode = INT_EDGE_FALLING ; + else if (strcasecmp (argv [3], "both") == 0) mode = INT_EDGE_BOTH ; + else { + fprintf (stderr, "%s: wfi: Invalid mode: %s. Should be rising, falling or both\n", argv [1], argv [3]) ; + exit (1) ; + } - if (wiringPiISR (pin, mode, &wfi) < 0) - { - fprintf (stderr, "%s: wfi: Unable to setup ISR: %s\n", argv [1], strerror (errno)) ; - exit (1) ; - } + if (wiringPiISR (pin, mode, &wfi) < 0) { + fprintf (stderr, "%s: wfi: Unable to setup ISR: %s\n", argv [1], strerror (errno)) ; + exit (1) ; + } - for (;;) - delay (9999) ; + for (;;) + delay (9999) ; } - /* * doEdge: * gpio edge pin mode @@ -589,67 +429,61 @@ void doWfi (int argc, char *argv []) void doEdge (int argc, char *argv []) { - FILE *fd ; - int pin ; - char *mode ; - char fName [128] ; + FILE *fd ; + int pin ; + char *mode ; + char fName [128] ; - if (argc != 4) - { - fprintf (stderr, "Usage: %s edge pin mode\n", argv [0]) ; - exit (1) ; - } + // Reset gpio sysfs + doUnexport(3, argv); - pin = atoi (argv [2]) ; - mode = argv [3] ; + if (argc != 4) { + fprintf (stderr, "Usage: %s edge pin mode\n", argv [0]) ; + exit (1) ; + } -// Export the pin and set direction to input + pin = atoi (argv [2]) ; + mode = argv [3] ; - if ((fd = fopen ("/sys/class/gpio/export", "w")) == NULL) - { - fprintf (stderr, "%s: Unable to open GPIO export interface: %s\n", argv [0], strerror (errno)) ; - exit (1) ; - } + // Export the pin and set direction to input + if ((fd = fopen ("/sys/class/gpio/export", "w")) == NULL) { + fprintf (stderr, "%s: Unable to open GPIO export interface: %s\n", argv [0], strerror (errno)) ; + exit (1) ; + } + fprintf (fd, "%d\n", pin) ; + fclose (fd) ; - fprintf (fd, "%d\n", pin) ; - fclose (fd) ; + sprintf (fName, "/sys/class/gpio/gpio%d/direction", pin) ; + if ((fd = fopen (fName, "w")) == NULL) { + fprintf (stderr, "%s: Unable to open GPIO direction interface for pin %d: %s\n", argv [0], pin, strerror (errno)) ; + exit (1) ; + } + fprintf (fd, "in\n") ; + fclose (fd) ; - sprintf (fName, "/sys/class/gpio/gpio%d/direction", pin) ; - if ((fd = fopen (fName, "w")) == NULL) - { - fprintf (stderr, "%s: Unable to open GPIO direction interface for pin %d: %s\n", argv [0], pin, strerror (errno)) ; - exit (1) ; - } + sprintf (fName, "/sys/class/gpio/gpio%d/edge", pin) ; + if ((fd = fopen (fName, "w")) == NULL) { + fprintf (stderr, "%s: Unable to open GPIO edge interface for pin %d: %s\n", argv [0], pin, strerror (errno)) ; + exit (1) ; + } - fprintf (fd, "in\n") ; - fclose (fd) ; + if (strcasecmp (mode, "none") == 0) fprintf (fd, "none\n") ; + else if (strcasecmp (mode, "rising") == 0) fprintf (fd, "rising\n") ; + else if (strcasecmp (mode, "falling") == 0) fprintf (fd, "falling\n") ; + else if (strcasecmp (mode, "both") == 0) fprintf (fd, "both\n") ; + else { + fprintf (stderr, "%s: Invalid mode: %s. Should be none, rising, falling or both\n", argv [1], mode) ; + exit (1) ; + } - sprintf (fName, "/sys/class/gpio/gpio%d/edge", pin) ; - if ((fd = fopen (fName, "w")) == NULL) - { - fprintf (stderr, "%s: Unable to open GPIO edge interface for pin %d: %s\n", argv [0], pin, strerror (errno)) ; - exit (1) ; - } + // Change ownership of the value and edge files, so the current user can actually use it! + sprintf (fName, "/sys/class/gpio/gpio%d/value", pin) ; + changeOwner (argv [0], fName) ; - /**/ if (strcasecmp (mode, "none") == 0) fprintf (fd, "none\n") ; - else if (strcasecmp (mode, "rising") == 0) fprintf (fd, "rising\n") ; - else if (strcasecmp (mode, "falling") == 0) fprintf (fd, "falling\n") ; - else if (strcasecmp (mode, "both") == 0) fprintf (fd, "both\n") ; - else - { - fprintf (stderr, "%s: Invalid mode: %s. Should be none, rising, falling or both\n", argv [1], mode) ; - exit (1) ; - } + sprintf (fName, "/sys/class/gpio/gpio%d/edge", pin) ; + changeOwner (argv [0], fName) ; -// Change ownership of the value and edge files, so the current user can actually use it! - - sprintf (fName, "/sys/class/gpio/gpio%d/value", pin) ; - changeOwner (argv [0], fName) ; - - sprintf (fName, "/sys/class/gpio/gpio%d/edge", pin) ; - changeOwner (argv [0], fName) ; - - fclose (fd) ; + fclose (fd) ; } @@ -662,25 +496,23 @@ void doEdge (int argc, char *argv []) void doUnexport (int argc, char *argv []) { - FILE *fd ; - int pin ; + FILE *fd ; + int pin ; - if (argc != 3) - { - fprintf (stderr, "Usage: %s unexport pin\n", argv [0]) ; - exit (1) ; - } + if (argc != 3) { + fprintf (stderr, "Usage: %s unexport pin\n", argv [0]) ; + exit (1) ; + } - pin = atoi (argv [2]) ; + pin = atoi (argv [2]) ; - if ((fd = fopen ("/sys/class/gpio/unexport", "w")) == NULL) - { - fprintf (stderr, "%s: Unable to open GPIO export interface\n", argv [0]) ; - exit (1) ; - } + if ((fd = fopen ("/sys/class/gpio/unexport", "w")) == NULL) { + fprintf (stderr, "%s: Unable to open GPIO export interface\n", argv [0]) ; + exit (1) ; + } - fprintf (fd, "%d\n", pin) ; - fclose (fd) ; + fprintf (fd, "%d\n", pin) ; + fclose (fd) ; } @@ -694,19 +526,17 @@ void doUnexport (int argc, char *argv []) void doUnexportall (char *progName) { - FILE *fd ; - int pin ; + FILE *fd ; + int pin ; - for (pin = 0 ; pin < 63 ; ++pin) - { - if ((fd = fopen ("/sys/class/gpio/unexport", "w")) == NULL) - { - fprintf (stderr, "%s: Unable to open GPIO export interface\n", progName) ; - exit (1) ; - } - fprintf (fd, "%d\n", pin) ; - fclose (fd) ; - } + for (pin = 0 ; pin < 256 ; ++pin) { + if ((fd = fopen ("/sys/class/gpio/unexport", "w")) == NULL) { + fprintf (stderr, "%s: Unable to open GPIO export interface\n", progName) ; + exit (1) ; + } + fprintf (fd, "%d\n", pin) ; + fclose (fd) ; + } } @@ -718,9 +548,9 @@ void doUnexportall (char *progName) static void doReset (UNU char *progName) { - printf ("GPIO Reset is dangerous and has been removed from the gpio command.\n") ; - printf (" - Please write a shell-script to reset the GPIO pins into the state\n") ; - printf (" that you need them in for your applications.\n") ; + printf ("GPIO Reset is dangerous and has been removed from the gpio command.\n") ; + printf (" - Please write a shell-script to reset the GPIO pins into the state\n") ; + printf (" that you need them in for your applications.\n") ; } @@ -732,128 +562,60 @@ static void doReset (UNU char *progName) void doMode (int argc, char *argv []) { - int pin ; - char *mode ; + int pin ; + char *mode ; - if (argc != 4) - { - fprintf (stderr, "Usage: %s mode pin mode\n", argv [0]) ; - exit (1) ; - } + if (argc != 4) { + fprintf (stderr, "Usage: %s mode pin mode\n", argv [0]) ; + exit (1) ; + } - pin = atoi (argv [2]) ; + pin = atoi (argv [2]) ; + mode = argv [3] ; - mode = argv [3] ; - - /**/ if (strcasecmp (mode, "in") == 0) pinMode (pin, INPUT) ; - else if (strcasecmp (mode, "input") == 0) pinMode (pin, INPUT) ; - else if (strcasecmp (mode, "out") == 0) pinMode (pin, OUTPUT) ; - else if (strcasecmp (mode, "output") == 0) pinMode (pin, OUTPUT) ; - else if (strcasecmp (mode, "pwm") == 0) pinMode (pin, PWM_OUTPUT) ; - else if (strcasecmp (mode, "pwmTone") == 0) pinMode (pin, PWM_TONE_OUTPUT) ; - else if (strcasecmp (mode, "clock") == 0) pinMode (pin, GPIO_CLOCK) ; - else if (strcasecmp (mode, "up") == 0) pullUpDnControl (pin, PUD_UP) ; - else if (strcasecmp (mode, "down") == 0) pullUpDnControl (pin, PUD_DOWN) ; - else if (strcasecmp (mode, "tri") == 0) pullUpDnControl (pin, PUD_OFF) ; - else if (strcasecmp (mode, "off") == 0) pullUpDnControl (pin, PUD_OFF) ; - else if (strcasecmp (mode, "alt0") == 0) pinModeAlt (pin, 0b100) ; - else if (strcasecmp (mode, "alt1") == 0) pinModeAlt (pin, 0b101) ; - else if (strcasecmp (mode, "alt2") == 0) pinModeAlt (pin, 0b110) ; - else if (strcasecmp (mode, "alt3") == 0) pinModeAlt (pin, 0b111) ; - else if (strcasecmp (mode, "alt4") == 0) pinModeAlt (pin, 0b011) ; - else if (strcasecmp (mode, "alt5") == 0) pinModeAlt (pin, 0b010) ; - else - { - fprintf (stderr, "%s: Invalid mode: %s. Should be in/out/pwm/clock/up/down/tri\n", argv [1], mode) ; - exit (1) ; - } + if (strcasecmp (mode, "in") == 0) pinMode (pin, INPUT) ; + else if (strcasecmp (mode, "input") == 0) pinMode (pin, INPUT) ; + else if (strcasecmp (mode, "out") == 0) pinMode (pin, OUTPUT) ; + else if (strcasecmp (mode, "output") == 0) pinMode (pin, OUTPUT) ; + else if (strcasecmp (mode, "pwm") == 0) pinMode (pin, PWM_OUTPUT) ; + else if (strcasecmp (mode, "pwmTone") == 0) pinMode (pin, PWM_TONE_OUTPUT) ; + else if (strcasecmp (mode, "clock") == 0) pinMode (pin, GPIO_CLOCK) ; + else if (strcasecmp (mode, "up") == 0) pullUpDnControl (pin, PUD_UP) ; + else if (strcasecmp (mode, "down") == 0) pullUpDnControl (pin, PUD_DOWN) ; + else if (strcasecmp (mode, "tri") == 0) pullUpDnControl (pin, PUD_OFF) ; + else if (strcasecmp (mode, "off") == 0) pullUpDnControl (pin, PUD_OFF) ; + else if (strcasecmp (mode, "alt0") == 0) pinModeAlt (pin, 0b100) ; + else if (strcasecmp (mode, "alt1") == 0) pinModeAlt (pin, 0b101) ; + else if (strcasecmp (mode, "alt2") == 0) pinModeAlt (pin, 0b110) ; + else if (strcasecmp (mode, "alt3") == 0) pinModeAlt (pin, 0b111) ; + else if (strcasecmp (mode, "alt4") == 0) pinModeAlt (pin, 0b011) ; + else if (strcasecmp (mode, "alt5") == 0) pinModeAlt (pin, 0b010) ; + else { + fprintf (stderr, "%s: Invalid mode: %s. Should be in/out/pwm/clock/up/down/tri\n", argv [1], mode) ; + exit (1) ; + } } /* * doPadDrive: - * gpio drive group value + * gpio drive pin value for ODROIDs since it depends on the SoC ********************************************************************************* */ static void doPadDrive (int argc, char *argv []) { - int group, val ; + int pin, val; - if (argc != 4) - { - fprintf (stderr, "Usage: %s drive group value\n", argv [0]) ; - exit (1) ; - } + if (argc != 4) { + fprintf (stderr, "Usage: %s drive pin value\n", argv [0]) ; + exit (1) ; + } - group = atoi (argv [2]) ; - val = atoi (argv [3]) ; + pin = atoi (argv [2]) ; + val = atoi (argv [3]) ; - if ((group < 0) || (group > 2)) - { - fprintf (stderr, "%s: drive group not 0, 1 or 2: %d\n", argv [0], group) ; - exit (1) ; - } - - if ((val < 0) || (val > 7)) - { - fprintf (stderr, "%s: drive value not 0-7: %d\n", argv [0], val) ; - exit (1) ; - } - - setPadDrive (group, val) ; -} - - -/* - * doUsbP: - * Control USB Power - High (1.2A) or Low (600mA) - * gpio usbp high/low - ********************************************************************************* - */ - -static void doUsbP (int argc, char *argv []) -{ - int model, rev, mem, maker, overVolted ; - - if (argc != 3) - { - fprintf (stderr, "Usage: %s usbp high|low\n", argv [0]) ; - exit (1) ; - } - -// Make sure we're on a B+ - - piBoardId (&model, &rev, &mem, &maker, &overVolted) ; - - if (!((model == PI_MODEL_BP) || (model == PI_MODEL_2))) - { - fprintf (stderr, "USB power contol is applicable to B+ and v2 boards only.\n") ; - exit (1) ; - } - -// Make sure we start in BCM_GPIO mode - - wiringPiSetupGpio () ; - - if ((strcasecmp (argv [2], "high") == 0) || (strcasecmp (argv [2], "hi") == 0)) - { - digitalWrite (PI_USB_POWER_CONTROL, 1) ; - pinMode (PI_USB_POWER_CONTROL, OUTPUT) ; - printf ("Switched to HIGH current USB (1.2A)\n") ; - return ; - } - - if ((strcasecmp (argv [2], "low") == 0) || (strcasecmp (argv [2], "lo") == 0)) - { - digitalWrite (PI_USB_POWER_CONTROL, 0) ; - pinMode (PI_USB_POWER_CONTROL, OUTPUT) ; - printf ("Switched to LOW current USB (600mA)\n") ; - return ; - } - - fprintf (stderr, "Usage: %s usbp high|low\n", argv [0]) ; - exit (1) ; + setPadDrive (pin, val) ; } @@ -866,36 +628,32 @@ static void doUsbP (int argc, char *argv []) static void doGbw (int argc, char *argv []) { - int channel, value ; + int channel, value ; - if (argc != 4) - { - fprintf (stderr, "Usage: %s gbw \n", argv [0]) ; - exit (1) ; - } + if (argc != 4) { + fprintf (stderr, "Usage: %s gbw \n", argv [0]) ; + exit (1) ; + } - channel = atoi (argv [2]) ; - value = atoi (argv [3]) ; + channel = atoi (argv [2]) ; + value = atoi (argv [3]) ; - if ((channel < 0) || (channel > 1)) - { - fprintf (stderr, "%s: gbw: Channel number must be 0 or 1\n", argv [0]) ; - exit (1) ; - } + if ((channel < 0) || (channel > 1)) { + fprintf (stderr, "%s: gbw: Channel number must be 0 or 1\n", argv [0]) ; + exit (1) ; + } - if ((value < 0) || (value > 255)) - { - fprintf (stderr, "%s: gbw: Value must be from 0 to 255\n", argv [0]) ; - exit (1) ; - } + if ((value < 0) || (value > 255)) { + fprintf (stderr, "%s: gbw: Value must be from 0 to 255\n", argv [0]) ; + exit (1) ; + } - if (gertboardAnalogSetup (64) < 0) - { - fprintf (stderr, "Unable to initialise the Gertboard SPI interface: %s\n", strerror (errno)) ; - exit (1) ; - } + if (gertboardAnalogSetup (64) < 0) { + fprintf (stderr, "Unable to initialise the Gertboard SPI interface: %s\n", strerror (errno)) ; + exit (1) ; + } - analogWrite (64 + channel, value) ; + analogWrite (64 + channel, value) ; } @@ -905,32 +663,28 @@ static void doGbw (int argc, char *argv []) * From the analog input ********************************************************************************* */ - static void doGbr (int argc, char *argv []) { - int channel ; + int channel ; - if (argc != 3) - { - fprintf (stderr, "Usage: %s gbr \n", argv [0]) ; - exit (1) ; - } + if (argc != 3) { + fprintf (stderr, "Usage: %s gbr \n", argv [0]) ; + exit (1) ; + } - channel = atoi (argv [2]) ; + channel = atoi (argv [2]) ; - if ((channel < 0) || (channel > 1)) - { - fprintf (stderr, "%s: gbr: Channel number must be 0 or 1\n", argv [0]) ; - exit (1) ; - } + if ((channel < 0) || (channel > 1)) { + fprintf (stderr, "%s: gbr: Channel number must be 0 or 1\n", argv [0]) ; + exit (1) ; + } - if (gertboardAnalogSetup (64) < 0) - { - fprintf (stderr, "Unable to initialise the Gertboard SPI interface: %s\n", strerror (errno)) ; - exit (1) ; - } + if (gertboardAnalogSetup (64) < 0) { + fprintf (stderr, "Unable to initialise the Gertboard SPI interface: %s\n", strerror (errno)) ; + exit (1) ; + } - printf ("%d\n", analogRead (64 + channel)) ; + printf ("%d\n", analogRead (64 + channel)) ; } @@ -942,27 +696,26 @@ static void doGbr (int argc, char *argv []) static void doWrite (int argc, char *argv []) { - int pin, val ; + int pin, val ; - if (argc != 4) - { - fprintf (stderr, "Usage: %s write pin value\n", argv [0]) ; - exit (1) ; - } + if (argc != 4) { + fprintf (stderr, "Usage: %s write pin value\n", argv [0]) ; + exit (1) ; + } - pin = atoi (argv [2]) ; + pin = atoi (argv [2]) ; - /**/ if ((strcasecmp (argv [3], "up") == 0) || (strcasecmp (argv [3], "on") == 0)) - val = 1 ; - else if ((strcasecmp (argv [3], "down") == 0) || (strcasecmp (argv [3], "off") == 0)) - val = 0 ; - else - val = atoi (argv [3]) ; + if ((strcasecmp (argv [3], "up") == 0) || (strcasecmp (argv [3], "on") == 0)) + val = 1 ; + else if ((strcasecmp (argv [3], "down") == 0) || (strcasecmp (argv [3], "off") == 0)) + val = 0 ; + else + val = atoi (argv [3]) ; - /**/ if (val == 0) - digitalWrite (pin, LOW) ; - else - digitalWrite (pin, HIGH) ; + if (val == 0) + digitalWrite (pin, LOW) ; + else + digitalWrite (pin, HIGH) ; } @@ -974,19 +727,16 @@ static void doWrite (int argc, char *argv []) static void doAwrite (int argc, char *argv []) { - int pin, val ; + int pin, val ; - if (argc != 4) - { - fprintf (stderr, "Usage: %s awrite pin value\n", argv [0]) ; - exit (1) ; - } + if (argc != 4) { + fprintf (stderr, "Usage: %s awrite pin value\n", argv [0]) ; + exit (1) ; + } + pin = atoi (argv [2]) ; + val = atoi (argv [3]) ; - pin = atoi (argv [2]) ; - - val = atoi (argv [3]) ; - - analogWrite (pin, val) ; + analogWrite (pin, val) ; } @@ -998,17 +748,15 @@ static void doAwrite (int argc, char *argv []) static void doWriteByte (int argc, char *argv []) { - int val ; + int val ; - if (argc != 3) - { - fprintf (stderr, "Usage: %s wb value\n", argv [0]) ; - exit (1) ; - } + if (argc != 3) { + fprintf (stderr, "Usage: %s wb value\n", argv [0]) ; + exit (1) ; + } + val = (int)strtol (argv [2], NULL, 0) ; - val = (int)strtol (argv [2], NULL, 0) ; - - digitalWriteByte (val) ; + digitalWriteByte (val) ; } @@ -1020,19 +768,18 @@ static void doWriteByte (int argc, char *argv []) static void doReadByte (int argc, char *argv [], int printHex) { - int val ; + int val ; - if (argc != 2) - { - fprintf (stderr, "Usage: %s rbx|rbd\n", argv [0]) ; - exit (1) ; - } + if (argc != 2) { + fprintf (stderr, "Usage: %s rbx|rbd\n", argv [0]) ; + exit (1) ; + } - val = digitalReadByte () ; - if (printHex) - printf ("%02X\n", val) ; - else - printf ("%d\n", val) ; + val = digitalReadByte () ; + if (printHex) + printf ("%02X\n", val) ; + else + printf ("%d\n", val) ; } @@ -1044,18 +791,16 @@ static void doReadByte (int argc, char *argv [], int printHex) void doRead (int argc, char *argv []) { - int pin, val ; + int pin, val ; - if (argc != 3) - { - fprintf (stderr, "Usage: %s read pin\n", argv [0]) ; - exit (1) ; - } + if (argc != 3) { + fprintf (stderr, "Usage: %s read pin\n", argv [0]) ; + exit (1) ; + } + pin = atoi (argv [2]) ; + val = digitalRead (pin) ; - pin = atoi (argv [2]) ; - val = digitalRead (pin) ; - - printf ("%s\n", val == 0 ? "0" : "1") ; + printf ("%s\n", val == 0 ? "0" : "1") ; } @@ -1067,13 +812,11 @@ void doRead (int argc, char *argv []) void doAread (int argc, char *argv []) { - if (argc != 3) - { - fprintf (stderr, "Usage: %s aread pin\n", argv [0]) ; - exit (1) ; - } - - printf ("%d\n", analogRead (atoi (argv [2]))) ; + if (argc != 3) { + fprintf (stderr, "Usage: %s aread pin\n", argv [0]) ; + exit (1) ; + } + printf ("%d\n", analogRead (atoi (argv [2]))) ; } @@ -1085,17 +828,15 @@ void doAread (int argc, char *argv []) void doToggle (int argc, char *argv []) { - int pin ; + int pin ; - if (argc != 3) - { - fprintf (stderr, "Usage: %s toggle pin\n", argv [0]) ; - exit (1) ; - } + if (argc != 3) { + fprintf (stderr, "Usage: %s toggle pin\n", argv [0]) ; + exit (1) ; + } + pin = atoi (argv [2]) ; - pin = atoi (argv [2]) ; - - digitalWrite (pin, !digitalRead (pin)) ; + digitalWrite (pin, !digitalRead (pin)) ; } @@ -1107,23 +848,20 @@ void doToggle (int argc, char *argv []) void doBlink (int argc, char *argv []) { - int pin ; + int pin ; - if (argc != 3) - { - fprintf (stderr, "Usage: %s blink pin\n", argv [0]) ; - exit (1) ; - } + if (argc != 3) { + fprintf (stderr, "Usage: %s blink pin\n", argv [0]) ; + exit (1) ; + } - pin = atoi (argv [2]) ; - - pinMode (pin, OUTPUT) ; - for (;;) - { - digitalWrite (pin, !digitalRead (pin)) ; - delay (500) ; - } + pin = atoi (argv [2]) ; + pinMode (pin, OUTPUT) ; + for (;;) { + digitalWrite (pin, !digitalRead (pin)) ; + delay (500) ; + } } @@ -1135,18 +873,17 @@ void doBlink (int argc, char *argv []) void doPwmTone (int argc, char *argv []) { - int pin, freq ; + int pin, freq ; - if (argc != 4) - { - fprintf (stderr, "Usage: %s pwmTone \n", argv [0]) ; - exit (1) ; - } + if (argc != 4) { + fprintf (stderr, "Usage: %s pwmTone \n", argv [0]) ; + exit (1) ; + } - pin = atoi (argv [2]) ; - freq = atoi (argv [3]) ; + pin = atoi (argv [2]) ; + freq = atoi (argv [3]) ; - pwmToneWrite (pin, freq) ; + pwmToneWrite (pin, freq) ; } @@ -1158,19 +895,18 @@ void doPwmTone (int argc, char *argv []) void doClock (int argc, char *argv []) { - int pin, freq ; + int pin, freq ; - if (argc != 4) - { - fprintf (stderr, "Usage: %s clock \n", argv [0]) ; - exit (1) ; - } + if (argc != 4) { + fprintf (stderr, "Usage: %s clock \n", argv [0]) ; + exit (1) ; + } - pin = atoi (argv [2]) ; + pin = atoi (argv [2]) ; - freq = atoi (argv [3]) ; + freq = atoi (argv [3]) ; - gpioClockSet (pin, freq) ; + gpioClockSet (pin, freq) ; } @@ -1182,19 +918,16 @@ void doClock (int argc, char *argv []) void doPwm (int argc, char *argv []) { - int pin, val ; + int pin, val ; - if (argc != 4) - { - fprintf (stderr, "Usage: %s pwm \n", argv [0]) ; - exit (1) ; - } + if (argc != 4) { + fprintf (stderr, "Usage: %s pwm \n", argv [0]) ; + exit (1) ; + } + pin = atoi (argv [2]) ; + val = atoi (argv [3]) ; - pin = atoi (argv [2]) ; - - val = atoi (argv [3]) ; - - pwmWrite (pin, val) ; + pwmWrite (pin, val) ; } @@ -1206,51 +939,55 @@ void doPwm (int argc, char *argv []) static void doPwmMode (int mode) { - pwmSetMode (mode) ; + pwmSetMode (mode) ; } static void doPwmRange (int argc, char *argv []) { - unsigned int range ; + unsigned int range ; - if (argc != 3) - { - fprintf (stderr, "Usage: %s pwmr \n", argv [0]) ; - exit (1) ; - } + if (argc != 3) { + fprintf (stderr, "Usage: %s pwmr \n", argv [0]) ; + exit (1) ; + } - range = (unsigned int)strtoul (argv [2], NULL, 10) ; + range = (unsigned int)strtoul (argv [2], NULL, 10) ; - if (range == 0) - { - fprintf (stderr, "%s: range must be > 0\n", argv [0]) ; - exit (1) ; - } - - pwmSetRange (range) ; + if (range == 0) { + fprintf (stderr, "%s: range must be > 0\n", argv [0]) ; + exit (1) ; + } + pwmSetRange (range) ; } static void doPwmClock (int argc, char *argv []) { - unsigned int clock ; + unsigned int clock ; - if (argc != 3) - { - fprintf (stderr, "Usage: %s pwmc \n", argv [0]) ; - exit (1) ; - } + if (argc != 3) { + fprintf (stderr, "Usage: %s pwmc \n", argv [0]) ; + exit (1) ; + } - clock = (unsigned int)strtoul (argv [2], NULL, 10) ; + clock = (unsigned int)strtoul (argv [2], NULL, 10) ; - if ((clock < 1) || (clock > 4095)) - { - fprintf (stderr, "%s: clock must be between 0 and 4096\n", argv [0]) ; - exit (1) ; - } - - pwmSetClock (clock) ; + if ((clock < 1) || (clock > 4095)) { + fprintf (stderr, "%s: clock must be between 0 and 4096\n", argv [0]) ; + exit (1) ; + } + pwmSetClock (clock) ; } +/* + * doNothing: + * function is not support by ODROID Board. + ********************************************************************************* + */ +static void doNothing (int argc, char *argv []) +{ + fprintf(stderr, "warn : (%s) : This function is not supported by ODROID Board.\n", + argv[1]); +} /* * doVersion: @@ -1258,47 +995,50 @@ static void doPwmClock (int argc, char *argv []) * some usefull information. ********************************************************************************* */ - static void doVersion (char *argv []) { - int model, rev, mem, maker, warranty ; - struct stat statBuf ; - char name [80] ; - FILE *fd ; + int model, rev, mem, maker, warranty ; + struct stat statBuf ; + char name [80] ; + FILE *fd ; - int vMaj, vMin ; + int vMaj, vMin ; - wiringPiVersion (&vMaj, &vMin) ; - printf ("gpio version: %d.%d\n", vMaj, vMin) ; - printf ("Copyright (c) 2012-2017 Gordon Henderson\n") ; - printf ("This is free software with ABSOLUTELY NO WARRANTY.\n") ; - printf ("For details type: %s -warranty\n", argv [0]) ; - printf ("\n") ; - piBoardId (&model, &rev, &mem, &maker, &warranty) ; + wiringPiVersion (&vMaj, &vMin) ; + printf ("gpio version: %d.%d\n", vMaj, vMin) ; + printf ("Copyright (c) 2012-2017 Gordon Henderson\n") ; + printf ("This is free software with ABSOLUTELY NO WARRANTY.\n") ; + printf ("For details type: %s -warranty\n", argv [0]) ; + printf ("\n") ; + piBoardId (&model, &rev, &mem, &maker, &warranty) ; - printf ("Raspberry Pi Details:\n") ; - printf (" Type: %s, Revision: %s, Memory: %dMB, Maker: %s %s\n", - piModelNames [model], piRevisionNames [rev], piMemorySize [mem], piMakerNames [maker], warranty ? "[Out of Warranty]" : "") ; + printf ("ODROID Board Details:\n") ; + printf (" Type: %s, Revision: %s, Memory: %dMB\n" \ + " Maker: %s, Chip-Vendor: %s\n", + piModelNames [model], + piRevisionNames [rev], + piMemorySize [mem], + "Hardkernel", + piMakerNames [maker]); -// Check for device tree + // Check for device tree + if (stat ("/proc/device-tree", &statBuf) == 0) // We're on a devtree system ... + printf (" * Device tree is enabled.\n") ; - if (stat ("/proc/device-tree", &statBuf) == 0) // We're on a devtree system ... - printf (" * Device tree is enabled.\n") ; + // Output Kernel idea of board type + if (stat ("/proc/device-tree/model", &statBuf) == 0) { + if ((fd = fopen ("/proc/device-tree/model", "r")) != NULL) { + fgets (name, 80, fd) ; + fclose (fd) ; + printf (" *--> %s\n", name) ; + } + } - if (stat ("/proc/device-tree/model", &statBuf) == 0) // Output Kernel idea of board type - { - if ((fd = fopen ("/proc/device-tree/model", "r")) != NULL) - { - fgets (name, 80, fd) ; - fclose (fd) ; - printf (" *--> %s\n", name) ; - } - } - - if (stat ("/dev/gpiomem", &statBuf) == 0) // User level GPIO is GO - printf (" * This Raspberry Pi supports user-level GPIO access.\n") ; - else - printf (" * Root or sudo required for GPIO access.\n") ; + // User level GPIO is GO + if (stat ("/dev/gpiomem", &statBuf) == 0) + printf (" * Supports user-level GPIO access.\n") ; + else + printf (" * Root or sudo required for GPIO access.\n") ; } @@ -1310,226 +1050,177 @@ static void doVersion (char *argv []) int main (int argc, char *argv []) { - int i ; + int i ; - if (getenv ("WIRINGPI_DEBUG") != NULL) - { - printf ("gpio: wiringPi debug mode enabled\n") ; - wiringPiDebug = TRUE ; - } + if (getenv ("WIRINGPI_DEBUG") != NULL) { + printf ("gpio: wiringPi debug mode enabled\n") ; + wiringPiDebug = TRUE ; + } - if (argc == 1) - { - fprintf (stderr, "%s\n", usage) ; - return 1 ; - } + if (argc == 1) { + fprintf (stderr, "%s\n", usage) ; + return 1 ; + } -// Help + // Help + if (strcasecmp (argv [1], "-h") == 0) { + printf ("%s: %s\n", argv [0], usage) ; + return 0 ; + } - if (strcasecmp (argv [1], "-h") == 0) - { - printf ("%s: %s\n", argv [0], usage) ; - return 0 ; - } + // Version & Warranty + // Wish I could remember why I have both -R and -V ... + if ((strcmp (argv [1], "-R") == 0) || (strcmp (argv [1], "-V") == 0)) { + printf ("%d\n", piGpioLayout ()) ; + return 0 ; + } -// Version & Warranty -// Wish I could remember why I have both -R and -V ... + // Version and information + if (strcmp (argv [1], "-v") == 0) { + doVersion (argv) ; + return 0 ; + } - if ((strcmp (argv [1], "-R") == 0) || (strcmp (argv [1], "-V") == 0)) - { - printf ("%d\n", piGpioLayout ()) ; - return 0 ; - } + if (strcasecmp (argv [1], "-warranty") == 0) { + printf ("gpio version: %s\n", VERSION) ; + printf ("Copyright (c) 2012-2017 Gordon Henderson\n") ; + printf ("\n") ; + printf (" This program is free software; you can redistribute it and/or modify\n") ; + printf (" it under the terms of the GNU Leser General Public License as published\n") ; + printf (" by the Free Software Foundation, either version 3 of the License, or\n") ; + printf (" (at your option) any later version.\n") ; + printf ("\n") ; + printf (" This program is distributed in the hope that it will be useful,\n") ; + printf (" but WITHOUT ANY WARRANTY; without even the implied warranty of\n") ; + printf (" MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n") ; + printf (" GNU Lesser General Public License for more details.\n") ; + printf ("\n") ; + printf (" You should have received a copy of the GNU Lesser General Public License\n") ; + printf (" along with this program. If not, see .\n") ; + printf ("\n") ; + return 0 ; + } -// Version and information + if (geteuid () != 0) { + fprintf (stderr, "%s: Must be root to run. Program should be suid root. This is an error.\n", argv [0]) ; + return 1 ; + } - if (strcmp (argv [1], "-v") == 0) - { - doVersion (argv) ; - return 0 ; - } + // Initial test for /sys/class/gpio operations: + if (strcasecmp (argv [1], "exports" ) == 0) { doExports (argc, argv) ; return 0 ; } + else if (strcasecmp (argv [1], "export" ) == 0) { doExport (argc, argv) ; return 0 ; } + else if (strcasecmp (argv [1], "edge" ) == 0) { doEdge (argc, argv) ; return 0 ; } + else if (strcasecmp (argv [1], "unexport" ) == 0) { doUnexport (argc, argv) ; return 0 ; } + else if (strcasecmp (argv [1], "unexportall") == 0) { doUnexportall (argv [0]) ; return 0 ; } - if (strcasecmp (argv [1], "-warranty") == 0) - { - printf ("gpio version: %s\n", VERSION) ; - printf ("Copyright (c) 2012-2017 Gordon Henderson\n") ; - printf ("\n") ; - printf (" This program is free software; you can redistribute it and/or modify\n") ; - printf (" it under the terms of the GNU Leser General Public License as published\n") ; - printf (" by the Free Software Foundation, either version 3 of the License, or\n") ; - printf (" (at your option) any later version.\n") ; - printf ("\n") ; - printf (" This program is distributed in the hope that it will be useful,\n") ; - printf (" but WITHOUT ANY WARRANTY; without even the implied warranty of\n") ; - printf (" MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n") ; - printf (" GNU Lesser General Public License for more details.\n") ; - printf ("\n") ; - printf (" You should have received a copy of the GNU Lesser General Public License\n") ; - printf (" along with this program. If not, see .\n") ; - printf ("\n") ; - return 0 ; - } + // Check for load command: + if (strcasecmp (argv [1], "load" ) == 0) { doLoad (argc, argv) ; return 0 ; } + if (strcasecmp (argv [1], "unload" ) == 0) { doUnLoad (argc, argv) ; return 0 ; } - if (geteuid () != 0) - { - fprintf (stderr, "%s: Must be root to run. Program should be suid root. This is an error.\n", argv [0]) ; - return 1 ; - } + // Check for usb power command + if (strcasecmp (argv [1], "usbp" ) == 0) { doNothing(argc, argv) ; return 0 ; } -// Initial test for /sys/class/gpio operations: + // Gertboard commands + if (strcasecmp (argv [1], "gbr" ) == 0) { doGbr (argc, argv) ; return 0 ; } + if (strcasecmp (argv [1], "gbw" ) == 0) { doGbw (argc, argv) ; return 0 ; } - /**/ if (strcasecmp (argv [1], "exports" ) == 0) { doExports (argc, argv) ; return 0 ; } - else if (strcasecmp (argv [1], "export" ) == 0) { doExport (argc, argv) ; return 0 ; } - else if (strcasecmp (argv [1], "edge" ) == 0) { doEdge (argc, argv) ; return 0 ; } - else if (strcasecmp (argv [1], "unexport" ) == 0) { doUnexport (argc, argv) ; return 0 ; } - else if (strcasecmp (argv [1], "unexportall") == 0) { doUnexportall (argv [0]) ; return 0 ; } + // Check for allreadall command, force Gpio mode + if (strcasecmp (argv [1], "allreadall") == 0) { + wiringPiSetupGpio () ; + doAllReadall () ; + return 0 ; + } -// Check for load command: + if (strcasecmp (argv [1], "-g") == 0) { // Check for -g argument + wiringPiSetupGpio () ; - if (strcasecmp (argv [1], "load" ) == 0) { doLoad (argc, argv) ; return 0 ; } - if (strcasecmp (argv [1], "unload" ) == 0) { doUnLoad (argc, argv) ; return 0 ; } + for (i = 2 ; i < argc ; ++i) + argv [i - 1] = argv [i] ; + --argc ; + wpMode = MODE_GPIO ; + } else if (strcasecmp (argv [1], "-1") == 0) { // Check for -1 argument + wiringPiSetupPhys () ; -// Check for usb power command + for (i = 2 ; i < argc ; ++i) + argv [i - 1] = argv [i] ; + --argc ; + wpMode = MODE_PHYS ; + } else if (strcasecmp (argv [1], "-p") == 0) { // Check for -p argument for PiFace + piFaceSetup (200) ; - if (strcasecmp (argv [1], "usbp" ) == 0) { doUsbP (argc, argv) ; return 0 ; } + for (i = 2 ; i < argc ; ++i) + argv [i - 1] = argv [i] ; + --argc ; + wpMode = MODE_PIFACE ; + } else if (strcasecmp (argv [1], "-z") == 0) { // Check for -z argument so we don't actually initialise wiringPi + for (i = 2 ; i < argc ; ++i) + argv [i - 1] = argv [i] ; + --argc ; + wpMode = MODE_UNINITIALISED ; + } else { // Default to wiringPi mode + wiringPiSetup () ; + wpMode = MODE_PINS ; + } -// Gertboard commands + // Check for -x argument to load in a new extension + // -x extension:base:args + // Can load many modules, but unless daemon mode we can only send one + // command at a time. + while (strcasecmp (argv [1], "-x") == 0) { + if (argc < 3) { + fprintf (stderr, "%s: -x missing extension command.\n", argv [0]) ; + exit (EXIT_FAILURE) ; + } - if (strcasecmp (argv [1], "gbr" ) == 0) { doGbr (argc, argv) ; return 0 ; } - if (strcasecmp (argv [1], "gbw" ) == 0) { doGbw (argc, argv) ; return 0 ; } + if (!loadWPiExtension (argv [0], argv [2], TRUE)) { + fprintf (stderr, "%s: Extension load failed: %s\n", argv [0], strerror (errno)) ; + exit (EXIT_FAILURE) ; + } -// Check for allreadall command, force Gpio mode + // Shift args down by 2 + for (i = 3 ; i < argc ; ++i) + argv [i - 2] = argv [i] ; + argc -= 2 ; + } - if (strcasecmp (argv [1], "allreadall") == 0) - { - wiringPiSetupGpio () ; - doAllReadall () ; - return 0 ; - } + if (argc <= 1) { + fprintf (stderr, "%s: no command given\n", argv [0]) ; + exit (EXIT_FAILURE) ; + } -// Check for -g argument + // Core wiringPi functions + /**/ if (strcasecmp (argv [1], "mode" ) == 0) doMode (argc, argv) ; + else if (strcasecmp (argv [1], "read" ) == 0) doRead (argc, argv) ; + else if (strcasecmp (argv [1], "write" ) == 0) doWrite (argc, argv) ; + else if (strcasecmp (argv [1], "pwm" ) == 0) doNothing (argc, argv) ; + else if (strcasecmp (argv [1], "awrite" ) == 0) doNothing (argc, argv) ; + else if (strcasecmp (argv [1], "aread" ) == 0) doAread (argc, argv) ; - /**/ if (strcasecmp (argv [1], "-g") == 0) - { - wiringPiSetupGpio () ; + // GPIO Nicies + else if (strcasecmp (argv [1], "toggle" ) == 0) doToggle (argc, argv) ; + else if (strcasecmp (argv [1], "blink" ) == 0) doBlink (argc, argv) ; - for (i = 2 ; i < argc ; ++i) - argv [i - 1] = argv [i] ; - --argc ; - wpMode = WPI_MODE_GPIO ; - } - -// Check for -1 argument - - else if (strcasecmp (argv [1], "-1") == 0) - { - wiringPiSetupPhys () ; - - for (i = 2 ; i < argc ; ++i) - argv [i - 1] = argv [i] ; - --argc ; - wpMode = WPI_MODE_PHYS ; - } - -// Check for -p argument for PiFace - - else if (strcasecmp (argv [1], "-p") == 0) - { - piFaceSetup (200) ; - - for (i = 2 ; i < argc ; ++i) - argv [i - 1] = argv [i] ; - --argc ; - wpMode = WPI_MODE_PIFACE ; - } - -// Check for -z argument so we don't actually initialise wiringPi - - else if (strcasecmp (argv [1], "-z") == 0) - { - for (i = 2 ; i < argc ; ++i) - argv [i - 1] = argv [i] ; - --argc ; - wpMode = WPI_MODE_UNINITIALISED ; - } - -// Default to wiringPi mode - - else - { - wiringPiSetup () ; - wpMode = WPI_MODE_PINS ; - } - -// Check for -x argument to load in a new extension -// -x extension:base:args -// Can load many modules, but unless daemon mode we can only send one -// command at a time. - - while (strcasecmp (argv [1], "-x") == 0) - { - if (argc < 3) - { - fprintf (stderr, "%s: -x missing extension command.\n", argv [0]) ; - exit (EXIT_FAILURE) ; - } - - if (!loadWPiExtension (argv [0], argv [2], TRUE)) - { - fprintf (stderr, "%s: Extension load failed: %s\n", argv [0], strerror (errno)) ; - exit (EXIT_FAILURE) ; - } - -// Shift args down by 2 - - for (i = 3 ; i < argc ; ++i) - argv [i - 2] = argv [i] ; - argc -= 2 ; - } - - if (argc <= 1) - { - fprintf (stderr, "%s: no command given\n", argv [0]) ; - exit (EXIT_FAILURE) ; - } - -// Core wiringPi functions - - /**/ if (strcasecmp (argv [1], "mode" ) == 0) doMode (argc, argv) ; - else if (strcasecmp (argv [1], "read" ) == 0) doRead (argc, argv) ; - else if (strcasecmp (argv [1], "write" ) == 0) doWrite (argc, argv) ; - else if (strcasecmp (argv [1], "pwm" ) == 0) doPwm (argc, argv) ; - else if (strcasecmp (argv [1], "awrite" ) == 0) doAwrite (argc, argv) ; - else if (strcasecmp (argv [1], "aread" ) == 0) doAread (argc, argv) ; - -// GPIO Nicies - - else if (strcasecmp (argv [1], "toggle" ) == 0) doToggle (argc, argv) ; - else if (strcasecmp (argv [1], "blink" ) == 0) doBlink (argc, argv) ; - -// Pi Specifics - - else if (strcasecmp (argv [1], "pwm-bal" ) == 0) doPwmMode (PWM_MODE_BAL) ; - else if (strcasecmp (argv [1], "pwm-ms" ) == 0) doPwmMode (PWM_MODE_MS) ; - else if (strcasecmp (argv [1], "pwmr" ) == 0) doPwmRange (argc, argv) ; - else if (strcasecmp (argv [1], "pwmc" ) == 0) doPwmClock (argc, argv) ; - else if (strcasecmp (argv [1], "pwmTone" ) == 0) doPwmTone (argc, argv) ; - else if (strcasecmp (argv [1], "drive" ) == 0) doPadDrive (argc, argv) ; - else if (strcasecmp (argv [1], "readall" ) == 0) doReadall () ; - else if (strcasecmp (argv [1], "nreadall" ) == 0) doReadall () ; - else if (strcasecmp (argv [1], "pins" ) == 0) doPins () ; - else if (strcasecmp (argv [1], "i2cdetect") == 0) doI2Cdetect (argc, argv) ; - else if (strcasecmp (argv [1], "i2cd" ) == 0) doI2Cdetect (argc, argv) ; - else if (strcasecmp (argv [1], "reset" ) == 0) doReset (argv [0]) ; - else if (strcasecmp (argv [1], "wb" ) == 0) doWriteByte (argc, argv) ; - else if (strcasecmp (argv [1], "rbx" ) == 0) doReadByte (argc, argv, TRUE) ; - else if (strcasecmp (argv [1], "rbd" ) == 0) doReadByte (argc, argv, FALSE) ; - else if (strcasecmp (argv [1], "clock" ) == 0) doClock (argc, argv) ; - else if (strcasecmp (argv [1], "wfi" ) == 0) doWfi (argc, argv) ; - else - { - fprintf (stderr, "%s: Unknown command: %s.\n", argv [0], argv [1]) ; - exit (EXIT_FAILURE) ; - } - return 0 ; + // Pi Specifics + else if (strcasecmp (argv [1], "pwm-bal" ) == 0) doNothing (argc, argv) ; + else if (strcasecmp (argv [1], "pwm-ms" ) == 0) doNothing (argc, argv) ; + else if (strcasecmp (argv [1], "pwmr" ) == 0) doNothing (argc, argv) ; + else if (strcasecmp (argv [1], "pwmc" ) == 0) doNothing (argc, argv) ; + else if (strcasecmp (argv [1], "pwmTone" ) == 0) doNothing (argc, argv) ; + else if (strcasecmp (argv [1], "drive" ) == 0) doPadDrive (argc, argv) ; + else if (strcasecmp (argv [1], "readall" ) == 0) doReadall () ; + else if (strcasecmp (argv [1], "nreadall" ) == 0) doReadall () ; + else if (strcasecmp (argv [1], "pins" ) == 0) doPins () ; + else if (strcasecmp (argv [1], "i2cdetect") == 0) doI2Cdetect (argc, argv) ; + else if (strcasecmp (argv [1], "i2cd" ) == 0) doI2Cdetect (argc, argv) ; + else if (strcasecmp (argv [1], "reset" ) == 0) doReset (argv [0]) ; + else if (strcasecmp (argv [1], "wb" ) == 0) doWriteByte (argc, argv) ; + else if (strcasecmp (argv [1], "rbx" ) == 0) doReadByte (argc, argv, TRUE) ; + else if (strcasecmp (argv [1], "rbd" ) == 0) doReadByte (argc, argv, FALSE) ; + else if (strcasecmp (argv [1], "clock" ) == 0) doNothing (argc, argv) ; + else if (strcasecmp (argv [1], "wfi" ) == 0) doWfi (argc, argv) ; + else { + fprintf (stderr, "%s: Unknown command: %s.\n", argv [0], argv [1]) ; + exit (EXIT_FAILURE) ; + } + return 0 ; } diff --git a/gpio/gpio_odroid.c b/gpio/gpio_odroid.c deleted file mode 100755 index 916dbfa..0000000 --- a/gpio/gpio_odroid.c +++ /dev/null @@ -1,1225 +0,0 @@ -/* - * gpio.c: - * Swiss-Army-Knife, Set-UID command-line interface to the Raspberry - * Pi's GPIO. - * Copyright (c) 2012-2017 Gordon Henderson - *********************************************************************** - * This file is part of wiringPi: - * https://projects.drogon.net/raspberry-pi/wiringpi/ - * - * wiringPi is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * wiringPi is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public License - * along with wiringPi. If not, see . - *********************************************************************** - */ -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#include -#include - -#include -#include - -#include "../version.h" - -extern int wiringPiDebug ; - -// External functions I can't be bothered creating a separate .h file for: - -extern void doReadall (void) ; -extern void doAllReadall (void) ; -extern void doPins (void) ; - -#ifndef TRUE -# define TRUE (1==1) -# define FALSE (1==2) -#endif - -#define PI_USB_POWER_CONTROL 38 -#define I2CDETECT "i2cdetect" -#define MODPROBE "modprobe" -#define RMMOD "rmmod" - -int wpMode ; - -char *usage = "Usage: gpio -v\n" - " gpio -h\n" - " gpio [-g|-1] ...\n" - " gpio [-d] ...\n" - " [-x extension:params] [[ -x ...]] ...\n" - " gpio [-p] ...\n" - " gpio ...\n" - " gpio \n" - " gpio readall/reset\n" - " gpio unexportall/exports\n" - " gpio export/edge/unexport ...\n" - " gpio wfi \n" - " gpio drive \n" - " gpio pwm-bal/pwm-ms \n" - " gpio pwmr \n" - " gpio pwmc \n" - " gpio load spi/i2c\n" - " gpio unload spi/i2c\n" - " gpio i2cd/i2cdetect\n" - " gpio rbx/rbd\n" - " gpio wb \n" - " gpio usbp high/low\n" - " gpio gbr \n" - " gpio gbw " ; // No trailing newline needed here. - - -#ifdef NOT_FOR_NOW -/* - * decodePin: - * Decode a pin "number" which can actually be a pin name to represent - * one of the Pi's on-board pins. - ********************************************************************************* - */ -static int decodePin (const char *str) -{ - // The first case - see if it's a number: - if (isdigit (str [0])) - return atoi (str) ; - - return 0 ; -} -#endif - - -/* - * findExecutable: - * Code to locate the path to the given executable. We have a fixed list - * of locations to try which completely overrides any $PATH environment. - * This may be detrimental, however it avoids the reliance on $PATH - * which may be a security issue when this program is run a set-uid-root. - ********************************************************************************* - */ -static const char *searchPath [] = -{ - "/sbin", - "/usr/sbin", - "/bin", - "/usr/bin", - NULL, -} ; - -static char *findExecutable (const char *progName) -{ - static char *path = NULL ; - int len = strlen (progName) ; - int i = 0 ; - struct stat statBuf ; - - for (i = 0 ; searchPath [i] != NULL ; ++i) { - path = malloc (strlen (searchPath [i]) + len + 2) ; - sprintf (path, "%s/%s", searchPath [i], progName) ; - - if (stat (path, &statBuf) == 0) - return path ; - free (path) ; - } - return NULL ; -} - - -/* - * changeOwner: - * Change the ownership of the file to the real userId of the calling - * program so we can access it. - ********************************************************************************* - */ -static void changeOwner (char *cmd, char *file) -{ - uid_t uid = getuid () ; - uid_t gid = getgid () ; - - if (chown (file, uid, gid) != 0) { - // Removed (ignoring) the check for not existing as I'm fed-up with morons telling me that - // the warning message is an error. - if (errno != ENOENT) - fprintf (stderr, "%s: Unable to change ownership of %s: %s\n", - cmd, file, strerror (errno)) ; - } -} - -/* - * doLoad: - * Load either the spi or i2c modules and change device ownerships, etc. - ********************************************************************************* - */ -static void checkDevTree (char *argv []) -{ - struct stat statBuf ; - - // We're on a devtree system ... - if (stat ("/proc/device-tree", &statBuf) == 0) { - fprintf (stderr, - "%s: Unable to load/unload modules as this kernel has the device tree enabled.\n" - " You need to edit /etc/modprobe.d/blacklist-odroid.conf or update /media/models.dts file.\n" - " If you want to use SPI, you should find out spidev module line at the blacklist-odroid.conf\n" - " and uncomment that. Then reboot to enable the module.\n\n" - " Please refer to our wiki page:\n" - " https://wiki.odroid.com/start\n", argv [0]) ; - exit (1) ; - } -} - -static void doLoad (int argc, char *argv []) -{ - checkDevTree (argv) ; -} - - -/* - * doUnLoad: - * Un-Load either the spi or i2c modules and change device ownerships, etc. - ********************************************************************************* - */ -static void doUnLoad (int argc, char *argv []) -{ - checkDevTree (argv) ; -} - - -/* - * doI2Cdetect: - * Run the i2cdetect command with the right runes for this Pi revision - ********************************************************************************* - */ -static void doI2Cdetect (UNU int argc, char *argv []) -{ - int model, rev, mem, maker, overVolted, port; - const char *device = NULL; - char *c, *command ; - - piBoardId(&model, &rev, &mem, &maker, &overVolted); - - switch (model) { - case MODEL_ODROID_C1: case MODEL_ODROID_C2: - case MODEL_ODROID_XU3: - device = "/dev/i2c-1"; - port = 1; - break; - case MODEL_ODROID_N1: - device = "/dev/i2c-4"; - port = 4; - break; - case MODEL_ODROID_N2: - device = "/dev/i2c-3"; - port = 3; - default: - break; - } - - if ((c = findExecutable (I2CDETECT)) == NULL) { - fprintf (stderr, "%s: Unable to find i2cdetect command: %s\n", argv [0], strerror (errno)) ; - return ; - } - - switch (maker) { - case MAKER_AMLOGIC: - if (!moduleLoaded (AML_MODULE_I2C)) { - fprintf (stderr, "%s: The I2C kernel module(s) are not loaded.\n", argv [0]) ; - return ; - } - default: - break; - } - - command = malloc (strlen (c) + 16) ; - sprintf (command, "%s -y %d", c, port) ; - if (system (command) < 0) - fprintf (stderr, "%s: Unable to run i2cdetect: %s\n", argv [0], strerror (errno)) ; -} - - -/* - * doExports: - * List all GPIO exports - ********************************************************************************* - */ -static void doExports (UNU int argc, UNU char *argv []) -{ - int fd ; - int i, l, first ; - char fName [128] ; - char buf [16] ; - - // Crude, but effective - for (first = 0, i = 0 ; i < 256 ; ++i) { - // Try to read the direction - sprintf (fName, "/sys/class/gpio/gpio%d/direction", i) ; - if ((fd = open (fName, O_RDONLY)) == -1) - continue ; - - if (first == 0) { - ++first ; - printf ("GPIO Pins exported:\n") ; - } - printf ("%4d: ", i) ; - - if ((l = read (fd, buf, 16)) == 0) - sprintf (buf, "%s", "?") ; - - buf [l] = 0 ; - if ((buf [strlen (buf) - 1]) == '\n') - buf [strlen (buf) - 1] = 0 ; - printf ("%-3s", buf) ; - close (fd) ; - - // Try to Read the value - sprintf (fName, "/sys/class/gpio/gpio%d/value", i) ; - if ((fd = open (fName, O_RDONLY)) == -1) { - printf ("No Value file (huh?)\n") ; - continue ; - } - - if ((l = read (fd, buf, 16)) == 0) - sprintf (buf, "%s", "?") ; - - buf [l] = 0 ; - if ((buf [strlen (buf) - 1]) == '\n') - buf [strlen (buf) - 1] = 0 ; - printf (" %s", buf) ; - close (fd) ; - - // Read any edge trigger file - sprintf (fName, "/sys/class/gpio/gpio%d/edge", i) ; - if ((fd = open (fName, O_RDONLY)) == -1) { - printf ("\n") ; - continue ; - } - - if ((l = read (fd, buf, 16)) == 0) - sprintf (buf, "%s", "?") ; - - buf [l] = 0 ; - if ((buf [strlen (buf) - 1]) == '\n') - buf [strlen (buf) - 1] = 0 ; - printf (" %-8s\n", buf) ; - close (fd) ; - } -} - - -/* - * doExport: - * gpio export pin mode - * This uses the /sys/class/gpio device interface. - ********************************************************************************* - */ -void doExport (int argc, char *argv []) -{ - FILE *fd ; - int pin ; - char *mode ; - char fName [128] ; - - if (argc != 4) { - fprintf (stderr, "Usage: %s export pin mode\n", argv [0]) ; - exit (1) ; - } - - pin = atoi (argv [2]) ; - mode = argv [3] ; - - if ((fd = fopen ("/sys/class/gpio/export", "w")) == NULL) { - fprintf (stderr, "%s: Unable to open GPIO export interface: %s\n", argv [0], strerror (errno)) ; - exit (1) ; - } - - fprintf (fd, "%d\n", pin) ; - fclose (fd) ; - - sprintf (fName, "/sys/class/gpio/gpio%d/direction", pin) ; - if ((fd = fopen (fName, "w")) == NULL) { - fprintf (stderr, "%s: Unable to open GPIO direction interface for pin %d: %s\n", argv [0], pin, strerror (errno)) ; - exit (1) ; - } - - if ((strcasecmp (mode, "in") == 0) || (strcasecmp (mode, "input") == 0)) - fprintf (fd, "in\n") ; - else if ((strcasecmp (mode, "out") == 0) || (strcasecmp (mode, "output") == 0)) - fprintf (fd, "out\n") ; - else if ((strcasecmp (mode, "high") == 0) || (strcasecmp (mode, "up") == 0)) - fprintf (fd, "high\n") ; - else if ((strcasecmp (mode, "low") == 0) || (strcasecmp (mode, "down") == 0)) - fprintf (fd, "low\n") ; - else { - fprintf (stderr, "%s: Invalid mode: %s. Should be in, out, high or low\n", argv [1], mode) ; - exit (1) ; - } - fclose (fd) ; - - // Change ownership so the current user can actually use it - sprintf (fName, "/sys/class/gpio/gpio%d/value", pin) ; - changeOwner (argv [0], fName) ; - - sprintf (fName, "/sys/class/gpio/gpio%d/edge", pin) ; - changeOwner (argv [0], fName) ; -} - - -/* - * doWfi: - * gpio wfi pin mode - * Wait for Interrupt on a given pin. - * Slight cheat here - it's easier to actually use ISR now (which calls - * gpio to set the pin modes!) then we simply sleep, and expect the thread - * to exit the program. Crude but effective. - ********************************************************************************* - */ -static void wfi (void) { exit (0) ; } - -void doWfi (int argc, char *argv []) -{ - int pin, mode ; - - if (argc != 4) { - fprintf (stderr, "Usage: %s wfi pin mode\n", argv [0]) ; - exit (1) ; - } - - pin = atoi (argv [2]) ; - - if (strcasecmp (argv [3], "rising") == 0) mode = INT_EDGE_RISING ; - else if (strcasecmp (argv [3], "falling") == 0) mode = INT_EDGE_FALLING ; - else if (strcasecmp (argv [3], "both") == 0) mode = INT_EDGE_BOTH ; - else { - fprintf (stderr, "%s: wfi: Invalid mode: %s. Should be rising, falling or both\n", argv [1], argv [3]) ; - exit (1) ; - } - - if (wiringPiISR (pin, mode, &wfi) < 0) { - fprintf (stderr, "%s: wfi: Unable to setup ISR: %s\n", argv [1], strerror (errno)) ; - exit (1) ; - } - - for (;;) - delay (9999) ; -} - - -/* - * doEdge: - * gpio edge pin mode - * Easy access to changing the edge trigger on a GPIO pin - * This uses the /sys/class/gpio device interface. - ********************************************************************************* - */ - -void doEdge (int argc, char *argv []) -{ - FILE *fd ; - int pin ; - char *mode ; - char fName [128] ; - - // Reset gpio sysfs - doUnexport(3, argv); - - if (argc != 4) { - fprintf (stderr, "Usage: %s edge pin mode\n", argv [0]) ; - exit (1) ; - } - - pin = atoi (argv [2]) ; - mode = argv [3] ; - - // Export the pin and set direction to input - if ((fd = fopen ("/sys/class/gpio/export", "w")) == NULL) { - fprintf (stderr, "%s: Unable to open GPIO export interface: %s\n", argv [0], strerror (errno)) ; - exit (1) ; - } - fprintf (fd, "%d\n", pin) ; - fclose (fd) ; - - sprintf (fName, "/sys/class/gpio/gpio%d/direction", pin) ; - if ((fd = fopen (fName, "w")) == NULL) { - fprintf (stderr, "%s: Unable to open GPIO direction interface for pin %d: %s\n", argv [0], pin, strerror (errno)) ; - exit (1) ; - } - fprintf (fd, "in\n") ; - fclose (fd) ; - - sprintf (fName, "/sys/class/gpio/gpio%d/edge", pin) ; - if ((fd = fopen (fName, "w")) == NULL) { - fprintf (stderr, "%s: Unable to open GPIO edge interface for pin %d: %s\n", argv [0], pin, strerror (errno)) ; - exit (1) ; - } - - if (strcasecmp (mode, "none") == 0) fprintf (fd, "none\n") ; - else if (strcasecmp (mode, "rising") == 0) fprintf (fd, "rising\n") ; - else if (strcasecmp (mode, "falling") == 0) fprintf (fd, "falling\n") ; - else if (strcasecmp (mode, "both") == 0) fprintf (fd, "both\n") ; - else { - fprintf (stderr, "%s: Invalid mode: %s. Should be none, rising, falling or both\n", argv [1], mode) ; - exit (1) ; - } - - // Change ownership of the value and edge files, so the current user can actually use it! - sprintf (fName, "/sys/class/gpio/gpio%d/value", pin) ; - changeOwner (argv [0], fName) ; - - sprintf (fName, "/sys/class/gpio/gpio%d/edge", pin) ; - changeOwner (argv [0], fName) ; - - fclose (fd) ; -} - - -/* - * doUnexport: - * gpio unexport pin - * This uses the /sys/class/gpio device interface. - ********************************************************************************* - */ - -void doUnexport (int argc, char *argv []) -{ - FILE *fd ; - int pin ; - - if (argc != 3) { - fprintf (stderr, "Usage: %s unexport pin\n", argv [0]) ; - exit (1) ; - } - - pin = atoi (argv [2]) ; - - if ((fd = fopen ("/sys/class/gpio/unexport", "w")) == NULL) { - fprintf (stderr, "%s: Unable to open GPIO export interface\n", argv [0]) ; - exit (1) ; - } - - fprintf (fd, "%d\n", pin) ; - fclose (fd) ; -} - - -/* - * doUnexportAll: - * gpio unexportall - * Un-Export all the GPIO pins. - * This uses the /sys/class/gpio device interface. - ********************************************************************************* - */ - -void doUnexportall (char *progName) -{ - FILE *fd ; - int pin ; - - for (pin = 0 ; pin < 256 ; ++pin) { - if ((fd = fopen ("/sys/class/gpio/unexport", "w")) == NULL) { - fprintf (stderr, "%s: Unable to open GPIO export interface\n", progName) ; - exit (1) ; - } - fprintf (fd, "%d\n", pin) ; - fclose (fd) ; - } -} - - -/* - * doReset: - * Reset the GPIO pins - as much as we can do - ********************************************************************************* - */ - -static void doReset (UNU char *progName) -{ - printf ("GPIO Reset is dangerous and has been removed from the gpio command.\n") ; - printf (" - Please write a shell-script to reset the GPIO pins into the state\n") ; - printf (" that you need them in for your applications.\n") ; -} - - -/* - * doMode: - * gpio mode pin mode ... - ********************************************************************************* - */ - -void doMode (int argc, char *argv []) -{ - int pin ; - char *mode ; - - if (argc != 4) { - fprintf (stderr, "Usage: %s mode pin mode\n", argv [0]) ; - exit (1) ; - } - - pin = atoi (argv [2]) ; - mode = argv [3] ; - - if (strcasecmp (mode, "in") == 0) pinMode (pin, INPUT) ; - else if (strcasecmp (mode, "input") == 0) pinMode (pin, INPUT) ; - else if (strcasecmp (mode, "out") == 0) pinMode (pin, OUTPUT) ; - else if (strcasecmp (mode, "output") == 0) pinMode (pin, OUTPUT) ; - else if (strcasecmp (mode, "pwm") == 0) pinMode (pin, PWM_OUTPUT) ; - else if (strcasecmp (mode, "pwmTone") == 0) pinMode (pin, PWM_TONE_OUTPUT) ; - else if (strcasecmp (mode, "clock") == 0) pinMode (pin, GPIO_CLOCK) ; - else if (strcasecmp (mode, "up") == 0) pullUpDnControl (pin, PUD_UP) ; - else if (strcasecmp (mode, "down") == 0) pullUpDnControl (pin, PUD_DOWN) ; - else if (strcasecmp (mode, "tri") == 0) pullUpDnControl (pin, PUD_OFF) ; - else if (strcasecmp (mode, "off") == 0) pullUpDnControl (pin, PUD_OFF) ; - else if (strcasecmp (mode, "alt0") == 0) pinModeAlt (pin, 0b100) ; - else if (strcasecmp (mode, "alt1") == 0) pinModeAlt (pin, 0b101) ; - else if (strcasecmp (mode, "alt2") == 0) pinModeAlt (pin, 0b110) ; - else if (strcasecmp (mode, "alt3") == 0) pinModeAlt (pin, 0b111) ; - else if (strcasecmp (mode, "alt4") == 0) pinModeAlt (pin, 0b011) ; - else if (strcasecmp (mode, "alt5") == 0) pinModeAlt (pin, 0b010) ; - else { - fprintf (stderr, "%s: Invalid mode: %s. Should be in/out/pwm/clock/up/down/tri\n", argv [1], mode) ; - exit (1) ; - } -} - - -/* - * doPadDrive: - * gpio drive pin value for ODROIDs since it depends on the SoC - ********************************************************************************* - */ - -static void doPadDrive (int argc, char *argv []) -{ - int pin, val; - - if (argc != 4) { - fprintf (stderr, "Usage: %s drive pin value\n", argv [0]) ; - exit (1) ; - } - - pin = atoi (argv [2]) ; - val = atoi (argv [3]) ; - - setPadDrive (pin, val) ; -} - - -/* - * doGbw: - * gpio gbw channel value - * Gertboard Write - To the Analog output - ********************************************************************************* - */ - -static void doGbw (int argc, char *argv []) -{ - int channel, value ; - - if (argc != 4) { - fprintf (stderr, "Usage: %s gbw \n", argv [0]) ; - exit (1) ; - } - - channel = atoi (argv [2]) ; - value = atoi (argv [3]) ; - - if ((channel < 0) || (channel > 1)) { - fprintf (stderr, "%s: gbw: Channel number must be 0 or 1\n", argv [0]) ; - exit (1) ; - } - - if ((value < 0) || (value > 255)) { - fprintf (stderr, "%s: gbw: Value must be from 0 to 255\n", argv [0]) ; - exit (1) ; - } - - if (gertboardAnalogSetup (64) < 0) { - fprintf (stderr, "Unable to initialise the Gertboard SPI interface: %s\n", strerror (errno)) ; - exit (1) ; - } - - analogWrite (64 + channel, value) ; -} - - -/* - * doGbr: - * gpio gbr channel - * From the analog input - ********************************************************************************* - */ -static void doGbr (int argc, char *argv []) -{ - int channel ; - - if (argc != 3) { - fprintf (stderr, "Usage: %s gbr \n", argv [0]) ; - exit (1) ; - } - - channel = atoi (argv [2]) ; - - if ((channel < 0) || (channel > 1)) { - fprintf (stderr, "%s: gbr: Channel number must be 0 or 1\n", argv [0]) ; - exit (1) ; - } - - if (gertboardAnalogSetup (64) < 0) { - fprintf (stderr, "Unable to initialise the Gertboard SPI interface: %s\n", strerror (errno)) ; - exit (1) ; - } - - printf ("%d\n", analogRead (64 + channel)) ; -} - - -/* - * doWrite: - * gpio write pin value - ********************************************************************************* - */ - -static void doWrite (int argc, char *argv []) -{ - int pin, val ; - - if (argc != 4) { - fprintf (stderr, "Usage: %s write pin value\n", argv [0]) ; - exit (1) ; - } - - pin = atoi (argv [2]) ; - - if ((strcasecmp (argv [3], "up") == 0) || (strcasecmp (argv [3], "on") == 0)) - val = 1 ; - else if ((strcasecmp (argv [3], "down") == 0) || (strcasecmp (argv [3], "off") == 0)) - val = 0 ; - else - val = atoi (argv [3]) ; - - if (val == 0) - digitalWrite (pin, LOW) ; - else - digitalWrite (pin, HIGH) ; -} - - -/* - * doAwriterite: - * gpio awrite pin value - ********************************************************************************* - */ - -static void doAwrite (int argc, char *argv []) -{ - int pin, val ; - - if (argc != 4) { - fprintf (stderr, "Usage: %s awrite pin value\n", argv [0]) ; - exit (1) ; - } - pin = atoi (argv [2]) ; - val = atoi (argv [3]) ; - - analogWrite (pin, val) ; -} - - -/* - * doWriteByte: - * gpio wb value - ********************************************************************************* - */ - -static void doWriteByte (int argc, char *argv []) -{ - int val ; - - if (argc != 3) { - fprintf (stderr, "Usage: %s wb value\n", argv [0]) ; - exit (1) ; - } - val = (int)strtol (argv [2], NULL, 0) ; - - digitalWriteByte (val) ; -} - - -/* - * doReadByte: - * gpio rbx|rbd value - ********************************************************************************* - */ - -static void doReadByte (int argc, char *argv [], int printHex) -{ - int val ; - - if (argc != 2) { - fprintf (stderr, "Usage: %s rbx|rbd\n", argv [0]) ; - exit (1) ; - } - - val = digitalReadByte () ; - if (printHex) - printf ("%02X\n", val) ; - else - printf ("%d\n", val) ; -} - - -/* - * doRead: - * Read a pin and return the value - ********************************************************************************* - */ - -void doRead (int argc, char *argv []) -{ - int pin, val ; - - if (argc != 3) { - fprintf (stderr, "Usage: %s read pin\n", argv [0]) ; - exit (1) ; - } - pin = atoi (argv [2]) ; - val = digitalRead (pin) ; - - printf ("%s\n", val == 0 ? "0" : "1") ; -} - - -/* - * doAread: - * Read an analog pin and return the value - ********************************************************************************* - */ - -void doAread (int argc, char *argv []) -{ - if (argc != 3) { - fprintf (stderr, "Usage: %s aread pin\n", argv [0]) ; - exit (1) ; - } - printf ("%d\n", analogRead (atoi (argv [2]))) ; -} - - -/* - * doToggle: - * Toggle an IO pin - ********************************************************************************* - */ - -void doToggle (int argc, char *argv []) -{ - int pin ; - - if (argc != 3) { - fprintf (stderr, "Usage: %s toggle pin\n", argv [0]) ; - exit (1) ; - } - pin = atoi (argv [2]) ; - - digitalWrite (pin, !digitalRead (pin)) ; -} - - -/* - * doBlink: - * Blink an IO pin - ********************************************************************************* - */ - -void doBlink (int argc, char *argv []) -{ - int pin ; - - if (argc != 3) { - fprintf (stderr, "Usage: %s blink pin\n", argv [0]) ; - exit (1) ; - } - - pin = atoi (argv [2]) ; - - pinMode (pin, OUTPUT) ; - for (;;) { - digitalWrite (pin, !digitalRead (pin)) ; - delay (500) ; - } -} - - -/* - * doPwmTone: - * Output a tone in a PWM pin - ********************************************************************************* - */ - -void doPwmTone (int argc, char *argv []) -{ - int pin, freq ; - - if (argc != 4) { - fprintf (stderr, "Usage: %s pwmTone \n", argv [0]) ; - exit (1) ; - } - - pin = atoi (argv [2]) ; - freq = atoi (argv [3]) ; - - pwmToneWrite (pin, freq) ; -} - - -/* - * doClock: - * Output a clock on a pin - ********************************************************************************* - */ - -void doClock (int argc, char *argv []) -{ - int pin, freq ; - - if (argc != 4) { - fprintf (stderr, "Usage: %s clock \n", argv [0]) ; - exit (1) ; - } - - pin = atoi (argv [2]) ; - - freq = atoi (argv [3]) ; - - gpioClockSet (pin, freq) ; -} - - -/* - * doPwm: - * Output a PWM value on a pin - ********************************************************************************* - */ - -void doPwm (int argc, char *argv []) -{ - int pin, val ; - - if (argc != 4) { - fprintf (stderr, "Usage: %s pwm \n", argv [0]) ; - exit (1) ; - } - pin = atoi (argv [2]) ; - val = atoi (argv [3]) ; - - pwmWrite (pin, val) ; -} - - -/* - * doPwmMode: doPwmRange: doPwmClock: - * Change the PWM mode, range and clock divider values - ********************************************************************************* - */ - -static void doPwmMode (int mode) -{ - pwmSetMode (mode) ; -} - -static void doPwmRange (int argc, char *argv []) -{ - unsigned int range ; - - if (argc != 3) { - fprintf (stderr, "Usage: %s pwmr \n", argv [0]) ; - exit (1) ; - } - - range = (unsigned int)strtoul (argv [2], NULL, 10) ; - - if (range == 0) { - fprintf (stderr, "%s: range must be > 0\n", argv [0]) ; - exit (1) ; - } - pwmSetRange (range) ; -} - -static void doPwmClock (int argc, char *argv []) -{ - unsigned int clock ; - - if (argc != 3) { - fprintf (stderr, "Usage: %s pwmc \n", argv [0]) ; - exit (1) ; - } - - clock = (unsigned int)strtoul (argv [2], NULL, 10) ; - - if ((clock < 1) || (clock > 4095)) { - fprintf (stderr, "%s: clock must be between 0 and 4096\n", argv [0]) ; - exit (1) ; - } - pwmSetClock (clock) ; -} - -/* - * doNothing: - * function is not support by ODROID Board. - ********************************************************************************* - */ -static void doNothing (int argc, char *argv []) -{ - fprintf(stderr, "warn : (%s) : This function is not supported by ODROID Board.\n", - argv[1]); -} - -/* - * doVersion: - * Handle the ever more complicated version command and print out - * some usefull information. - ********************************************************************************* - */ -static void doVersion (char *argv []) -{ - int model, rev, mem, maker, warranty ; - struct stat statBuf ; - char name [80] ; - FILE *fd ; - - int vMaj, vMin ; - - wiringPiVersion (&vMaj, &vMin) ; - printf ("gpio version: %d.%d\n", vMaj, vMin) ; - printf ("Copyright (c) 2012-2017 Gordon Henderson\n") ; - printf ("This is free software with ABSOLUTELY NO WARRANTY.\n") ; - printf ("For details type: %s -warranty\n", argv [0]) ; - printf ("\n") ; - piBoardId (&model, &rev, &mem, &maker, &warranty) ; - - printf ("ODROID Board Details:\n") ; - printf (" Type: %s, Revision: %s, Memory: %dMB\n" \ - " Maker: %s, Chip-Vendor: %s\n", - piModelNames [model], - piRevisionNames [rev], - piMemorySize [mem], - "Hardkernel", - piMakerNames [maker]); - - // Check for device tree - if (stat ("/proc/device-tree", &statBuf) == 0) // We're on a devtree system ... - printf (" * Device tree is enabled.\n") ; - - // Output Kernel idea of board type - if (stat ("/proc/device-tree/model", &statBuf) == 0) { - if ((fd = fopen ("/proc/device-tree/model", "r")) != NULL) { - fgets (name, 80, fd) ; - fclose (fd) ; - printf (" *--> %s\n", name) ; - } - } - - // User level GPIO is GO - if (stat ("/dev/gpiomem", &statBuf) == 0) - printf (" * Supports user-level GPIO access.\n") ; - else - printf (" * Root or sudo required for GPIO access.\n") ; -} - - -/* - * main: - * Start here - ********************************************************************************* - */ - -int main (int argc, char *argv []) -{ - int i ; - - if (getenv ("WIRINGPI_DEBUG") != NULL) { - printf ("gpio: wiringPi debug mode enabled\n") ; - wiringPiDebug = TRUE ; - } - - if (argc == 1) { - fprintf (stderr, "%s\n", usage) ; - return 1 ; - } - - // Help - if (strcasecmp (argv [1], "-h") == 0) { - printf ("%s: %s\n", argv [0], usage) ; - return 0 ; - } - - // Version & Warranty - // Wish I could remember why I have both -R and -V ... - if ((strcmp (argv [1], "-R") == 0) || (strcmp (argv [1], "-V") == 0)) { - printf ("%d\n", piGpioLayout ()) ; - return 0 ; - } - - // Version and information - if (strcmp (argv [1], "-v") == 0) { - doVersion (argv) ; - return 0 ; - } - - if (strcasecmp (argv [1], "-warranty") == 0) { - printf ("gpio version: %s\n", VERSION) ; - printf ("Copyright (c) 2012-2017 Gordon Henderson\n") ; - printf ("\n") ; - printf (" This program is free software; you can redistribute it and/or modify\n") ; - printf (" it under the terms of the GNU Leser General Public License as published\n") ; - printf (" by the Free Software Foundation, either version 3 of the License, or\n") ; - printf (" (at your option) any later version.\n") ; - printf ("\n") ; - printf (" This program is distributed in the hope that it will be useful,\n") ; - printf (" but WITHOUT ANY WARRANTY; without even the implied warranty of\n") ; - printf (" MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n") ; - printf (" GNU Lesser General Public License for more details.\n") ; - printf ("\n") ; - printf (" You should have received a copy of the GNU Lesser General Public License\n") ; - printf (" along with this program. If not, see .\n") ; - printf ("\n") ; - return 0 ; - } - - if (geteuid () != 0) { - fprintf (stderr, "%s: Must be root to run. Program should be suid root. This is an error.\n", argv [0]) ; - return 1 ; - } - - // Initial test for /sys/class/gpio operations: - if (strcasecmp (argv [1], "exports" ) == 0) { doExports (argc, argv) ; return 0 ; } - else if (strcasecmp (argv [1], "export" ) == 0) { doExport (argc, argv) ; return 0 ; } - else if (strcasecmp (argv [1], "edge" ) == 0) { doEdge (argc, argv) ; return 0 ; } - else if (strcasecmp (argv [1], "unexport" ) == 0) { doUnexport (argc, argv) ; return 0 ; } - else if (strcasecmp (argv [1], "unexportall") == 0) { doUnexportall (argv [0]) ; return 0 ; } - - // Check for load command: - if (strcasecmp (argv [1], "load" ) == 0) { doLoad (argc, argv) ; return 0 ; } - if (strcasecmp (argv [1], "unload" ) == 0) { doUnLoad (argc, argv) ; return 0 ; } - - // Check for usb power command - if (strcasecmp (argv [1], "usbp" ) == 0) { doNothing(argc, argv) ; return 0 ; } - - // Gertboard commands - if (strcasecmp (argv [1], "gbr" ) == 0) { doGbr (argc, argv) ; return 0 ; } - if (strcasecmp (argv [1], "gbw" ) == 0) { doGbw (argc, argv) ; return 0 ; } - - // Check for allreadall command, force Gpio mode - if (strcasecmp (argv [1], "allreadall") == 0) { - wiringPiSetupGpio () ; - doAllReadall () ; - return 0 ; - } - - if (strcasecmp (argv [1], "-g") == 0) { // Check for -g argument - wiringPiSetupGpio () ; - - for (i = 2 ; i < argc ; ++i) - argv [i - 1] = argv [i] ; - --argc ; - wpMode = MODE_GPIO ; - } else if (strcasecmp (argv [1], "-1") == 0) { // Check for -1 argument - wiringPiSetupPhys () ; - - for (i = 2 ; i < argc ; ++i) - argv [i - 1] = argv [i] ; - --argc ; - wpMode = MODE_PHYS ; - } else if (strcasecmp (argv [1], "-p") == 0) { // Check for -p argument for PiFace - piFaceSetup (200) ; - - for (i = 2 ; i < argc ; ++i) - argv [i - 1] = argv [i] ; - --argc ; - wpMode = MODE_PIFACE ; - } else if (strcasecmp (argv [1], "-z") == 0) { // Check for -z argument so we don't actually initialise wiringPi - for (i = 2 ; i < argc ; ++i) - argv [i - 1] = argv [i] ; - --argc ; - wpMode = MODE_UNINITIALISED ; - } else { // Default to wiringPi mode - wiringPiSetup () ; - wpMode = MODE_PINS ; - } - - // Check for -x argument to load in a new extension - // -x extension:base:args - // Can load many modules, but unless daemon mode we can only send one - // command at a time. - while (strcasecmp (argv [1], "-x") == 0) { - if (argc < 3) { - fprintf (stderr, "%s: -x missing extension command.\n", argv [0]) ; - exit (EXIT_FAILURE) ; - } - - if (!loadWPiExtension (argv [0], argv [2], TRUE)) { - fprintf (stderr, "%s: Extension load failed: %s\n", argv [0], strerror (errno)) ; - exit (EXIT_FAILURE) ; - } - - // Shift args down by 2 - for (i = 3 ; i < argc ; ++i) - argv [i - 2] = argv [i] ; - argc -= 2 ; - } - - if (argc <= 1) { - fprintf (stderr, "%s: no command given\n", argv [0]) ; - exit (EXIT_FAILURE) ; - } - - // Core wiringPi functions - /**/ if (strcasecmp (argv [1], "mode" ) == 0) doMode (argc, argv) ; - else if (strcasecmp (argv [1], "read" ) == 0) doRead (argc, argv) ; - else if (strcasecmp (argv [1], "write" ) == 0) doWrite (argc, argv) ; - else if (strcasecmp (argv [1], "pwm" ) == 0) doNothing (argc, argv) ; - else if (strcasecmp (argv [1], "awrite" ) == 0) doNothing (argc, argv) ; - else if (strcasecmp (argv [1], "aread" ) == 0) doAread (argc, argv) ; - - // GPIO Nicies - else if (strcasecmp (argv [1], "toggle" ) == 0) doToggle (argc, argv) ; - else if (strcasecmp (argv [1], "blink" ) == 0) doBlink (argc, argv) ; - - // Pi Specifics - else if (strcasecmp (argv [1], "pwm-bal" ) == 0) doNothing (argc, argv) ; - else if (strcasecmp (argv [1], "pwm-ms" ) == 0) doNothing (argc, argv) ; - else if (strcasecmp (argv [1], "pwmr" ) == 0) doNothing (argc, argv) ; - else if (strcasecmp (argv [1], "pwmc" ) == 0) doNothing (argc, argv) ; - else if (strcasecmp (argv [1], "pwmTone" ) == 0) doNothing (argc, argv) ; - else if (strcasecmp (argv [1], "drive" ) == 0) doPadDrive (argc, argv) ; - else if (strcasecmp (argv [1], "readall" ) == 0) doReadall () ; - else if (strcasecmp (argv [1], "nreadall" ) == 0) doReadall () ; - else if (strcasecmp (argv [1], "pins" ) == 0) doPins () ; - else if (strcasecmp (argv [1], "i2cdetect") == 0) doI2Cdetect (argc, argv) ; - else if (strcasecmp (argv [1], "i2cd" ) == 0) doI2Cdetect (argc, argv) ; - else if (strcasecmp (argv [1], "reset" ) == 0) doReset (argv [0]) ; - else if (strcasecmp (argv [1], "wb" ) == 0) doWriteByte (argc, argv) ; - else if (strcasecmp (argv [1], "rbx" ) == 0) doReadByte (argc, argv, TRUE) ; - else if (strcasecmp (argv [1], "rbd" ) == 0) doReadByte (argc, argv, FALSE) ; - else if (strcasecmp (argv [1], "clock" ) == 0) doNothing (argc, argv) ; - else if (strcasecmp (argv [1], "wfi" ) == 0) doWfi (argc, argv) ; - else { - fprintf (stderr, "%s: Unknown command: %s.\n", argv [0], argv [1]) ; - exit (EXIT_FAILURE) ; - } - return 0 ; -} diff --git a/gpio/readall.c b/gpio/readall.c old mode 100644 new mode 100755 index 18f836f..ba64ec4 --- a/gpio/readall.c +++ b/gpio/readall.c @@ -20,8 +20,6 @@ * along with wiringPi. If not, see . *********************************************************************** */ - - #include #include #include @@ -34,37 +32,377 @@ #include #include +/*----------------------------------------------------------------------------*/ extern int wpMode ; +/*----------------------------------------------------------------------------*/ #ifndef TRUE -# define TRUE (1==1) -# define FALSE (1==2) +# define TRUE (1==1) +# define FALSE (1==2) #endif +/*----------------------------------------------------------------------------*/ /* * doReadallExternal: * A relatively crude way to read the pins on an external device. * We don't know the input/output mode of pins, but we can tell * if it's an analog pin or a digital one... - ********************************************************************************* */ - +/*----------------------------------------------------------------------------*/ static void doReadallExternal (void) { - int pin ; + int pin ; - printf ("+------+---------+--------+\n") ; - printf ("| Pin | Digital | Analog |\n") ; - printf ("+------+---------+--------+\n") ; + printf ("+------+---------+--------+\n") ; + printf ("| Pin | Digital | Analog |\n") ; + printf ("+------+---------+--------+\n") ; - for (pin = wiringPiNodes->pinBase ; pin <= wiringPiNodes->pinMax ; ++pin) - printf ("| %4d | %4d | %4d |\n", pin, digitalRead (pin), analogRead (pin)) ; + for (pin = wiringPiNodes->pinBase ; pin <= wiringPiNodes->pinMax ; ++pin) + printf ("| %4d | %4d | %4d |\n", pin, digitalRead (pin), analogRead (pin)) ; - printf ("+------+---------+--------+\n") ; + printf ("+------+---------+--------+\n") ; } +/*----------------------------------------------------------------------------*/ +static const char *alts [] = +{ + "IN", "OUT", "ALT1", "ALT2", "ALT3", "ALT4", "ALT5", "ALT6", "ALT7" +} ; +static const char *pupd [] = +{ + "DSBLD", "P/U", "P/D" +} ; + +/*----------------------------------------------------------------------------*/ +static const int physToWpi [64] = +{ + -1, // 0 + -1, -1, // 1, 2 + 8, -1, + 9, -1, + 7, 15, + -1, 16, + 0, 1, + 2, -1, + 3, 4, + -1, 5, + 12, -1, + 13, 6, + 14, 10, + -1, 11, // 25, 26 + 30, 31, // Actually I2C, but not used + 21, -1, + 22, 26, + 23, -1, + 24, 27, + 25, 28, + -1, 29, + -1, -1, + -1, -1, + -1, -1, + -1, -1, + -1, -1, + 17, 18, + 19, 20, + -1, -1, -1, -1, -1, -1, -1, -1, -1 +} ; + +/*----------------------------------------------------------------------------*/ +static const char *physNamesOdroidC1 [64] = +{ + NULL, + + " 3.3V", "5V ", + " SDA.1", "5V ", + " SCL.1", "GND(0V) ", + "GPIO. 83", "TxD1 ", + " GND(0V)", "RxD1 ", + "GPIO. 88", "GPIO. 87", + "GPIO.116", "GND(0V) ", + "GPIO.115", "GPIO.104", + " 3.3V", "GPIO.102", + " MOSI", "GND(0V) ", + " MISO", "GPIO.103", + " SCLK", "CE0 ", + " GND(0V)", "GPIO.118", + " SDA.2", "SCL.2 ", + "GPIO.101", "GND(0V) ", + "GPIO.100", "GPIO. 99", + "GPIO.108", "GND(0V) ", + "GPIO.97 ", "GPIO. 98", + " AIN.1", "1V8 ", + " GND(0V)", "AIN.0 ", + + NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL, + NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL, + NULL,NULL,NULL, +} ; + +/*----------------------------------------------------------------------------*/ +static const char *physNamesOdroidC2_Rev2 [64] = +{ + NULL, + + " 3.3V", "5V ", + " SDA.1", "5V ", + " SCL.1", "GND(0V) ", + "GPIO.249", "TxD1 ", + " GND(0V)", "RxD1 ", + "GPIO.247", "GPIO.238", + "GPIO.239", "GND(0V) ", + "GPIO.237", "GPIO.236", + " 3.3V", "GPIO.233", + "GPIO.235", "GND(0V) ", + "GPIO.232", "GPIO.231", + "GPIO.230", "GPIO.229", + " GND(0V)", "GPIO.225", + " SDA.2", "SCL.2 ", + "GPIO.228", "GND(0V) ", + "GPIO.219", "GPIO.224", + "GPIO.234", "GND(0V) ", + "GPIO.214", "GPIO.218", + " AIN.1", "1V8 ", + " GND(0V)", "AIN.0 ", + + NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL, + NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL, + NULL,NULL,NULL, +} ; + +/*----------------------------------------------------------------------------*/ +static const char *physNamesOdroidC2_Rev1 [64] = +{ + NULL, + + " 3.3V", "5V ", + " SDA.1", "5V ", + " SCL.1", "GND(0V) ", + "GPIO.214", "--------", + " GND(0V)", "--------", + "GPIO.219", "GPIO.218", + "GPIO.247", "GND(0V) ", + "--------", "GPIO.235", + " 3.3V", "GPIO.233", + "GPIO.238", "GND(0V) ", + "GPIO.237", "GPIO.234", + "GPIO.236", "GPIO.248", + " GND(0V)", "GPIO.249", + " SDA.2", "SCL.2 ", + "GPIO.232", "GND(0V) ", + "GPIO.231", "GPIO.230", + "GPIO.239", "GND(0V) ", + "GPIO.228", "GPIO.229", + " AIN.1", "1V8 ", + " GND(0V)", "AIN.0 ", + + NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL, + NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL, + NULL,NULL,NULL, +} ; + +/*----------------------------------------------------------------------------*/ +static const char *physNamesOdroidXU3 [64] = +{ + NULL, + + " 3.3V", "5V ", + "I2C1.SDA", "5V ", + "I2C1.SCL", "GND(0V) ", + "GPIO. 18", "UART0.TX", + " GND(0V)", "UART0.RX", + "GPIO.174", "GPIO.173", + "GPIO. 21", "GND(0V) ", + "GPIO. 22", "GPIO. 19", + " 3.3V", "GPIO. 23", + " MOSI", "GND(0V) ", + " MISO", "GPIO. 24", + " SCLK", "CE0 ", + " GND(0V)", "GPIO. 25", + "I2C5.SDA", "I2C5.SCL", + "GPIO. 28", "GND(0V) ", + "GPIO. 30", "GPIO. 29", + "GPIO. 31", "GND(0V) ", + "POWER ON", "GPIO. 33", + " AIN.0", "1V8 ", + " GND(0V)", "AIN.3 ", + + NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL, + NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL, + NULL,NULL,NULL, +} ; + +/*----------------------------------------------------------------------------*/ +static const char *physNamesOdroidN1 [64] = +{ + NULL, + + " 3.0V", "5V ", + "I2C4_SDA", "5V ", + "I2C4_SCL", "GND(0V) ", + "GPIO1A.0", "UART0_TX", + " GND(0V)", "UART0_RX", + "GPIO1A.1", "GPIO1A.2", + "GPIO1A.3", "GND(0V) ", + "GPIO1A.4", "GPIO1B.5", + " 3.0V", "GPIO1C.2", + "SPI1_TXD", "GND(0V) ", + "SPI1_RXD", "GPIO1D.0", + "SPI1_CLK", "SPI1_CSN", + " GND(0V)", "GPIO1C.6", + "I2C8_SDA", "I2C8_SCL", + "SPDIF_TX", "GND(0V) ", + " PWM1", "GPIO4D.4", + "GPIO4D.0", "GND(0V) ", + "GPIO4D.5", "GPIO4D.6", + "ADC.AIN1", "1V8 ", + " GND(0V)", "ADC.AIN0", + + NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL, + NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL, + NULL,NULL,NULL, +} ; + +/*----------------------------------------------------------------------------*/ +static const char *physNamesOdroidN2 [64] = +{ + NULL, + + " 3.3V", "5V ", + " SDA.2", "5V ", + " SCL.2", "GND(0V) ", + "GPIO.473", "TxD1 ", + " GND(0V)", "RxD1 ", + "GPIO.479", "GPIO.492", + "GPIO.480", "GND(0V) ", + "GPIO.483", "GPIO.476", + " 3.3V", "GPIO.477", + " MOSI", "GND(0V) ", + " MISO", "GPIO.478", + " SCLK", "CE0 ", + " GND(0V)", "GPIO.464", + " SDA.3", "SCL.3 ", + "GPIO.490", "GND(0V) ", + "GPIO.491", "GPIO.472", + "GPIO.481", "GND(0V) ", + "GPIO.482", "GPIO.495", + " AIN.3", "1V8 ", + " GND(0V)", "AIN.2 ", + + NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL, + NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL, + NULL,NULL,NULL, +} ; + +/*----------------------------------------------------------------------------*/ +static void readallPhysOdroid (int model, int rev, int physPin, const char *physNames[]) +{ + int pin ; + + // GPIO, wPi pin number + if ((physPinToGpio (physPin) == -1) && (physToWpi [physPin] == -1)) + printf (" | | ") ; + else if (physPinToGpio (physPin) != -1) + printf (" | %3d | %3d", physPinToGpio (physPin), physToWpi [physPin]); + else + printf (" | | %3d", physToWpi [physPin]); + + // GPIO pin name + printf (" | %s", physNames [physPin]) ; + + // GPIO pin mode, value, drive strength, pupd + if ((physToWpi [physPin] == -1) || (physPinToGpio (physPin) == -1)) + printf (" | | | | ") ; + else { + if (wpMode == MODE_GPIO) + pin = physPinToGpio (physPin); + else if (wpMode == MODE_PHYS) + pin = physPin ; + else + pin = physToWpi [physPin]; + + printf (" | %4s", alts [getAlt (pin)]) ; + printf (" | %d", digitalRead (pin)) ; + switch (model) { + case MODEL_ODROID_N1: + printf (" | | "); + break; + case MODEL_ODROID_C1: + case MODEL_ODROID_C2: + printf (" | | %5s", pupd[getPUPD(pin)]); + break; + case MODEL_ODROID_XU3: + case MODEL_ODROID_N2: + printf (" | %2d | %5s", getPadDrive(pin), pupd[getPUPD(pin)]); + break; + default: + break; + } + } + + // Physical pin number + printf (" | %2d", physPin) ; + ++physPin ; + printf (" || %-2d", physPin) ; + + // GPIO pin mode, value, drive strength, pupd + if ((physToWpi [physPin] == -1) || (physPinToGpio (physPin) == -1)) + printf (" | | | | ") ; + else { + if (wpMode == MODE_GPIO) + pin = physPinToGpio (physPin); + else if (wpMode == MODE_PHYS) + pin = physPin ; + else + pin = physToWpi [physPin]; + + switch (model) { + case MODEL_ODROID_N1: + printf (" | | "); + break; + case MODEL_ODROID_C1: + case MODEL_ODROID_C2: + printf (" | %-5s | ", pupd[getPUPD(pin)]); + break; + case MODEL_ODROID_XU3: + case MODEL_ODROID_N2: + printf (" | %-5s | %-2d", pupd[getPUPD(pin)], getPadDrive(pin)); + break; + default: + break; + } + printf (" | %d", digitalRead (pin)); + printf (" | %-4s", alts [getAlt (pin)]); + } + + // GPIO pin name + printf (" | %-6s", physNames [physPin]); + + // GPIO, wPi pin number + if ((physPinToGpio (physPin) == -1) && (physToWpi [physPin] == -1)) + printf (" | | ") ; + else if (physPinToGpio (physPin) != -1) + printf (" | %-3d | %-3d", physToWpi [physPin], physPinToGpio (physPin)); + else + printf (" | %-3d | ", physToWpi [physPin]); + + printf (" |\n") ; +} + +/*----------------------------------------------------------------------------*/ +void ReadallOdroid (int model, int rev, const char *physNames[]) +{ + int pin ; + + printf (" | GPIO | wPi | Name | Mode | V | DS | PU/PD | Physical | PU/PD | DS | V | Mode | Name | wPi | GPIO |\n") ; + printf (" +------+-----+----------+------+---+----+-------+----++----+-------+----+---+------+----------+-----+------+\n") ; + for (pin = 1 ; pin <= 40 ; pin += 2) + readallPhysOdroid (model, rev, pin, physNames) ; + printf (" +------+-----+----------+------+---+----+-------+----++----+-------+----+---+------+----------+-----+------+\n") ; +} + +/*----------------------------------------------------------------------------*/ /* * doReadall: * Read all the GPIO pins @@ -72,297 +410,62 @@ static void doReadallExternal (void) * connected device, so we need to do some fiddling with the internal * wiringPi node structures - since the gpio command can only use * one external device at a time, we'll use that to our advantage... - ********************************************************************************* */ - -static char *alts [] = -{ - "IN", "OUT", "ALT5", "ALT4", "ALT0", "ALT1", "ALT2", "ALT3" -} ; - -static int physToWpi [64] = -{ - -1, // 0 - -1, -1, // 1, 2 - 8, -1, - 9, -1, - 7, 15, - -1, 16, - 0, 1, - 2, -1, - 3, 4, - -1, 5, - 12, -1, - 13, 6, - 14, 10, - -1, 11, // 25, 26 - 30, 31, // Actually I2C, but not used - 21, -1, - 22, 26, - 23, -1, - 24, 27, - 25, 28, - -1, 29, - -1, -1, - -1, -1, - -1, -1, - -1, -1, - -1, -1, - 17, 18, - 19, 20, - -1, -1, -1, -1, -1, -1, -1, -1, -1 -} ; - -static char *physNames [64] = -{ - NULL, - - " 3.3v", "5v ", - " SDA.1", "5v ", - " SCL.1", "0v ", - "GPIO. 7", "TxD ", - " 0v", "RxD ", - "GPIO. 0", "GPIO. 1", - "GPIO. 2", "0v ", - "GPIO. 3", "GPIO. 4", - " 3.3v", "GPIO. 5", - " MOSI", "0v ", - " MISO", "GPIO. 6", - " SCLK", "CE0 ", - " 0v", "CE1 ", - " SDA.0", "SCL.0 ", - "GPIO.21", "0v ", - "GPIO.22", "GPIO.26", - "GPIO.23", "0v ", - "GPIO.24", "GPIO.27", - "GPIO.25", "GPIO.28", - " 0v", "GPIO.29", - NULL, NULL, - NULL, NULL, - NULL, NULL, - NULL, NULL, - NULL, NULL, - "GPIO.17", "GPIO.18", - "GPIO.19", "GPIO.20", - NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL, -} ; - - -/* - * readallPhys: - * Given a physical pin output the data on it and the next pin: - *| BCM | wPi | Name | Mode | Val| Physical |Val | Mode | Name | wPi | BCM | - ********************************************************************************* - */ - -static void readallPhys (int physPin) -{ - int pin ; - - if (physPinToGpio (physPin) == -1) - printf (" | | ") ; - else - printf (" | %3d | %3d", physPinToGpio (physPin), physToWpi [physPin]) ; - - printf (" | %s", physNames [physPin]) ; - - if (physToWpi [physPin] == -1) - printf (" | | ") ; - else - { - /**/ if (wpMode == WPI_MODE_GPIO) - pin = physPinToGpio (physPin) ; - else if (wpMode == WPI_MODE_PHYS) - pin = physPin ; - else - pin = physToWpi [physPin] ; - - printf (" | %4s", alts [getAlt (pin)]) ; - printf (" | %d", digitalRead (pin)) ; - } - -// Pin numbers: - - printf (" | %2d", physPin) ; - ++physPin ; - printf (" || %-2d", physPin) ; - -// Same, reversed - - if (physToWpi [physPin] == -1) - printf (" | | ") ; - else - { - /**/ if (wpMode == WPI_MODE_GPIO) - pin = physPinToGpio (physPin) ; - else if (wpMode == WPI_MODE_PHYS) - pin = physPin ; - else - pin = physToWpi [physPin] ; - - printf (" | %d", digitalRead (pin)) ; - printf (" | %-4s", alts [getAlt (pin)]) ; - } - - printf (" | %-5s", physNames [physPin]) ; - - if (physToWpi [physPin] == -1) - printf (" | | ") ; - else - printf (" | %-3d | %-3d", physToWpi [physPin], physPinToGpio (physPin)) ; - - printf (" |\n") ; -} - - -/* - * allReadall: - * Read all the pins regardless of the model. Primarily of use for - * the compute module, but handy for other fiddling... - ********************************************************************************* - */ - -static void allReadall (void) -{ - int pin ; - - printf ("+-----+------+-------+ +-----+------+-------+\n") ; - printf ("| Pin | Mode | Value | | Pin | Mode | Value |\n") ; - printf ("+-----+------+-------+ +-----+------+-------+\n") ; - - for (pin = 0 ; pin < 27 ; ++pin) - { - printf ("| %3d ", pin) ; - printf ("| %-4s ", alts [getAlt (pin)]) ; - printf ("| %s ", digitalRead (pin) == HIGH ? "High" : "Low ") ; - printf ("| ") ; - printf ("| %3d ", pin + 27) ; - printf ("| %-4s ", alts [getAlt (pin + 27)]) ; - printf ("| %s ", digitalRead (pin + 27) == HIGH ? "High" : "Low ") ; - printf ("|\n") ; - } - - printf ("+-----+------+-------+ +-----+------+-------+\n") ; - -} - - -/* - * abReadall: - * Read all the pins on the model A or B. - ********************************************************************************* - */ - -void abReadall (int model, int rev) -{ - int pin ; - char *type ; - - if (model == PI_MODEL_A) - type = " A" ; - else - if (rev == PI_VERSION_2) - type = "B2" ; - else - type = "B1" ; - - printf (" +-----+-----+---------+------+---+-Model %s-+---+------+---------+-----+-----+\n", type) ; - printf (" | BCM | wPi | Name | Mode | V | Physical | V | Mode | Name | wPi | BCM |\n") ; - printf (" +-----+-----+---------+------+---+----++----+---+------+---------+-----+-----+\n") ; - for (pin = 1 ; pin <= 26 ; pin += 2) - readallPhys (pin) ; - - if (rev == PI_VERSION_2) // B version 2 - { - printf (" +-----+-----+---------+------+---+----++----+---+------+---------+-----+-----+\n") ; - for (pin = 51 ; pin <= 54 ; pin += 2) - readallPhys (pin) ; - } - - printf (" +-----+-----+---------+------+---+----++----+---+------+---------+-----+-----+\n") ; - printf (" | BCM | wPi | Name | Mode | V | Physical | V | Mode | Name | wPi | BCM |\n") ; - printf (" +-----+-----+---------+------+---+-Model %s-+---+------+---------+-----+-----+\n", type) ; -} - - -/* - * piPlusReadall: - * Read all the pins on the model A+ or the B+ - ********************************************************************************* - */ - -static void plus2header (int model) -{ - /**/ if (model == PI_MODEL_AP) - printf (" +-----+-----+---------+------+---+--A Plus--+---+------+---------+-----+-----+\n") ; - else if (model == PI_MODEL_BP) - printf (" +-----+-----+---------+------+---+--B Plus--+---+------+---------+-----+-----+\n") ; - else if (model == PI_MODEL_ZERO) - printf (" +-----+-----+---------+------+---+-Pi Zero--+---+------+---------+-----+-----+\n") ; - else if (model == PI_MODEL_ZERO_W) - printf (" +-----+-----+---------+------+---+-Pi ZeroW-+---+------+---------+-----+-----+\n") ; - else if (model == PI_MODEL_2) - printf (" +-----+-----+---------+------+---+---Pi 2---+---+------+---------+-----+-----+\n") ; - else if (model == PI_MODEL_3) - printf (" +-----+-----+---------+------+---+---Pi 3---+---+------+---------+-----+-----+\n") ; - else - printf (" +-----+-----+---------+------+---+---Pi ?---+---+------+---------+-----+-----+\n") ; -} - - -static void piPlusReadall (int model) -{ - int pin ; - - plus2header (model) ; - - printf (" | BCM | wPi | Name | Mode | V | Physical | V | Mode | Name | wPi | BCM |\n") ; - printf (" +-----+-----+---------+------+---+----++----+---+------+---------+-----+-----+\n") ; - for (pin = 1 ; pin <= 40 ; pin += 2) - readallPhys (pin) ; - printf (" +-----+-----+---------+------+---+----++----+---+------+---------+-----+-----+\n") ; - printf (" | BCM | wPi | Name | Mode | V | Physical | V | Mode | Name | wPi | BCM |\n") ; - - plus2header (model) ; -} - - -/* - * doReadall: - * Generic read all pins called from main program. Works out the Pi type - * and calls the appropriate function. - ********************************************************************************* - */ - +/*----------------------------------------------------------------------------*/ void doReadall (void) { - int model, rev, mem, maker, overVolted ; + int model, rev, mem, maker, overVolted; + const char (*physNames)[]; - if (wiringPiNodes != NULL) // External readall - { - doReadallExternal () ; - return ; - } + // External readall + if (wiringPiNodes != NULL) { + doReadallExternal (); + return ; + } - piBoardId (&model, &rev, &mem, &maker, &overVolted) ; + piBoardId (&model, &rev, &mem, &maker, &overVolted) ; - /**/ if ((model == PI_MODEL_A) || (model == PI_MODEL_B)) - abReadall (model, rev) ; - else if ((model == PI_MODEL_BP) || (model == PI_MODEL_AP) || (model == PI_MODEL_2) || (model == PI_MODEL_3) || (model == PI_MODEL_ZERO) || (model == PI_MODEL_ZERO_W)) - piPlusReadall (model) ; - else if ((model == PI_MODEL_CM) || (model == PI_MODEL_CM3)) - allReadall () ; - else - printf ("Oops - unable to determine board type... model: %d\n", model) ; + switch (model) { + case MODEL_ODROID_C1: + printf (" +------+-----+----------+------+---+----+---- Model ODROID-C1 ----+----+---+------+----------+-----+------+\n") ; + physNames = physNamesOdroidC1; + break; + case MODEL_ODROID_C2: + printf (" +------+-----+----------+------+---+----+---- Model ODROID-C2 ----+----+---+------+----------+-----+------+\n") ; + if (rev == 1) + physNames = physNamesOdroidC2_Rev1; + else + physNames = physNamesOdroidC2_Rev2; + break; + case MODEL_ODROID_XU3: + printf (" +------+-----+----------+------+---+----+--- Model ODROID-XU3/4 ---+----+---+------+----------+-----+------+\n") ; + physNames = physNamesOdroidXU3; + break; + case MODEL_ODROID_N1: + printf (" +------+-----+----------+------+---+----+---- Model ODROID-N1 ----+----+---+------+----------+-----+------+\n") ; + physNames = physNamesOdroidN1; + break; + case MODEL_ODROID_N2: + printf (" +------+-----+----------+------+---+----+---- Model ODROID-N2 ----+----+---+------+----------+-----+------+\n") ; + physNames = physNamesOdroidN2; + break; + default: + printf ("Oops - unable to determine board type... model: %d\n", model) ; + return; + } + ReadallOdroid(model, rev, physNames); } +/*----------------------------------------------------------------------------*/ /* * doAllReadall: * Force reading of all pins regardless of Pi model - ********************************************************************************* */ - +/*----------------------------------------------------------------------------*/ void doAllReadall (void) { - allReadall () ; + doReadall(); } + +/*----------------------------------------------------------------------------*/ +/*----------------------------------------------------------------------------*/ diff --git a/gpio/readall_odroid.c b/gpio/readall_odroid.c deleted file mode 100755 index ba64ec4..0000000 --- a/gpio/readall_odroid.c +++ /dev/null @@ -1,471 +0,0 @@ -/* - * readall.c: - * The readall functions - getting a bit big, so split them out. - * Copyright (c) 2012-2017 Gordon Henderson - *********************************************************************** - * This file is part of wiringPi: - * https://projects.drogon.net/raspberry-pi/wiringpi/ - * - * wiringPi is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * wiringPi is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public License - * along with wiringPi. If not, see . - *********************************************************************** - */ -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#include -/*----------------------------------------------------------------------------*/ - -extern int wpMode ; - -/*----------------------------------------------------------------------------*/ -#ifndef TRUE -# define TRUE (1==1) -# define FALSE (1==2) -#endif - -/*----------------------------------------------------------------------------*/ -/* - * doReadallExternal: - * A relatively crude way to read the pins on an external device. - * We don't know the input/output mode of pins, but we can tell - * if it's an analog pin or a digital one... - */ -/*----------------------------------------------------------------------------*/ -static void doReadallExternal (void) -{ - int pin ; - - printf ("+------+---------+--------+\n") ; - printf ("| Pin | Digital | Analog |\n") ; - printf ("+------+---------+--------+\n") ; - - for (pin = wiringPiNodes->pinBase ; pin <= wiringPiNodes->pinMax ; ++pin) - printf ("| %4d | %4d | %4d |\n", pin, digitalRead (pin), analogRead (pin)) ; - - printf ("+------+---------+--------+\n") ; -} - -/*----------------------------------------------------------------------------*/ -static const char *alts [] = -{ - "IN", "OUT", "ALT1", "ALT2", "ALT3", "ALT4", "ALT5", "ALT6", "ALT7" -} ; - -static const char *pupd [] = -{ - "DSBLD", "P/U", "P/D" -} ; - -/*----------------------------------------------------------------------------*/ -static const int physToWpi [64] = -{ - -1, // 0 - -1, -1, // 1, 2 - 8, -1, - 9, -1, - 7, 15, - -1, 16, - 0, 1, - 2, -1, - 3, 4, - -1, 5, - 12, -1, - 13, 6, - 14, 10, - -1, 11, // 25, 26 - 30, 31, // Actually I2C, but not used - 21, -1, - 22, 26, - 23, -1, - 24, 27, - 25, 28, - -1, 29, - -1, -1, - -1, -1, - -1, -1, - -1, -1, - -1, -1, - 17, 18, - 19, 20, - -1, -1, -1, -1, -1, -1, -1, -1, -1 -} ; - -/*----------------------------------------------------------------------------*/ -static const char *physNamesOdroidC1 [64] = -{ - NULL, - - " 3.3V", "5V ", - " SDA.1", "5V ", - " SCL.1", "GND(0V) ", - "GPIO. 83", "TxD1 ", - " GND(0V)", "RxD1 ", - "GPIO. 88", "GPIO. 87", - "GPIO.116", "GND(0V) ", - "GPIO.115", "GPIO.104", - " 3.3V", "GPIO.102", - " MOSI", "GND(0V) ", - " MISO", "GPIO.103", - " SCLK", "CE0 ", - " GND(0V)", "GPIO.118", - " SDA.2", "SCL.2 ", - "GPIO.101", "GND(0V) ", - "GPIO.100", "GPIO. 99", - "GPIO.108", "GND(0V) ", - "GPIO.97 ", "GPIO. 98", - " AIN.1", "1V8 ", - " GND(0V)", "AIN.0 ", - - NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL, - NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL, - NULL,NULL,NULL, -} ; - -/*----------------------------------------------------------------------------*/ -static const char *physNamesOdroidC2_Rev2 [64] = -{ - NULL, - - " 3.3V", "5V ", - " SDA.1", "5V ", - " SCL.1", "GND(0V) ", - "GPIO.249", "TxD1 ", - " GND(0V)", "RxD1 ", - "GPIO.247", "GPIO.238", - "GPIO.239", "GND(0V) ", - "GPIO.237", "GPIO.236", - " 3.3V", "GPIO.233", - "GPIO.235", "GND(0V) ", - "GPIO.232", "GPIO.231", - "GPIO.230", "GPIO.229", - " GND(0V)", "GPIO.225", - " SDA.2", "SCL.2 ", - "GPIO.228", "GND(0V) ", - "GPIO.219", "GPIO.224", - "GPIO.234", "GND(0V) ", - "GPIO.214", "GPIO.218", - " AIN.1", "1V8 ", - " GND(0V)", "AIN.0 ", - - NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL, - NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL, - NULL,NULL,NULL, -} ; - -/*----------------------------------------------------------------------------*/ -static const char *physNamesOdroidC2_Rev1 [64] = -{ - NULL, - - " 3.3V", "5V ", - " SDA.1", "5V ", - " SCL.1", "GND(0V) ", - "GPIO.214", "--------", - " GND(0V)", "--------", - "GPIO.219", "GPIO.218", - "GPIO.247", "GND(0V) ", - "--------", "GPIO.235", - " 3.3V", "GPIO.233", - "GPIO.238", "GND(0V) ", - "GPIO.237", "GPIO.234", - "GPIO.236", "GPIO.248", - " GND(0V)", "GPIO.249", - " SDA.2", "SCL.2 ", - "GPIO.232", "GND(0V) ", - "GPIO.231", "GPIO.230", - "GPIO.239", "GND(0V) ", - "GPIO.228", "GPIO.229", - " AIN.1", "1V8 ", - " GND(0V)", "AIN.0 ", - - NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL, - NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL, - NULL,NULL,NULL, -} ; - -/*----------------------------------------------------------------------------*/ -static const char *physNamesOdroidXU3 [64] = -{ - NULL, - - " 3.3V", "5V ", - "I2C1.SDA", "5V ", - "I2C1.SCL", "GND(0V) ", - "GPIO. 18", "UART0.TX", - " GND(0V)", "UART0.RX", - "GPIO.174", "GPIO.173", - "GPIO. 21", "GND(0V) ", - "GPIO. 22", "GPIO. 19", - " 3.3V", "GPIO. 23", - " MOSI", "GND(0V) ", - " MISO", "GPIO. 24", - " SCLK", "CE0 ", - " GND(0V)", "GPIO. 25", - "I2C5.SDA", "I2C5.SCL", - "GPIO. 28", "GND(0V) ", - "GPIO. 30", "GPIO. 29", - "GPIO. 31", "GND(0V) ", - "POWER ON", "GPIO. 33", - " AIN.0", "1V8 ", - " GND(0V)", "AIN.3 ", - - NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL, - NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL, - NULL,NULL,NULL, -} ; - -/*----------------------------------------------------------------------------*/ -static const char *physNamesOdroidN1 [64] = -{ - NULL, - - " 3.0V", "5V ", - "I2C4_SDA", "5V ", - "I2C4_SCL", "GND(0V) ", - "GPIO1A.0", "UART0_TX", - " GND(0V)", "UART0_RX", - "GPIO1A.1", "GPIO1A.2", - "GPIO1A.3", "GND(0V) ", - "GPIO1A.4", "GPIO1B.5", - " 3.0V", "GPIO1C.2", - "SPI1_TXD", "GND(0V) ", - "SPI1_RXD", "GPIO1D.0", - "SPI1_CLK", "SPI1_CSN", - " GND(0V)", "GPIO1C.6", - "I2C8_SDA", "I2C8_SCL", - "SPDIF_TX", "GND(0V) ", - " PWM1", "GPIO4D.4", - "GPIO4D.0", "GND(0V) ", - "GPIO4D.5", "GPIO4D.6", - "ADC.AIN1", "1V8 ", - " GND(0V)", "ADC.AIN0", - - NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL, - NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL, - NULL,NULL,NULL, -} ; - -/*----------------------------------------------------------------------------*/ -static const char *physNamesOdroidN2 [64] = -{ - NULL, - - " 3.3V", "5V ", - " SDA.2", "5V ", - " SCL.2", "GND(0V) ", - "GPIO.473", "TxD1 ", - " GND(0V)", "RxD1 ", - "GPIO.479", "GPIO.492", - "GPIO.480", "GND(0V) ", - "GPIO.483", "GPIO.476", - " 3.3V", "GPIO.477", - " MOSI", "GND(0V) ", - " MISO", "GPIO.478", - " SCLK", "CE0 ", - " GND(0V)", "GPIO.464", - " SDA.3", "SCL.3 ", - "GPIO.490", "GND(0V) ", - "GPIO.491", "GPIO.472", - "GPIO.481", "GND(0V) ", - "GPIO.482", "GPIO.495", - " AIN.3", "1V8 ", - " GND(0V)", "AIN.2 ", - - NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL, - NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL, - NULL,NULL,NULL, -} ; - -/*----------------------------------------------------------------------------*/ -static void readallPhysOdroid (int model, int rev, int physPin, const char *physNames[]) -{ - int pin ; - - // GPIO, wPi pin number - if ((physPinToGpio (physPin) == -1) && (physToWpi [physPin] == -1)) - printf (" | | ") ; - else if (physPinToGpio (physPin) != -1) - printf (" | %3d | %3d", physPinToGpio (physPin), physToWpi [physPin]); - else - printf (" | | %3d", physToWpi [physPin]); - - // GPIO pin name - printf (" | %s", physNames [physPin]) ; - - // GPIO pin mode, value, drive strength, pupd - if ((physToWpi [physPin] == -1) || (physPinToGpio (physPin) == -1)) - printf (" | | | | ") ; - else { - if (wpMode == MODE_GPIO) - pin = physPinToGpio (physPin); - else if (wpMode == MODE_PHYS) - pin = physPin ; - else - pin = physToWpi [physPin]; - - printf (" | %4s", alts [getAlt (pin)]) ; - printf (" | %d", digitalRead (pin)) ; - switch (model) { - case MODEL_ODROID_N1: - printf (" | | "); - break; - case MODEL_ODROID_C1: - case MODEL_ODROID_C2: - printf (" | | %5s", pupd[getPUPD(pin)]); - break; - case MODEL_ODROID_XU3: - case MODEL_ODROID_N2: - printf (" | %2d | %5s", getPadDrive(pin), pupd[getPUPD(pin)]); - break; - default: - break; - } - } - - // Physical pin number - printf (" | %2d", physPin) ; - ++physPin ; - printf (" || %-2d", physPin) ; - - // GPIO pin mode, value, drive strength, pupd - if ((physToWpi [physPin] == -1) || (physPinToGpio (physPin) == -1)) - printf (" | | | | ") ; - else { - if (wpMode == MODE_GPIO) - pin = physPinToGpio (physPin); - else if (wpMode == MODE_PHYS) - pin = physPin ; - else - pin = physToWpi [physPin]; - - switch (model) { - case MODEL_ODROID_N1: - printf (" | | "); - break; - case MODEL_ODROID_C1: - case MODEL_ODROID_C2: - printf (" | %-5s | ", pupd[getPUPD(pin)]); - break; - case MODEL_ODROID_XU3: - case MODEL_ODROID_N2: - printf (" | %-5s | %-2d", pupd[getPUPD(pin)], getPadDrive(pin)); - break; - default: - break; - } - printf (" | %d", digitalRead (pin)); - printf (" | %-4s", alts [getAlt (pin)]); - } - - // GPIO pin name - printf (" | %-6s", physNames [physPin]); - - // GPIO, wPi pin number - if ((physPinToGpio (physPin) == -1) && (physToWpi [physPin] == -1)) - printf (" | | ") ; - else if (physPinToGpio (physPin) != -1) - printf (" | %-3d | %-3d", physToWpi [physPin], physPinToGpio (physPin)); - else - printf (" | %-3d | ", physToWpi [physPin]); - - printf (" |\n") ; -} - -/*----------------------------------------------------------------------------*/ -void ReadallOdroid (int model, int rev, const char *physNames[]) -{ - int pin ; - - printf (" | GPIO | wPi | Name | Mode | V | DS | PU/PD | Physical | PU/PD | DS | V | Mode | Name | wPi | GPIO |\n") ; - printf (" +------+-----+----------+------+---+----+-------+----++----+-------+----+---+------+----------+-----+------+\n") ; - for (pin = 1 ; pin <= 40 ; pin += 2) - readallPhysOdroid (model, rev, pin, physNames) ; - printf (" +------+-----+----------+------+---+----+-------+----++----+-------+----+---+------+----------+-----+------+\n") ; -} - -/*----------------------------------------------------------------------------*/ -/* - * doReadall: - * Read all the GPIO pins - * We also want to use this to read the state of pins on an externally - * connected device, so we need to do some fiddling with the internal - * wiringPi node structures - since the gpio command can only use - * one external device at a time, we'll use that to our advantage... - */ -/*----------------------------------------------------------------------------*/ -void doReadall (void) -{ - int model, rev, mem, maker, overVolted; - const char (*physNames)[]; - - // External readall - if (wiringPiNodes != NULL) { - doReadallExternal (); - return ; - } - - piBoardId (&model, &rev, &mem, &maker, &overVolted) ; - - switch (model) { - case MODEL_ODROID_C1: - printf (" +------+-----+----------+------+---+----+---- Model ODROID-C1 ----+----+---+------+----------+-----+------+\n") ; - physNames = physNamesOdroidC1; - break; - case MODEL_ODROID_C2: - printf (" +------+-----+----------+------+---+----+---- Model ODROID-C2 ----+----+---+------+----------+-----+------+\n") ; - if (rev == 1) - physNames = physNamesOdroidC2_Rev1; - else - physNames = physNamesOdroidC2_Rev2; - break; - case MODEL_ODROID_XU3: - printf (" +------+-----+----------+------+---+----+--- Model ODROID-XU3/4 ---+----+---+------+----------+-----+------+\n") ; - physNames = physNamesOdroidXU3; - break; - case MODEL_ODROID_N1: - printf (" +------+-----+----------+------+---+----+---- Model ODROID-N1 ----+----+---+------+----------+-----+------+\n") ; - physNames = physNamesOdroidN1; - break; - case MODEL_ODROID_N2: - printf (" +------+-----+----------+------+---+----+---- Model ODROID-N2 ----+----+---+------+----------+-----+------+\n") ; - physNames = physNamesOdroidN2; - break; - default: - printf ("Oops - unable to determine board type... model: %d\n", model) ; - return; - } - ReadallOdroid(model, rev, physNames); -} - -/*----------------------------------------------------------------------------*/ -/* - * doAllReadall: - * Force reading of all pins regardless of Pi model - */ -/*----------------------------------------------------------------------------*/ -void doAllReadall (void) -{ - doReadall(); -} - -/*----------------------------------------------------------------------------*/ -/*----------------------------------------------------------------------------*/ diff --git a/wiringPi/Makefile b/wiringPi/Makefile index d06fc17..dcae986 100755 --- a/wiringPi/Makefile +++ b/wiringPi/Makefile @@ -27,9 +27,6 @@ PREFIX?=/local LDCONFIG?=ldconfig -# BRAND_NAME = Pi -BRAND_NAME = Odroid - ifneq ($V,1) Q ?= @ endif @@ -48,11 +45,11 @@ LIBS = -lm -lpthread -lrt -lcrypt ############################################################################### -SRC = wiring${BRAND_NAME}.c \ +SRC = wiringPi.c \ wiringSerial.c wiringShift.c \ piHiPri.c piThread.c \ - wiring${BRAND_NAME}SPI.c \ - wiring${BRAND_NAME}I2C.c \ + wiringPiSPI.c \ + wiringPiI2C.c \ softPwm.c softTone.c \ mcp23008.c mcp23016.c mcp23017.c \ mcp23s08.c mcp23s17.c \ @@ -64,15 +61,12 @@ SRC = wiring${BRAND_NAME}.c \ bmp180.c htu21d.c ds18b20.c \ drcSerial.c drcNet.c \ pseudoPins.c \ - wpiExtensions.c - -ifeq ($(BRAND_NAME), Odroid) - SRC += odroidc1.c \ - odroidc2.c \ - odroidxu3.c \ - odroidn1.c \ - odroidn2.c -endif + wpiExtensions.c \ + odroidc1.c \ + odroidc2.c \ + odroidxu3.c \ + odroidn1.c \ + odroidn2.c HEADERS = $(shell ls *.h) @@ -152,17 +146,14 @@ depend: # DO NOT DELETE -ifeq ($(BRAND_NAME), Odroid) - wiringOdroid.o: softPwm.h softTone.h wiringPi.h wiringOdroid.h ../version.h - odroidc1.c : wiringPi.h wiringOdroid.h odroidc1.h - odroidc2.c : wiringPi.h wiringOdroid.h odroidc2.h - odroidxu3.c : wiringPi.h wiringOdroid.h odroidxu3.h - odroidn1.c : wiringPi.h wiringOdroid.h odroidn1.h - odroidn2.c : wiringPi.h wiringOdroid.h odroidn2.h -else - wiringPi.o: softPwm.h softTone.h wiringPi.h ../version.h -endif +# ODROID Boards +odroidc1.o : wiringPi.h odroidc1.h +odroidc2.o : wiringPi.h odroidc2.h +odroidxu3.o : wiringPi.h odroidxu3.h +odroidn1.o : wiringPi.h odroidn1.h +odroidn2.o : wiringPi.h odroidn2.h +wiringPi.o: softPwm.h softTone.h wiringPi.h ../version.h wiringSerial.o: wiringSerial.h wiringShift.o: wiringPi.h wiringShift.h piHiPri.o: wiringPi.h diff --git a/wiringPi/odroid_template.c b/wiringPi/odroid_template.c index 8fd82f5..4706e0a 100755 --- a/wiringPi/odroid_template.c +++ b/wiringPi/odroid_template.c @@ -18,7 +18,11 @@ #include /*----------------------------------------------------------------------------*/ -#include "wiringOdroid.h" +#include "softPwm.h" +#include "softTone.h" + +/*----------------------------------------------------------------------------*/ +#include "wiringPi.h" #include "odroid???.h" /*----------------------------------------------------------------------------*/ @@ -101,17 +105,17 @@ static int gpioToShiftReg (int pin); static int gpioToGPFSELReg (int pin); /*----------------------------------------------------------------------------*/ -// wiringPi core function +// wiringPi core function /*----------------------------------------------------------------------------*/ -static int getModeToGpio (int mode, int pin); -static void pinMode (int pin, int mode); -static int getAlt (int pin); -static void pullUpDnControl (int pin, int pud); -static int digitalRead (int pin); -static void digitalWrite (int pin, int value); -static int analogRead (int pin); -static void digitalWriteByte(const int value); -static unsigned int digitalReadByte (void); +static int _getModeToGpio (int mode, int pin); +static void _pinMode (int pin, int mode); +static int _getAlt (int pin); +static void _pullUpDnControl (int pin, int pud); +static int _digitalRead (int pin); +static void _digitalWrite (int pin, int value); +static int _analogRead (int pin); +static void _digitalWriteByte (const int value); +static unsigned int _digitalReadByte (void); /*----------------------------------------------------------------------------*/ // board init function @@ -182,50 +186,50 @@ static int gpioToGPFSELReg (int pin) return -1; } /*----------------------------------------------------------------------------*/ -static int getModeToGpio (int mode, int pin) +static int _getModeToGpio (int mode, int pin) { return -1; } /*----------------------------------------------------------------------------*/ -static void pinMode (int pin, int mode) +static void _pinMode (int pin, int mode) { } /*----------------------------------------------------------------------------*/ -static int getAlt (int pin) +static int _getAlt (int pin) { return -1; } /*----------------------------------------------------------------------------*/ -static void pullUpDnControl (int pin, int pud) +static void _pullUpDnControl (int pin, int pud) { } /*----------------------------------------------------------------------------*/ -static int digitalRead (int pin) +static int _digitalRead (int pin) { } /*----------------------------------------------------------------------------*/ -static void digitalWrite (int pin, int value) +static void _digitalWrite (int pin, int value) { } /*----------------------------------------------------------------------------*/ -static int analogRead (int pin) +static int _analogRead (int pin) { return -1; } /*----------------------------------------------------------------------------*/ -static void digitalWriteByte (const int value) +static void _digitalWriteByte (const int value) { } /*----------------------------------------------------------------------------*/ -static unsigned int digitalReadByte (void) +static unsigned int _digitalReadByte (void) { return -1; } @@ -248,15 +252,15 @@ void init_odroid??? (struct libodroid *libwiring) init_adc_fds(); /* wiringPi Core function initialize */ - libwiring->getModeToGpio = getModeToGpio; - libwiring->pinMode = pinMode; - libwiring->getAlt = getAlt; - libwiring->pullUpDnControl = pullUpDnControl; - libwiring->digitalRead = digitalRead; - libwiring->digitalWrite = digitalWrite; - libwiring->analogRead = analogRead; - libwiring->digitalWriteByte = digitalWriteByte; - libwiring->digitalReadByte = digitalReadByte; + libwiring->getModeToGpio = _getModeToGpio; + libwiring->pinMode = _pinMode; + libwiring->getAlt = _getAlt; + libwiring->pullUpDnControl = _pullUpDnControl; + libwiring->digitalRead = _digitalRead; + libwiring->digitalWrite = _digitalWrite; + libwiring->analogRead = _analogRead; + libwiring->digitalWriteByte = _digitalWriteByte; + libwiring->digitalReadByte = _digitalReadByte; /* global variable setup */ lib = libwiring; diff --git a/wiringPi/odroidc1.c b/wiringPi/odroidc1.c index f060f38..73637b6 100755 --- a/wiringPi/odroidc1.c +++ b/wiringPi/odroidc1.c @@ -18,7 +18,11 @@ #include /*----------------------------------------------------------------------------*/ -#include "wiringOdroid.h" +#include "softPwm.h" +#include "softTone.h" + +/*----------------------------------------------------------------------------*/ +#include "wiringPi.h" #include "odroidc1.h" /*----------------------------------------------------------------------------*/ @@ -103,18 +107,18 @@ static int gpioToShiftReg (int pin); static int gpioToGPFSELReg (int pin); /*----------------------------------------------------------------------------*/ -// wiringPi core function +// wiringPi core function /*----------------------------------------------------------------------------*/ -static int getModeToGpio (int mode, int pin); -static void pinMode (int pin, int mode); -static int getAlt (int pin); -static int getPUPD (int pin); -static void pullUpDnControl (int pin, int pud); -static int digitalRead (int pin); -static void digitalWrite (int pin, int value); -static int analogRead (int pin); -static void digitalWriteByte(const int value); -static unsigned int digitalReadByte (void); +static int _getModeToGpio (int mode, int pin); +static void _pinMode (int pin, int mode); +static int _getAlt (int pin); +static int _getPUPD (int pin); +static void _pullUpDnControl (int pin, int pud); +static int _digitalRead (int pin); +static void _digitalWrite (int pin, int value); +static int _analogRead (int pin); +static void _digitalWriteByte (const int value); +static unsigned int _digitalReadByte (void); /*----------------------------------------------------------------------------*/ // board init function @@ -132,12 +136,12 @@ static void init_adc_fds (void); /*----------------------------------------------------------------------------*/ static int gpioToGPSETReg (int pin) { - if (pin >= GPIOX_PIN_START && pin <= GPIOX_PIN_END) - return GPIOX_OUTP_REG_OFFSET; - if (pin >= GPIOY_PIN_START && pin <= GPIOY_PIN_END) - return GPIOY_OUTP_REG_OFFSET; - if (pin >= GPIODV_PIN_START && pin <= GPIODV_PIN_END) - return GPIODV_OUTP_REG_OFFSET; + if (pin >= C1_GPIOX_PIN_START && pin <= C1_GPIOX_PIN_END) + return C1_GPIOX_OUTP_REG_OFFSET; + if (pin >= C1_GPIOY_PIN_START && pin <= C1_GPIOY_PIN_END) + return C1_GPIOY_OUTP_REG_OFFSET; + if (pin >= C1_GPIODV_PIN_START && pin <= C1_GPIODV_PIN_END) + return C1_GPIODV_OUTP_REG_OFFSET; return -1; } @@ -148,12 +152,12 @@ static int gpioToGPSETReg (int pin) /*----------------------------------------------------------------------------*/ static int gpioToGPLEVReg (int pin) { - if (pin >= GPIOX_PIN_START && pin <= GPIOX_PIN_END) - return GPIOX_INP_REG_OFFSET; - if (pin >= GPIOY_PIN_START && pin <= GPIOY_PIN_END) - return GPIOY_INP_REG_OFFSET; - if (pin >= GPIODV_PIN_START && pin <= GPIODV_PIN_END) - return GPIODV_INP_REG_OFFSET; + if (pin >= C1_GPIOX_PIN_START && pin <= C1_GPIOX_PIN_END) + return C1_GPIOX_INP_REG_OFFSET; + if (pin >= C1_GPIOY_PIN_START && pin <= C1_GPIOY_PIN_END) + return C1_GPIOY_INP_REG_OFFSET; + if (pin >= C1_GPIODV_PIN_START && pin <= C1_GPIODV_PIN_END) + return C1_GPIODV_INP_REG_OFFSET; return -1; } @@ -164,12 +168,12 @@ static int gpioToGPLEVReg (int pin) /*----------------------------------------------------------------------------*/ static int gpioToPUENReg (int pin) { - if (pin >= GPIOX_PIN_START && pin <= GPIOX_PIN_END) - return GPIOX_PUEN_REG_OFFSET; - if (pin >= GPIOY_PIN_START && pin <= GPIOY_PIN_END) - return GPIOY_PUEN_REG_OFFSET; - if (pin >= GPIODV_PIN_START && pin <= GPIODV_PIN_END) - return GPIODV_PUEN_REG_OFFSET; + if (pin >= C1_GPIOX_PIN_START && pin <= C1_GPIOX_PIN_END) + return C1_GPIOX_PUEN_REG_OFFSET; + if (pin >= C1_GPIOY_PIN_START && pin <= C1_GPIOY_PIN_END) + return C1_GPIOY_PUEN_REG_OFFSET; + if (pin >= C1_GPIODV_PIN_START && pin <= C1_GPIODV_PIN_END) + return C1_GPIODV_PUEN_REG_OFFSET; return -1; } @@ -180,12 +184,12 @@ static int gpioToPUENReg (int pin) /*----------------------------------------------------------------------------*/ static int gpioToPUPDReg (int pin) { - if (pin >= GPIOX_PIN_START && pin <= GPIOX_PIN_END) - return GPIOX_PUPD_REG_OFFSET; - if (pin >= GPIOY_PIN_START && pin <= GPIOY_PIN_END) - return GPIOY_PUPD_REG_OFFSET; - if (pin >= GPIODV_PIN_START && pin <= GPIODV_PIN_END) - return GPIODV_PUPD_REG_OFFSET; + if (pin >= C1_GPIOX_PIN_START && pin <= C1_GPIOX_PIN_END) + return C1_GPIOX_PUPD_REG_OFFSET; + if (pin >= C1_GPIOY_PIN_START && pin <= C1_GPIOY_PIN_END) + return C1_GPIOY_PUPD_REG_OFFSET; + if (pin >= C1_GPIODV_PIN_START && pin <= C1_GPIODV_PIN_END) + return C1_GPIODV_PUPD_REG_OFFSET; return -1; } @@ -196,12 +200,12 @@ static int gpioToPUPDReg (int pin) /*----------------------------------------------------------------------------*/ static int gpioToShiftReg (int pin) { - if (pin >= GPIOX_PIN_START && pin <= GPIOX_PIN_END) - return pin - GPIOX_PIN_START; - if (pin >= GPIOY_PIN_START && pin <= GPIOY_PIN_END) - return pin - GPIOY_PIN_START; - if (pin >= GPIODV_PIN_START && pin <= GPIODV_PIN_END) - return pin - GPIODV_PIN_START; + if (pin >= C1_GPIOX_PIN_START && pin <= C1_GPIOX_PIN_END) + return pin - C1_GPIOX_PIN_START; + if (pin >= C1_GPIOY_PIN_START && pin <= C1_GPIOY_PIN_END) + return pin - C1_GPIOY_PIN_START; + if (pin >= C1_GPIODV_PIN_START && pin <= C1_GPIODV_PIN_END) + return pin - C1_GPIODV_PIN_START; return -1; } @@ -212,17 +216,17 @@ static int gpioToShiftReg (int pin) /*----------------------------------------------------------------------------*/ static int gpioToGPFSELReg (int pin) { - if (pin >= GPIOX_PIN_START && pin <= GPIOX_PIN_END) - return GPIOX_FSEL_REG_OFFSET; - if (pin >= GPIOY_PIN_START && pin <= GPIOY_PIN_END) - return GPIOY_FSEL_REG_OFFSET; - if (pin >= GPIODV_PIN_START && pin <= GPIODV_PIN_END) - return GPIODV_FSEL_REG_OFFSET; + if (pin >= C1_GPIOX_PIN_START && pin <= C1_GPIOX_PIN_END) + return C1_GPIOX_FSEL_REG_OFFSET; + if (pin >= C1_GPIOY_PIN_START && pin <= C1_GPIOY_PIN_END) + return C1_GPIOY_FSEL_REG_OFFSET; + if (pin >= C1_GPIODV_PIN_START && pin <= C1_GPIODV_PIN_END) + return C1_GPIODV_FSEL_REG_OFFSET; return -1; } /*----------------------------------------------------------------------------*/ -static int getModeToGpio (int mode, int pin) +static int _getModeToGpio (int mode, int pin) { int retPin = -1; @@ -258,14 +262,14 @@ static int getModeToGpio (int mode, int pin) } /*----------------------------------------------------------------------------*/ -static void pinMode (int pin, int mode) +static void _pinMode (int pin, int mode) { int fsel, shift, origPin = pin; if (lib->mode == MODE_GPIO_SYS) return; - if ((pin = getModeToGpio(lib->mode, pin)) < 0) + if ((pin = _getModeToGpio(lib->mode, pin)) < 0) return; softPwmStop (origPin); @@ -294,7 +298,7 @@ static void pinMode (int pin, int mode) } /*----------------------------------------------------------------------------*/ -static int getAlt (int pin) +static int _getAlt (int pin) { int fsel, shift; int mode = 0; @@ -302,169 +306,169 @@ static int getAlt (int pin) if (lib->mode == MODE_GPIO_SYS) return 0; - if ((pin = getModeToGpio(lib->mode, pin)) < 0) + if ((pin = _getModeToGpio(lib->mode, pin)) < 0) return 2; fsel = gpioToGPFSELReg(pin); shift = gpioToShiftReg(pin); switch (pin) { - case GPIOX_PIN_START ...GPIOX_PIN_END: + case C1_GPIOX_PIN_START ...C1_GPIOX_PIN_END: switch (shift) { case 0: - if (*(gpio + MUX_REG_8_OFFSET) & (1 << 5)) mode = 1; break; - if (*(gpio + MUX_REG_5_OFFSET) & (1 << 14)) mode = 2; break; + if (*(gpio + C1_MUX_REG_8_OFFSET) & (1 << 5)) mode = 1; break; + if (*(gpio + C1_MUX_REG_5_OFFSET) & (1 << 14)) mode = 2; break; break; case 1: - if (*(gpio + MUX_REG_8_OFFSET) & (1 << 4)) mode = 1; break; - if (*(gpio + MUX_REG_5_OFFSET) & (1 << 13)) mode = 2; break; + if (*(gpio + C1_MUX_REG_8_OFFSET) & (1 << 4)) mode = 1; break; + if (*(gpio + C1_MUX_REG_5_OFFSET) & (1 << 13)) mode = 2; break; break; case 2: - if (*(gpio + MUX_REG_8_OFFSET) & (1 << 3)) mode = 1; break; - if (*(gpio + MUX_REG_5_OFFSET) & (1 << 13)) mode = 2; break; + if (*(gpio + C1_MUX_REG_8_OFFSET) & (1 << 3)) mode = 1; break; + if (*(gpio + C1_MUX_REG_5_OFFSET) & (1 << 13)) mode = 2; break; break; case 3: - if (*(gpio + MUX_REG_8_OFFSET) & (1 << 2)) mode = 1; break; - if (*(gpio + MUX_REG_5_OFFSET) & (1 << 13)) mode = 2; break; + if (*(gpio + C1_MUX_REG_8_OFFSET) & (1 << 2)) mode = 1; break; + if (*(gpio + C1_MUX_REG_5_OFFSET) & (1 << 13)) mode = 2; break; break; case 4: - if ((*(gpio + MUX_REG_5_OFFSET) & (1 << 29)) && - (*(gpio + MUX_REG_5_OFFSET) & (1 << 12))) mode = 1; break; - if (*(gpio + MUX_REG_3_OFFSET) & (1 << 30)) mode = 2; break; - if (*(gpio + MUX_REG_4_OFFSET) & (1 << 17)) mode = 3; break; + if ((*(gpio + C1_MUX_REG_5_OFFSET) & (1 << 29)) && + (*(gpio + C1_MUX_REG_5_OFFSET) & (1 << 12))) mode = 1; break; + if (*(gpio + C1_MUX_REG_3_OFFSET) & (1 << 30)) mode = 2; break; + if (*(gpio + C1_MUX_REG_4_OFFSET) & (1 << 17)) mode = 3; break; break; case 5: - if ((*(gpio + MUX_REG_5_OFFSET) & (1 << 28)) && - (*(gpio + MUX_REG_5_OFFSET) & (1 << 12))) mode = 1; break; - if (*(gpio + MUX_REG_3_OFFSET) & (1 << 29)) mode = 2; break; - if (*(gpio + MUX_REG_4_OFFSET) & (1 << 16)) mode = 3; break; + if ((*(gpio + C1_MUX_REG_5_OFFSET) & (1 << 28)) && + (*(gpio + C1_MUX_REG_5_OFFSET) & (1 << 12))) mode = 1; break; + if (*(gpio + C1_MUX_REG_3_OFFSET) & (1 << 29)) mode = 2; break; + if (*(gpio + C1_MUX_REG_4_OFFSET) & (1 << 16)) mode = 3; break; break; case 6: - if ((*(gpio + MUX_REG_5_OFFSET) & (1 << 28)) && - (*(gpio + MUX_REG_5_OFFSET) & (1 << 12))) mode = 1; break; - if (*(gpio + MUX_REG_3_OFFSET) & (1 << 27)) mode = 2; break; - if (*(gpio + MUX_REG_4_OFFSET) & (1 << 15)) mode = 3; break; - if (*(gpio + MUX_REG_5_OFFSET) & (1 << 9)) mode = 4; break; + if ((*(gpio + C1_MUX_REG_5_OFFSET) & (1 << 28)) && + (*(gpio + C1_MUX_REG_5_OFFSET) & (1 << 12))) mode = 1; break; + if (*(gpio + C1_MUX_REG_3_OFFSET) & (1 << 27)) mode = 2; break; + if (*(gpio + C1_MUX_REG_4_OFFSET) & (1 << 15)) mode = 3; break; + if (*(gpio + C1_MUX_REG_5_OFFSET) & (1 << 9)) mode = 4; break; break; case 7: - if ((*(gpio + MUX_REG_5_OFFSET) & (1 << 28)) && - (*(gpio + MUX_REG_5_OFFSET) & (1 << 12))) mode = 1; break; - if (*(gpio + MUX_REG_3_OFFSET) & (1 << 27)) mode = 2; break; - if (*(gpio + MUX_REG_4_OFFSET) & (1 << 14)) mode = 3; break; - if (*(gpio + MUX_REG_5_OFFSET) & (1 << 8)) mode = 4; break; + if ((*(gpio + C1_MUX_REG_5_OFFSET) & (1 << 28)) && + (*(gpio + C1_MUX_REG_5_OFFSET) & (1 << 12))) mode = 1; break; + if (*(gpio + C1_MUX_REG_3_OFFSET) & (1 << 27)) mode = 2; break; + if (*(gpio + C1_MUX_REG_4_OFFSET) & (1 << 14)) mode = 3; break; + if (*(gpio + C1_MUX_REG_5_OFFSET) & (1 << 8)) mode = 4; break; break; case 8: - if (*(gpio + MUX_REG_8_OFFSET) & (1 << 1)) mode = 1; break; - if (*(gpio + MUX_REG_5_OFFSET) & (1 << 11)) mode = 2; break; - if (*(gpio + MUX_REG_6_OFFSET) & (1 << 19)) mode = 3; break; - if (*(gpio + MUX_REG_4_OFFSET) & (1 << 22)) mode = 4; break; - if (*(gpio + MUX_REG_3_OFFSET) & (1 << 6)) mode = 5; break; + if (*(gpio + C1_MUX_REG_8_OFFSET) & (1 << 1)) mode = 1; break; + if (*(gpio + C1_MUX_REG_5_OFFSET) & (1 << 11)) mode = 2; break; + if (*(gpio + C1_MUX_REG_6_OFFSET) & (1 << 19)) mode = 3; break; + if (*(gpio + C1_MUX_REG_4_OFFSET) & (1 << 22)) mode = 4; break; + if (*(gpio + C1_MUX_REG_3_OFFSET) & (1 << 6)) mode = 5; break; break; case 9: - if (*(gpio + MUX_REG_8_OFFSET) & (1 << 0)) mode = 1; break; - if (*(gpio + MUX_REG_5_OFFSET) & (1 << 10)) mode = 2; break; - if (*(gpio + MUX_REG_6_OFFSET) & (1 << 18)) mode = 3; break; - if (*(gpio + MUX_REG_4_OFFSET) & (1 << 24)) mode = 4; break; - if (*(gpio + MUX_REG_3_OFFSET) & (1 << 6)) mode = 5; break; + if (*(gpio + C1_MUX_REG_8_OFFSET) & (1 << 0)) mode = 1; break; + if (*(gpio + C1_MUX_REG_5_OFFSET) & (1 << 10)) mode = 2; break; + if (*(gpio + C1_MUX_REG_6_OFFSET) & (1 << 18)) mode = 3; break; + if (*(gpio + C1_MUX_REG_4_OFFSET) & (1 << 24)) mode = 4; break; + if (*(gpio + C1_MUX_REG_3_OFFSET) & (1 << 6)) mode = 5; break; break; case 10: - if (*(gpio + MUX_REG_3_OFFSET) & (1 << 22)) mode = 1; break; - if ((*(gpio + MUX_REG_7_OFFSET) & (1 << 31)) && - (*(gpio + MUX_REG_9_OFFSET) & (1 << 19))) mode = 2; break; - if (*(gpio + MUX_REG_6_OFFSET) & (1 << 17)) mode = 3; break; - if (*(gpio + MUX_REG_4_OFFSET) & (1 << 23)) mode = 4; break; - if (*(gpio + MUX_REG_3_OFFSET) & (1 << 8)) mode = 5; break; + if (*(gpio + C1_MUX_REG_3_OFFSET) & (1 << 22)) mode = 1; break; + if ((*(gpio + C1_MUX_REG_7_OFFSET) & (1 << 31)) && + (*(gpio + C1_MUX_REG_9_OFFSET) & (1 << 19))) mode = 2; break; + if (*(gpio + C1_MUX_REG_6_OFFSET) & (1 << 17)) mode = 3; break; + if (*(gpio + C1_MUX_REG_4_OFFSET) & (1 << 23)) mode = 4; break; + if (*(gpio + C1_MUX_REG_3_OFFSET) & (1 << 8)) mode = 5; break; break; case 11: - if (*(gpio + MUX_REG_3_OFFSET) & (1 << 20)) mode = 1; break; - if (*(gpio + MUX_REG_7_OFFSET) & (1 << 30)) mode = 2; break; - if (*(gpio + MUX_REG_2_OFFSET) & (1 << 3)) mode = 5; break; + if (*(gpio + C1_MUX_REG_3_OFFSET) & (1 << 20)) mode = 1; break; + if (*(gpio + C1_MUX_REG_7_OFFSET) & (1 << 30)) mode = 2; break; + if (*(gpio + C1_MUX_REG_2_OFFSET) & (1 << 3)) mode = 5; break; break; case 16: - if (*(gpio + MUX_REG_4_OFFSET) & (1 << 9)) mode = 1; break; - if (*(gpio + MUX_REG_4_OFFSET) & (1 << 21)) mode = 4; break; - if (*(gpio + MUX_REG_4_OFFSET) & (1 << 5)) mode = 5; break; + if (*(gpio + C1_MUX_REG_4_OFFSET) & (1 << 9)) mode = 1; break; + if (*(gpio + C1_MUX_REG_4_OFFSET) & (1 << 21)) mode = 4; break; + if (*(gpio + C1_MUX_REG_4_OFFSET) & (1 << 5)) mode = 5; break; break; case 17: - if (*(gpio + MUX_REG_4_OFFSET) & (1 << 8)) mode = 1; break; - if (*(gpio + MUX_REG_4_OFFSET) & (1 << 20)) mode = 4; break; - if (*(gpio + MUX_REG_4_OFFSET) & (1 << 4)) mode = 5; break; + if (*(gpio + C1_MUX_REG_4_OFFSET) & (1 << 8)) mode = 1; break; + if (*(gpio + C1_MUX_REG_4_OFFSET) & (1 << 20)) mode = 4; break; + if (*(gpio + C1_MUX_REG_4_OFFSET) & (1 << 4)) mode = 5; break; break; case 18: - if (*(gpio + MUX_REG_4_OFFSET) & (1 << 7)) mode = 1; break; - if (*(gpio + MUX_REG_4_OFFSET) & (1 << 19)) mode = 4; break; + if (*(gpio + C1_MUX_REG_4_OFFSET) & (1 << 7)) mode = 1; break; + if (*(gpio + C1_MUX_REG_4_OFFSET) & (1 << 19)) mode = 4; break; break; case 19: - if (*(gpio + MUX_REG_4_OFFSET) & (1 << 6)) mode = 1; break; - if (*(gpio + MUX_REG_4_OFFSET) & (1 << 18)) mode = 4; break; + if (*(gpio + C1_MUX_REG_4_OFFSET) & (1 << 6)) mode = 1; break; + if (*(gpio + C1_MUX_REG_4_OFFSET) & (1 << 18)) mode = 4; break; break; case 20: - if (*(gpio + MUX_REG_6_OFFSET) & (1 << 16)) mode = 3; break; - if (*(gpio + MUX_REG_4_OFFSET) & (1 << 25)) mode = 4; break; - if (*(gpio + MUX_REG_3_OFFSET) & (1 << 9)) mode = 5; break; + if (*(gpio + C1_MUX_REG_6_OFFSET) & (1 << 16)) mode = 3; break; + if (*(gpio + C1_MUX_REG_4_OFFSET) & (1 << 25)) mode = 4; break; + if (*(gpio + C1_MUX_REG_3_OFFSET) & (1 << 9)) mode = 5; break; break; } break; - case GPIOY_PIN_START ...GPIOY_PIN_END: + case C1_GPIOY_PIN_START ...C1_GPIOY_PIN_END: switch (shift) { case 0: - if (*(gpio + MUX_REG_3_OFFSET) & (1 << 2)) mode = 1; break; + if (*(gpio + C1_MUX_REG_3_OFFSET) & (1 << 2)) mode = 1; break; break; case 1: - if (*(gpio + MUX_REG_3_OFFSET) & (1 << 1)) mode = 1; break; + if (*(gpio + C1_MUX_REG_3_OFFSET) & (1 << 1)) mode = 1; break; break; case 3: - if (*(gpio + MUX_REG_1_OFFSET) & (1 << 7)) mode = 2; break; - if (*(gpio + MUX_REG_3_OFFSET) & (1 << 18)) mode = 3; break; + if (*(gpio + C1_MUX_REG_1_OFFSET) & (1 << 7)) mode = 2; break; + if (*(gpio + C1_MUX_REG_3_OFFSET) & (1 << 18)) mode = 3; break; break; case 6: - if (*(gpio + MUX_REG_3_OFFSET) & (1 << 5)) mode = 1; break; + if (*(gpio + C1_MUX_REG_3_OFFSET) & (1 << 5)) mode = 1; break; break; case 7: - if (*(gpio + MUX_REG_3_OFFSET) & (1 << 5)) mode = 1; break; + if (*(gpio + C1_MUX_REG_3_OFFSET) & (1 << 5)) mode = 1; break; break; case 8: - if (*(gpio + MUX_REG_3_OFFSET) & (1 << 0)) mode = 1; break; + if (*(gpio + C1_MUX_REG_3_OFFSET) & (1 << 0)) mode = 1; break; break; case 9: - if (*(gpio + MUX_REG_3_OFFSET) & (1 << 4)) mode = 1; break; + if (*(gpio + C1_MUX_REG_3_OFFSET) & (1 << 4)) mode = 1; break; break; case 10: - if (*(gpio + MUX_REG_3_OFFSET) & (1 << 5)) mode = 1; break; + if (*(gpio + C1_MUX_REG_3_OFFSET) & (1 << 5)) mode = 1; break; break; case 11: - if (*(gpio + MUX_REG_3_OFFSET) & (1 << 5)) mode = 1; break; + if (*(gpio + C1_MUX_REG_3_OFFSET) & (1 << 5)) mode = 1; break; break; case 12: - if (*(gpio + MUX_REG_3_OFFSET) & (1 << 5)) mode = 1; break; + if (*(gpio + C1_MUX_REG_3_OFFSET) & (1 << 5)) mode = 1; break; break; case 13: - if (*(gpio + MUX_REG_3_OFFSET) & (1 << 5)) mode = 1; break; - if (*(gpio + MUX_REG_5_OFFSET) & (1 << 7)) mode = 3; break; + if (*(gpio + C1_MUX_REG_3_OFFSET) & (1 << 5)) mode = 1; break; + if (*(gpio + C1_MUX_REG_5_OFFSET) & (1 << 7)) mode = 3; break; break; case 14: - if (*(gpio + MUX_REG_3_OFFSET) & (1 << 5)) mode = 1; break; - if (*(gpio + MUX_REG_5_OFFSET) & (1 << 6)) mode = 3; break; + if (*(gpio + C1_MUX_REG_3_OFFSET) & (1 << 5)) mode = 1; break; + if (*(gpio + C1_MUX_REG_5_OFFSET) & (1 << 6)) mode = 3; break; break; } break; - case GPIODV_PIN_START...GPIODV_PIN_END: + case C1_GPIODV_PIN_START...C1_GPIODV_PIN_END: switch (shift) { case 24: - if (*(gpio + MUX_REG_6_OFFSET) & (1 << 23)) mode = 4; break; - if (*(gpio + MUX_REG_9_OFFSET) & (1 << 31)) mode = 5; break; + if (*(gpio + C1_MUX_REG_6_OFFSET) & (1 << 23)) mode = 4; break; + if (*(gpio + C1_MUX_REG_9_OFFSET) & (1 << 31)) mode = 5; break; break; case 25: - if (*(gpio + MUX_REG_6_OFFSET) & (1 << 22)) mode = 4; break; - if (*(gpio + MUX_REG_9_OFFSET) & (1 << 30)) mode = 5; break; + if (*(gpio + C1_MUX_REG_6_OFFSET) & (1 << 22)) mode = 4; break; + if (*(gpio + C1_MUX_REG_9_OFFSET) & (1 << 30)) mode = 5; break; break; case 26: - if (*(gpio + MUX_REG_6_OFFSET) & (1 << 21)) mode = 4; break; - if (*(gpio + MUX_REG_9_OFFSET) & (1 << 29)) mode = 5; break; + if (*(gpio + C1_MUX_REG_6_OFFSET) & (1 << 21)) mode = 4; break; + if (*(gpio + C1_MUX_REG_9_OFFSET) & (1 << 29)) mode = 5; break; break; case 27: - if (*(gpio + MUX_REG_6_OFFSET) & (1 << 20)) mode = 4; break; - if (*(gpio + MUX_REG_9_OFFSET) & (1 << 28)) mode = 5; break; + if (*(gpio + C1_MUX_REG_6_OFFSET) & (1 << 20)) mode = 4; break; + if (*(gpio + C1_MUX_REG_9_OFFSET) & (1 << 28)) mode = 5; break; break; } break; @@ -476,14 +480,14 @@ static int getAlt (int pin) } /*----------------------------------------------------------------------------*/ -static int getPUPD (int pin) +static int _getPUPD (int pin) { int puen, pupd, shift; if (lib->mode == MODE_GPIO_SYS) return; - if ((pin = getModeToGpio(lib->mode, pin)) < 0) + if ((pin = _getModeToGpio(lib->mode, pin)) < 0) return; puen = gpioToPUENReg(pin); @@ -497,14 +501,14 @@ static int getPUPD (int pin) } /*----------------------------------------------------------------------------*/ -static void pullUpDnControl (int pin, int pud) +static void _pullUpDnControl (int pin, int pud) { int shift = 0; if (lib->mode == MODE_GPIO_SYS) return; - if ((pin = getModeToGpio(lib->mode, pin)) < 0) + if ((pin = _getModeToGpio(lib->mode, pin)) < 0) return; shift = gpioToShiftReg(pin); @@ -526,7 +530,7 @@ static void pullUpDnControl (int pin, int pud) } /*----------------------------------------------------------------------------*/ -static int digitalRead (int pin) +static int _digitalRead (int pin) { char c ; @@ -540,7 +544,7 @@ static int digitalRead (int pin) return (c == '0') ? LOW : HIGH; } - if ((pin = getModeToGpio(lib->mode, pin)) < 0) + if ((pin = _getModeToGpio(lib->mode, pin)) < 0) return 0; if ((*(gpio + gpioToGPLEVReg(pin)) & (1 << gpioToShiftReg(pin))) != 0) @@ -550,7 +554,7 @@ static int digitalRead (int pin) } /*----------------------------------------------------------------------------*/ -static void digitalWrite (int pin, int value) +static void _digitalWrite (int pin, int value) { if (lib->mode == MODE_GPIO_SYS) { if (lib->sysFds[pin] != -1) { @@ -562,7 +566,7 @@ static void digitalWrite (int pin, int value) return; } - if ((pin = getModeToGpio(lib->mode, pin)) < 0) + if ((pin = _getModeToGpio(lib->mode, pin)) < 0) return; if (value == LOW) @@ -572,7 +576,7 @@ static void digitalWrite (int pin, int value) } /*----------------------------------------------------------------------------*/ -static int analogRead (int pin) +static int _analogRead (int pin) { unsigned char value[5] = {0,}; @@ -600,12 +604,12 @@ static int analogRead (int pin) } /*----------------------------------------------------------------------------*/ -static void digitalWriteByte (const int value) +static void _digitalWriteByte (const int value) { union reg_bitfield gpiox, gpioy; - gpiox.wvalue = *(gpio + GPIOX_INP_REG_OFFSET); - gpioy.wvalue = *(gpio + GPIOY_INP_REG_OFFSET); + gpiox.wvalue = *(gpio + C1_GPIOX_INP_REG_OFFSET); + gpioy.wvalue = *(gpio + C1_GPIOY_INP_REG_OFFSET); /* Wiring PI GPIO0 = C1 GPIOY.8 */ gpioy.bits.bit8 = (value & 0x01); @@ -624,18 +628,18 @@ static void digitalWriteByte (const int value) /* Wiring PI GPIO7 = C1 GPIOY.3 */ gpioy.bits.bit3 = (value & 0x80); - *(gpio + GPIOX_OUTP_REG_OFFSET) = gpiox.wvalue; - *(gpio + GPIOY_OUTP_REG_OFFSET) = gpioy.wvalue; + *(gpio + C1_GPIOX_OUTP_REG_OFFSET) = gpiox.wvalue; + *(gpio + C1_GPIOY_OUTP_REG_OFFSET) = gpioy.wvalue; } /*----------------------------------------------------------------------------*/ -static unsigned int digitalReadByte (void) +static unsigned int _digitalReadByte (void) { union reg_bitfield gpiox, gpioy; unsigned int value = 0; - gpiox.wvalue = *(gpio + GPIOX_INP_REG_OFFSET); - gpioy.wvalue = *(gpio + GPIOY_INP_REG_OFFSET); + gpiox.wvalue = *(gpio + C1_GPIOX_INP_REG_OFFSET); + gpioy.wvalue = *(gpio + C1_GPIOY_INP_REG_OFFSET); /* Wiring PI GPIO0 = C1 GPIOY.8 */ if (gpioy.bits.bit8) @@ -686,9 +690,9 @@ static void init_gpio_mmap (void) "wiringPiSetup: Unable to open /dev/mem: %s\n", strerror (errno)) ; } - //#define ODROIDXU_GPX_BASE 0xC1108000 + // #define C1_GPIO_BASE 0xC1108000 gpio = (uint32_t *)mmap(0, BLOCK_SIZE, PROT_READ|PROT_WRITE, - MAP_SHARED, fd, ODROIDC1_GPIO_BASE) ; + MAP_SHARED, fd, C1_GPIO_BASE) ; if ((int32_t)gpio == -1) return msg (MSG_ERR, @@ -717,19 +721,19 @@ void init_odroidc1 (struct libodroid *libwiring) init_adc_fds(); /* wiringPi Core function initialize */ - libwiring->getModeToGpio = getModeToGpio; - libwiring->pinMode = pinMode; - libwiring->getAlt = getAlt; - libwiring->getPUPD = getPUPD; - libwiring->pullUpDnControl = pullUpDnControl; - libwiring->digitalRead = digitalRead; - libwiring->digitalWrite = digitalWrite; - libwiring->analogRead = analogRead; - libwiring->digitalWriteByte = digitalWriteByte; - libwiring->digitalReadByte = digitalReadByte; + libwiring->getModeToGpio = _getModeToGpio; + libwiring->pinMode = _pinMode; + libwiring->getAlt = _getAlt; + libwiring->getPUPD = _getPUPD; + libwiring->pullUpDnControl = _pullUpDnControl; + libwiring->digitalRead = _digitalRead; + libwiring->digitalWrite = _digitalWrite; + libwiring->analogRead = _analogRead; + libwiring->digitalWriteByte = _digitalWriteByte; + libwiring->digitalReadByte = _digitalReadByte; /* specify pin base number */ - libwiring->pinBase = GPIO_PIN_BASE; + libwiring->pinBase = C1_GPIO_PIN_BASE; /* global variable setup */ lib = libwiring; diff --git a/wiringPi/odroidc1.h b/wiringPi/odroidc1.h index bbdbc3d..23f9126 100755 --- a/wiringPi/odroidc1.h +++ b/wiringPi/odroidc1.h @@ -9,45 +9,45 @@ #define __ODROID_C1_H__ /*----------------------------------------------------------------------------*/ -#define ODROIDC_GPIO_MASK (0xFFFFFF80) -#define ODROIDC1_GPIO_BASE 0xC1108000 +#define C1_GPIO_MASK (0xFFFFFF80) +#define C1_GPIO_BASE 0xC1108000 -#define GPIO_PIN_BASE 0 +#define C1_GPIO_PIN_BASE 0 -#define GPIODV_PIN_START 50 -#define GPIODV_PIN_END 79 -#define GPIOY_PIN_START 80 -#define GPIOY_PIN_END 96 -#define GPIOX_PIN_START 97 -#define GPIOX_PIN_END 118 +#define C1_GPIODV_PIN_START 50 +#define C1_GPIODV_PIN_END 79 +#define C1_GPIOY_PIN_START 80 +#define C1_GPIOY_PIN_END 96 +#define C1_GPIOX_PIN_START 97 +#define C1_GPIOX_PIN_END 118 -#define GPIOX_FSEL_REG_OFFSET 0x0C -#define GPIOX_OUTP_REG_OFFSET 0x0D -#define GPIOX_INP_REG_OFFSET 0x0E -#define GPIOX_PUPD_REG_OFFSET 0x3E -#define GPIOX_PUEN_REG_OFFSET 0x4C +#define C1_GPIOX_FSEL_REG_OFFSET 0x0C +#define C1_GPIOX_OUTP_REG_OFFSET 0x0D +#define C1_GPIOX_INP_REG_OFFSET 0x0E +#define C1_GPIOX_PUPD_REG_OFFSET 0x3E +#define C1_GPIOX_PUEN_REG_OFFSET 0x4C -#define GPIOY_FSEL_REG_OFFSET 0x0F -#define GPIOY_OUTP_REG_OFFSET 0x10 -#define GPIOY_INP_REG_OFFSET 0x11 -#define GPIOY_PUPD_REG_OFFSET 0x3D -#define GPIOY_PUEN_REG_OFFSET 0x4B +#define C1_GPIOY_FSEL_REG_OFFSET 0x0F +#define C1_GPIOY_OUTP_REG_OFFSET 0x10 +#define C1_GPIOY_INP_REG_OFFSET 0x11 +#define C1_GPIOY_PUPD_REG_OFFSET 0x3D +#define C1_GPIOY_PUEN_REG_OFFSET 0x4B -#define GPIODV_FSEL_REG_OFFSET 0x12 -#define GPIODV_OUTP_REG_OFFSET 0x13 -#define GPIODV_INP_REG_OFFSET 0x14 -#define GPIODV_PUPD_REG_OFFSET 0x3A -#define GPIODV_PUEN_REG_OFFSET 0x48 +#define C1_GPIODV_FSEL_REG_OFFSET 0x12 +#define C1_GPIODV_OUTP_REG_OFFSET 0x13 +#define C1_GPIODV_INP_REG_OFFSET 0x14 +#define C1_GPIODV_PUPD_REG_OFFSET 0x3A +#define C1_GPIODV_PUEN_REG_OFFSET 0x48 -#define MUX_REG_1_OFFSET 0x2D -#define MUX_REG_2_OFFSET 0x2E -#define MUX_REG_3_OFFSET 0x2F -#define MUX_REG_4_OFFSET 0x30 -#define MUX_REG_5_OFFSET 0x31 -#define MUX_REG_6_OFFSET 0x32 -#define MUX_REG_7_OFFSET 0x33 -#define MUX_REG_8_OFFSET 0x34 -#define MUX_REG_9_OFFSET 0x35 +#define C1_MUX_REG_1_OFFSET 0x2D +#define C1_MUX_REG_2_OFFSET 0x2E +#define C1_MUX_REG_3_OFFSET 0x2F +#define C1_MUX_REG_4_OFFSET 0x30 +#define C1_MUX_REG_5_OFFSET 0x31 +#define C1_MUX_REG_6_OFFSET 0x32 +#define C1_MUX_REG_7_OFFSET 0x33 +#define C1_MUX_REG_8_OFFSET 0x34 +#define C1_MUX_REG_9_OFFSET 0x35 #ifdef __cplusplus extern "C" { diff --git a/wiringPi/odroidc2.c b/wiringPi/odroidc2.c index 97b2b11..b39bc8b 100755 --- a/wiringPi/odroidc2.c +++ b/wiringPi/odroidc2.c @@ -18,7 +18,11 @@ #include /*----------------------------------------------------------------------------*/ -#include "wiringOdroid.h" +#include "softPwm.h" +#include "softTone.h" + +/*----------------------------------------------------------------------------*/ +#include "wiringPi.h" #include "odroidc2.h" /*----------------------------------------------------------------------------*/ @@ -158,18 +162,18 @@ static int gpioToShiftReg (int pin); static int gpioToGPFSELReg (int pin); /*----------------------------------------------------------------------------*/ -// wiringPi core function +// wiringPi core function /*----------------------------------------------------------------------------*/ -static int getModeToGpio (int mode, int pin); -static void pinMode (int pin, int mode); -static int getAlt (int pin); -static int getPUPD (int pin); -static void pullUpDnControl (int pin, int pud); -static int digitalRead (int pin); -static void digitalWrite (int pin, int value); -static int analogRead (int pin); -static void digitalWriteByte(const int value); -static unsigned int digitalReadByte (void); +static int _getModeToGpio (int mode, int pin); +static void _pinMode (int pin, int mode); +static int _getAlt (int pin); +static int _getPUPD (int pin); +static void _pullUpDnControl (int pin, int pud); +static int _digitalRead (int pin); +static void _digitalWrite (int pin, int value); +static int _analogRead (int pin); +static void _digitalWriteByte (const int value); +static unsigned int _digitalReadByte (void); /*----------------------------------------------------------------------------*/ // board init function @@ -276,7 +280,7 @@ static int gpioToGPFSELReg (int pin) return -1; } /*----------------------------------------------------------------------------*/ -static int getModeToGpio (int mode, int pin) +static int _getModeToGpio (int mode, int pin) { int retPin = -1; @@ -312,14 +316,14 @@ static int getModeToGpio (int mode, int pin) } /*----------------------------------------------------------------------------*/ -static void pinMode (int pin, int mode) +static void _pinMode (int pin, int mode) { int fsel, shift, origPin = pin; if (lib->mode == MODE_GPIO_SYS) return; - if ((pin = getModeToGpio(lib->mode, pin)) < 0) + if ((pin = _getModeToGpio(lib->mode, pin)) < 0) return; softPwmStop (origPin); @@ -348,7 +352,7 @@ static void pinMode (int pin, int mode) } /*----------------------------------------------------------------------------*/ -static int getAlt (int pin) +static int _getAlt (int pin) { int fsel, shift; int mode = 0; @@ -356,7 +360,7 @@ static int getAlt (int pin) if (lib->mode == MODE_GPIO_SYS) return 0; - if ((pin = getModeToGpio(lib->mode, pin)) < 0) + if ((pin = _getModeToGpio(lib->mode, pin)) < 0) return 2; fsel = gpioToGPFSELReg(pin); @@ -366,191 +370,191 @@ static int getAlt (int pin) case C2_GPIOX_PIN_START ...C2_GPIOX_PIN_END: switch (shift) { case 0: - if (*(gpio + MUX_REG_8_OFFSET) & (1 << 5)) mode = 1; break; + if (*(gpio + C2_MUX_REG_8_OFFSET) & (1 << 5)) mode = 1; break; break; case 1: - if (*(gpio + MUX_REG_8_OFFSET) & (1 << 4)) mode = 1; break; + if (*(gpio + C2_MUX_REG_8_OFFSET) & (1 << 4)) mode = 1; break; break; case 2: - if (*(gpio + MUX_REG_8_OFFSET) & (1 << 3)) mode = 1; break; + if (*(gpio + C2_MUX_REG_8_OFFSET) & (1 << 3)) mode = 1; break; break; case 3: - if (*(gpio + MUX_REG_8_OFFSET) & (1 << 2)) mode = 1; break; + if (*(gpio + C2_MUX_REG_8_OFFSET) & (1 << 2)) mode = 1; break; break; case 4: - if (*(gpio + MUX_REG_8_OFFSET) & (1 << 1)) mode = 1; break; + if (*(gpio + C2_MUX_REG_8_OFFSET) & (1 << 1)) mode = 1; break; break; case 5: - if (*(gpio + MUX_REG_8_OFFSET) & (1 << 0)) mode = 1; break; + if (*(gpio + C2_MUX_REG_8_OFFSET) & (1 << 0)) mode = 1; break; break; case 6: - if (*(gpio + MUX_REG_3_OFFSET) & (1 << 9)) mode = 4; break; - if (*(gpio + MUX_REG_3_OFFSET) & (1 << 17)) mode = 5; break; + if (*(gpio + C2_MUX_REG_3_OFFSET) & (1 << 9)) mode = 4; break; + if (*(gpio + C2_MUX_REG_3_OFFSET) & (1 << 17)) mode = 5; break; break; case 7: - if (*(gpio + MUX_REG_8_OFFSET) & (1 << 11)) mode = 1; break; - if (*(gpio + MUX_REG_3_OFFSET) & (1 << 8)) mode = 4; break; - if (*(gpio + MUX_REG_3_OFFSET) & (1 << 18)) mode = 5; break; + if (*(gpio + C2_MUX_REG_8_OFFSET) & (1 << 11)) mode = 1; break; + if (*(gpio + C2_MUX_REG_3_OFFSET) & (1 << 8)) mode = 4; break; + if (*(gpio + C2_MUX_REG_3_OFFSET) & (1 << 18)) mode = 5; break; break; case 8: - if (*(gpio + MUX_REG_4_OFFSET) & (1 << 7)) mode = 1; break; - if (*(gpio + MUX_REG_3_OFFSET) & (1 << 30)) mode = 3; break; - if (*(gpio + MUX_REG_3_OFFSET) & (1 << 10)) mode = 4; break; + if (*(gpio + C2_MUX_REG_4_OFFSET) & (1 << 7)) mode = 1; break; + if (*(gpio + C2_MUX_REG_3_OFFSET) & (1 << 30)) mode = 3; break; + if (*(gpio + C2_MUX_REG_3_OFFSET) & (1 << 10)) mode = 4; break; break; case 9: - if (*(gpio + MUX_REG_4_OFFSET) & (1 << 6)) mode = 1; break; - if (*(gpio + MUX_REG_3_OFFSET) & (1 << 29)) mode = 3; break; - if (*(gpio + MUX_REG_3_OFFSET) & (1 << 7)) mode = 4; break; + if (*(gpio + C2_MUX_REG_4_OFFSET) & (1 << 6)) mode = 1; break; + if (*(gpio + C2_MUX_REG_3_OFFSET) & (1 << 29)) mode = 3; break; + if (*(gpio + C2_MUX_REG_3_OFFSET) & (1 << 7)) mode = 4; break; break; case 10: - if (*(gpio + MUX_REG_3_OFFSET) & (1 << 28)) mode = 3; break; + if (*(gpio + C2_MUX_REG_3_OFFSET) & (1 << 28)) mode = 3; break; break; case 11: - if (*(gpio + MUX_REG_3_OFFSET) & (1 << 27)) mode = 3; break; + if (*(gpio + C2_MUX_REG_3_OFFSET) & (1 << 27)) mode = 3; break; break; case 12: - if (*(gpio + MUX_REG_4_OFFSET) & (1 << 13)) mode = 2; break; - if (*(gpio + MUX_REG_4_OFFSET) & (1 << 17)) mode = 3; break; + if (*(gpio + C2_MUX_REG_4_OFFSET) & (1 << 13)) mode = 2; break; + if (*(gpio + C2_MUX_REG_4_OFFSET) & (1 << 17)) mode = 3; break; break; case 13: - if (*(gpio + MUX_REG_4_OFFSET) & (1 << 12)) mode = 2; break; - if (*(gpio + MUX_REG_4_OFFSET) & (1 << 16)) mode = 3; break; + if (*(gpio + C2_MUX_REG_4_OFFSET) & (1 << 12)) mode = 2; break; + if (*(gpio + C2_MUX_REG_4_OFFSET) & (1 << 16)) mode = 3; break; break; case 14: - if (*(gpio + MUX_REG_4_OFFSET) & (1 << 11)) mode = 2; break; - if (*(gpio + MUX_REG_4_OFFSET) & (1 << 15)) mode = 3; break; + if (*(gpio + C2_MUX_REG_4_OFFSET) & (1 << 11)) mode = 2; break; + if (*(gpio + C2_MUX_REG_4_OFFSET) & (1 << 15)) mode = 3; break; break; case 15: - if (*(gpio + MUX_REG_4_OFFSET) & (1 << 10)) mode = 2; break; - if (*(gpio + MUX_REG_4_OFFSET) & (1 << 14)) mode = 3; break; + if (*(gpio + C2_MUX_REG_4_OFFSET) & (1 << 10)) mode = 2; break; + if (*(gpio + C2_MUX_REG_4_OFFSET) & (1 << 14)) mode = 3; break; break; case 19: - if (*(gpio + MUX_REG_2_OFFSET) & (1 << 22)) mode = 2; break; - if (*(gpio + MUX_REG_2_OFFSET) & (1 << 30)) mode = 5; break; + if (*(gpio + C2_MUX_REG_2_OFFSET) & (1 << 22)) mode = 2; break; + if (*(gpio + C2_MUX_REG_2_OFFSET) & (1 << 30)) mode = 5; break; break; } break; case C2_GPIOY_PIN_START ...C2_GPIOY_PIN_END: switch (shift) { case 0: - if (*(gpio + MUX_REG_2_OFFSET) & (1 << 19)) mode = 1; break; - if (*(gpio + MUX_REG_3_OFFSET) & (1 << 2)) mode = 2; break; - if (*(gpio + MUX_REG_1_OFFSET) & (1 << 0)) mode = 5; break; + if (*(gpio + C2_MUX_REG_2_OFFSET) & (1 << 19)) mode = 1; break; + if (*(gpio + C2_MUX_REG_3_OFFSET) & (1 << 2)) mode = 2; break; + if (*(gpio + C2_MUX_REG_1_OFFSET) & (1 << 0)) mode = 5; break; break; case 1: - if (*(gpio + MUX_REG_2_OFFSET) & (1 << 18)) mode = 1; break; - if (*(gpio + MUX_REG_3_OFFSET) & (1 << 1)) mode = 2; break; - if (*(gpio + MUX_REG_1_OFFSET) & (1 << 1)) mode = 5; break; + if (*(gpio + C2_MUX_REG_2_OFFSET) & (1 << 18)) mode = 1; break; + if (*(gpio + C2_MUX_REG_3_OFFSET) & (1 << 1)) mode = 2; break; + if (*(gpio + C2_MUX_REG_1_OFFSET) & (1 << 1)) mode = 5; break; break; case 2: - if (*(gpio + MUX_REG_2_OFFSET) & (1 << 17)) mode = 1; break; - if (*(gpio + MUX_REG_3_OFFSET) & (1 << 0)) mode = 2; break; + if (*(gpio + C2_MUX_REG_2_OFFSET) & (1 << 17)) mode = 1; break; + if (*(gpio + C2_MUX_REG_3_OFFSET) & (1 << 0)) mode = 2; break; break; case 3: - if (*(gpio + MUX_REG_2_OFFSET) & (1 << 16)) mode = 1; break; - if (*(gpio + MUX_REG_3_OFFSET) & (1 << 4)) mode = 2; break; - if (*(gpio + MUX_REG_1_OFFSET) & (1 << 2)) mode = 5; break; + if (*(gpio + C2_MUX_REG_2_OFFSET) & (1 << 16)) mode = 1; break; + if (*(gpio + C2_MUX_REG_3_OFFSET) & (1 << 4)) mode = 2; break; + if (*(gpio + C2_MUX_REG_1_OFFSET) & (1 << 2)) mode = 5; break; break; case 4: - if (*(gpio + MUX_REG_2_OFFSET) & (1 << 16)) mode = 1; break; - if (*(gpio + MUX_REG_3_OFFSET) & (1 << 5)) mode = 2; break; - if (*(gpio + MUX_REG_1_OFFSET) & (1 << 12)) mode = 4; break; + if (*(gpio + C2_MUX_REG_2_OFFSET) & (1 << 16)) mode = 1; break; + if (*(gpio + C2_MUX_REG_3_OFFSET) & (1 << 5)) mode = 2; break; + if (*(gpio + C2_MUX_REG_1_OFFSET) & (1 << 12)) mode = 4; break; break; case 5: - if (*(gpio + MUX_REG_2_OFFSET) & (1 << 16)) mode = 1; break; - if (*(gpio + MUX_REG_3_OFFSET) & (1 << 5)) mode = 2; break; - if (*(gpio + MUX_REG_1_OFFSET) & (1 << 13)) mode = 4; break; + if (*(gpio + C2_MUX_REG_2_OFFSET) & (1 << 16)) mode = 1; break; + if (*(gpio + C2_MUX_REG_3_OFFSET) & (1 << 5)) mode = 2; break; + if (*(gpio + C2_MUX_REG_1_OFFSET) & (1 << 13)) mode = 4; break; break; case 6: - if (*(gpio + MUX_REG_2_OFFSET) & (1 << 16)) mode = 1; break; - if (*(gpio + MUX_REG_3_OFFSET) & (1 << 5)) mode = 2; break; - if (*(gpio + MUX_REG_1_OFFSET) & (1 << 3)) mode = 5; break; + if (*(gpio + C2_MUX_REG_2_OFFSET) & (1 << 16)) mode = 1; break; + if (*(gpio + C2_MUX_REG_3_OFFSET) & (1 << 5)) mode = 2; break; + if (*(gpio + C2_MUX_REG_1_OFFSET) & (1 << 3)) mode = 5; break; break; case 7: - if (*(gpio + MUX_REG_2_OFFSET) & (1 << 16)) mode = 1; break; - if (*(gpio + MUX_REG_3_OFFSET) & (1 << 5)) mode = 2; break; - if (*(gpio + MUX_REG_1_OFFSET) & (1 << 4)) mode = 5; break; + if (*(gpio + C2_MUX_REG_2_OFFSET) & (1 << 16)) mode = 1; break; + if (*(gpio + C2_MUX_REG_3_OFFSET) & (1 << 5)) mode = 2; break; + if (*(gpio + C2_MUX_REG_1_OFFSET) & (1 << 4)) mode = 5; break; break; case 8: - if (*(gpio + MUX_REG_2_OFFSET) & (1 << 16)) mode = 1; break; - if (*(gpio + MUX_REG_3_OFFSET) & (1 << 5)) mode = 2; break; - if (*(gpio + MUX_REG_1_OFFSET) & (1 << 5)) mode = 5; break; + if (*(gpio + C2_MUX_REG_2_OFFSET) & (1 << 16)) mode = 1; break; + if (*(gpio + C2_MUX_REG_3_OFFSET) & (1 << 5)) mode = 2; break; + if (*(gpio + C2_MUX_REG_1_OFFSET) & (1 << 5)) mode = 5; break; break; case 9: - if (*(gpio + MUX_REG_2_OFFSET) & (1 << 16)) mode = 1; break; - if (*(gpio + MUX_REG_3_OFFSET) & (1 << 5)) mode = 2; break; - if (*(gpio + MUX_REG_1_OFFSET) & (1 << 6)) mode = 5; break; + if (*(gpio + C2_MUX_REG_2_OFFSET) & (1 << 16)) mode = 1; break; + if (*(gpio + C2_MUX_REG_3_OFFSET) & (1 << 5)) mode = 2; break; + if (*(gpio + C2_MUX_REG_1_OFFSET) & (1 << 6)) mode = 5; break; break; case 10: - if (*(gpio + MUX_REG_2_OFFSET) & (1 << 16)) mode = 1; break; - if (*(gpio + MUX_REG_3_OFFSET) & (1 << 5)) mode = 2; break; - if (*(gpio + MUX_REG_1_OFFSET) & (1 << 7)) mode = 5; break; + if (*(gpio + C2_MUX_REG_2_OFFSET) & (1 << 16)) mode = 1; break; + if (*(gpio + C2_MUX_REG_3_OFFSET) & (1 << 5)) mode = 2; break; + if (*(gpio + C2_MUX_REG_1_OFFSET) & (1 << 7)) mode = 5; break; break; case 11: - if (*(gpio + MUX_REG_3_OFFSET) & (1 << 3)) mode = 2; break; - if (*(gpio + MUX_REG_1_OFFSET) & (1 << 19)) mode = 3; break; - if (*(gpio + MUX_REG_1_OFFSET) & (1 << 8)) mode = 5; break; + if (*(gpio + C2_MUX_REG_3_OFFSET) & (1 << 3)) mode = 2; break; + if (*(gpio + C2_MUX_REG_1_OFFSET) & (1 << 19)) mode = 3; break; + if (*(gpio + C2_MUX_REG_1_OFFSET) & (1 << 8)) mode = 5; break; break; case 12: - if (*(gpio + MUX_REG_1_OFFSET) & (1 << 18)) mode = 3; break; - if (*(gpio + MUX_REG_1_OFFSET) & (1 << 9)) mode = 5; break; + if (*(gpio + C2_MUX_REG_1_OFFSET) & (1 << 18)) mode = 3; break; + if (*(gpio + C2_MUX_REG_1_OFFSET) & (1 << 9)) mode = 5; break; break; case 13: - if (*(gpio + MUX_REG_1_OFFSET) & (1 << 17)) mode = 3; break; - if (*(gpio + MUX_REG_1_OFFSET) & (1 << 10)) mode = 5; break; + if (*(gpio + C2_MUX_REG_1_OFFSET) & (1 << 17)) mode = 3; break; + if (*(gpio + C2_MUX_REG_1_OFFSET) & (1 << 10)) mode = 5; break; break; case 14: - if (*(gpio + MUX_REG_1_OFFSET) & (1 << 16)) mode = 3; break; - if (*(gpio + MUX_REG_1_OFFSET) & (1 << 11)) mode = 5; break; + if (*(gpio + C2_MUX_REG_1_OFFSET) & (1 << 16)) mode = 3; break; + if (*(gpio + C2_MUX_REG_1_OFFSET) & (1 << 11)) mode = 5; break; break; case 15: - if (*(gpio + MUX_REG_2_OFFSET) & (1 << 20)) mode = 1; break; - if (*(gpio + MUX_REG_1_OFFSET) & (1 << 20)) mode = 4; break; - if (*(gpio + MUX_REG_1_OFFSET) & (1 << 22)) mode = 5; break; + if (*(gpio + C2_MUX_REG_2_OFFSET) & (1 << 20)) mode = 1; break; + if (*(gpio + C2_MUX_REG_1_OFFSET) & (1 << 20)) mode = 4; break; + if (*(gpio + C2_MUX_REG_1_OFFSET) & (1 << 22)) mode = 5; break; break; case 16: - if (*(gpio + MUX_REG_2_OFFSET) & (1 << 21)) mode = 1; break; - if (*(gpio + MUX_REG_1_OFFSET) & (1 << 21)) mode = 4; break; + if (*(gpio + C2_MUX_REG_2_OFFSET) & (1 << 21)) mode = 1; break; + if (*(gpio + C2_MUX_REG_1_OFFSET) & (1 << 21)) mode = 4; break; break; } break; case C2_GPIODV_PIN_START...C2_GPIODV_PIN_END: switch (shift) { case 24: - if (*(gpio + MUX_REG_0_OFFSET) & (1 << 7)) mode = 1; break; - if (*(gpio + MUX_REG_0_OFFSET) & (1 << 12)) mode = 2; break; - if (*(gpio + MUX_REG_5_OFFSET) & (1 << 12)) mode = 3; break; - if (*(gpio + MUX_REG_2_OFFSET) & (1 << 29)) mode = 5; break; - if (*(gpio + MUX_REG_7_OFFSET) & (1 << 26)) mode = 6; break; + if (*(gpio + C2_MUX_REG_0_OFFSET) & (1 << 7)) mode = 1; break; + if (*(gpio + C2_MUX_REG_0_OFFSET) & (1 << 12)) mode = 2; break; + if (*(gpio + C2_MUX_REG_5_OFFSET) & (1 << 12)) mode = 3; break; + if (*(gpio + C2_MUX_REG_2_OFFSET) & (1 << 29)) mode = 5; break; + if (*(gpio + C2_MUX_REG_7_OFFSET) & (1 << 26)) mode = 6; break; break; case 25: - if (*(gpio + MUX_REG_0_OFFSET) & (1 << 6)) mode = 1; break; - if (*(gpio + MUX_REG_0_OFFSET) & (1 << 11)) mode = 2; break; - if (*(gpio + MUX_REG_5_OFFSET) & (1 << 11)) mode = 3; break; - if (*(gpio + MUX_REG_2_OFFSET) & (1 << 28)) mode = 5; break; - if (*(gpio + MUX_REG_7_OFFSET) & (1 << 27)) mode = 6; break; + if (*(gpio + C2_MUX_REG_0_OFFSET) & (1 << 6)) mode = 1; break; + if (*(gpio + C2_MUX_REG_0_OFFSET) & (1 << 11)) mode = 2; break; + if (*(gpio + C2_MUX_REG_5_OFFSET) & (1 << 11)) mode = 3; break; + if (*(gpio + C2_MUX_REG_2_OFFSET) & (1 << 28)) mode = 5; break; + if (*(gpio + C2_MUX_REG_7_OFFSET) & (1 << 27)) mode = 6; break; break; case 26: - if (*(gpio + MUX_REG_0_OFFSET) & (1 << 10)) mode = 2; break; - if (*(gpio + MUX_REG_5_OFFSET) & (1 << 10)) mode = 3; break; - if (*(gpio + MUX_REG_2_OFFSET) & (1 << 27)) mode = 5; break; - if (*(gpio + MUX_REG_7_OFFSET) & (1 << 24)) mode = 6; break; + if (*(gpio + C2_MUX_REG_0_OFFSET) & (1 << 10)) mode = 2; break; + if (*(gpio + C2_MUX_REG_5_OFFSET) & (1 << 10)) mode = 3; break; + if (*(gpio + C2_MUX_REG_2_OFFSET) & (1 << 27)) mode = 5; break; + if (*(gpio + C2_MUX_REG_7_OFFSET) & (1 << 24)) mode = 6; break; break; case 27: - if (*(gpio + MUX_REG_0_OFFSET) & (1 << 9)) mode = 2; break; - if (*(gpio + MUX_REG_5_OFFSET) & (1 << 9)) mode = 3; break; - if (*(gpio + MUX_REG_5_OFFSET) & (1 << 8)) mode = 4; break; - if (*(gpio + MUX_REG_2_OFFSET) & (1 << 26)) mode = 5; break; - if (*(gpio + MUX_REG_7_OFFSET) & (1 << 25)) mode = 6; break; + if (*(gpio + C2_MUX_REG_0_OFFSET) & (1 << 9)) mode = 2; break; + if (*(gpio + C2_MUX_REG_5_OFFSET) & (1 << 9)) mode = 3; break; + if (*(gpio + C2_MUX_REG_5_OFFSET) & (1 << 8)) mode = 4; break; + if (*(gpio + C2_MUX_REG_2_OFFSET) & (1 << 26)) mode = 5; break; + if (*(gpio + C2_MUX_REG_7_OFFSET) & (1 << 25)) mode = 6; break; break; case 28: - if (*(gpio + MUX_REG_3_OFFSET) & (1 << 20)) mode = 5; break; - if (*(gpio + MUX_REG_7_OFFSET) & (1 << 22)) mode = 6; break; + if (*(gpio + C2_MUX_REG_3_OFFSET) & (1 << 20)) mode = 5; break; + if (*(gpio + C2_MUX_REG_7_OFFSET) & (1 << 22)) mode = 6; break; break; case 29: - if (*(gpio + MUX_REG_3_OFFSET) & (1 << 22)) mode = 4; break; - if (*(gpio + MUX_REG_3_OFFSET) & (1 << 21)) mode = 5; break; - if (*(gpio + MUX_REG_7_OFFSET) & (1 << 23)) mode = 6; break; + if (*(gpio + C2_MUX_REG_3_OFFSET) & (1 << 22)) mode = 4; break; + if (*(gpio + C2_MUX_REG_3_OFFSET) & (1 << 21)) mode = 5; break; + if (*(gpio + C2_MUX_REG_7_OFFSET) & (1 << 23)) mode = 6; break; break; } break; @@ -562,14 +566,14 @@ static int getAlt (int pin) } /*----------------------------------------------------------------------------*/ -static int getPUPD (int pin) +static int _getPUPD (int pin) { int puen, pupd, shift; if (lib->mode == MODE_GPIO_SYS) return; - if ((pin = getModeToGpio(lib->mode, pin)) < 0) + if ((pin = _getModeToGpio(lib->mode, pin)) < 0) return; puen = gpioToPUENReg(pin); @@ -583,14 +587,14 @@ static int getPUPD (int pin) } /*----------------------------------------------------------------------------*/ -static void pullUpDnControl (int pin, int pud) +static void _pullUpDnControl (int pin, int pud) { int shift = 0; if (lib->mode == MODE_GPIO_SYS) return; - if ((pin = getModeToGpio(lib->mode, pin)) < 0) + if ((pin = _getModeToGpio(lib->mode, pin)) < 0) return; shift = gpioToShiftReg(pin); @@ -612,7 +616,7 @@ static void pullUpDnControl (int pin, int pud) } /*----------------------------------------------------------------------------*/ -static int digitalRead (int pin) +static int _digitalRead (int pin) { char c ; @@ -626,7 +630,7 @@ static int digitalRead (int pin) return (c == '0') ? LOW : HIGH; } - if ((pin = getModeToGpio(lib->mode, pin)) < 0) + if ((pin = _getModeToGpio(lib->mode, pin)) < 0) return 0; if ((*(gpio + gpioToGPLEVReg(pin)) & (1 << gpioToShiftReg(pin))) != 0) @@ -636,7 +640,7 @@ static int digitalRead (int pin) } /*----------------------------------------------------------------------------*/ -static void digitalWrite (int pin, int value) +static void _digitalWrite (int pin, int value) { if (lib->mode == MODE_GPIO_SYS) { if (lib->sysFds[pin] != -1) { @@ -648,7 +652,7 @@ static void digitalWrite (int pin, int value) return; } - if ((pin = getModeToGpio(lib->mode, pin)) < 0) + if ((pin = _getModeToGpio(lib->mode, pin)) < 0) return; if (value == LOW) @@ -658,7 +662,7 @@ static void digitalWrite (int pin, int value) } /*----------------------------------------------------------------------------*/ -static int analogRead (int pin) +static int _analogRead (int pin) { unsigned char value[5] = {0,}; @@ -686,7 +690,7 @@ static int analogRead (int pin) } /*----------------------------------------------------------------------------*/ -static void digitalWriteByte (const int value) +static void _digitalWriteByte (const int value) { union reg_bitfield gpiox; @@ -713,7 +717,7 @@ static void digitalWriteByte (const int value) } /*----------------------------------------------------------------------------*/ -static unsigned int digitalReadByte (void) +static unsigned int _digitalReadByte (void) { return -1; } @@ -739,9 +743,9 @@ static void init_gpio_mmap (void) "wiringPiSetup: Unable to open /dev/mem: %s\n", strerror (errno)) ; } - //#define ODROIDC2_GPIO_BASE 0xC8834000 + //#define C2_GPIO_BASE 0xC8834000 gpio = (uint32_t *)mmap(0, BLOCK_SIZE, PROT_READ|PROT_WRITE, - MAP_SHARED, fd, ODROIDC2_GPIO_BASE) ; + MAP_SHARED, fd, C2_GPIO_BASE) ; if ((int32_t)gpio == -1) return msg (MSG_ERR, @@ -778,19 +782,19 @@ void init_odroidc2 (struct libodroid *libwiring) } /* wiringPi Core function initialize */ - libwiring->getModeToGpio = getModeToGpio; - libwiring->pinMode = pinMode; - libwiring->getAlt = getAlt; - libwiring->getPUPD = getPUPD; - libwiring->pullUpDnControl = pullUpDnControl; - libwiring->digitalRead = digitalRead; - libwiring->digitalWrite = digitalWrite; - libwiring->analogRead = analogRead; - libwiring->digitalWriteByte = digitalWriteByte; - libwiring->digitalReadByte = digitalReadByte; + libwiring->getModeToGpio = _getModeToGpio; + libwiring->pinMode = _pinMode; + libwiring->getAlt = _getAlt; + libwiring->getPUPD = _getPUPD; + libwiring->pullUpDnControl = _pullUpDnControl; + libwiring->digitalRead = _digitalRead; + libwiring->digitalWrite = _digitalWrite; + libwiring->analogRead = _analogRead; + libwiring->digitalWriteByte = _digitalWriteByte; + libwiring->digitalReadByte = _digitalReadByte; /* specify pin base number */ - libwiring->pinBase = GPIO_PIN_BASE; + libwiring->pinBase = C2_GPIO_PIN_BASE; /* global variable setup */ lib = libwiring; diff --git a/wiringPi/odroidc2.h b/wiringPi/odroidc2.h index b52351a..037a107 100755 --- a/wiringPi/odroidc2.h +++ b/wiringPi/odroidc2.h @@ -9,17 +9,17 @@ #define __ODROID_C2_H__ /*----------------------------------------------------------------------------*/ -#define ODROIDC2_GPIO_MASK (0xFFFFFF00) -#define ODROIDC2_GPIO_BASE 0xC8834000 +#define C2_GPIO_MASK (0xFFFFFF00) +#define C2_GPIO_BASE 0xC8834000 -#define GPIO_PIN_BASE 136 +#define C2_GPIO_PIN_BASE 136 -#define C2_GPIODV_PIN_START (GPIO_PIN_BASE + 45) -#define C2_GPIODV_PIN_END (GPIO_PIN_BASE + 74) -#define C2_GPIOY_PIN_START (GPIO_PIN_BASE + 75) -#define C2_GPIOY_PIN_END (GPIO_PIN_BASE + 91) -#define C2_GPIOX_PIN_START (GPIO_PIN_BASE + 92) -#define C2_GPIOX_PIN_END (GPIO_PIN_BASE + 114) +#define C2_GPIODV_PIN_START (C2_GPIO_PIN_BASE + 45) +#define C2_GPIODV_PIN_END (C2_GPIO_PIN_BASE + 74) +#define C2_GPIOY_PIN_START (C2_GPIO_PIN_BASE + 75) +#define C2_GPIOY_PIN_END (C2_GPIO_PIN_BASE + 91) +#define C2_GPIOX_PIN_START (C2_GPIO_PIN_BASE + 92) +#define C2_GPIOX_PIN_END (C2_GPIO_PIN_BASE + 114) #define C2_GPIOX_FSEL_REG_OFFSET 0x118 #define C2_GPIOX_OUTP_REG_OFFSET 0x119 @@ -39,14 +39,14 @@ #define C2_GPIODV_PUPD_REG_OFFSET 0x148 #define C2_GPIODV_PUEN_REG_OFFSET 0x13A -#define MUX_REG_0_OFFSET 0x12C -#define MUX_REG_1_OFFSET 0x12D -#define MUX_REG_2_OFFSET 0x12E -#define MUX_REG_3_OFFSET 0x12F -#define MUX_REG_4_OFFSET 0x130 -#define MUX_REG_5_OFFSET 0x131 -#define MUX_REG_7_OFFSET 0x133 -#define MUX_REG_8_OFFSET 0x134 +#define C2_MUX_REG_0_OFFSET 0x12C +#define C2_MUX_REG_1_OFFSET 0x12D +#define C2_MUX_REG_2_OFFSET 0x12E +#define C2_MUX_REG_3_OFFSET 0x12F +#define C2_MUX_REG_4_OFFSET 0x130 +#define C2_MUX_REG_5_OFFSET 0x131 +#define C2_MUX_REG_7_OFFSET 0x133 +#define C2_MUX_REG_8_OFFSET 0x134 #ifdef __cplusplus extern "C" { diff --git a/wiringPi/odroidn1.c b/wiringPi/odroidn1.c index 6af7dd9..d4f4b23 100755 --- a/wiringPi/odroidn1.c +++ b/wiringPi/odroidn1.c @@ -18,7 +18,11 @@ #include /*----------------------------------------------------------------------------*/ -#include "wiringOdroid.h" +#include "softPwm.h" +#include "softTone.h" + +/*----------------------------------------------------------------------------*/ +#include "wiringPi.h" #include "odroidn1.h" /*----------------------------------------------------------------------------*/ @@ -107,17 +111,17 @@ static void setClkState (int pin, int state); static void setIomuxMode (int pin, int mode); /*----------------------------------------------------------------------------*/ -// wiringPi core function +// wiringPi core function /*----------------------------------------------------------------------------*/ -static int getModeToGpio (int mode, int pin); -static void pinMode (int pin, int mode); -static int getAlt (int pin); -static void pullUpDnControl (int pin, int pud); -static int digitalRead (int pin); -static void digitalWrite (int pin, int value); -static int analogRead (int pin); -static void digitalWriteByte(const int value); -static unsigned int digitalReadByte (void); +static int _getModeToGpio (int mode, int pin); +static void _pinMode (int pin, int mode); +static int _getAlt (int pin); +static void _pullUpDnControl (int pin, int pud); +static int _digitalRead (int pin); +static void _digitalWrite (int pin, int value); +static int _analogRead (int pin); +static void _digitalWriteByte (const int value); +static unsigned int _digitalReadByte (void); /*----------------------------------------------------------------------------*/ // board init function @@ -149,7 +153,7 @@ static int gpioToShiftGReg (int pin) } /*----------------------------------------------------------------------------*/ -static int getModeToGpio (int mode, int pin) +static int _getModeToGpio (int mode, int pin) { if (pin > 255) return msg(MSG_ERR, "%s : Invalid pin number %d\n", __func__, pin); @@ -187,26 +191,26 @@ static void setClkState (int pin, int state) target |= (1 << (shift + 16)); switch (state) { - case CLK_ENABLE: + case N1_CLK_ENABLE: if (bank < 2) { - target |= *(cru[0] + (PMUCRU_GPIO_CLK_OFFSET >> 2)); + target |= *(cru[0] + (N1_PMUCRU_GPIO_CLK_OFFSET >> 2)); target &= ~(1 << shift); - *(cru[0] + (PMUCRU_GPIO_CLK_OFFSET >> 2)) = target; + *(cru[0] + (N1_PMUCRU_GPIO_CLK_OFFSET >> 2)) = target; } else { - target |= *(cru[1] + (CRU_GPIO_CLK_OFFSET >> 2)); + target |= *(cru[1] + (N1_CRU_GPIO_CLK_OFFSET >> 2)); target &= ~(1 << shift); - *(cru[1] + (CRU_GPIO_CLK_OFFSET >> 2)) = target; + *(cru[1] + (N1_CRU_GPIO_CLK_OFFSET >> 2)) = target; } break; - case CLK_DISABLE: + case N1_CLK_DISABLE: if (bank < 2) { - target |= *(cru[0] + (PMUCRU_GPIO_CLK_OFFSET >> 2)); + target |= *(cru[0] + (N1_PMUCRU_GPIO_CLK_OFFSET >> 2)); target |= (1 << shift); - *(cru[0] + (PMUCRU_GPIO_CLK_OFFSET >> 2)) = target; + *(cru[0] + (N1_PMUCRU_GPIO_CLK_OFFSET >> 2)) = target; } else { - target |= *(cru[1] + (CRU_GPIO_CLK_OFFSET >> 2)); + target |= *(cru[1] + (N1_CRU_GPIO_CLK_OFFSET >> 2)); target |= (1 << shift); - *(cru[1] + (CRU_GPIO_CLK_OFFSET >> 2)) = target; + *(cru[1] + (N1_CRU_GPIO_CLK_OFFSET >> 2)) = target; } break; default: @@ -233,10 +237,10 @@ static void setIomuxMode (int pin, int mode) target |= (1 << (gpioToShiftGReg(pin) * 2 + 16)); switch (mode) { - case FUNC_GPIO: + case N1_FUNC_GPIO: // Common IOMUX Funtion 1 : GPIO (0b00) if (bank < 2) { - offset += PMUGRF_IOMUX_OFFSET; + offset += N1_PMUGRF_IOMUX_OFFSET; target |= *(grf[0] + (offset >> 2)); target &= ~(1 << (gpioToShiftGReg(pin) * 2 + 1)); @@ -244,7 +248,7 @@ static void setIomuxMode (int pin, int mode) *(grf[0] + (offset >> 2)) = target; } else { - offset += GRF_IOMUX_OFFSET; + offset += N1_GRF_IOMUX_OFFSET; target |= *(grf[1] + (offset >> 2)); target &= ~(1 << (gpioToShiftGReg(pin) * 2 + 1)); @@ -259,7 +263,7 @@ static void setIomuxMode (int pin, int mode) } /*----------------------------------------------------------------------------*/ -static void pinMode (int pin, int mode) +static void _pinMode (int pin, int mode) { int origPin, bank; unsigned long flags; @@ -267,7 +271,7 @@ static void pinMode (int pin, int mode) if (lib->mode == MODE_GPIO_SYS) return; - if ((pin = getModeToGpio(lib->mode, pin)) < 0) + if ((pin = _getModeToGpio(lib->mode, pin)) < 0) return; origPin = pin; @@ -276,15 +280,15 @@ static void pinMode (int pin, int mode) softPwmStop (origPin); softToneStop(origPin); - setClkState (pin, CLK_ENABLE); - setIomuxMode(pin, FUNC_GPIO); + setClkState (pin, N1_CLK_ENABLE); + setIomuxMode(pin, N1_FUNC_GPIO); switch (mode) { case INPUT: - *(gpio[bank] + (GPIO_CON_OFFSET >> 2)) &= ~(1 << gpioToShiftReg(pin)); + *(gpio[bank] + (N1_GPIO_CON_OFFSET >> 2)) &= ~(1 << gpioToShiftReg(pin)); break; case OUTPUT: - *(gpio[bank] + (GPIO_CON_OFFSET >> 2)) |= (1 << gpioToShiftReg(pin)); + *(gpio[bank] + (N1_GPIO_CON_OFFSET >> 2)) |= (1 << gpioToShiftReg(pin)); break; case SOFT_PWM_OUTPUT: softPwmCreate (pin, 0, 100); @@ -297,11 +301,11 @@ static void pinMode (int pin, int mode) break; } - setClkState (pin, CLK_DISABLE); + setClkState (pin, N1_CLK_DISABLE); } /*----------------------------------------------------------------------------*/ -static int getAlt (int pin) +static int _getAlt (int pin) { uint32_t offset; uint8_t bank, group, shift; @@ -310,7 +314,7 @@ static int getAlt (int pin) if (lib->mode == MODE_GPIO_SYS) return 0; - if ((pin = getModeToGpio(lib->mode, pin)) < 0) + if ((pin = _getModeToGpio(lib->mode, pin)) < 0) return 2; bank = pin / 32; @@ -318,32 +322,32 @@ static int getAlt (int pin) offset = 0x10 * (bank > 1 ? bank - 2 : bank) + 0x4 * group; shift = gpioToShiftGReg(pin) << 1; - setClkState(pin, CLK_ENABLE); + setClkState(pin, N1_CLK_ENABLE); // Check if the pin is GPIO mode on GRF register if (bank < 2) { - offset += PMUGRF_IOMUX_OFFSET; + offset += N1_PMUGRF_IOMUX_OFFSET; ret = (*(grf[0] + (offset >> 2)) >> shift) & 0b11; } else { - offset += GRF_IOMUX_OFFSET; + offset += N1_GRF_IOMUX_OFFSET; ret = (*(grf[1] + (offset >> 2)) >> shift) & 0b11; } // If it is GPIO mode, check it's direction if (ret == 0) - ret = *(gpio[bank] + (GPIO_CON_OFFSET >> 2)) & (1 << gpioToShiftReg(pin)) ? 1 : 0; + ret = *(gpio[bank] + (N1_GPIO_CON_OFFSET >> 2)) & (1 << gpioToShiftReg(pin)) ? 1 : 0; else { // ALT1 is GPIO mode(0b00) on this SoC ret++; } - setClkState(pin, CLK_DISABLE); + setClkState(pin, N1_CLK_DISABLE); return ret; } /*----------------------------------------------------------------------------*/ -static void pullUpDnControl (int pin, int pud) +static void _pullUpDnControl (int pin, int pud) { uint32_t offset, target; uint8_t bank, group; @@ -351,7 +355,7 @@ static void pullUpDnControl (int pin, int pud) if (lib->mode == MODE_GPIO_SYS) return 0; - if ((pin = getModeToGpio(lib->mode, pin)) < 0) + if ((pin = _getModeToGpio(lib->mode, pin)) < 0) return 2; bank = pin / 32; @@ -362,12 +366,12 @@ static void pullUpDnControl (int pin, int pud) target |= (1 << (gpioToShiftGReg(pin) * 2 + 17)); target |= (1 << (gpioToShiftGReg(pin) * 2 + 16)); - setClkState(pin, CLK_ENABLE); + setClkState(pin, N1_CLK_ENABLE); switch (pud) { case PUD_UP: if (bank < 2) { - offset += PMUGRF_PUPD_OFFSET; + offset += N1_PMUGRF_PUPD_OFFSET; target |= *(grf[0] + (offset >> 2)); target &= ~(1 << (gpioToShiftGReg(pin) * 2 + 1)); @@ -375,7 +379,7 @@ static void pullUpDnControl (int pin, int pud) *(grf[0] + (offset >> 2)) = target; } else { - offset += GRF_PUPD_OFFSET; + offset += N1_GRF_PUPD_OFFSET; target |= *(grf[1] + (offset >> 2)); if (bank == 2 && group >= 2) { @@ -391,7 +395,7 @@ static void pullUpDnControl (int pin, int pud) break; case PUD_DOWN: if (bank < 2) { - offset += PMUGRF_PUPD_OFFSET; + offset += N1_PMUGRF_PUPD_OFFSET; target |= *(grf[0] + (offset >> 2)); target |= (1 << (gpioToShiftGReg(pin) * 2 + 1)); @@ -399,7 +403,7 @@ static void pullUpDnControl (int pin, int pud) *(grf[0] + (offset >> 2)) = target; } else { - offset += GRF_PUPD_OFFSET; + offset += N1_GRF_PUPD_OFFSET; target |= *(grf[1] + (offset >> 2)); if (bank == 2 && group >= 2) { @@ -415,7 +419,7 @@ static void pullUpDnControl (int pin, int pud) break; case PUD_OFF: if (bank < 2) { - offset += PMUGRF_PUPD_OFFSET; + offset += N1_PMUGRF_PUPD_OFFSET; target |= *(grf[0] + (offset >> 2)); target &= ~(1 << (gpioToShiftGReg(pin) * 2 + 1)); @@ -423,7 +427,7 @@ static void pullUpDnControl (int pin, int pud) *(grf[0] + (offset >> 2)) = target; } else { - offset += GRF_PUPD_OFFSET; + offset += N1_GRF_PUPD_OFFSET; target |= *(grf[1] + (offset >> 2)); target &= ~(1 << (gpioToShiftGReg(pin) * 2 + 1)); @@ -436,11 +440,11 @@ static void pullUpDnControl (int pin, int pud) break; } - setClkState(pin, CLK_DISABLE); + setClkState(pin, N1_CLK_DISABLE); } /*----------------------------------------------------------------------------*/ -static int digitalRead (int pin) +static int _digitalRead (int pin) { int bank, ret; char c; @@ -455,20 +459,20 @@ static int digitalRead (int pin) return (c == '0') ? LOW : HIGH; } - if ((pin = getModeToGpio(lib->mode, pin)) < 0) + if ((pin = _getModeToGpio(lib->mode, pin)) < 0) return 0; bank = pin / 32; - setClkState(pin, CLK_ENABLE); + setClkState(pin, N1_CLK_ENABLE); - ret = *(gpio[bank] + (GPIO_GET_OFFSET >> 2)) & (1 << gpioToShiftReg(pin)) ? HIGH : LOW; + ret = *(gpio[bank] + (N1_GPIO_GET_OFFSET >> 2)) & (1 << gpioToShiftReg(pin)) ? HIGH : LOW; - setClkState(pin, CLK_DISABLE); + setClkState(pin, N1_CLK_DISABLE); return ret; } /*----------------------------------------------------------------------------*/ -static void digitalWrite (int pin, int value) +static void _digitalWrite (int pin, int value) { int bank; @@ -478,39 +482,39 @@ static void digitalWrite (int pin, int value) if (write (lib->sysFds[pin], "0\n", 2) < 0) msg(MSG_ERR, "%s : %s\nEdit direction file to output mode for\n\t/sys/class/gpio/gpio%d/direction\n", - __func__, strerror(errno), pin + GPIO_PIN_BASE); + __func__, strerror(errno), pin + N1_GPIO_PIN_BASE); } else { if (write (lib->sysFds[pin], "1\n", 2) < 0) msg(MSG_ERR, "%s : %s\nEdit direction file to output mode for\n\t/sys/class/gpio/gpio%d/direction\n", - __func__, strerror(errno), pin + GPIO_PIN_BASE); + __func__, strerror(errno), pin + N1_GPIO_PIN_BASE); } } return; } - if ((pin = getModeToGpio(lib->mode, pin)) < 0) + if ((pin = _getModeToGpio(lib->mode, pin)) < 0) return; bank = pin / 32; - setClkState(pin, CLK_ENABLE); + setClkState(pin, N1_CLK_ENABLE); switch (value) { case LOW: - *(gpio[bank] + (GPIO_SET_OFFSET >> 2)) &= ~(1 << gpioToShiftReg(pin)); + *(gpio[bank] + (N1_GPIO_SET_OFFSET >> 2)) &= ~(1 << gpioToShiftReg(pin)); break; case HIGH: - *(gpio[bank] + (GPIO_SET_OFFSET >> 2)) |= (1 << gpioToShiftReg(pin)); + *(gpio[bank] + (N1_GPIO_SET_OFFSET >> 2)) |= (1 << gpioToShiftReg(pin)); break; default: break; } - setClkState(pin, CLK_DISABLE); + setClkState(pin, N1_CLK_DISABLE); } /*----------------------------------------------------------------------------*/ -static int analogRead (int pin) +static int _analogRead (int pin) { unsigned char value[5] = {0,}; @@ -538,7 +542,7 @@ static int analogRead (int pin) } /*----------------------------------------------------------------------------*/ -static void digitalWriteByte (const int value) +static void _digitalWriteByte (const int value) { union reg_bitfield gpioBits1; @@ -547,10 +551,10 @@ static void digitalWriteByte (const int value) } // Enable clock for GPIO 1 bank - setClkState(32, CLK_ENABLE); + setClkState(32, N1_CLK_ENABLE); /* Read data register */ - gpioBits1.wvalue = *(gpio[1] + (GPIO_GET_OFFSET >> 2)); + gpioBits1.wvalue = *(gpio[1] + (N1_GPIO_GET_OFFSET >> 2)); /* Wiring PI GPIO0 = N1 GPIO1_A.1 */ gpioBits1.bits.bit1 = (value & 0x01); @@ -570,13 +574,13 @@ static void digitalWriteByte (const int value) gpioBits1.bits.bit0 = (value & 0x80); /* Update data register */ - *(gpio[1] + (GPIO_SET_OFFSET >> 2)) = gpioBits1.wvalue; + *(gpio[1] + (N1_GPIO_SET_OFFSET >> 2)) = gpioBits1.wvalue; - setClkState(32, CLK_DISABLE); + setClkState(32, N1_CLK_DISABLE); } /*----------------------------------------------------------------------------*/ -static unsigned int digitalReadByte (void) +static unsigned int _digitalReadByte (void) { union reg_bitfield gpioBits1; unsigned int value = 0; @@ -586,12 +590,12 @@ static unsigned int digitalReadByte (void) } // Enable clock for GPIO 1 bank - setClkState(32, CLK_ENABLE); + setClkState(32, N1_CLK_ENABLE); /* Read data register */ - gpioBits1.wvalue = *(gpio[1] + (GPIO_GET_OFFSET >> 2)); + gpioBits1.wvalue = *(gpio[1] + (N1_GPIO_GET_OFFSET >> 2)); - setClkState(32, CLK_DISABLE); + setClkState(32, N1_CLK_DISABLE); /* Wiring PI GPIO0 = N1 GPIO1_A.1 */ if (gpioBits1.bits.bit1) @@ -645,22 +649,22 @@ static void init_gpio_mmap (void) // GPIO{0, 1} //#define ODROIDN1_PMUCRU_BASE 0xFF750000 cru[0] = (uint32_t *)mmap(0, BLOCK_SIZE, PROT_READ|PROT_WRITE, - MAP_SHARED, fd, PMUCRU_BASE) ; + MAP_SHARED, fd, N1_PMUCRU_BASE) ; // GPIO{2, 3, 4} //#define ODROIDN1_CRU_BASE 0xFF760000 cru[1] = (uint32_t *)mmap(0, BLOCK_SIZE, PROT_READ|PROT_WRITE, - MAP_SHARED, fd, CRU_BASE) ; + MAP_SHARED, fd, N1_CRU_BASE) ; // GPIO{0, 1} //#define ODROIDN1_PMU_BASE 0xFF320000 - grf[0] = (uint32_t *)mmap(0, GRF_BLOCK_SIZE, PROT_READ|PROT_WRITE, - MAP_SHARED, fd, PMUGRF_BASE) ; + grf[0] = (uint32_t *)mmap(0, N1_GRF_BLOCK_SIZE, PROT_READ|PROT_WRITE, + MAP_SHARED, fd, N1_PMUGRF_BASE) ; // GPIO{2, 3, 4} //#define ODROIDN1_GRF_BASE 0xFF770000 - grf[1] = (uint32_t *)mmap(0, GRF_BLOCK_SIZE, PROT_READ|PROT_WRITE, - MAP_SHARED, fd, GRF_BASE) ; + grf[1] = (uint32_t *)mmap(0, N1_GRF_BLOCK_SIZE, PROT_READ|PROT_WRITE, + MAP_SHARED, fd, N1_GRF_BASE) ; // GPIO1_A. 0,1,2,3,4,7 // GPIO1_B. 0,1,2,3,4,5 @@ -668,24 +672,24 @@ static void init_gpio_mmap (void) // GPIO1_D. 0 //#define ODROIDN1_GPIO1_BASE 0xFF730000 gpio[1] = (uint32_t *)mmap(0, BLOCK_SIZE, PROT_READ|PROT_WRITE, - MAP_SHARED, fd, GPIO_1_BASE) ; + MAP_SHARED, fd, N1_GPIO_1_BASE) ; // GPIO2_C. 0_B,1_B //#define ODROIDN1_GPIO2_BASE 0xFF780000 gpio[2] = (uint32_t *)mmap(0, BLOCK_SIZE, PROT_READ|PROT_WRITE, - MAP_SHARED, fd, GPIO_2_BASE) ; + MAP_SHARED, fd, N1_GPIO_2_BASE) ; // GPIO4_C. 5,6 // GPIO4_D. 0,4,5,6 //#define ODROIDN1_GPIO4_BASE 0xFF790000 gpio[4] = (uint32_t *)mmap(0, BLOCK_SIZE, PROT_READ|PROT_WRITE, - MAP_SHARED, fd, GPIO_4_BASE) ; + MAP_SHARED, fd, N1_GPIO_4_BASE) ; // Reserved gpio[0] = (uint32_t *)mmap(0, BLOCK_SIZE, PROT_READ|PROT_WRITE, - MAP_SHARED, fd, GPIO_0_BASE) ; + MAP_SHARED, fd, N1_GPIO_0_BASE) ; gpio[3] = (uint32_t *)mmap(0, BLOCK_SIZE, PROT_READ|PROT_WRITE, - MAP_SHARED, fd, GPIO_3_BASE) ; + MAP_SHARED, fd, N1_GPIO_3_BASE) ; if (((int32_t)cru[0] == -1) || ((int32_t)cru[1] == -1)) { return msg (MSG_ERR, @@ -734,18 +738,18 @@ void init_odroidn1 (struct libodroid *libwiring) init_adc_fds(); /* wiringPi Core function initialize */ - libwiring->getModeToGpio = getModeToGpio; - libwiring->pinMode = pinMode; - libwiring->getAlt = getAlt; - libwiring->pullUpDnControl = pullUpDnControl; - libwiring->digitalRead = digitalRead; - libwiring->digitalWrite = digitalWrite; - libwiring->analogRead = analogRead; - libwiring->digitalWriteByte = digitalWriteByte; - libwiring->digitalReadByte = digitalReadByte; + libwiring->getModeToGpio = _getModeToGpio; + libwiring->pinMode = _pinMode; + libwiring->getAlt = _getAlt; + libwiring->pullUpDnControl = _pullUpDnControl; + libwiring->digitalRead = _digitalRead; + libwiring->digitalWrite = _digitalWrite; + libwiring->analogRead = _analogRead; + libwiring->digitalWriteByte = _digitalWriteByte; + libwiring->digitalReadByte = _digitalReadByte; /* specify pin base number */ - libwiring->pinBase = GPIO_PIN_BASE; + libwiring->pinBase = N1_GPIO_PIN_BASE; /* global variable setup */ lib = libwiring; diff --git a/wiringPi/odroidn1.h b/wiringPi/odroidn1.h index 46771ce..7c03854 100755 --- a/wiringPi/odroidn1.h +++ b/wiringPi/odroidn1.h @@ -10,56 +10,56 @@ /*----------------------------------------------------------------------------*/ // Common mmap block size for ODROID-N1 GRF register -#define GRF_BLOCK_SIZE 0xF000 +#define N1_GRF_BLOCK_SIZE 0xF000 // Common offset for GPIO registers from each GPIO bank's base address -#define GPIO_CON_OFFSET 0x04 // GPIO_SWPORTA_DDR -#define GPIO_SET_OFFSET 0x00 // GPIO_SWPORTA_DR -#define GPIO_GET_OFFSET 0x50 // GPIO_EXT_PORTA +#define N1_GPIO_CON_OFFSET 0x04 // GPIO_SWPORTA_DDR +#define N1_GPIO_SET_OFFSET 0x00 // GPIO_SWPORTA_DR +#define N1_GPIO_GET_OFFSET 0x50 // GPIO_EXT_PORTA -#define FUNC_GPIO 0b00 // Bit for IOMUX GPIO mode +#define N1_FUNC_GPIO 0b00 // Bit for IOMUX GPIO mode // GPIO{0, 1} -#define PMUGRF_BASE 0xFF320000 -#define PMUGRF_IOMUX_OFFSET 0x0000 // GRF_GPIO0A_IOMUX -#define PMUGRF_PUPD_OFFSET 0x0040 // PMUGRF_GPIO0A_P +#define N1_PMUGRF_BASE 0xFF320000 +#define N1_PMUGRF_IOMUX_OFFSET 0x0000 // GRF_GPIO0A_IOMUX +#define N1_PMUGRF_PUPD_OFFSET 0x0040 // PMUGRF_GPIO0A_P // GPIO{2, 3, 4} -#define GRF_BASE 0xFF770000 -#define GRF_IOMUX_OFFSET 0xE000 // GRF_GPIO2A_IOMUX -#define GRF_PUPD_OFFSET 0xE040 // GRF_GPIO2A_P +#define N1_GRF_BASE 0xFF770000 +#define N1_GRF_IOMUX_OFFSET 0xE000 // GRF_GPIO2A_IOMUX +#define N1_GRF_PUPD_OFFSET 0xE040 // GRF_GPIO2A_P // Offset to control GPIO clock // Make 31:16 bit HIGH to enable the writing corresponding bit -#define PMUCRU_BASE 0xFF750000 -#define PMUCRU_GPIO_CLK_OFFSET 0x0104 // PMUCRU_CLKGATE_CON1 +#define N1_PMUCRU_BASE 0xFF750000 +#define N1_PMUCRU_GPIO_CLK_OFFSET 0x0104 // PMUCRU_CLKGATE_CON1 -#define CRU_BASE 0xFF760000 -#define CRU_GPIO_CLK_OFFSET 0x037C // CRU_CLKGATE_CON31 +#define N1_CRU_BASE 0xFF760000 +#define N1_CRU_GPIO_CLK_OFFSET 0x037C // CRU_CLKGATE_CON31 -#define CLK_ENABLE 0b0 -#define CLK_DISABLE 0b1 +#define N1_CLK_ENABLE 0b0 +#define N1_CLK_DISABLE 0b1 // Only for Linux kernel for now. Edit to 0 for Android -#define GPIO_PIN_BASE 1000 +#define N1_GPIO_PIN_BASE 1000 // GPIO1_A. 0,1,2,3,4,7 // GPIO1_B. 0,1,2,3,4,5 // GPIO1_C. 2,4,5,6 // GPIO1_D. 0 -#define GPIO_1_BASE 0xFF730000 +#define N1_GPIO_1_BASE 0xFF730000 // GPIO2_C. 0_B,1_B -#define GPIO_2_BASE 0xFF780000 +#define N1_GPIO_2_BASE 0xFF780000 // GPIO4_C. 5,6 // GPIO4_D. 0,4,5,6 -#define GPIO_4_BASE 0xFF790000 +#define N1_GPIO_4_BASE 0xFF790000 // Reserved // GPIO{0, 3} -#define GPIO_0_BASE 0xFF720000 -#define GPIO_3_BASE 0xFF788000 +#define N1_GPIO_0_BASE 0xFF720000 +#define N1_GPIO_3_BASE 0xFF788000 #ifdef __cplusplus extern "C" { diff --git a/wiringPi/odroidn2.c b/wiringPi/odroidn2.c index 713b00a..c940f28 100755 --- a/wiringPi/odroidn2.c +++ b/wiringPi/odroidn2.c @@ -21,7 +21,11 @@ #include "softTone.h" /*----------------------------------------------------------------------------*/ -#include "wiringOdroid.h" +#include "softPwm.h" +#include "softTone.h" + +/*----------------------------------------------------------------------------*/ +#include "wiringPi.h" #include "odroidn2.h" /*----------------------------------------------------------------------------*/ @@ -112,18 +116,18 @@ static int gpioToMuxReg (int pin); /*----------------------------------------------------------------------------*/ // wiringPi core function /*----------------------------------------------------------------------------*/ -static int getModeToGpio (int mode, int pin); -static void setPadDrive (int pin, int value); -static int getPadDrive (int pin); -static void pinMode (int pin, int mode); -static int getAlt (int pin); -static int getPUPD (int pin); -static void pullUpDnControl (int pin, int pud); -static int digitalRead (int pin); -static void digitalWrite (int pin, int value); -static int analogRead (int pin); -static void digitalWriteByte(const int value); -static unsigned int digitalReadByte (void); +static int _getModeToGpio (int mode, int pin); +static void _setPadDrive (int pin, int value); +static int _getPadDrive (int pin); +static void _pinMode (int pin, int mode); +static int _getAlt (int pin); +static int _getPUPD (int pin); +static void _pullUpDnControl (int pin, int pud); +static int _digitalRead (int pin); +static void _digitalWrite (int pin, int value); +static int _analogRead (int pin); +static void _digitalWriteByte (const int value); +static unsigned int _digitalReadByte (void); /*----------------------------------------------------------------------------*/ // board init function @@ -258,7 +262,7 @@ static int gpioToMuxReg (int pin) } /*----------------------------------------------------------------------------*/ -static int getModeToGpio (int mode, int pin) +static int _getModeToGpio (int mode, int pin) { int retPin = -1; @@ -288,14 +292,14 @@ static int getModeToGpio (int mode, int pin) } /*----------------------------------------------------------------------------*/ -static void setPadDrive (int pin, int value) +static void _setPadDrive (int pin, int value) { int ds, shift; if (lib->mode == MODE_GPIO_SYS) return; - if ((pin = getModeToGpio(lib->mode, pin)) < 0) + if ((pin = _getModeToGpio(lib->mode, pin)) < 0) return; if (value < 0 || value > 3) { @@ -312,14 +316,14 @@ static void setPadDrive (int pin, int value) } /*----------------------------------------------------------------------------*/ -static int getPadDrive (int pin) +static int _getPadDrive (int pin) { int ds, shift; if (lib->mode == MODE_GPIO_SYS) return; - if ((pin = getModeToGpio(lib->mode, pin)) < 0) + if ((pin = _getModeToGpio(lib->mode, pin)) < 0) return; ds = gpioToDSReg(pin); @@ -330,14 +334,14 @@ static int getPadDrive (int pin) } /*----------------------------------------------------------------------------*/ -static void pinMode (int pin, int mode) +static void _pinMode (int pin, int mode) { int fsel, shift, origPin = pin; if (lib->mode == MODE_GPIO_SYS) return; - if ((pin = getModeToGpio(lib->mode, pin)) < 0) + if ((pin = _getModeToGpio(lib->mode, pin)) < 0) return; softPwmStop (origPin); @@ -366,14 +370,14 @@ static void pinMode (int pin, int mode) } /*----------------------------------------------------------------------------*/ -static int getAlt (int pin) +static int _getAlt (int pin) { int fsel, mux, shift, target, mode; if (lib->mode == MODE_GPIO_SYS) return 0; - if ((pin = getModeToGpio(lib->mode, pin)) < 0) + if ((pin = _getModeToGpio(lib->mode, pin)) < 0) return 2; fsel = gpioToGPFSELReg(pin); @@ -389,14 +393,14 @@ static int getAlt (int pin) } /*----------------------------------------------------------------------------*/ -static int getPUPD (int pin) +static int _getPUPD (int pin) { int puen, pupd, shift; if (lib->mode == MODE_GPIO_SYS) return; - if ((pin = getModeToGpio(lib->mode, pin)) < 0) + if ((pin = _getModeToGpio(lib->mode, pin)) < 0) return; puen = gpioToPUENReg(pin); @@ -410,14 +414,14 @@ static int getPUPD (int pin) } /*----------------------------------------------------------------------------*/ -static void pullUpDnControl (int pin, int pud) +static void _pullUpDnControl (int pin, int pud) { int shift = 0; if (lib->mode == MODE_GPIO_SYS) return; - if ((pin = getModeToGpio(lib->mode, pin)) < 0) + if ((pin = _getModeToGpio(lib->mode, pin)) < 0) return; shift = gpioToShiftReg(pin); @@ -439,7 +443,7 @@ static void pullUpDnControl (int pin, int pud) } /*----------------------------------------------------------------------------*/ -static int digitalRead (int pin) +static int _digitalRead (int pin) { char c ; @@ -453,7 +457,7 @@ static int digitalRead (int pin) return (c == '0') ? LOW : HIGH; } - if ((pin = getModeToGpio(lib->mode, pin)) < 0) + if ((pin = _getModeToGpio(lib->mode, pin)) < 0) return 0; if ((*(gpio + gpioToGPLEVReg(pin)) & (1 << gpioToShiftReg(pin))) != 0) @@ -463,7 +467,7 @@ static int digitalRead (int pin) } /*----------------------------------------------------------------------------*/ -static void digitalWrite (int pin, int value) +static void _digitalWrite (int pin, int value) { if (lib->mode == MODE_GPIO_SYS) { if (lib->sysFds[pin] != -1) { @@ -475,7 +479,7 @@ static void digitalWrite (int pin, int value) return; } - if ((pin = getModeToGpio(lib->mode, pin)) < 0) + if ((pin = _getModeToGpio(lib->mode, pin)) < 0) return; if (value == LOW) @@ -485,7 +489,7 @@ static void digitalWrite (int pin, int value) } /*----------------------------------------------------------------------------*/ -static int analogRead (int pin) +static int _analogRead (int pin) { unsigned char value[5] = {0,}; @@ -513,7 +517,7 @@ static int analogRead (int pin) } /*----------------------------------------------------------------------------*/ -static void digitalWriteByte (const int value) +static void _digitalWriteByte (const int value) { union reg_bitfield gpiox; union reg_bitfield gpioa; @@ -543,7 +547,7 @@ static void digitalWriteByte (const int value) } /*----------------------------------------------------------------------------*/ -static unsigned int digitalReadByte (void) +static unsigned int _digitalReadByte (void) { return -1; } @@ -569,9 +573,9 @@ static void init_gpio_mmap (void) "wiringPiSetup: Unable to open /dev/mem: %s\n", strerror (errno)) ; } - //#define ODROIDN2_GPIO_BASE 0xff634000 + //#define N2_GPIO_BASE 0xff634000 gpio = (uint32_t *)mmap(0, BLOCK_SIZE, PROT_READ|PROT_WRITE, - MAP_SHARED, fd, ODROIDN2_GPIO_BASE) ; + MAP_SHARED, fd, N2_GPIO_BASE) ; if ((int32_t)gpio == -1) return msg (MSG_ERR, @@ -603,21 +607,21 @@ void init_odroidn2 (struct libodroid *libwiring) phyToGpio = phyToGpio_rev1; /* wiringPi Core function initialize */ - libwiring->getModeToGpio = getModeToGpio; - libwiring->setPadDrive = setPadDrive; - libwiring->getPadDrive = getPadDrive; - libwiring->pinMode = pinMode; - libwiring->getAlt = getAlt; - libwiring->getPUPD = getPUPD; - libwiring->pullUpDnControl = pullUpDnControl; - libwiring->digitalRead = digitalRead; - libwiring->digitalWrite = digitalWrite; - libwiring->analogRead = analogRead; - libwiring->digitalWriteByte = digitalWriteByte; - libwiring->digitalReadByte = digitalReadByte; + libwiring->getModeToGpio = _getModeToGpio; + libwiring->setPadDrive = _setPadDrive; + libwiring->getPadDrive = _getPadDrive; + libwiring->pinMode = _pinMode; + libwiring->getAlt = _getAlt; + libwiring->getPUPD = _getPUPD; + libwiring->pullUpDnControl = _pullUpDnControl; + libwiring->digitalRead = _digitalRead; + libwiring->digitalWrite = _digitalWrite; + libwiring->analogRead = _analogRead; + libwiring->digitalWriteByte = _digitalWriteByte; + libwiring->digitalReadByte = _digitalReadByte; /* specify pin base number */ - libwiring->pinBase = GPIO_PIN_BASE; + libwiring->pinBase = N2_GPIO_PIN_BASE; /* global variable setup */ lib = libwiring; diff --git a/wiringPi/odroidn2.h b/wiringPi/odroidn2.h index a6cff9c..c584092 100755 --- a/wiringPi/odroidn2.h +++ b/wiringPi/odroidn2.h @@ -9,16 +9,16 @@ #define __ODROID_N2_H__ /*----------------------------------------------------------------------------*/ -#define ODROIDN2_GPIO_MASK (0xFFFFFF00) -#define ODROIDN2_GPIO_BASE 0xff634000 +#define N2_GPIO_MASK (0xFFFFFF00) +#define N2_GPIO_BASE 0xff634000 -#define GPIO_PIN_BASE 410 +#define N2_GPIO_PIN_BASE 410 -#define N2_GPIOA_PIN_START (GPIO_PIN_BASE + 50) // GPIOA_0 -#define N2_GPIOA_PIN_END (GPIO_PIN_BASE + 65) // GPIOA_15 -#define N2_GPIOX_PIN_START (GPIO_PIN_BASE + 66) // GPIOX_0 -#define N2_GPIOX_PIN_MID (GPIO_PIN_BASE + 81) // GPIOX_15 -#define N2_GPIOX_PIN_END (GPIO_PIN_BASE + 85) // GPIOX_19 +#define N2_GPIOA_PIN_START (N2_GPIO_PIN_BASE + 50) // GPIOA_0 +#define N2_GPIOA_PIN_END (N2_GPIO_PIN_BASE + 65) // GPIOA_15 +#define N2_GPIOX_PIN_START (N2_GPIO_PIN_BASE + 66) // GPIOX_0 +#define N2_GPIOX_PIN_MID (N2_GPIO_PIN_BASE + 81) // GPIOX_15 +#define N2_GPIOX_PIN_END (N2_GPIO_PIN_BASE + 85) // GPIOX_19 #define N2_GPIOX_FSEL_REG_OFFSET 0x116 #define N2_GPIOX_OUTP_REG_OFFSET 0x117 diff --git a/wiringPi/odroidxu3.c b/wiringPi/odroidxu3.c index 9ba92af..1b6bf5e 100755 --- a/wiringPi/odroidxu3.c +++ b/wiringPi/odroidxu3.c @@ -18,7 +18,11 @@ #include /*----------------------------------------------------------------------------*/ -#include "wiringOdroid.h" +#include "softPwm.h" +#include "softTone.h" + +/*----------------------------------------------------------------------------*/ +#include "wiringPi.h" #include "odroidxu3.h" /*----------------------------------------------------------------------------*/ @@ -103,20 +107,20 @@ static int gpioToGPFSELReg (int pin); static int gpioToDSReg (int pin); /*----------------------------------------------------------------------------*/ -// wiringPi core function +// wiringPi core function /*----------------------------------------------------------------------------*/ -static int getModeToGpio (int mode, int pin); -static void setPadDrive (int pin, int value); -static int getPadDrive (int pin); -static void pinMode (int pin, int mode); -static int getAlt (int pin); -static int getPUPD (int pin); -static void pullUpDnControl (int pin, int pud); -static int digitalRead (int pin); -static void digitalWrite (int pin, int value); -static int analogRead (int pin); -static void digitalWriteByte(const int value); -static unsigned int digitalReadByte (void); +static int _getModeToGpio (int mode, int pin); +static void _setPadDrive (int pin, int value); +static int _getPadDrive (int pin); +static void _pinMode (int pin, int mode); +static int _getAlt (int pin); +static int _getPUPD (int pin); +static void _pullUpDnControl (int pin, int pud); +static int _digitalRead (int pin); +static void _digitalWrite (int pin, int value); +static int _analogRead (int pin); +static void _digitalWriteByte (const int value); +static unsigned int _digitalReadByte (void); /*----------------------------------------------------------------------------*/ // board init function @@ -134,18 +138,18 @@ static void init_adc_fds (void); static int gpioToGPSETReg (int pin) { switch (pin) { - case GPIO_X1_START...GPIO_X1_END: - return (GPIO_X1_DAT_OFFSET >> 2); - case GPIO_X2_START...GPIO_X2_END: - return (GPIO_X2_DAT_OFFSET >> 2); - case GPIO_X3_START...GPIO_X3_END: - return (GPIO_X3_DAT_OFFSET >> 2); - case GPIO_A0_START...GPIO_A0_END: - return (GPIO_A0_DAT_OFFSET >> 2); - case GPIO_A2_START...GPIO_A2_END: - return (GPIO_A2_DAT_OFFSET >> 2); - case GPIO_B3_START...GPIO_B3_END: - return (GPIO_B3_DAT_OFFSET >> 2); + case XU3_GPIO_X1_START...XU3_GPIO_X1_END: + return (XU3_GPIO_X1_DAT_OFFSET >> 2); + case XU3_GPIO_X2_START...XU3_GPIO_X2_END: + return (XU3_GPIO_X2_DAT_OFFSET >> 2); + case XU3_GPIO_X3_START...XU3_GPIO_X3_END: + return (XU3_GPIO_X3_DAT_OFFSET >> 2); + case XU3_GPIO_A0_START...XU3_GPIO_A0_END: + return (XU3_GPIO_A0_DAT_OFFSET >> 2); + case XU3_GPIO_A2_START...XU3_GPIO_A2_END: + return (XU3_GPIO_A2_DAT_OFFSET >> 2); + case XU3_GPIO_B3_START...XU3_GPIO_B3_END: + return (XU3_GPIO_B3_DAT_OFFSET >> 2); default: break; } @@ -160,18 +164,18 @@ static int gpioToGPSETReg (int pin) static int gpioToGPLEVReg (int pin) { switch (pin) { - case GPIO_X1_START...GPIO_X1_END: - return (GPIO_X1_DAT_OFFSET >> 2); - case GPIO_X2_START...GPIO_X2_END: - return (GPIO_X2_DAT_OFFSET >> 2); - case GPIO_X3_START...GPIO_X3_END: - return (GPIO_X3_DAT_OFFSET >> 2); - case GPIO_A0_START...GPIO_A0_END: - return (GPIO_A0_DAT_OFFSET >> 2); - case GPIO_A2_START...GPIO_A2_END: - return (GPIO_A2_DAT_OFFSET >> 2); - case GPIO_B3_START...GPIO_B3_END: - return (GPIO_B3_DAT_OFFSET >> 2); + case XU3_GPIO_X1_START...XU3_GPIO_X1_END: + return (XU3_GPIO_X1_DAT_OFFSET >> 2); + case XU3_GPIO_X2_START...XU3_GPIO_X2_END: + return (XU3_GPIO_X2_DAT_OFFSET >> 2); + case XU3_GPIO_X3_START...XU3_GPIO_X3_END: + return (XU3_GPIO_X3_DAT_OFFSET >> 2); + case XU3_GPIO_A0_START...XU3_GPIO_A0_END: + return (XU3_GPIO_A0_DAT_OFFSET >> 2); + case XU3_GPIO_A2_START...XU3_GPIO_A2_END: + return (XU3_GPIO_A2_DAT_OFFSET >> 2); + case XU3_GPIO_B3_START...XU3_GPIO_B3_END: + return (XU3_GPIO_B3_DAT_OFFSET >> 2); default: break; } @@ -186,18 +190,18 @@ static int gpioToGPLEVReg (int pin) static int gpioToPUPDReg (int pin) { switch (pin) { - case GPIO_X1_START...GPIO_X1_END: - return (GPIO_X1_PUD_OFFSET >> 2); - case GPIO_X2_START...GPIO_X2_END: - return (GPIO_X2_PUD_OFFSET >> 2); - case GPIO_X3_START...GPIO_X3_END: - return (GPIO_X3_PUD_OFFSET >> 2); - case GPIO_A0_START...GPIO_A0_END: - return (GPIO_A0_PUD_OFFSET >> 2); - case GPIO_A2_START...GPIO_A2_END: - return (GPIO_A2_PUD_OFFSET >> 2); - case GPIO_B3_START...GPIO_B3_END: - return (GPIO_B3_PUD_OFFSET >> 2); + case XU3_GPIO_X1_START...XU3_GPIO_X1_END: + return (XU3_GPIO_X1_PUD_OFFSET >> 2); + case XU3_GPIO_X2_START...XU3_GPIO_X2_END: + return (XU3_GPIO_X2_PUD_OFFSET >> 2); + case XU3_GPIO_X3_START...XU3_GPIO_X3_END: + return (XU3_GPIO_X3_PUD_OFFSET >> 2); + case XU3_GPIO_A0_START...XU3_GPIO_A0_END: + return (XU3_GPIO_A0_PUD_OFFSET >> 2); + case XU3_GPIO_A2_START...XU3_GPIO_A2_END: + return (XU3_GPIO_A2_PUD_OFFSET >> 2); + case XU3_GPIO_B3_START...XU3_GPIO_B3_END: + return (XU3_GPIO_B3_PUD_OFFSET >> 2); default: break; } @@ -212,18 +216,18 @@ static int gpioToPUPDReg (int pin) static int gpioToShiftReg (int pin) { switch (pin) { - case GPIO_X1_START...GPIO_X1_END: - return (pin - GPIO_X1_START); - case GPIO_X2_START...GPIO_X2_END: - return (pin - GPIO_X2_START); - case GPIO_X3_START...GPIO_X3_END: - return (pin - GPIO_X3_START); - case GPIO_A0_START...GPIO_A0_END: - return (pin - GPIO_A0_START); - case GPIO_A2_START...GPIO_A2_END: - return (pin - GPIO_A2_START); - case GPIO_B3_START...GPIO_B3_END: - return (pin - GPIO_B3_START); + case XU3_GPIO_X1_START...XU3_GPIO_X1_END: + return (pin - XU3_GPIO_X1_START); + case XU3_GPIO_X2_START...XU3_GPIO_X2_END: + return (pin - XU3_GPIO_X2_START); + case XU3_GPIO_X3_START...XU3_GPIO_X3_END: + return (pin - XU3_GPIO_X3_START); + case XU3_GPIO_A0_START...XU3_GPIO_A0_END: + return (pin - XU3_GPIO_A0_START); + case XU3_GPIO_A2_START...XU3_GPIO_A2_END: + return (pin - XU3_GPIO_A2_START); + case XU3_GPIO_B3_START...XU3_GPIO_B3_END: + return (pin - XU3_GPIO_B3_START); default: break; } @@ -238,18 +242,18 @@ static int gpioToShiftReg (int pin) static int gpioToGPFSELReg (int pin) { switch (pin) { - case GPIO_X1_START...GPIO_X1_END: - return (GPIO_X1_CON_OFFSET >> 2); - case GPIO_X2_START...GPIO_X2_END: - return (GPIO_X2_CON_OFFSET >> 2); - case GPIO_X3_START...GPIO_X3_END: - return (GPIO_X3_CON_OFFSET >> 2); - case GPIO_A0_START...GPIO_A0_END: - return (GPIO_A0_CON_OFFSET >> 2); - case GPIO_A2_START...GPIO_A2_END: - return (GPIO_A2_CON_OFFSET >> 2); - case GPIO_B3_START...GPIO_B3_END: - return (GPIO_B3_CON_OFFSET >> 2); + case XU3_GPIO_X1_START...XU3_GPIO_X1_END: + return (XU3_GPIO_X1_CON_OFFSET >> 2); + case XU3_GPIO_X2_START...XU3_GPIO_X2_END: + return (XU3_GPIO_X2_CON_OFFSET >> 2); + case XU3_GPIO_X3_START...XU3_GPIO_X3_END: + return (XU3_GPIO_X3_CON_OFFSET >> 2); + case XU3_GPIO_A0_START...XU3_GPIO_A0_END: + return (XU3_GPIO_A0_CON_OFFSET >> 2); + case XU3_GPIO_A2_START...XU3_GPIO_A2_END: + return (XU3_GPIO_A2_CON_OFFSET >> 2); + case XU3_GPIO_B3_START...XU3_GPIO_B3_END: + return (XU3_GPIO_B3_CON_OFFSET >> 2); default: break; } @@ -264,18 +268,18 @@ static int gpioToGPFSELReg (int pin) static int gpioToDSReg (int pin) { switch (pin) { - case GPIO_X1_START...GPIO_X1_END: - return (GPIO_X1_DRV_OFFSET >> 2); - case GPIO_X2_START...GPIO_X2_END: - return (GPIO_X2_DRV_OFFSET >> 2); - case GPIO_X3_START...GPIO_X3_END: - return (GPIO_X3_DRV_OFFSET >> 2); - case GPIO_A0_START...GPIO_A0_END: - return (GPIO_A0_DRV_OFFSET >> 2); - case GPIO_A2_START...GPIO_A2_END: - return (GPIO_A2_DRV_OFFSET >> 2); - case GPIO_B3_START...GPIO_B3_END: - return (GPIO_B3_DRV_OFFSET >> 2); + case XU3_GPIO_X1_START...XU3_GPIO_X1_END: + return (XU3_GPIO_X1_DRV_OFFSET >> 2); + case XU3_GPIO_X2_START...XU3_GPIO_X2_END: + return (XU3_GPIO_X2_DRV_OFFSET >> 2); + case XU3_GPIO_X3_START...XU3_GPIO_X3_END: + return (XU3_GPIO_X3_DRV_OFFSET >> 2); + case XU3_GPIO_A0_START...XU3_GPIO_A0_END: + return (XU3_GPIO_A0_DRV_OFFSET >> 2); + case XU3_GPIO_A2_START...XU3_GPIO_A2_END: + return (XU3_GPIO_A2_DRV_OFFSET >> 2); + case XU3_GPIO_B3_START...XU3_GPIO_B3_END: + return (XU3_GPIO_B3_DRV_OFFSET >> 2); default: break; } @@ -283,7 +287,7 @@ static int gpioToDSReg (int pin) } /*----------------------------------------------------------------------------*/ -static int getModeToGpio (int mode, int pin) +static int _getModeToGpio (int mode, int pin) { switch (mode) { /* Native gpio number */ @@ -306,14 +310,14 @@ static int getModeToGpio (int mode, int pin) } /*----------------------------------------------------------------------------*/ -static void setPadDrive (int pin, int value) +static void _setPadDrive (int pin, int value) { int ds, shift; if (lib->mode == MODE_GPIO_SYS) return; - if ((pin = getModeToGpio(lib->mode, pin)) < 0) + if ((pin = _getModeToGpio(lib->mode, pin)) < 0) return; if (value < 0 || value > 3) { @@ -334,14 +338,14 @@ static void setPadDrive (int pin, int value) } /*----------------------------------------------------------------------------*/ -static int getPadDrive (int pin) +static int _getPadDrive (int pin) { int ds, shift; if (lib->mode == MODE_GPIO_SYS) return; - if ((pin = getModeToGpio(lib->mode, pin)) < 0) + if ((pin = _getModeToGpio(lib->mode, pin)) < 0) return; ds = gpioToDSReg(pin); @@ -354,14 +358,14 @@ static int getPadDrive (int pin) } /*----------------------------------------------------------------------------*/ -static void pinMode (int pin, int mode) +static void _pinMode (int pin, int mode) { int fsel, shift, origPin = pin; if (lib->mode == MODE_GPIO_SYS) return; - if ((pin = getModeToGpio(lib->mode, pin)) < 0) + if ((pin = _getModeToGpio(lib->mode, pin)) < 0) return; softPwmStop (origPin); @@ -399,14 +403,14 @@ static void pinMode (int pin, int mode) } /*----------------------------------------------------------------------------*/ -static int getAlt (int pin) +static int _getAlt (int pin) { int fsel, shift, mode; if (lib->mode == MODE_GPIO_SYS) return 0; - if ((pin = getModeToGpio(lib->mode, pin)) < 0) + if ((pin = _getModeToGpio(lib->mode, pin)) < 0) return 2; fsel = gpioToGPFSELReg(pin); @@ -422,14 +426,14 @@ static int getAlt (int pin) } /*----------------------------------------------------------------------------*/ -static int getPUPD (int pin) +static int _getPUPD (int pin) { int pupd, shift, pull; if (lib->mode == MODE_GPIO_SYS) return; - if ((pin = getModeToGpio(lib->mode, pin)) < 0) + if ((pin = _getModeToGpio(lib->mode, pin)) < 0) return; pupd = gpioToPUPDReg(pin); @@ -445,14 +449,14 @@ static int getPUPD (int pin) } /*----------------------------------------------------------------------------*/ -static void pullUpDnControl (int pin, int pud) +static void _pullUpDnControl (int pin, int pud) { int shift = 0; if (lib->mode == MODE_GPIO_SYS) return; - if ((pin = getModeToGpio(lib->mode, pin)) < 0) + if ((pin = _getModeToGpio(lib->mode, pin)) < 0) return; shift = gpioToShiftReg(pin) << 1; @@ -481,7 +485,7 @@ static void pullUpDnControl (int pin, int pud) } /*----------------------------------------------------------------------------*/ -static int digitalRead (int pin) +static int _digitalRead (int pin) { char c ; @@ -495,7 +499,7 @@ static int digitalRead (int pin) return (c == '0') ? LOW : HIGH; } - if ((pin = getModeToGpio(lib->mode, pin)) < 0) + if ((pin = _getModeToGpio(lib->mode, pin)) < 0) return 0; if (pin < 100) @@ -505,7 +509,7 @@ static int digitalRead (int pin) } /*----------------------------------------------------------------------------*/ -static void digitalWrite (int pin, int value) +static void _digitalWrite (int pin, int value) { if (lib->mode == MODE_GPIO_SYS) { if (lib->sysFds[pin] != -1) { @@ -517,7 +521,7 @@ static void digitalWrite (int pin, int value) return; } - if ((pin = getModeToGpio(lib->mode, pin)) < 0) + if ((pin = _getModeToGpio(lib->mode, pin)) < 0) return; if (pin < 100) { @@ -534,7 +538,7 @@ static void digitalWrite (int pin, int value) } /*----------------------------------------------------------------------------*/ -static int analogRead (int pin) +static int _analogRead (int pin) { unsigned char value[5] = {0,}; @@ -562,7 +566,7 @@ static int analogRead (int pin) } /*----------------------------------------------------------------------------*/ -static void digitalWriteByte (const int value) +static void _digitalWriteByte (const int value) { union reg_bitfield gpx1, gpx2, gpa0; @@ -570,9 +574,9 @@ static void digitalWriteByte (const int value) return; } /* Read data register */ - gpx1.wvalue = *(gpio + (GPIO_X1_DAT_OFFSET >> 2)); - gpx2.wvalue = *(gpio + (GPIO_X2_DAT_OFFSET >> 2)); - gpa0.wvalue = *(gpio1 + (GPIO_A0_DAT_OFFSET >> 2)); + gpx1.wvalue = *(gpio + (XU3_GPIO_X1_DAT_OFFSET >> 2)); + gpx2.wvalue = *(gpio + (XU3_GPIO_X2_DAT_OFFSET >> 2)); + gpa0.wvalue = *(gpio1 + (XU3_GPIO_A0_DAT_OFFSET >> 2)); /* Wiring PI GPIO0 = XU3/4 GPA0.3 */ gpa0.bits.bit3 = (value & 0x01); @@ -592,13 +596,13 @@ static void digitalWriteByte (const int value) gpx1.bits.bit2 = (value & 0x80); /* update data register */ - *(gpio + (GPIO_X1_DAT_OFFSET >> 2)) = gpx1.wvalue; - *(gpio + (GPIO_X2_DAT_OFFSET >> 2)) = gpx2.wvalue; - *(gpio1 + (GPIO_A0_DAT_OFFSET >> 2)) = gpa0.wvalue; + *(gpio + (XU3_GPIO_X1_DAT_OFFSET >> 2)) = gpx1.wvalue; + *(gpio + (XU3_GPIO_X2_DAT_OFFSET >> 2)) = gpx2.wvalue; + *(gpio1 + (XU3_GPIO_A0_DAT_OFFSET >> 2)) = gpa0.wvalue; } /*----------------------------------------------------------------------------*/ -static unsigned int digitalReadByte (void) +static unsigned int _digitalReadByte (void) { union reg_bitfield gpx1, gpx2, gpa0; unsigned int value = 0; @@ -607,9 +611,9 @@ static unsigned int digitalReadByte (void) return -1; } /* Read data register */ - gpx1.wvalue = *(gpio + (GPIO_X1_DAT_OFFSET >> 2)); - gpx2.wvalue = *(gpio + (GPIO_X2_DAT_OFFSET >> 2)); - gpa0.wvalue = *(gpio1 + (GPIO_A0_DAT_OFFSET >> 2)); + gpx1.wvalue = *(gpio + (XU3_GPIO_X1_DAT_OFFSET >> 2)); + gpx2.wvalue = *(gpio + (XU3_GPIO_X2_DAT_OFFSET >> 2)); + gpa0.wvalue = *(gpio1 + (XU3_GPIO_A0_DAT_OFFSET >> 2)); /* Wiring PI GPIO0 = XU3/4 GPA0.3 */ if (gpa0.bits.bit3) @@ -662,10 +666,10 @@ static void init_gpio_mmap (void) } //#define ODROIDXU_GPX_BASE 0x13400000 // GPX0,1,2,3 gpio = (uint32_t *)mmap(0, BLOCK_SIZE, PROT_READ|PROT_WRITE, - MAP_SHARED, fd, ODROIDXU3_GPX_BASE) ; + MAP_SHARED, fd, XU3_GPX_BASE) ; //#define ODROIDXU_GPA_BASE 0x14010000 // GPA0,1,2, GPB0,1,2,3,4 gpio1 = (uint32_t *)mmap(0, BLOCK_SIZE, PROT_READ|PROT_WRITE, - MAP_SHARED, fd, ODROIDXU3_GPA_BASE) ; + MAP_SHARED, fd, XU3_GPA_BASE) ; if (((int32_t)gpio == -1) || ((int32_t)gpio1 == -1)) return msg (MSG_ERR, "wiringPiSetup: mmap (GPIO) failed: %s\n", @@ -702,21 +706,21 @@ void init_odroidxu3 (struct libodroid *libwiring) init_adc_fds(); /* wiringPi Core function initialize */ - libwiring->getModeToGpio = getModeToGpio; - libwiring->setPadDrive = setPadDrive; - libwiring->getPadDrive = getPadDrive; - libwiring->pinMode = pinMode; - libwiring->getAlt = getAlt; - libwiring->getPUPD = getPUPD; - libwiring->pullUpDnControl = pullUpDnControl; - libwiring->digitalRead = digitalRead; - libwiring->digitalWrite = digitalWrite; - libwiring->analogRead = analogRead; - libwiring->digitalWriteByte = digitalWriteByte; - libwiring->digitalReadByte = digitalReadByte; + libwiring->getModeToGpio = _getModeToGpio; + libwiring->setPadDrive = _setPadDrive; + libwiring->getPadDrive = _getPadDrive; + libwiring->pinMode = _pinMode; + libwiring->getAlt = _getAlt; + libwiring->getPUPD = _getPUPD; + libwiring->pullUpDnControl = _pullUpDnControl; + libwiring->digitalRead = _digitalRead; + libwiring->digitalWrite = _digitalWrite; + libwiring->analogRead = _analogRead; + libwiring->digitalWriteByte = _digitalWriteByte; + libwiring->digitalReadByte = _digitalReadByte; /* specify pin base number */ - libwiring->pinBase = GPIO_PIN_BASE; + libwiring->pinBase = XU3_GPIO_PIN_BASE; /* global variable setup */ lib = libwiring; diff --git a/wiringPi/odroidxu3.h b/wiringPi/odroidxu3.h index 020e774..a5b52e4 100755 --- a/wiringPi/odroidxu3.h +++ b/wiringPi/odroidxu3.h @@ -9,57 +9,57 @@ #define __ODROID_XU3_H__ /*----------------------------------------------------------------------------*/ -#define ODROIDXU3_GPIO_MASK (0xFFFFFF00) +#define XU3_GPIO_MASK (0xFFFFFF00) -#define GPIO_PIN_BASE 0 +#define XU3_GPIO_PIN_BASE 0 // GPX0,1,2,3 -#define ODROIDXU3_GPX_BASE 0x13400000 +#define XU3_GPX_BASE 0x13400000 -#define GPIO_X1_START 16 -#define GPIO_X1_CON_OFFSET 0x0C20 -#define GPIO_X1_DAT_OFFSET 0x0C24 -#define GPIO_X1_PUD_OFFSET 0x0C28 -#define GPIO_X1_DRV_OFFSET 0x0C2C -#define GPIO_X1_END 23 +#define XU3_GPIO_X1_START 16 +#define XU3_GPIO_X1_CON_OFFSET 0x0C20 +#define XU3_GPIO_X1_DAT_OFFSET 0x0C24 +#define XU3_GPIO_X1_PUD_OFFSET 0x0C28 +#define XU3_GPIO_X1_DRV_OFFSET 0x0C2C +#define XU3_GPIO_X1_END 23 -#define GPIO_X2_START 24 -#define GPIO_X2_CON_OFFSET 0x0C40 -#define GPIO_X2_DAT_OFFSET 0x0C44 -#define GPIO_X2_PUD_OFFSET 0x0C48 -#define GPIO_X2_DRV_OFFSET 0x0C4C -#define GPIO_X2_END 31 +#define XU3_GPIO_X2_START 24 +#define XU3_GPIO_X2_CON_OFFSET 0x0C40 +#define XU3_GPIO_X2_DAT_OFFSET 0x0C44 +#define XU3_GPIO_X2_PUD_OFFSET 0x0C48 +#define XU3_GPIO_X2_DRV_OFFSET 0x0C4C +#define XU3_GPIO_X2_END 31 -#define GPIO_X3_START 32 -#define GPIO_X3_CON_OFFSET 0x0C60 -#define GPIO_X3_DAT_OFFSET 0x0C64 -#define GPIO_X3_PUD_OFFSET 0x0C68 -#define GPIO_X3_DRV_OFFSET 0x0C6C -#define GPIO_X3_END 39 +#define XU3_GPIO_X3_START 32 +#define XU3_GPIO_X3_CON_OFFSET 0x0C60 +#define XU3_GPIO_X3_DAT_OFFSET 0x0C64 +#define XU3_GPIO_X3_PUD_OFFSET 0x0C68 +#define XU3_GPIO_X3_DRV_OFFSET 0x0C6C +#define XU3_GPIO_X3_END 39 // GPA0,1,2, GPB0,1,2,3,4 -#define ODROIDXU3_GPA_BASE 0x14010000 +#define XU3_GPA_BASE 0x14010000 -#define GPIO_A0_START 171 -#define GPIO_A0_CON_OFFSET 0x0000 -#define GPIO_A0_DAT_OFFSET 0x0004 -#define GPIO_A0_PUD_OFFSET 0x0008 -#define GPIO_A0_DRV_OFFSET 0x000C -#define GPIO_A0_END 178 +#define XU3_GPIO_A0_START 171 +#define XU3_GPIO_A0_CON_OFFSET 0x0000 +#define XU3_GPIO_A0_DAT_OFFSET 0x0004 +#define XU3_GPIO_A0_PUD_OFFSET 0x0008 +#define XU3_GPIO_A0_DRV_OFFSET 0x000C +#define XU3_GPIO_A0_END 178 -#define GPIO_A2_START 185 -#define GPIO_A2_CON_OFFSET 0x0040 -#define GPIO_A2_DAT_OFFSET 0x0044 -#define GPIO_A2_PUD_OFFSET 0x0048 -#define GPIO_A2_DRV_OFFSET 0x004C -#define GPIO_A2_END 192 +#define XU3_GPIO_A2_START 185 +#define XU3_GPIO_A2_CON_OFFSET 0x0040 +#define XU3_GPIO_A2_DAT_OFFSET 0x0044 +#define XU3_GPIO_A2_PUD_OFFSET 0x0048 +#define XU3_GPIO_A2_DRV_OFFSET 0x004C +#define XU3_GPIO_A2_END 192 -#define GPIO_B3_START 207 -#define GPIO_B3_CON_OFFSET 0x00C0 -#define GPIO_B3_DAT_OFFSET 0x00C4 -#define GPIO_B3_PUD_OFFSET 0x00C8 -#define GPIO_B3_DRV_OFFSET 0x00CC -#define GPIO_B3_END 214 +#define XU3_GPIO_B3_START 207 +#define XU3_GPIO_B3_CON_OFFSET 0x00C0 +#define XU3_GPIO_B3_DAT_OFFSET 0x00C4 +#define XU3_GPIO_B3_PUD_OFFSET 0x00C8 +#define XU3_GPIO_B3_DRV_OFFSET 0x00CC +#define XU3_GPIO_B3_END 214 #ifdef __cplusplus extern "C" { diff --git a/wiringPi/wiringOdroid.h b/wiringPi/wiringOdroid.h deleted file mode 100755 index 7797f25..0000000 --- a/wiringPi/wiringOdroid.h +++ /dev/null @@ -1,246 +0,0 @@ -/* - * wiringPi.h: - * Arduino like Wiring library for the Raspberry Pi. - * Copyright (c) 2012-2017 Gordon Henderson - *********************************************************************** - * This file is part of wiringPi: - * https://projects.drogon.net/raspberry-pi/wiringpi/ - * - * wiringPi is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * wiringPi is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public License - * along with wiringPi. If not, see . - *********************************************************************** - */ -/*----------------------------------------------------------------------------*/ -#ifndef __WIRING_ODROID_H__ -#define __WIRING_ODROID_H__ - -/*----------------------------------------------------------------------------*/ -#include -#include -#include -#include - -/*----------------------------------------------------------------------------*/ - -#ifndef TRUE -#define TRUE (1==1) -#define FALSE (!TRUE) -#endif - -#define PIN_NUM_CALC_SYSFD(X) (X > 255 ? X - libwiring.pinBase : X) - -#define UNU __attribute__((unused)) - -#define ENV_DEBUG "WIRINGPI_DEBUG" -#define ENV_CODES "WIRINGPI_CODES" -#define ENV_GPIOMEM "WIRINGPI_GPIOMEM" - -#define MODEL_UNKNOWN 0 -#define MODEL_ODROID_C1 1 -#define MODEL_ODROID_C2 2 -#define MODEL_ODROID_XU3 3 -#define MODEL_ODROID_N1 4 -#define MODEL_ODROID_N2 5 - -#define MAKER_UNKNOWN 0 -#define MAKER_AMLOGIC 1 -#define MAKER_SAMSUNG 2 -#define MAKER_ROCKCHIP 3 - -#define MODE_PINS 0 -#define MODE_GPIO 1 -#define MODE_GPIO_SYS 2 -#define MODE_PHYS 3 -#define MODE_PIFACE 4 -#define MODE_UNINITIALISED -1 - -// Pin modes -#define INPUT 0 -#define OUTPUT 1 -#define PWM_OUTPUT 2 -#define GPIO_CLOCK 3 -#define SOFT_PWM_OUTPUT 4 -#define SOFT_TONE_OUTPUT 5 -#define PWM_TONE_OUTPUT 6 - -#define LOW 0 -#define HIGH 1 - -// Pull up/down/none -#define PUD_OFF 0 -#define PUD_DOWN 1 -#define PUD_UP 2 - -// Interrupt levels -#define INT_EDGE_SETUP 0 -#define INT_EDGE_FALLING 1 -#define INT_EDGE_RISING 2 -#define INT_EDGE_BOTH 3 - -// Module names -#define AML_MODULE_I2C "aml_i2c" - -// Threads -#define PI_THREAD(X) void *X (UNU void *dummy) - -// Failure modes -#define WPI_FATAL (1==1) -#define WPI_ALMOST (1==2) - -extern const char *piModelNames [16]; -extern const char *piRevisionNames [16]; -extern const char *piMakerNames [16]; -extern const int piMemorySize [ 8]; - -/*----------------------------------------------------------------------------*/ -#define PAGE_SIZE (4*1024) -#define BLOCK_SIZE (4*1024) - -/*----------------------------------------------------------------------------*/ -/* Debug message display function */ -/*----------------------------------------------------------------------------*/ -#define MSG_ERR -1 -#define MSG_WARN -2 - -/*----------------------------------------------------------------------------*/ -#ifdef __cplusplus -extern "C" { -#endif - -/*----------------------------------------------------------------------------*/ -// Export function define -/*----------------------------------------------------------------------------*/ -extern int msg (int type, const char *message, ...); -extern int moduleLoaded(char *); - -#ifdef __cplusplus -} -#endif - -/*----------------------------------------------------------------------------*/ -// wiringPiNodeStruct: -// This describes additional device nodes in the extended wiringPi -// 2.0 scheme of things. -// It's a simple linked list for now, but will hopefully migrate to -// a binary tree for efficiency reasons - but then again, the chances -// of more than 1 or 2 devices being added are fairly slim, so who -// knows.... -/*----------------------------------------------------------------------------*/ -struct wiringPiNodeStruct -{ - int pinBase; - int pinMax; - - int fd; // Node specific - unsigned int data0; // ditto - unsigned int data1; // ditto - unsigned int data2; // ditto - unsigned int data3; // ditto - - void (*pinMode) (struct wiringPiNodeStruct *node, int pin, int mode); - void (*pullUpDnControl) (struct wiringPiNodeStruct *node, int pin, int mode); - int (*digitalRead) (struct wiringPiNodeStruct *node, int pin); - // unsigned int (*digitalRead8) (struct wiringPiNodeStruct *node, int pin); - void (*digitalWrite) (struct wiringPiNodeStruct *node, int pin, int value); - // void (*digitalWrite8) (struct wiringPiNodeStruct *node, int pin, int value); - void (*pwmWrite) (struct wiringPiNodeStruct *node, int pin, int value); - int (*analogRead) (struct wiringPiNodeStruct *node, int pin); - void (*analogWrite) (struct wiringPiNodeStruct *node, int pin, int value); - - struct wiringPiNodeStruct *next; -}; - -extern struct wiringPiNodeStruct *wiringPiNodes; -extern struct wiringPiNodeStruct *wiringPiFindNode (int pin); -extern struct wiringPiNodeStruct *wiringPiNewNode (int pinBase, int numPins); - -extern int wiringPiFailure (int fatal, const char *message, ...) ; - -/*----------------------------------------------------------------------------*/ -struct libodroid -{ - /* H/W model info */ - int model, rev, mem, maker; - - /* wiringPi init Mode */ - int mode; - - /* wiringPi core func */ - int (*getModeToGpio) (int mode, int pin); - void (*setPadDrive) (int pin, int value); - int (*getPadDrive) (int pin); - void (*pinMode) (int pin, int mode); - int (*getAlt) (int pin); - int (*getPUPD) (int pin); - void (*pullUpDnControl) (int pin, int pud); - int (*digitalRead) (int pin); - void (*digitalWrite) (int pin, int value); - int (*analogRead) (int pin); - void (*digitalWriteByte) (const int value); - unsigned int (*digitalReadByte) (void); - - /* ISR Function pointer */ - void (*isrFunctions[256])(void); - - /* GPIO sysfs file discripter */ - int sysFds[256]; - - /* GPIO pin base number */ - int pinBase; - - // Time for easy calculations - uint64_t epochMilli, epochMicro ; -}; - -union reg_bitfield { - unsigned int wvalue; - struct { - unsigned int bit0 : 1; - unsigned int bit1 : 1; - unsigned int bit2 : 1; - unsigned int bit3 : 1; - unsigned int bit4 : 1; - unsigned int bit5 : 1; - unsigned int bit6 : 1; - unsigned int bit7 : 1; - unsigned int bit8 : 1; - unsigned int bit9 : 1; - unsigned int bit10 : 1; - unsigned int bit11 : 1; - unsigned int bit12 : 1; - unsigned int bit13 : 1; - unsigned int bit14 : 1; - unsigned int bit15 : 1; - unsigned int bit16 : 1; - unsigned int bit17 : 1; - unsigned int bit18 : 1; - unsigned int bit19 : 1; - unsigned int bit20 : 1; - unsigned int bit21 : 1; - unsigned int bit22 : 1; - unsigned int bit23 : 1; - unsigned int bit24 : 1; - unsigned int bit25 : 1; - unsigned int bit26 : 1; - unsigned int bit27 : 1; - unsigned int bit28 : 1; - unsigned int bit29 : 1; - unsigned int bit30 : 1; - unsigned int bit31 : 1; - } bits; -}; - -/*----------------------------------------------------------------------------*/ -#endif /* __WIRING_ODROID_H__ */ -/*----------------------------------------------------------------------------*/ -/*----------------------------------------------------------------------------*/ diff --git a/wiringPi/wiringOdroidI2C.h b/wiringPi/wiringOdroidI2C.h deleted file mode 100644 index 6db8c68..0000000 --- a/wiringPi/wiringOdroidI2C.h +++ /dev/null @@ -1,42 +0,0 @@ -/* - * wiringPiI2C.h: - * Simplified I2C access routines - * Copyright (c) 2013 Gordon Henderson - *********************************************************************** - * This file is part of wiringPi: - * https://projects.drogon.net/raspberry-pi/wiringpi/ - * - * wiringPi is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License as - * published by the Free Software Foundation, either version 3 of the - * License, or (at your option) any later version. - * - * wiringPi is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with wiringPi. - * If not, see . - *********************************************************************** - */ - -#ifdef __cplusplus -extern "C" { -#endif - -extern int wiringPiI2CRead (int fd) ; -extern int wiringPiI2CReadReg8 (int fd, int reg) ; -extern int wiringPiI2CReadReg16 (int fd, int reg) ; - -extern int wiringPiI2CWrite (int fd, int data) ; -extern int wiringPiI2CWriteReg8 (int fd, int reg, int data) ; -extern int wiringPiI2CWriteReg16 (int fd, int reg, int data) ; - -extern int wiringPiI2CSetupInterface (const char *device, int devId) ; -extern int wiringPiI2CSetup (const int devId) ; - -#ifdef __cplusplus -} -#endif diff --git a/wiringPi/wiringOdroidSPI.h b/wiringPi/wiringOdroidSPI.h deleted file mode 100644 index 3980321..0000000 --- a/wiringPi/wiringOdroidSPI.h +++ /dev/null @@ -1,36 +0,0 @@ -/* - * wiringPiSPI.h: - * Simplified SPI access routines - * Copyright (c) 2012-2015 Gordon Henderson - *********************************************************************** - * This file is part of wiringPi: - * https://projects.drogon.net/raspberry-pi/wiringpi/ - * - * wiringPi is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License as - * published by the Free Software Foundation, either version 3 of the - * License, or (at your option) any later version. - * - * wiringPi is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with wiringPi. - * If not, see . - *********************************************************************** - */ - -#ifdef __cplusplus -extern "C" { -#endif - -int wiringPiSPIGetFd (int channel) ; -int wiringPiSPIDataRW (int channel, unsigned char *data, int len) ; -int wiringPiSPISetupMode (int channel, int speed, int mode) ; -int wiringPiSPISetup (int channel, int speed) ; - -#ifdef __cplusplus -} -#endif diff --git a/wiringPi/wiringOdroid.c b/wiringPi/wiringPi.c similarity index 99% rename from wiringPi/wiringOdroid.c rename to wiringPi/wiringPi.c index a985d01..759d2ad 100755 --- a/wiringPi/wiringOdroid.c +++ b/wiringPi/wiringPi.c @@ -29,7 +29,7 @@ #include "softTone.h" /*----------------------------------------------------------------------------*/ -#include "wiringOdroid.h" +#include "wiringPi.h" #include "../version.h" #include "odroidc1.h" diff --git a/wiringPi/wiringPi.h b/wiringPi/wiringPi.h deleted file mode 120000 index ef688ed..0000000 --- a/wiringPi/wiringPi.h +++ /dev/null @@ -1 +0,0 @@ -wiringOdroid.h \ No newline at end of file diff --git a/wiringPi/wiringPi.h b/wiringPi/wiringPi.h new file mode 100755 index 0000000..26e4415 --- /dev/null +++ b/wiringPi/wiringPi.h @@ -0,0 +1,307 @@ +/* + * wiringPi.h: + * Arduino like Wiring library for the Raspberry Pi. + * Copyright (c) 2012-2017 Gordon Henderson + *********************************************************************** + * This file is part of wiringPi: + * https://projects.drogon.net/raspberry-pi/wiringpi/ + * + * wiringPi is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * wiringPi is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with wiringPi. If not, see . + *********************************************************************** + */ +/*----------------------------------------------------------------------------*/ +#ifndef __WIRING_H__ +#define __WIRING_H__ + +/*----------------------------------------------------------------------------*/ +#include +#include +#include +#include + +/*----------------------------------------------------------------------------*/ + +#ifndef TRUE +#define TRUE (1==1) +#define FALSE (!TRUE) +#endif + +#define PIN_NUM_CALC_SYSFD(X) (X > 255 ? X - libwiring.pinBase : X) + +#define UNU __attribute__((unused)) + +#define ENV_DEBUG "WIRINGPI_DEBUG" +#define ENV_CODES "WIRINGPI_CODES" +#define ENV_GPIOMEM "WIRINGPI_GPIOMEM" + +#define MODEL_UNKNOWN 0 +#define MODEL_ODROID_C1 1 +#define MODEL_ODROID_C2 2 +#define MODEL_ODROID_XU3 3 +#define MODEL_ODROID_N1 4 +#define MODEL_ODROID_N2 5 + +#define MAKER_UNKNOWN 0 +#define MAKER_AMLOGIC 1 +#define MAKER_SAMSUNG 2 +#define MAKER_ROCKCHIP 3 + +#define MODE_PINS 0 +#define MODE_GPIO 1 +#define MODE_GPIO_SYS 2 +#define MODE_PHYS 3 +#define MODE_PIFACE 4 +#define MODE_UNINITIALISED -1 + +// Pin modes +#define INPUT 0 +#define OUTPUT 1 +#define PWM_OUTPUT 2 +#define GPIO_CLOCK 3 +#define SOFT_PWM_OUTPUT 4 +#define SOFT_TONE_OUTPUT 5 +#define PWM_TONE_OUTPUT 6 + +#define LOW 0 +#define HIGH 1 + +// Pull up/down/none +#define PUD_OFF 0 +#define PUD_DOWN 1 +#define PUD_UP 2 + +// Interrupt levels +#define INT_EDGE_SETUP 0 +#define INT_EDGE_FALLING 1 +#define INT_EDGE_RISING 2 +#define INT_EDGE_BOTH 3 + +// Module names +#define AML_MODULE_I2C "aml_i2c" + +// Threads +#define PI_THREAD(X) void *X (UNU void *dummy) + +// Failure modes +#define WPI_FATAL (1==1) +#define WPI_ALMOST (1==2) + +extern const char *piModelNames [16]; +extern const char *piRevisionNames [16]; +extern const char *piMakerNames [16]; +extern const int piMemorySize [ 8]; + +/*----------------------------------------------------------------------------*/ +#define PAGE_SIZE (4*1024) +#define BLOCK_SIZE (4*1024) + +/*----------------------------------------------------------------------------*/ +/* Debug message display function */ +/*----------------------------------------------------------------------------*/ +#define MSG_ERR -1 +#define MSG_WARN -2 + +/*----------------------------------------------------------------------------*/ +struct libodroid +{ + /* H/W model info */ + int model, rev, mem, maker; + + /* wiringPi init Mode */ + int mode; + + /* wiringPi core func */ + int (*getModeToGpio) (int mode, int pin); + void (*setPadDrive) (int pin, int value); + int (*getPadDrive) (int pin); + void (*pinMode) (int pin, int mode); + int (*getAlt) (int pin); + int (*getPUPD) (int pin); + void (*pullUpDnControl) (int pin, int pud); + int (*digitalRead) (int pin); + void (*digitalWrite) (int pin, int value); + int (*analogRead) (int pin); + void (*digitalWriteByte) (const int value); + unsigned int (*digitalReadByte) (void); + + /* ISR Function pointer */ + void (*isrFunctions[256])(void); + + /* GPIO sysfs file discripter */ + int sysFds[256]; + + /* GPIO pin base number */ + int pinBase; + + // Time for easy calculations + uint64_t epochMilli, epochMicro ; +}; + +union reg_bitfield { + unsigned int wvalue; + struct { + unsigned int bit0 : 1; + unsigned int bit1 : 1; + unsigned int bit2 : 1; + unsigned int bit3 : 1; + unsigned int bit4 : 1; + unsigned int bit5 : 1; + unsigned int bit6 : 1; + unsigned int bit7 : 1; + unsigned int bit8 : 1; + unsigned int bit9 : 1; + unsigned int bit10 : 1; + unsigned int bit11 : 1; + unsigned int bit12 : 1; + unsigned int bit13 : 1; + unsigned int bit14 : 1; + unsigned int bit15 : 1; + unsigned int bit16 : 1; + unsigned int bit17 : 1; + unsigned int bit18 : 1; + unsigned int bit19 : 1; + unsigned int bit20 : 1; + unsigned int bit21 : 1; + unsigned int bit22 : 1; + unsigned int bit23 : 1; + unsigned int bit24 : 1; + unsigned int bit25 : 1; + unsigned int bit26 : 1; + unsigned int bit27 : 1; + unsigned int bit28 : 1; + unsigned int bit29 : 1; + unsigned int bit30 : 1; + unsigned int bit31 : 1; + } bits; +}; + +/*----------------------------------------------------------------------------*/ +// wiringPiNodeStruct: +// This describes additional device nodes in the extended wiringPi +// 2.0 scheme of things. +// It's a simple linked list for now, but will hopefully migrate to +// a binary tree for efficiency reasons - but then again, the chances +// of more than 1 or 2 devices being added are fairly slim, so who +// knows.... +/*----------------------------------------------------------------------------*/ +struct wiringPiNodeStruct +{ + int pinBase; + int pinMax; + + int fd; // Node specific + unsigned int data0; // ditto + unsigned int data1; // ditto + unsigned int data2; // ditto + unsigned int data3; // ditto + + void (*pinMode) (struct wiringPiNodeStruct *node, int pin, int mode); + void (*pullUpDnControl) (struct wiringPiNodeStruct *node, int pin, int mode); + int (*digitalRead) (struct wiringPiNodeStruct *node, int pin); + // unsigned int (*digitalRead8) (struct wiringPiNodeStruct *node, int pin); + void (*digitalWrite) (struct wiringPiNodeStruct *node, int pin, int value); + // void (*digitalWrite8) (struct wiringPiNodeStruct *node, int pin, int value); + void (*pwmWrite) (struct wiringPiNodeStruct *node, int pin, int value); + int (*analogRead) (struct wiringPiNodeStruct *node, int pin); + void (*analogWrite) (struct wiringPiNodeStruct *node, int pin, int value); + + struct wiringPiNodeStruct *next; +}; + +extern struct wiringPiNodeStruct *wiringPiNodes; + +/*----------------------------------------------------------------------------*/ +// Function prototypes +// c++ wrappers thanks to a comment by Nick Lott +// (and others on the Raspberry Pi forums) +/*----------------------------------------------------------------------------*/ +#ifdef __cplusplus +extern "C" { +#endif + +extern struct wiringPiNodeStruct *wiringPiFindNode (int pin); +extern struct wiringPiNodeStruct *wiringPiNewNode (int pinBase, int numPins); + +// Internal WiringPi functions +extern int wiringPiFailure (int fatal, const char *message, ...); +extern int msg (int type, const char *message, ...); +extern int moduleLoaded (char *); + +// Core WiringPi functions +extern void wiringPiVersion (int *major, int *minor); +extern int wiringPiSetup (void); +extern int wiringPiSetupSys (void); +extern int wiringPiSetupGpio (void); +extern int wiringPiSetupPhys (void); + +extern int getModeToGpio (int wpiPin); +extern void setPadDrive (int pin, int value); +extern int getPadDrive (int pin); +extern int getAlt (int pin); +extern int getPUPD (int pin); +extern void pinMode (int pin, int mode); +extern void pullUpDnControl (int pin, int pud); +extern int digitalRead (int pin); +extern void digitalWrite (int pin, int value); +extern unsigned int digitalReadByte (void); +extern void digitalWriteByte (const int value); +extern void pwmWrite (int pin, int value); +extern int analogRead (int pin); + +// Hardware specific stuffs +extern int piGpioLayout (void); +extern int piBoardRev (void); // Deprecated +extern void piBoardId (int *model, int *rev, int *mem, int *maker, int *warranty); +extern int wpiPinToGpio (int wpiPin); +extern int physPinToGpio (int physPin); + +// Unsupported +extern void pinModeAlt (int pin, int mode); +extern void analogWrite (int pin, int value); +extern void pwmToneWrite (int pin, int freq); +extern void pwmSetMode (int mode); +extern void pwmSetRange (unsigned int range); +extern void pwmSetClock (int divisor); +extern void gpioClockSet (int pin, int freq); +extern unsigned int digitalReadByte (void); +extern unsigned int digitalReadByte2 (void); +extern void digitalWriteByte (int value); +extern void digitalWriteByte2 (int value); + +// Interrupt +extern int waitForInterrupt (int pin, int mS); +extern int wiringPiISR (int pin, int mode, void (*function)(void)); + +// Threads +extern int piThreadCreate (void *(*fn)(void *)); +extern void piLock (int key); +extern void piUnlock (int key); + +// Schedulling priority +extern int piHiPri (const int pri); + +// From Arduino land +extern void delay (unsigned int howLong); +extern void delayMicroseconds (unsigned int howLong); +extern unsigned int millis (void); +extern unsigned int micros (void); + +#ifdef __cplusplus +} +#endif + +/*----------------------------------------------------------------------------*/ +#endif /* __WIRING_H__ */ +/*----------------------------------------------------------------------------*/ +/*----------------------------------------------------------------------------*/ diff --git a/wiringPi/wiringOdroidI2C.c b/wiringPi/wiringPiI2C.c similarity index 100% rename from wiringPi/wiringOdroidI2C.c rename to wiringPi/wiringPiI2C.c diff --git a/wiringPi/wiringPiI2C.h b/wiringPi/wiringPiI2C.h deleted file mode 120000 index 0c09f32..0000000 --- a/wiringPi/wiringPiI2C.h +++ /dev/null @@ -1 +0,0 @@ -wiringOdroidI2C.h \ No newline at end of file diff --git a/wiringPi/wiringPiI2C.h b/wiringPi/wiringPiI2C.h new file mode 100644 index 0000000..6db8c68 --- /dev/null +++ b/wiringPi/wiringPiI2C.h @@ -0,0 +1,42 @@ +/* + * wiringPiI2C.h: + * Simplified I2C access routines + * Copyright (c) 2013 Gordon Henderson + *********************************************************************** + * This file is part of wiringPi: + * https://projects.drogon.net/raspberry-pi/wiringpi/ + * + * wiringPi is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as + * published by the Free Software Foundation, either version 3 of the + * License, or (at your option) any later version. + * + * wiringPi is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with wiringPi. + * If not, see . + *********************************************************************** + */ + +#ifdef __cplusplus +extern "C" { +#endif + +extern int wiringPiI2CRead (int fd) ; +extern int wiringPiI2CReadReg8 (int fd, int reg) ; +extern int wiringPiI2CReadReg16 (int fd, int reg) ; + +extern int wiringPiI2CWrite (int fd, int data) ; +extern int wiringPiI2CWriteReg8 (int fd, int reg, int data) ; +extern int wiringPiI2CWriteReg16 (int fd, int reg, int data) ; + +extern int wiringPiI2CSetupInterface (const char *device, int devId) ; +extern int wiringPiI2CSetup (const int devId) ; + +#ifdef __cplusplus +} +#endif diff --git a/wiringPi/wiringOdroidSPI.c b/wiringPi/wiringPiSPI.c similarity index 100% rename from wiringPi/wiringOdroidSPI.c rename to wiringPi/wiringPiSPI.c diff --git a/wiringPi/wiringPiSPI.h b/wiringPi/wiringPiSPI.h deleted file mode 120000 index 92c384f..0000000 --- a/wiringPi/wiringPiSPI.h +++ /dev/null @@ -1 +0,0 @@ -wiringOdroidSPI.h \ No newline at end of file diff --git a/wiringPi/wiringPiSPI.h b/wiringPi/wiringPiSPI.h new file mode 100644 index 0000000..3980321 --- /dev/null +++ b/wiringPi/wiringPiSPI.h @@ -0,0 +1,36 @@ +/* + * wiringPiSPI.h: + * Simplified SPI access routines + * Copyright (c) 2012-2015 Gordon Henderson + *********************************************************************** + * This file is part of wiringPi: + * https://projects.drogon.net/raspberry-pi/wiringpi/ + * + * wiringPi is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as + * published by the Free Software Foundation, either version 3 of the + * License, or (at your option) any later version. + * + * wiringPi is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with wiringPi. + * If not, see . + *********************************************************************** + */ + +#ifdef __cplusplus +extern "C" { +#endif + +int wiringPiSPIGetFd (int channel) ; +int wiringPiSPIDataRW (int channel, unsigned char *data, int len) ; +int wiringPiSPISetupMode (int channel, int speed, int mode) ; +int wiringPiSPISetup (int channel, int speed) ; + +#ifdef __cplusplus +} +#endif