acpiconf.c revision 120036
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 120036 2003-09-13 20:13:01Z njl $ 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> 4066490Smsmith 41114246Snjl#include <contrib/dev/acpica/acpi.h> 4268475Siwasaki 4365283Siwasaki#define ACPIDEV "/dev/acpi" 4465283Siwasaki 45120036Snjlstatic int acpifd; 46120036Snjl 4765283Siwasakistatic int 48120036Snjlacpi_init() 49120036Snjl{ 50120036Snjl acpifd = open(ACPIDEV, O_RDWR); 51120036Snjl if (acpifd == -1) 52120036Snjl err(EX_OSFILE, ACPIDEV); 53120036Snjl} 54120036Snjl 55120036Snjlstatic int 5665283Siwasakiacpi_enable_disable(int enable) 5765283Siwasaki{ 58120036Snjl if (ioctl(acpifd, enable, NULL) == -1) { 5987121Scjc if (enable == ACPIIO_ENABLE) 6087121Scjc err(EX_IOERR, "enable failed"); 6187121Scjc else 6287121Scjc err(EX_IOERR, "disable failed"); 6365283Siwasaki } 6465283Siwasaki 6565283Siwasaki return (0); 6665283Siwasaki} 6765283Siwasaki 6865283Siwasakistatic int 6965283Siwasakiacpi_sleep(int sleep_type) 7065283Siwasaki{ 71120036Snjl if (ioctl(acpifd, ACPIIO_SETSLPSTATE, &sleep_type) == -1) 7287121Scjc err(EX_IOERR, "sleep type (%d) failed", sleep_type); 7365283Siwasaki 7465283Siwasaki return (0); 7565283Siwasaki} 7665283Siwasaki 77120036Snjlstatic int 78120036Snjlacpi_battinfo(int num) 79120036Snjl{ 80120036Snjl union acpi_battery_ioctl_arg battio; 81120036Snjl const char *pwr_units; 82120036Snjl 83120036Snjl if (num < 0 || num > 64) 84120036Snjl err(EX_USAGE, "invalid battery %d", num); 85120036Snjl 86120036Snjl battio.unit = num; 87120036Snjl if (ioctl(acpifd, ACPIIO_CMBAT_GET_BIF, &battio) == -1) 88120036Snjl err(EX_IOERR, "get battery info (%d) failed", num); 89120036Snjl printf("Battery %d information\n", num); 90120036Snjl if (battio.bif.units == 0) 91120036Snjl pwr_units = "mWh"; 92120036Snjl else 93120036Snjl pwr_units = "mAh"; 94120036Snjl 95120036Snjl printf("Design capacity:\t%d %s\n", battio.bif.dcap, pwr_units); 96120036Snjl printf("Last full capacity:\t%d %s\n", battio.bif.lfcap, pwr_units); 97120036Snjl printf("Technology:\t\t%s\n", battio.bif.btech == 0 ? 98120036Snjl "primary (non-rechargeable)" : "secondary (rechargeable)"); 99120036Snjl printf("Design voltage:\t\t%d mV\n", battio.bif.dvol); 100120036Snjl printf("Capacity (warn):\t%d %s\n", battio.bif.wcap, pwr_units); 101120036Snjl printf("Capacity (low):\t\t%d %s\n", battio.bif.lcap, pwr_units); 102120036Snjl printf("Low/warn granularity:\t%d %s\n", battio.bif.gra1, pwr_units); 103120036Snjl printf("Warn/full granularity:\t%d %s\n", battio.bif.gra2, pwr_units); 104120036Snjl printf("Model number:\t\t%s\n", battio.bif.model); 105120036Snjl printf("Serial number:\t\t%s\n", battio.bif.serial); 106120036Snjl printf("Type:\t\t\t%s\n", battio.bif.type); 107120036Snjl printf("OEM info:\t\t%s\n", battio.bif.oeminfo); 108120036Snjl 109120036Snjl return (0); 110120036Snjl} 111120036Snjl 11268475Siwasakistatic void 11368475Siwasakiusage(const char* prog) 11468475Siwasaki{ 115120036Snjl printf("usage: %s [-deh] [-i batt] [-s 1-5]\n", prog); 11668475Siwasaki exit(0); 11768475Siwasaki} 11868475Siwasaki 11965283Siwasakiint 12065283Siwasakimain(int argc, char *argv[]) 12165283Siwasaki{ 12268475Siwasaki char c, *prog; 12365283Siwasaki int sleep_type; 12465283Siwasaki 12568475Siwasaki prog = argv[0]; 126120036Snjl if (argc < 2) 127120036Snjl usage(prog); 128120036Snjl /* NOTREACHED */ 129120036Snjl 13065283Siwasaki sleep_type = -1; 131120036Snjl acpi_init(); 132120036Snjl while ((c = getopt(argc, argv, "dehi:s:")) != -1) { 13365283Siwasaki switch (c) { 134120036Snjl case 'i': 135120036Snjl acpi_battinfo(atoi(optarg)); 136120036Snjl break; 13768475Siwasaki case 'd': 13868475Siwasaki acpi_enable_disable(ACPIIO_DISABLE); 13968475Siwasaki break; 14065283Siwasaki case 'e': 14165283Siwasaki acpi_enable_disable(ACPIIO_ENABLE); 14265283Siwasaki break; 14365283Siwasaki case 's': 144118127Snjl if (optarg[0] == 'S') 145118127Snjl sleep_type = optarg[1] - '0'; 146118127Snjl else 147118127Snjl sleep_type = optarg[0] - '0'; 14887121Scjc if (sleep_type < 0 || sleep_type > 5) 14987121Scjc errx(EX_USAGE, "invalid sleep type (%d)", 150120036Snjl sleep_type); 15165283Siwasaki break; 152120036Snjl case 'h': 15365283Siwasaki default: 154120036Snjl usage(prog); 155120036Snjl /* NOTREACHED */ 15665283Siwasaki } 15765283Siwasaki } 158120036Snjl argc -= optind; 159120036Snjl argv += optind; 16065283Siwasaki 16165283Siwasaki if (sleep_type != -1) { 16265283Siwasaki sleep(1); /* wait 1 sec. for key-release event */ 16365283Siwasaki acpi_sleep(sleep_type); 16465283Siwasaki } 165120036Snjl 166120036Snjl close(acpifd); 167120036Snjl exit (0); 16865283Siwasaki} 169