uboot/drivers/hwmon/lm75.c
<<
>>
Prefs
   1/*
   2 * (C) Copyright 2001
   3 * Bill Hunter,  Wave 7 Optics, williamhunter@mediaone.net
   4 *
   5 * SPDX-License-Identifier:     GPL-2.0+
   6 */
   7
   8/*
   9 * On Semiconductor's LM75 Temperature Sensor
  10 */
  11
  12#include <common.h>
  13#include <i2c.h>
  14#include <dtt.h>
  15
  16/*
  17 * Device code
  18 */
  19#if defined(CONFIG_SYS_I2C_DTT_ADDR)
  20#define DTT_I2C_DEV_CODE CONFIG_SYS_I2C_DTT_ADDR
  21#else
  22#define DTT_I2C_DEV_CODE 0x48                   /* ON Semi's LM75 device */
  23#endif
  24#define DTT_READ_TEMP           0x0
  25#define DTT_CONFIG              0x1
  26#define DTT_TEMP_HYST           0x2
  27#define DTT_TEMP_SET            0x3
  28
  29int dtt_read(int sensor, int reg)
  30{
  31        int dlen;
  32        uchar data[2];
  33
  34#ifdef CONFIG_DTT_AD7414
  35        /*
  36         * On AD7414 the first value upon bootup is not read correctly.
  37         * This is most likely because of the 800ms update time of the
  38         * temp register in normal update mode. To get current values
  39         * each time we issue the "dtt" command including upon powerup
  40         * we switch into one-short mode.
  41         *
  42         * Issue one-shot mode command
  43         */
  44        dtt_write(sensor, DTT_CONFIG, 0x64);
  45#endif
  46
  47        /* Validate 'reg' param */
  48        if((reg < 0) || (reg > 3))
  49                return -1;
  50
  51        /* Calculate sensor address and register. */
  52        sensor = DTT_I2C_DEV_CODE + (sensor & 0x07);
  53
  54        /* Prepare to handle 2 byte result. */
  55        if ((reg == DTT_READ_TEMP) ||
  56                (reg == DTT_TEMP_HYST) ||
  57                (reg == DTT_TEMP_SET))
  58                        dlen = 2;
  59        else
  60                dlen = 1;
  61
  62        /* Now try to read the register. */
  63        if (i2c_read(sensor, reg, 1, data, dlen) != 0)
  64                return -1;
  65
  66        /* Handle 2 byte result. */
  67        if (dlen == 2)
  68                return ((int)((short)data[1] + (((short)data[0]) << 8)));
  69
  70        return (int)data[0];
  71} /* dtt_read() */
  72
  73
  74int dtt_write(int sensor, int reg, int val)
  75{
  76        int dlen;
  77        uchar data[2];
  78
  79        /* Validate 'reg' param */
  80        if ((reg < 0) || (reg > 3))
  81                return 1;
  82
  83        /* Calculate sensor address and register. */
  84        sensor = DTT_I2C_DEV_CODE + (sensor & 0x07);
  85
  86        /* Handle 2 byte values. */
  87        if ((reg == DTT_READ_TEMP) ||
  88                (reg == DTT_TEMP_HYST) ||
  89                (reg == DTT_TEMP_SET)) {
  90                        dlen = 2;
  91                data[0] = (char)((val >> 8) & 0xff);    /* MSB first */
  92                data[1] = (char)(val & 0xff);
  93        } else {
  94                dlen = 1;
  95                data[0] = (char)(val & 0xff);
  96        }
  97
  98        /* Write value to register. */
  99        if (i2c_write(sensor, reg, 1, data, dlen) != 0)
 100                return 1;
 101
 102        return 0;
 103} /* dtt_write() */
 104
 105
 106int dtt_init_one(int sensor)
 107{
 108        int val;
 109
 110        /* Setup TSET ( trip point ) register */
 111        val = ((CONFIG_SYS_DTT_MAX_TEMP * 2) << 7) & 0xff80; /* trip */
 112        if (dtt_write(sensor, DTT_TEMP_SET, val) != 0)
 113                return 1;
 114
 115        /* Setup THYST ( untrip point ) register - Hysteresis */
 116        val = (((CONFIG_SYS_DTT_MAX_TEMP - CONFIG_SYS_DTT_HYSTERESIS) * 2) << 7) & 0xff80;
 117        if (dtt_write(sensor, DTT_TEMP_HYST, val) != 0)
 118                return 1;
 119
 120        /* Setup configuraton register */
 121#ifdef CONFIG_DTT_AD7414
 122        /* config = alert active low and disabled */
 123        val = 0x60;
 124#else
 125        /* config = 6 sample integration, int mode, active low, and enable */
 126        val = 0x18;
 127#endif
 128        if (dtt_write(sensor, DTT_CONFIG, val) != 0)
 129                return 1;
 130
 131        return 0;
 132} /* dtt_init_one() */
 133
 134int dtt_get_temp(int sensor)
 135{
 136        int const ret = dtt_read(sensor, DTT_READ_TEMP);
 137
 138        if (ret < 0) {
 139                printf("DTT temperature read failed.\n");
 140                return 0;
 141        }
 142        return (int)((int16_t) ret / 256);
 143} /* dtt_get_temp() */
 144