Merge branch 'master' of https://github.com/szmoore/MCTX3420.git
authorJeremy Tan <[email protected]>
Mon, 26 Aug 2013 05:38:15 +0000 (13:38 +0800)
committerJeremy Tan <[email protected]>
Mon, 26 Aug 2013 05:38:15 +0000 (13:38 +0800)
camera/capture.c [new file with mode: 0644]
irc/log
sensors/beagleboard sensors notes.docx [new file with mode: 0644]
sensors/sensors test drivers (c)/generic_buffer.c [new file with mode: 0644]
sensors/sensors test drivers (c)/iio_utils.h [new file with mode: 0644]
sensors/sensors test drivers (c)/readme.txt [new file with mode: 0644]
sensors/sensors test drivers (c)/script_adc.sh [new file with mode: 0644]
sensors/sensors test drivers (c)/script_trigger.sh [new file with mode: 0644]
sensors/simple code examples.c [new file with mode: 0644]
sensors/simpleGPIO (c++)/SimpleGPIO.cpp [new file with mode: 0644]
sensors/simpleGPIO (c++)/SimpleGPIO.h [new file with mode: 0644]

diff --git a/camera/capture.c b/camera/capture.c
new file mode 100644 (file)
index 0000000..815cef0
--- /dev/null
@@ -0,0 +1,59 @@
+#include "cv.h"
+#include "highgui_c.h"
+#include <string.h>
+#include <stdio.h>
+#include <time.h>
+
+int storeFrame( CvCapture* capture)
+{
+       IplImage *frame;
+       time_t rawtime; // time given in seconds since jan 1st 1970
+       struct tm *timeInfo;// time structure containing current time info
+       int buf = 100;
+       char timestamp[buf];
+       char filepath[buf];     // filepath to save the image to
+
+       //USING char *filepath creates seg fault. need to define bufsize, how big?
+
+       time(&rawtime);
+       timeInfo = localtime(&rawtime);
+       snprintf(timestamp,buf-1,"%d.%d.%d_%d.%d.%d", timeInfo->tm_year + 1900, timeInfo->tm_mon + 1, timeInfo->tm_mday,timeInfo->tm_hour, timeInfo->tm_min, timeInfo->tm_sec);
+       snprintf(filepath,buf-1,"images/image_%s.JPG",timestamp);
+
+       /*int p[3];
+       p[0] = CV_IMWRITE_JPEG_QUALITY;
+       p[1] = 10;
+       p[2] = 0;*/
+               
+       frame = cvQueryFrame(capture);
+       if( frame == NULL)
+               return 0;       //error
+       cvSaveImage(filepath,frame,0);
+       
+       return 1;
+}
+
+int main (int argc, char** argv)
+{
+       CvCapture* capture;
+       
+       //Get capture structure for camera, -1 refers to any camera device.
+       //If multiple cameras used, need to use specific camera ID
+       capture = cvCreateCameraCapture(-1);
+       //If cvCreateCameraCapture returns NULL there is an error with the camera
+       if( capture == NULL)
+               return -1;
+
+       int i;
+       for( i=0;i<10;i++)
+       {
+               if( !storeFrame( capture))
+                       return -1;
+               sleep(1);       //for now just to make the camera take 1 shot a second, as that's all my camera seems to be able to take/save (camera or function causing this? is 1 second per frame enough?)
+       }
+       
+       //Need to determine how the function is called in respect to system. just leave it running with a while loop? will something turn it on and off? will the function be called once from elsewhere?
+
+       cvReleaseCapture( &capture);
+}
+
diff --git a/irc/log b/irc/log
index 670855f..73c9654 100644 (file)
--- a/irc/log
+++ b/irc/log
 21:47 -!- jtanx [[email protected]] has quit ["ChatZilla 0.9.89 [Firefox 23.0.1/20130814063812]"]
 --- Day changed Wed Aug 21 2013
 00:53 -!- Callum [[email protected]] has quit [EOF From client]
+07:45 -!- jtanx [[email protected]] has joined #mctxuwa_softdev
+11:57 < jtanx> hmm
+11:57 < jtanx> I just had a play with the sensor stuff
+11:57 < jtanx> and I trialled a 'double buffer' scheme
+11:57 < jtanx> instead of the binary file idea
+11:57 < jtanx> seems to work okay, and it guarantees that a point won't be returned to the user if they have already received it
+12:35 < jtanx> urgh
+12:35 < jtanx> just worked through some stupid bug
+12:37 < jtanx> I think it's because make didn't recompile something because it thought it hadn't changed
+12:38 < jtanx> probably the header files
+12:50 < jtanx> you can see the double buffer method in this branch: https://github.com/jtanx/MCTX3420/tree/doublebuffer
+12:58 < jtanx> one issue though is that writing out csv instead of binary file takes up a lot more space
+14:49 -!- james__ [[email protected]] has joined #mctxuwa_softdev
+14:49 < james__> Hey
+14:50 -!- james__ [[email protected]] has quit ["ChatZilla 0.9.90.1 [Firefox 23.0.1/20130814063812]"]
+18:32 -!- Callum [[email protected]] has joined #mctxuwa_softdev
+19:48 -!- jtanx [[email protected]] has quit [Ping timeout]
+19:51 -!- jtanx [[email protected]] has joined #mctxuwa_softdev
+23:12 -!- jtanx [[email protected]] has quit ["・_・"]
+--- Day changed Thu Aug 22 2013
+00:46 -!- Callum [[email protected]] has quit [EOF From client]
+08:19 -!- jtanx [[email protected]] has joined #mctxuwa_softdev
+10:00 -!- jtanx [[email protected]] has left #mctxuwa_softdev []
+13:19 -!- callum [[email protected]] has joined #mctxuwa_softdev
+13:20 < callum> hey
+13:53 -!- jtanx [[email protected]] has joined #mctxuwa_softdev
+14:35 -!- callum [[email protected]] has quit [Ping timeout]
+15:07 -!- callum [[email protected]] has joined #mctxuwa_softdev
+15:07 < callum> sam you still at uni?
+15:22 < callum> or jeremy if you remember what he used to compile the file. i'v managed to get it to recognise the header files but now its complaining about not being able to find the libraries.
+15:34 < jtanx> um
+15:34 < jtanx> I can't remember
+15:34 < jtanx> didn't you use pkg config to find out
+15:36 < jtanx> try this http://opencv.willowgarage.com/wiki/CompileOpenCVUsingLinux
+15:54 -!- callum [[email protected]] has quit [EOF From client]
+21:43 -!- jtanx [[email protected]] has quit ["._."]
+22:08 < sam_moore> gcc -o opencv opencv.c -I/usr/include/opencv -lopencv_core -lopencv_highgui -lopencv_imgproc
+22:08 -!- Irssi: #mctxuwa_softdev: Total of 1 nicks [0 ops, 0 halfops, 0 voices, 1 normal]
+22:08 < sam_moore> Oh... there's no one here
+22:08 < sam_moore> Well, if you read the IRC logs when they're commited to git, you'll see it. Good luck.
+--- Day changed Fri Aug 23 2013
+07:42 -!- jtanx [[email protected]] has joined #mctxuwa_softdev
+07:49 -!- jtanx [[email protected]] has quit ["ChatZilla 0.9.89 [Firefox 23.0.1/20130814063812]"]
+07:52 -!- jtanx [[email protected]] has joined #mctxuwa_softdev
+08:59 -!- jtanx [[email protected]] has quit ["ChatZilla 0.9.89 [Firefox 23.0.1/20130814063812]"]
+10:02 -!- jtanx [[email protected]] has joined #mctxuwa_softdev
+10:12 -!- jtanx [[email protected]] has quit ["http://www.mibbit.com ajax IRC Client"]
+10:13 -!- jtanx_ [[email protected]] has joined #mctxuwa_softdev
+12:30 < jtanx_> um
+12:30 < jtanx_> do you know how you connected the relay board to the sensor board
+12:30 < jtanx_> for the soldering lab
+12:45 < jtanx_> and what sort of wire did you use?
+12:58 < jtanx_>  brb
+12:58 -!- jtanx_ [[email protected]] has quit ["http://www.mibbit.com ajax IRC Client"]
+13:51 -!- jtanx [[email protected]] has joined #mctxuwa_softdev
+--- Log opened Sat Aug 24 17:07:53 2013
+17:07 -!- matches [[email protected]] has joined #mctxuwa_softdev
+17:07 -!- ServerMode/#mctxuwa_softdev [+nt] by irc.eversible.com
+17:07 -!- Irssi: #mctxuwa_softdev: Total of 1 nicks [1 ops, 0 halfops, 0 voices, 0 normal]
+17:07 -!- Irssi: Join to #mctxuwa_softdev was synced in 1 secs
+17:08 -!- You're now known as sam_moore
diff --git a/sensors/beagleboard sensors notes.docx b/sensors/beagleboard sensors notes.docx
new file mode 100644 (file)
index 0000000..746600c
Binary files /dev/null and b/sensors/beagleboard sensors notes.docx differ
diff --git a/sensors/sensors test drivers (c)/generic_buffer.c b/sensors/sensors test drivers (c)/generic_buffer.c
new file mode 100644 (file)
index 0000000..40d0eca
--- /dev/null
@@ -0,0 +1,340 @@
+/* Industrialio buffer test code.
+ *
+ * Copyright (c) 2008 Jonathan Cameron
+ *
+ * This program is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 as published by
+ * the Free Software Foundation.
+ *
+ * This program is primarily intended as an example application.
+ * Reads the current buffer setup from sysfs and starts a short capture
+ * from the specified device, pretty printing the result after appropriate
+ * conversion.
+ *
+ * Command line parameters
+ * generic_buffer -n <device_name> -t <trigger_name>
+ * If trigger name is not specified the program assumes you want a dataready
+ * trigger associated with the device and goes looking for it.
+ *
+ */
+
+#define _GNU_SOURCE
+
+#include <unistd.h>
+#include <dirent.h>
+#include <fcntl.h>
+#include <stdio.h>
+#include <errno.h>
+#include <sys/stat.h>
+#include <sys/dir.h>
+#include <linux/types.h>
+#include <string.h>
+#include <poll.h>
+#include <endian.h>
+#include <getopt.h>
+#include <inttypes.h>
+#include "iio_utils.h"
+
+/**
+ * size_from_channelarray() - calculate the storage size of a scan
+ * @channels:          the channel info array
+ * @num_channels:      number of channels
+ *
+ * Has the side effect of filling the channels[i].location values used
+ * in processing the buffer output.
+ **/
+int size_from_channelarray(struct iio_channel_info *channels, int num_channels)
+{
+       int bytes = 0;
+       int i = 0;
+       while (i < num_channels) {
+               if (bytes % channels[i].bytes == 0)
+                       channels[i].location = bytes;
+               else
+                       channels[i].location = bytes - bytes%channels[i].bytes
+                               + channels[i].bytes;
+               bytes = channels[i].location + channels[i].bytes;
+               i++;
+       }
+       return bytes;
+}
+
+void print2byte(int input, struct iio_channel_info *info)
+{
+       /* First swap if incorrect endian */
+       if (info->be)
+               input = be16toh((uint16_t)input);
+       else
+               input = le16toh((uint16_t)input);
+
+       /*
+        * Shift before conversion to avoid sign extension
+        * of left aligned data
+        */
+       input = input >> info->shift;
+       if (info->is_signed) {
+               int16_t val = input;
+               val &= (1 << info->bits_used) - 1;
+               val = (int16_t)(val << (16 - info->bits_used)) >>
+                       (16 - info->bits_used);
+               printf("%05f ", ((float)val + info->offset)*info->scale);
+       } else {
+               uint16_t val = input;
+               val &= (1 << info->bits_used) - 1;
+               printf("%05f ", ((float)val + info->offset)*info->scale);
+       }
+}
+/**
+ * process_scan() - print out the values in SI units
+ * @data:              pointer to the start of the scan
+ * @channels:          information about the channels. Note
+ *  size_from_channelarray must have been called first to fill the
+ *  location offsets.
+ * @num_channels:      number of channels
+ **/
+void process_scan(char *data,
+                 struct iio_channel_info *channels,
+                 int num_channels)
+{
+       int k;
+       for (k = 0; k < num_channels; k++)
+               switch (channels[k].bytes) {
+                       /* only a few cases implemented so far */
+               case 2:
+                       print2byte(*(uint16_t *)(data + channels[k].location),
+                                  &channels[k]);
+                       break;
+               case 4:
+                       if (!channels[k].is_signed) {
+                               uint32_t val = *(uint32_t *)
+                                       (data + channels[k].location);
+                               printf("%05f ", ((float)val +
+                                                channels[k].offset)*
+                                      channels[k].scale);
+
+                       }
+                       break;
+               case 8:
+                       if (channels[k].is_signed) {
+                               int64_t val = *(int64_t *)
+                                       (data +
+                                        channels[k].location);
+                               if ((val >> channels[k].bits_used) & 1)
+                                       val = (val & channels[k].mask) |
+                                               ~channels[k].mask;
+                               /* special case for timestamp */
+                               if (channels[k].scale == 1.0f &&
+                                   channels[k].offset == 0.0f)
+                                       printf("%" PRId64 " ", val);
+                               else
+                                       printf("%05f ", ((float)val +
+                                                        channels[k].offset)*
+                                              channels[k].scale);
+                       }
+                       break;
+               default:
+                       break;
+               }
+       printf("\n");
+}
+
+int main(int argc, char **argv)
+{
+       unsigned long num_loops = 2;
+       unsigned long timedelay = 1000000;
+       unsigned long buf_len = 128;
+
+       int ret, c, i, j, toread;
+       int fp;
+
+       int num_channels;
+       char *trigger_name = NULL, *device_name = NULL;
+       char *dev_dir_name, *buf_dir_name;
+
+       int datardytrigger = 1;
+       char *data;
+       ssize_t read_size;
+       int dev_num, trig_num;
+       char *buffer_access;
+       int scan_size;
+       int noevents = 0;
+       char *dummy;
+
+       struct iio_channel_info *channels;
+
+       while ((c = getopt(argc, argv, "l:w:c:et:n:")) != -1) {
+               switch (c) {
+               case 'n':
+                       device_name = optarg;
+                       break;
+               case 't':
+                       trigger_name = optarg;
+                       datardytrigger = 0;
+                       break;
+               case 'e':
+                       noevents = 1;
+                       break;
+               case 'c':
+                       num_loops = strtoul(optarg, &dummy, 10);
+                       break;
+               case 'w':
+                       timedelay = strtoul(optarg, &dummy, 10);
+                       break;
+               case 'l':
+                       buf_len = strtoul(optarg, &dummy, 10);
+                       break;
+               case '?':
+                       return -1;
+               }
+       }
+
+       if (device_name == NULL)
+               return -1;
+
+       /* Find the device requested */
+       dev_num = find_type_by_name(device_name, "iio:device");
+       if (dev_num < 0) {
+               printf("Failed to find the %s\n", device_name);
+               ret = -ENODEV;
+               goto error_ret;
+       }
+       printf("iio device number being used is %d\n", dev_num);
+
+       asprintf(&dev_dir_name, "%siio:device%d", iio_dir, dev_num);
+       if (trigger_name == NULL) {
+               /*
+                * Build the trigger name. If it is device associated its
+                * name is <device_name>_dev[n] where n matches the device
+                * number found above
+                */
+               ret = asprintf(&trigger_name,
+                              "%s-dev%d", device_name, dev_num);
+               if (ret < 0) {
+                       ret = -ENOMEM;
+                       goto error_ret;
+               }
+       }
+
+       /* Verify the trigger exists */
+       trig_num = find_type_by_name(trigger_name, "trigger");
+       if (trig_num < 0) {
+               printf("Failed to find the trigger %s\n", trigger_name);
+               ret = -ENODEV;
+               goto error_free_triggername;
+       }
+       printf("iio trigger number being used is %d\n", trig_num);
+
+       /*
+        * Parse the files in scan_elements to identify what channels are
+        * present
+        */
+       ret = build_channel_array(dev_dir_name, &channels, &num_channels);
+       if (ret) {
+               printf("Problem reading scan element information\n");
+               printf("diag %s\n", dev_dir_name);
+               goto error_free_triggername;
+       }
+
+       /*
+        * Construct the directory name for the associated buffer.
+        * As we know that the lis3l02dq has only one buffer this may
+        * be built rather than found.
+        */
+       ret = asprintf(&buf_dir_name,
+                      "%siio:device%d/buffer", iio_dir, dev_num);
+       if (ret < 0) {
+               ret = -ENOMEM;
+               goto error_free_triggername;
+       }
+       printf("%s %s\n", dev_dir_name, trigger_name);
+       /* Set the device trigger to be the data ready trigger found above */
+       ret = write_sysfs_string_and_verify("trigger/current_trigger",
+                                       dev_dir_name,
+                                       trigger_name);
+       if (ret < 0) {
+               printf("Failed to write current_trigger file\n");
+               goto error_free_buf_dir_name;
+       }
+
+       /* Setup ring buffer parameters */
+       ret = write_sysfs_int("length", buf_dir_name, buf_len);
+       if (ret < 0)
+               goto error_free_buf_dir_name;
+
+       /* Enable the buffer */
+       ret = write_sysfs_int("enable", buf_dir_name, 1);
+       if (ret < 0)
+               goto error_free_buf_dir_name;
+       scan_size = size_from_channelarray(channels, num_channels);
+       data = malloc(scan_size*buf_len);
+       if (!data) {
+               ret = -ENOMEM;
+               goto error_free_buf_dir_name;
+       }
+
+       ret = asprintf(&buffer_access, "/dev/iio:device%d", dev_num);
+       if (ret < 0) {
+               ret = -ENOMEM;
+               goto error_free_data;
+       }
+
+       /* Attempt to open non blocking the access dev */
+       fp = open(buffer_access, O_RDONLY | O_NONBLOCK);
+       if (fp == -1) { /* If it isn't there make the node */
+               printf("Failed to open %s\n", buffer_access);
+               ret = -errno;
+               goto error_free_buffer_access;
+       }
+
+       /* Wait for events 10 times */
+       for (j = 0; j < num_loops; j++) {
+               if (!noevents) {
+                       struct pollfd pfd = {
+                               .fd = fp,
+                               .events = POLLIN,
+                       };
+
+                       poll(&pfd, 1, -1);
+                       toread = buf_len;
+
+               } else {
+                       usleep(timedelay);
+                       toread = 64;
+               }
+
+               read_size = read(fp,
+                                data,
+                                toread*scan_size);
+               if (read_size == -EAGAIN) {
+                       printf("nothing available\n");
+                       continue;
+               }
+               for (i = 0; i < read_size/scan_size; i++)
+                       process_scan(data + scan_size*i,
+                                    channels,
+                                    num_channels);
+       }
+
+       /* Stop the buffer */
+       ret = write_sysfs_int("enable", buf_dir_name, 0);
+       if (ret < 0)
+               goto error_close_buffer_access;
+
+       /* Disconnect the trigger - just write a dummy name. */
+       write_sysfs_string("trigger/current_trigger",
+                       dev_dir_name, "NULL");
+
+error_close_buffer_access:
+       close(fp);
+error_free_data:
+       free(data);
+error_free_buffer_access:
+       free(buffer_access);
+error_free_buf_dir_name:
+       free(buf_dir_name);
+error_free_triggername:
+       if (datardytrigger)
+               free(trigger_name);
+error_ret:
+       return ret;
+}
diff --git a/sensors/sensors test drivers (c)/iio_utils.h b/sensors/sensors test drivers (c)/iio_utils.h
new file mode 100644 (file)
index 0000000..cf32ae0
--- /dev/null
@@ -0,0 +1,654 @@
+/* IIO - useful set of util functionality
+ *
+ * Copyright (c) 2008 Jonathan Cameron
+ *
+ * This program is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 as published by
+ * the Free Software Foundation.
+ */
+
+#include <string.h>
+#include <stdlib.h>
+#include <ctype.h>
+#include <stdio.h>
+#include <stdint.h>
+#include <dirent.h>
+#include <errno.h>
+
+/* Made up value to limit allocation sizes */
+#define IIO_MAX_NAME_LENGTH 30
+
+#define FORMAT_SCAN_ELEMENTS_DIR "%s/scan_elements"
+#define FORMAT_TYPE_FILE "%s_type"
+
+const char *iio_dir = "/sys/bus/iio/devices/";
+
+/**
+ * iioutils_break_up_name() - extract generic name from full channel name
+ * @full_name: the full channel name
+ * @generic_name: the output generic channel name
+ **/
+inline int iioutils_break_up_name(const char *full_name,
+                                 char **generic_name)
+{
+       char *current;
+       char *w, *r;
+       char *working;
+       current = strdup(full_name);
+       working = strtok(current, "_\0");
+       w = working;
+       r = working;
+
+       while (*r != '\0') {
+               if (!isdigit(*r)) {
+                       *w = *r;
+                       w++;
+               }
+               r++;
+       }
+       *w = '\0';
+       *generic_name = strdup(working);
+       free(current);
+
+       return 0;
+}
+
+/**
+ * struct iio_channel_info - information about a given channel
+ * @name: channel name
+ * @generic_name: general name for channel type
+ * @scale: scale factor to be applied for conversion to si units
+ * @offset: offset to be applied for conversion to si units
+ * @index: the channel index in the buffer output
+ * @bytes: number of bytes occupied in buffer output
+ * @mask: a bit mask for the raw output
+ * @is_signed: is the raw value stored signed
+ * @enabled: is this channel enabled
+ **/
+struct iio_channel_info {
+       char *name;
+       char *generic_name;
+       float scale;
+       float offset;
+       unsigned index;
+       unsigned bytes;
+       unsigned bits_used;
+       unsigned shift;
+       uint64_t mask;
+       unsigned be;
+       unsigned is_signed;
+       unsigned enabled;
+       unsigned location;
+};
+
+/**
+ * iioutils_get_type() - find and process _type attribute data
+ * @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
+ **/
+inline int iioutils_get_type(unsigned *is_signed,
+                            unsigned *bytes,
+                            unsigned *bits_used,
+                            unsigned *shift,
+                            uint64_t *mask,
+                            unsigned *be,
+                            const char *device_dir,
+                            const char *name,
+                            const char *generic_name)
+{
+       FILE *sysfsfp;
+       int ret;
+       DIR *dp;
+       char *scan_el_dir, *builtname, *builtname_generic, *filename = 0;
+       char signchar, endianchar;
+       unsigned padint;
+       const struct dirent *ent;
+
+       ret = asprintf(&scan_el_dir, FORMAT_SCAN_ELEMENTS_DIR, device_dir);
+       if (ret < 0) {
+               ret = -ENOMEM;
+               goto error_ret;
+       }
+       ret = asprintf(&builtname, FORMAT_TYPE_FILE, name);
+       if (ret < 0) {
+               ret = -ENOMEM;
+               goto error_free_scan_el_dir;
+       }
+       ret = asprintf(&builtname_generic, FORMAT_TYPE_FILE, generic_name);
+       if (ret < 0) {
+               ret = -ENOMEM;
+               goto error_free_builtname;
+       }
+
+       dp = opendir(scan_el_dir);
+       if (dp == NULL) {
+               ret = -errno;
+               goto error_free_builtname_generic;
+       }
+       while (ent = readdir(dp), ent != NULL)
+               /*
+                * Do we allow devices to override a generic name with
+                * a specific one?
+                */
+               if ((strcmp(builtname, ent->d_name) == 0) ||
+                   (strcmp(builtname_generic, ent->d_name) == 0)) {
+                       ret = asprintf(&filename,
+                                      "%s/%s", scan_el_dir, ent->d_name);
+                       if (ret < 0) {
+                               ret = -ENOMEM;
+                               goto error_closedir;
+                       }
+                       sysfsfp = fopen(filename, "r");
+                       if (sysfsfp == NULL) {
+                               printf("failed to open %s\n", filename);
+                               ret = -errno;
+                               goto error_free_filename;
+                       }
+
+                       ret = fscanf(sysfsfp,
+                                    "%ce:%c%u/%u>>%u",
+                                    &endianchar,
+                                    &signchar,
+                                    bits_used,
+                                    &padint, shift);
+                       if (ret < 0) {
+                               printf("failed to pass scan type description\n");
+                               ret = -errno;
+                               goto error_close_sysfsfp;
+                       }
+                       *be = (endianchar == 'b');
+                       *bytes = padint / 8;
+                       if (*bits_used == 64)
+                               *mask = ~0;
+                       else
+                               *mask = (1 << *bits_used) - 1;
+                       if (signchar == 's')
+                               *is_signed = 1;
+                       else
+                               *is_signed = 0;
+                       fclose(sysfsfp);
+                       free(filename);
+
+                       filename = 0;
+                       sysfsfp = 0;
+               }
+error_close_sysfsfp:
+       if (sysfsfp)
+               fclose(sysfsfp);
+error_free_filename:
+       if (filename)
+               free(filename);
+error_closedir:
+       closedir(dp);
+error_free_builtname_generic:
+       free(builtname_generic);
+error_free_builtname:
+       free(builtname);
+error_free_scan_el_dir:
+       free(scan_el_dir);
+error_ret:
+       return ret;
+}
+
+inline int iioutils_get_param_float(float *output,
+                                   const char *param_name,
+                                   const char *device_dir,
+                                   const char *name,
+                                   const char *generic_name)
+{
+       FILE *sysfsfp;
+       int ret;
+       DIR *dp;
+       char *builtname, *builtname_generic;
+       char *filename = NULL;
+       const struct dirent *ent;
+
+       ret = asprintf(&builtname, "%s_%s", name, param_name);
+       if (ret < 0) {
+               ret = -ENOMEM;
+               goto error_ret;
+       }
+       ret = asprintf(&builtname_generic,
+                      "%s_%s", generic_name, param_name);
+       if (ret < 0) {
+               ret = -ENOMEM;
+               goto error_free_builtname;
+       }
+       dp = opendir(device_dir);
+       if (dp == NULL) {
+               ret = -errno;
+               goto error_free_builtname_generic;
+       }
+       while (ent = readdir(dp), ent != NULL)
+               if ((strcmp(builtname, ent->d_name) == 0) ||
+                   (strcmp(builtname_generic, ent->d_name) == 0)) {
+                       ret = asprintf(&filename,
+                                      "%s/%s", device_dir, ent->d_name);
+                       if (ret < 0) {
+                               ret = -ENOMEM;
+                               goto error_closedir;
+                       }
+                       sysfsfp = fopen(filename, "r");
+                       if (!sysfsfp) {
+                               ret = -errno;
+                               goto error_free_filename;
+                       }
+                       fscanf(sysfsfp, "%f", output);
+                       break;
+               }
+error_free_filename:
+       if (filename)
+               free(filename);
+error_closedir:
+       closedir(dp);
+error_free_builtname_generic:
+       free(builtname_generic);
+error_free_builtname:
+       free(builtname);
+error_ret:
+       return ret;
+}
+
+/**
+ * bsort_channel_array_by_index() - reorder so that the array is in index order
+ *
+ **/
+
+inline void bsort_channel_array_by_index(struct iio_channel_info **ci_array,
+                                        int cnt)
+{
+
+       struct iio_channel_info temp;
+       int x, y;
+
+       for (x = 0; x < cnt; x++)
+               for (y = 0; y < (cnt - 1); y++)
+                       if ((*ci_array)[y].index > (*ci_array)[y+1].index) {
+                               temp = (*ci_array)[y + 1];
+                               (*ci_array)[y + 1] = (*ci_array)[y];
+                               (*ci_array)[y] = temp;
+                       }
+}
+
+/**
+ * build_channel_array() - function to figure out what channels are present
+ * @device_dir: the IIO device directory in sysfs
+ * @
+ **/
+inline int build_channel_array(const char *device_dir,
+                             struct iio_channel_info **ci_array,
+                             int *counter)
+{
+       DIR *dp;
+       FILE *sysfsfp;
+       int count, i;
+       struct iio_channel_info *current;
+       int ret;
+       const struct dirent *ent;
+       char *scan_el_dir;
+       char *filename;
+
+       *counter = 0;
+       ret = asprintf(&scan_el_dir, FORMAT_SCAN_ELEMENTS_DIR, device_dir);
+       if (ret < 0) {
+               ret = -ENOMEM;
+               goto error_ret;
+       }
+       dp = opendir(scan_el_dir);
+       if (dp == NULL) {
+               ret = -errno;
+               goto error_free_name;
+       }
+       while (ent = readdir(dp), ent != NULL)
+               if (strcmp(ent->d_name + strlen(ent->d_name) - strlen("_en"),
+                          "_en") == 0) {
+                       ret = asprintf(&filename,
+                                      "%s/%s", scan_el_dir, ent->d_name);
+                       if (ret < 0) {
+                               ret = -ENOMEM;
+                               goto error_close_dir;
+                       }
+                       sysfsfp = fopen(filename, "r");
+                       if (sysfsfp == NULL) {
+                               ret = -errno;
+                               free(filename);
+                               goto error_close_dir;
+                       }
+                       fscanf(sysfsfp, "%u", &ret);
+                       if (ret == 1)
+                               (*counter)++;
+                       fclose(sysfsfp);
+                       free(filename);
+               }
+       *ci_array = malloc(sizeof(**ci_array) * (*counter));
+       if (*ci_array == NULL) {
+               ret = -ENOMEM;
+               goto error_close_dir;
+       }
+       seekdir(dp, 0);
+       count = 0;
+       while (ent = readdir(dp), ent != NULL) {
+               if (strcmp(ent->d_name + strlen(ent->d_name) - strlen("_en"),
+                          "_en") == 0) {
+                       current = &(*ci_array)[count++];
+                       ret = asprintf(&filename,
+                                      "%s/%s", scan_el_dir, ent->d_name);
+                       if (ret < 0) {
+                               ret = -ENOMEM;
+                               /* decrement count to avoid freeing name */
+                               count--;
+                               goto error_cleanup_array;
+                       }
+                       sysfsfp = fopen(filename, "r");
+                       if (sysfsfp == NULL) {
+                               free(filename);
+                               ret = -errno;
+                               goto error_cleanup_array;
+                       }
+                       fscanf(sysfsfp, "%u", &current->enabled);
+                       fclose(sysfsfp);
+
+                       if (!current->enabled) {
+                               free(filename);
+                               count--;
+                               continue;
+                       }
+
+                       current->scale = 1.0;
+                       current->offset = 0;
+                       current->name = strndup(ent->d_name,
+                                               strlen(ent->d_name) -
+                                               strlen("_en"));
+                       if (current->name == NULL) {
+                               free(filename);
+                               ret = -ENOMEM;
+                               goto error_cleanup_array;
+                       }
+                       /* Get the generic and specific name elements */
+                       ret = iioutils_break_up_name(current->name,
+                                                    &current->generic_name);
+                       if (ret) {
+                               free(filename);
+                               goto error_cleanup_array;
+                       }
+                       ret = asprintf(&filename,
+                                      "%s/%s_index",
+                                      scan_el_dir,
+                                      current->name);
+                       if (ret < 0) {
+                               free(filename);
+                               ret = -ENOMEM;
+                               goto error_cleanup_array;
+                       }
+                       sysfsfp = fopen(filename, "r");
+                       fscanf(sysfsfp, "%u", &current->index);
+                       fclose(sysfsfp);
+                       free(filename);
+                       /* Find the scale */
+                       ret = iioutils_get_param_float(&current->scale,
+                                                      "scale",
+                                                      device_dir,
+                                                      current->name,
+                                                      current->generic_name);
+                       if (ret < 0)
+                               goto error_cleanup_array;
+                       ret = iioutils_get_param_float(&current->offset,
+                                                      "offset",
+                                                      device_dir,
+                                                      current->name,
+                                                      current->generic_name);
+                       if (ret < 0)
+                               goto error_cleanup_array;
+                       ret = iioutils_get_type(&current->is_signed,
+                                               &current->bytes,
+                                               &current->bits_used,
+                                               &current->shift,
+                                               &current->mask,
+                                               &current->be,
+                                               device_dir,
+                                               current->name,
+                                               current->generic_name);
+               }
+       }
+
+       closedir(dp);
+       /* reorder so that the array is in index order */
+       bsort_channel_array_by_index(ci_array, *counter);
+
+       return 0;
+
+error_cleanup_array:
+       for (i = count - 1;  i >= 0; i--)
+               free((*ci_array)[i].name);
+       free(*ci_array);
+error_close_dir:
+       closedir(dp);
+error_free_name:
+       free(scan_el_dir);
+error_ret:
+       return ret;
+}
+
+/**
+ * find_type_by_name() - function to match top level types by name
+ * @name: top level type instance name
+ * @type: the type of top level instance being sort
+ *
+ * Typical types this is used for are device and trigger.
+ **/
+inline int find_type_by_name(const char *name, const char *type)
+{
+       const struct dirent *ent;
+       int number, numstrlen;
+
+       FILE *nameFile;
+       DIR *dp;
+       char thisname[IIO_MAX_NAME_LENGTH];
+       char *filename;
+
+       dp = opendir(iio_dir);
+       if (dp == NULL) {
+               printf("No industrialio devices available\n");
+               return -ENODEV;
+       }
+
+       while (ent = readdir(dp), ent != NULL) {
+               if (strcmp(ent->d_name, ".") != 0 &&
+                       strcmp(ent->d_name, "..") != 0 &&
+                       strlen(ent->d_name) > strlen(type) &&
+                       strncmp(ent->d_name, type, strlen(type)) == 0) {
+                       numstrlen = sscanf(ent->d_name + strlen(type),
+                                          "%d",
+                                          &number);
+                       /* verify the next character is not a colon */
+                       if (strncmp(ent->d_name + strlen(type) + numstrlen,
+                                       ":",
+                                       1) != 0) {
+                               filename = malloc(strlen(iio_dir)
+                                               + strlen(type)
+                                               + numstrlen
+                                               + 6);
+                               if (filename == NULL) {
+                                       closedir(dp);
+                                       return -ENOMEM;
+                               }
+                               sprintf(filename, "%s%s%d/name",
+                                       iio_dir,
+                                       type,
+                                       number);
+                               nameFile = fopen(filename, "r");
+                               if (!nameFile) {
+                                       free(filename);
+                                       continue;
+                               }
+                               free(filename);
+                               fscanf(nameFile, "%s", thisname);
+                               fclose(nameFile);
+                               if (strcmp(name, thisname) == 0) {
+                                       closedir(dp);
+                                       return number;
+                               }
+                       }
+               }
+       }
+       closedir(dp);
+       return -ENODEV;
+}
+
+inline int _write_sysfs_int(char *filename, char *basedir, int val, int verify)
+{
+       int ret;
+       FILE *sysfsfp;
+       int test;
+       char *temp = malloc(strlen(basedir) + strlen(filename) + 2);
+       if (temp == NULL)
+               return -ENOMEM;
+       sprintf(temp, "%s/%s", basedir, filename);
+       sysfsfp = fopen(temp, "w");
+       if (sysfsfp == NULL) {
+               printf("failed to open %s\n", temp);
+               ret = -errno;
+               goto error_free;
+       }
+       fprintf(sysfsfp, "%d", val);
+       fclose(sysfsfp);
+       if (verify) {
+               sysfsfp = fopen(temp, "r");
+               if (sysfsfp == NULL) {
+                       printf("failed to open %s\n", temp);
+                       ret = -errno;
+                       goto error_free;
+               }
+               fscanf(sysfsfp, "%d", &test);
+               fclose(sysfsfp);
+               if (test != val) {
+                       printf("Possible failure in int write %d to %s%s\n",
+                               val,
+                               basedir,
+                               filename);
+                       ret = -1;
+               }
+       }
+error_free:
+       free(temp);
+       return ret;
+}
+
+int write_sysfs_int(char *filename, char *basedir, int val)
+{
+       return _write_sysfs_int(filename, basedir, val, 0);
+}
+
+int write_sysfs_int_and_verify(char *filename, char *basedir, int val)
+{
+       return _write_sysfs_int(filename, basedir, val, 1);
+}
+
+int _write_sysfs_string(char *filename, char *basedir, char *val, int verify)
+{
+       int ret = 0;
+       FILE  *sysfsfp;
+       char *temp = malloc(strlen(basedir) + strlen(filename) + 2);
+       if (temp == NULL) {
+               printf("Memory allocation failed\n");
+               return -ENOMEM;
+       }
+       sprintf(temp, "%s/%s", basedir, filename);
+       sysfsfp = fopen(temp, "w");
+       if (sysfsfp == NULL) {
+               printf("Could not open %s\n", temp);
+               ret = -errno;
+               goto error_free;
+       }
+       fprintf(sysfsfp, "%s", val);
+       fclose(sysfsfp);
+       if (verify) {
+               sysfsfp = fopen(temp, "r");
+               if (sysfsfp == NULL) {
+                       printf("could not open file to verify\n");
+                       ret = -errno;
+                       goto error_free;
+               }
+               fscanf(sysfsfp, "%s", temp);
+               fclose(sysfsfp);
+               if (strcmp(temp, val) != 0) {
+                       printf("Possible failure in string write of %s "
+                               "Should be %s "
+                               "written to %s\%s\n",
+                               temp,
+                               val,
+                               basedir,
+                               filename);
+                       ret = -1;
+               }
+       }
+error_free:
+       free(temp);
+
+       return ret;
+}
+
+/**
+ * write_sysfs_string_and_verify() - string write, readback and verify
+ * @filename: name of file to write to
+ * @basedir: the sysfs directory in which the file is to be found
+ * @val: the string to write
+ **/
+int write_sysfs_string_and_verify(char *filename, char *basedir, char *val)
+{
+       return _write_sysfs_string(filename, basedir, val, 1);
+}
+
+int write_sysfs_string(char *filename, char *basedir, char *val)
+{
+       return _write_sysfs_string(filename, basedir, val, 0);
+}
+
+int read_sysfs_posint(char *filename, char *basedir)
+{
+       int ret;
+       FILE  *sysfsfp;
+       char *temp = malloc(strlen(basedir) + strlen(filename) + 2);
+       if (temp == NULL) {
+               printf("Memory allocation failed");
+               return -ENOMEM;
+       }
+       sprintf(temp, "%s/%s", basedir, filename);
+       sysfsfp = fopen(temp, "r");
+       if (sysfsfp == NULL) {
+               ret = -errno;
+               goto error_free;
+       }
+       fscanf(sysfsfp, "%d\n", &ret);
+       fclose(sysfsfp);
+error_free:
+       free(temp);
+       return ret;
+}
+
+int read_sysfs_float(char *filename, char *basedir, float *val)
+{
+       float ret = 0;
+       FILE  *sysfsfp;
+       char *temp = malloc(strlen(basedir) + strlen(filename) + 2);
+       if (temp == NULL) {
+               printf("Memory allocation failed");
+               return -ENOMEM;
+       }
+       sprintf(temp, "%s/%s", basedir, filename);
+       sysfsfp = fopen(temp, "r");
+       if (sysfsfp == NULL) {
+               ret = -errno;
+               goto error_free;
+       }
+       fscanf(sysfsfp, "%f\n", val);
+       fclose(sysfsfp);
+error_free:
+       free(temp);
+       return ret;
+}
diff --git a/sensors/sensors test drivers (c)/readme.txt b/sensors/sensors test drivers (c)/readme.txt
new file mode 100644 (file)
index 0000000..80ca9a3
--- /dev/null
@@ -0,0 +1,20 @@
+This is a userspace application which accesses the adc via /dev/iio in continuous sampling mode.
+
+The application scans the scan_elements folder in /dev/iio/devices/iio:deviceX/scan_elements for enabled channels.
+
+Creates a data structure.
+
+Sets the buffer size. Enables the buffer. And reads from the dev file for the driver.
+
+The source code is located under kernel sources "drivers/staging/iio/Documentation/generic_buffer.c".
+
+How to compile:
+
+arm-arago-linux-gnueabi-gcc --static generic_buffer.c -o generic_buffer
+
+or
+
+-gcc --static generic_buffer.c -o generic_buffer
+
+
+SOURCE: https://github.com/ZubairLK/adc-iio-continuous-sampling-userspace
\ No newline at end of file
diff --git a/sensors/sensors test drivers (c)/script_adc.sh b/sensors/sensors test drivers (c)/script_adc.sh
new file mode 100644 (file)
index 0000000..2afcb63
--- /dev/null
@@ -0,0 +1,5 @@
+echo 1 > /sys/bus/iio/devices/iio_sysfs_trigger/add_trigger
+echo 1 > /sys/bus/iio/devices/iio\:device0/scan_elements/in_voltage7_en
+echo 1 > /sys/bus/iio/devices/iio\:device0/scan_elements/in_voltage5_en
+generic_buffer -n TI-am335x-adc -t sysfstrig1 -l 128
+
diff --git a/sensors/sensors test drivers (c)/script_trigger.sh b/sensors/sensors test drivers (c)/script_trigger.sh
new file mode 100644 (file)
index 0000000..cdaf2d1
--- /dev/null
@@ -0,0 +1 @@
+echo 1  > /sys/bus/iio/devices/trigger0/trigger_now
diff --git a/sensors/simple code examples.c b/sensors/simple code examples.c
new file mode 100644 (file)
index 0000000..0a973ba
--- /dev/null
@@ -0,0 +1,54 @@
+//Code to blink an LED - just to illustrate that it's pretty easy
+//Only important thing is which name to address the LED by
+
+#include <stdio.h>
+#include <unistd.h>
+using namespace std;
+int main(int argc, char** argv) {
+  FILE *LEDHandle = NULL;
+  char *LEDBrightness = "/sys/class/leds/beaglebone:green:usr0/brightness";
+  printf("\nStarting LED blink program wooo!\n");
+  while(1){
+    if((LEDHandle = fopen(LEDBrightness, "r+")) != NULL){
+      fwrite("1", sizeof(char), 1, LEDHandle);
+      fclose(LEDHandle);
+    }
+    sleep(1);
+    if((LEDHandle = fopen(LEDBrightness, "r+")) != NULL){
+      fwrite("0", sizeof(char), 1, LEDHandle);
+      fclose(LEDHandle);
+    }
+    sleep(1);
+  }
+  return 0;
+}
+
+//Sample code that should read a pressure sensor pin (conversion factors
+//are just random numbers). Again pretty simple.
+
+#include STUFF
+double pressure(char *string) {
+        int value = atoi(string);
+        double millivolts = (value / 4096.0) * 1800; //convert input to volts
+        double pressure = (millivolts - 500.0) / 10.0; //convert volts to pressure
+        return pressure;
+}
+void main() {
+        int fd = open("/sys/devices/platform/tsc/ain2", O_RDONLY); //open pin signal
+        while (1) {
+                char buffer[1024];
+                int ret = read(fd, buffer, sizeof(buffer)); //get data
+                if (ret != -1) {
+                        buffer[ret] = NULL;
+                        double kpa = pressure(buffer);
+                        printf("digital value: %s  kilopascals: %f\n", buffer, kpa);
+                        lseek(fd, 0, 0);
+                }
+                sleep(1);
+        }
+        close(fd);
+}
\ No newline at end of file
diff --git a/sensors/simpleGPIO (c++)/SimpleGPIO.cpp b/sensors/simpleGPIO (c++)/SimpleGPIO.cpp
new file mode 100644 (file)
index 0000000..ab17a98
--- /dev/null
@@ -0,0 +1,233 @@
+/*
+ * SimpleGPIO.cpp
+ *
+ * Modifications by Derek Molloy, School of Electronic Engineering, DCU
+ * www.eeng.dcu.ie/~molloyd/
+ * Almost entirely based on Software by RidgeRun:
+ *
+ * Copyright (c) 2011, RidgeRun
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ * 3. All advertising materials mentioning features or use of this software
+ *    must display the following acknowledgement:
+ *    This product includes software developed by the RidgeRun.
+ * 4. Neither the name of the RidgeRun nor the
+ *    names of its contributors may be used to endorse or promote products
+ *    derived from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY RIDGERUN ''AS IS'' AND ANY
+ * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+ * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL RIDGERUN BE LIABLE FOR ANY
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+ * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#include "SimpleGPIO.h"
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <errno.h>
+#include <unistd.h>
+#include <fcntl.h>
+#include <poll.h>
+
+/****************************************************************
+ * gpio_export
+ ****************************************************************/
+int gpio_export(unsigned int gpio)
+{
+       int fd, len;
+       char buf[MAX_BUF];
+
+       fd = open(SYSFS_GPIO_DIR "/export", O_WRONLY);
+       if (fd < 0) {
+               perror("gpio/export");
+               return fd;
+       }
+
+       len = snprintf(buf, sizeof(buf), "%d", gpio);
+       write(fd, buf, len);
+       close(fd);
+
+       return 0;
+}
+
+/****************************************************************
+ * gpio_unexport
+ ****************************************************************/
+int gpio_unexport(unsigned int gpio)
+{
+       int fd, len;
+       char buf[MAX_BUF];
+
+       fd = open(SYSFS_GPIO_DIR "/unexport", O_WRONLY);
+       if (fd < 0) {
+               perror("gpio/export");
+               return fd;
+       }
+
+       len = snprintf(buf, sizeof(buf), "%d", gpio);
+       write(fd, buf, len);
+       close(fd);
+       return 0;
+}
+
+/****************************************************************
+ * gpio_set_dir
+ ****************************************************************/
+int gpio_set_dir(unsigned int gpio, PIN_DIRECTION out_flag)
+{
+       int fd;
+       char buf[MAX_BUF];
+
+       snprintf(buf, sizeof(buf), SYSFS_GPIO_DIR  "/gpio%d/direction", gpio);
+
+       fd = open(buf, O_WRONLY);
+       if (fd < 0) {
+               perror("gpio/direction");
+               return fd;
+       }
+
+       if (out_flag == OUTPUT_PIN)
+               write(fd, "out", 4);
+       else
+               write(fd, "in", 3);
+
+       close(fd);
+       return 0;
+}
+
+/****************************************************************
+ * gpio_set_value
+ ****************************************************************/
+int gpio_set_value(unsigned int gpio, PIN_VALUE value)
+{
+       int fd;
+       char buf[MAX_BUF];
+
+       snprintf(buf, sizeof(buf), SYSFS_GPIO_DIR "/gpio%d/value", gpio);
+
+       fd = open(buf, O_WRONLY);
+       if (fd < 0) {
+               perror("gpio/set-value");
+               return fd;
+       }
+
+       if (value==LOW)
+               write(fd, "0", 2);
+       else
+               write(fd, "1", 2);
+
+       close(fd);
+       return 0;
+}
+
+/****************************************************************
+ * gpio_get_value
+ ****************************************************************/
+int gpio_get_value(unsigned int gpio, unsigned int *value)
+{
+       int fd;
+       char buf[MAX_BUF];
+       char ch;
+
+       snprintf(buf, sizeof(buf), SYSFS_GPIO_DIR "/gpio%d/value", gpio);
+
+       fd = open(buf, O_RDONLY);
+       if (fd < 0) {
+               perror("gpio/get-value");
+               return fd;
+       }
+
+       read(fd, &ch, 1);
+
+       if (ch != '0') {
+               *value = 1;
+       } else {
+               *value = 0;
+       }
+
+       close(fd);
+       return 0;
+}
+
+
+/****************************************************************
+ * gpio_set_edge
+ ****************************************************************/
+
+int gpio_set_edge(unsigned int gpio, char *edge)
+{
+       int fd;
+       char buf[MAX_BUF];
+
+       snprintf(buf, sizeof(buf), SYSFS_GPIO_DIR "/gpio%d/edge", gpio);
+
+       fd = open(buf, O_WRONLY);
+       if (fd < 0) {
+               perror("gpio/set-edge");
+               return fd;
+       }
+
+       write(fd, edge, strlen(edge) + 1);
+       close(fd);
+       return 0;
+}
+
+/****************************************************************
+ * gpio_fd_open
+ ****************************************************************/
+
+int gpio_fd_open(unsigned int gpio)
+{
+       int fd;
+       char buf[MAX_BUF];
+
+       snprintf(buf, sizeof(buf), SYSFS_GPIO_DIR "/gpio%d/value", gpio);
+
+       fd = open(buf, O_RDONLY | O_NONBLOCK );
+       if (fd < 0) {
+               perror("gpio/fd_open");
+       }
+       return fd;
+}
+
+/****************************************************************
+ * gpio_fd_close
+ ****************************************************************/
+
+int gpio_fd_close(int fd)
+{
+       return close(fd);
+}
+
+
+/****************************************************************
+ * gpio_omap_mux_setup - Allow us to setup the omap mux mode for a pin
+ ****************************************************************/
+int gpio_omap_mux_setup(const char *omap_pin0_name, const char *mode)
+{
+       int fd;
+       char buf[MAX_BUF];
+       snprintf(buf, sizeof(buf), SYSFS_OMAP_MUX_DIR "%s", omap_pin0_name);
+       fd = open(buf, O_WRONLY);
+       if (fd < 0) {
+               perror("failed to open OMAP_MUX");
+               return fd;
+       }
+       write(fd, mode, strlen(mode) + 1);
+       close(fd);
+       return 0;
+}
\ No newline at end of file
diff --git a/sensors/simpleGPIO (c++)/SimpleGPIO.h b/sensors/simpleGPIO (c++)/SimpleGPIO.h
new file mode 100644 (file)
index 0000000..edbd78a
--- /dev/null
@@ -0,0 +1,72 @@
+/*
+ * SimpleGPIO.h
+ *
+ * Copyright Derek Molloy, School of Electronic Engineering, Dublin City University
+ * www.eeng.dcu.ie/~molloyd/
+ *
+ * Based on Software by RidgeRun
+ * Copyright (c) 2011, RidgeRun
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ * 3. All advertising materials mentioning features or use of this software
+ *    must display the following acknowledgement:
+ *    This product includes software developed by the RidgeRun.
+ * 4. Neither the name of the RidgeRun nor the
+ *    names of its contributors may be used to endorse or promote products
+ *    derived from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY RIDGERUN ''AS IS'' AND ANY
+ * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+ * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL RIDGERUN BE LIABLE FOR ANY
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+ * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#ifndef SIMPLEGPIO_H_
+#define SIMPLEGPIO_H_
+
+ /****************************************************************
+ * Constants
+ ****************************************************************/
+
+#define SYSFS_GPIO_DIR "/sys/class/gpio"
+#define POLL_TIMEOUT (3 * 1000) /* 3 seconds */
+#define MAX_BUF 64
+#define SYSFS_OMAP_MUX_DIR "/sys/kernel/debug/omap_mux/"
+
+enum PIN_DIRECTION{
+       INPUT_PIN=0,
+       OUTPUT_PIN=1
+};
+
+enum PIN_VALUE{
+       LOW=0,
+       HIGH=1
+};
+
+/****************************************************************
+ * gpio_export
+ ****************************************************************/
+int gpio_export(unsigned int gpio);
+int gpio_unexport(unsigned int gpio);
+int gpio_set_dir(unsigned int gpio, PIN_DIRECTION out_flag);
+int gpio_set_value(unsigned int gpio, PIN_VALUE value);
+int gpio_get_value(unsigned int gpio, unsigned int *value);
+int gpio_set_edge(unsigned int gpio, char *edge);
+int gpio_fd_open(unsigned int gpio);
+int gpio_fd_close(int fd);
+int gpio_omap_mux_setup(const char *omap_pin0_name, const char *mode);
+
+#endif /* SIMPLEGPIO_H_ */
\ No newline at end of file

UCC git Repository :: git.ucc.asn.au