RetroGame

如何得知Power按鈕的GPIO


得助於JZ4760的資料手冊可以下載,使用mmap映射Register後,就可以依序列印GPIO狀態,藉此定位出Power按鈕的腳位,程式碼如下:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <fcntl.h>
#include <sys/mman.h>
#include <unistd.h>

#define GPIO_BASE   0x10010000
#define PAPIN       ((0x10010000 - GPIO_BASE) >> 2)
#define PADAT       ((0x10010010 - GPIO_BASE) >> 2)
#define PASET       ((0x10010014 - GPIO_BASE) >> 2)
#define PACLR       ((0x10010018 - GPIO_BASE) >> 2)
#define PBPIN       ((0x10010100 - GPIO_BASE) >> 2)
#define PBDAT       ((0x10010110 - GPIO_BASE) >> 2)
#define PBSET       ((0x10010114 - GPIO_BASE) >> 2)
#define PBCLR       ((0x10010118 - GPIO_BASE) >> 2)
#define PCPIN       ((0x10010200 - GPIO_BASE) >> 2)
#define PCDAT       ((0x10010210 - GPIO_BASE) >> 2)
#define PCSET       ((0x10010214 - GPIO_BASE) >> 2)
#define PCCLR       ((0x10010218 - GPIO_BASE) >> 2)
#define PDPIN       ((0x10010300 - GPIO_BASE) >> 2)
#define PDDAT       ((0x10010310 - GPIO_BASE) >> 2)
#define PDSET       ((0x10010314 - GPIO_BASE) >> 2)
#define PDCLR       ((0x10010318 - GPIO_BASE) >> 2)
#define PEPIN       ((0x10010400 - GPIO_BASE) >> 2)
#define PEDAT       ((0x10010410 - GPIO_BASE) >> 2)
#define PESET       ((0x10010414 - GPIO_BASE) >> 2)
#define PECLR       ((0x10010418 - GPIO_BASE) >> 2)
#define PFPIN       ((0x10010500 - GPIO_BASE) >> 2)
#define PFDAT       ((0x10010510 - GPIO_BASE) >> 2)
#define PFSET       ((0x10010514 - GPIO_BASE) >> 2)
#define PFCLR       ((0x10010518 - GPIO_BASE) >> 2)

int main(int argc, char* argv[])
{
  int fd=-1;
  volatile unsigned long *mem;

  fd=open("/dev/mem", O_RDWR);
  if(fd < 0){
    printf("failed to open /dev/mem\n");
    return -1;
  }
  mem  = mmap(0, 2048, PROT_READ | PROT_WRITE, MAP_SHARED, fd, GPIO_BASE);
  while(1){
    printf("GPIOA:0x%x 0x%x, GPIOB:0x%x 0x%x, GPIOC:0x%x 0x%x, GPIOD:0x%x 0x%x, GPIOE:0x%x 0x%x, GPIOF:0x%x 0x%x\n", 
      mem[PAPIN], mem[PADAT],
      mem[PBPIN], mem[PBDAT],
      mem[PCPIN], mem[PCDAT],
      mem[PDPIN], mem[PDDAT],
      mem[PEPIN], mem[PEDAT],
      mem[PFPIN], mem[PFDAT]
    );
    usleep(1000000);
  }
  munmap(mem, 2048);
  close(fd);
  return 0;    
}

P.S. 經由上面的測試程式,可以得知Power按鈕是GPIOA 30Pin


返回上一頁