From 88579d4b361f1f8ad4bf1a9b6fa4dd17938a3370 Mon Sep 17 00:00:00 2001 From: Justin Kruger <20767264@student.uwa.edu.au> Date: Sat, 24 Aug 2013 16:52:21 +0800 Subject: [PATCH] Sensors code Added some sensors code examples and notes for Beaglebone hardware --- sensors/beagleboard sensors notes.docx | Bin 0 -> 19294 bytes .../sensors test drivers (c)/generic_buffer.c | 340 +++++++++ sensors/sensors test drivers (c)/iio_utils.h | 654 ++++++++++++++++++ sensors/sensors test drivers (c)/readme.txt | 20 + .../sensors test drivers (c)/script_adc.sh | 5 + .../script_trigger.sh | 1 + sensors/simple code examples.c | 54 ++ sensors/simpleGPIO (c++)/SimpleGPIO.cpp | 233 +++++++ sensors/simpleGPIO (c++)/SimpleGPIO.h | 72 ++ 9 files changed, 1379 insertions(+) create mode 100644 sensors/beagleboard sensors notes.docx create mode 100644 sensors/sensors test drivers (c)/generic_buffer.c create mode 100644 sensors/sensors test drivers (c)/iio_utils.h create mode 100644 sensors/sensors test drivers (c)/readme.txt create mode 100644 sensors/sensors test drivers (c)/script_adc.sh create mode 100644 sensors/sensors test drivers (c)/script_trigger.sh create mode 100644 sensors/simple code examples.c create mode 100644 sensors/simpleGPIO (c++)/SimpleGPIO.cpp create mode 100644 sensors/simpleGPIO (c++)/SimpleGPIO.h diff --git a/sensors/beagleboard sensors notes.docx b/sensors/beagleboard sensors notes.docx new file mode 100644 index 0000000000000000000000000000000000000000..746600c61791248729139367647f63567779a75e GIT binary patch literal 19294 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 Cn97;} literal 0 HcmV?d00001 diff --git a/sensors/sensors test drivers (c)/generic_buffer.c b/sensors/sensors test drivers (c)/generic_buffer.c new file mode 100644 index 0000000..40d0eca --- /dev/null +++ b/sensors/sensors test drivers (c)/generic_buffer.c @@ -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 -t + * 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 +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#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 _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 index 0000000..cf32ae0 --- /dev/null +++ b/sensors/sensors test drivers (c)/iio_utils.h @@ -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 +#include +#include +#include +#include +#include +#include + +/* 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", ¤t->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, + ¤t->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", ¤t->index); + fclose(sysfsfp); + free(filename); + /* Find the scale */ + ret = iioutils_get_param_float(¤t->scale, + "scale", + device_dir, + current->name, + current->generic_name); + if (ret < 0) + goto error_cleanup_array; + ret = iioutils_get_param_float(¤t->offset, + "offset", + device_dir, + current->name, + current->generic_name); + if (ret < 0) + goto error_cleanup_array; + ret = iioutils_get_type(¤t->is_signed, + ¤t->bytes, + ¤t->bits_used, + ¤t->shift, + ¤t->mask, + ¤t->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 index 0000000..80ca9a3 --- /dev/null +++ b/sensors/sensors test drivers (c)/readme.txt @@ -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 index 0000000..2afcb63 --- /dev/null +++ b/sensors/sensors test drivers (c)/script_adc.sh @@ -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 index 0000000..cdaf2d1 --- /dev/null +++ b/sensors/sensors test drivers (c)/script_trigger.sh @@ -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 index 0000000..0a973ba --- /dev/null +++ b/sensors/simple code examples.c @@ -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 +#include + +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 index 0000000..ab17a98 --- /dev/null +++ b/sensors/simpleGPIO (c++)/SimpleGPIO.cpp @@ -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 +#include +#include +#include +#include +#include +#include + +/**************************************************************** + * 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 index 0000000..edbd78a --- /dev/null +++ b/sensors/simpleGPIO (c++)/SimpleGPIO.h @@ -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 -- 2.20.1