Hallo Sebring,
ich bin auch gerade daran, Direcktzugriff auf die GPIO`s zu bekommen.
Ist eigentlich icht so kompliziert, wenn man die Variablen- und Registerzuweisung hinbekommt, und das mit der Bitverschliebung (Hier Beschrieben:
https://www.kampis-elektroecke.de/raspb ... o-zugriff/) kapiert.
Dann must du nur noch die Bitzuordnung im Register (findest du hier:
https://iwer.info/article/Elektrotechni ... index.html) verstehen, und du kanst loslegen.
Ich habe nur noch ein Problem mit "open /dev/mem". Bei der Programmausführung wird mir irgentwie der Zugriff verweigert.
Hier ein Programmfragment, was ich zum Ausprobieren geschrieben habe:
#include <iostream>
#include <fstream>
#include <cstdio>
#include <cmath>
#include <cstdlib>
#include <sys/mman.h>
#include <fcntl.h>
#include <unistd.h>
#define Peripherie_Basis 0x20000000
#define GPIO_Basis (Peripherie_Basis + 0x200000)
#define BLOCK_SIZE 0x03
struct BCM2835_Peripherie {
long GPIO;
unsigned long Adress;
long Memory;
void *Map;
volatile unsigned int *Addr;
};
struct BCM2835_Peripherie *Peripherie;
int main()
{
Peripherie->Memory = open("/dev/mem", O_RDWR | O_SYNC);
if (Peripherie->Memory < 0)
{
printf("Oeffnen von /dev/mem fehlgeschlagen!\n");
return -1;
}
Peripherie->Map = mmap(
NULL,
BLOCK_SIZE,
PROT_READ | PROT_WRITE,
MAP_SHARED,
Peripherie->Memory,
Peripherie->Adress
);
if (Peripherie->Map < 0)
{
printf("Mapping fehlgeschlagen!\n");
return -1;
}
Peripherie->Addr = (volatile unsigned int*)Peripherie->Map;
struct BCM2835_Peripherie GPIO = {GPIO_Basis};
long Status20;
long Status21;
long Status22;
*(GPIO.Addr + 0x03) = 0x01 << 0x18; // GPIO20 (PIN38) auf OUT (Write) setzen
*(GPIO.Addr + 0x07) = 0x01 << 0x07; // GPIO20 (PIN38) auf HIGHT setzen
*(GPIO.Addr + 0x07) &= ~(0x01 << 0x07); // GPIO20 (PIN38) auf LOW setzen (Bitwehrt löschen)
*(GPIO.Addr + 0x03) &= ~(0x07 << 0x18); // GPIO20 (PIN38) auf IN (Read) setzen (Bitmuster löschen)
Status20 = *(GPIO.Addr + 0x0E); // GPIO20 (PIN38) Status Bitmuster auslehsen
Status20 &= (0x01 << 0x07); // GPIO20 (PIN38) Bitmuster-UND-Vergleich
Status20 = Status20 >> 0x07; // GPIO20 (PIN38) Zurück
ist ev. manches überflüssig, und die GPIO -Wehrte müssen auch nicht unbedingt stimmen.
Grße Golem