Updated the gpio program to be device tree aware.pull/62/head
@@ -1 +1 @@ | |||||
2.27 | |||||
2.28 |
@@ -1,5 +1,5 @@ | |||||
Package: wiringpi | Package: wiringpi | ||||
Version: 2.27 | |||||
Version: 2.28 | |||||
Section: libraries | Section: libraries | ||||
Priority: optional | Priority: optional | ||||
Architecture: armhf | Architecture: armhf | ||||
@@ -3,7 +3,7 @@ | |||||
# wiringPi - Wiring Compatable library for the Raspberry Pi | # wiringPi - Wiring Compatable library for the Raspberry Pi | ||||
# https://projects.drogon.net/wiring-pi | # https://projects.drogon.net/wiring-pi | ||||
# | # | ||||
# Copyright (c) 2012 Gordon Henderson | |||||
# Copyright (c) 2012-2015 Gordon Henderson | |||||
################################################################################# | ################################################################################# | ||||
# This file is part of wiringPi: | # This file is part of wiringPi: | ||||
# Wiring Compatable library for the Raspberry Pi | # Wiring Compatable library for the Raspberry Pi | ||||
@@ -47,7 +47,8 @@ SRC = blink.c blink8.c blink12.c \ | |||||
softPwm.c softTone.c \ | softPwm.c softTone.c \ | ||||
delayTest.c serialRead.c serialTest.c okLed.c ds1302.c \ | delayTest.c serialRead.c serialTest.c okLed.c ds1302.c \ | ||||
lowPower.c \ | lowPower.c \ | ||||
rht03.c piglow.c | |||||
max31855.c \ | |||||
rht03.c | |||||
OBJ = $(SRC:.c=.o) | OBJ = $(SRC:.c=.o) | ||||
@@ -148,10 +149,9 @@ ds1302: ds1302.o | |||||
$Q echo [link] | $Q echo [link] | ||||
$Q $(CC) -o $@ ds1302.o $(LDFLAGS) $(LDLIBS) | $Q $(CC) -o $@ ds1302.o $(LDFLAGS) $(LDLIBS) | ||||
piglow: piglow.o | |||||
max31855: max31855.o | |||||
$Q echo [link] | $Q echo [link] | ||||
$Q $(CC) -o $@ piglow.o $(LDFLAGS) $(LDLIBS) | |||||
$Q $(CC) -o $@ max31855.c.o $(LDFLAGS) $(LDLIBS) | |||||
.c.o: | .c.o: | ||||
$Q echo [CC] $< | $Q echo [CC] $< | ||||
@@ -3,7 +3,7 @@ | |||||
# wiringPi - Wiring Compatable library for the Raspberry Pi | # wiringPi - Wiring Compatable library for the Raspberry Pi | ||||
# https://projects.drogon.net/wiring-pi | # https://projects.drogon.net/wiring-pi | ||||
# | # | ||||
# Copyright (c) 2012-2013 Gordon Henderson | |||||
# Copyright (c) 2012-2015 Gordon Henderson | |||||
################################################################################# | ################################################################################# | ||||
# This file is part of wiringPi: | # This file is part of wiringPi: | ||||
# Wiring Compatable library for the Raspberry Pi | # Wiring Compatable library for the Raspberry Pi | ||||
@@ -0,0 +1,49 @@ | |||||
/* | |||||
* max31855.c: | |||||
* SPI Thermocouple interface chip | |||||
* | |||||
* Copyright (c) 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 <http://www.gnu.org/licenses/>. | |||||
*********************************************************************** | |||||
*/ | |||||
#include <stdio.h> | |||||
#include <stdlib.h> | |||||
#include <stdint.h> | |||||
#include <string.h> | |||||
#include <time.h> | |||||
#include <wiringPi.h> | |||||
#include <max31855.h> | |||||
int main (int argc, char *argv []) | |||||
{ | |||||
int i ; | |||||
wiringPiSetup () ; | |||||
max31855Setup (200, 0) ; | |||||
max31855Setup (400, 1) ; | |||||
for (;;) | |||||
{ | |||||
printf ("%6d, %6d, %6d, %6d ::::", analogRead (200), analogRead (201), analogRead (202), analogRead (203)) ; | |||||
printf ("%6d, %6d, %6d, %6d\n", analogRead (400), analogRead (401), analogRead (402), analogRead (403)) ; | |||||
delay (500) ; | |||||
} | |||||
} |
@@ -1,4 +1,4 @@ | |||||
.TH gpio 1 "January 2015" wiringPi "Command-Line access to Raspberry Pi's GPIO" | |||||
.TH GPIO 1 "September 2015" wiringPi "Command-Line access to Raspberry Pi's GPIO" | |||||
.SH NAME | .SH NAME | ||||
gpio \- Command-line access to Raspberry Pi's GPIO | gpio \- Command-line access to Raspberry Pi's GPIO | ||||
@@ -251,12 +251,9 @@ on the associated /dev/ entries so that the current user has access to | |||||
them. Optionally it will set the I2C baudrate to that supplied in Kb/sec | them. Optionally it will set the I2C baudrate to that supplied in Kb/sec | ||||
(or as close as the Pi can manage) The default speed is 100Kb/sec. | (or as close as the Pi can manage) The default speed is 100Kb/sec. | ||||
Note that on a Pi with a recent 3.18 kernel with the device-tree structure | |||||
enable, the load may fail until you add: | |||||
.I dtparam=i2c=on | |||||
into \fB/boot/config.txt\fR to allow user use of the I2C bus. | |||||
Note: On recent kernels with the device tree enabled you should use the | |||||
raspi-config program to load/unload the I2C device at boot time. | |||||
(or disable the device tree to continue to use this method) | |||||
.TP | .TP | ||||
.B load spi | .B load spi | ||||
@@ -269,12 +266,9 @@ this has fixed the buffer size. The way to change it now is to edit | |||||
the /boot/cmdline.txt file and add on spdev.bufsiz=8192 to set it to | the /boot/cmdline.txt file and add on spdev.bufsiz=8192 to set it to | ||||
e.g. 8192 bytes then reboot. | e.g. 8192 bytes then reboot. | ||||
Note that on a Pi with a recent 3.18 kernel with the device-tree structure | |||||
enable, the load may fail until you add: | |||||
.I dtparam=spi=on | |||||
into \fB/boot/config.txt\fR to allow user use of the I2C bus. | |||||
Note: On recent kernels with the device tree enabled you should use the | |||||
raspi-config program to load/unload the SPI device at boot time. | |||||
(or disable the device tree to continue to use this method) | |||||
.TP | .TP | ||||
.B gbr | .B gbr | ||||
@@ -116,7 +116,7 @@ static void changeOwner (char *cmd, char *file) | |||||
if (chown (file, uid, gid) != 0) | if (chown (file, uid, gid) != 0) | ||||
{ | { | ||||
if (errno == ENOENT) // Warn that it's not there | if (errno == ENOENT) // Warn that it's not there | ||||
fprintf (stderr, "%s: Warning (not an error): File not present: %s\n", cmd, file) ; | |||||
fprintf (stderr, "%s: Warning (not an error, do not report): File not present: %s\n", cmd, file) ; | |||||
else | else | ||||
fprintf (stderr, "%s: Warning (not an error): Unable to change ownership of %s: %s\n", cmd, file, strerror (errno)) ; | fprintf (stderr, "%s: Warning (not an error): Unable to change ownership of %s: %s\n", cmd, file, strerror (errno)) ; | ||||
} | } | ||||
@@ -163,6 +163,22 @@ static int moduleLoaded (char *modName) | |||||
********************************************************************************* | ********************************************************************************* | ||||
*/ | */ | ||||
static void checkDevTree (char *argv []) | |||||
{ | |||||
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 []) | static void _doLoadUsage (char *argv []) | ||||
{ | { | ||||
fprintf (stderr, "Usage: %s load <spi/i2c> [I2C baudrate in Kb/sec]\n", argv [0]) ; | fprintf (stderr, "Usage: %s load <spi/i2c> [I2C baudrate in Kb/sec]\n", argv [0]) ; | ||||
@@ -176,6 +192,8 @@ static void doLoad (int argc, char *argv []) | |||||
char *file1, *file2 ; | char *file1, *file2 ; | ||||
char args1 [32], args2 [32] ; | char args1 [32], args2 [32] ; | ||||
checkDevTree (argv) ; | |||||
if (argc < 3) | if (argc < 3) | ||||
_doLoadUsage (argv) ; | _doLoadUsage (argv) ; | ||||
@@ -251,6 +269,8 @@ static void doUnLoad (int argc, char *argv []) | |||||
char *module1, *module2 ; | char *module1, *module2 ; | ||||
char cmd [80] ; | char cmd [80] ; | ||||
checkDevTree (argv) ; | |||||
if (argc != 3) | if (argc != 3) | ||||
_doUnLoadUsage (argv) ; | _doUnLoadUsage (argv) ; | ||||
@@ -1138,6 +1158,8 @@ int main (int argc, char *argv []) | |||||
{ | { | ||||
int i ; | int i ; | ||||
int model, rev, mem, maker, overVolted ; | int model, rev, mem, maker, overVolted ; | ||||
struct stat statBuf ; | |||||
if (getenv ("WIRINGPI_DEBUG") != NULL) | if (getenv ("WIRINGPI_DEBUG") != NULL) | ||||
{ | { | ||||
@@ -1195,15 +1217,15 @@ int main (int argc, char *argv []) | |||||
printf (" Type: %s, Revision: %s, Memory: %dMB, Maker: %s %s\n", | printf (" Type: %s, Revision: %s, Memory: %dMB, Maker: %s %s\n", | ||||
piModelNames [model], piRevisionNames [rev], mem, piMakerNames [maker], overVolted ? "[OV]" : "") ; | piModelNames [model], piRevisionNames [rev], mem, piMakerNames [maker], overVolted ? "[OV]" : "") ; | ||||
// Quick check for /dev/gpiomem | |||||
// Check for device tree | |||||
if (stat ("/proc/device-tree", &statBuf) == 0) // We're on a devtree system ... | |||||
printf (" Device tree is enabled.\n") ; | |||||
if ((i = open ("/dev/gpiomem", O_RDWR | O_SYNC | O_CLOEXEC) ) >= 0) | |||||
printf (" This Raspberry Pi supports user-level GPIO access via /dev/gpiomem.\n") ; | |||||
if (stat ("/dev/gpiomem", &statBuf) == 0) // User level GPIO is GO | |||||
printf (" This Raspberry Pi supports user-level GPIO access.\n") ; | |||||
else | else | ||||
{ | |||||
printf (" You need to run your programs as root for GPIO access\n") ; | |||||
printf (" (Old /dev/mem method - consider upgrading)\n") ; | |||||
} | |||||
printf (" * Root or sudo required for GPIO access.\n") ; | |||||
} | } | ||||
return 0 ; | return 0 ; | ||||
@@ -1 +1 @@ | |||||
#define VERSION "2.27" | |||||
#define VERSION "2.28" |
@@ -1,7 +1,7 @@ | |||||
/* | /* | ||||
* max31855.c: | * max31855.c: | ||||
* Extend wiringPi with the max31855 SPI Analog to Digital convertor | * Extend wiringPi with the max31855 SPI Analog to Digital convertor | ||||
* Copyright (c) 2012-2013 Gordon Henderson | |||||
* Copyright (c) 2012-2015 Gordon Henderson | |||||
*********************************************************************** | *********************************************************************** | ||||
* This file is part of wiringPi: | * This file is part of wiringPi: | ||||
* https://projects.drogon.net/raspberry-pi/wiringpi/ | * https://projects.drogon.net/raspberry-pi/wiringpi/ | ||||
@@ -24,7 +24,6 @@ | |||||
#include <byteswap.h> | #include <byteswap.h> | ||||
#include <stdint.h> | #include <stdint.h> | ||||
#include <math.h> | |||||
#include <wiringPi.h> | #include <wiringPi.h> | ||||
#include <wiringPiSPI.h> | #include <wiringPiSPI.h> | ||||
@@ -60,7 +59,7 @@ static int myAnalogRead (struct wiringPiNodeStruct *node, int pin) | |||||
if ((spiData & 0x2000) != 0) // Negative | if ((spiData & 0x2000) != 0) // Negative | ||||
temp = -temp ; | temp = -temp ; | ||||
return (int)rint ((double)temp * 2.5) ; | |||||
return (int)((((double)temp * 25) + 0.5) / 10.0) ; | |||||
case 3: // Return temp in F * 10 | case 3: // Return temp in F * 10 | ||||
spiData >>= 18 ; | spiData >>= 18 ; | ||||
@@ -68,7 +67,7 @@ static int myAnalogRead (struct wiringPiNodeStruct *node, int pin) | |||||
if ((spiData & 0x2000) != 0) // Negative | if ((spiData & 0x2000) != 0) // Negative | ||||
temp = -temp ; | temp = -temp ; | ||||
return (int)rint ((((double)temp * 0.25 * 9.0 / 5.0) + 32.0) * 10.0) ; | |||||
return (int)((((((double)temp * 0.25 * 9.0 / 5.0) + 32.0) * 100.0) + 0.5) / 10.0) ; | |||||
default: // Who knows... | default: // Who knows... | ||||
return 0 ; | return 0 ; | ||||