tmp105: Create API for TMP105 temperature sensor.
* Define enum for TMP105 registers * Move tmp105_set() from I2C to TMP105 header * Document units and range of temperature as preconditions Reviewed-by: Andreas Färber <afaerber@suse.de> Signed-off-by: Alex Horn <alex.horn@cs.ox.ac.uk> Signed-off-by: Anthony Liguori <aliguori@us.ibm.com>
This commit is contained in:
		
							parent
							
								
									eac236ea7b
								
							
						
					
					
						commit
						2915efbfa8
					
				
							
								
								
									
										3
									
								
								hw/i2c.h
									
									
									
									
									
								
							
							
						
						
									
										3
									
								
								hw/i2c.h
									
									
									
									
									
								
							@ -73,9 +73,6 @@ void *wm8750_dac_buffer(void *opaque, int samples);
 | 
				
			|||||||
void wm8750_dac_commit(void *opaque);
 | 
					void wm8750_dac_commit(void *opaque);
 | 
				
			||||||
void wm8750_set_bclk_in(void *opaque, int new_hz);
 | 
					void wm8750_set_bclk_in(void *opaque, int new_hz);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/* tmp105.c */
 | 
					 | 
				
			||||||
void tmp105_set(I2CSlave *i2c, int temp);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
/* lm832x.c */
 | 
					/* lm832x.c */
 | 
				
			||||||
void lm832x_key_event(DeviceState *dev, int key, int state);
 | 
					void lm832x_key_event(DeviceState *dev, int key, int state);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
				
			|||||||
							
								
								
									
										17
									
								
								hw/tmp105.c
									
									
									
									
									
								
							
							
						
						
									
										17
									
								
								hw/tmp105.c
									
									
									
									
									
								
							@ -20,6 +20,7 @@
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
#include "hw.h"
 | 
					#include "hw.h"
 | 
				
			||||||
#include "i2c.h"
 | 
					#include "i2c.h"
 | 
				
			||||||
 | 
					#include "tmp105.h"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
typedef struct {
 | 
					typedef struct {
 | 
				
			||||||
    I2CSlave i2c;
 | 
					    I2CSlave i2c;
 | 
				
			||||||
@ -92,22 +93,22 @@ static void tmp105_read(TMP105State *s)
 | 
				
			|||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    switch (s->pointer & 3) {
 | 
					    switch (s->pointer & 3) {
 | 
				
			||||||
    case 0:	/* Temperature */
 | 
					    case TMP105_REG_TEMPERATURE:
 | 
				
			||||||
        s->buf[s->len ++] = (((uint16_t) s->temperature) >> 8);
 | 
					        s->buf[s->len ++] = (((uint16_t) s->temperature) >> 8);
 | 
				
			||||||
        s->buf[s->len ++] = (((uint16_t) s->temperature) >> 0) &
 | 
					        s->buf[s->len ++] = (((uint16_t) s->temperature) >> 0) &
 | 
				
			||||||
                (0xf0 << ((~s->config >> 5) & 3));		/* R */
 | 
					                (0xf0 << ((~s->config >> 5) & 3));		/* R */
 | 
				
			||||||
        break;
 | 
					        break;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    case 1:	/* Configuration */
 | 
					    case TMP105_REG_CONFIG:
 | 
				
			||||||
        s->buf[s->len ++] = s->config;
 | 
					        s->buf[s->len ++] = s->config;
 | 
				
			||||||
        break;
 | 
					        break;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    case 2:	/* T_LOW */
 | 
					    case TMP105_REG_T_LOW:
 | 
				
			||||||
        s->buf[s->len ++] = ((uint16_t) s->limit[0]) >> 8;
 | 
					        s->buf[s->len ++] = ((uint16_t) s->limit[0]) >> 8;
 | 
				
			||||||
        s->buf[s->len ++] = ((uint16_t) s->limit[0]) >> 0;
 | 
					        s->buf[s->len ++] = ((uint16_t) s->limit[0]) >> 0;
 | 
				
			||||||
        break;
 | 
					        break;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    case 3:	/* T_HIGH */
 | 
					    case TMP105_REG_T_HIGH:
 | 
				
			||||||
        s->buf[s->len ++] = ((uint16_t) s->limit[1]) >> 8;
 | 
					        s->buf[s->len ++] = ((uint16_t) s->limit[1]) >> 8;
 | 
				
			||||||
        s->buf[s->len ++] = ((uint16_t) s->limit[1]) >> 0;
 | 
					        s->buf[s->len ++] = ((uint16_t) s->limit[1]) >> 0;
 | 
				
			||||||
        break;
 | 
					        break;
 | 
				
			||||||
@ -117,10 +118,10 @@ static void tmp105_read(TMP105State *s)
 | 
				
			|||||||
static void tmp105_write(TMP105State *s)
 | 
					static void tmp105_write(TMP105State *s)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
    switch (s->pointer & 3) {
 | 
					    switch (s->pointer & 3) {
 | 
				
			||||||
    case 0:	/* Temperature */
 | 
					    case TMP105_REG_TEMPERATURE:
 | 
				
			||||||
        break;
 | 
					        break;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    case 1:	/* Configuration */
 | 
					    case TMP105_REG_CONFIG:
 | 
				
			||||||
        if (s->buf[0] & ~s->config & (1 << 0))			/* SD */
 | 
					        if (s->buf[0] & ~s->config & (1 << 0))			/* SD */
 | 
				
			||||||
            printf("%s: TMP105 shutdown\n", __FUNCTION__);
 | 
					            printf("%s: TMP105 shutdown\n", __FUNCTION__);
 | 
				
			||||||
        s->config = s->buf[0];
 | 
					        s->config = s->buf[0];
 | 
				
			||||||
@ -128,8 +129,8 @@ static void tmp105_write(TMP105State *s)
 | 
				
			|||||||
        tmp105_alarm_update(s);
 | 
					        tmp105_alarm_update(s);
 | 
				
			||||||
        break;
 | 
					        break;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    case 2:	/* T_LOW */
 | 
					    case TMP105_REG_T_LOW:
 | 
				
			||||||
    case 3:	/* T_HIGH */
 | 
					    case TMP105_REG_T_HIGH:
 | 
				
			||||||
        if (s->len >= 3)
 | 
					        if (s->len >= 3)
 | 
				
			||||||
            s->limit[s->pointer & 1] = (int16_t)
 | 
					            s->limit[s->pointer & 1] = (int16_t)
 | 
				
			||||||
                    ((((uint16_t) s->buf[0]) << 8) | s->buf[1]);
 | 
					                    ((((uint16_t) s->buf[0]) << 8) | s->buf[1]);
 | 
				
			||||||
 | 
				
			|||||||
							
								
								
									
										67
									
								
								hw/tmp105.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										67
									
								
								hw/tmp105.h
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,67 @@
 | 
				
			|||||||
 | 
					/*
 | 
				
			||||||
 | 
					 * Texas Instruments TMP105 Temperature Sensor
 | 
				
			||||||
 | 
					 *
 | 
				
			||||||
 | 
					 * Browse the data sheet:
 | 
				
			||||||
 | 
					 *
 | 
				
			||||||
 | 
					 *    http://www.ti.com/lit/gpn/tmp105
 | 
				
			||||||
 | 
					 *
 | 
				
			||||||
 | 
					 * Copyright (C) 2012 Alex Horn <alex.horn@cs.ox.ac.uk>
 | 
				
			||||||
 | 
					 * Copyright (C) 2008-2012 Andrzej Zaborowski <balrogg@gmail.com>
 | 
				
			||||||
 | 
					 *
 | 
				
			||||||
 | 
					 * This work is licensed under the terms of the GNU GPL, version 2 or
 | 
				
			||||||
 | 
					 * later. See the COPYING file in the top-level directory.
 | 
				
			||||||
 | 
					 */
 | 
				
			||||||
 | 
					#ifndef QEMU_TMP105_H
 | 
				
			||||||
 | 
					#define QEMU_TMP105_H
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#include "i2c.h"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/**
 | 
				
			||||||
 | 
					 * TMP105Reg:
 | 
				
			||||||
 | 
					 * @TMP105_REG_TEMPERATURE: Temperature register
 | 
				
			||||||
 | 
					 * @TMP105_REG_CONFIG: Configuration register
 | 
				
			||||||
 | 
					 * @TMP105_REG_T_LOW: Low temperature register (also known as T_hyst)
 | 
				
			||||||
 | 
					 * @TMP105_REG_T_HIGH: High temperature register (also known as T_OS)
 | 
				
			||||||
 | 
					 *
 | 
				
			||||||
 | 
					 * The following temperature sensors are
 | 
				
			||||||
 | 
					 * compatible with the TMP105 registers:
 | 
				
			||||||
 | 
					 * - adt75
 | 
				
			||||||
 | 
					 * - ds1775
 | 
				
			||||||
 | 
					 * - ds75
 | 
				
			||||||
 | 
					 * - lm75
 | 
				
			||||||
 | 
					 * - lm75a
 | 
				
			||||||
 | 
					 * - max6625
 | 
				
			||||||
 | 
					 * - max6626
 | 
				
			||||||
 | 
					 * - mcp980x
 | 
				
			||||||
 | 
					 * - stds75
 | 
				
			||||||
 | 
					 * - tcn75
 | 
				
			||||||
 | 
					 * - tmp100
 | 
				
			||||||
 | 
					 * - tmp101
 | 
				
			||||||
 | 
					 * - tmp105
 | 
				
			||||||
 | 
					 * - tmp175
 | 
				
			||||||
 | 
					 * - tmp275
 | 
				
			||||||
 | 
					 * - tmp75
 | 
				
			||||||
 | 
					 **/
 | 
				
			||||||
 | 
					typedef enum TMP105Reg {
 | 
				
			||||||
 | 
					    TMP105_REG_TEMPERATURE = 0,
 | 
				
			||||||
 | 
					    TMP105_REG_CONFIG,
 | 
				
			||||||
 | 
					    TMP105_REG_T_LOW,
 | 
				
			||||||
 | 
					    TMP105_REG_T_HIGH,
 | 
				
			||||||
 | 
					} TMP105Reg;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/**
 | 
				
			||||||
 | 
					 * tmp105_set:
 | 
				
			||||||
 | 
					 * @i2c: dispatcher to TMP105 hardware model
 | 
				
			||||||
 | 
					 * @temp: temperature with 0.001 centigrades units in the range -40 C to +125 C
 | 
				
			||||||
 | 
					 *
 | 
				
			||||||
 | 
					 * Sets the temperature of the TMP105 hardware model.
 | 
				
			||||||
 | 
					 *
 | 
				
			||||||
 | 
					 * Bits 5 and 6 (value 32 and 64) in the register indexed by TMP105_REG_CONFIG
 | 
				
			||||||
 | 
					 * determine the precision of the temperature. See Table 8 in the data sheet.
 | 
				
			||||||
 | 
					 *
 | 
				
			||||||
 | 
					 * @see_also: I2C_SLAVE macro
 | 
				
			||||||
 | 
					 * @see_also: http://www.ti.com/lit/gpn/tmp105
 | 
				
			||||||
 | 
					 */
 | 
				
			||||||
 | 
					void tmp105_set(I2CSlave *i2c, int temp);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user