Hi all
Can anyone help me accessing GPIO registers using C ?
I’m using the Technical Reference Manual to see the registers, but I can’t write to them, or get several segmentation faults. Any help, or example in C ?
My Code is simply:
#define APQ8016_PERI_BASE 0x01000000
#define GPIO_BASE (APQ8016_PERI_BASE)
#define CLK_GATE_EN (APQ8016_PERI_BASE + 0x100000)
#include <stdio.h>
#include <stdlib.h>
#include <fcntl.h>
#include <sys/mman.h>
#include <unistd.h>
#define BLOCK_SIZE (4*1024)
int mem_fd;
void *gpio_map;
volatile unsigned *gpio;
#define TEST_GPIO *(gpio+(0x1000 * 52) //For GPIO_52
int main(int argc, char **argv)
{
int g,rep;
setup_io();
TEST_GPIO |= 1<<1 ; //Set bit 1
return 0;
}
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 */
gpio_map = mmap(
NULL, //Any adddress in our space will do
BLOCK_SIZE, //Map length
PROT_READ|PROT_WRITE,// Enable reading & writting to mapped memory
MAP_SHARED, //Shared with other processes
mem_fd, //File to map
GPIO_BASE //Offset to GPIO peripheral
);
close(mem_fd); //No need to keep mem_fd open after mmap
if (gpio_map == MAP_FAILED) {
printf(“mmap error %d\n”, (int)gpio_map);//errno also set!
exit(-1);
}
gpio = (volatile unsigned *)gpio_map;
}
So I’m just trying to set bit 1 of TLMM_GPIO_CFGn, register on GPIO_52, I’m getting always a segmentation fault.
I’m using Linaro 4.9.56
Thanks
Paulo Moreira