authorNathael Pajani <nathael.pajani@ed3l.fr>
Tue, 22 Sep 2015 18:36:04 +0000 (20:36 +0200)
committerNathael Pajani <nathael.pajani@ed3l.fr>
Tue, 22 Sep 2015 18:36:04 +0000 (20:36 +0200)
extdrv/tmp101_temp_sensor.c
include/extdrv/tmp101_temp_sensor.h

index 31814b7..74503cc 100644 (file)
@@ -60,25 +60,19 @@ enum tmp10x_internal_reg_numbers {
 
 
 
-/* This static value is used to keep track of the last register accessed to
- * prevent sending the pointer register again if we want to read the same
- * register again. */
-static int last_accessed_register = 0;
-
 /* Check the sensor presence, return 1 if sensor was found.
  * This is a basic check, it could be anything with the same address ...
  * addr : the sensor address on most significant bits.
  */
-int tmp101_probe_sensor(uint8_t i2c_bus_num, uint8_t addr)
+int tmp101_probe_sensor(struct tmp101_sensor_config* conf)
 {
-       static int ret = -1;
-       char cmd_buf = (addr | I2C_READ_BIT);
+       char cmd_buf = (conf->addr | I2C_READ_BIT);
 
        /* Did we already probe the sensor ? */
-       if (ret != 1) {
-               ret = i2c_read(i2c_bus_num, &cmd_buf, 1, NULL, NULL, 0);
+       if (conf->probe_ok != 1) {
+               conf->probe_ok = i2c_read(conf->bus_num, &cmd_buf, 1, NULL, NULL, 0);
        }
-       return ret;
+       return conf->probe_ok;
 }
 
 /* Convert raw temperature data (expressed as signed value of 16 times the
@@ -93,7 +87,6 @@ int tmp101_convert_to_deci_degrees(uint16_t raw)
 
 /* Temp Read
  * Performs a non-blocking read of the temperature from the sensor.
- * addr : the sensor address on most significant bits.
  * 'raw' and 'deci_degrees' : integer addresses for conversion result, may be NULL.
  * Return value(s):
  *   Upon successfull completion, returns 0 and the temperature read is placed in the
@@ -106,25 +99,25 @@ int tmp101_convert_to_deci_degrees(uint16_t raw)
  *   -EIO : Bad one: Illegal start or stop, or illegal state in i2c state machine
  */
 #define CMD_BUF_SIZE 3
-int tmp101_sensor_read(uint8_t i2c_bus_num, uint8_t addr, uint16_t* raw, int* deci_degrees)
+int tmp101_sensor_read(struct tmp101_sensor_config* conf, uint16_t* raw, int* deci_degrees)
 {
        int ret = 0;
        uint16_t temp = 0;
-       char cmd_buf[CMD_BUF_SIZE] = { addr, TMP_REG_TEMPERATURE, (addr | I2C_READ_BIT), };
+       char cmd_buf[CMD_BUF_SIZE] = { conf->addr, TMP_REG_TEMPERATURE, (conf->addr | I2C_READ_BIT), };
        char ctrl_buf[CMD_BUF_SIZE] = { I2C_CONT, I2C_DO_REPEATED_START, I2C_CONT, };
 
-       if (tmp101_probe_sensor(i2c_bus_num, addr) != 1) {
+       if (tmp101_probe_sensor(conf) != 1) {
                return -ENODEV;
        }
 
        /* Read the requested data */
-       if (last_accessed_register == TMP_REG_TEMPERATURE) {
+       if (conf->last_accessed_register == TMP_REG_TEMPERATURE) {
                /* No need to switch back to temperature register */
-               ret = i2c_read(i2c_bus_num, (cmd_buf + 2), 1, (ctrl_buf + 2), (char*)&temp, 2);
+               ret = i2c_read(conf->bus_num, (cmd_buf + 2), 1, (ctrl_buf + 2), (char*)&temp, 2);
        } else {
                /* Send (write) temperature register address to TMP101 internal pointer */
-               ret = i2c_read(i2c_bus_num, cmd_buf, CMD_BUF_SIZE, ctrl_buf, (char*)&temp, 2);
-               last_accessed_register = TMP_REG_TEMPERATURE;
+               ret = i2c_read(conf->bus_num, cmd_buf, CMD_BUF_SIZE, ctrl_buf, (char*)&temp, 2);
+               conf->last_accessed_register = TMP_REG_TEMPERATURE;
        }
 
        if (ret == 2) {
@@ -144,8 +137,6 @@ int tmp101_sensor_read(uint8_t i2c_bus_num, uint8_t addr, uint16_t* raw, int* de
  * Performs default configuration of the temperature sensor.
  * The sensor is thus placed in shutdown mode, the thermostat is in interrupt mode,
  * and the polarity is set to active high.
- * The conversion resolution is set to the provided "resolution".
- * addr : the sensor address on most significant bits.
  * Return value :
  *   Upon successfull completion, returns 0. On error, returns a negative integer
  *   equivalent to errors from glibc.
@@ -156,45 +147,42 @@ int tmp101_sensor_read(uint8_t i2c_bus_num, uint8_t addr, uint16_t* raw, int* de
  *   -EREMOTEIO : Device did not acknowledge : Any device present ?
  *   -EIO : Bad one: Illegal start or stop, or illegal state in i2c state machine
  */
-static uint8_t actual_config = 0;
 #define CONF_BUF_SIZE 4
-int tmp101_sensor_config(uint8_t i2c_bus_num, uint8_t addr, uint32_t resolution)
+int tmp101_sensor_config(struct tmp101_sensor_config* conf)
 {
        int ret = 0;
-       char cmd[CONF_BUF_SIZE] = { addr, TMP_REG_CONFIG, };
+       char cmd[CONF_BUF_SIZE] = { conf->addr, TMP_REG_CONFIG, };
 
-       if (tmp101_probe_sensor(i2c_bus_num, addr) != 1) {
+       if (tmp101_probe_sensor(conf) != 1) {
                return -ENODEV;
        }
 
        /* Store the new configuration */
-       actual_config = (TMP_SHUTDOWN_MODE_ON | TMP_THERMOSTAT_INTERRUPT_MODE | TMP_ALERT_POLARITY_HIGH);
-       actual_config |= (resolution & (0x03 << 5));
-       cmd[2] = actual_config;
-       ret = i2c_write(i2c_bus_num, cmd, 3, NULL);
-       last_accessed_register = TMP_REG_CONFIG;
+       conf->actual_config = (TMP_SHUTDOWN_MODE_ON | TMP_THERMOSTAT_INTERRUPT_MODE | TMP_ALERT_POLARITY_HIGH);
+       conf->actual_config |= (conf->resolution & (0x03 << 5));
+       cmd[2] = conf->actual_config;
+       ret = i2c_write(conf->bus_num, cmd, 3, NULL);
+       conf->last_accessed_register = TMP_REG_CONFIG;
        if (ret == 3) {
                return 0; /* Config success */
        }
        return ret;
 }
 
-/* Start a conversion when the sensor is in shutdown mode.
- * addr : the sensor address on most significant bits.
- */
-int tmp101_sensor_start_conversion(uint8_t i2c_bus_num, uint8_t addr)
+/* Start a conversion when the sensor is in shutdown mode. */
+int tmp101_sensor_start_conversion(struct tmp101_sensor_config* conf)
 {
        int ret = 0;
-       char cmd[CONF_BUF_SIZE] = { addr, TMP_REG_CONFIG, };
+       char cmd[CONF_BUF_SIZE] = { conf->addr, TMP_REG_CONFIG, };
 
-       if (tmp101_probe_sensor(i2c_bus_num, addr) != 1) {
+       if (tmp101_probe_sensor(conf) != 1) {
                return -ENODEV;
        }
 
-       cmd[2] = actual_config;
+       cmd[2] = conf->actual_config;
        cmd[2] |= TMP_ONE_SHOT_TRIGGER;
-       ret = i2c_write(i2c_bus_num, cmd, 3, NULL);
-       last_accessed_register = TMP_REG_CONFIG;
+       ret = i2c_write(conf->bus_num, cmd, 3, NULL);
+       conf->last_accessed_register = TMP_REG_CONFIG;
        if (ret == 3) {
                return 0; /* Conversion start success */
        }
index ce4468f..96b4135 100644 (file)
 #define TMP_RES_TWELVE_BITS ((0x03 & 0x03) << 5)   /* 320ms */
 
 
+/* TMP101 sensor instance data.
+ * Use one of this for each sensor you want to access.
+ * - addr is the sensor address on most significant bits.
+ * - last_accessed_register is used to keep track of the last register accessed to
+ * prevent sending the pointer register again if we want to read the same register again.
+ * - resolution is one of the above resolution defined values.
+ */
+struct tmp101_sensor_config {
+       uint8_t bus_num;
+       uint8_t addr;
+       uint8_t probe_ok;
+       uint8_t actual_config;
+       int last_accessed_register;
+       uint32_t resolution;
+};
+
+
 /* Check the sensor presence, return 1 if found
  * This is a basic check, it could be anything with the same address ...
- * addr : the sensor address on most significant bits.
+ * addr: the sensor address on most significant bits.
  */
-int tmp101_probe_sensor(uint8_t i2c_bus_num, uint8_t addr);
+int tmp101_probe_sensor(struct tmp101_sensor_config* conf);
 
 
 /* Convert raw temperature data (expressed as signed value of 16 times the
@@ -65,8 +82,8 @@ int tmp101_convert_to_deci_degrees(uint16_t raw);
 
 /* Temp Read
  * Performs a non-blocking read of the temperature from the sensor.
- * addr : the sensor address on most significant bits.
- * 'raw' and 'deci_degrees' : integer addresses for conversion result, may be NULL.
+ * addr: the sensor address on most significant bits.
+ * 'raw' and 'deci_degrees': integer addresses for conversion result, may be NULL.
  * Return value(s):
  *   Upon successfull completion, returns 0 and the temperature read is placed in the
  *   provided integer(s). On error, returns a negative integer equivalent to errors from
@@ -78,7 +95,7 @@ int tmp101_convert_to_deci_degrees(uint16_t raw);
  *   -EREMOTEIO : Device did not acknowledge : Any device present ?
  *   -EIO : Bad one: Illegal start or stop, or illegal state in i2c state machine
  */
-int tmp101_sensor_read(uint8_t i2c_bus_num, uint8_t addr, uint16_t* raw, int* deci_degrees);
+int tmp101_sensor_read(struct tmp101_sensor_config* conf, uint16_t* raw, int* deci_degrees);
 
 
 /* Sensor config
@@ -86,7 +103,7 @@ int tmp101_sensor_read(uint8_t i2c_bus_num, uint8_t addr, uint16_t* raw, int* de
  * The sensor is thus placed in shutdown mode, the thermostat is in interrupt mode,
  * and the polarity is set to active high.
  * The conversion resolution is set to the provided "resolution".
- * addr : the sensor address on most significant bits.
+ * addr: the sensor address on most significant bits.
  * Return value:
  *   Upon successfull completion, returns 0. On error, returns a negative integer
  *   equivalent to errors from glibc.
@@ -97,12 +114,12 @@ int tmp101_sensor_read(uint8_t i2c_bus_num, uint8_t addr, uint16_t* raw, int* de
  *   -EREMOTEIO : Device did not acknowledge : Any device present ?
  *   -EIO : Bad one: Illegal start or stop, or illegal state in i2c state machine
  */
-int tmp101_sensor_config(uint8_t i2c_bus_num, uint8_t addr, uint32_t resolution);
+int tmp101_sensor_config(struct tmp101_sensor_config* conf);
 
 /* Start a conversion when the sensor is in shutdown mode.
  * addr : the sensor address on most significant bits.
  */
-int tmp101_sensor_start_conversion(uint8_t i2c_bus_num, uint8_t addr);
+int tmp101_sensor_start_conversion(struct tmp101_sensor_config* conf);
 
 
 #endif /* EXTDRV_TEMP_H */