Browse Source

#221

pull/230/head
mstroh76 7 months ago
parent
commit
e7726a4f0a
3 changed files with 79 additions and 6 deletions
  1. +14
    -4
      gpio/gpio.c
  2. +64
    -2
      wiringPi/wiringPi.c
  3. +1
    -0
      wiringPi/wiringPi.h

+ 14
- 4
gpio/gpio.c View File

@@ -1377,10 +1377,20 @@ static void doVersion (char *argv [])
} }
} }


if (wiringPiUserLevelAccess()) // User level GPIO is GO
printf (" * This Raspberry Pi supports user-level GPIO access.\n") ;
else
printf (" * Root or sudo required for GPIO access.\n") ;
int bGlobalAccess = wiringPiGlobalMemoryAccess(); // User level GPIO is GO
switch(bGlobalAccess) {
case 1:
printf (" * This system supports basic user-level GPIO access via /dev/mem.\n") ;
break;
case 2:
printf (" * This system supports full user-level GPIO access via /dev/mem.\n") ;
break;
}
if (wiringPiUserLevelAccess()) {
printf (" * This system supports basic user-level GPIO access via /dev/gpiomem.\n") ;
} else if(0==bGlobalAccess) {
printf (" * This system may require root or sudo for GPIO access.\n") ;
}
} }






+ 64
- 2
wiringPi/wiringPi.c View File

@@ -2522,6 +2522,10 @@ int wiringPiUserLevelAccess(void)
struct stat statBuf ; struct stat statBuf ;
const char* gpiomemModule = gpiomem_BCM; const char* gpiomemModule = gpiomem_BCM;


if (RaspberryPiModel<0) { //need to detect pi model
int model, rev, mem, maker, overVolted ;
piBoardId (&model, &rev, &mem, &maker, &overVolted) ;
}
if (PI_MODEL_5 == RaspberryPiModel) { if (PI_MODEL_5 == RaspberryPiModel) {
gpiomemModule = gpiomem_RP1; gpiomemModule = gpiomem_RP1;
} }
@@ -2530,6 +2534,61 @@ int wiringPiUserLevelAccess(void)
} }




int wiringPiGlobalMemoryAccess(void)
{
const char* gpiomemGlobal;
int fd=-1;
unsigned int MMAP_size;
unsigned int BaseAddr, PWMAddr;

if (RaspberryPiModel<0) { //need to detect pi model
int model, rev, mem, maker, overVolted ;
piBoardId (&model, &rev, &mem, &maker, &overVolted) ;
}
if (PI_MODEL_5 == RaspberryPiModel) {
gpiomemGlobal = pciemem_RP1;
MMAP_size = pciemem_RP1_Size;
BaseAddr = (RP1_IO0_Addr-RP1_BASE_Addr) ;
PWMAddr = RP1_PWM0_Addr-RP1_BASE_Addr;
} else {
gpiomemGlobal = gpiomem_global;
MMAP_size = BLOCK_SIZE;
BaseAddr = piGpioBase + 0x00200000 ;
PWMAddr = piGpioBase + 0x0020C000 ;
}

if ((fd = open (gpiomemGlobal, O_RDWR | O_SYNC | O_CLOEXEC)) >0) {
int returnvalue = 1; // OK

uint32_t * lgpio = (uint32_t *)mmap(0, MMAP_size, PROT_READ|PROT_WRITE, MAP_SHARED, fd, BaseAddr) ;
if (lgpio == MAP_FAILED) {
returnvalue = 0;
if (wiringPiDebug)
fprintf(stderr,"wiringPiGlobalMemoryAccess: mmap (GPIO) failed: %s\n", strerror (errno)) ;
} else {
munmap(lgpio, MMAP_size);
if (PI_MODEL_5 == RaspberryPiModel) {
returnvalue = 2; // GPIO & PWM accessible (same area, nothing to mmap)
} else {
//check PWM area
uint32_t* lpwm = (uint32_t *)mmap(0, BLOCK_SIZE, PROT_READ|PROT_WRITE, MAP_SHARED, fd, PWMAddr) ;
if (lpwm == MAP_FAILED) {
returnvalue = 1; // only GPIO accessible
if (wiringPiDebug)
fprintf(stderr,"wiringPiGlobalMemoryAccess: mmap (PWM) failed: %s\n", strerror (errno)) ;
} else {
returnvalue = 2; // GPIO & PWM accessible
munmap(lpwm, BLOCK_SIZE);
}
}
}

close(fd);
return returnvalue;
}
return 0; // Failed!
}

/* /*
* wiringPiSetup: * wiringPiSetup:
* Must be called once at the start of your program execution. * Must be called once at the start of your program execution.
@@ -2633,9 +2692,12 @@ int wiringPiSetup (void)
gpiomemModule = gpiomem_RP1; gpiomemModule = gpiomem_RP1;
} }


usingGpioMem = FALSE;
if (gpiomemGlobal==NULL || (fd = open (gpiomemGlobal, O_RDWR | O_SYNC | O_CLOEXEC)) < 0) if (gpiomemGlobal==NULL || (fd = open (gpiomemGlobal, O_RDWR | O_SYNC | O_CLOEXEC)) < 0)
{ {

if (wiringPiDebug) {
printf ("wiringPi: no access to %s try %s\n", gpiomemGlobal, gpiomemModule) ;
}
if (gpiomemModule && (fd = open (gpiomemModule, O_RDWR | O_SYNC | O_CLOEXEC) ) >= 0) // We're using gpiomem if (gpiomemModule && (fd = open (gpiomemModule, O_RDWR | O_SYNC | O_CLOEXEC) ) >= 0) // We're using gpiomem
{ {
piGpioBase = 0 ; piGpioBase = 0 ;
@@ -2648,7 +2710,7 @@ int wiringPiSetup (void)
" Try running with sudo?\n", gpiomemGlobal, gpiomemModule, strerror (errno)) ; " Try running with sudo?\n", gpiomemGlobal, gpiomemModule, strerror (errno)) ;
} }
if (wiringPiDebug) { if (wiringPiDebug) {
printf ("wiringPi: access to %s succeded\n", usingGpioMem ? gpiomemModule : gpiomemGlobal) ;
printf ("wiringPi: access to %s succeded %d\n", usingGpioMem ? gpiomemModule : gpiomemGlobal, fd) ;
} }
// GPIO: // GPIO:
if (PI_MODEL_5 != model) { if (PI_MODEL_5 != model) {


+ 1
- 0
wiringPi/wiringPi.h View File

@@ -208,6 +208,7 @@ extern struct wiringPiNodeStruct *wiringPiNewNode (int pinBase, int numPins) ;
extern int GPIOToSysFS(const int pin) ; extern int GPIOToSysFS(const int pin) ;


extern void wiringPiVersion (int *major, int *minor) ; extern void wiringPiVersion (int *major, int *minor) ;
extern int wiringPiGlobalMemoryAccess(void); //Interface 3.3
extern int wiringPiUserLevelAccess (void) ; extern int wiringPiUserLevelAccess (void) ;
extern int wiringPiSetup (void) ; extern int wiringPiSetup (void) ;
extern int wiringPiSetupSys (void) ; extern int wiringPiSetupSys (void) ;


Loading…
Cancel
Save