mirror of
				https://source.denx.de/u-boot/u-boot.git
				synced 2025-10-31 08:21:36 +01:00 
			
		
		
		
	
		
			
				
	
	
		
			66 lines
		
	
	
		
			1.5 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			66 lines
		
	
	
		
			1.5 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
| /*
 | |
|  * DS620 DTT support
 | |
|  *
 | |
|  * (C) Copyright 2014 3ADEV <http://www.3adev.com>
 | |
|  * Written-by: Albert ARIBAUD <albert.aribaud@3adev.fr>
 | |
|  *
 | |
|  * SPDX-License-Identifier:	GPL-2.0+
 | |
|  */
 | |
| 
 | |
| /*
 | |
|  * Dallas Semiconductor's DS1621/1631 Digital Thermometer and Thermostat.
 | |
|  */
 | |
| 
 | |
| #include <common.h>
 | |
| #include <i2c.h>
 | |
| #include <dtt.h>
 | |
| 
 | |
| /*
 | |
|  * Device code
 | |
|  */
 | |
| #define DTT_I2C_DEV_CODE	0x48
 | |
| #define DTT_START_CONVERT	0x51
 | |
| #define DTT_TEMP		0xAA
 | |
| #define DTT_CONFIG		0xAC
 | |
| 
 | |
| /*
 | |
|  * Config register MSB bits
 | |
|  */
 | |
| #define DTT_CONFIG_1SHOT	0x01
 | |
| #define DTT_CONFIG_AUTOC	0x02
 | |
| #define DTT_CONFIG_R0		0x04 /* always 1 */
 | |
| #define DTT_CONFIG_R1		0x08 /* always 1 */
 | |
| #define DTT_CONFIG_TLF	0x10
 | |
| #define DTT_CONFIG_THF	0x20
 | |
| #define DTT_CONFIG_NVB	0x40
 | |
| #define DTT_CONFIG_DONE	0x80
 | |
| 
 | |
| #define CHIP(sensor) (DTT_I2C_DEV_CODE + (sensor & 0x07))
 | |
| 
 | |
| int dtt_init_one(int sensor)
 | |
| {
 | |
| 	uint8_t config = DTT_CONFIG_1SHOT
 | |
| 			| DTT_CONFIG_R0
 | |
| 			| DTT_CONFIG_R1;
 | |
| 	return i2c_write(CHIP(sensor), DTT_CONFIG, 1, &config, 1);
 | |
| }
 | |
| 
 | |
| int dtt_get_temp(int sensor)
 | |
| {
 | |
| 	uint8_t status;
 | |
| 	uint8_t temp[2];
 | |
| 
 | |
| 	/* Start a conversion, may take up to 1 second. */
 | |
| 	i2c_write(CHIP(sensor), DTT_START_CONVERT, 1, NULL, 0);
 | |
| 	do {
 | |
| 		if (i2c_read(CHIP(sensor), DTT_CONFIG, 1, &status, 1))
 | |
| 			/* bail out if I2C error */
 | |
| 			status |= DTT_CONFIG_DONE;
 | |
| 	} while (!(status & DTT_CONFIG_DONE));
 | |
| 	if (i2c_read(CHIP(sensor), DTT_TEMP, 1, temp, 2))
 | |
| 		/* bail out if I2C error */
 | |
| 		return -274; /* below absolute zero == error */
 | |
| 
 | |
| 	return ((int16_t)(temp[1] | (temp[0] << 8))) >> 7;
 | |
| }
 |