From nobody Mon Apr 6 23:35:57 2026 Received: from mail-lf1-f46.google.com (mail-lf1-f46.google.com [209.85.167.46]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 47B981FC7 for ; Tue, 17 Mar 2026 15:04:12 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.167.46 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1773759853; cv=none; b=Tao4dK0Zd7KZCLG5y0VNjDx0QECjhQDvYoxjhXhDAnSoY818DFkypfxt+tvGMfn3mqdrrYWTteKaTylc8RMmO7sEENTETV/+4W2bzxEQvmNVakmPEUaxaBL/oPUxoijJShXGwaG5FGrjvqjyohlKAJhYKxDILvgmLwhE0BmYv74= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1773759853; c=relaxed/simple; bh=6a+Xn6NnG/8MprGOzF86J6ycUeL5AAW7PxS2qczBlu4=; h=From:To:Subject:Date:Message-Id:In-Reply-To:References: MIME-Version; b=ShnXu3NzXN+ysJRFT+HWts1EJuJaWa8vFBwS77Hsr4jV+sn5+pl//TrytdRa4F309+RY9EIZy6L9gMobfFMQseY0/mGlWmnnHrpLeW5aNRAEZHz4CYfdUJH2YwNQ9yhU01G9rOh6RmLNDr9wDUNtoqSg6ns9cP7kp5mzv13aJ+Q= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=none (p=none dis=none) header.from=baylibre.com; spf=pass smtp.mailfrom=baylibre.com; dkim=pass (2048-bit key) header.d=baylibre-com.20230601.gappssmtp.com header.i=@baylibre-com.20230601.gappssmtp.com header.b=NHy1q47L; arc=none smtp.client-ip=209.85.167.46 Authentication-Results: smtp.subspace.kernel.org; dmarc=none (p=none dis=none) header.from=baylibre.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=baylibre.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=baylibre-com.20230601.gappssmtp.com header.i=@baylibre-com.20230601.gappssmtp.com header.b="NHy1q47L" Received: by mail-lf1-f46.google.com with SMTP id 2adb3069b0e04-5a1307438ddso5779209e87.1 for ; Tue, 17 Mar 2026 08:04:12 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=baylibre-com.20230601.gappssmtp.com; s=20230601; t=1773759850; x=1774364650; darn=vger.kernel.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:to:from:from:to:cc:subject:date:message-id :reply-to; bh=r21/87fWkstXATGZU1YjKqhkHTuYYucKq7beo3fBdD4=; b=NHy1q47Lv80XssXv1bXZ1Q+gSs4yKeRe/jL08uTjUujnDq3V4fulTcQMoll1PWmHxm GG4fHbeuFhXHtBqBlNxsHALx9Aw9Y1wPHQV8OkpkeYfAtL4xR+hrZJ9XJM/UVpXu4Mlu SavJw+6/CYwG9kE2H/DPI0vY1TBRIDwgQXmMedwOehPlwianmufZkZj6YAEYb8mE01fs c6QrFDUxAb1wnw4wJyW+4v5NQe/tfI0o9faw4kiG3nHqehpZ3NS7nPHca8i65SZKF5G6 NOJSgqnJLCuPvTn7EI9mZLi9zzA6ahCZzwRiycwxlWwOD6GVfjjAxcsv9cU4JmI9eIU3 /+Sw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1773759850; x=1774364650; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:to:from:x-gm-gg:x-gm-message-state:from:to :cc:subject:date:message-id:reply-to; bh=r21/87fWkstXATGZU1YjKqhkHTuYYucKq7beo3fBdD4=; b=XrdVUUXhaV09gf11ukjEdyo4SMl6ATBwyr+ThB11qXSVbeUIFG5jQYizGR8ZvfOrFl Gjvh1x1RZlRfji283FRoNdotwOzhDUAaoaymQjlgMiEjxpp8usUAMIH49ScEqkBJyMRr nH3AYY9HqAn0v/iNRPW7KZMmrewZDZa7+MKHR1Y+PKcF1ApfJoLd22qQnvsO0aGaOYU3 FH7OFgLqF3giog8L9CDlWcbLxGAeMuJYzW88Gq73bTDxIUYpso5DTahOVYgr/oREi5j9 6CQUZczwF7g83z2HPQENvIVfD+sAFq2w64wySYmGkBTuAo3igYv2/uxRVwiQcLnNfMqY yO2w== X-Forwarded-Encrypted: i=1; AJvYcCUAAZYp13HUyVB1Mocv1P+X91AtqOivLBQM2IYBfwrns/W/l4L49Juv5EQXpqQZSI1lWn4kd1RSreemsQM=@vger.kernel.org X-Gm-Message-State: AOJu0YzpKJnNnEziNVxfMT8aOJT7K+ihWX5jm/R79htz94foCv1smeyF e6PvBZW0RGdh7YbXsYjWH85mYGJS43yW3RgsG5x9Szz01HDbPTQkDyLFj0whT2efZCM= X-Gm-Gg: ATEYQzyoVlRPGAPqylYKzCxX+36Zgwv6a8Kol9XU5lF6Uk9Dj6YkeIJj3FQjyXBAhxn f0N830MClphbs1vuebB3X3uLp7ex4KUlkuL4zVIgnbrD/ijsVoVgfM/4gdTxJ5017WxL0NRGk/V zuM6aiweTHbtKeR5//Ytz+syVSabnQ8jfoEa6GaPTY4qk15yK+BDLdWrcM5JLqdCC5aF4nStAHV D9sAM4vI8vXx0ol9NwV8cRiYmX4MH7/BpvzOuPt7udkULS5JrhOa923lGUDmms8FUhgvrrf/NVO 85bySjcGPgYDOP/f+On5nMOKUxMiMsnJUexZGj7+tza2Oby0+wiMzOwLH57T0iuSvK53J2ZJV/L 9AWIMXwbhnjgxQvZXbqSr43565P1BglKOF5FUOvk3xo0IpFC4Io3kWG+FZz6gSBqRXFoADQ== X-Received: by 2002:ac2:4e83:0:b0:5a1:4473:bb44 with SMTP id 2adb3069b0e04-5a162b12580mr4573766e87.33.1773759848791; Tue, 17 Mar 2026 08:04:08 -0700 (PDT) Received: from localhost ([151.37.101.237]) by smtp.gmail.com with ESMTPSA id ffacd0b85a97d-43b51852097sm104795f8f.9.2026.03.17.08.04.08 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 17 Mar 2026 08:04:08 -0700 (PDT) From: Francesco Lavra To: Jonathan Cameron , David Lechner , =?UTF-8?q?Nuno=20S=C3=A1?= , Andy Shevchenko , linux-iio@vger.kernel.org, linux-kernel@vger.kernel.org Subject: [PATCH v8 3/6] iio: tools: Add support for floating-point types in buffer scan elements Date: Tue, 17 Mar 2026 16:04:08 +0100 Message-Id: <20260317150408.3878335-1-flavra@baylibre.com> X-Mailer: git-send-email 2.39.5 In-Reply-To: <20260317150316.3878107-1-flavra@baylibre.com> References: <20260317150316.3878107-1-flavra@baylibre.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 X-Developer-Signature: v=1; a=openpgp-sha256; l=5878; i=flavra@baylibre.com; h=from:subject; bh=6a+Xn6NnG/8MprGOzF86J6ycUeL5AAW7PxS2qczBlu4=; b=owEB7QES/pANAwAKAe3xO3POlDZfAcsmYgBpuW1ngtBo1B9Hy5EL0X1iDU+Zh8q1yasMlCqGN +ghrVMIeciJAbMEAAEKAB0WIQSGV4VPlTvcox7DFObt8TtzzpQ2XwUCabltZwAKCRDt8TtzzpQ2 X75jDACKVpDjf9TWI33WXpoWG71eq4jtbJ4CtB4pAPmc+kqfdWtIMIatKtFsf4WS9cljpWgWPPt 3pckJjP1KYEOpQnmKue1LVNjOGb6vOGJ2CrHgKpWxnSXw0BVmgTPN6pLeaTpoENNZFIbYeCXO44 iz9iJddl2wN8NnV8SaR2RjKr+dlVZH74Pytza2hKmkF4zQuXuKmANcqmhKC2lEk2X9cRcQMr8Dw 5AEHykS18AAmMDLHniMLhqnbfdsi71WKR4GczJjDvEGTxcFZl7brToMPKT2/Jb/V7GvL1i0thqI tRpV689r0RdqUkZ4tFFzxaNUT455z5wQ+XkC48SKtW53alKZk0U7rhQ+Rv4BRLK7H9ntxoMlUIj FRtwlaLEEec9DOnOQEUxxrf6E1oCgaZYMP/WCp9RORG7Phd1JugMjYTJeImpQRZAzJyH83RQrpp xINDlHb1Jklj9t6CqJ4Wbg9JSyoAKeSz/TVRLkVLfpZwIhVJTZmkt3989yMOe7MRltIXk= X-Developer-Key: i=flavra@baylibre.com; a=openpgp; fpr=8657854F953BDCA31EC314E6EDF13B73CE94365F Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" A subsequent commit will add floating-point support to the ABI; enhance the iio_generic_buffer tool to be able to parse this new data format. Signed-off-by: Francesco Lavra --- tools/iio/iio_generic_buffer.c | 59 ++++++++++++++++++++++++++++++---- tools/iio/iio_utils.c | 8 ++--- tools/iio/iio_utils.h | 4 +-- 3 files changed, 58 insertions(+), 13 deletions(-) diff --git a/tools/iio/iio_generic_buffer.c b/tools/iio/iio_generic_buffer.c index bc82bb6a7a2a..a21552c2b190 100644 --- a/tools/iio/iio_generic_buffer.c +++ b/tools/iio/iio_generic_buffer.c @@ -26,6 +26,7 @@ #include #include #include +#include #include #include #include @@ -89,7 +90,7 @@ static void print1byte(uint8_t input, struct iio_channel_= info *info) */ input >>=3D info->shift; input &=3D info->mask; - if (info->is_signed) { + if (info->format =3D=3D 's') { int8_t val =3D (int8_t)(input << (8 - info->bits_used)) >> (8 - info->bits_used); printf("%05f ", ((float)val + info->offset) * info->scale); @@ -112,12 +113,28 @@ static void print2byte(uint16_t input, struct iio_cha= nnel_info *info) */ input >>=3D info->shift; input &=3D info->mask; - if (info->is_signed) { + switch (info->format) { + case 's': { int16_t val =3D (int16_t)(input << (16 - info->bits_used)) >> (16 - info->bits_used); printf("%05f ", ((float)val + info->offset) * info->scale); - } else { + break; + } + case 'u': printf("%05f ", ((float)input + info->offset) * info->scale); + break; +#if defined(__FLT16_MAX__) + case 'f': { + union { + uint16_t u; + _Float16 f; + } converter; + + converter.u =3D input; + printf("%05f ", ((float)converter.f + info->offset) * info->scale); + break; + } +#endif } } =20 @@ -135,12 +152,26 @@ static void print4byte(uint32_t input, struct iio_cha= nnel_info *info) */ input >>=3D info->shift; input &=3D info->mask; - if (info->is_signed) { + switch (info->format) { + case 's': { int32_t val =3D (int32_t)(input << (32 - info->bits_used)) >> (32 - info->bits_used); printf("%05f ", ((float)val + info->offset) * info->scale); - } else { + break; + } + case 'u': printf("%05f ", ((float)input + info->offset) * info->scale); + break; + case 'f': { + union { + uint32_t u; + float f; + } converter; + + converter.u =3D input; + printf("%05f ", (converter.f + info->offset) * info->scale); + break; + } } } =20 @@ -158,7 +189,8 @@ static void print8byte(uint64_t input, struct iio_chann= el_info *info) */ input >>=3D info->shift; input &=3D info->mask; - if (info->is_signed) { + switch (info->format) { + case 's': { int64_t val =3D (int64_t)(input << (64 - info->bits_used)) >> (64 - info->bits_used); /* special case for timestamp */ @@ -167,8 +199,21 @@ static void print8byte(uint64_t input, struct iio_chan= nel_info *info) else printf("%05f ", ((float)val + info->offset) * info->scale); - } else { + break; + } + case 'u': printf("%05f ", ((float)input + info->offset) * info->scale); + break; + case 'f': { + union { + uint64_t u; + double f; + } converter; + + converter.u =3D input; + printf("%05f ", (converter.f + info->offset) * info->scale); + break; + } } } =20 diff --git a/tools/iio/iio_utils.c b/tools/iio/iio_utils.c index c5c5082cb24e..f1d58db69942 100644 --- a/tools/iio/iio_utils.c +++ b/tools/iio/iio_utils.c @@ -70,7 +70,7 @@ int iioutils_break_up_name(const char *full_name, char **= generic_name) =20 /** * iioutils_get_type() - find and process _type attribute data - * @is_signed: output whether channel is signed + * @format: output channel format * @bytes: output how many bytes the channel storage occupies * @bits_used: output number of valid bits of data * @shift: output amount of bits to shift right data before applying bit m= ask @@ -83,7 +83,7 @@ int iioutils_break_up_name(const char *full_name, char **= generic_name) * * Returns a value >=3D 0 on success, otherwise a negative error code. **/ -static int iioutils_get_type(unsigned int *is_signed, unsigned int *bytes, +static int iioutils_get_type(char *format, unsigned int *bytes, unsigned int *bits_used, unsigned int *shift, uint64_t *mask, unsigned int *be, const char *device_dir, int buffer_idx, @@ -162,7 +162,7 @@ static int iioutils_get_type(unsigned int *is_signed, u= nsigned int *bytes, else *mask =3D (1ULL << *bits_used) - 1ULL; =20 - *is_signed =3D (signchar =3D=3D 's'); + *format =3D signchar; if (fclose(sysfsfp)) { ret =3D -errno; fprintf(stderr, "Failed to close %s\n", @@ -487,7 +487,7 @@ int build_channel_array(const char *device_dir, int buf= fer_idx, if ((ret < 0) && (ret !=3D -ENOENT)) goto error_cleanup_array; =20 - ret =3D iioutils_get_type(¤t->is_signed, + ret =3D iioutils_get_type(¤t->format, ¤t->bytes, ¤t->bits_used, ¤t->shift, diff --git a/tools/iio/iio_utils.h b/tools/iio/iio_utils.h index 663c94a6c705..8c72f002d050 100644 --- a/tools/iio/iio_utils.h +++ b/tools/iio/iio_utils.h @@ -32,7 +32,7 @@ extern const char *iio_dir; * @shift: amount of bits to shift right data before applying bit mask * @mask: a bit mask for the raw output * @be: flag if data is big endian - * @is_signed: is the raw value stored signed + * @format: format of the raw value * @location: data offset for this channel inside the buffer (in bytes) **/ struct iio_channel_info { @@ -46,7 +46,7 @@ struct iio_channel_info { unsigned shift; uint64_t mask; unsigned be; - unsigned is_signed; + char format; unsigned location; }; =20 --=20 2.39.5