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:
@@ -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:
|
||||
|
Reference in New Issue
Block a user