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