Не уверен, какой тип сбоев вы испытываете (они не описаны), но операции с портом GPIO и комментариями некорректны. Прежде всего, регистр PIO_PER - это регистр разрешения ввода-вывода, биты установки которого не , что делает их выводом , но , разрешающее . С другой стороны, PIO_OER действительно для , заставляя их выводить , а не , отключая все . Итак, вы должны придерживаться следующей последовательности:
// initializing
*(unsigned int *) (gpio + PIO_PER) = 0xff; // enable
*(unsigned int *) (gpio + PIO_OER) = 0xff; // set output
// working
...
*(unsigned int *) (gpio + PIO_SODR) = 0xff; // set 1's
...
*(unsigned int *) (gpio + PIO_CODR) = 0xff; // set 0's
UPDATE
Так как только целые страницы могут быть отображены, вы должны принять это во внимание:
#define MAP_SIZE 4096UL
#define MAP_MASK (MAP_SIZE - 1)
#define GPIOA_BASE 0xFFFFF400
...
/* Map one page */
map_base = mmap(0, MAP_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, GPIOA_BASE & & ~MAP_MASK);
...
gpio = map_base + (GPIOA_BASE & MAP_MASK);
...
Проверьте источники известного инструмента devmem: здесь