diff --git a/tools/exampels/dev_mem_access.c b/tools/exampels/dev_mem_access.c new file mode 100644 index 000000000000..58ffc856df06 --- /dev/null +++ b/tools/exampels/dev_mem_access.c @@ -0,0 +1,72 @@ +#include +#include +#include +#include +#include + +#define PHY_ADDRESS_BASE 0x500000000 // Die Startadresse Ihres QSPI MMIO-Bereichs +#define MAP_SIZE 0x100000 // Die Größe des zu mappenden Bereichs + +int main(int argc, char *argv[]) { + int fd; + void *virtual_base; + // volatile unsigned int *qspi_register; // oder Pointer auf den Speicherbereich + + if (argc != 2) { + fprintf(stderr, "Verwendung: %s \n", argv[0]); + return EXIT_FAILURE; + } + + // Die gewünschte Dump-Größe aus dem Konsolenparameter lesen + // Wir verwenden strtol für eine robustere Konvertierung + char *endptr; + long size_long = strtol(argv[1], &endptr, 10); + if (endptr == argv[1] || *endptr != '\0' || size_long <= 0) { + fprintf(stderr, "Ungültige Größe angegeben. Bitte eine positive Ganzzahl eingeben.\n"); + return EXIT_FAILURE; + } + size_t size = (size_t)size_long; + + // 1. /dev/mem öffnen + if ((fd = open("/dev/mem", O_RDWR | O_SYNC)) == -1) { + perror("Error opening /dev/mem"); + return EXIT_FAILURE; + } + + // 2. Physische Adresse in den virtuellen Speicher mappen + virtual_base = mmap(NULL, MAP_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, PHY_ADDRESS_BASE); + + if (virtual_base == MAP_FAILED) { + close(fd); + perror("Error mmapping the file"); + return EXIT_FAILURE; + } + + // Jetzt können Sie über den Pointer virtual_base auf die physische Adresse zugreifen + // Beispiel: Lesen eines 32-Bit-Werts + unsigned int value = *((volatile unsigned int *) virtual_base); + printf("TWx: 0x%lx: 0x%x\n", virtual_base, value); + + printf("Dump des Speichers ab virtueller Adresse %p (Groesse: %zu Bytes):\n", + (void*)virtual_base, size); + + // Speicherinhalt ausgeben (dumpen) + unsigned char *ptr = virtual_base; + for (size_t i = 0; i < size; i++) { + // Hexadezimale Ausgabe + printf("%02x ", ptr[i]); + if ((i + 1) % 16 == 0) { // Nach 16 Bytes eine neue Zeile + printf("\n"); + } + } + + // ... Operationen durchführen ... + + // 3. Speicher freigeben und Datei schließen + if (munmap(virtual_base, MAP_SIZE) == -1) { + perror("Error un-mmapping the file"); + } + close(fd); + + return EXIT_SUCCESS; +}