@@ -219,7 +219,7 @@ volatile unsigned int *_wiringPiTimerIrqRaw ;
219
219
220
220
static volatile unsigned int piGpioBase = 0 ;
221
221
222
- const char * piModelNames [21 ] =
222
+ const char * piModelNames [24 ] =
223
223
{
224
224
"Model A" , // 0
225
225
"Model B" , // 1
@@ -242,6 +242,18 @@ const char *piModelNames [21] =
242
242
"Pi Zero2-W" , // 18
243
243
"Pi 400" , // 19
244
244
"CM4" , // 20
245
+ "CM4S" , // 21
246
+ "Unknown22" , // 22
247
+ "Pi 5" , // 23
248
+ } ;
249
+
250
+ const char * piProcessor [5 ] =
251
+ {
252
+ "BCM2835" ,
253
+ "BCM2836" ,
254
+ "BCM2837" ,
255
+ "BCM2711" ,
256
+ "BCM2712" ,
245
257
} ;
246
258
247
259
const char * piRevisionNames [16 ] =
@@ -269,9 +281,9 @@ const char *piMakerNames [16] =
269
281
"Sony" , // 0
270
282
"Egoman" , // 1
271
283
"Embest" , // 2
272
- "Unknown" , // 3
284
+ "Unknown" ,// 3
273
285
"Embest" , // 4
274
- "Unknown05" , // 5
286
+ "Stadium" , // 5
275
287
"Unknown06" , // 6
276
288
"Unknown07" , // 7
277
289
"Unknown08" , // 8
@@ -306,6 +318,8 @@ static int wiringPiMode = WPI_MODE_UNINITIALISED ;
306
318
static volatile int pinPass = -1 ;
307
319
static pthread_mutex_t pinMutex ;
308
320
321
+ static int RaspberryPiModel = -1 ;
322
+
309
323
// Debugging & Return codes
310
324
311
325
int wiringPiDebug = FALSE ;
@@ -450,6 +464,8 @@ static int physToGpioR2 [64] =
450
464
-1 , -1 ,
451
465
} ;
452
466
467
+
468
+
453
469
// gpioToGPFSEL:
454
470
// Map a BCM_GPIO pin to it's Function Selection
455
471
// control port. (GPFSEL 0-5)
@@ -1021,6 +1037,7 @@ void piBoardId (int *model, int *rev, int *mem, int *maker, int *warranty)
1021
1037
bMem = (revision & (0x07 << 20 )) >> 20 ;
1022
1038
bWarranty = (revision & (0x03 << 24 )) != 0 ;
1023
1039
1040
+ // Ref: https://www.raspberrypi.com/documentation/computers/raspberry-pi.html#raspberry-pi-revision-codes
1024
1041
* model = bType ;
1025
1042
* rev = bRev ;
1026
1043
* mem = bMem ;
@@ -1086,6 +1103,8 @@ void piBoardId (int *model, int *rev, int *mem, int *maker, int *warranty)
1086
1103
1087
1104
else { * model = 0 ; * rev = 0 ; * mem = 0 ; * maker = 0 ; }
1088
1105
}
1106
+
1107
+ RaspberryPiModel = model ;
1089
1108
}
1090
1109
1091
1110
@@ -2299,10 +2318,14 @@ int wiringPiSetup (void)
2299
2318
2300
2319
switch (model )
2301
2320
{
2302
- case PI_MODEL_A : case PI_MODEL_B :
2303
- case PI_MODEL_AP : case PI_MODEL_BP :
2304
- case PI_ALPHA : case PI_MODEL_CM :
2305
- case PI_MODEL_ZERO : case PI_MODEL_ZERO_W :
2321
+ case PI_MODEL_A :
2322
+ case PI_MODEL_B :
2323
+ case PI_MODEL_AP :
2324
+ case PI_MODEL_BP :
2325
+ case PI_ALPHA :
2326
+ case PI_MODEL_CM :
2327
+ case PI_MODEL_ZERO :
2328
+ case PI_MODEL_ZERO_W :
2306
2329
piGpioBase = GPIO_PERI_BASE_OLD ;
2307
2330
piGpioPupOffset = GPPUD ;
2308
2331
break ;
@@ -2338,8 +2361,14 @@ int wiringPiSetup (void)
2338
2361
" hardware then it most certianly won't work\n"
2339
2362
" Try running with sudo?\n" , strerror (errno )) ;
2340
2363
}
2364
+ }
2341
2365
2342
- // Set the offsets into the memory interface.
2366
+ if (PI_MODEL_5 == model ) {
2367
+ return wiringPiFailure (WPI_ALMOST , "wiringPiSetup: Raspberry Pi 5 not supported.\n"
2368
+ " Unable to continue. Keep an eye of new version at https://github.com/GrazerComputerClub/WiringPi\n" ) ;
2369
+ }
2370
+
2371
+ //Set the offsets into the memory interface.
2343
2372
2344
2373
GPIO_PADS = piGpioBase + 0x00100000 ;
2345
2374
GPIO_CLOCK_BASE = piGpioBase + 0x00101000 ;
@@ -2350,50 +2379,60 @@ int wiringPiSetup (void)
2350
2379
// Map the individual hardware components
2351
2380
2352
2381
// GPIO:
2382
+ if (PI_MODEL_5 != model ) {
2383
+ gpio = (uint32_t * )mmap (0 , BLOCK_SIZE , PROT_READ |PROT_WRITE , MAP_SHARED , fd , GPIO_BASE ) ;
2384
+ if (gpio == MAP_FAILED )
2385
+ return wiringPiFailure (WPI_ALMOST , "wiringPiSetup: mmap (GPIO) failed: %s\n" , strerror (errno )) ;
2353
2386
2354
- gpio = (uint32_t * )mmap (0 , BLOCK_SIZE , PROT_READ |PROT_WRITE , MAP_SHARED , fd , GPIO_BASE ) ;
2355
- if (gpio == MAP_FAILED )
2356
- return wiringPiFailure (WPI_ALMOST , "wiringPiSetup: mmap (GPIO) failed: %s\n" , strerror (errno )) ;
2387
+ // PWM
2357
2388
2358
- // PWM
2389
+ pwm = (uint32_t * )mmap (0 , BLOCK_SIZE , PROT_READ |PROT_WRITE , MAP_SHARED , fd , GPIO_PWM ) ;
2390
+ if (pwm == MAP_FAILED )
2391
+ return wiringPiFailure (WPI_ALMOST , "wiringPiSetup: mmap (PWM) failed: %s\n" , strerror (errno )) ;
2359
2392
2360
- pwm = (uint32_t * )mmap (0 , BLOCK_SIZE , PROT_READ |PROT_WRITE , MAP_SHARED , fd , GPIO_PWM ) ;
2361
- if (pwm == MAP_FAILED )
2362
- return wiringPiFailure (WPI_ALMOST , "wiringPiSetup: mmap (PWM) failed: %s\n" , strerror (errno )) ;
2393
+ // Clock control (needed for PWM)
2363
2394
2364
- // Clock control (needed for PWM)
2395
+ clk = (uint32_t * )mmap (0 , BLOCK_SIZE , PROT_READ |PROT_WRITE , MAP_SHARED , fd , GPIO_CLOCK_BASE ) ;
2396
+ if (clk == MAP_FAILED )
2397
+ return wiringPiFailure (WPI_ALMOST , "wiringPiSetup: mmap (CLOCK) failed: %s\n" , strerror (errno )) ;
2365
2398
2366
- clk = (uint32_t * )mmap (0 , BLOCK_SIZE , PROT_READ |PROT_WRITE , MAP_SHARED , fd , GPIO_CLOCK_BASE ) ;
2367
- if (clk == MAP_FAILED )
2368
- return wiringPiFailure (WPI_ALMOST , "wiringPiSetup: mmap (CLOCK) failed: %s\n" , strerror (errno )) ;
2399
+ // The drive pads
2369
2400
2370
- // The drive pads
2401
+ pads = (uint32_t * )mmap (0 , BLOCK_SIZE , PROT_READ |PROT_WRITE , MAP_SHARED , fd , GPIO_PADS ) ;
2402
+ if (pads == MAP_FAILED )
2403
+ return wiringPiFailure (WPI_ALMOST , "wiringPiSetup: mmap (PADS) failed: %s\n" , strerror (errno )) ;
2371
2404
2372
- pads = (uint32_t * )mmap (0 , BLOCK_SIZE , PROT_READ |PROT_WRITE , MAP_SHARED , fd , GPIO_PADS ) ;
2373
- if (pads == MAP_FAILED )
2374
- return wiringPiFailure (WPI_ALMOST , "wiringPiSetup: mmap (PADS) failed: %s\n" , strerror (errno )) ;
2405
+ // The system timer
2375
2406
2376
- // The system timer
2407
+ timer = (uint32_t * )mmap (0 , BLOCK_SIZE , PROT_READ |PROT_WRITE , MAP_SHARED , fd , GPIO_TIMER ) ;
2408
+ if (timer == MAP_FAILED )
2409
+ return wiringPiFailure (WPI_ALMOST , "wiringPiSetup: mmap (TIMER) failed: %s\n" , strerror (errno )) ;
2377
2410
2378
- timer = ( uint32_t * ) mmap ( 0 , BLOCK_SIZE , PROT_READ | PROT_WRITE , MAP_SHARED , fd , GPIO_TIMER ) ;
2379
- if ( timer == MAP_FAILED )
2380
- return wiringPiFailure ( WPI_ALMOST , "wiringPiSetup: mmap (TIMER) failed: %s\n" , strerror ( errno )) ;
2411
+ // Set the timer to free-running, 1MHz.
2412
+ // 0xF9 is 249, the timer divide is base clock / (divide+1 )
2413
+ // so base clock is 250MHz / 250 = 1MHz.
2381
2414
2382
- // Set the timer to free-running, 1MHz.
2383
- // 0xF9 is 249, the timer divide is base clock / (divide+1)
2384
- // so base clock is 250MHz / 250 = 1MHz.
2415
+ * ( timer + TIMER_CONTROL ) = 0x0000280 ;
2416
+ * ( timer + TIMER_PRE_DIV ) = 0x00000F9 ;
2417
+ timerIrqRaw = timer + TIMER_IRQ_RAW ;
2385
2418
2386
- * (timer + TIMER_CONTROL ) = 0x0000280 ;
2387
- * (timer + TIMER_PRE_DIV ) = 0x00000F9 ;
2388
- timerIrqRaw = timer + TIMER_IRQ_RAW ;
2419
+ _wiringPiGpio = gpio ;
2420
+ _wiringPiPwm = pwm ;
2421
+ _wiringPiClk = clk ;
2422
+ _wiringPiPads = pads ;
2423
+ _wiringPiTimer = timer ;
2424
+ } else {
2425
+ _wiringPiGpio = NULL ;
2426
+ _wiringPiPwm = NULL ;
2427
+ _wiringPiClk = NULL ;
2428
+ _wiringPiPads = NULL ;
2429
+ _wiringPiTimer = NULL ;
2430
+ }
2431
+
2389
2432
2390
2433
// Export the base addresses for any external software that might need them
2391
2434
2392
- _wiringPiGpio = gpio ;
2393
- _wiringPiPwm = pwm ;
2394
- _wiringPiClk = clk ;
2395
- _wiringPiPads = pads ;
2396
- _wiringPiTimer = timer ;
2435
+
2397
2436
2398
2437
initialiseEpoch () ;
2399
2438
@@ -2473,6 +2512,9 @@ int wiringPiSetupSys (void)
2473
2512
if (wiringPiDebug )
2474
2513
printf ("wiringPi: wiringPiSetupSys called\n" ) ;
2475
2514
2515
+ int model , rev , mem , maker , overVolted ;
2516
+ piBoardId (& model , & rev , & mem , & maker , & overVolted ) ;
2517
+
2476
2518
if (piGpioLayout () == 1 )
2477
2519
{
2478
2520
pinToGpio = pinToGpioR1 ;
@@ -2484,6 +2526,11 @@ int wiringPiSetupSys (void)
2484
2526
physToGpio = physToGpioR2 ;
2485
2527
}
2486
2528
2529
+ if (PI_MODEL_5 == model ) {
2530
+ return wiringPiFailure (WPI_ALMOST , "wiringPiSetup: Raspberry Pi 5 not supported.\n"
2531
+ " Unable to continue. Keep an eye of new version at https://github.com/GrazerComputerClub/WiringPi\n" ) ;
2532
+ }
2533
+
2487
2534
// Open and scan the directory, looking for exported GPIOs, and pre-open
2488
2535
// the 'value' interface to speed things up for later
2489
2536
0 commit comments