iio: Simplify getting 32-bit channel values

Use code from the IIO example tools at tools/iio/iio_generic_buffer.c in
the Linux kernel tree to parse the IIO data.
This commit is contained in:
Bastien Nocera
2019-05-13 13:54:27 +02:00
committed by hadess
parent 2fb71895dd
commit 6a67ead786

View File

@@ -51,48 +51,6 @@ struct iio_channel_info {
unsigned location; unsigned location;
}; };
#define _IIO_GETU(__data, __idx, __size, __shift) \
(((guint##__size) (((const guint8 *) (__data))[__idx])) << (__shift))
#define _IIO_READ_UINT32_BE(data) (_IIO_GETU (data, 0, 32, 24) | \
_IIO_GETU (data, 1, 32, 16) | \
_IIO_GETU (data, 2, 32, 8) | \
_IIO_GETU (data, 3, 32, 0))
#define _IIO_READ_UINT32_LE(data) (_IIO_GETU (data, 3, 32, 24) | \
_IIO_GETU (data, 2, 32, 16) | \
_IIO_GETU (data, 1, 32, 8) | \
_IIO_GETU (data, 0, 32, 0))
static inline guint32
iio_readu32 (struct iio_channel_info *info, const guint8 * data)
{
if (info->be)
return _IIO_READ_UINT32_BE (data + info->location);
return _IIO_READ_UINT32_LE(data + info->location);
}
#define _IIO_GET(__data, __idx, __size, __shift) \
(((guint##__size) (((const guint8 *) (__data))[__idx])) << (__shift))
#define _IIO_READ_INT32_BE(data) (_IIO_GET (data, 0, 32, 24) | \
_IIO_GET (data, 1, 32, 16) | \
_IIO_GET (data, 2, 32, 8) | \
_IIO_GET (data, 3, 32, 0))
#define _IIO_READ_INT32_LE(data) (_IIO_GET (data, 3, 32, 24) | \
_IIO_GET (data, 2, 32, 16) | \
_IIO_GET (data, 1, 32, 8) | \
_IIO_GET (data, 0, 32, 0))
static inline gint32
iio_read32 (struct iio_channel_info *info, const gint8 * data)
{
if (info->be)
return _IIO_READ_INT32_BE (data + info->location);
return _IIO_READ_INT32_LE(data + info->location);
}
static char * static char *
iioutils_break_up_name (const char *name) iioutils_break_up_name (const char *name)
{ {
@@ -562,22 +520,24 @@ process_scan_1 (char *data,
switch (info->bytes) { switch (info->bytes) {
/* only a few cases implemented so far */ /* only a few cases implemented so far */
case 4: case 4: {
if (!info->is_signed) { guint32 input;
guint32 val = iio_readu32(info, (guint8 *) data);
val = val >> info->shift; input = *(guint32 *)(data + info->location);
if (info->bits_used < 32) input = info->be ? GUINT32_FROM_BE (input) : GUINT32_FROM_LE (input);
val &= ((guint32) 1 << info->bits_used) - 1; input >>= info->shift;
*ch_val = (int) val; input &= info->mask;
if (info->is_signed) {
gint32 val = (gint32)(input << (32 - info->bits_used)) >>
(32 - info->bits_used);
val += info->offset;
*ch_val = val;
} else { } else {
gint32 val = iio_read32(info, (gint8 *) data); *ch_val = input + info->offset;
val = val >> info->shift;
if (info->bits_used < 32)
val &= ((guint32) 1 << info->bits_used) - 1;
val = (gint32) (val << (32 - info->bits_used)) >> (32 - info->bits_used);
*ch_val = (int) val;
} }
break; break;
}
case 1: case 1:
case 2: case 2:
case 8: case 8: