]>
Commit | Line | Data |
---|---|---|
c609719b WD |
1 | /* |
2 | * (C) Copyright 2001 | |
3 | * Bill Hunter, Wave 7 Optics, williamhunter@mediaone.net | |
4 | * | |
1a459660 | 5 | * SPDX-License-Identifier: GPL-2.0+ |
c609719b WD |
6 | */ |
7 | ||
8 | /* | |
9 | * On Semiconductor's LM75 Temperature Sensor | |
10 | */ | |
11 | ||
12 | #include <common.h> | |
c609719b WD |
13 | #include <i2c.h> |
14 | #include <dtt.h> | |
15 | ||
c609719b WD |
16 | /* |
17 | * Device code | |
18 | */ | |
6d0f6bcf JCPV |
19 | #if defined(CONFIG_SYS_I2C_DTT_ADDR) |
20 | #define DTT_I2C_DEV_CODE CONFIG_SYS_I2C_DTT_ADDR | |
9ebbb54f | 21 | #else |
c609719b | 22 | #define DTT_I2C_DEV_CODE 0x48 /* ON Semi's LM75 device */ |
9ebbb54f | 23 | #endif |
6ecbb45b MS |
24 | #define DTT_READ_TEMP 0x0 |
25 | #define DTT_CONFIG 0x1 | |
26 | #define DTT_TEMP_HYST 0x2 | |
27 | #define DTT_TEMP_SET 0x3 | |
c609719b WD |
28 | |
29 | int dtt_read(int sensor, int reg) | |
30 | { | |
12f16781 HS |
31 | int dlen; |
32 | uchar data[2]; | |
c609719b | 33 | |
4d91d1df | 34 | #ifdef CONFIG_DTT_AD7414 |
12f16781 HS |
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); | |
4d91d1df SR |
45 | #endif |
46 | ||
12f16781 HS |
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]; | |
c609719b WD |
71 | } /* dtt_read() */ |
72 | ||
73 | ||
74 | int dtt_write(int sensor, int reg, int val) | |
75 | { | |
12f16781 HS |
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; | |
c609719b WD |
103 | } /* dtt_write() */ |
104 | ||
105 | ||
780f13a9 | 106 | int dtt_init_one(int sensor) |
c609719b | 107 | { |
12f16781 HS |
108 | int val; |
109 | ||
110 | /* Setup TSET ( trip point ) register */ | |
6d0f6bcf | 111 | val = ((CONFIG_SYS_DTT_MAX_TEMP * 2) << 7) & 0xff80; /* trip */ |
12f16781 HS |
112 | if (dtt_write(sensor, DTT_TEMP_SET, val) != 0) |
113 | return 1; | |
114 | ||
115 | /* Setup THYST ( untrip point ) register - Hysteresis */ | |
6d0f6bcf | 116 | val = (((CONFIG_SYS_DTT_MAX_TEMP - CONFIG_SYS_DTT_HYSTERESIS) * 2) << 7) & 0xff80; |
12f16781 HS |
117 | if (dtt_write(sensor, DTT_TEMP_HYST, val) != 0) |
118 | return 1; | |
119 | ||
120 | /* Setup configuraton register */ | |
887e2ec9 | 121 | #ifdef CONFIG_DTT_AD7414 |
12f16781 HS |
122 | /* config = alert active low and disabled */ |
123 | val = 0x60; | |
887e2ec9 | 124 | #else |
12f16781 HS |
125 | /* config = 6 sample integration, int mode, active low, and enable */ |
126 | val = 0x18; | |
887e2ec9 | 127 | #endif |
12f16781 HS |
128 | if (dtt_write(sensor, DTT_CONFIG, val) != 0) |
129 | return 1; | |
c609719b | 130 | |
12f16781 | 131 | return 0; |
780f13a9 | 132 | } /* dtt_init_one() */ |
c609719b WD |
133 | |
134 | int dtt_get_temp(int sensor) | |
135 | { | |
12f16781 | 136 | int const ret = dtt_read(sensor, DTT_READ_TEMP); |
d01b847c | 137 | |
12f16781 HS |
138 | if (ret < 0) { |
139 | printf("DTT temperature read failed.\n"); | |
140 | return 0; | |
141 | } | |
142 | return (int)((int16_t) ret / 256); | |
c609719b | 143 | } /* dtt_get_temp() */ |