Skip to content
Snippets Groups Projects
dtt.c 2.24 KiB
Newer Older
  • Learn to ignore specific revisions
  • Wolfgang Denk's avatar
    Wolfgang Denk committed
    /*
     * (C) Copyright 2001
     * Erik Theisen, Wave 7 Optics, etheisen@mindspring.com
     *
    
     * SPDX-License-Identifier:	GPL-2.0+
    
    Wolfgang Denk's avatar
    Wolfgang Denk committed
     */
    
    #include <common.h>
    #include <config.h>
    #include <command.h>
    
    #include <dtt.h>
    
    #include <tmu.h>
    
    Wolfgang Denk's avatar
    Wolfgang Denk committed
    
    
    #if defined CONFIG_DTT_SENSORS
    
    static unsigned long sensor_initialized;
    
    
    Dirk Eibach's avatar
    Dirk Eibach committed
    static void _initialize_dtt(void)
    {
    	int i;
    	unsigned char sensors[] = CONFIG_DTT_SENSORS;
    
    	for (i = 0; i < sizeof(sensors); i++) {
    		if ((sensor_initialized & (1 << i)) == 0) {
    			if (dtt_init_one(sensors[i]) != 0) {
    				printf("DTT%d: Failed init!\n", i);
    				continue;
    			}
    			sensor_initialized |= (1 << i);
    		}
    	}
    }
    
    void dtt_init(void)
    {
    	int old_bus;
    
    	/* switch to correct I2C bus */
    	old_bus = I2C_GET_BUS();
    	I2C_SET_BUS(CONFIG_SYS_DTT_BUS_NUM);
    
    	_initialize_dtt();
    
    	/* switch back to original I2C bus */
    	I2C_SET_BUS(old_bus);
    }
    
    int dtt_i2c(void)
    
    Wolfgang Denk's avatar
    Wolfgang Denk committed
    {
    
    #if defined CONFIG_DTT_SENSORS
    
    Wolfgang Denk's avatar
    Wolfgang Denk committed
    	int i;
    	unsigned char sensors[] = CONFIG_DTT_SENSORS;
    
    	/* Force a compilation error, if there are more then 32 sensors */
    	BUILD_BUG_ON(sizeof(sensors) > 32);
    
    	/* switch to correct I2C bus */
    
    #ifdef CONFIG_SYS_I2C
    	old_bus = i2c_get_bus_num();
    	i2c_set_bus_num(CONFIG_SYS_DTT_BUS_NUM);
    #else
    
    	I2C_SET_BUS(CONFIG_SYS_DTT_BUS_NUM);
    
    Wolfgang Denk's avatar
    Wolfgang Denk committed
    
    
    Dirk Eibach's avatar
    Dirk Eibach committed
    	_initialize_dtt();
    
    
    Wolfgang Denk's avatar
    Wolfgang Denk committed
    	/*
    	 * Loop through sensors, read
    	 * temperature, and output it.
    	 */
    
    Dirk Eibach's avatar
    Dirk Eibach committed
    	for (i = 0; i < sizeof(sensors); i++)
    
    		printf("DTT%d: %i C\n", i + 1, dtt_get_temp(sensors[i]));
    
    
    	/* switch back to original I2C bus */
    
    #ifdef CONFIG_SYS_I2C
    	i2c_set_bus_num(old_bus);
    #else
    
    Wolfgang Denk's avatar
    Wolfgang Denk committed
    
    	return 0;
    
    }
    
    int dtt_tmu(void)
    {
    #if defined CONFIG_TMU_CMD_DTT
    	int cur_temp;
    
    	/* Sense and return latest thermal info */
    	if (tmu_monitor(&cur_temp) == TMU_STATUS_INIT) {
    		puts("TMU is in unknown state, temperature is invalid\n");
    		return -1;
    	}
    	printf("Current temperature: %u degrees Celsius\n", cur_temp);
    #endif
    	return 0;
    }
    
    int do_dtt(cmd_tbl_t *cmdtp, int flag, int argc, char *const argv[])
    {
    	int err = 0;
    
    	err |= dtt_i2c();
    	err |= dtt_tmu();
    
    	return err;
    
    Wolfgang Denk's avatar
    Wolfgang Denk committed
    }	/* do_dtt() */
    
    
    Wolfgang Denk's avatar
    Wolfgang Denk committed
    /***************************************************/
    
    
    U_BOOT_CMD(
    	  dtt,	1,	1,	do_dtt,
    
    	  "Read temperature from Digital Thermometer and Thermostat",
    	  ""
    
    Wolfgang Denk's avatar
    Wolfgang Denk committed
    );