Banana Pi GPIO / PIO in C

Hier mal ein kleines Beispiel um mit Pin 8 ( PH0 ) zu arbeiten.
Die Informationen kommen aus dem A20 User Manual 2013-03-22

Am Wochenende hab ich mir mal die GPIOs angeschaut. Dabei kam ein kleines C Skript raus mit dem sich alle GPIOs steuern lassen. Bis jetzt nur als Input, Output und PullUpDown.
Hier gibt es das Skript


#include
#include
#include
#include

#define PAGESIZE 4096
#define GPIO_BASE 0x01C20800

#define PH_DAT_OFFSET (0x0000010C / 4) // pin values
#define PH_CFG_OFFSET (0x000000FC / 4) // pin function configuration
#define PH_PULL_OFFSET (0x00000118 / 4) // pin resistor

#define INPUT 0
#define OUTUT 1

#define PULLNONE 0b00
#define PULLUP 0b01
#define PULLDOWN 0b10

volatile uint32_t *memory;

int main(int argc, char **argv) {

int fileDescriptor;
if (!(fileDescriptor = open("/dev/mem", O_RDWR))){
return (-1);
}

uint32_t mask = (~(PAGESIZE - 1));
uint32_t startAddress = GPIO_BASE & mask;
uint32_t *map = mmap(0, PAGESIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fileDescriptor, startAddress);

memory = (volatile uint32_t *)map + ((GPIO_BASE & ~mask) / 4); // offsets are bytes..

if (memory == MAP_FAILED) {
return (1);
}

uint32_t pinValue;

// pull high
*(memory + PH_PULL_OFFSET) = PULLUP;

// configure as in
*(memory+PH_CFG_OFFSET) = INPUT;

// should be 1
pinValue = *(memory + PH_DAT_OFFSET) & 1; // Pin 8 is first in PH0 therefore &1

// pull low
*(memory + PH_PULL_OFFSET) = PULLDOWN;

// should be 0
pinValue = *(memory + PH_DAT_OFFSET) & 1;

close(fileDescriptor);
return 0;

}

Kommentar verfassen

Scroll to Top