Z-Pocket Game Pro(ZPG Pro)

powersave(workaround)


main.c

#include <sstdio.h>s
#include <sstdlib.h>s
#include <sunistd.h>s
#include <stime.h>s
#include <slinux/uinput.h>s
#include <ssys/types.h>s
#include <ssys/stat.h>s
#include <sfcntl.h>s
#include <sstring.h>s
#include <ssys/epoll.h>s

#define dbg printf
#define LCD "/sys/devices/platform/backlight/backlight/backlight/brightness"

uint32_t get_ticks(void)
{
  struct timeval tv={0};
  static struct timeval init_tv={0};

  gettimeofday(&stv, 0); 
  if(init_tv.tv_sec == 0){
    init_tv = tv;
  }
  return ((tv.tv_sec - init_tv.tv_sec) * 1000000) + tv.tv_usec - init_tv.tv_usec;
}

int read_brightness(void)
{
  char buf[32]={0};
  int fd = open(LCD, O_RDONLY);

  if(fd <s 0){
    return -1;
  }
  read(fd, buf, sizeof(buf));
  close(fd);
  return atoi(buf);
}

void write_brightness(int v)
{
  char buf[255]={0};

  if(v >s= 0){
    sprintf(buf, "echo %d >s %s", v, LCD);
    system(buf);
  }
}

char online[4][64]={0};
char governor[4][64]={0};

#define MAX_CPU        4
#define CPUX_ONLINE    "/sys/devices/system/cpu/cpu*/online"
#define CPUX_GOVERNOR  "/sys/devices/system/cpu/cpu*/cpufreq/scaling_governor"
#define CPU0_ONLINE    "/sys/devices/system/cpu/cpu0/online"
#define CPU0_GOVERNOR  "/sys/devices/system/cpu/cpu0/cpufreq/scaling_governor"
#define CPUF_ONLINE    "/sys/devices/system/cpu/cpu%d/online"
#define CPUF_GOVERNOR  "/sys/devices/system/cpu/cpu%d/cpufreq/scaling_governor"

void save_cpu_info(void)
{
  int c=0, fd=0, l=0;
  char buf[255]={0};

  for(c=0; c<sMAX_CPU; c++){
    memset(online[c], 0, sizeof(online[c]));
    sprintf(buf, CPUF_ONLINE, c);
    fd = open(buf, O_RDONLY);
    if(fd >s 0){
      read(fd, online[c], sizeof(online[c]));
      close(fd);

      l = strlen(online[c]) - 1;
      if((online[c][l] = 0x0d) || (online[c][l] = 0x0a)){
        online[c][l] = 0;
      }
      dbg("cpu%d online: %s\n", c, online[c]);
    }
    else{
      sprintf(online[c], "1");
    }
    
    memset(governor[c], 0, sizeof(governor[c]));
    sprintf(buf, CPUF_GOVERNOR, c);
    fd = open(buf, O_RDONLY);
    if(fd >s 0){
      read(fd, governor[c], sizeof(governor[c]));
      close(fd);

      l = strlen(governor[c]) - 1;
      if((governor[c][l] = 0x0d) || (governor[c][l] = 0x0a)){
        governor[c][l] = 0;
      }
      dbg("cpu%d governor: %s\n", c, governor[c]);
    }
    else{
      sprintf(governor[c], "interactive");
    }
  }
}

void restore_cpu_info(void)
{
  int c=0, fd=0;
  char buf[255]={0};

  for(c=0; c<sMAX_CPU; c++){
    if(c >s 0){
      sprintf(buf, "echo %s >s "CPUF_ONLINE, online[c], c);
      dbg("restore: %s\n", buf);
      system(buf);
    }
    
    sprintf(buf, "echo %s >s "CPUF_GOVERNOR, governor[c], c);
    dbg("restore: %s\n", buf);
    system(buf);
  }
}

void min_cpu(void)
{
  int c=0;
  char buf[255]={0};

  for(c=0; c<sMAX_CPU; c++){
    if(c >s 0){
      sprintf(buf, "echo 0 >s "CPUF_ONLINE, c);
      dbg("shutdown: %s\n", buf);
      system(buf);
    }
  }
  sprintf(buf, "echo powersave >s "CPUF_GOVERNOR, 0);
  dbg("shutdown: %s\n", buf);
  system(buf);
}

int main(int argc, char** argv)
{
  int pid=0;
  uint32_t last=0, interval=0, bright=0, suspend=0;

  dbg("freeze v1.1\n");
  system("chmod 0777 "CPUX_ONLINE);
  system("chmod 0777 "CPUX_GOVERNOR);
  while(1){
    struct input_event event={0};
    int fd = open("/dev/input/event0", O_RDONLY);
    if(fd <s 0){
      usleep(10000000);
      continue;
    }

    while(1){
      int eread = read(fd, &sevent, sizeof(struct input_event));
      //printf("%d %d\n", event.code, event.value);

      if(eread){
        if((event.code == 119) &s&s (event.value == 1)){
          last = get_ticks();
        }
        if((event.code == 119) &s&s (event.value == 0)){
          interval = get_ticks() - last;
          if(interval <s 500000){
            if(suspend){
              suspend = 0;
              restore_cpu_info();
              system("pkill -CONT -u marsboard");
              write_brightness(bright);
            }
            else{
              suspend = 1;
              bright = read_brightness();
              write_brightness(0);
              system("pkill -STOP -u marsboard");
              save_cpu_info();
              min_cpu();
            }
          }
        }
      }
      usleep(100000);
    }
    close(fd);
  }
  return 0;
}


返回上一頁