From 5a3d2f3c09eae5e5bc72f239d55ac55666705852 Mon Sep 17 00:00:00 2001 From: mstroh76 Date: Mon, 6 Jan 2025 13:59:19 +0100 Subject: [PATCH 01/13] #305 --- wiringPi/test/Makefile | 9 ++- wiringPi/test/wiringpi_test7_bench.c | 116 +++++++++++++++++++++++++++ 2 files changed, 122 insertions(+), 3 deletions(-) create mode 100644 wiringPi/test/wiringpi_test7_bench.c diff --git a/wiringPi/test/Makefile b/wiringPi/test/Makefile index bb87910..299dcb4 100644 --- a/wiringPi/test/Makefile +++ b/wiringPi/test/Makefile @@ -3,7 +3,7 @@ CFLAGS = -Wall LDFLAGS = # Need BCM19 <-> BCM26, +PWM: BCM12 <-> BCM13, BCM18 <-> BCM17 connected (1kOhm) -tests = wiringpi_test0_version wiringpi_test1_sysfs wiringpi_test2_sysfs wiringpi_test3_device_wpi wiringpi_test4_device_phys wiringpi_test5_default wiringpi_test6_isr wiringpi_test8_pwm wiringpi_test9_pwm +tests = wiringpi_test0_version wiringpi_test1_sysfs wiringpi_test2_sysfs wiringpi_test3_device_wpi wiringpi_test4_device_phys wiringpi_test5_default wiringpi_test6_isr wiringpi_test7_bench wiringpi_test8_pwm wiringpi_test9_pwm # Need XO hardware xotests = wiringpi_xotest_test1_spi wiringpi_i2c_test1_pcf8574 wiringpi_test8_pwm wiringpi_test9_pwm @@ -13,6 +13,9 @@ pifacetests = wiringpi_piface_test1 wiringpi_test8_pwm wiringpi_test9_pwm all: $(tests) $(xotests) $(pifacetests) +wiringpi_test0_version: + ${CC} ${CFLAGS} wiringpi_test0_version.c -o wiringpi_test0_version -lwiringPi + wiringpi_test1_sysfs: ${CC} ${CFLAGS} wiringpi_test1_sysfs.c -o wiringpi_test1_sysfs -lwiringPi @@ -31,8 +34,8 @@ wiringpi_test5_default: wiringpi_test6_isr: ${CC} ${CFLAGS} wiringpi_test6_isr.c -o wiringpi_test6_isr -lwiringPi -wiringpi_test0_version: - ${CC} ${CFLAGS} wiringpi_test0_version.c -o wiringpi_test0_version -lwiringPi +wiringpi_test7_bench: + ${CC} ${CFLAGS} wiringpi_test7_bench.c -o wiringpi_test7_bench -lwiringPi wiringpi_test8_pwm: ${CC} ${CFLAGS} wiringpi_test8_pwm.c -o wiringpi_test8_pwm -lwiringPi diff --git a/wiringPi/test/wiringpi_test7_bench.c b/wiringPi/test/wiringpi_test7_bench.c new file mode 100644 index 0000000..9de982a --- /dev/null +++ b/wiringPi/test/wiringpi_test7_bench.c @@ -0,0 +1,116 @@ +// WiringPi test program: benchmark +// Compile: gcc -Wall wiringpi_test7_bench.c -o wiringpi_test7_bench -lwiringPi + +#include "wpi_test.h" +//#include +//#include +//#include +#include +#include +#include + + +int ToggleValue = 240000000; +float fExpectMHzdigitalWrite = 10; +float fExpectMHzpinMode = 4; +int GPIO = 19; +int GPIOIN = 26; +int RaspberryPiModel = -1; + + +void ReportElaped(const char* msg, const float fExpectMHz, struct timeval t1, struct timeval t2) { + double elapsedTime, fTimePerOperation, fFreq; + + elapsedTime = (t2.tv_sec-t1.tv_sec)+(t2.tv_usec-t1.tv_usec)/1000000.0; + fTimePerOperation = elapsedTime*1000000.0/ToggleValue; + fFreq = ToggleValue/elapsedTime/1000000.0; + printf(" % 9d toggle took %.3f s, Time per toggle %.3f us, Freq %.3f MHz \n", + ToggleValue, elapsedTime, fTimePerOperation, fFreq); + CheckSameFloat(msg, fFreq, fExpectMHz, fExpectMHz*0.2f); +} + + +int main (void) { + struct timeval t1, t2; + + if (wiringPiSetupGpio() == -1) { + printf("wiringPiSetupGpio failed\n\n"); + exit(EXIT_FAILURE); + } + + int rev, mem, maker, overVolted; + piBoardId(&RaspberryPiModel, &rev, &mem, &maker, &overVolted); + CheckNotSame("Model: ", RaspberryPiModel, -1); + if (!piBoard40Pin()) { + GPIO = 23; + GPIOIN = 24; + } + + switch(RaspberryPiModel) { + case PI_MODEL_A: + case PI_MODEL_B: + case PI_MODEL_BP: + case PI_MODEL_AP: + case PI_MODEL_ZERO: + case PI_MODEL_ZERO_W: + case PI_MODEL_CM: + ToggleValue /= 8; + break; + case PI_MODEL_2: + ToggleValue /= 4; + break; + case PI_MODEL_3B: + case PI_MODEL_CM3: + case PI_MODEL_3BP: + case PI_MODEL_3AP: + case PI_MODEL_CM3P: + case PI_MODEL_ZERO_2W: + ToggleValue /= 2; + break; + case PI_MODEL_4B: + case PI_MODEL_400: + case PI_MODEL_CM4: + case PI_MODEL_CM4S: + ToggleValue = ToggleValue; + fExpectMHzdigitalWrite = 24.5; //MHz; + fExpectMHzpinMode = 4.1; + break; + case PI_MODEL_5: + ToggleValue *= 2; + break; + } + + + + printf("WiringPi GPIO speed test program (using GPIO %d) and toggle %d times\n", GPIO, ToggleValue); + printf(" testing digital Wirte and pinMode\n"); + + pinMode(GPIO, OUTPUT); + + printf("toggle % 3d million times pin value ...\n", ToggleValue/1000000); + gettimeofday(&t1, NULL); + for (int loop=1; loop Date: Mon, 6 Jan 2025 14:30:12 +0100 Subject: [PATCH 02/13] #305 set values for Pi types --- wiringPi/test/wiringpi_test7_bench.c | 33 +++++++++++++++++++++++----- 1 file changed, 27 insertions(+), 6 deletions(-) diff --git a/wiringPi/test/wiringpi_test7_bench.c b/wiringPi/test/wiringpi_test7_bench.c index 9de982a..aef0ba9 100644 --- a/wiringPi/test/wiringpi_test7_bench.c +++ b/wiringPi/test/wiringpi_test7_bench.c @@ -34,7 +34,8 @@ int main (void) { struct timeval t1, t2; if (wiringPiSetupGpio() == -1) { - printf("wiringPiSetupGpio failed\n\n"); + printf("wiringPiSetupGpio failed\n\n"); fExpectMHzdigitalWrite = 4.0; //MHz; + fExpectMHzpinMode = 1.6; exit(EXIT_FAILURE); } @@ -48,13 +49,19 @@ int main (void) { switch(RaspberryPiModel) { case PI_MODEL_A: - case PI_MODEL_B: + case PI_MODEL_B: //ARM=800MHz: 3.8/1.5 case PI_MODEL_BP: case PI_MODEL_AP: - case PI_MODEL_ZERO: - case PI_MODEL_ZERO_W: case PI_MODEL_CM: - ToggleValue /= 8; + ToggleValue /= 7; + fExpectMHzdigitalWrite = 3.8; //MHz; + fExpectMHzpinMode = 1.5; + break; + case PI_MODEL_ZERO: + case PI_MODEL_ZERO_W: //ARM=1000MHz: 4.8/2.0 + ToggleValue /= 5; + fExpectMHzdigitalWrite = 4.8; //MHz; + fExpectMHzpinMode = 2.0; break; case PI_MODEL_2: ToggleValue /= 4; @@ -76,7 +83,9 @@ int main (void) { fExpectMHzpinMode = 4.1; break; case PI_MODEL_5: - ToggleValue *= 2; + ToggleValue = ToggleValue*0.8; + fExpectMHzdigitalWrite = 20.0; //MHz; + fExpectMHzpinMode = 2.5; break; } @@ -110,6 +119,18 @@ int main (void) { gettimeofday(&t2, NULL); ReportElaped("GPIO pinMode max. frequency ", fExpectMHzpinMode, t1, t2); + printf("\n\n"); + printf("toggle % 3d million times pin mode and digitalWrite ..\n", ToggleValue/1000000); + gettimeofday(&t1, NULL); + for (int loop=1; loop Date: Mon, 6 Jan 2025 21:18:04 +0100 Subject: [PATCH 03/13] #305 --- wiringPi/test/wiringpi_test7_bench.c | 50 ++++++++++++++++++++-------- 1 file changed, 36 insertions(+), 14 deletions(-) diff --git a/wiringPi/test/wiringpi_test7_bench.c b/wiringPi/test/wiringpi_test7_bench.c index aef0ba9..7edc506 100644 --- a/wiringPi/test/wiringpi_test7_bench.c +++ b/wiringPi/test/wiringpi_test7_bench.c @@ -34,8 +34,7 @@ int main (void) { struct timeval t1, t2; if (wiringPiSetupGpio() == -1) { - printf("wiringPiSetupGpio failed\n\n"); fExpectMHzdigitalWrite = 4.0; //MHz; - fExpectMHzpinMode = 1.6; + printf("wiringPiSetupGpio failed\n\n"); exit(EXIT_FAILURE); } @@ -92,36 +91,45 @@ int main (void) { printf("WiringPi GPIO speed test program (using GPIO %d) and toggle %d times\n", GPIO, ToggleValue); - printf(" testing digital Wirte and pinMode\n"); + printf(" testing digital Wirte and pinMode\n"); pinMode(GPIO, OUTPUT); - printf("toggle % 3d million times pin value ...\n", ToggleValue/1000000); + printf("write % 3d million times pin value ...\n", ToggleValue/1000000); gettimeofday(&t1, NULL); for (int loop=1; loop Date: Fri, 10 Jan 2025 18:58:09 +0100 Subject: [PATCH 04/13] #305 measure single operation time and toggle time --- wiringPi/test/wiringpi_test7_bench.c | 69 ++++++++++++++++------------ 1 file changed, 40 insertions(+), 29 deletions(-) diff --git a/wiringPi/test/wiringpi_test7_bench.c b/wiringPi/test/wiringpi_test7_bench.c index 7edc506..d745287 100644 --- a/wiringPi/test/wiringpi_test7_bench.c +++ b/wiringPi/test/wiringpi_test7_bench.c @@ -11,22 +11,24 @@ int ToggleValue = 240000000; -float fExpectMHzdigitalWrite = 10; -float fExpectMHzpinMode = 4; +float fExpectTimedigitalWrite = 1/10; +float fExpectTimedigitalRead = 1/5; +float fExpectTimepinMode = 1/4; +float fWriteReadDelayFactor = 1.77; int GPIO = 19; int GPIOIN = 26; int RaspberryPiModel = -1; -void ReportElaped(const char* msg, const float fExpectMHz, struct timeval t1, struct timeval t2) { +void ReportElapedTime(const char* msg, int multiop, const float fExpectTime, struct timeval t1, struct timeval t2) { double elapsedTime, fTimePerOperation, fFreq; elapsedTime = (t2.tv_sec-t1.tv_sec)+(t2.tv_usec-t1.tv_usec)/1000000.0; - fTimePerOperation = elapsedTime*1000000.0/ToggleValue; - fFreq = ToggleValue/elapsedTime/1000000.0; - printf(" % 9d toggle took %.3f s, Time per toggle %.3f us, Freq %.3f MHz \n", + fTimePerOperation = elapsedTime*1000000.0/ToggleValue/multiop; + fFreq = 1.0f/(fTimePerOperation*2); //ToggleValue/elapsedTime/1000000.0; + printf(" % 9d took %.3f s, Time per operation %.3f us (toggle Freq %.3f MHz) \n", ToggleValue, elapsedTime, fTimePerOperation, fFreq); - CheckSameFloat(msg, fFreq, fExpectMHz, fExpectMHz*0.2f); + CheckSameFloat(msg, fTimePerOperation, fExpectTime, fExpectTime*0.2f); } @@ -53,14 +55,14 @@ int main (void) { case PI_MODEL_AP: case PI_MODEL_CM: ToggleValue /= 7; - fExpectMHzdigitalWrite = 3.8; //MHz; - fExpectMHzpinMode = 1.5; + fExpectTimedigitalWrite = 1/(3.8*2); //MHz; + fExpectTimepinMode = 1/(1.5*2); break; case PI_MODEL_ZERO: case PI_MODEL_ZERO_W: //ARM=1000MHz: 4.8/2.0 ToggleValue /= 5; - fExpectMHzdigitalWrite = 4.8; //MHz; - fExpectMHzpinMode = 2.0; + fExpectTimedigitalWrite = 1/(4.8*2); //MHz; + fExpectTimepinMode = 1/(2.0*2); break; case PI_MODEL_2: ToggleValue /= 4; @@ -78,16 +80,18 @@ int main (void) { case PI_MODEL_CM4: case PI_MODEL_CM4S: ToggleValue = ToggleValue; - fExpectMHzdigitalWrite = 24.5; //MHz; - fExpectMHzpinMode = 4.1; + fExpectTimedigitalWrite = 1/(2*24.5); //MHz; + fExpectTimepinMode = 1/(2*4.1); break; case PI_MODEL_5: ToggleValue = ToggleValue*0.8; - fExpectMHzdigitalWrite = 20.0; //MHz; - fExpectMHzpinMode = 2.5; + fExpectTimedigitalWrite = 1/(2*20.0); //MHz; + fExpectTimepinMode = 1/(2*2.5); break; } + fExpectTimedigitalRead = fExpectTimedigitalWrite*2; + printf("WiringPi GPIO speed test program (using GPIO %d) and toggle %d times\n", GPIO, ToggleValue); @@ -95,40 +99,42 @@ int main (void) { pinMode(GPIO, OUTPUT); - printf("write % 3d million times pin value ...\n", ToggleValue/1000000); + printf("% 3d million times digitalWrite ...\n", ToggleValue/1000000); gettimeofday(&t1, NULL); for (int loop=1; loop Read delay factor", fTimePerOperation/(fExpectTimedigitalWrite+fExpectTimedigitalRead), fWriteReadDelayFactor, 0.2); digitalWrite(GPIO, LOW); pinMode(GPIO, INPUT); From 527b6af8b11c996b98749404922a652eff5e6126 Mon Sep 17 00:00:00 2001 From: mstroh76 Date: Fri, 10 Jan 2025 19:26:05 +0100 Subject: [PATCH 05/13] #305 adjust for Pi5 test --- wiringPi/test/wiringpi_test7_bench.c | 17 ++++++++++++++--- 1 file changed, 14 insertions(+), 3 deletions(-) diff --git a/wiringPi/test/wiringpi_test7_bench.c b/wiringPi/test/wiringpi_test7_bench.c index d745287..2e608f4 100644 --- a/wiringPi/test/wiringpi_test7_bench.c +++ b/wiringPi/test/wiringpi_test7_bench.c @@ -15,6 +15,7 @@ float fExpectTimedigitalWrite = 1/10; float fExpectTimedigitalRead = 1/5; float fExpectTimepinMode = 1/4; float fWriteReadDelayFactor = 1.77; +float fWriteReadFactor = 2.0; int GPIO = 19; int GPIOIN = 26; int RaspberryPiModel = -1; @@ -44,7 +45,7 @@ int main (void) { piBoardId(&RaspberryPiModel, &rev, &mem, &maker, &overVolted); CheckNotSame("Model: ", RaspberryPiModel, -1); if (!piBoard40Pin()) { - GPIO = 23; + GPIO = 23; GPIOIN = 24; } @@ -56,12 +57,14 @@ int main (void) { case PI_MODEL_CM: ToggleValue /= 7; fExpectTimedigitalWrite = 1/(3.8*2); //MHz; + fExpectTimedigitalRead = fExpectTimedigitalWrite*fWriteReadFactor; fExpectTimepinMode = 1/(1.5*2); break; case PI_MODEL_ZERO: case PI_MODEL_ZERO_W: //ARM=1000MHz: 4.8/2.0 ToggleValue /= 5; fExpectTimedigitalWrite = 1/(4.8*2); //MHz; + fExpectTimedigitalRead = fExpectTimedigitalWrite*fWriteReadFactor; fExpectTimepinMode = 1/(2.0*2); break; case PI_MODEL_2: @@ -81,16 +84,19 @@ int main (void) { case PI_MODEL_CM4S: ToggleValue = ToggleValue; fExpectTimedigitalWrite = 1/(2*24.5); //MHz; + fExpectTimedigitalRead = fExpectTimedigitalWrite*fWriteReadFactor; fExpectTimepinMode = 1/(2*4.1); break; case PI_MODEL_5: ToggleValue = ToggleValue*0.8; fExpectTimedigitalWrite = 1/(2*20.0); //MHz; + fWriteReadFactor = 13; + fExpectTimedigitalRead = fExpectTimedigitalWrite*fWriteReadFactor; fExpectTimepinMode = 1/(2*2.5); + fWriteReadDelayFactor = 3.2; break; } - fExpectTimedigitalRead = fExpectTimedigitalWrite*2; @@ -111,7 +117,7 @@ int main (void) { digitalWrite(GPIO, LOW); pinMode(GPIOIN, INPUT); - ToggleValue /=2; + ToggleValue /=(fExpectTimedigitalRead/fExpectTimedigitalWrite); printf("\n"); printf("% 3d million times digitalRead ...\n", ToggleValue/1000000); gettimeofday(&t1, NULL); @@ -161,6 +167,11 @@ int main (void) { double elapsedTime = (t2.tv_sec-t1.tv_sec)+(t2.tv_usec-t1.tv_usec)/1000000.0; double fTimePerOperation = elapsedTime*1000000.0/ToggleValue/2; CheckSameFloat("Write <=> Read delay factor", fTimePerOperation/(fExpectTimedigitalWrite+fExpectTimedigitalRead), fWriteReadDelayFactor, 0.2); + if (RaspberryPiModel==PI_MODEL_5) { + printf("Rasperry Pi 5:\n"); + printf(" * digitalRead has very slow speed, much higher then digitalWrite, factor %f.1 (typical ~2.0)\n", fWriteReadFactor); + printf(" * Toggle read/write operation has very slow speed, factor %f.1 (typical ~1.77) to single operation time\n", fWriteReadDelayFactor); + } digitalWrite(GPIO, LOW); pinMode(GPIO, INPUT); From add6266d1b571c22408c70cf96e1ed31720dfe8c Mon Sep 17 00:00:00 2001 From: mstroh76 Date: Fri, 10 Jan 2025 19:35:08 +0100 Subject: [PATCH 06/13] #305 adjust for Pi5 test --- wiringPi/test/wiringpi_test7_bench.c | 18 +++++++++++++----- 1 file changed, 13 insertions(+), 5 deletions(-) diff --git a/wiringPi/test/wiringpi_test7_bench.c b/wiringPi/test/wiringpi_test7_bench.c index 2e608f4..2ba2b8b 100644 --- a/wiringPi/test/wiringpi_test7_bench.c +++ b/wiringPi/test/wiringpi_test7_bench.c @@ -128,7 +128,11 @@ int main (void) { gettimeofday(&t2, NULL); ReportElapedTime("digitalRead", 2, fExpectTimedigitalRead, t1, t2); - ToggleValue /= 4; + if (RaspberryPiModel!=PI_MODEL_5) { + ToggleValue /= 4; + } else { + ToggleValue *= 1.5; + } printf("\n"); printf("% 3d million times pinMode...\n", ToggleValue/1000000); gettimeofday(&t1, NULL); @@ -151,7 +155,11 @@ int main (void) { gettimeofday(&t2, NULL); ReportElapedTime("pinMode and digitalWrite", 2, fExpectTimepinMode+fExpectTimedigitalWrite, t1, t2); - ToggleValue *= 1.5; + if (RaspberryPiModel!=PI_MODEL_5) { + ToggleValue *= 1.5; + } else { + ToggleValue /= 5; + } printf("\n"); pinMode(GPIO, OUTPUT); printf("Toggle % 3d million times digitalRead and digitalWrite ..\n", ToggleValue/1000000); @@ -168,9 +176,9 @@ int main (void) { double fTimePerOperation = elapsedTime*1000000.0/ToggleValue/2; CheckSameFloat("Write <=> Read delay factor", fTimePerOperation/(fExpectTimedigitalWrite+fExpectTimedigitalRead), fWriteReadDelayFactor, 0.2); if (RaspberryPiModel==PI_MODEL_5) { - printf("Rasperry Pi 5:\n"); - printf(" * digitalRead has very slow speed, much higher then digitalWrite, factor %f.1 (typical ~2.0)\n", fWriteReadFactor); - printf(" * Toggle read/write operation has very slow speed, factor %f.1 (typical ~1.77) to single operation time\n", fWriteReadDelayFactor); + printf("\nRasperry Pi 5:\n"); + printf(" * digitalRead has very slow speed, much slower then digitalWrite, factor %.1f (typical ~2.0)\n", fWriteReadFactor); + printf(" * Toggle read/write operation has slow speed, factor %.2f (typical ~1.77) to single operation time\n", fWriteReadDelayFactor); } digitalWrite(GPIO, LOW); From 6aa7807e28312e241fd696d3610f4fac6e772fd7 Mon Sep 17 00:00:00 2001 From: mstroh76 Date: Fri, 10 Jan 2025 19:53:55 +0100 Subject: [PATCH 07/13] #305 adjust for Pi1 test --- wiringPi/test/wiringpi_test7_bench.c | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/wiringPi/test/wiringpi_test7_bench.c b/wiringPi/test/wiringpi_test7_bench.c index 2ba2b8b..56d6439 100644 --- a/wiringPi/test/wiringpi_test7_bench.c +++ b/wiringPi/test/wiringpi_test7_bench.c @@ -14,7 +14,7 @@ int ToggleValue = 240000000; float fExpectTimedigitalWrite = 1/10; float fExpectTimedigitalRead = 1/5; float fExpectTimepinMode = 1/4; -float fWriteReadDelayFactor = 1.77; +float fWriteReadDelayFactor = 1.0; float fWriteReadFactor = 2.0; int GPIO = 19; int GPIOIN = 26; @@ -57,6 +57,7 @@ int main (void) { case PI_MODEL_CM: ToggleValue /= 7; fExpectTimedigitalWrite = 1/(3.8*2); //MHz; + fWriteReadFactor = 1.3; fExpectTimedigitalRead = fExpectTimedigitalWrite*fWriteReadFactor; fExpectTimepinMode = 1/(1.5*2); break; @@ -86,6 +87,7 @@ int main (void) { fExpectTimedigitalWrite = 1/(2*24.5); //MHz; fExpectTimedigitalRead = fExpectTimedigitalWrite*fWriteReadFactor; fExpectTimepinMode = 1/(2*4.1); + fWriteReadDelayFactor = 1.77; break; case PI_MODEL_5: ToggleValue = ToggleValue*0.8; @@ -177,8 +179,8 @@ int main (void) { CheckSameFloat("Write <=> Read delay factor", fTimePerOperation/(fExpectTimedigitalWrite+fExpectTimedigitalRead), fWriteReadDelayFactor, 0.2); if (RaspberryPiModel==PI_MODEL_5) { printf("\nRasperry Pi 5:\n"); - printf(" * digitalRead has very slow speed, much slower then digitalWrite, factor %.1f (typical ~2.0)\n", fWriteReadFactor); - printf(" * Toggle read/write operation has slow speed, factor %.2f (typical ~1.77) to single operation time\n", fWriteReadDelayFactor); + printf(" * digitalRead has very slow speed, much slower then digitalWrite, factor %.1f (typical Pi4 ~2.0)\n", fWriteReadFactor); + printf(" * Toggle read/write operation has slow speed, factor %.2f (typical Pi4 ~1.77) to single operation time\n", fWriteReadDelayFactor); } digitalWrite(GPIO, LOW); From f3231d93071fedea257b2ad92234d6fb6074381d Mon Sep 17 00:00:00 2001 From: mstroh76 Date: Sat, 11 Jan 2025 13:09:22 +0100 Subject: [PATCH 08/13] define us for expect value --- wiringPi/test/wiringpi_test7_bench.c | 150 +++++++++++++-------------- 1 file changed, 73 insertions(+), 77 deletions(-) diff --git a/wiringPi/test/wiringpi_test7_bench.c b/wiringPi/test/wiringpi_test7_bench.c index 56d6439..f468a45 100644 --- a/wiringPi/test/wiringpi_test7_bench.c +++ b/wiringPi/test/wiringpi_test7_bench.c @@ -11,17 +11,18 @@ int ToggleValue = 240000000; -float fExpectTimedigitalWrite = 1/10; -float fExpectTimedigitalRead = 1/5; -float fExpectTimepinMode = 1/4; -float fWriteReadDelayFactor = 1.0; -float fWriteReadFactor = 2.0; +float fExpectTimedigitalWrite = 0.1; +float fExpectTimedigitalRead = 0.1; +float fExpectTimepinMode = 0.1; +float fWriteReadDelayFactor = 1.0; +float fWriteReadFactor = 1.0; +float fPi4ExpectTimedigitalWrite = 0.020; int GPIO = 19; int GPIOIN = 26; int RaspberryPiModel = -1; -void ReportElapedTime(const char* msg, int multiop, const float fExpectTime, struct timeval t1, struct timeval t2) { +double ReportElapedTime(const char* msg, int multiop, const float fExpectTime, struct timeval t1, struct timeval t2) { double elapsedTime, fTimePerOperation, fFreq; elapsedTime = (t2.tv_sec-t1.tv_sec)+(t2.tv_usec-t1.tv_usec)/1000000.0; @@ -29,7 +30,9 @@ void ReportElapedTime(const char* msg, int multiop, const float fExpectTime, str fFreq = 1.0f/(fTimePerOperation*2); //ToggleValue/elapsedTime/1000000.0; printf(" % 9d took %.3f s, Time per operation %.3f us (toggle Freq %.3f MHz) \n", ToggleValue, elapsedTime, fTimePerOperation, fFreq); - CheckSameFloat(msg, fTimePerOperation, fExpectTime, fExpectTime*0.2f); + CheckSameFloat(msg, fTimePerOperation, fExpectTime, fExpectTime*0.2f); + + return fTimePerOperation; } @@ -49,94 +52,87 @@ int main (void) { GPIOIN = 24; } - switch(RaspberryPiModel) { - case PI_MODEL_A: - case PI_MODEL_B: //ARM=800MHz: 3.8/1.5 - case PI_MODEL_BP: - case PI_MODEL_AP: - case PI_MODEL_CM: - ToggleValue /= 7; - fExpectTimedigitalWrite = 1/(3.8*2); //MHz; - fWriteReadFactor = 1.3; - fExpectTimedigitalRead = fExpectTimedigitalWrite*fWriteReadFactor; - fExpectTimepinMode = 1/(1.5*2); - break; - case PI_MODEL_ZERO: - case PI_MODEL_ZERO_W: //ARM=1000MHz: 4.8/2.0 - ToggleValue /= 5; - fExpectTimedigitalWrite = 1/(4.8*2); //MHz; - fExpectTimedigitalRead = fExpectTimedigitalWrite*fWriteReadFactor; - fExpectTimepinMode = 1/(2.0*2); - break; - case PI_MODEL_2: - ToggleValue /= 4; - break; - case PI_MODEL_3B: - case PI_MODEL_CM3: - case PI_MODEL_3BP: - case PI_MODEL_3AP: - case PI_MODEL_CM3P: - case PI_MODEL_ZERO_2W: - ToggleValue /= 2; - break; - case PI_MODEL_4B: - case PI_MODEL_400: - case PI_MODEL_CM4: - case PI_MODEL_CM4S: - ToggleValue = ToggleValue; - fExpectTimedigitalWrite = 1/(2*24.5); //MHz; - fExpectTimedigitalRead = fExpectTimedigitalWrite*fWriteReadFactor; - fExpectTimepinMode = 1/(2*4.1); - fWriteReadDelayFactor = 1.77; - break; - case PI_MODEL_5: - ToggleValue = ToggleValue*0.8; - fExpectTimedigitalWrite = 1/(2*20.0); //MHz; - fWriteReadFactor = 13; - fExpectTimedigitalRead = fExpectTimedigitalWrite*fWriteReadFactor; - fExpectTimepinMode = 1/(2*2.5); - fWriteReadDelayFactor = 3.2; - break; - } - - - - - printf("WiringPi GPIO speed test program (using GPIO %d) and toggle %d times\n", GPIO, ToggleValue); - printf(" testing digital Wirte and pinMode\n"); + switch(RaspberryPiModel) { + case PI_MODEL_A: + case PI_MODEL_B: //ARM=800MHz + case PI_MODEL_BP: + case PI_MODEL_AP: + case PI_MODEL_CM: + //ToggleValue /= 7; + fExpectTimedigitalWrite = 0.132; //us; + fExpectTimedigitalRead = 0.171; //us + fExpectTimepinMode = 0.334; //us + break; + case PI_MODEL_ZERO: + case PI_MODEL_ZERO_W: //ARM=1000MHz + //ToggleValue /= 5; + fExpectTimedigitalWrite = 0.104; //us; + fExpectTimedigitalRead = 0.135; //us + fExpectTimepinMode = 0.250; //us + break; + case PI_MODEL_2: + ToggleValue /= 4; + break; + case PI_MODEL_3B: + case PI_MODEL_CM3: + case PI_MODEL_3BP: + case PI_MODEL_3AP: + case PI_MODEL_CM3P: + case PI_MODEL_ZERO_2W: + ToggleValue /= 2; + break; + case PI_MODEL_4B: //ARM=1500MHz + case PI_MODEL_400: + case PI_MODEL_CM4: + case PI_MODEL_CM4S: + //ToggleValue = ToggleValue; + fExpectTimedigitalWrite = 0.020; //us + fExpectTimedigitalRead = 0.038; //us + fExpectTimepinMode = 0.121; //us + fWriteReadDelayFactor = 1.86; + break; + case PI_MODEL_5: + //ToggleValue = ToggleValue*0.8; + fExpectTimedigitalWrite = 0.025; //us + fExpectTimedigitalRead = 0.323; //us + fExpectTimepinMode = 0.200; //us + fWriteReadDelayFactor = 3.2; + break; + } + fWriteReadFactor = fExpectTimedigitalRead/fExpectTimedigitalWrite; + ToggleValue /= (fExpectTimedigitalWrite/fPi4ExpectTimedigitalWrite); + printf("WiringPi GPIO operation time test program (using GPIO %d/%d)\n", GPIO, GPIOIN); pinMode(GPIO, OUTPUT); - printf("% 3d million times digitalWrite ...\n", ToggleValue/1000000); + printf("\n% 3d million times digitalWrite ...\n", ToggleValue/1000000); gettimeofday(&t1, NULL); for (int loop=1; loop Read delay factor", fTimePerOperation/(fExpectTimedigitalWrite+fExpectTimedigitalRead), fWriteReadDelayFactor, 0.2); + double fTimePerOperation = ReportElapedTime("digitalRead and digitalWrite", 2, (fExpectTimedigitalWrite+fExpectTimedigitalRead)*fWriteReadDelayFactor, t1, t2); + + printf("\n"); + CheckSameFloat("digitalWrite vs. digitalRead factor", OpTimeRead/OpTimeWrite, fWriteReadFactor, 0.3); + CheckSameFloat("digitalWrite and digitalRead alternating factor", fTimePerOperation/(fExpectTimedigitalWrite+fExpectTimedigitalRead), fWriteReadDelayFactor, 0.2); if (RaspberryPiModel==PI_MODEL_5) { printf("\nRasperry Pi 5:\n"); printf(" * digitalRead has very slow speed, much slower then digitalWrite, factor %.1f (typical Pi4 ~2.0)\n", fWriteReadFactor); - printf(" * Toggle read/write operation has slow speed, factor %.2f (typical Pi4 ~1.77) to single operation time\n", fWriteReadDelayFactor); + printf(" * Alternating read/write operation has slow speed, factor %.2f (typical Pi4 ~1.77) to single operation time\n", fWriteReadDelayFactor); } digitalWrite(GPIO, LOW); From 8d4d7a1501118ebcf9ab5ed523792510a7fca48c Mon Sep 17 00:00:00 2001 From: mstroh76 Date: Sat, 11 Jan 2025 13:24:25 +0100 Subject: [PATCH 09/13] #305 --- wiringPi/test/wiringpi_test7_bench.c | 9 ++------- 1 file changed, 2 insertions(+), 7 deletions(-) diff --git a/wiringPi/test/wiringpi_test7_bench.c b/wiringPi/test/wiringpi_test7_bench.c index f468a45..5ede678 100644 --- a/wiringPi/test/wiringpi_test7_bench.c +++ b/wiringPi/test/wiringpi_test7_bench.c @@ -58,14 +58,12 @@ int main (void) { case PI_MODEL_BP: case PI_MODEL_AP: case PI_MODEL_CM: - //ToggleValue /= 7; fExpectTimedigitalWrite = 0.132; //us; fExpectTimedigitalRead = 0.171; //us fExpectTimepinMode = 0.334; //us break; case PI_MODEL_ZERO: case PI_MODEL_ZERO_W: //ARM=1000MHz - //ToggleValue /= 5; fExpectTimedigitalWrite = 0.104; //us; fExpectTimedigitalRead = 0.135; //us fExpectTimepinMode = 0.250; //us @@ -85,14 +83,12 @@ int main (void) { case PI_MODEL_400: case PI_MODEL_CM4: case PI_MODEL_CM4S: - //ToggleValue = ToggleValue; fExpectTimedigitalWrite = 0.020; //us fExpectTimedigitalRead = 0.038; //us fExpectTimepinMode = 0.121; //us fWriteReadDelayFactor = 1.86; break; case PI_MODEL_5: - //ToggleValue = ToggleValue*0.8; fExpectTimedigitalWrite = 0.025; //us fExpectTimedigitalRead = 0.323; //us fExpectTimepinMode = 0.200; //us @@ -157,7 +153,6 @@ int main (void) { } else { ToggleValue /= 5; } - printf("\n"); pinMode(GPIO, OUTPUT); printf("\nToggle % 3d million times digitalRead and digitalWrite ..\n", ToggleValue/1000000); gettimeofday(&t1, NULL); @@ -175,8 +170,8 @@ int main (void) { CheckSameFloat("digitalWrite and digitalRead alternating factor", fTimePerOperation/(fExpectTimedigitalWrite+fExpectTimedigitalRead), fWriteReadDelayFactor, 0.2); if (RaspberryPiModel==PI_MODEL_5) { printf("\nRasperry Pi 5:\n"); - printf(" * digitalRead has very slow speed, much slower then digitalWrite, factor %.1f (typical Pi4 ~2.0)\n", fWriteReadFactor); - printf(" * Alternating read/write operation has slow speed, factor %.2f (typical Pi4 ~1.77) to single operation time\n", fWriteReadDelayFactor); + printf(" * digitalRead has very slow speed, much slower then digitalWrite, factor %.1f (typical Pi4 ~1.9)\n", fWriteReadFactor); + printf(" * Alternating read/write operation has slow speed, factor %.2f (typical Pi4 ~1.86) to single operation time\n", fWriteReadDelayFactor); } digitalWrite(GPIO, LOW); From b9a85a670eb7c49c7676302f117fb6768720c021 Mon Sep 17 00:00:00 2001 From: mstroh76 Date: Sat, 18 Jan 2025 16:33:06 +0400 Subject: [PATCH 10/13] #302 Pi500/CM5/CM5L revision code --- wiringPi/wiringPi.h | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/wiringPi/wiringPi.h b/wiringPi/wiringPi.h index 79a895a..1298b5f 100644 --- a/wiringPi/wiringPi.h +++ b/wiringPi/wiringPi.h @@ -1,7 +1,7 @@ /* * wiringPi.h: * Arduino like Wiring library for the Raspberry Pi. - * Copyright (c) 2012-2017 Gordon Henderson + * Copyright (c) 2012-2025 Gordon Henderson *********************************************************************** * This file is part of wiringPi: * https://github.com/WiringPi/WiringPi/ @@ -93,6 +93,7 @@ // Pi model types and version numbers // Intended for the GPIO program Use at your own risk. // https://www.raspberrypi.com/documentation/computers/raspberry-pi.html#new-style-revision-codes +// https://github.com/raspberrypi/documentation/blob/develop/documentation/asciidoc/computers/raspberry-pi/revision-codes.adoc #define PI_MODEL_A 0 #define PI_MODEL_B 1 @@ -115,6 +116,9 @@ #define PI_MODEL_CM4 20 #define PI_MODEL_CM4S 21 #define PI_MODEL_5 23 +#define PI_MODEL_CM5 24 +#define PI_MODEL_500 25 +#define PI_MODEL_CM5L 26 #define PI_VERSION_1 0 #define PI_VERSION_1_1 1 From 7b03cd9f42bad6ee2fffa81299690a59e056b7b5 Mon Sep 17 00:00:00 2001 From: mstroh76 Date: Sat, 18 Jan 2025 16:10:54 +0100 Subject: [PATCH 11/13] Pi500/CM5/CM5L support --- VERSION | 2 +- gpio/readall.c | 67 +++++++++++++---------- version.h | 4 +- wiringPi/test/wiringpi_test5_default.c | 8 +-- wiringPi/test/wiringpi_test8_pwm.c | 4 +- wiringPi/test/wiringpi_test9_pwm.c | 3 + wiringPi/wiringPi.c | 76 ++++++++++++++++---------- wiringPi/wiringPi.h | 63 +++++++++++---------- 8 files changed, 132 insertions(+), 95 deletions(-) diff --git a/VERSION b/VERSION index e4fba21..24ee5b1 100644 --- a/VERSION +++ b/VERSION @@ -1 +1 @@ -3.12 +3.13 diff --git a/gpio/readall.c b/gpio/readall.c index 8d2ffba..cf0caf4 100644 --- a/gpio/readall.c +++ b/gpio/readall.c @@ -303,35 +303,44 @@ void abReadall (int model, int rev) * Read all the pins on the model A+ or the B+ or actually, all 40-pin Pi's ********************************************************************************* */ +const char piModelNamesShort[PI_MODELS_MAX][11] = +{ + "---Pi A---", // 0 + "---Pi B---", // 1 + "---Pi A+--", // 2 + "---Pi B+--", // 3 + "---Pi 2---", // 4 + "---Alpha--", // 5 + "----CM----", // 6 + "", // 07 + "---Pi 3B--", // 8 + "-Pi Zero--", // 9 + "---CM3----", // 10 + "", // 11 + "-Pi ZeroW-", // 12 + "---Pi 3B+-", // 13 + "---Pi 3A+-", // 14 + "", // 15 + "---CM3+---", // 16 + "---Pi 4B--", // 17 + "Pi Zero 2W", // 18 + "--Pi 400--", // 19 + "---CM4----", // 20 + "---CM4S---", // 21 + "", // 22 + "---Pi 5---", // 23 + "---CM5----", // 24 + "--Pi 500--", // 25 + "---CM5L---", // 24 +} ; static void plus2header (int model) { - /**/ if (model == PI_MODEL_AP) - printf (" +-----+-----+---------+------+---+---Pi A+--+---+------+---------+-----+-----+\n") ; - else if (model == PI_MODEL_BP) - printf (" +-----+-----+---------+------+---+---Pi B+--+---+------+---------+-----+-----+\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_ZERO_2W) - printf (" +-----+-----+---------+------+---+Pi Zero 2W+---+------+---------+-----+-----+\n") ; - else if (model == PI_MODEL_2) - printf (" +-----+-----+---------+------+---+---Pi 2---+---+------+---------+-----+-----+\n") ; - else if (model == PI_MODEL_3B) - printf (" +-----+-----+---------+------+---+---Pi 3B--+---+------+---------+-----+-----+\n") ; - else if (model == PI_MODEL_3BP) - printf (" +-----+-----+---------+------+---+---Pi 3B+-+---+------+---------+-----+-----+\n") ; - else if (model == PI_MODEL_3AP) - printf (" +-----+-----+---------+------+---+---Pi 3A+-+---+------+---------+-----+-----+\n") ; - else if (model == PI_MODEL_4B) - printf (" +-----+-----+---------+------+---+---Pi 4B--+---+------+---------+-----+-----+\n") ; - else if (model == PI_MODEL_400) - printf (" +-----+-----+---------+------+---+---Pi 400-+---+------+---------+-----+-----+\n") ; - else if (model == PI_MODEL_5) - printf (" +-----+-----+---------+------+---+---Pi 5---+---+------+---------+-----+-----+\n") ; - else - printf (" +-----+-----+---------+------+---+---Pi ?---+---+------+---------+-----+-----+\n") ; + if (model GetMaxPin()) return ; uint32_t wrVal; @@ -1271,7 +1291,7 @@ void setPadDrive (int group, int value) if ((wiringPiMode == WPI_MODE_PINS) || (wiringPiMode == WPI_MODE_PHYS) || (wiringPiMode == WPI_MODE_GPIO)) { value = value & 7; // 0-7 supported - if (PI_MODEL_5 == RaspberryPiModel) { + if (piRP1Model()) { if (-1==group) { printf ("Pad register:\n"); for (int pin=0, maxpin=GetMaxPin(); pin<=maxpin; ++pin) { @@ -1342,7 +1362,7 @@ int getAlt (int pin) else if (wiringPiMode != WPI_MODE_GPIO) return 0 ; - if (PI_MODEL_5 == RaspberryPiModel) { + if (piRP1Model()) { alt = (gpio[2*pin+1] & RP1_FSEL_NONE_HW); //0-4 function /* @@ -1402,7 +1422,7 @@ void pwmSetMode (int mode) { if ((wiringPiMode == WPI_MODE_PINS) || (wiringPiMode == WPI_MODE_PHYS) || (wiringPiMode == WPI_MODE_GPIO)) { - if (PI_MODEL_5 == RaspberryPiModel) { + if (piRP1Model()) { if(mode != PWM_MODE_MS) { fprintf(stderr, "pwmSetMode: Raspberry Pi 5 missing feature PWM BAL mode\n"); } @@ -1441,7 +1461,7 @@ void pwmSetRange (unsigned int range) return; } int readback = 0x00; - if (PI_MODEL_5 == RaspberryPiModel) { + if (piRP1Model()) { pwm[RP1_PWM0_CHAN0_RANGE] = range; pwm[RP1_PWM0_CHAN1_RANGE] = range; pwm[RP1_PWM0_CHAN2_RANGE] = range; @@ -1478,7 +1498,7 @@ void pwmSetClock (int divisor) if (divisor > PWMCLK_DIVI_MAX) { divisor = PWMCLK_DIVI_MAX; // even on Pi5 4095 is OK } - if (PI_MODEL_5 == RaspberryPiModel) { + if (piRP1Model()) { if (divisor < 1) { if (wiringPiDebug) { printf("Disable PWM0 clock"); } clk[CLK_PWM0_CTRL] = RP1_CLK_PWM0_CTRL_DISABLE_MAGIC; // 0 = disable on Pi5 @@ -1713,7 +1733,7 @@ int OpenAndCheckGpioChip(int GPIONo, const char* label, const unsigned int lines int wiringPiGpioDeviceGetFd() { if (chipFd<0) { piBoard(); - if (PI_MODEL_5 == RaspberryPiModel) { + if (piRP1Model()) { chipFd = OpenAndCheckGpioChip(0, "rp1", 54); // /dev/gpiochip0 @ Pi5 since Kernel 6.6.47 if (chipFd<0) { chipFd = OpenAndCheckGpioChip(4, "rp1", 54); // /dev/gpiochip4 @ Pi5 with older kernel @@ -1793,7 +1813,7 @@ void pinModeAlt (int pin, int mode) else if (wiringPiMode != WPI_MODE_GPIO) return ; - if (PI_MODEL_5 == RaspberryPiModel) { + if (piRP1Model()) { //confusion! diffrent to to BCM! this is taking directly the value for the register int modeRP1; switch(mode) { @@ -1932,7 +1952,7 @@ void pinMode (int pin, int mode) shift = gpioToShift [pin] ; if (INPUT==mode || PM_OFF==mode) { - if (PI_MODEL_5 == RaspberryPiModel) { + if (piRP1Model()) { if (INPUT==mode) { pads[1+pin] = (pin<=8) ? RP1_PAD_DEFAULT_0TO8 : RP1_PAD_DEFAULT_FROM9; gpio[2*pin+1] = RP1_FSEL_GPIO | RP1_DEBOUNCE_DEFAULT; // GPIO @@ -1947,14 +1967,14 @@ void pinMode (int pin, int mode) if (PM_OFF==mode && !usingGpioMem && pwm && gpioToPwmALT[pin]>0) { //PWM pin -> reset pwmWrite(origPin, 0); int channel = gpioToPwmPort[pin]; - if (channel>=0 && channel<=3 && PI_MODEL_5 == RaspberryPiModel) { + if (channel>=0 && channel<=3 && piRP1Model()) { unsigned int ctrl = pwm[RP1_PWM0_GLOBAL_CTRL]; pwm[RP1_PWM0_GLOBAL_CTRL] = (ctrl & ~(1<0x%08X)\n", channel, ctrl, pwm[RP1_PWM0_GLOBAL_CTRL]); } } } else if (mode == OUTPUT) { - if (PI_MODEL_5 == RaspberryPiModel) { + if (piRP1Model()) { pads[1+pin] = (pin<=8) ? RP1_PAD_DEFAULT_0TO8 : RP1_PAD_DEFAULT_FROM9; gpio[2*pin+1] = RP1_FSEL_GPIO | RP1_DEBOUNCE_DEFAULT; // GPIO rio[RP1_RIO_OE + RP1_SET_OFFSET] = 1<=0 && channel<=3) { // enable channel pwm m:s mode pwm[RP1_PWM0_CHAN_START+RP1_PWM0_CHAN_OFFSET*channel+RP1_PWM0_CHAN_CTRL] = (RP1_PWM_TRAIL_EDGE_MS | RP1_PWM_FIFO_POP_MASK); @@ -2086,7 +2106,7 @@ void pullUpDnControl (int pin, int pud) break; } - if (PI_MODEL_5 == RaspberryPiModel) { + if (piRP1Model()) { unsigned int pullbits = pads[1+pin] & RP1_INV_PUD_MASK; // remove bits switch (pud){ case PUD_OFF: pads[1+pin] = pullbits; break; @@ -2188,7 +2208,7 @@ int digitalRead (int pin) break; } - if (PI_MODEL_5 == RaspberryPiModel) { + if (ISRP1MODEL) { switch(gpio[2*pin] & RP1_STATUS_LEVEL_MASK) { default: // 11 or 00 not allowed, give LOW! case RP1_STATUS_LEVEL_LOW: return LOW ; @@ -2291,7 +2311,7 @@ void digitalWrite (int pin, int value) break; } - if (PI_MODEL_5 == RaspberryPiModel) { + if (ISRP1MODEL) { if (value == LOW) { //printf("Set pin %d >>0x%08x<< to low\n", pin, 1<=0 && channel<=3) { unsigned int addr = RP1_PWM0_CHAN_START+RP1_PWM0_CHAN_OFFSET*channel+RP1_PWM0_CHAN_DUTY; pwm[addr] = value; @@ -2991,7 +3011,7 @@ int wiringPiUserLevelAccess(void) const char* gpiomemModule = gpiomem_BCM; piBoard(); - if (PI_MODEL_5 == RaspberryPiModel) { + if (piRP1Model()) { gpiomemModule = gpiomem_RP1; } @@ -3058,7 +3078,7 @@ int wiringPiGlobalMemoryAccess(void) unsigned int BaseAddr, PWMAddr; piBoard(); - if (PI_MODEL_5 == RaspberryPiModel) { + if (piRP1Model()) { GetRP1Memory(pciemem_RP1, sizeof(pciemem_RP1)); gpiomemGlobal = pciemem_RP1; MMAP_size = pciemem_RP1_Size; @@ -3081,7 +3101,7 @@ int wiringPiGlobalMemoryAccess(void) fprintf(stderr,"wiringPiGlobalMemoryAccess: mmap (GPIO 0x%X,0x%X) failed: %s\n", BaseAddr, MMAP_size, strerror (errno)) ; } else { munmap(lgpio, MMAP_size); - if (PI_MODEL_5 == RaspberryPiModel) { + if (piRP1Model()) { returnvalue = 2; // GPIO & PWM accessible (same area, nothing to mmap) } else { //check PWM area @@ -3167,7 +3187,7 @@ int wiringPiSetup (void) const char* gpiomemGlobal = gpiomem_global; const char* gpiomemModule = gpiomem_BCM; - if (PI_MODEL_5 == model) { + if (piRP1Model()) { GetRP1Memory(); gpiomemGlobal = pciemem_RP1; gpiomemModule = gpiomem_RP1; @@ -3205,7 +3225,7 @@ int wiringPiSetup (void) printf ("wiringPi: access to %s succeded %d\n", usingGpioMem ? gpiomemModule : gpiomemGlobal, fd) ; } // GPIO: - if (PI_MODEL_5 != model) { + if (!piRP1Model()) { //Set the offsets into the memory interface. GPIO_PADS = piGpioBase + 0x00100000 ; diff --git a/wiringPi/wiringPi.h b/wiringPi/wiringPi.h index 1298b5f..f2a4599 100644 --- a/wiringPi/wiringPi.h +++ b/wiringPi/wiringPi.h @@ -95,37 +95,42 @@ // https://www.raspberrypi.com/documentation/computers/raspberry-pi.html#new-style-revision-codes // https://github.com/raspberrypi/documentation/blob/develop/documentation/asciidoc/computers/raspberry-pi/revision-codes.adoc -#define PI_MODEL_A 0 -#define PI_MODEL_B 1 -#define PI_MODEL_AP 2 -#define PI_MODEL_BP 3 -#define PI_MODEL_2 4 -#define PI_ALPHA 5 -#define PI_MODEL_CM 6 -#define PI_MODEL_07 7 -#define PI_MODEL_3B 8 -#define PI_MODEL_ZERO 9 -#define PI_MODEL_CM3 10 -#define PI_MODEL_ZERO_W 12 -#define PI_MODEL_3BP 13 -#define PI_MODEL_3AP 14 -#define PI_MODEL_CM3P 16 -#define PI_MODEL_4B 17 -#define PI_MODEL_ZERO_2W 18 -#define PI_MODEL_400 19 -#define PI_MODEL_CM4 20 -#define PI_MODEL_CM4S 21 -#define PI_MODEL_5 23 -#define PI_MODEL_CM5 24 -#define PI_MODEL_500 25 -#define PI_MODEL_CM5L 26 +#define PI_MODEL_A 0 +#define PI_MODEL_B 1 +#define PI_MODEL_AP 2 +#define PI_MODEL_BP 3 +#define PI_MODEL_2 4 +#define PI_ALPHA 5 +#define PI_MODEL_CM 6 -#define PI_VERSION_1 0 +#define PI_MODEL_3B 8 +#define PI_MODEL_ZERO 9 +#define PI_MODEL_CM3 10 + +#define PI_MODEL_ZERO_W 12 +#define PI_MODEL_3BP 13 +#define PI_MODEL_3AP 14 + +#define PI_MODEL_CM3P 16 +#define PI_MODEL_4B 17 +#define PI_MODEL_ZERO_2W 18 +#define PI_MODEL_400 19 +#define PI_MODEL_CM4 20 +#define PI_MODEL_CM4S 21 + +#define PI_MODEL_5 23 +#define PI_MODEL_CM5 24 +#define PI_MODEL_500 25 +#define PI_MODEL_CM5L 26 + +#define PI_MODELS_MAX 27 + +#define PI_VERSION_1 0 #define PI_VERSION_1_1 1 #define PI_VERSION_1_2 2 -#define PI_VERSION_2 3 +#define PI_VERSION_2 3 -#define PI_MAKER_SONY 0 +#define PI_MAKER_SONY 0 #define PI_MAKER_EGOMAN 1 #define PI_MAKER_EMBEST 2 #define PI_MAKER_UNKNOWN 3 @@ -133,13 +138,12 @@ #define GPIO_LAYOUT_PI1_REV1 1 //Pi 1 A/B Revision 1, 1.1, CM #define GPIO_LAYOUT_DEFAULT 2 -extern const char *piModelNames [24] ; +extern const char *piModelNames [PI_MODELS_MAX] ; extern const char *piProcessor [ 5] ; extern const char *piRevisionNames [16] ; extern const char *piMakerNames [16] ; extern const int piMemorySize [ 8] ; - // Intended for the GPIO program Use at your own risk. // Threads @@ -275,6 +279,7 @@ 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 piRP1Model (void) ; // Interface V3.14 extern int wpiPinToGpio (int wpiPin) ; extern int physPinToGpio (int physPin) ; extern void setPadDrive (int group, int value) ; From 6b500e49cfc38c20c0d6df863f2f9b82540c2987 Mon Sep 17 00:00:00 2001 From: mstroh76 Date: Thu, 30 Jan 2025 17:58:15 +0100 Subject: [PATCH 12/13] #305 support for CM5(L) and Pi500 --- wiringPi/test/wiringpi_test7_bench.c | 25 ++++++++++++++++--------- 1 file changed, 16 insertions(+), 9 deletions(-) diff --git a/wiringPi/test/wiringpi_test7_bench.c b/wiringPi/test/wiringpi_test7_bench.c index 5ede678..f3eb6e2 100644 --- a/wiringPi/test/wiringpi_test7_bench.c +++ b/wiringPi/test/wiringpi_test7_bench.c @@ -88,11 +88,18 @@ int main (void) { fExpectTimepinMode = 0.121; //us fWriteReadDelayFactor = 1.86; break; - case PI_MODEL_5: - fExpectTimedigitalWrite = 0.025; //us - fExpectTimedigitalRead = 0.323; //us - fExpectTimepinMode = 0.200; //us - fWriteReadDelayFactor = 3.2; + default: + if (piRP1Model()) { + // So far expect all Pi5 / RP1 hardware has same performance + printf("Raspberry Pi with RP1 chip found\n"); + fExpectTimedigitalWrite = 0.025; //us + fExpectTimedigitalRead = 0.323; //us + fExpectTimepinMode = 0.200; //us + fWriteReadDelayFactor = 3.2; + } else { + printf("Unknown Raspberry Pi found, exit\n"); + return(EXIT_FAILURE); + } break; } fWriteReadFactor = fExpectTimedigitalRead/fExpectTimedigitalWrite; @@ -123,7 +130,7 @@ int main (void) { gettimeofday(&t2, NULL); double OpTimeRead = ReportElapedTime("digitalRead", 2, fExpectTimedigitalRead, t1, t2); - if (RaspberryPiModel!=PI_MODEL_5) { + if (!piRP1Model()) { ToggleValue /= 4; } else { ToggleValue *= 1.5; @@ -148,7 +155,7 @@ int main (void) { gettimeofday(&t2, NULL); ReportElapedTime("pinMode and digitalWrite", 2, fExpectTimepinMode+fExpectTimedigitalWrite, t1, t2); - if (RaspberryPiModel!=PI_MODEL_5) { + if (!piRP1Model()) { ToggleValue *= 1.5; } else { ToggleValue /= 5; @@ -168,8 +175,8 @@ int main (void) { printf("\n"); CheckSameFloat("digitalWrite vs. digitalRead factor", OpTimeRead/OpTimeWrite, fWriteReadFactor, 0.3); CheckSameFloat("digitalWrite and digitalRead alternating factor", fTimePerOperation/(fExpectTimedigitalWrite+fExpectTimedigitalRead), fWriteReadDelayFactor, 0.2); - if (RaspberryPiModel==PI_MODEL_5) { - printf("\nRasperry Pi 5:\n"); + if (piRP1Model()) { + printf("\nRasperry Pi with RP1 chip:\n"); printf(" * digitalRead has very slow speed, much slower then digitalWrite, factor %.1f (typical Pi4 ~1.9)\n", fWriteReadFactor); printf(" * Alternating read/write operation has slow speed, factor %.2f (typical Pi4 ~1.86) to single operation time\n", fWriteReadDelayFactor); } From 3639bd3fdbf16f3d6f1da9778b4ceed1c6de6663 Mon Sep 17 00:00:00 2001 From: mstroh76 Date: Sun, 2 Feb 2025 19:05:53 +0100 Subject: [PATCH 13/13] #305 Release --- VERSION | 2 +- version.h | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/VERSION b/VERSION index 24ee5b1..6324d40 100644 --- a/VERSION +++ b/VERSION @@ -1 +1 @@ -3.13 +3.14 diff --git a/version.h b/version.h index 35a3048..c2da282 100644 --- a/version.h +++ b/version.h @@ -1,3 +1,3 @@ -#define VERSION "3.13" +#define VERSION "3.14" #define VERSION_MAJOR 3 -#define VERSION_MINOR 13 +#define VERSION_MINOR 14