Geheugen toegewezen IO - RPI2

Ik probeer een eenvoudig led-knipperprogramma te schrijven met mmap io. Ik weet dat mijn circuit werkt (ik heb het al geprobeerd met de aanpak sysfs ). Nu probeer ik het te doen met mmap io en ik ben helemaal gestapeld en ik kan niet vinden waar ik het verkeerd doe. Als iemand me kan helpen, zou ik op prijs gesteld zijn.

Btw Ik gebruik Rpi 2 model B v1.1

Hier is mijn code,

#include      //perror
#include   //mmap
#include  //fd open
#include   //fd open
#include      //fd open
#include     //fd close

#define BCM2708_PERI_BASE       0x20000000
#define GPIO_BASE               (BCM2708_PERI_BASE + 0x200000)  //GPIO controller

#define BLOCK_SIZE              (4 * 1024)

// GPIO setup macros. Always use INP_GPIO(x) before using OUT_GPIO(x)
#define INP_GPIO(g)         *(gpio.addr + ((g)/10)) &= ~(7 << (((g) % 10) * 3))
#define OUT_GPIO(g)         *(gpio.addr + ((g)/10)) |=  (1 << (((g) % 10) * 3))
#define SET_GPIO_ALT(g, a)  *(gpio.addr + (((g)/10))) |= (((a) <= 3 ? (a) + 4 : (a) == 4 ? 3 : 2) << (((g) % 10) * 3))

#define GPIO_SET            *(gpio.addr + 7) //sets   bits which are 1 ignores bits which are 0
#define GPIO_CLR            *(gpio.addr + 10)//clears bits which are 1 ignores bits which are 0

#define GPIO_READ(g)        *(gpio.addr + 13) &= (1 << (g))

struct bcm2835_peripheral {
    unsigned long addr_p;
    int mem_fd;
    void *map;
    volatile unsigned int *addr;
};

struct bcm2835_peripheral gpio = { GPIO_BASE };

// Exposes the physical address defined in the passed structure using mmap on /dev/mem
int map_peripheral(struct bcm2835_peripheral *p)
{
   //Open /dev/mem
    if ((p->mem_fd = open("/dev/mem", O_RDWR | O_SYNC) ) < 0) {
        fprintf(stderr, "Failed to open /dev/mem, try checking permissions.");
        return -1;
    }

    p->map = mmap(
                NULL,
                BLOCK_SIZE,
                PROT_READ | PROT_WRITE,
                MAP_SHARED,
                p->mem_fd,     //File descriptor to physical memory virtual file '/dev/mem'
                p->addr_p      //Address in physical map that we want this memory block to expose
                );

    if (p->map == MAP_FAILED) {
        perror("mmap");
        return -1;
    }

    p->addr = (volatile unsigned int *)p->map;

    return 0;
}

void unmap_peripheral(struct bcm2835_peripheral *p)
{

    munmap(p->map, BLOCK_SIZE);
    close(p->mem_fd);
}

int main()
{
    if(map_peripheral(&gpio) == -1) {
        fprintf(stderr, "Failed to map the physical GPIO registers into the virtual memory space.\n");
        return -1;
    }

   //Define pin 7 as output
    INP_GPIO(4);
    OUT_GPIO(4);

    while(1) {
       //Toggle pin 7 (blink a led!)
        GPIO_SET = 1 << 4;
        sleep(1);

        GPIO_CLR = 1 << 4;
        sleep(1);
    }

    return 0;
}
2

1 antwoord

Ik beantwoord mijn eigen vraag; nou eigenlijk deed ik een dwaze fout op het basisadres van randapparatuur. Ik gebruikte rpi1's peri-basis addr .. peri-basis addr voor rpi2 is 0x3F000000 en voor GPIO 0x3F200000

1
toegevoegd
Waarom zou je de moeite nemen? Er zijn bibliotheken die dit al doen b.v. winingpi. Als je je eigen code wilt schrijven, moet je dit soort dingen niet hard coderen en de omgeving niet goed detecteren.
toegevoegd de auteur Erick, de bron
@sinadogru Tiny gpio access laat zien hoe de/dev/gpiomem te gebruiken interface waarmee je de GPIO kunt manipuleren zonder root-toegang. Het detecteert ook automatisch de Pi-versie. Het zijn maar een paar honderd regels code.
toegevoegd de auteur joan, de bron
@sinadogru Je hebt root-rechten nodig om toegang te krijgen tot/dev/mem. Dit leidde echter tot de dwaze situatie waarin sommige Python-modules werden uitgevoerd met root-privileges simpelweg omdat ze een LED wilden twiddle. Dus een speciale/dev/gpiomem is gemaakt op de Pi. Dit apparaat kan door een gebruiker in de groep gpio worden geopend, maar het apparaat geeft alleen toegang tot het geheugengebied van de GPIO.
toegevoegd de auteur joan, de bron
Nou ik ben al op de hoogte dat bedradingPi maar ik hou ervan dat te proeven :)
toegevoegd de auteur cavitsinadogru, de bron
@joan Ah ja dat heb ik ook al gezien, maar heb het niet goed bekeken, maar het lijkt erop dat het tijd is om het te controleren, bedankt. (Hoe is het mogelijk om mem te manipuleren zonder root-toegang?)
toegevoegd de auteur cavitsinadogru, de bron
@joan Ik snap het nu, bedankt joan :)
toegevoegd de auteur cavitsinadogru, de bron