Also adding in the stuff for /dev/gpiomem with warnings and information in the gpio manual page (who reads that though!)pull/62/head
@@ -1 +1 @@ | |||
2.28 | |||
2.29 |
@@ -1,5 +1,5 @@ | |||
Package: wiringpi | |||
Version: 2.28 | |||
Version: 2.29 | |||
Section: libraries | |||
Priority: optional | |||
Architecture: armhf | |||
@@ -45,7 +45,7 @@ SRC = blink.c blink8.c blink12.c \ | |||
lcd.c lcd-adafruit.c clock.c \ | |||
nes.c \ | |||
softPwm.c softTone.c \ | |||
delayTest.c serialRead.c serialTest.c okLed.c ds1302.c \ | |||
delayTest.c serialRead.c serialTestc okLed.c ds1302.c \ | |||
lowPower.c \ | |||
max31855.c \ | |||
rht03.c | |||
@@ -151,7 +151,7 @@ ds1302: ds1302.o | |||
max31855: max31855.o | |||
$Q echo [link] | |||
$Q $(CC) -o $@ max31855.c.o $(LDFLAGS) $(LDLIBS) | |||
$Q $(CC) -o $@ max31855.o $(LDFLAGS) $(LDLIBS) | |||
.c.o: | |||
$Q echo [CC] $< | |||
@@ -33,7 +33,7 @@ | |||
int main (int argc, char *argv []) | |||
{ | |||
int i ; | |||
int i = 0 ; | |||
wiringPiSetup () ; | |||
max31855Setup (200, 0) ; | |||
@@ -41,9 +41,20 @@ int main (int argc, char *argv []) | |||
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)) ; | |||
if (i == 0) | |||
{ | |||
printf ("+------+------+------+------++------+------+------+------+\n") ; | |||
printf ("| Raw | Err | C | F || Raw | Err | C | F |\n") ; | |||
printf ("+------+------+------+------++------+------+------+------+\n") ; | |||
} | |||
printf ("| %4d | %4d | %4d | %4d |", analogRead (200), analogRead (201), analogRead (202), analogRead (203)) ; | |||
printf ("| %4d | %4d | %4d | %4d |\n", analogRead (400), analogRead (401), analogRead (402), analogRead (403)) ; | |||
delay (500) ; | |||
if (++i == 10) | |||
i = 0 ; | |||
} | |||
} |
@@ -37,7 +37,7 @@ INCLUDE = -I$(DESTDIR)$(PREFIX)/include | |||
CFLAGS = $(DEBUG) -Wall $(INCLUDE) -Winline -pipe | |||
LDFLAGS = -L$(DESTDIR)$(PREFIX)/lib | |||
LIBS = -lwiringPi -lwiringPiDev -lpthread -lm | |||
LIBS = -lwiringPi -lwiringPiDev -lpthread | |||
# May not need to alter anything below this line | |||
############################################################################### | |||
@@ -260,7 +260,7 @@ raspi-config program to load/unload the I2C device at boot time. | |||
This loads the spi drivers into the kernel and changes the permissions | |||
on the associated /dev/ entries so that the current user has access to | |||
them. It used to have the ability to change the buffer size from the | |||
default of 4096 bytes to an arbitary value, however for some time the | |||
default of 4096 bytes to an arbitrary value, however for some time the | |||
Pi Foundation have compiled the SPI device driver into the kernel and | |||
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 | |||
@@ -321,6 +321,18 @@ When using the \fIexport\fR, \fIedge\fR or \fIunexport\fR commands, the | |||
pin numbers are \fBalways\fR native BCM_GPIO numbers and never wiringPi | |||
pin numbers. | |||
As of kernels 4.1.7, a user-level GPIO access mechanism is available, | |||
however wiringPi will not use this by default - because at this time | |||
there appears to be issues when trying to program the PWM or clock output | |||
hardware. If you can live without PWM or GPIO clocks and you want to use | |||
the GPIO from a non-root program, then you need to make sure that the | |||
module \fIbcm2835_gpiomem\fR is loaded at boot time. This should happen | |||
automatically when you enable the device tree in raspi-config. You may | |||
also need some additional information in /etc/udev/rules.d/ to change the | |||
mode and ownership of the /dev/gpiomem file. Finally, you need to set | |||
the environment variable \fIWIRINGPI_GPIOMEM\fR. This will go-away | |||
in future releases once the /dev/gpiomem interface is fully operational. | |||
.SH "SEE ALSO" | |||
.LP | |||
@@ -1223,7 +1223,10 @@ int main (int argc, char *argv []) | |||
printf (" Device tree is enabled.\n") ; | |||
if (stat ("/dev/gpiomem", &statBuf) == 0) // User level GPIO is GO | |||
{ | |||
printf (" This Raspberry Pi supports user-level GPIO access.\n") ; | |||
printf (" -> See the man-page for more details\n") ; | |||
} | |||
else | |||
printf (" * Root or sudo required for GPIO access.\n") ; | |||
@@ -1 +1 @@ | |||
#define VERSION "2.28" | |||
#define VERSION "2.29" |
@@ -84,6 +84,7 @@ | |||
#define ENV_DEBUG "WIRINGPI_DEBUG" | |||
#define ENV_CODES "WIRINGPI_CODES" | |||
#define ENV_GPIOMEM "WIRINGPI_GPIOMEM" | |||
// Mask for the bottom 64 pins which belong to the Raspberry Pi | |||
@@ -253,6 +254,10 @@ static pthread_mutex_t pinMutex ; | |||
int wiringPiDebug = FALSE ; | |||
int wiringPiReturnCodes = FALSE ; | |||
// Use /dev/gpiomem ? | |||
int wiringPiTryGpioMem = FALSE ; | |||
// sysFds: | |||
// Map a file descriptor from the /sys/class/gpio/gpioX/value | |||
@@ -913,6 +918,9 @@ void setPadDrive (int group, int value) | |||
if ((wiringPiMode == WPI_MODE_PINS) || (wiringPiMode == WPI_MODE_PHYS) || (wiringPiMode == WPI_MODE_GPIO)) | |||
{ | |||
if (RASPBERRY_PI_PERI_BASE == 0) // Ignore for now | |||
return ; | |||
if ((group < 0) || (group > 2)) | |||
return ; | |||
@@ -986,6 +994,9 @@ void pwmSetRange (unsigned int range) | |||
{ | |||
if ((wiringPiMode == WPI_MODE_PINS) || (wiringPiMode == WPI_MODE_PHYS) || (wiringPiMode == WPI_MODE_GPIO)) | |||
{ | |||
if (RASPBERRY_PI_PERI_BASE == 0) // Ignore for now | |||
return ; | |||
*(pwm + PWM0_RANGE) = range ; delayMicroseconds (10) ; | |||
*(pwm + PWM1_RANGE) = range ; delayMicroseconds (10) ; | |||
} | |||
@@ -1007,6 +1018,9 @@ void pwmSetClock (int divisor) | |||
if ((wiringPiMode == WPI_MODE_PINS) || (wiringPiMode == WPI_MODE_PHYS) || (wiringPiMode == WPI_MODE_GPIO)) | |||
{ | |||
if (RASPBERRY_PI_PERI_BASE == 0) // Ignore for now | |||
return ; | |||
if (wiringPiDebug) | |||
printf ("Setting to: %d. Current: 0x%08X\n", divisor, *(clk + PWMCLK_DIV)) ; | |||
@@ -1059,6 +1073,9 @@ void gpioClockSet (int pin, int freq) | |||
else if (wiringPiMode != WPI_MODE_GPIO) | |||
return ; | |||
if (RASPBERRY_PI_PERI_BASE == 0) // Ignore for now | |||
return ; | |||
divi = 19200000 / freq ; | |||
divr = 19200000 % freq ; | |||
divf = (int)((double)divr * 4096.0 / 19200000.0) ; | |||
@@ -1231,11 +1248,17 @@ void pinMode (int pin, int mode) | |||
softToneCreate (origPin) ; | |||
else if (mode == PWM_TONE_OUTPUT) | |||
{ | |||
if (RASPBERRY_PI_PERI_BASE == 0) // Ignore for now | |||
return ; | |||
pinMode (origPin, PWM_OUTPUT) ; // Call myself to enable PWM mode | |||
pwmSetMode (PWM_MODE_MS) ; | |||
} | |||
else if (mode == PWM_OUTPUT) | |||
{ | |||
if (RASPBERRY_PI_PERI_BASE == 0) // Ignore for now | |||
return ; | |||
if ((alt = gpioToPwmALT [pin]) == 0) // Not a hardware capable PWM pin | |||
return ; | |||
@@ -1250,6 +1273,9 @@ void pinMode (int pin, int mode) | |||
} | |||
else if (mode == GPIO_CLOCK) | |||
{ | |||
if (RASPBERRY_PI_PERI_BASE == 0) // Ignore for now | |||
return ; | |||
if ((alt = gpioToGpClkALT0 [pin]) == 0) // Not a GPIO_CLOCK pin | |||
return ; | |||
@@ -1404,6 +1430,9 @@ void pwmWrite (int pin, int value) | |||
if ((pin & PI_GPIO_MASK) == 0) // On-Board Pin | |||
{ | |||
if (RASPBERRY_PI_PERI_BASE == 0) // Ignore for now | |||
return ; | |||
/**/ if (wiringPiMode == WPI_MODE_PINS) | |||
pin = pinToGpio [pin] ; | |||
else if (wiringPiMode == WPI_MODE_PHYS) | |||
@@ -1470,6 +1499,9 @@ void pwmToneWrite (int pin, int freq) | |||
{ | |||
int range ; | |||
if (RASPBERRY_PI_PERI_BASE == 0) // Ignore for now | |||
return ; | |||
if (freq == 0) | |||
pwmWrite (pin, 0) ; // Off | |||
else | |||
@@ -1838,8 +1870,15 @@ int wiringPiSetup (void) | |||
if (getenv (ENV_CODES) != NULL) | |||
wiringPiReturnCodes = TRUE ; | |||
if (getenv (ENV_GPIOMEM) != NULL) | |||
wiringPiTryGpioMem = TRUE ; | |||
if (wiringPiDebug) | |||
{ | |||
printf ("wiringPi: wiringPiSetup called\n") ; | |||
if (wiringPiTryGpioMem) | |||
printf ("wiringPi: Using /dev/gpiomem\n") ; | |||
} | |||
boardRev = piBoardRev () ; | |||
@@ -1863,8 +1902,12 @@ int wiringPiSetup (void) | |||
// See if /dev/gpiomem exists and we can open it... | |||
if ((fd = open ("/dev/gpiomem", O_RDWR | O_SYNC | O_CLOEXEC) ) >= 0) | |||
if (wiringPiTryGpioMem) | |||
{ | |||
if ((fd = open ("/dev/gpiomem", O_RDWR | O_SYNC | O_CLOEXEC) ) < 0) | |||
return wiringPiFailure (WPI_ALMOST, "wiringPiSetup: Unable to open /dev/gpiomem: %s\n", strerror (errno)) ; | |||
RASPBERRY_PI_PERI_BASE = 0 ; | |||
} | |||
// ... otherwise fall back to the original /dev/mem which requires root level access | |||