// SPDX-License-Identifier: GPL-2.0-or-later /* * This is a non-complete driver implementation for the * HS3001 humidity and temperature sensor and compatibles. It does not include * the configuration possibilities, where it needs to be set to 'programming mode' * during power-up. * * * Copyright (C) 2023 SYS TEC electronic AG * Author: Andre Werner <andre.werner@systec-electronic.com>
*/
/* Definitions for Status Bits of A/D Data */ #define HS3001_DATA_VALID 0x00 /* Valid Data */ #define HS3001_DATA_STALE 0x01 /* Stale Data */
struct hs3001_data { struct i2c_client *client; struct mutex i2c_lock; /* lock for sending i2c commands */
u32 wait_time; /* in us */ int temperature; /* in milli degree */
u32 humidity; /* in milli % */
};
static umode_t hs3001_is_visible(constvoid *data, enum hwmon_sensor_types type,
u32 attr, int channel)
{ /* Both, humidity and temperature can only be read. */ return 0444;
}
staticint hs3001_read(struct device *dev, enum hwmon_sensor_types type,
u32 attr, int channel, long *val)
{ struct hs3001_data *data = dev_get_drvdata(dev); struct i2c_client *client = data->client; int ret;
mutex_lock(&data->i2c_lock);
ret = i2c_master_send(client, NULL, 0); if (ret < 0) {
mutex_unlock(&data->i2c_lock); return ret;
}
/* * Sensor needs some time to process measurement depending on * resolution (ref. datasheet)
*/
fsleep(data->wait_time);
ret = hs3001_data_fetch_command(client, data);
mutex_unlock(&data->i2c_lock);
if (ret < 0) return ret;
switch (type) { case hwmon_temp: switch (attr) { case hwmon_temp_input:
*val = data->temperature; break; default: return -EINVAL;
} break; case hwmon_humidity: switch (attr) { case hwmon_humidity_input:
*val = data->humidity; break; default: return -EINVAL;
} break; default: return -EINVAL;
}
if (!i2c_check_functionality(client->adapter, I2C_FUNC_I2C)) return -EOPNOTSUPP;
data = devm_kzalloc(dev, sizeof(*data), GFP_KERNEL); if (!data) return -ENOMEM;
data->client = client;
/* * Measurement time = wake-up time + measurement time temperature * + measurement time humidity. This is currently static, because * enabling programming mode is not supported, yet.
*/
data->wait_time = (HS3001_WAKEUP_TIME + HS3001_14BIT_RESOLUTION +
HS3001_14BIT_RESOLUTION);
MODULE_AUTHOR("Andre Werner <andre.werner@systec-electronic.com>");
MODULE_DESCRIPTION("HS3001 humidity and temperature sensor base driver");
MODULE_LICENSE("GPL");
Messung V0.5 in Prozent
¤ Dauer der Verarbeitung: 0.12 Sekunden
(vorverarbeitet am 2026-04-27)
¤
Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.
Bemerkung:
Die farbliche Syntaxdarstellung und die Messung sind noch experimentell.