Source-Changes-HG archive
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]
[src/trunk]: src Add a new software-only sensor device. This is intended for...
details: https://anonhg.NetBSD.org/src/rev/3e1fd81d4aa0
branches: trunk
changeset: 758104:3e1fd81d4aa0
user: pgoyette <pgoyette%NetBSD.org@localhost>
date: Tue Oct 19 11:55:38 2010 +0000
description:
Add a new software-only sensor device. This is intended for use as a
kernel module, and can be helpful to generate sysmon_envsys events
when creating/modifying powerd scripts. This will also be used in an
upcoming series of atf tests for sysmon_envsys itself.
diffstat:
share/man/man4/swsensor.4 | 69 ++++++++++++++
sys/dev/sysmon/files.sysmon | 7 +-
sys/dev/sysmon/swsensor.c | 206 ++++++++++++++++++++++++++++++++++++++++++
sys/modules/swsensor/Makefile | 11 ++
4 files changed, 291 insertions(+), 2 deletions(-)
diffs (truncated from 316 to 300 lines):
diff -r 6b1db12429ad -r 3e1fd81d4aa0 share/man/man4/swsensor.4
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/share/man/man4/swsensor.4 Tue Oct 19 11:55:38 2010 +0000
@@ -0,0 +1,69 @@
+.\" $NetBSD: swsensor.4,v 1.1 2010/10/19 11:55:38 pgoyette Exp $
+.\"
+.\" Copyright (c) 2010 The NetBSD Foundation
+.\" All rights reserved.
+.\"
+.\" This code is derived from software contributed to The NetBSD Foundation
+.\" by Paul Goyette.
+.\"
+.\" Redistribution and use in source and binary forms, with or without
+.\" modification, are permitted provided that the following conditions
+.\" are met:
+.\" 1. Redistributions of source code must retain the above copyright
+.\" notice, this list of conditions and the following disclaimer.
+.\" 2. Redistributions in binary form must reproduce the above copyright
+.\" notice, this list of conditions and the following disclaimer in the
+.\" documentation and/or other materials provided with the distribution.
+.\"
+.\" THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
+.\" ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
+.\" TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+.\" PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
+.\" BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+.\" CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+.\" SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+.\" INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+.\" CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+.\" ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+.\" POSSIBILITY OF SUCH DAMAGE.
+.\"
+.Dd October 19, 2010
+.Dt SWSENSOR 4
+.Os
+.Sh NAME
+.Nm swsensor
+.Nd software environmental sensor
+.Sh SYNOPSIS
+.Cd "pseudo-device swsensor"
+.Sh DESCRIPTION
+The
+.Nm
+driver provides a software environmental sensor that works with
+.Xr sysctl 8
+and
+.Xr envstat 8 .
+The driver creates a single sensor which is intended to be loaded as a
+kernel module.
+By default, the sensor is of type ENVSYS_UNITS_INTEGER.
+This can be overridden when the module is loaded by passing the desired
+sensor type in the property list with
+.Xr modload 8 .
+For example,
+.Dl Ic modload -i type=1 swsensor
+will create a sensor of type ENVSYS_UNITS_SFANRPM.
+.Pp
+The sensor's raw value can be manually updated by modifying the
+.Xr sysctl 8
+variable
+.Dq hw.swsensor.cur_value .
+.Sh SEE ALSO
+.Xr envstat 8 ,
+.Xr modctl 8 ,
+.Xr sysctl 8
+.Sh HISTORY
+The
+.Nm
+driver was written by
+.An Paul Goyette
+and first appeared in
+.Nx 6.0 .
diff -r 6b1db12429ad -r 3e1fd81d4aa0 sys/dev/sysmon/files.sysmon
--- a/sys/dev/sysmon/files.sysmon Tue Oct 19 00:00:00 2010 +0000
+++ b/sys/dev/sysmon/files.sysmon Tue Oct 19 11:55:38 2010 +0000
@@ -1,4 +1,4 @@
-# $NetBSD: files.sysmon,v 1.12 2010/07/22 14:10:15 pgoyette Exp $
+# $NetBSD: files.sysmon,v 1.13 2010/10/19 11:55:38 pgoyette Exp $
define sysmon_taskq
file dev/sysmon/sysmon_taskq.c sysmon_taskq needs-flag
@@ -19,4 +19,7 @@
sysmon_power
defpseudodev swwdog: sysmon_wdog
-file dev/sysmon/swwdog.c swwdog
+file dev/sysmon/swwdog.c swwdog
+
+defpseudo swsensor: sysmon_envsys
+file dev/sysmon/swsensor.c swsensor
diff -r 6b1db12429ad -r 3e1fd81d4aa0 sys/dev/sysmon/swsensor.c
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/sys/dev/sysmon/swsensor.c Tue Oct 19 11:55:38 2010 +0000
@@ -0,0 +1,206 @@
+/* $NetBSD: swsensor.c,v 1.1 2010/10/19 11:55:38 pgoyette Exp $ */
+/*
+ * Copyright (c) 2008 The NetBSD Foundation, Inc.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND
+ * CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,
+ * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+ * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
+ * IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS BE LIABLE FOR ANY
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE
+ * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER
+ * IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
+ * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
+ * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#include <sys/cdefs.h>
+__KERNEL_RCSID(0, "$NetBSD: swsensor.c,v 1.1 2010/10/19 11:55:38 pgoyette Exp $");
+
+#include <sys/param.h>
+#include <sys/kernel.h>
+#include <sys/module.h>
+#include <sys/sysctl.h>
+
+#include <dev/sysmon/sysmonvar.h>
+
+#include <prop/proplib.h>
+
+int swsensorattach(int);
+
+static struct sysctllog *swsensor_sysctllog = NULL;
+
+static int sensor_value_sysctl = 0;
+
+static struct sysmon_envsys *swsensor_sme;
+static envsys_data_t swsensor_edata;
+
+static int32_t sw_sensor_value;
+
+MODULE(MODULE_CLASS_DRIVER, swsensor, NULL);
+
+/*
+ * Set-up the sysctl interface for setting the sensor's cur_value
+ */
+
+static
+void
+sysctl_swsensor_setup(void)
+{
+ int ret;
+ int node_sysctl_num;
+ const struct sysctlnode *me = NULL;
+
+ KASSERT(swsensor_sysctllog == NULL);
+
+ ret = sysctl_createv(&swsensor_sysctllog, 0, NULL, &me,
+ CTLFLAG_READWRITE,
+ CTLTYPE_NODE, "swsensor", NULL,
+ NULL, 0, NULL, 0,
+ CTL_HW, CTL_CREATE, CTL_EOL);
+ if (ret != 0)
+ return;
+
+ node_sysctl_num = me->sysctl_num;
+ ret = sysctl_createv(&swsensor_sysctllog, 0, NULL, &me,
+ CTLFLAG_READWRITE,
+ CTLTYPE_INT, "cur_value", NULL,
+ NULL, 0, &sw_sensor_value, 0,
+ CTL_HW, node_sysctl_num, CTL_CREATE, CTL_EOL);
+
+ if (ret == 0)
+ sensor_value_sysctl = me->sysctl_num;
+}
+
+/*
+ * "Polling" routine to update sensor value
+ */
+static
+void
+swsensor_refresh(struct sysmon_envsys *sme, envsys_data_t *edata)
+{
+
+ edata->value_cur = sw_sensor_value;
+}
+
+/*
+ * Module management
+ */
+
+static
+int
+swsensor_init(void *arg)
+{
+ int error;
+ prop_dictionary_t pd = (prop_dictionary_t)arg;
+ prop_object_t po = NULL;
+ int pv;
+
+ swsensor_sme = sysmon_envsys_create();
+ if (swsensor_sme == NULL)
+ return ENOTTY;
+
+ swsensor_sme->sme_name = "swsensor";
+ swsensor_sme->sme_cookie = &swsensor_edata;
+ swsensor_sme->sme_refresh = swsensor_refresh;
+ swsensor_sme->sme_set_limits = NULL;
+ swsensor_sme->sme_get_limits = NULL;
+
+ /* See if prop dictionary supplies a sensor type */
+ if (pd != NULL)
+ po = prop_dictionary_get(pd, "type");
+
+ pv = -1;
+ if (po != NULL && prop_object_type(po) == PROP_TYPE_NUMBER)
+ swsensor_edata.units = prop_number_integer_value(po);
+ else
+ swsensor_edata.units = ENVSYS_INTEGER;
+
+ /* See if prop dictionary supplies sensor flags */
+ if (pd != NULL)
+ po = prop_dictionary_get(pd, "flags");
+
+ pv = -1;
+ if (po != NULL && prop_object_type(po) == PROP_TYPE_NUMBER)
+ swsensor_edata.flags = prop_number_integer_value(po);
+ else
+ swsensor_edata.flags = 0;
+
+ swsensor_edata.value_cur = 0;
+ strlcpy(swsensor_edata.desc, "sensor", ENVSYS_DESCLEN);
+
+ error = sysmon_envsys_sensor_attach(swsensor_sme, &swsensor_edata);
+
+ if (error == 0)
+ error = sysmon_envsys_register(swsensor_sme);
+ else {
+ printf("sysmon_envsys_sensor_attach failed: %d\n", error);
+ return error;
+ }
+
+ if (error == 0)
+ sysctl_swsensor_setup();
+ else
+ printf("sysmon_envsys_register failed: %d\n", error);
+
+ return error;
+}
+
+static
+int
+swsensor_fini(void *arg)
+{
+
+ sysmon_envsys_unregister(swsensor_sme);
+
+ sysctl_teardown(&swsensor_sysctllog);
+
+ return 0;
+}
+
+static
+int
+swsensor_modcmd(modcmd_t cmd, void *arg)
+{
+ int ret;
+
+ switch (cmd) {
+ case MODULE_CMD_INIT:
+ ret = swsensor_init(arg);
+ break;
+
+ case MODULE_CMD_FINI:
+ ret = swsensor_fini(arg);
+ break;
+
+ case MODULE_CMD_STAT:
+ default:
+ ret = ENOTTY;
+ }
+
+ return ret;
+}
+
+/*
+ * Initialization entry for rump
+ */
+
+int
+swsensorattach(int n __unused)
+{
+ printf("%s: ", "swsensor0");
+
+ return swsensor_init(NULL);
Home |
Main Index |
Thread Index |
Old Index