diff --git a/wiringPi/test/Makefile b/wiringPi/test/Makefile index 764201b..5c711cb 100644 --- a/wiringPi/test/Makefile +++ b/wiringPi/test/Makefile @@ -41,7 +41,7 @@ wiringpi_i2c_test1_pcf8574: ${CC} ${CFLAGS} wiringpi_i2c_test1_pcf8574.c -o wiringpi_i2c_test1_pcf8574 -lwiringPi wiringpi_piface_test1: - ${CC} ${CFLAGS} wiringpi_piface_test1.c -o wiringpi_piface_test1 -lwiringPi + ${CC} ${CFLAGS} wiringpi_piface_test1.c -o wiringpi_piface_test1 -lwiringPi -lwiringPiDev test: @error_state=false ; \ diff --git a/wiringPi/test/wiringpi_piface_test1.c b/wiringPi/test/wiringpi_piface_test1.c index 686efdb..c70861b 100644 --- a/wiringPi/test/wiringpi_piface_test1.c +++ b/wiringPi/test/wiringpi_piface_test1.c @@ -1,17 +1,130 @@ -#include "wpi_test.h" -#include "../../version.h" +// WiringPi piface program IN, OUT, PULL +// Compile: gcc -Wall wiringpi_piface_test1.c -o wiringpi_piface_test1 -lwiringPi -lwiringPiDev -// PiFace dummy +#include "wpi_test.h" +#include -int main (void) { - int major, minor; +// Use 200 as the pin-base for the PiFace board, and change all pins +// for the LED and relays +const int PIFACE = 200; //Mapped wiringpi IO address +const int defaultsleep = 200000; // 200 ms - wiringPiVersion(&major, &minor); - printf("Testing piface functions with WiringPi %d.%d\n",major, minor); - printf("------------------------------------------\n\n"); - - - - return UnitTestState(); +void ReadUntilTimeout(int GPIO, int expect, int timeoutSec) { + const int intervaluS = 250000; //250ms + int in; + const char* strexpect = expect ? "HIGH" : "LOW"; + for(int loop=0, end=(timeoutSec*1000000/intervaluS); loop test not possible + } + //6 & 7 connected from relais NO (normaly open) to in -> test possible + delayMicroseconds(defaultsleep); + pullUpDnControl (PIFACE + IN, PUD_UP) ; + ReadUntilTimeout(PIFACE + IN, HIGH, 2) ; + pullUpDnControl (PIFACE + IN, PUD_DOWN) ; + // cool down very slowly, connect 680 kOhm pull down resistor to make ist faster + ReadUntilTimeout(PIFACE + IN, LOW, 60) ; + pullUpDnControl (PIFACE + IN, PUD_UP) ; // finally up + ReadUntilTimeout(PIFACE + IN, HIGH, 2) ; + } + + return UnitTestState(); } diff --git a/wiringPi/test/wiringpi_test1_sysfs.c b/wiringPi/test/wiringpi_test1_sysfs.c index 45a62fe..a97f85e 100644 --- a/wiringPi/test/wiringpi_test1_sysfs.c +++ b/wiringPi/test/wiringpi_test1_sysfs.c @@ -7,8 +7,8 @@ #include -const int GPIO = 19; -const int GPIOIN = 26; +int GPIO = 19; +int GPIOIN = 26; const int ToggleValue = 4; @@ -21,6 +21,11 @@ int main (void) { printf("wiringPiSetupSys failed\n\n"); exit(EXIT_FAILURE); } + if (!piBoard40Pin()) { + GPIO = 23; + GPIOIN = 24; + } + pinMode(GPIOIN, INPUT); pinMode(GPIO, OUTPUT); diff --git a/wiringPi/test/wiringpi_test2_sysfs.c b/wiringPi/test/wiringpi_test2_sysfs.c index 0e5a0d2..76c48d3 100644 --- a/wiringPi/test/wiringpi_test2_sysfs.c +++ b/wiringPi/test/wiringpi_test2_sysfs.c @@ -7,8 +7,8 @@ #include -const int GPIO = 19; -const int GPIOIN = 26; +int GPIO = 19; +int GPIOIN = 26; const int ToggleValue = 4; @@ -21,6 +21,11 @@ int main (void) { printf("wiringPiSetupSys failed\n\n"); exit(EXIT_FAILURE); } + if (!piBoard40Pin()) { + GPIO = 23; + GPIOIN = 24; + } + pinMode(GPIOIN, INPUT); pinMode(GPIO, OUTPUT); diff --git a/wiringPi/test/wiringpi_test3_device_wpi.c b/wiringPi/test/wiringpi_test3_device_wpi.c index 24af1bc..4176459 100644 --- a/wiringPi/test/wiringpi_test3_device_wpi.c +++ b/wiringPi/test/wiringpi_test3_device_wpi.c @@ -7,8 +7,8 @@ #include -const int GPIO = 24; //BCM 19 -const int GPIOIN = 25; //BCM 26; +int GPIO = 24; //BCM 19 +int GPIOIN = 25; //BCM 26; const int ToggleValue = 4; @@ -21,6 +21,11 @@ int main (void) { printf("wiringPiSetupGpioDevice failed\n\n"); exit(EXIT_FAILURE); } + if (!piBoard40Pin()) { + GPIO = 4; //BCM 23 + GPIOIN = 5; //BCM 24 + } + pinMode(GPIOIN, INPUT); pinMode(GPIO, OUTPUT); diff --git a/wiringPi/test/wiringpi_test4_device_phys.c b/wiringPi/test/wiringpi_test4_device_phys.c index ecd07a5..31157b8 100644 --- a/wiringPi/test/wiringpi_test4_device_phys.c +++ b/wiringPi/test/wiringpi_test4_device_phys.c @@ -7,8 +7,8 @@ #include -const int GPIO = 35; //BCM 19 -const int GPIOIN = 37; //BCM 26; +int GPIO = 35; //BCM 19 +int GPIOIN = 37; //BCM 26; const int ToggleValue = 4; @@ -21,6 +21,11 @@ int main (void) { printf("wiringPiSetupGpioDevice failed\n\n"); exit(EXIT_FAILURE); } + if (!piBoard40Pin()) { + GPIO = 16; //BCM 23 + GPIOIN = 18; //BCM 24 + } + pinMode(GPIOIN, INPUT); pinMode(GPIO, OUTPUT); diff --git a/wiringPi/test/wiringpi_test5_default.c b/wiringPi/test/wiringpi_test5_default.c index 8223090..ecf80bf 100644 --- a/wiringPi/test/wiringpi_test5_default.c +++ b/wiringPi/test/wiringpi_test5_default.c @@ -7,8 +7,8 @@ #include -const int GPIO = 19; -const int GPIOIN = 26; +int GPIO = 19; +int GPIOIN = 26; const int ToggleValue = 4; int RaspberryPiModel = -1; @@ -58,6 +58,10 @@ int main (void) { } else { printf("Raspberry Pi with BCM GPIO found (not Pi 5)\n"); } + if (!piBoard40Pin()) { + GPIO = 23; + GPIOIN = 24; + } enum WPIPinAlt AltGpio = WPI_ALT_UNKNOWN; diff --git a/wiringPi/test/wiringpi_test6_isr.c b/wiringPi/test/wiringpi_test6_isr.c index 24f1496..644fa50 100644 --- a/wiringPi/test/wiringpi_test6_isr.c +++ b/wiringPi/test/wiringpi_test6_isr.c @@ -8,8 +8,8 @@ #include -const int GPIO = 19; -const int GPIOIN = 26; +int GPIO = 19; +int GPIOIN = 26; const int ToggleValue = 4; @@ -115,55 +115,61 @@ double DurationTime(int Enge, int OUTpin, int IRQpin) { return fTime; } -int main (void) { - const int IRQpin = GPIOIN ; - const int OUTpin = GPIO ; - int major, minor; - wiringPiVersion(&major, &minor); +int main (void) { + + int major, minor; + + wiringPiVersion(&major, &minor); printf("WiringPi GPIO test program 1 (using GPIO%d (output) and GPIO%d (input))\n", GPIO, GPIOIN); printf(" testing irq\n"); - printf("\nISR test (WiringPi %d.%d)\n", major, minor); + printf("\nISR test (WiringPi %d.%d)\n", major, minor); - wiringPiSetupGpio() ; - - pinMode(IRQpin, INPUT); - pinMode(OUTpin, OUTPUT); - digitalWrite (OUTpin, LOW) ; + wiringPiSetupGpio() ; + if (!piBoard40Pin()) { + GPIO = 23; + GPIOIN = 24; + } + int IRQpin = GPIOIN ; + int OUTpin = GPIO ; + + pinMode(IRQpin, INPUT); + pinMode(OUTpin, OUTPUT); + digitalWrite (OUTpin, LOW) ; - printf("Testing IRQ @ GPIO%d with trigger @ GPIO%d rising\n", IRQpin, OUTpin); - wiringPiISR (IRQpin, INT_EDGE_RISING, &wfi) ; - sleep(1); - StartSequence (INT_EDGE_RISING, OUTpin); - printf("Testing close\n"); - - wiringPiISRStop (IRQpin) ; + printf("Testing IRQ @ GPIO%d with trigger @ GPIO%d rising\n", IRQpin, OUTpin); + wiringPiISR (IRQpin, INT_EDGE_RISING, &wfi) ; + sleep(1); + StartSequence (INT_EDGE_RISING, OUTpin); + printf("Testing close\n"); - printf("Testing IRQ @ GPIO%d with trigger @ GPIO%d falling\n", IRQpin, OUTpin); - wiringPiISR (IRQpin, INT_EDGE_FALLING, &wfi) ; - sleep(1); - StartSequence (INT_EDGE_FALLING, OUTpin); - printf("Testing close\n"); - wiringPiISRStop (IRQpin) ; + wiringPiISRStop (IRQpin) ; - printf("Testing IRQ @ GPIO%d with trigger @ GPIO%d both\n", IRQpin, OUTpin); - wiringPiISR (IRQpin, INT_EDGE_BOTH, &wfi) ; - sleep(1); - StartSequence (INT_EDGE_BOTH, OUTpin); - printf("Testing close\n"); - wiringPiISRStop (IRQpin) ; + printf("Testing IRQ @ GPIO%d with trigger @ GPIO%d falling\n", IRQpin, OUTpin); + wiringPiISR (IRQpin, INT_EDGE_FALLING, &wfi) ; + sleep(1); + StartSequence (INT_EDGE_FALLING, OUTpin); + printf("Testing close\n"); + wiringPiISRStop (IRQpin) ; - for (int count=0; count<2; count++) { - printf("Measuring duration IRQ @ GPIO%d with trigger @ GPIO%d rising\n", IRQpin, OUTpin); - DurationTime(INT_EDGE_RISING, OUTpin, IRQpin); + printf("Testing IRQ @ GPIO%d with trigger @ GPIO%d both\n", IRQpin, OUTpin); + wiringPiISR (IRQpin, INT_EDGE_BOTH, &wfi) ; + sleep(1); + StartSequence (INT_EDGE_BOTH, OUTpin); + printf("Testing close\n"); + wiringPiISRStop (IRQpin) ; - printf("Measuring duration IRQ @ GPIO%d with trigger @ GPIO%d falling\n", IRQpin, OUTpin); - DurationTime(INT_EDGE_FALLING, OUTpin, IRQpin); - } - pinMode(OUTpin, INPUT); + for (int count=0; count<2; count++) { + printf("Measuring duration IRQ @ GPIO%d with trigger @ GPIO%d rising\n", IRQpin, OUTpin); + DurationTime(INT_EDGE_RISING, OUTpin, IRQpin); - return UnitTestState(); + printf("Measuring duration IRQ @ GPIO%d with trigger @ GPIO%d falling\n", IRQpin, OUTpin); + DurationTime(INT_EDGE_FALLING, OUTpin, IRQpin); + } + pinMode(OUTpin, INPUT); + + return UnitTestState(); } diff --git a/wiringPi/test/wpi_test.h b/wiringPi/test/wpi_test.h index a2c3b19..d29b363 100644 --- a/wiringPi/test/wpi_test.h +++ b/wiringPi/test/wpi_test.h @@ -20,14 +20,14 @@ void CheckGPIO(int GPIO, int GPIOIN, int out) { int in = out; if (GPIOIN>=0) { - in = digitalRead(GPIOIN); + in = digitalRead(GPIOIN); } int readback = digitalRead(GPIO); int pass = 0; - if (out==readback && in==out) { - pass = 1; - } + if (out==readback && in==out) { + pass = 1; + } if (GPIOIN>=0) { printf("set GPIO%02d = %d (readback %d), in GPIO%02d = %d ", GPIO, out, readback, GPIOIN, in); @@ -44,6 +44,11 @@ void CheckGPIO(int GPIO, int GPIOIN, int out) { } +void CheckInversGPIO(int GPIO, int GPIOIN, int out) { + CheckGPIO(GPIO, GPIOIN, out==HIGH ? LOW : HIGH); +} + + void digitalWriteEx(int GPIO, int GPIOIN, int mode) { digitalWrite(GPIO, mode); delayMicroseconds(5000); diff --git a/wiringPi/wiringPi.c b/wiringPi/wiringPi.c index 22d2010..d98b8cc 100644 --- a/wiringPi/wiringPi.c +++ b/wiringPi/wiringPi.c @@ -557,6 +557,27 @@ int piBoard() { return RaspberryPiModel<0 ? 0 : 1; } + +int piBoard40Pin() { + if (!piBoard()){ + // Board not detected + return -1; + } + switch(RaspberryPiModel){ + case PI_MODEL_A: + case PI_MODEL_B: + return 0; +// PI_MODEL_CM +// PI_MODEL_CM3 +// PI_MODEL_CM4 +// PI_MODEL_CM4S +// ? guess yes + default: + return 1; + } +} + + int GetMaxPin() { return PI_MODEL_5 == RaspberryPiModel ? 27 : 63; } diff --git a/wiringPi/wiringPi.h b/wiringPi/wiringPi.h index 9a26b74..3938189 100644 --- a/wiringPi/wiringPi.h +++ b/wiringPi/wiringPi.h @@ -268,6 +268,7 @@ extern int wiringPiSetupPiFaceForGpioProg (void) ; // Don't use this - for gpio extern int piGpioLayout (void) ; extern int piBoardRev (void) ; // Deprecated, but does the same as piGpioLayout extern void piBoardId (int *model, int *rev, int *mem, int *maker, int *overVolted) ; +extern int piBoard40Pin (void) ; // Interface V3.7 extern int wpiPinToGpio (int wpiPin) ; extern int physPinToGpio (int physPin) ; extern void setPadDrive (int group, int value) ;