RPi3で物理アドレスを叩いてLEDを点灯

https://qiita.com/hukatama024e/items/1edd5c58ed68b5264d40
https://github.com/hukatama024e/rust_rpi_blink_led
/dev/memではなく、/dev/gpiomemを開いたらできた
GPIO #27pinをON・OFFするコード

#include <stdio.h>
#include <stdlib.h>
#include <fcntl.h>
#include <sys/mman.h>
#include <unistd.h>
#include <stdint-gcc.h>

#define BLOCK_SIZE 4096
#define REG_BASE 0x3F200000
#define GPIO_BASE (REG_BASE+0x200000)
#define FSEL0_INDEX 0
#define FSEL2_INDEX 0x02
#define SET0_INDEX 0x07
#define CLR0_INDEX 0x0A
#define GPF_OUTPUT 0x01
//#define SET0_INDEX 7
//#define CLR0_INDEX 10
//#define GPF_OUTPUT 0x01
//#define SET0_INDEX 0x1c
//#define CLR0_INDEX 0x28
//#define GPF_OUTPUT 0x01

#define PINNUM 27

static volatile uint32_t *gpio_base = NULL;


void printBits(size_t const size, void const * const ptr)
{
    unsigned char *b = (unsigned char*) ptr;
    unsigned char byte;
    int i, j;

    for (i=size-1;i>=0;i--)
    {
        for (j=7;j>=0;j--)
        {
            byte = (b[i] >> j) & 1;
            printf("%u", byte);
        }
    }
//puts("");
}

int gpio_init(void){
  int fd = open("/dev/gpiomem", O_RDWR | O_SYNC);
  void *gpio_mmap;
  if (fd<0) {
    fprintf(stderr,"cannot open /dev/mem\n");
    return 0;
  }

  gpio_mmap = mmap(NULL, BLOCK_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED,
                  fd, GPIO_BASE);

  if(gpio_mmap==MAP_FAILED){
    fprintf(stderr,"cannot mmap GPIO\n");
    return 0;
  }

  close(fd);
  gpio_base = (volatile uint32_t *)gpio_mmap;
  return 1;
}

int gpio_deinit(void){
  munmap((void *)gpio_base, BLOCK_SIZE);
  gpio_base = NULL;
  return 1;
}

int function_set(int pin, uint32_t func)
{
  //int index = FSEL0_INDEX + pin/10;
  int index = FSEL2_INDEX;
  uint32_t mask = ~(0x7 << ((pin % 10) * 3));

  printf("%d",index);
  printf(": index\r\n");
  printBits(sizeof(mask), &mask);
  printf(" :mask\r\n");
  uint32_t masked = (gpio_base[index] & mask);
  printBits(sizeof(masked), &masked);
  printf(" :masked\r\n");
  uint32_t added = (func & 0x7) << ((pin % 10) * 3);
  printBits(sizeof(added), &added);
  printf(" :added\r\n");
  //uint32_t final = (gpio_base[index] & mask)|((func & 0x7) << ((pin % 10) * 3));
  uint32_t final = masked | added;
  printBits(sizeof(final), &final);
  printf(" :final\r\n");
  printf("value: %d\n", (gpio_base[index] & mask)|((func & 0x7) << ((pin % 10) * 3)));

  //gpio_base[index] = (gpio_base[index] & mask) | ((func & 0x7) << ((pin % 10) * 3));
  gpio_base[index] = final;
  return 1;
}

int setpin(int pin)
{
  gpio_base[SET0_INDEX] = 1 << pin;
}

int clearpin(int pin)
{
  gpio_base[CLR0_INDEX] = 1 << pin;
}

int main(void)
{
  unsigned int value = 0;
  if (!gpio_init())
    return -1;

  function_set(PINNUM, GPF_OUTPUT);

  for(value=0;value<10;value++)
  {
    printf("LED ON\n");
    setpin(PINNUM);
    sleep(1);
    printf("LED OFF\n");
    clearpin(PINNUM);
    sleep(1);
  }

  gpio_deinit();
  return 1;
}
$ ./a.out
2: index
11111111000111111111111111111111 :mask
00000000000000000000000000000000 :masked
00000000001000000000000000000000 :added
00000000001000000000000000000000 :final
value: 2097152
LED ON
LED OFF
LED ON
LED OFF
LED ON
LED OFF
LED ON
LED OFF
LED ON
LED OFF
LED ON
LED OFF
LED ON
LED OFF
LED ON
LED OFF
LED ON
LED OFF
LED ON
LED OFF