]> pilppa.org Git - familiar-h63xx-build.git/commitdiff
h6300 suspend fix for apm userspace tools. h6300 can currently only suspend by using...
authorMika Laitio <lamikr@cc.jyu.fi>
Sun, 5 Nov 2006 00:09:47 +0000 (02:09 +0200)
committerlamikr <lamikr@localhost.(none)>
Sun, 5 Nov 2006 00:09:47 +0000 (02:09 +0200)
org.handhelds.familiar/packages/apmd/apmd-3.2.2/h6300_suspend_fix.patch [new file with mode: 0644]
org.handhelds.familiar/packages/apmd/apmd_3.2.2.bb

diff --git a/org.handhelds.familiar/packages/apmd/apmd-3.2.2/h6300_suspend_fix.patch b/org.handhelds.familiar/packages/apmd/apmd-3.2.2/h6300_suspend_fix.patch
new file mode 100644 (file)
index 0000000..ffada3b
--- /dev/null
@@ -0,0 +1,107 @@
+diff -Naur apmd-3.2.2.old/apmd.c apmd-3.2.2.orig/apmd.c
+--- apmd-3.2.2.old/apmd.c      2006-11-05 01:09:14.000000000 +0200
++++ apmd-3.2.2.orig/apmd.c     2006-11-05 01:52:32.000000000 +0200
+@@ -537,7 +537,7 @@
+               /* Do it fast */
+               last_marked_time = time(0);
+               last_marked_content = apmi->battery_percentage;
+-              ioctl(apmd_fd, APM_IOC_SUSPEND, NULL);
++              apm_suspend(apmd_fd);
+               break;
+       case APMD_START:
+               /* Initialise */
+diff -Naur apmd-3.2.2.old/apmlib.c apmd-3.2.2.orig/apmlib.c
+--- apmd-3.2.2.old/apmlib.c    2006-11-05 01:09:14.000000000 +0200
++++ apmd-3.2.2.orig/apmlib.c   2006-11-05 01:50:58.000000000 +0200
+@@ -35,6 +35,66 @@
+ #define BACKWARD_COMPAT 1
++#define SUSPEND_METHOD__NOT_DEFINED           -1
++#define SUSPEND_METHOD__APM_IOCTL             0
++#define SUSPEND_METHOD__ECHO_SYS_POWER_STATE  1
++
++static int suspend_method_to_use      = SUSPEND_METHOD__NOT_DEFINED;
++
++/*
++ * Check from the some of the search strings is available in 
++ * /proc/cpuinfo (harware type for example)
++ * 
++ * Return 1 if available, 0 if not found
++ */
++int is_key_in_proc_cpuinfo(char *devlist[])
++{
++      FILE*   curFd;
++      char    curBuffer[2048];
++      size_t  curBCount;
++      char*   curFound;
++      int     retVal;
++
++      // let's assume by default that string does not found
++      retVal  = 0;
++      /* read to /proc/cpuinfo to buffer */
++      curFd           = fopen("/proc/cpuinfo", "r");
++      curBCount       = fread(curBuffer, 1, sizeof(curBuffer), curFd);
++      fclose(curFd);
++      if (curBCount > 0) {
++              /* make sure text in buffer is terminated */
++              curBuffer[curBCount] = '\0';
++              while((*devlist != NULL)) {
++                      curFound        = strstr(curBuffer, *devlist);
++                      if (curFound != NULL) {
++                              // matched to one of the search keywords
++                              retVal  = 1;
++                              break;
++                      }
++                      *devlist++;
++              }
++      }
++      return retVal;
++}
++
++int check_suspend_method(void)
++{
++      if (suspend_method_to_use == SUSPEND_METHOD__NOT_DEFINED)
++      {
++              char *curDevArr[]       = {"HP iPAQ h6300", 0};
++
++              // not checked yet, check now
++              if (is_key_in_proc_cpuinfo(curDevArr)) {
++                      suspend_method_to_use   = SUSPEND_METHOD__ECHO_SYS_POWER_STATE;
++                      printf("Using 'echo mem > sys/power/state' to suspend.\n");
++              }
++              else {
++                      suspend_method_to_use   = SUSPEND_METHOD__APM_IOCTL;
++                      printf("Using apm ioctl to suspend\n");
++              }
++      }
++      return suspend_method_to_use;
++}
+ /*
+  * Return a string describing an APM event. From p. 16 of the Intel/Microsoft
+@@ -388,7 +448,11 @@
+ int apm_suspend(int fd)
+ {
+     sync();
+-    return ioctl(fd, APM_IOC_SUSPEND, NULL) < 0 ? -errno : 0;
++    if (check_suspend_method() == SUSPEND_METHOD__ECHO_SYS_POWER_STATE)
++      return system("echo mem > /sys/power/state");
++    else 
++      return ioctl(fd, APM_IOC_SUSPEND, NULL) < 0 ? -errno : 0;
++      
+ }
+@@ -398,7 +462,10 @@
+ int apm_standby(int fd)
+ {
+     sync();
+-    return ioctl(fd, APM_IOC_STANDBY, NULL);
++    if (check_suspend_method() == SUSPEND_METHOD__ECHO_SYS_POWER_STATE)
++      return system("echo mem > /sys/power/state");
++    else
++      return ioctl(fd, APM_IOC_STANDBY, NULL);
+ }
index 6aa91b0544295334824049439dec569bb8aad086..090db98723702913197305ac935ed6305b15bb7e 100644 (file)
@@ -8,6 +8,7 @@ PR = "r10"
 SRC_URI = "${DEBIAN_MIRROR}/main/a/apmd/apmd_${PV}.orig.tar.gz; \
            file://debian.patch;patch=1 \
            file://workaround.patch;patch=1 \
+          file://h6300_suspend_fix.patch;patch=1 \
            file://init \
            file://default \
            file://apmd_proxy \