staging:iio:generic_buffer example - handle endian differences
authorJonathan Cameron <jic23@cam.ac.uk>
Sun, 4 Dec 2011 19:10:59 +0000 (19:10 +0000)
committerGreg Kroah-Hartman <gregkh@suse.de>
Thu, 8 Dec 2011 19:32:35 +0000 (11:32 -0800)
Signed-off-by: Jonathan Cameron <jic23@cam.ac.uk>
Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
drivers/staging/iio/Documentation/generic_buffer.c
drivers/staging/iio/Documentation/iio_utils.h

index d58095321491449986c0a3dd51aedf58223a3aa3..69a05b9456d6cae1e74563acb8e59db02a280995 100644 (file)
@@ -28,6 +28,7 @@
 #include <linux/types.h>
 #include <string.h>
 #include <poll.h>
+#include <endian.h>
 #include "iio_utils.h"
 
 /**
@@ -56,6 +57,13 @@ int size_from_channelarray(struct iio_channel_info *channels, int num_channels)
 
 void print2byte(int input, struct iio_channel_info *info)
 {
+       /* First swap if incorrect endian */
+
+       if (info->be)
+               input = be16toh((uint_16t)input);
+       else
+               input = le16toh((uint_16t)input);
+
        /* shift before conversion to avoid sign extension
           of left aligned data */
        input = input >> info->shift;
index 986889b6a1f6089e45ff762f21bb7ee6e1facbdb..6f3a392297ec07d711e0c75a51cc62112acb3e97 100644 (file)
@@ -74,6 +74,7 @@ struct iio_channel_info {
        unsigned bits_used;
        unsigned shift;
        uint64_t mask;
+       unsigned be;
        unsigned is_signed;
        unsigned enabled;
        unsigned location;
@@ -84,6 +85,7 @@ struct iio_channel_info {
  * @is_signed: output whether channel is signed
  * @bytes: output how many bytes the channel storage occupies
  * @mask: output a bit mask for the raw data
+ * @be: big endian
  * @device_dir: the iio device directory
  * @name: the channel name
  * @generic_name: the channel type name
@@ -93,6 +95,7 @@ inline int iioutils_get_type(unsigned *is_signed,
                             unsigned *bits_used,
                             unsigned *shift,
                             uint64_t *mask,
+                            unsigned *be,
                             const char *device_dir,
                             const char *name,
                             const char *generic_name)
@@ -101,7 +104,7 @@ inline int iioutils_get_type(unsigned *is_signed,
        int ret;
        DIR *dp;
        char *scan_el_dir, *builtname, *builtname_generic, *filename = 0;
-       char signchar;
+       char signchar, endianchar;
        unsigned padint;
        const struct dirent *ent;
 
@@ -156,6 +159,7 @@ inline int iioutils_get_type(unsigned *is_signed,
                                printf("failed to pass scan type description\n");
                                return ret;
                        }
+                       *be = (endianchar == 'b');
                        *bytes = padint / 8;
                        if (*bits_used == 64)
                                *mask = ~0;
@@ -399,6 +403,7 @@ inline int build_channel_array(const char *device_dir,
                                                &current->bits_used,
                                                &current->shift,
                                                &current->mask,
+                                               &current->be,
                                                device_dir,
                                                current->name,
                                                current->generic_name);