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;
};
#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 *
iioutils_break_up_name (const char *name)
{
@@ -562,22 +520,24 @@ process_scan_1 (char *data,
switch (info->bytes) {
/* only a few cases implemented so far */
case 4:
if (!info->is_signed) {
guint32 val = iio_readu32(info, (guint8 *) data);
val = val >> info->shift;
if (info->bits_used < 32)
val &= ((guint32) 1 << info->bits_used) - 1;
*ch_val = (int) val;
case 4: {
guint32 input;
input = *(guint32 *)(data + info->location);
input = info->be ? GUINT32_FROM_BE (input) : GUINT32_FROM_LE (input);
input >>= info->shift;
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 {
gint32 val = iio_read32(info, (gint8 *) data);
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;
*ch_val = input + info->offset;
}
break;
}
case 1:
case 2:
case 8: