Re: [PATCH v7 3/6] iio: tools: Add support for floating-point numbers in buffer scan elements
From: David Lechner
Date: Wed Mar 04 2026 - 17:54:28 EST
On 3/4/26 2:06 AM, Francesco Lavra wrote:
> 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 <flavra@xxxxxxxxxxxx>
> ---
> tools/iio/iio_generic_buffer.c | 56 +++++++++++++++++++++++++++++-----
> tools/iio/iio_utils.c | 8 ++---
> tools/iio/iio_utils.h | 4 +--
> 3 files changed, 55 insertions(+), 13 deletions(-)
>
> diff --git a/tools/iio/iio_generic_buffer.c b/tools/iio/iio_generic_buffer.c
> index bc82bb6a7a2a..39c13b9ad20b 100644
> --- a/tools/iio/iio_generic_buffer.c
> +++ b/tools/iio/iio_generic_buffer.c
> @@ -89,7 +89,7 @@ static void print1byte(uint8_t input, struct iio_channel_info *info)
> */
> input >>= info->shift;
> input &= info->mask;
> - if (info->is_signed) {
> + if (info->format == 's') {
> int8_t val = (int8_t)(input << (8 - info->bits_used)) >>
> (8 - info->bits_used);
> printf("%05f ", ((float)val + info->offset) * info->scale);
> @@ -112,12 +112,26 @@ static void print2byte(uint16_t input, struct iio_channel_info *info)
> */
> input >>= info->shift;
> input &= info->mask;
> - if (info->is_signed) {
> + switch (info->format) {
> + case 's': {
> int16_t val = (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;
> + case 'f': {
> + union {
> + uint16_t u;
> + __fp16 f;
Do we need to check for compiler support here since this data type might not
be supported on all targets?
Also wondering if _Float16 would be better than __fp16.
> + } converter;
> +
> + converter.u = input;
> + printf("%05f ", ((float)converter.f + info->offset) * info->scale);
> + break;
> + }
> }
> }
>
...
> @@ -46,7 +46,7 @@ struct iio_channel_info {
> unsigned shift;
> uint64_t mask;
> unsigned be;
> - unsigned is_signed;
> + unsigned format;
char would be more natural.
> unsigned location;
> };
>