1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34#include <common.h>
35
36#include <i2c.h>
37#include <dtt.h>
38
39#define DTT_READ_LOC_VALUE 0x00
40#define DTT_READ_REM_VALUE 0x01
41#define DTT_READ_STATUS 0x02
42#define DTT_READ_CONFIG 0x03
43#define DTT_READ_CONVRATE 0x04
44#define DTT_READ_LOC_HIGHLIM 0x05
45#define DTT_READ_LOC_LOWLIM 0x06
46#define DTT_READ_REM_HIGHLIM 0x07
47#define DTT_READ_REM_LOWLIM 0x08
48#define DTT_READ_DEVID 0xfe
49
50#define DTT_WRITE_CONFIG 0x09
51#define DTT_WRITE_CONVRATE 0x0a
52#define DTT_WRITE_LOC_HIGHLIM 0x0b
53#define DTT_WRITE_LOC_LOWLIM 0x0c
54#define DTT_WRITE_REM_HIGHLIM 0x0d
55#define DTT_WRITE_REM_LOWLIM 0x0e
56#define DTT_WRITE_ONESHOT 0x0f
57
58#define DTT_STATUS_BUSY 0x80
59#define DTT_STATUS_LHIGH 0x40
60#define DTT_STATUS_LLOW 0x20
61#define DTT_STATUS_RHIGH 0x10
62#define DTT_STATUS_RLOW 0x08
63#define DTT_STATUS_OPEN 0x04
64
65#define DTT_CONFIG_ALERT_MASKED 0x80
66#define DTT_CONFIG_STANDBY 0x40
67
68#define DTT_ADM1021_DEVID 0x41
69
70typedef
71 struct {
72 uint i2c_addr:7;
73 uint conv_rate:3;
74 uint enable_alert:1;
75 uint enable_local:1;
76 uint max_local:8;
77 uint min_local:8;
78 uint enable_remote:1;
79 uint max_remote:8;
80 uint min_remote:8;
81 }
82dtt_cfg_t;
83
84dtt_cfg_t dttcfg[] = CONFIG_SYS_DTT_ADM1021;
85
86int
87dtt_read (int sensor, int reg)
88{
89 dtt_cfg_t *dcp = &dttcfg[sensor >> 1];
90 uchar data;
91
92 if (i2c_read(dcp->i2c_addr, reg, 1, &data, 1) != 0)
93 return -1;
94
95 return (int)data;
96}
97
98int
99dtt_write (int sensor, int reg, int val)
100{
101 dtt_cfg_t *dcp = &dttcfg[sensor >> 1];
102 uchar data;
103
104 data = (uchar)(val & 0xff);
105
106 if (i2c_write(dcp->i2c_addr, reg, 1, &data, 1) != 0)
107 return 1;
108
109 return 0;
110}
111
112static int
113_dtt_init (int sensor)
114{
115 dtt_cfg_t *dcp = &dttcfg[sensor >> 1];
116 int reg, val;
117
118 if (((sensor & 1) == 0 ? dcp->enable_local : dcp->enable_remote) == 0)
119 return 1;
120
121
122
123
124 if ((sensor & 1) == 0) {
125 reg = DTT_WRITE_LOC_HIGHLIM;
126 val = dcp->max_local;
127 }
128 else {
129 reg = DTT_WRITE_REM_HIGHLIM;
130 val = dcp->max_remote;
131 }
132 if (dtt_write (sensor, reg, val) != 0)
133 return 1;
134
135
136
137
138 if ((sensor & 1) == 0) {
139 reg = DTT_WRITE_LOC_LOWLIM;
140 val = dcp->min_local;
141 }
142 else {
143 reg = DTT_WRITE_REM_LOWLIM;
144 val = dcp->min_remote;
145 }
146 if (dtt_write (sensor, reg, val) != 0)
147 return 1;
148
149
150
151
152
153
154 if (dtt_write (sensor, DTT_WRITE_CONVRATE, dcp->conv_rate) != 0)
155 return 1;
156
157
158
159
160 val = 0;
161 if (dcp->enable_alert == 0)
162 val |= DTT_CONFIG_ALERT_MASKED;
163 if (dtt_write (sensor, DTT_WRITE_CONFIG, val) != 0)
164 return 1;
165
166 return 0;
167}
168
169int
170dtt_init (void)
171{
172 int i;
173 unsigned char sensors[] = CONFIG_DTT_SENSORS;
174 const char *const header = "DTT: ";
175
176
177 I2C_SET_BUS(CONFIG_SYS_DTT_BUS_NUM);
178
179 for (i = 0; i < sizeof(sensors); i++) {
180 if (_dtt_init(sensors[i]) != 0)
181 printf ("%s%d FAILED INIT\n", header, i+1);
182 else
183 printf ("%s%d is %i C\n", header, i+1,
184 dtt_get_temp(sensors[i]));
185 }
186
187 return (0);
188}
189
190int
191dtt_get_temp (int sensor)
192{
193 signed char val;
194
195 if ((sensor & 1) == 0)
196 val = dtt_read(sensor, DTT_READ_LOC_VALUE);
197 else
198 val = dtt_read(sensor, DTT_READ_REM_VALUE);
199
200 return (int) val;
201}
202