|
@@ -0,0 +1,170 @@ |
|
|
|
|
|
// WiringPi test program: Kernel char device interface / sysfs successor |
|
|
|
|
|
// Compile: gcc -Wall wiringpi_test1_device.c -o wiringpi_test1_device -lwiringPi |
|
|
|
|
|
|
|
|
|
|
|
#include "wpi_test.h" |
|
|
|
|
|
#include <string.h> |
|
|
|
|
|
#include <errno.h> |
|
|
|
|
|
#include <stdlib.h> |
|
|
|
|
|
#include <unistd.h> |
|
|
|
|
|
#include <sys/time.h> |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
const int GPIO = 19; |
|
|
|
|
|
const int GPIOIN = 26; |
|
|
|
|
|
const int ToggleValue = 4; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
static volatile int globalCounter; |
|
|
|
|
|
volatile long long gStartTime, gEndTime; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
static void wfi (void) { |
|
|
|
|
|
struct timeval now; |
|
|
|
|
|
|
|
|
|
|
|
gettimeofday(&now, 0); |
|
|
|
|
|
if (0==gStartTime) { |
|
|
|
|
|
gStartTime = now.tv_sec*1000000LL + now.tv_usec; |
|
|
|
|
|
} else { |
|
|
|
|
|
gEndTime = now.tv_sec*1000000LL + now.tv_usec; |
|
|
|
|
|
} |
|
|
|
|
|
globalCounter++; |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
double StartSequence (int Enge, int OUTpin) { |
|
|
|
|
|
int expected; |
|
|
|
|
|
double timeExpected; |
|
|
|
|
|
|
|
|
|
|
|
gStartTime = 0; |
|
|
|
|
|
gEndTime = 0; |
|
|
|
|
|
globalCounter = 0; |
|
|
|
|
|
printf("Start\n"); |
|
|
|
|
|
digitalWrite(OUTpin, HIGH); |
|
|
|
|
|
delay(200); |
|
|
|
|
|
digitalWrite(OUTpin, LOW); |
|
|
|
|
|
delay(100); |
|
|
|
|
|
digitalWrite(OUTpin, HIGH); |
|
|
|
|
|
delay(200); |
|
|
|
|
|
digitalWrite(OUTpin, LOW); |
|
|
|
|
|
delay(100); |
|
|
|
|
|
printf("Stop\n"); |
|
|
|
|
|
int globalCounterCopy = globalCounter; |
|
|
|
|
|
|
|
|
|
|
|
if (INT_EDGE_BOTH == Enge) { |
|
|
|
|
|
expected = 4; |
|
|
|
|
|
timeExpected = 500; |
|
|
|
|
|
} else { |
|
|
|
|
|
expected = 2; |
|
|
|
|
|
timeExpected = 300; |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
if (globalCounter==expected) { |
|
|
|
|
|
double fTime = (gEndTime - gStartTime) / 1000000.0; |
|
|
|
|
|
printf("IRQ worked %g sec (~%gs expected)", fTime, timeExpected/1000.0); |
|
|
|
|
|
double diff = fTime-(timeExpected/1000.0); |
|
|
|
|
|
if(diff<0.05 && diff>0) { |
|
|
|
|
|
printf(" -> %spassed%s\n", COLORGRN, COLORDEF); |
|
|
|
|
|
} else { |
|
|
|
|
|
printf(" -> %sfailed%s\n", COLORRED, COLORDEF); |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
return fTime; |
|
|
|
|
|
} else { |
|
|
|
|
|
printf("IRQ not worked got %d iterations (%d exprected)\n\n", globalCounterCopy, expected); |
|
|
|
|
|
return 0; |
|
|
|
|
|
} |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
double DurationTime(int Enge, int OUTpin, int IRQpin) { |
|
|
|
|
|
struct timeval now; |
|
|
|
|
|
double fTime = 0.0; |
|
|
|
|
|
|
|
|
|
|
|
gStartTime = 0; |
|
|
|
|
|
gEndTime = 0; |
|
|
|
|
|
globalCounter = 0; |
|
|
|
|
|
printf("Start\n"); |
|
|
|
|
|
|
|
|
|
|
|
if (INT_EDGE_RISING == Enge) { |
|
|
|
|
|
digitalWrite(OUTpin, LOW); |
|
|
|
|
|
wiringPiISR (IRQpin, INT_EDGE_RISING, &wfi) ; |
|
|
|
|
|
sleep(1); |
|
|
|
|
|
gettimeofday(&now, 0); |
|
|
|
|
|
gStartTime = now.tv_sec*1000000LL + now.tv_usec; |
|
|
|
|
|
digitalWrite(OUTpin, HIGH); |
|
|
|
|
|
delay(20); |
|
|
|
|
|
digitalWrite(OUTpin, LOW); |
|
|
|
|
|
} else if (INT_EDGE_FALLING == Enge) { |
|
|
|
|
|
digitalWrite(OUTpin, HIGH); |
|
|
|
|
|
wiringPiISR (IRQpin, INT_EDGE_FALLING, &wfi) ; |
|
|
|
|
|
sleep(1); |
|
|
|
|
|
gettimeofday(&now, 0); |
|
|
|
|
|
gStartTime = now.tv_sec*1000000LL + now.tv_usec; |
|
|
|
|
|
digitalWrite(OUTpin, LOW); |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
sleep(1); |
|
|
|
|
|
fTime = (gEndTime - gStartTime); |
|
|
|
|
|
printf("IRQ detect time %g usec", fTime); |
|
|
|
|
|
if (fTime<2000 && fTime>0) { |
|
|
|
|
|
printf(" -> %spassed%s\n", COLORGRN, COLORDEF); |
|
|
|
|
|
} else { |
|
|
|
|
|
printf(" -> %sfailed%s\n", COLORRED, COLORDEF); |
|
|
|
|
|
} |
|
|
|
|
|
wiringPiISRStop (IRQpin) ; |
|
|
|
|
|
|
|
|
|
|
|
return fTime; |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
int main (void) { |
|
|
|
|
|
const int IRQpin = GPIOIN ; |
|
|
|
|
|
const int OUTpin = GPIO ; |
|
|
|
|
|
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); |
|
|
|
|
|
|
|
|
|
|
|
wiringPiSetupGpio() ; |
|
|
|
|
|
|
|
|
|
|
|
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 falling\n", IRQpin, OUTpin); |
|
|
|
|
|
wiringPiISR (IRQpin, INT_EDGE_FALLING, &wfi) ; |
|
|
|
|
|
sleep(1); |
|
|
|
|
|
StartSequence (INT_EDGE_FALLING, OUTpin); |
|
|
|
|
|
printf("Testing close\n"); |
|
|
|
|
|
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) ; |
|
|
|
|
|
|
|
|
|
|
|
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("Measuring duration IRQ @ GPIO%d with trigger @ GPIO%d falling\n", IRQpin, OUTpin); |
|
|
|
|
|
DurationTime(INT_EDGE_FALLING, OUTpin, IRQpin); |
|
|
|
|
|
} |
|
|
|
|
|
pinMode(OUTpin, INPUT); |
|
|
|
|
|
|
|
|
|
|
|
return 0 ; |
|
|
|
|
|
} |