From patchwork Wed Dec 27 19:00:36 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Stefan Gloor X-Patchwork-Id: 183551 Return-Path: Delivered-To: ouuuleilei@gmail.com Received: by 2002:a05:7301:6f82:b0:100:9c79:88ff with SMTP id tb2csp1616886dyb; Wed, 27 Dec 2023 11:06:20 -0800 (PST) X-Google-Smtp-Source: AGHT+IEMj0u06EcXqW3rTr84vqOqmiisYfUhLhli8zsA9IVcrL4YdcdexLfdWy/D0KSuZ+fpNhNY X-Received: by 2002:a17:903:98e:b0:1d3:8e5d:ecf4 with SMTP id mb14-20020a170903098e00b001d38e5decf4mr12671071plb.56.1703703980084; Wed, 27 Dec 2023 11:06:20 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1703703980; cv=none; d=google.com; s=arc-20160816; b=kNlVVHyiFCJXtyCzxnTXVhJnApLNRqDmJI0pNfqq8nIRa7fCGJny8s62E1oOhYoDgQ mFz7DJxgtQnUBsG06AOeJFIj7MJf8REciFs0V2Ol3LLPzOovT/UHwb4sqruIqVnTlZPb m1id5uAoUsUM8zBVk3z6EQLIQcDwI+croo/E9XbyGHXX6VYK3AmsF21jrlAOe9T1ln7N EtxYmU7YI9/CnAfwLYCiuWsQ6SXxH7T6/dK1HnD1k8M/ezePs+hM4ZnevmopYv++jCXl umSFTe71nVFv/+H3WAfrQdrRSc0CgpCCX4sxxX6ElKmM/2TWplXoWZaj+LyaPzZ5a/DX vTPw== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=content-transfer-encoding:mime-version:list-unsubscribe :list-subscribe:list-id:precedence:references:in-reply-to:message-id :date:subject:cc:to:from; bh=jOCZEOazkYwX3r6ncHsNek93k9ZED9F0sKblquPTitc=; fh=fjNSoY0LvOsWcORqEKQpjzRbUZLsws7xZhkeCHIPeqI=; b=D2TO0YqHdkK4dNdPpg7qtbbaJ/uDip5Hx7stdZEGHX6XQcIez0BLa1kz51nFCT+fIE uoiegmJSpB9tPDt1EQAlg6te0vDGNKHxF2yybdY3f6hke7qmLJYYTGfkU3r18KzPXhWW kkMwqLiBeTRwJN/qAY5f9yNXRw7LvV1SRD+Qc1pmQkZbNhrqVmC1vgYdNu2urN6FE/0+ KLkmLE8a+57UCL42M334FHzyzFlL4iaavGko99BJyHGn+mvOjO7bXKPqJQ4MnbtewcoQ 9sNSWPTbl8ikiqaY8+dbQwjwXXs7mYWBq0IFglrMsQaCEO+ifFkq9UsHPSC0FXGUNQe9 zwgQ== ARC-Authentication-Results: i=1; mx.google.com; spf=pass (google.com: domain of linux-kernel+bounces-12220-ouuuleilei=gmail.com@vger.kernel.org designates 2604:1380:45e3:2400::1 as permitted sender) smtp.mailfrom="linux-kernel+bounces-12220-ouuuleilei=gmail.com@vger.kernel.org" Received: from sv.mirrors.kernel.org (sv.mirrors.kernel.org. [2604:1380:45e3:2400::1]) by mx.google.com with ESMTPS id j17-20020a170902da9100b001d3714f17easi11875761plx.37.2023.12.27.11.06.19 for (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 27 Dec 2023 11:06:20 -0800 (PST) Received-SPF: pass (google.com: domain of linux-kernel+bounces-12220-ouuuleilei=gmail.com@vger.kernel.org designates 2604:1380:45e3:2400::1 as permitted sender) client-ip=2604:1380:45e3:2400::1; Authentication-Results: mx.google.com; spf=pass (google.com: domain of linux-kernel+bounces-12220-ouuuleilei=gmail.com@vger.kernel.org designates 2604:1380:45e3:2400::1 as permitted sender) smtp.mailfrom="linux-kernel+bounces-12220-ouuuleilei=gmail.com@vger.kernel.org" Received: from smtp.subspace.kernel.org (wormhole.subspace.kernel.org [52.25.139.140]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by sv.mirrors.kernel.org (Postfix) with ESMTPS id C709D283CAB for ; Wed, 27 Dec 2023 19:06:19 +0000 (UTC) Received: from localhost.localdomain (localhost.localdomain [127.0.0.1]) by smtp.subspace.kernel.org (Postfix) with ESMTP id 0819547797; Wed, 27 Dec 2023 19:06:06 +0000 (UTC) X-Original-To: linux-kernel@vger.kernel.org Received: from mxout017.mail.hostpoint.ch (mxout017.mail.hostpoint.ch [217.26.49.177]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 467C746546; Wed, 27 Dec 2023 19:05:57 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; dmarc=none (p=none dis=none) header.from=stefan-gloor.ch Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=stefan-gloor.ch Received: from [10.0.2.44] (helo=asmtp014.mail.hostpoint.ch) by mxout017.mail.hostpoint.ch with esmtps (TLS1.3) tls TLS_AES_256_GCM_SHA384 (Exim 4.96.2 (FreeBSD)) (envelope-from ) id 1rIZBW-000BDU-2W; Wed, 27 Dec 2023 20:03:18 +0100 Received: from 157.20.79.83.dynamic.wline.res.cust.swisscom.ch ([83.79.20.157] helo=thinkpad.localdomain) by asmtp014.mail.hostpoint.ch with esmtpa (Exim 4.96.2 (FreeBSD)) (envelope-from ) id 1rIZBW-0000IA-1u; Wed, 27 Dec 2023 20:03:18 +0100 X-Authenticated-Sender-Id: code@stefan-gloor.ch From: Stefan Gloor To: jdelvare@suse.com, linux@roeck-us.net, corbet@lwn.net, linux-hwmon@vger.kernel.org, linux-doc@vger.kernel.org, linux-kernel@vger.kernel.org Cc: Stefan Gloor Subject: [PATCH v3 1/1] hwmon: (sht3x) read out sensor serial number Date: Wed, 27 Dec 2023 20:00:36 +0100 Message-ID: <20231227190036.20725-2-code@stefan-gloor.ch> X-Mailer: git-send-email 2.41.0 In-Reply-To: <20231227190036.20725-1-code@stefan-gloor.ch> References: <20231227190036.20725-1-code@stefan-gloor.ch> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 X-Vs-State: 0 X-getmail-retrieved-from-mailbox: INBOX X-GMAIL-THRID: 1786463105101387735 X-GMAIL-MSGID: 1786463105101387735 The temperature/humidity sensors of the STS3x/SHT3x family are calibrated and factory-programmed with a unique serial number. For some sensors, this serial number can be used to obtain a calibration certificate via an API provided by the manufacturer (Sensirion). Expose the serial number via debugfs. Tested with: 2x STS31, 1x STS32, 1x SHT31 Signed-off-by: Stefan Gloor --- Documentation/hwmon/sht3x.rst | 11 +++++++ drivers/hwmon/sht3x.c | 56 ++++++++++++++++++++++++++++++++++- 2 files changed, 66 insertions(+), 1 deletion(-) diff --git a/Documentation/hwmon/sht3x.rst b/Documentation/hwmon/sht3x.rst index 957c854f5d08..9585fa7c5a5d 100644 --- a/Documentation/hwmon/sht3x.rst +++ b/Documentation/hwmon/sht3x.rst @@ -65,6 +65,10 @@ When the temperature and humidity readings move back between the hysteresis values, the alert bit is set to 0 and the alert pin on the sensor is set to low. +The serial number exposed to debugfs allows for unique identification of the +sensors. For sts32, sts33 and sht33, the manufacturer provides calibration +certificates through an API. + sysfs-Interface --------------- @@ -99,3 +103,10 @@ repeatability: write or read repeatability, higher repeatability means - 1: medium repeatability - 2: high repeatability =================== ============================================================ + +debugfs-Interface +----------------- + +=================== ============================================================ +serial_number: unique serial number of the sensor in decimal +=================== ============================================================ diff --git a/drivers/hwmon/sht3x.c b/drivers/hwmon/sht3x.c index 79657910b79e..e016e0d9a6c4 100644 --- a/drivers/hwmon/sht3x.c +++ b/drivers/hwmon/sht3x.c @@ -10,6 +10,7 @@ #include #include +#include #include #include #include @@ -41,6 +42,9 @@ static const unsigned char sht3x_cmd_heater_off[] = { 0x30, 0x66 }; /* other commands */ 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_read_serial_number[] = { 0x37, 0x80 }; + +static struct dentry *debugfs; /* delays for single-shot mode i2c commands, both in us */ #define SHT3X_SINGLE_WAIT_TIME_HPM 15000 @@ -169,6 +173,7 @@ struct sht3x_data { u32 wait_time; /* in us*/ unsigned long last_update; /* last update in periodic mode*/ enum sht3x_repeatability repeatability; + u32 serial_number; /* * cached values for temperature and humidity and limits @@ -831,6 +836,36 @@ static int sht3x_write(struct device *dev, enum hwmon_sensor_types type, } } +static void sht3x_debugfs_init(struct sht3x_data *data) +{ + char name[32]; + struct dentry *sensor_dir; + + snprintf(name, sizeof(name), "i2c%u-%02x", + data->client->adapter->nr, data->client->addr); + sensor_dir = debugfs_create_dir(name, debugfs); + debugfs_create_u32("serial_number", 0444, + sensor_dir, &data->serial_number); +} + +static int sht3x_serial_number_read(struct sht3x_data *data) +{ + int ret; + char buffer[SHT3X_RESPONSE_LENGTH]; + struct i2c_client *client = data->client; + + ret = sht3x_read_from_command(client, data, + sht3x_cmd_read_serial_number, + buffer, + SHT3X_RESPONSE_LENGTH, 0); + if (ret) + return ret; + + data->serial_number = (buffer[0] << 24) | (buffer[1] << 16) | + (buffer[3] << 8) | buffer[4]; + return ret; +} + static const struct hwmon_ops sht3x_ops = { .is_visible = sht3x_is_visible, .read = sht3x_read, @@ -899,6 +934,13 @@ static int sht3x_probe(struct i2c_client *client) if (ret) return ret; + ret = sht3x_serial_number_read(data); + if (ret) { + dev_dbg(dev, "unable to read serial number\n"); + } else { + sht3x_debugfs_init(data); + } + hwmon_dev = devm_hwmon_device_register_with_info(dev, client->name, data, @@ -917,7 +959,19 @@ static struct i2c_driver sht3x_i2c_driver = { .id_table = sht3x_ids, }; -module_i2c_driver(sht3x_i2c_driver); +static int __init sht3x_init(void) +{ + debugfs = debugfs_create_dir("sht3x", NULL); + return i2c_add_driver(&sht3x_i2c_driver); +} +module_init(sht3x_init); + +static void __exit sht3x_cleanup(void) +{ + debugfs_remove_recursive(debugfs); + i2c_del_driver(&sht3x_i2c_driver); +} +module_exit(sht3x_cleanup); MODULE_AUTHOR("David Frey "); MODULE_AUTHOR("Pascal Sachs ");