acpiconf.c revision 126609
165283Siwasaki/*- 265283Siwasaki * Copyright (c) 1999 Mitsuru IWASAKI <iwasaki@FreeBSD.org> 365283Siwasaki * All rights reserved. 465283Siwasaki * 565283Siwasaki * Redistribution and use in source and binary forms, with or without 665283Siwasaki * modification, are permitted provided that the following conditions 765283Siwasaki * are met: 865283Siwasaki * 1. Redistributions of source code must retain the above copyright 965283Siwasaki * notice, this list of conditions and the following disclaimer. 1065283Siwasaki * 2. Redistributions in binary form must reproduce the above copyright 1165283Siwasaki * notice, this list of conditions and the following disclaimer in the 1265283Siwasaki * documentation and/or other materials provided with the distribution. 1365283Siwasaki * 1465283Siwasaki * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND 1565283Siwasaki * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 1665283Siwasaki * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 1765283Siwasaki * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE 1865283Siwasaki * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 1965283Siwasaki * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 2065283Siwasaki * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 2165283Siwasaki * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 2265283Siwasaki * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 2365283Siwasaki * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 2465283Siwasaki * SUCH DAMAGE. 2565283Siwasaki * 2665283Siwasaki * $Id: acpiconf.c,v 1.5 2000/08/08 14:12:19 iwasaki Exp $ 2765283Siwasaki * $FreeBSD: head/usr.sbin/acpi/acpiconf/acpiconf.c 126609 2004-03-04 17:03:49Z takawata $ 2865283Siwasaki */ 2965283Siwasaki 3065283Siwasaki#include <sys/param.h> 3165283Siwasaki 3265283Siwasaki#include <err.h> 3365283Siwasaki#include <fcntl.h> 3465283Siwasaki#include <stdio.h> 3566490Smsmith#include <sys/ioctl.h> 3687121Scjc#include <sysexits.h> 3765283Siwasaki#include <unistd.h> 3865283Siwasaki 3968475Siwasaki#include <dev/acpica/acpiio.h> 40114246Snjl#include <contrib/dev/acpica/acpi.h> 4168475Siwasaki 42124001Snjl#define ACPIDEV "/dev/acpi" 43124001Snjl#define RC_SUSPEND_PATH "/etc/rc.suspend" 44124001Snjl#define RC_RESUME_PATH "/etc/rc.resume" 4565283Siwasaki 46120036Snjlstatic int acpifd; 4765283Siwasakistatic int 48120036Snjlacpi_init() 49120036Snjl{ 50120036Snjl acpifd = open(ACPIDEV, O_RDWR); 51126609Stakawata if (acpifd == -1){ 52126609Stakawata acpifd = open(ACPIDEV, O_RDONLY); 53126609Stakawata } 54126609Stakawata if (acpifd == -1){ 55120036Snjl err(EX_OSFILE, ACPIDEV); 56126609Stakawata } 57120036Snjl} 58120036Snjl 59120036Snjlstatic int 6065283Siwasakiacpi_enable_disable(int enable) 6165283Siwasaki{ 62120036Snjl if (ioctl(acpifd, enable, NULL) == -1) { 6387121Scjc if (enable == ACPIIO_ENABLE) 6487121Scjc err(EX_IOERR, "enable failed"); 6587121Scjc else 6687121Scjc err(EX_IOERR, "disable failed"); 6765283Siwasaki } 6865283Siwasaki 6965283Siwasaki return (0); 7065283Siwasaki} 7165283Siwasaki 7265283Siwasakistatic int 7365283Siwasakiacpi_sleep(int sleep_type) 7465283Siwasaki{ 75124001Snjl char cmd[64]; 76124001Snjl int ret; 77124001Snjl 78124001Snjl /* Run the suspend rc script, if available. */ 79124001Snjl if (access(RC_SUSPEND_PATH, X_OK) == 0) { 80124001Snjl snprintf(cmd, sizeof(cmd), "%s acpi %d", RC_SUSPEND_PATH, 81124001Snjl sleep_type); 82124001Snjl system(cmd); 83124001Snjl } 84124001Snjl 85124001Snjl ret = ioctl(acpifd, ACPIIO_SETSLPSTATE, &sleep_type); 86124001Snjl 87124001Snjl /* Run the resume rc script, if available. */ 88124001Snjl if (access(RC_RESUME_PATH, X_OK) == 0) { 89124001Snjl snprintf(cmd, sizeof(cmd), "%s acpi %d", RC_RESUME_PATH, 90124001Snjl sleep_type); 91124001Snjl system(cmd); 92124001Snjl } 93124001Snjl 94124001Snjl if (ret != 0) 9587121Scjc err(EX_IOERR, "sleep type (%d) failed", sleep_type); 9665283Siwasaki 9765283Siwasaki return (0); 9865283Siwasaki} 9965283Siwasaki 100120036Snjlstatic int 101120036Snjlacpi_battinfo(int num) 102120036Snjl{ 103120036Snjl union acpi_battery_ioctl_arg battio; 104120036Snjl const char *pwr_units; 105120036Snjl 106120036Snjl if (num < 0 || num > 64) 107120036Snjl err(EX_USAGE, "invalid battery %d", num); 108120036Snjl 109120036Snjl battio.unit = num; 110120036Snjl if (ioctl(acpifd, ACPIIO_CMBAT_GET_BIF, &battio) == -1) 111120036Snjl err(EX_IOERR, "get battery info (%d) failed", num); 112120036Snjl printf("Battery %d information\n", num); 113120036Snjl if (battio.bif.units == 0) 114120036Snjl pwr_units = "mWh"; 115120036Snjl else 116120036Snjl pwr_units = "mAh"; 117120036Snjl 118120036Snjl printf("Design capacity:\t%d %s\n", battio.bif.dcap, pwr_units); 119120036Snjl printf("Last full capacity:\t%d %s\n", battio.bif.lfcap, pwr_units); 120120036Snjl printf("Technology:\t\t%s\n", battio.bif.btech == 0 ? 121120036Snjl "primary (non-rechargeable)" : "secondary (rechargeable)"); 122120036Snjl printf("Design voltage:\t\t%d mV\n", battio.bif.dvol); 123120036Snjl printf("Capacity (warn):\t%d %s\n", battio.bif.wcap, pwr_units); 124120036Snjl printf("Capacity (low):\t\t%d %s\n", battio.bif.lcap, pwr_units); 125120036Snjl printf("Low/warn granularity:\t%d %s\n", battio.bif.gra1, pwr_units); 126120036Snjl printf("Warn/full granularity:\t%d %s\n", battio.bif.gra2, pwr_units); 127120036Snjl printf("Model number:\t\t%s\n", battio.bif.model); 128120036Snjl printf("Serial number:\t\t%s\n", battio.bif.serial); 129120036Snjl printf("Type:\t\t\t%s\n", battio.bif.type); 130120036Snjl printf("OEM info:\t\t%s\n", battio.bif.oeminfo); 131120036Snjl 132120036Snjl return (0); 133120036Snjl} 134120036Snjl 13568475Siwasakistatic void 13668475Siwasakiusage(const char* prog) 13768475Siwasaki{ 138120036Snjl printf("usage: %s [-deh] [-i batt] [-s 1-5]\n", prog); 13968475Siwasaki exit(0); 14068475Siwasaki} 14168475Siwasaki 14265283Siwasakiint 14365283Siwasakimain(int argc, char *argv[]) 14465283Siwasaki{ 14568475Siwasaki char c, *prog; 14665283Siwasaki int sleep_type; 14765283Siwasaki 14868475Siwasaki prog = argv[0]; 149120036Snjl if (argc < 2) 150120036Snjl usage(prog); 151120036Snjl /* NOTREACHED */ 152120036Snjl 15365283Siwasaki sleep_type = -1; 154120036Snjl acpi_init(); 155120036Snjl while ((c = getopt(argc, argv, "dehi:s:")) != -1) { 15665283Siwasaki switch (c) { 157120036Snjl case 'i': 158120036Snjl acpi_battinfo(atoi(optarg)); 159120036Snjl break; 16068475Siwasaki case 'd': 16168475Siwasaki acpi_enable_disable(ACPIIO_DISABLE); 16268475Siwasaki break; 16365283Siwasaki case 'e': 16465283Siwasaki acpi_enable_disable(ACPIIO_ENABLE); 16565283Siwasaki break; 16665283Siwasaki case 's': 167118127Snjl if (optarg[0] == 'S') 168118127Snjl sleep_type = optarg[1] - '0'; 169118127Snjl else 170118127Snjl sleep_type = optarg[0] - '0'; 17187121Scjc if (sleep_type < 0 || sleep_type > 5) 17287121Scjc errx(EX_USAGE, "invalid sleep type (%d)", 173120036Snjl sleep_type); 17465283Siwasaki break; 175120036Snjl case 'h': 17665283Siwasaki default: 177120036Snjl usage(prog); 178120036Snjl /* NOTREACHED */ 17965283Siwasaki } 18065283Siwasaki } 181120036Snjl argc -= optind; 182120036Snjl argv += optind; 18365283Siwasaki 18465283Siwasaki if (sleep_type != -1) { 18565283Siwasaki sleep(1); /* wait 1 sec. for key-release event */ 18665283Siwasaki acpi_sleep(sleep_type); 18765283Siwasaki } 188120036Snjl 189120036Snjl close(acpifd); 190120036Snjl exit (0); 19165283Siwasaki} 192