hwmon: (sht3x) add humidity heater element control
The enables control of the SHT31 sensors heating element that can turned on to remove excess humidity. Cc: Guenter Roeck <linux@roeck-us.net> Cc: David Frey <david.frey@sensirion.com> Signed-off-by: Matt Ranostay <mranostay@gmail.com> Signed-off-by: Guenter Roeck <linux@roeck-us.net>
This commit is contained in:
parent
803deccec2
commit
50c22cd154
|
@ -67,6 +67,10 @@ temp1_alarm: alarm flag is set to 1 if the temperature is outside the
|
||||||
configured limits. Alarm only works in periodic measure mode
|
configured limits. Alarm only works in periodic measure mode
|
||||||
humidity1_alarm: alarm flag is set to 1 if the humidity is outside the
|
humidity1_alarm: alarm flag is set to 1 if the humidity is outside the
|
||||||
configured limits. Alarm only works in periodic measure mode
|
configured limits. Alarm only works in periodic measure mode
|
||||||
|
heater_enable: heater enable, heating element removes excess humidity from
|
||||||
|
sensor
|
||||||
|
0: turned off
|
||||||
|
1: turned on
|
||||||
update_interval: update interval, 0 for single shot, interval in msec
|
update_interval: update interval, 0 for single shot, interval in msec
|
||||||
for periodic measurement. If the interval is not supported
|
for periodic measurement. If the interval is not supported
|
||||||
by the sensor, the next faster interval is chosen
|
by the sensor, the next faster interval is chosen
|
||||||
|
|
|
@ -44,6 +44,10 @@ static const unsigned char sht3x_cmd_measure_nonblocking_lpm[] = { 0x24, 0x16 };
|
||||||
static const unsigned char sht3x_cmd_measure_periodic_mode[] = { 0xe0, 0x00 };
|
static const unsigned char sht3x_cmd_measure_periodic_mode[] = { 0xe0, 0x00 };
|
||||||
static const unsigned char sht3x_cmd_break[] = { 0x30, 0x93 };
|
static const unsigned char sht3x_cmd_break[] = { 0x30, 0x93 };
|
||||||
|
|
||||||
|
/* commands for heater control */
|
||||||
|
static const unsigned char sht3x_cmd_heater_on[] = { 0x30, 0x6d };
|
||||||
|
static const unsigned char sht3x_cmd_heater_off[] = { 0x30, 0x66 };
|
||||||
|
|
||||||
/* other commands */
|
/* other commands */
|
||||||
static const unsigned char sht3x_cmd_read_status_reg[] = { 0xf3, 0x2d };
|
static const unsigned char sht3x_cmd_read_status_reg[] = { 0xf3, 0x2d };
|
||||||
static const unsigned char sht3x_cmd_clear_status_reg[] = { 0x30, 0x41 };
|
static const unsigned char sht3x_cmd_clear_status_reg[] = { 0x30, 0x41 };
|
||||||
|
@ -507,6 +511,49 @@ static ssize_t humidity1_alarm_show(struct device *dev,
|
||||||
return scnprintf(buf, PAGE_SIZE, "%d\n", !!(buffer[0] & 0x08));
|
return scnprintf(buf, PAGE_SIZE, "%d\n", !!(buffer[0] & 0x08));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static ssize_t heater_enable_show(struct device *dev,
|
||||||
|
struct device_attribute *attr,
|
||||||
|
char *buf)
|
||||||
|
{
|
||||||
|
char buffer[SHT3X_WORD_LEN + SHT3X_CRC8_LEN];
|
||||||
|
int ret;
|
||||||
|
|
||||||
|
ret = status_register_read(dev, attr, buffer,
|
||||||
|
SHT3X_WORD_LEN + SHT3X_CRC8_LEN);
|
||||||
|
if (ret)
|
||||||
|
return ret;
|
||||||
|
|
||||||
|
return scnprintf(buf, PAGE_SIZE, "%d\n", !!(buffer[0] & 0x20));
|
||||||
|
}
|
||||||
|
|
||||||
|
static ssize_t heater_enable_store(struct device *dev,
|
||||||
|
struct device_attribute *attr,
|
||||||
|
const char *buf,
|
||||||
|
size_t count)
|
||||||
|
{
|
||||||
|
struct sht3x_data *data = dev_get_drvdata(dev);
|
||||||
|
struct i2c_client *client = data->client;
|
||||||
|
int ret;
|
||||||
|
bool status;
|
||||||
|
|
||||||
|
ret = kstrtobool(buf, &status);
|
||||||
|
if (ret)
|
||||||
|
return ret;
|
||||||
|
|
||||||
|
mutex_lock(&data->i2c_lock);
|
||||||
|
|
||||||
|
if (status)
|
||||||
|
ret = i2c_master_send(client, (char *)&sht3x_cmd_heater_on,
|
||||||
|
SHT3X_CMD_LENGTH);
|
||||||
|
else
|
||||||
|
ret = i2c_master_send(client, (char *)&sht3x_cmd_heater_off,
|
||||||
|
SHT3X_CMD_LENGTH);
|
||||||
|
|
||||||
|
mutex_unlock(&data->i2c_lock);
|
||||||
|
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
static ssize_t update_interval_show(struct device *dev,
|
static ssize_t update_interval_show(struct device *dev,
|
||||||
struct device_attribute *attr,
|
struct device_attribute *attr,
|
||||||
char *buf)
|
char *buf)
|
||||||
|
@ -612,6 +659,8 @@ static SENSOR_DEVICE_ATTR(humidity1_min_hyst, S_IRUGO | S_IWUSR,
|
||||||
static SENSOR_DEVICE_ATTR(temp1_alarm, S_IRUGO, temp1_alarm_show, NULL, 0);
|
static SENSOR_DEVICE_ATTR(temp1_alarm, S_IRUGO, temp1_alarm_show, NULL, 0);
|
||||||
static SENSOR_DEVICE_ATTR(humidity1_alarm, S_IRUGO, humidity1_alarm_show,
|
static SENSOR_DEVICE_ATTR(humidity1_alarm, S_IRUGO, humidity1_alarm_show,
|
||||||
NULL, 0);
|
NULL, 0);
|
||||||
|
static SENSOR_DEVICE_ATTR(heater_enable, S_IRUGO | S_IWUSR,
|
||||||
|
heater_enable_show, heater_enable_store, 0);
|
||||||
static SENSOR_DEVICE_ATTR(update_interval, S_IRUGO | S_IWUSR,
|
static SENSOR_DEVICE_ATTR(update_interval, S_IRUGO | S_IWUSR,
|
||||||
update_interval_show, update_interval_store, 0);
|
update_interval_show, update_interval_store, 0);
|
||||||
|
|
||||||
|
@ -628,6 +677,7 @@ static struct attribute *sht3x_attrs[] = {
|
||||||
&sensor_dev_attr_humidity1_min_hyst.dev_attr.attr,
|
&sensor_dev_attr_humidity1_min_hyst.dev_attr.attr,
|
||||||
&sensor_dev_attr_temp1_alarm.dev_attr.attr,
|
&sensor_dev_attr_temp1_alarm.dev_attr.attr,
|
||||||
&sensor_dev_attr_humidity1_alarm.dev_attr.attr,
|
&sensor_dev_attr_humidity1_alarm.dev_attr.attr,
|
||||||
|
&sensor_dev_attr_heater_enable.dev_attr.attr,
|
||||||
&sensor_dev_attr_update_interval.dev_attr.attr,
|
&sensor_dev_attr_update_interval.dev_attr.attr,
|
||||||
NULL
|
NULL
|
||||||
};
|
};
|
||||||
|
|
Loading…
Reference in New Issue