#include <stdio.h>
#include <stdlib.h>
#include <fcntl.h>
#include <sys/mman.h>
#include <unistd.h>
#define BCM2708_PERI_BASE 0x20000000
#define GPIO_BASE (BCM2708_PERI_BASE + 0x200000)
#define BLOCK_SIZE (4*1024)
volatile unsigned int *gpio;
void init_gpio(void)
{
int mem_fd;
void *gpio_map;
/* 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 */
gpio_map = mmap(
NULL,
BLOCK_SIZE,
PROT_READ|PROT_WRITE,
MAP_SHARED,
mem_fd,
GPIO_BASE
);
close(mem_fd);
if (gpio_map == MAP_FAILED) {
printf("mmap error %d\n", (int)gpio_map);
exit(-1);
}
// Always use volatile pointer!
gpio = (volatile unsigned int *)gpio_map;
}
上面是树莓派操作gpio时的初始化。操作gpio变量相当于操作BCM2835的GPIO寄存器,具体可以参考BCM2835 C lib
BCM2835的datasheet可参看datasheet