Commit 3eaf1b63 authored by Akhilesh Patil's avatar Akhilesh Patil Committed by Guenter Roeck
Browse files

hwmon: (aht10) Add support for dht20



Add support for dht20 temperature and humidity sensor from Aosong.
Modify aht10 driver to handle different init command for dht20 sensor by
adding init_cmd entry in the driver data. dht20 sensor is compatible with
aht10 hwmon driver with this change.

Tested on TI am62x SK board with dht20 sensor connected at i2c-2 port.

Signed-off-by: default avatarAkhilesh Patil <akhilesh@ee.iitb.ac.in>
Link: https://lore.kernel.org/r/2025112-94320-906858@bhairav-test.ee.iitb.ac.in


Signed-off-by: default avatarGuenter Roeck <linux@roeck-us.net>
parent 2ea255d3
Loading
Loading
Loading
Loading
+9 −1
Original line number Diff line number Diff line
@@ -20,6 +20,14 @@ Supported chips:

      English: http://www.aosong.com/userfiles/files/media/Data%20Sheet%20AHT20.pdf

  * Aosong DHT20

    Prefix: 'dht20'

    Addresses scanned: None

    Datasheet: https://www.digikey.co.nz/en/htmldatasheets/production/9184855/0/0/1/101020932

Author: Johannes Cornelis Draaijer <jcdra1@gmail.com>


@@ -33,7 +41,7 @@ The address of this i2c device may only be 0x38
Special Features
----------------

AHT20 has additional CRC8 support which is sent as the last byte of the sensor
AHT20, DHT20 has additional CRC8 support which is sent as the last byte of the sensor
values.

Usage Notes
+3 −3
Original line number Diff line number Diff line
@@ -245,12 +245,12 @@ config SENSORS_ADT7475
	  will be called adt7475.

config SENSORS_AHT10
	tristate "Aosong AHT10, AHT20"
	tristate "Aosong AHT10, AHT20, DHT20"
	depends on I2C
	select CRC8
	help
	  If you say yes here, you get support for the Aosong AHT10 and AHT20
	  temperature and humidity sensors
	  If you say yes here, you get support for the Aosong AHT10, AHT20 and
	  DHT20 temperature and humidity sensors

	  This driver can also be built as a module. If so, the module
	  will be called aht10.
+16 −3
Original line number Diff line number Diff line
@@ -37,6 +37,8 @@
#define AHT10_CMD_MEAS	0b10101100
#define AHT10_CMD_RST	0b10111010

#define DHT20_CMD_INIT	0x71

/*
 * Flags in the answer byte/command
 */
@@ -48,11 +50,12 @@

#define AHT10_MAX_POLL_INTERVAL_LEN	30

enum aht10_variant { aht10, aht20 };
enum aht10_variant { aht10, aht20, dht20};

static const struct i2c_device_id aht10_id[] = {
	{ "aht10", aht10 },
	{ "aht20", aht20 },
	{ "dht20", dht20 },
	{ },
};
MODULE_DEVICE_TABLE(i2c, aht10_id);
@@ -75,6 +78,7 @@ MODULE_DEVICE_TABLE(i2c, aht10_id);
 *              AHT10/AHT20
 *   @crc8: crc8 support flag
 *   @meas_size: measurements data size
 *   @init_cmd: Initialization command
 */

struct aht10_data {
@@ -85,6 +89,7 @@ struct aht10_data {
	int humidity;
	bool crc8;
	unsigned int meas_size;
	u8 init_cmd;
};

/*
@@ -94,13 +99,13 @@ struct aht10_data {
 */
static int aht10_init(struct aht10_data *data)
{
	const u8 cmd_init[] = {AHT10_CMD_INIT, AHT10_CAL_ENABLED | AHT10_MODE_CYC,
	const u8 cmd_init[] = {data->init_cmd, AHT10_CAL_ENABLED | AHT10_MODE_CYC,
			       0x00};
	int res;
	u8 status;
	struct i2c_client *client = data->client;

	res = i2c_master_send(client, cmd_init, 3);
	res = i2c_master_send(client, cmd_init, sizeof(cmd_init));
	if (res < 0)
		return res;

@@ -336,9 +341,17 @@ static int aht10_probe(struct i2c_client *client)
		data->meas_size = AHT20_MEAS_SIZE;
		data->crc8 = true;
		crc8_populate_msb(crc8_table, AHT20_CRC8_POLY);
		data->init_cmd = AHT10_CMD_INIT;
		break;
	case dht20:
		data->meas_size = AHT20_MEAS_SIZE;
		data->crc8 = true;
		crc8_populate_msb(crc8_table, AHT20_CRC8_POLY);
		data->init_cmd = DHT20_CMD_INIT;
		break;
	default:
		data->meas_size = AHT10_MEAS_SIZE;
		data->init_cmd = AHT10_CMD_INIT;
		break;
	}