]>
Commit | Line | Data |
---|---|---|
6dedf3d4 HS |
1 | /* |
2 | * (C) Copyright 2006 | |
3 | * Heiko Schocher, DENX Software Enginnering <hs@denx.de> | |
4 | * | |
5 | * based on dtt/lm75.c which is ... | |
6 | * | |
7 | * (C) Copyright 2001 | |
8 | * Bill Hunter, Wave 7 Optics, williamhunter@mediaone.net | |
9 | * | |
1a459660 | 10 | * SPDX-License-Identifier: GPL-2.0+ |
6dedf3d4 HS |
11 | */ |
12 | ||
13 | /* | |
14 | * On Semiconductor's LM81 Temperature Sensor | |
15 | */ | |
16 | ||
17 | #include <common.h> | |
6dedf3d4 HS |
18 | #include <i2c.h> |
19 | #include <dtt.h> | |
20 | ||
21 | /* | |
22 | * Device code | |
23 | */ | |
24 | #define DTT_I2C_DEV_CODE 0x2c /* ON Semi's LM81 device */ | |
6ecbb45b MS |
25 | #define DTT_READ_TEMP 0x27 |
26 | #define DTT_CONFIG_TEMP 0x4b | |
27 | #define DTT_TEMP_MAX 0x39 | |
28 | #define DTT_TEMP_HYST 0x3a | |
29 | #define DTT_CONFIG 0x40 | |
6dedf3d4 HS |
30 | |
31 | int dtt_read(int sensor, int reg) | |
32 | { | |
33 | int dlen = 1; | |
34 | uchar data[2]; | |
35 | ||
36 | /* | |
37 | * Calculate sensor address and register. | |
38 | */ | |
39 | sensor = DTT_I2C_DEV_CODE + (sensor & 0x03); /* calculate address of lm81 */ | |
40 | ||
41 | /* | |
42 | * Now try to read the register. | |
43 | */ | |
44 | if (i2c_read(sensor, reg, 1, data, dlen) != 0) | |
45 | return -1; | |
46 | ||
47 | return (int)data[0]; | |
48 | } /* dtt_read() */ | |
49 | ||
50 | ||
51 | int dtt_write(int sensor, int reg, int val) | |
52 | { | |
53 | uchar data; | |
54 | ||
55 | /* | |
56 | * Calculate sensor address and register. | |
57 | */ | |
58 | sensor = DTT_I2C_DEV_CODE + (sensor & 0x03); /* calculate address of lm81 */ | |
59 | ||
60 | data = (char)(val & 0xff); | |
61 | ||
62 | /* | |
63 | * Write value to register. | |
64 | */ | |
a443d314 | 65 | if (i2c_write(sensor, reg, 1, &data, 1) != 0) |
6dedf3d4 HS |
66 | return 1; |
67 | ||
68 | return 0; | |
69 | } /* dtt_write() */ | |
70 | ||
71 | #define DTT_MANU 0x3e | |
72 | #define DTT_REV 0x3f | |
a443d314 | 73 | #define DTT_CONFIG 0x40 |
6dedf3d4 HS |
74 | #define DTT_ADR 0x48 |
75 | ||
780f13a9 | 76 | int dtt_init_one(int sensor) |
6dedf3d4 HS |
77 | { |
78 | int man; | |
79 | int adr; | |
80 | int rev; | |
81 | ||
82 | if (dtt_write (sensor, DTT_CONFIG, 0x01) < 0) | |
83 | return 1; | |
a443d314 HS |
84 | /* The LM81 needs 400ms to get the correct values ... */ |
85 | udelay (400000); | |
6dedf3d4 HS |
86 | man = dtt_read (sensor, DTT_MANU); |
87 | if (man != 0x01) | |
88 | return 1; | |
89 | adr = dtt_read (sensor, DTT_ADR); | |
90 | if (adr < 0) | |
91 | return 1; | |
92 | rev = dtt_read (sensor, DTT_REV); | |
93 | if (adr < 0) | |
94 | return 1; | |
95 | ||
3426d65d | 96 | debug ("DTT: Found LM81@%x Rev: %d\n", adr, rev); |
6dedf3d4 | 97 | return 0; |
780f13a9 | 98 | } /* dtt_init_one() */ |
6dedf3d4 HS |
99 | |
100 | ||
6dedf3d4 | 101 | #define TEMP_FROM_REG(temp) \ |
f11033e7 WD |
102 | ((temp)<256?((((temp)&0x1fe) >> 1) * 10) + ((temp) & 1) * 5: \ |
103 | ((((temp)&0x1fe) >> 1) -255) * 10 - ((temp) & 1) * 5) \ | |
6dedf3d4 HS |
104 | |
105 | int dtt_get_temp(int sensor) | |
106 | { | |
107 | int val = dtt_read (sensor, DTT_READ_TEMP); | |
108 | int tmpcnf = dtt_read (sensor, DTT_CONFIG_TEMP); | |
109 | ||
110 | return (TEMP_FROM_REG((val << 1) + ((tmpcnf & 0x80) >> 7))) / 10; | |
111 | } /* dtt_get_temp() */ |