1 /* $OpenBSD: sensors.h,v 1.24 2007/06/24 05:34:35 dlg Exp $ */ 2 3 /* 4 * Copyright (c) 2003, 2004 Alexander Yurchenko <grange@openbsd.org> 5 * Copyright (c) 2006 Constantine A. Murenin <cnst+openbsd@bugmail.mojo.ru> 6 * All rights reserved. 7 * 8 * Redistribution and use in source and binary forms, with or without 9 * modification, are permitted provided that the following conditions 10 * are met: 11 * 1. Redistributions of source code must retain the above copyright 12 * notice, this list of conditions and the following disclaimer. 13 * 2. Redistributions in binary form must reproduce the above copyright 14 * notice, this list of conditions and the following disclaimer in the 15 * documentation and/or other materials provided with the distribution. 16 * 17 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR 18 * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES 19 * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. 20 * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, 21 * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT 22 * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 23 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 24 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 25 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF 26 * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 27 */ 28 29 #ifndef _SYS_SENSORS_H_ 30 #define _SYS_SENSORS_H_ 31 32 /* Sensor types */ 33 enum sensor_type { 34 SENSOR_TEMP, /* temperature (muK) */ 35 SENSOR_FANRPM, /* fan revolution speed */ 36 SENSOR_VOLTS_DC, /* voltage (muV DC) */ 37 SENSOR_VOLTS_AC, /* voltage (muV AC) */ 38 SENSOR_OHMS, /* resistance */ 39 SENSOR_WATTS, /* power */ 40 SENSOR_AMPS, /* current (muA) */ 41 SENSOR_WATTHOUR, /* power capacity */ 42 SENSOR_AMPHOUR, /* power capacity */ 43 SENSOR_INDICATOR, /* boolean indicator */ 44 SENSOR_INTEGER, /* generic integer value */ 45 SENSOR_PERCENT, /* percent */ 46 SENSOR_LUX, /* illuminance (mulx) */ 47 SENSOR_DRIVE, /* disk */ 48 SENSOR_TIMEDELTA, /* system time error (nSec) */ 49 SENSOR_MAX_TYPES 50 }; 51 52 #ifndef _KERNEL 53 static const char * const sensor_type_s[SENSOR_MAX_TYPES + 1] = { 54 "temp", 55 "fan", 56 "volt", 57 "acvolt", 58 "resistance", 59 "power", 60 "current", 61 "watthour", 62 "amphour", 63 "indicator", 64 "raw", 65 "percent", 66 "illuminance", 67 "drive", 68 "timedelta", 69 "undefined" 70 }; 71 #endif /* !_KERNEL */ 72 73 #define SENSOR_DRIVE_EMPTY 1 74 #define SENSOR_DRIVE_READY 2 75 #define SENSOR_DRIVE_POWERUP 3 76 #define SENSOR_DRIVE_ONLINE 4 77 #define SENSOR_DRIVE_IDLE 5 78 #define SENSOR_DRIVE_ACTIVE 6 79 #define SENSOR_DRIVE_REBUILD 7 80 #define SENSOR_DRIVE_POWERDOWN 8 81 #define SENSOR_DRIVE_FAIL 9 82 #define SENSOR_DRIVE_PFAIL 10 83 84 /* Sensor states */ 85 enum sensor_status { 86 SENSOR_S_UNSPEC, /* status is unspecified */ 87 SENSOR_S_OK, /* status is ok */ 88 SENSOR_S_WARN, /* status is warning */ 89 SENSOR_S_CRIT, /* status is critical */ 90 SENSOR_S_UNKNOWN /* status is unknown */ 91 }; 92 93 /* Sensor data: 94 * New fields should be added at the end to encourage backwards compat 95 */ 96 struct sensor { 97 char desc[32]; /* sensor description, may be empty */ 98 struct timeval tv; /* sensor value last change time */ 99 int64_t value; /* current value */ 100 enum sensor_type type; /* sensor type */ 101 enum sensor_status status; /* sensor status */ 102 int numt; /* sensor number of .type type */ 103 int flags; /* sensor flags */ 104 #define SENSOR_FINVALID 0x0001 /* sensor is invalid */ 105 #define SENSOR_FUNKNOWN 0x0002 /* sensor value is unknown */ 106 }; 107 108 /* Sensor device data: 109 * New fields should be added at the end to encourage backwards compat 110 */ 111 struct sensordev { 112 int num; /* sensordev number */ 113 char xname[16]; /* unix device name */ 114 int maxnumt[SENSOR_MAX_TYPES]; 115 int sensors_count; 116 }; 117 118 #define MAXSENSORDEVICES 32 119 120 #ifdef _KERNEL 121 122 /* Sensor data */ 123 struct ksensor { 124 SLIST_ENTRY(ksensor) list; /* device-scope list */ 125 char desc[32]; /* sensor description, may be empty */ 126 struct timeval tv; /* sensor value last change time */ 127 int64_t value; /* current value */ 128 enum sensor_type type; /* sensor type */ 129 enum sensor_status status; /* sensor status */ 130 int numt; /* sensor number of .type type */ 131 int flags; /* sensor flags, ie. SENSOR_FINVALID */ 132 }; 133 SLIST_HEAD(ksensors_head, ksensor); 134 135 /* Sensor device data */ 136 struct ksensordev { 137 SLIST_ENTRY(ksensordev) list; 138 int num; /* sensordev number */ 139 char xname[16]; /* unix device name */ 140 int maxnumt[SENSOR_MAX_TYPES]; 141 int sensors_count; 142 struct ksensors_head sensors_list; 143 }; 144 145 /* struct ksensordev */ 146 void sensordev_install(struct ksensordev *); 147 void sensordev_deinstall(struct ksensordev *); 148 struct ksensordev *sensordev_get(int); 149 150 /* struct ksensor */ 151 void sensor_attach(struct ksensordev *, struct ksensor *); 152 void sensor_detach(struct ksensordev *, struct ksensor *); 153 struct ksensor *sensor_find(int, enum sensor_type, int); 154 155 /* task scheduling */ 156 struct sensor_task; 157 struct sensor_task *sensor_task_register(void *, void (*)(void *), int); 158 void sensor_task_unregister(struct sensor_task *); 159 160 #endif /* _KERNEL */ 161 162 #endif /* !_SYS_SENSORS_H_ */