mirror of
				https://github.com/smaeul/u-boot.git
				synced 2025-11-04 05:50:17 +00: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;
 | 
						|
}
 |