1/* $NetBSD: tmp121.c,v 1.4 2008/04/04 10:13:59 xtraeme Exp $ */ 2 3/*- 4 * Copyright (c) 2006 Urbana-Champaign Independent Media Center. 5 * Copyright (c) 2006 Garrett D'Amore. 6 * All rights reserved. 7 * 8 * Portions of this code were written by Garrett D'Amore for the 9 * Champaign-Urbana Community Wireless Network Project. 10 * 11 * Redistribution and use in source and binary forms, with or 12 * without modification, are permitted provided that the following 13 * conditions are met: 14 * 1. Redistributions of source code must retain the above copyright 15 * notice, this list of conditions and the following disclaimer. 16 * 2. Redistributions in binary form must reproduce the above 17 * copyright notice, this list of conditions and the following 18 * disclaimer in the documentation and/or other materials provided 19 * with the distribution. 20 * 3. All advertising materials mentioning features or use of this 21 * software must display the following acknowledgements: 22 * This product includes software developed by the Urbana-Champaign 23 * Independent Media Center. 24 * This product includes software developed by Garrett D'Amore. 25 * 4. Urbana-Champaign Independent Media Center's name and Garrett 26 * D'Amore's name may not be used to endorse or promote products 27 * derived from this software without specific prior written permission. 28 * 29 * THIS SOFTWARE IS PROVIDED BY THE URBANA-CHAMPAIGN INDEPENDENT 30 * MEDIA CENTER AND GARRETT D'AMORE ``AS IS'' AND ANY EXPRESS OR 31 * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED 32 * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 33 * ARE DISCLAIMED. IN NO EVENT SHALL THE URBANA-CHAMPAIGN INDEPENDENT 34 * MEDIA CENTER OR GARRETT D'AMORE BE LIABLE FOR ANY DIRECT, INDIRECT, 35 * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT 36 * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; 37 * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER 38 * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, 39 * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 40 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF 41 * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 42 */ 43 44#include <sys/cdefs.h> 45__KERNEL_RCSID(0, "$NetBSD: tmp121.c,v 1.4 2008/04/04 10:13:59 xtraeme Exp $"); 46 47#include <sys/param.h> 48#include <sys/systm.h> 49#include <sys/device.h> 50#include <sys/kernel.h> 51 52#include <dev/sysmon/sysmonvar.h> 53 54#include <dev/spi/spivar.h> 55 56struct tmp121temp_softc { 57 struct spi_handle *sc_sh; 58 59 struct sysmon_envsys *sc_sme; 60 envsys_data_t sc_sensor; 61}; 62 63static int tmp121temp_match(device_t, cfdata_t, void *); 64static void tmp121temp_attach(device_t, device_t, void *); 65 66static void tmp121temp_refresh(struct sysmon_envsys *, envsys_data_t *); 67 68CFATTACH_DECL_NEW(tmp121temp, sizeof(struct tmp121temp_softc), 69 tmp121temp_match, tmp121temp_attach, NULL, NULL); 70 71static int 72tmp121temp_match(device_t parent, cfdata_t cf, void *aux) 73{ 74 struct spi_attach_args *sa = aux; 75 76 /* configure for 10MHz */ 77 if (spi_configure(sa->sa_handle, SPI_MODE_0, 1000000)) 78 return 0; 79 80 return 1; 81} 82 83static void 84tmp121temp_attach(device_t parent, device_t self, void *aux) 85{ 86 struct tmp121temp_softc *sc = device_private(self); 87 struct spi_attach_args *sa = aux; 88 89 aprint_naive(": Temperature Sensor\n"); 90 aprint_normal(": TI TMP121 Temperature Sensor\n"); 91 92 sc->sc_sh = sa->sa_handle; 93 94 sc->sc_sme = sysmon_envsys_create(); 95 sc->sc_sensor.units = ENVSYS_STEMP; 96 sc->sc_sensor.state = ENVSYS_SINVALID; 97 strlcpy(sc->sc_sensor.desc, device_xname(self), 98 sizeof(sc->sc_sensor.desc)); 99 if (sysmon_envsys_sensor_attach(sc->sc_sme, &sc->sc_sensor)) { 100 sysmon_envsys_destroy(sc->sc_sme); 101 return; 102 } 103 104 sc->sc_sme->sme_name = device_xname(self); 105 sc->sc_sme->sme_refresh = tmp121temp_refresh; 106 sc->sc_sme->sme_cookie = sc; 107 108 if (sysmon_envsys_register(sc->sc_sme)) { 109 aprint_error_dev(self, "unable to register with sysmon\n"); 110 sysmon_envsys_destroy(sc->sc_sme); 111 } 112} 113 114static void 115tmp121temp_refresh(struct sysmon_envsys *sme, envsys_data_t *edata) 116{ 117 struct tmp121temp_softc *sc = sme->sme_cookie; 118 uint16_t reg; 119 int16_t sreg; 120 int val; 121 122 if (spi_recv(sc->sc_sh, 2, (uint8_t *)®) != 0) { 123 edata->state = ENVSYS_SINVALID; 124 return; 125 } 126 127 sreg = (int16_t)be16toh(reg); 128 129 /* 130 * convert to uK: 131 * 132 * TMP121 bits: 133 * D15 : sign bit 134 * D14-D3 : data (D14 is MSB) 135 * D2-D0 : zero 136 * 137 * The data is represented in units of 0.0625 deg C. 138 */ 139 sreg >>= 3; 140 val = sreg * 62500 + 273150000; 141 142 edata->value_cur = val; 143 edata->state = ENVSYS_SVALID; 144} 145