Rpi Datasheet 751 GPIO Registers

'''Code Example

How to access GPIO registers from C-code on the Raspberry-Pi ''' // How to access GPIO registers from C-code on the Raspberry-Pi // Example program // 15-January-2012 // Dom and Gert

// Access from ARM Running Linux


 * 1) define BCM2708_PERI_BASE       0x20000000
 * 2) define GPIO_BASE               (BCM2708_PERI_BASE + 0x200000) /* GPIO controller */


 * 1) include 
 * 2) include 
 * 3) include 
 * 4) include 
 * 5) include 
 * 6) include 
 * 7) include 
 * 8) include 
 * 9) include 


 * 1) include 


 * 1) define PAGE_SIZE (4*1024)
 * 2) define BLOCK_SIZE (4*1024)

int mem_fd; char *gpio_mem, *gpio_map; char *spi0_mem, *spi0_map;

// I/O access volatile unsigned *gpio;

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


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

void setup_io;

int main(int argc, char **argv) { int g,rep;

// Set up gpi pointer for direct register access setup_io;

// Switch GPIO 7..11 to output mode

/* You are about to change the GPIO settings of your computer. *  * Mess this up and it will stop working! *  * It might be a good idea to 'sync' before running this program        * * so at least you still have your code changes written to the SD-card! */ // Set GPIO pins 7-11 to output for (g=7; g<=11; g++) {   INP_GPIO(g); // must use INP_GPIO before we can use OUT_GPIO OUT_GPIO(g); }

for (rep=0; rep<10; rep++) {    for (g=7; g<=11; g++) {      GPIO_SET = 1<<g; sleep(1); }    for (g=7; g<=11; g++) {      GPIO_CLR = 1<<g; sleep(1); } }

return 0;

} // main

// // Set up a memory regions to access GPIO // void setup_io {

/* open /dev/mem */ if ((mem_fd = open("/dev/mem", O_RDWR|O_SYNC) ) < 0) { printf("can't open /dev/mem \n"); exit (-1); }

/* mmap GPIO */

// Allocate MAP block if ((gpio_mem = malloc(BLOCK_SIZE + (PAGE_SIZE-1))) == NULL) { printf("allocation error \n"); exit (-1); }

// Make sure pointer is on 4K boundary if ((unsigned long)gpio_mem % PAGE_SIZE) gpio_mem += PAGE_SIZE - ((unsigned long)gpio_mem % PAGE_SIZE);

// Now map it  gpio_map = (unsigned char *)mmap(      (caddr_t)gpio_mem,      BLOCK_SIZE,      PROT_READ|PROT_WRITE,      MAP_SHARED|MAP_FIXED,      mem_fd,      GPIO_BASE   );

if ((long)gpio_map < 0) { printf("mmap error %d\n", (int)gpio_map); exit (-1); }

// Always use volatile pointer! gpio = (volatile unsigned *)gpio_map;

} // setup_io