1
0
mirror of https://github.com/RIOT-OS/RIOT.git synced 2025-12-26 15:03:53 +01:00

drivers: remove utterly outdated lm75a driver

This commit is contained in:
Hauke Petersen 2017-01-30 16:13:52 +01:00
parent 40a6664831
commit 34d1064a00
3 changed files with 0 additions and 590 deletions

View File

@ -1,278 +0,0 @@
/*
* Copyright (C) 2013 Zakaria Kasmi <zkasmi@inf.fu-berlin.de>
*
* This file is subject to the terms and conditions of the GNU Lesser
* General Public License v2.1. See the file LICENSE in the top level
* directory for more details.
*/
/**
* @defgroup drivers_lm75a LM75A
* @ingroup drivers_sensors
* @brief Driver for the LM75A digital temperature sensor and thermal watchdog
*
* The connection between the MCU and the LM75A is based on the i2c-interface.
*
* @{
*
* @file
* @internal
* @brief Definitions of the LM75A temperature sensor driver.
*
* The connection between the LM75A and the MCU is based on the I2C-interface.
*
* @author Zakaria Kasmi <zkasmi@inf.fu-berlin.de>
*/
#ifndef LM75A_H
#define LM75A_H
#include <stdint.h>
#include <math.h>
#include "i2c.h"
#ifdef __cplusplus
extern "C" {
#endif
/**
* @name LM75A register addresses
* @{
*/
#define LM75A_ADDR 0x48
#define LM75A_TEMPERATURE_REG 0x0
#define LM75A_CONFIG_REG 0x1
#define LM75A_THYST_REG 0x2
#define LM75A_OVER_TEMP_REG 0x3
/** @} */
/**
* @brief Define the used I2C Interface
*/
//#define LM75A_I2C_INTERFACE I2C0 // P0.27 SDA0, P0.28 SCL0
#define LM75A_I2C_INTERFACE I2C1_0 // P0.0 SDA1, P0.1 SCL1
//#define LM75A_I2C_INTERFACE I2C1_1 // P0.19 SDA1, P0.20 SCL1
//#define LM75A_I2C_INTERFACE I2C2 // P0.10 SDA2, P0.11 SCL2
/**
* @brief LM75A operation modes
*/
enum OPERATION_MODES {
LM75A_NORMAL_OPERATION_MODE,
LM75A_SHUTDOWN_MODE,
LM75A_COMPARATOR_MODE,
LM75A_INTERRUPT_MODE
};
/**
* @name Common definitions for LMA75A
* @{
*/
#define LM75A_BIT0 0x0
#define LM75A_BIT1 0x1
#define LM75A_BIT2 0x2
#define LM75A_BIT3 0x3
#define LM75A_BIT4 0x4
#define LM75A_BIT5 0x5
#define LM75A_BIT6 0x6
#define LM75A_BIT7 0x7
#define LM75A_BIT8 0x8
#define LM75A_BIT9 0x9
#define LM75A_BIT10 0xA
#define LM75A_BIT15 0xF
#define LM75A_MOST_SIG_BYTE_MASK 0xFF00
#define LM75A_LEAST_SIG_BYTE_MASK 0x00FF
#define LM75A_DATA_BITS_MASK 0x07FF
#define LM75A_SIGN_BIT_MASK (1<<LM75A_BIT10)
#define LM75A_LSB_MASK 0x1
#define LM75A_EXTINT_MODE 0x1
/** @} */
/**
* @name LM75A configuration register
* @{
*/
#define LM75A_ACTIVE_LOW 0
#define LM75A_ACTIVE_HIGH 1
#define LM75A_DEFAULT_CONFIG_VALUE 0
/** @} */
/**
* @brief LM75A default values
*/
enum DEFAULT_VALUES {
LM75A_DEFAULT_TOS = 80,
LM75A_DEFAULT_THYST = 75,
LM75A_DEFAULT_OPERATION = LM75A_NORMAL_OPERATION_MODE,
LM75A_DEFAULT_MODE = LM75A_COMPARATOR_MODE,
LM75A_DEFAULT_POLARITY = LM75A_ACTIVE_LOW,
LM75A_DEFAULT_FAULT_NUM = 1
};
/**
* @name define inter-threads messages
* @{
*/
#define LM75A_EXIT_MSG 0
#define LM75A_SAMPLING_MSG 1
#define LM75A_SLEEP_MSG 2
#define LM75A_WEAKUP_MSG 3
/** @} */
/**
* @brief Set the over-temperature shutdown threshold (TOS).
*
* @param[in] tos the TOS value.
*
*/
void lm75A_set_over_temperature(float_t tos);
/**
* @brief Set the hysteresis temperature.
*
* @param[in] thsyt the hysteresis value.
*
*/
void lm75A_set_hysteresis_temperature(float_t thsyt);
/**
* @brief Set various operation modes of the temperature sensor.
* The LM75A provide four modes: normal, comparator, interrupt,
* and the shutdown mode.
* All these modes are defined in the lm75a-temp-sensor.h
*
* @param[in] op_mode the operation mode value: the normal, shutdown,
* comparator, or interrupt mode.
*
*/
void lm75A_set_operation_mode(uint8_t op_mode);
/**
* @brief Get the content of the configuration register.
*
* @return the configuration register value.
*
*/
uint8_t lm75A_get_config_reg(void);
/**
* @brief Get the adjusted hysteresis temperature.
*
* @return the content of the hysteresis register.
*
*/
float_t lm75A_get_hysteresis_temperature(void);
/**
* @brief Get the adjusted over-temperature shutdown threshold (TOS).
*
* @return the content of the TOS-register.
*
*/
float_t lm75A_get_over_temperature(void);
/**
* @brief Get the ambient temperature which is measured from the
* LM75A sensor.
*
* @return the content of the temperature register.
*
*/
float_t lm75A_get_ambient_temperature(void);
/**
* @brief Set the LM75A sensor in the initial state.
* The temperature sensor has the following values in this state:
* config_register = 0; hyst_register = 75; the tos_reg = 80.
*
*/
void lm75A_reset(void);
/**
* @brief Start a continuous sampling of the temperature values.
* This function prints the values of all registers over
* the rs232 interface.
*
* @param[in] extern_interrupt_task pointer to an external task handler that
* is executed, if an external interrupt
* occurrs left. This is an optional
* parameter therefore NULL is a legal value.
*/
void lm75A_start_sensor_sampling(void (*extern_interrupt_task)(void));
/**
* @brief Register an interrupt handler for the external interrupt.
* Only the port0 and port2 are supported.
*
* @param[in] port port number.
* @param[in] pin_bit_mask pin number in form of a bit mask: Pin0 --> BIT0,
* Pin1 --> BIT1, Pin2 --> BIT2 = 2^2 = 4
* @param[in] flags define if the interrupt is generated on rising
* or falling edge (#GPIOINT_RISING_EDGE,
* #GPIOINT_FALLING_EDGE).
* @param[in] handler pointer to an interrupt handler.
*
* @return true if the the external interrupt handler is successfully
* registered, otherwise false.
*/
bool lm75A_ext_irq_handler_register(int32_t port, uint32_t pin_bit_mask,
int32_t flags, void *handler);
/**
* @brief Initialize the LM75A temperature sensor.
* The baud rate and the handler for the external interrupt can be
* initialized. The external interrupt handler is optional, if no
* handler is available, the NULL-value can be entered.
* The hysteresis and the over-temperature are displayed before and
* after a rest action is performed. After this the LM7A sensor is
* set in the interrupt or the comparator mode.
*
* @param[in] i2c_interface the i2c interface, several interfaces
* can be selected: i2c0, i2c1 and i2c2.
* @param[in] baud_rate the baud rate.
* @param[in] external_interr_handler pointer to a handler for the external
* interrupt.
*
* @return true if the I2C interface and the external interrupt handler are
* successfully initialized, otherwise false.
*/
bool lm75A_init(uint8_t i2c_interface, uint32_t baud_rate,
void *external_interr_handler);
/**
* @brief Register the external interrupt handler for the over-temperature
* shutdown output.
*
* @param[in] handler pointer to a handler for the external interrupts.
*
* @return true if the the external interrupt handler is successfully
* registered, otherwise false.
*/
bool lm75A_external_interrupt_register(void *handler);
/**
* @brief Alarm the sensor sampling task about an external interrupt.
*
* @param[in] b is true if an external interrupt is occurred, otherwise false.
*
*/
void lm75A_set_in_alarm(bool b);
#ifdef __cplusplus
}
#endif
/** @} */
#endif /* LM75A_H */

View File

@ -1 +0,0 @@
include $(RIOTBASE)/Makefile.base

View File

@ -1,311 +0,0 @@
/*
* lm75a-temp-sensor.c - Driver for the LM75A temperature sensor based on the
* i2c interface.
*
* Copyright (C) 2013 Zakaria Kasmi <zkasmi@inf.fu-berlin.de>
*
* This file is subject to the terms and conditions of the GNU Lesser
* General Public License v2.1. See the file LICENSE in the top level
* directory for more details.
*
*/
/**
* @file
* @internal
* @brief Driver for the LM75A temperature sensor.
* The communication between the LM75A and the MCU is
* based on the i2c interface.
*
* @author Zakaria Kasmi <zkasmi@inf.fu-berlin.de>
* @version $Revision: 3855 $
*
* @note $Id: lm75a-temp-sensor.c 3855 2013-09-05 13:53:49 kasmi $
*/
#include <stdlib.h>
#include <limits.h>
#include <stdio.h>
#include <stdbool.h>
#include <string.h>
#include <math.h>
#include "msg.h"
#include "thread.h"
#include "lpc2387.h"
#include "gpioint.h"
#include "i2c.h"
#include "lm75a-temp-sensor.h"
#include "board.h"
#include "xtimer.h"
//declaration as volatile is important, otherwise no interrupt is triggered.
volatile bool my_alarm = false;
static uint16_t get_2s_complement(uint16_t num)
{
return ~(num) + 1;
}
//Write: MC --> Sensor
static void to_bytes(float_t f, uint8_t *buff)
{
int32_t i = (int32_t)(f * 2);
buff[0] = (uint8_t)((i >> LM75A_BIT1) & 0xFF);//Most signif. byte
buff[1] = (uint8_t)((i & LM75A_BIT1) << LM75A_BIT7);//Least signif. byte
}
static uint16_t to_uint16(uint8_t *buff)
{
if (buff != NULL) {
return (buff[0] << LM75A_BIT8) | buff[1];
}
else {
return UINT16_MAX;
}
}
//Read: Sensor --> MC
volatile static float_t to_float(uint8_t reg_addr, uint16_t reg_value)
{
uint16_t sign = reg_value & LM75A_SIGN_BIT_MASK;
float_t f_temp = 0.0;
float_t factor = 0.0;
switch (reg_addr) {
case LM75A_OVER_TEMP_REG:
case LM75A_THYST_REG:
factor = 0.5;
break;
case LM75A_TEMPERATURE_REG:
factor = 0.125;
}
if (sign) { //the number is negative
f_temp = (get_2s_complement(reg_value) & LM75A_DATA_BITS_MASK)
* -factor;
}
else { //the number is positive
f_temp = reg_value * factor;
}
return f_temp;
}
static void set_register(uint8_t i2c_interface, uint8_t reg_addr, float_t value)
{
bool status = false;
uint8_t tx_buff[2];
switch (reg_addr) {
case LM75A_OVER_TEMP_REG:
case LM75A_THYST_REG:
to_bytes(value, tx_buff);
status = i2c_write(i2c_interface, LM75A_ADDR, reg_addr, tx_buff, 2);
break;
case LM75A_CONFIG_REG:
tx_buff[0] = (uint8_t) value;
status = i2c_write(i2c_interface, LM75A_ADDR, reg_addr, tx_buff, 1);
}
if (!status) {
puts(
"[lm75a_tempSensorI2C/lm75A_setRegister]: Slave is not ready !!\n");
}
}
void lm75A_set_over_temperature(float_t tos)
{
set_register(LM75A_I2C_INTERFACE, LM75A_OVER_TEMP_REG, tos);
}
void lm75A_set_hysteresis_temperature(float_t thsyt)
{
set_register(LM75A_I2C_INTERFACE, LM75A_THYST_REG, thsyt);
}
static uint16_t lm75A_get_register_value(uint8_t i2c_interface,
uint8_t reg_addr,
uint8_t reg_size)
{
uint8_t rx_buff[reg_size];
i2c_clear_buffer(rx_buff, sizeof(rx_buff));
if ((reg_size > 0) && (reg_size < 3)) {
bool status = i2c_read(i2c_interface, LM75A_ADDR, reg_addr, rx_buff, sizeof(rx_buff));
if (!status) { //Slave is not ready
puts(
"[lm75a_tempSensorI2C/lm75A_getConfigReg]: Slave is not\
ready !\n");
if (reg_size < 2) {
return UCHAR_MAX;
}
else {
return UINT16_MAX;
}
}
else { //Slave acknowledged
if (reg_size < 2) {
return rx_buff[0];
}
else {
return to_uint16(rx_buff);
}
}
}
else {
puts("the register size must be less than 2");
return UINT16_MAX;
}
}
uint8_t lm75A_get_config_reg(void)
{
return lm75A_get_register_value(LM75A_I2C_INTERFACE, LM75A_CONFIG_REG, 1);
}
float_t lm75A_get_hysteresis_temperature(void)
{
uint16_t hyst_reg_value = 0;
hyst_reg_value = lm75A_get_register_value(LM75A_I2C_INTERFACE,
LM75A_THYST_REG, 2);
hyst_reg_value = (hyst_reg_value >> LM75A_BIT7);
return to_float(LM75A_THYST_REG, hyst_reg_value);
}
float_t lm75A_get_over_temperature(void)
{
uint16_t over_temp = 0;
over_temp = lm75A_get_register_value(LM75A_I2C_INTERFACE,
LM75A_OVER_TEMP_REG, 2);
over_temp = (over_temp >> LM75A_BIT7);
return to_float(LM75A_OVER_TEMP_REG, over_temp);
}
float_t lm75A_get_ambient_temperature(void)
{
uint16_t amb_temp = 0;
amb_temp = lm75A_get_register_value(LM75A_I2C_INTERFACE,
LM75A_TEMPERATURE_REG, 2);
amb_temp = (amb_temp >> LM75A_BIT5);
return to_float(LM75A_TEMPERATURE_REG, amb_temp);
}
void lm75A_reset(void)
{
lm75A_set_over_temperature(LM75A_DEFAULT_TOS);
lm75A_set_hysteresis_temperature(LM75A_DEFAULT_THYST);
set_register(LM75A_I2C_INTERFACE, LM75A_CONFIG_REG,
LM75A_DEFAULT_CONFIG_VALUE);
}
void lm75A_set_operation_mode(uint8_t op_mode)
{
uint8_t config_reg = lm75A_get_config_reg();
switch (op_mode) {
case LM75A_NORMAL_OPERATION_MODE:
config_reg &= ~(1 << LM75A_BIT0);
break;
case LM75A_SHUTDOWN_MODE:
config_reg |= (1 << LM75A_BIT0);
break;
case LM75A_COMPARATOR_MODE:
config_reg &= ~(1 << LM75A_BIT1);
break;
case LM75A_INTERRUPT_MODE:
config_reg |= (1 << LM75A_BIT1);
break;
default:
config_reg &= ~(1 << LM75A_BIT0);
}
set_register(LM75A_I2C_INTERFACE, LM75A_CONFIG_REG, config_reg);
}
bool lm75A_ext_irq_handler_register(int32_t port, uint32_t pin_bit_mask,
int32_t flags, void *handler)
{
return gpioint_set(port, pin_bit_mask, flags, handler);
}
bool lm75A_init(uint8_t i2c_interface, uint32_t baud_rate,
void *external_interr_handler)
{
if (i2c_initialize(i2c_interface, (uint32_t) I2CMASTER, 0, baud_rate, NULL)
== false) { /* initialize I2C */
puts("fatal error happened in i2c_initialize()\n");
return false;
}
//i2c_enable_pull_up_resistor(i2c_interface);
i2c_disable_pull_up_resistor(i2c_interface);
if ((external_interr_handler != NULL)
&& lm75A_ext_irq_handler_register(2, BIT3, GPIOINT_FALLING_EDGE,
external_interr_handler)) {
printf("# %-70s%10s\n", "External interrupt handler registration",
"...[OK]");
}
else {
printf("# %-70s%10s\n", "External interrupt handler registration",
"...[FAILED]");
return false;
}
puts("################## Before reset ##################");
printf("configReg = %u\n", lm75A_get_config_reg());
printf("hystTemp = %f\n", lm75A_get_hysteresis_temperature());
printf("overTemp = %f\n", lm75A_get_over_temperature());
lm75A_reset();
puts("\n################## After reset ##################");
printf("configRegInitial = %u\n", lm75A_get_config_reg());
printf("initialHystTemp = %f\n", lm75A_get_hysteresis_temperature());
printf("initialOverTemp = %f\n", lm75A_get_over_temperature());
puts("\n################## New configuration ##################");
// set the hysteresis temperature
lm75A_set_hysteresis_temperature(32.0);
printf("hystTemp = %f\n", lm75A_get_hysteresis_temperature());
lm75A_set_over_temperature(33.0);
printf("overTemp = %f\n", lm75A_get_over_temperature());
puts("\n################## Go to comparator mode ##################");
lm75A_set_operation_mode(LM75A_COMPARATOR_MODE);
printf("configReg = %u\n", lm75A_get_config_reg());
// puts("\n################## Go to interrupt mode ##################");
// lm75A_set_operation_mode(LM75A_INTERRUPT_MODE);
// printf("configReg = %u\n", lm75A_get_config_reg());
return true;
}
void lm75A_set_in_alarm(bool b)
{
my_alarm = b;
}
/*
* Application entry point.
*/
void lm75A_start_sensor_sampling(void (*handler)(void))
{
/*
* Normal main() thread activity.
*/
while (true) {
printf("amb_temp = %3.3f\n", lm75A_get_ambient_temperature());
if (my_alarm && (handler != NULL)) {
handler();
my_alarm = false;
}
xtimer_usleep(100000);
xtimer_usleep(100000);
}
}