- Add ACPI support for FreeBSD

- Bump PORTREVISION

PR:		ports/138489
Submitted by:	mav
Approved by:	maintainer implicit
This commit is contained in:
Thomas Abthorpe 2009-09-08 01:38:23 +00:00
parent cc3dc5c58a
commit 30c04da909
Notes: svn2git 2021-03-31 03:12:20 +00:00
svn path=/head/; revision=241023
4 changed files with 289 additions and 1 deletions

View File

@ -7,7 +7,7 @@
PORTNAME= icewm
PORTVERSION= 1.2.37
PORTREVISION= 1
PORTREVISION= 2
CATEGORIES= x11-wm
MASTER_SITES= SF/${PORTNAME}/${PORTNAME}-stable/${PORTVERSION}

View File

@ -0,0 +1,269 @@
--- ./src/aapm.cc.orig 2009-01-25 09:39:51.000000000 -0500
+++ ./src/aapm.cc 2009-09-03 16:12:50.000000000 -0400
@@ -31,8 +31,12 @@
#include <sys/file.h>
#include <sys/ioctl.h>
#include <sys/types.h>
+#ifdef i386
#include <machine/apm_bios.h>
#endif
+#include <sys/sysctl.h>
+#include <dev/acpica/acpiio.h>
+#endif
#ifdef __NetBSD__
#include <sys/file.h>
@@ -63,7 +67,7 @@
void ApmStr(char *s, bool Tool) {
-#ifdef __FreeBSD__
+#if defined(__FreeBSD__) && defined(i386)
struct apm_info ai;
#elif defined __NetBSD__
struct apm_power_info ai;
@@ -88,7 +92,7 @@
error = 1;
return ;
}
-#ifdef __FreeBSD__
+#if defined(__FreeBSD__) && defined(i386)
if (ioctl(fd,APMIO_GETINFO, &ai) == -1)
{
static int error = 0;
@@ -231,6 +235,7 @@
void YApm::AcpiStr(char *s, bool Tool) {
char buf[80], buf2[80], bat_info[250];
FILE *fd;
+ int acpifd;
//name of the battery
char *BATname;
//battery is present or absent
@@ -250,12 +255,14 @@
//status of ac-adapter online/offline
int ACstatus;
int i;
+ size_t len;
*s='\0';
//assign some default values, in case
//the file in /proc/acpi will contain unexpected values
ACstatus = -1;
+#ifndef __FreeBSD__
if (acpiACName && acpiACName[0] != 0) {
strcat3(buf, "/proc/acpi/ac_adapter/", acpiACName, "/state", sizeof(buf));
fd = fopen(buf, "r");
@@ -285,6 +292,17 @@
fclose(fd);
}
}
+#else
+ len = sizeof(i);
+ if (sysctlbyname("hw.acpi.acline", &i, &len, NULL, 0) >= 0) {
+ if (i == 1)
+ ACstatus = AC_ONLINE;
+ else if (i = 0)
+ ACstatus = AC_OFFLINE;
+ else
+ ACstatus = AC_UNKNOWN;
+ }
+#endif
int n = 0;
for (i = 0; i < batteryNum; i++) {
@@ -299,6 +317,7 @@
BATrate = -1;
BATtime_remain = -1;
+#ifndef __FreeBSD__
strcat3(buf, "/proc/acpi/battery/", BATname, "/state", sizeof(buf));
fd = fopen(buf, "r");
if (fd == NULL) {
@@ -347,10 +366,43 @@
}
fclose(fd);
}
+#else
+ int acpifd;
+
+#define ACPIDEV "/dev/acpi"
+ acpifd = open(ACPIDEV, O_RDONLY);
+ if (acpifd != -1) {
+ union acpi_battery_ioctl_arg battio;
+
+ battio.unit = i;
+ if (ioctl(acpifd, ACPIIO_BATT_GET_BATTINFO, &battio) != -1) {
+ if (battio.battinfo.state != ACPI_BATT_STAT_NOT_PRESENT) {
+ BATpresent = BAT_PRESENT;
+ if (battio.battinfo.state == 0)
+ BATstatus = BAT_FULL;
+ else if (battio.battinfo.state & ACPI_BATT_STAT_CHARGING)
+ BATstatus = BAT_CHARGING;
+ else if (battio.battinfo.state & ACPI_BATT_STAT_DISCHARG)
+ BATstatus = BAT_DISCHARGING;
+ else
+ BATstatus = BAT_UNKNOWN;
+ if (battio.battinfo.cap != -1 && acpiBatteries[i]->capacity_full != -1)
+ BATcapacity_remain = acpiBatteries[i]->capacity_full *
+ battio.battinfo.cap / 100;
+ if (battio.battinfo.min != -1)
+ BATtime_remain = battio.battinfo.min;
+ if (battio.battinfo.rate != -1)
+ BATrate = battio.battinfo.rate;
+ } else
+ BATpresent = BAT_ABSENT;
+ }
+ }
+#endif
if (BATpresent == BAT_PRESENT) { //battery is present now
if (acpiBatteries[i]->present == BAT_ABSENT) { //and previously was absent
//read full-capacity value
+#ifndef __FreeBSD__
strcat3(buf, "/proc/acpi/battery/", BATname, "/info", sizeof(buf));
fd = fopen(buf, "r");
if (fd != NULL) {
@@ -372,6 +424,21 @@
if (BATcapacity_remain > BATcapacity_full && BATcapacity_design > 0)
BATcapacity_full = BATcapacity_design;
}
+#else
+ union acpi_battery_ioctl_arg battio;
+#define UNKNOWN_CAP 0xffffffff
+#define UNKNOWN_VOLTAGE 0xffffffff
+
+ battio.unit = i;
+ if (ioctl(acpifd, ACPIIO_BATT_GET_BIF, &battio) != -1) {
+ if (battio.bif.dcap != UNKNOWN_CAP)
+ BATcapacity_design = battio.bif.dcap;
+ if (battio.bif.lfcap != UNKNOWN_CAP)
+ BATcapacity_full = battio.bif.lfcap;
+ if (BATcapacity_remain > BATcapacity_full && BATcapacity_design > 0)
+ BATcapacity_full = BATcapacity_design;
+ }
+#endif
acpiBatteries[i]->capacity_full = BATcapacity_full;
}
else {
@@ -380,6 +447,11 @@
}
acpiBatteries[i]->present = BATpresent;
+#ifdef __FreeBSD__
+ close(acpifd);
+#endif
+
+ bat_info[0] = 0;
if (!Tool &&
taskBarShowApmTime &&
BATpresent == BAT_PRESENT &&
@@ -387,7 +459,8 @@
BATstatus == BAT_DISCHARGING &&
//did we parse the needed values successfully?
BATcapacity_full >= 0 && BATcapacity_remain >= 0 && BATrate > 0) {
- BATtime_remain = (int) (60 * (double)(BATcapacity_remain) / BATrate);
+ if (BATtime_remain == -1)
+ BATtime_remain = (int) (60 * (double)(BATcapacity_remain) / BATrate);
sprintf(bat_info, "%d:%02d", BATtime_remain / 60, BATtime_remain % 60);
}
else if (BATpresent == BAT_PRESENT &&
@@ -397,17 +470,19 @@
sprintf(bat_info, "%3.0f%%",
100 * (double)BATcapacity_remain / BATcapacity_full);
}
- else {
- //battery is absent or we didn't parse some needed values
- bat_info[0] = 0;
- }
if (BATstatus == BAT_CHARGING) {
if (Tool)
strcat(bat_info, _(" - Charging"));
else
strcat(bat_info, _("C"));
- }
+ } else if (BATstatus == BAT_FULL && Tool)
+ strcat(bat_info, _(" - Full"));
+
+ if (Tool && BATrate > 0) {
+ sprintf(buf, " %d", BATrate);
+ strcat(bat_info, buf);
+ }
if ((n > 0) && (*bat_info)) {
if (Tool)
@@ -738,6 +813,7 @@
YApm::YApm(YWindow *aParent): YWindow(aParent) {
struct dirent **de;
int n, i;
+ size_t s;
FILE *pmu_info;
char buf[80];
FILE *fd;
@@ -747,6 +823,7 @@
fCurrentState = 0;
//search for acpi info first
+#ifndef __FreeBSD__
n = scandir("/sys/class/power_supply", &de, 0, alphasort);
if (n < 0) {
n = scandir("/proc/acpi/battery", &de, 0, alphasort);
@@ -824,7 +901,34 @@
acpiACName = (char*)malloc(sizeof(char));
*acpiACName = '\0';
}
+#else
+ int acpifd;
+
+ acpifd = open(ACPIDEV, O_RDONLY);
+ if (acpifd != -1) {
+ mode = ACPI;
+
+ //scan for batteries
+ i = 0;
+ while (i < 64 && batteryNum < MAX_ACPI_BATTERY_NUM) {
+ union acpi_battery_ioctl_arg battio;
+
+ battio.unit = i;
+ if (ioctl(acpifd, ACPIIO_BATT_GET_BATTINFO, &battio) != -1) {
+ acpiBatteries[batteryNum] =
+ (bat_info*)malloc(sizeof(bat_info));
+ asprintf(&acpiBatteries[batteryNum]->name, "Battery%d", i);
+ //initially set as absent, to force reading of
+ //full-capacity value
+ acpiBatteries[batteryNum]->present = BAT_ABSENT;
+ acpiBatteries[batteryNum]->capacity_full = -1;
+ batteryNum++;
+ }
+ i++;
+ }
+ asprintf(&acpiACName, "AC1");
+#endif
} else if ( (pmu_info = fopen("/proc/pmu/info", "r")) != NULL) {
mode = PMU;
char line[80];
@@ -870,7 +974,21 @@
}
void YApm::updateToolTip() {
- setToolTip(fCurrentState);
+ char s[64] = {' ', ' ', ' ', 0, 0, 0, 0, 0};
+
+ switch (mode) {
+ case ACPI:
+ AcpiStr(s, 1);
+ break;
+ case APM:
+ ApmStr(s, 1);
+ break;
+ case PMU:
+ PmuStr(s, 1);
+ break;
+ }
+
+ setToolTip(s);
}
int YApm::calcInitialWidth() {

View File

@ -0,0 +1,9 @@
--- ./src/aapm.h.orig 2009-01-25 09:39:51.000000000 -0500
+++ ./src/aapm.h 2009-09-03 16:12:50.000000000 -0400
@@ -1,5 +1,5 @@
-#if defined(linux) || (defined (__FreeBSD__) && defined(i386)) || (defined(__NetBSD__) && defined(i386))
+#if defined(linux) || (defined (__FreeBSD__)) || (defined(__NetBSD__) && defined(i386))
#include "ywindow.h"
#include "ytimer.h"

View File

@ -0,0 +1,10 @@
--- ./src/wmtaskbar.cc.orig 2009-01-25 09:39:51.000000000 -0500
+++ ./src/wmtaskbar.cc 2009-09-03 16:12:50.000000000 -0400
@@ -458,6 +458,7 @@
#ifdef CONFIG_APPLET_APM
if (taskBarShowApm && (access(APMDEV, 0) == 0 ||
access("/proc/acpi", 0) == 0 ||
+ access("/dev/acpi", 0) == 0 ||
access("/proc/pmu", R_OK|X_OK) == 0))
{
fApm = new YApm(this);