Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
Dependencies: libserialport libxml2
scan.c@0:df031b60ca29, 2016-08-25 (annotated)
- Committer:
- pcercuei
- Date:
- Thu Aug 25 15:54:09 2016 +0000
- Revision:
- 0:df031b60ca29
- Child:
- 2:9eb0a9a1f958
Add first version of libiio, from upsteam commit 775b9f6 unmodified.
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
pcercuei | 0:df031b60ca29 | 1 | /* |
pcercuei | 0:df031b60ca29 | 2 | * libiio - Library for interfacing industrial I/O (IIO) devices |
pcercuei | 0:df031b60ca29 | 3 | * |
pcercuei | 0:df031b60ca29 | 4 | * Copyright (C) 2016 Analog Devices, Inc. |
pcercuei | 0:df031b60ca29 | 5 | * Author: Paul Cercueil <paul.cercueil@analog.com> |
pcercuei | 0:df031b60ca29 | 6 | * |
pcercuei | 0:df031b60ca29 | 7 | * This library is free software; you can redistribute it and/or |
pcercuei | 0:df031b60ca29 | 8 | * modify it under the terms of the GNU Lesser General Public |
pcercuei | 0:df031b60ca29 | 9 | * License as published by the Free Software Foundation; either |
pcercuei | 0:df031b60ca29 | 10 | * version 2.1 of the License, or (at your option) any later version. |
pcercuei | 0:df031b60ca29 | 11 | * |
pcercuei | 0:df031b60ca29 | 12 | * This library is distributed in the hope that it will be useful, |
pcercuei | 0:df031b60ca29 | 13 | * but WITHOUT ANY WARRANTY; without even the implied warranty of |
pcercuei | 0:df031b60ca29 | 14 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU |
pcercuei | 0:df031b60ca29 | 15 | * Lesser General Public License for more details. |
pcercuei | 0:df031b60ca29 | 16 | */ |
pcercuei | 0:df031b60ca29 | 17 | |
pcercuei | 0:df031b60ca29 | 18 | #include "iio-config.h" |
pcercuei | 0:df031b60ca29 | 19 | #include "iio-errno.h" |
pcercuei | 0:df031b60ca29 | 20 | #include "iio-private.h" |
pcercuei | 0:df031b60ca29 | 21 | |
pcercuei | 0:df031b60ca29 | 22 | #include <stdbool.h> |
pcercuei | 0:df031b60ca29 | 23 | #include <string.h> |
pcercuei | 0:df031b60ca29 | 24 | |
pcercuei | 0:df031b60ca29 | 25 | struct iio_scan_context { |
pcercuei | 0:df031b60ca29 | 26 | #ifdef WITH_USB_BACKEND |
pcercuei | 0:df031b60ca29 | 27 | struct iio_scan_backend_context *usb_ctx; |
pcercuei | 0:df031b60ca29 | 28 | #endif |
pcercuei | 0:df031b60ca29 | 29 | bool scan_local; |
pcercuei | 0:df031b60ca29 | 30 | }; |
pcercuei | 0:df031b60ca29 | 31 | |
pcercuei | 0:df031b60ca29 | 32 | const char * iio_context_info_get_description( |
pcercuei | 0:df031b60ca29 | 33 | const struct iio_context_info *info) |
pcercuei | 0:df031b60ca29 | 34 | { |
pcercuei | 0:df031b60ca29 | 35 | return info->description; |
pcercuei | 0:df031b60ca29 | 36 | } |
pcercuei | 0:df031b60ca29 | 37 | |
pcercuei | 0:df031b60ca29 | 38 | const char * iio_context_info_get_uri( |
pcercuei | 0:df031b60ca29 | 39 | const struct iio_context_info *info) |
pcercuei | 0:df031b60ca29 | 40 | { |
pcercuei | 0:df031b60ca29 | 41 | return info->uri; |
pcercuei | 0:df031b60ca29 | 42 | } |
pcercuei | 0:df031b60ca29 | 43 | |
pcercuei | 0:df031b60ca29 | 44 | ssize_t iio_scan_context_get_info_list(struct iio_scan_context *ctx, |
pcercuei | 0:df031b60ca29 | 45 | struct iio_context_info ***info) |
pcercuei | 0:df031b60ca29 | 46 | { |
pcercuei | 0:df031b60ca29 | 47 | struct iio_scan_result scan_result = { 0, NULL }; |
pcercuei | 0:df031b60ca29 | 48 | |
pcercuei | 0:df031b60ca29 | 49 | #ifdef WITH_LOCAL_BACKEND |
pcercuei | 0:df031b60ca29 | 50 | if (ctx->scan_local) { |
pcercuei | 0:df031b60ca29 | 51 | int ret = local_context_scan(&scan_result); |
pcercuei | 0:df031b60ca29 | 52 | if (ret < 0) { |
pcercuei | 0:df031b60ca29 | 53 | if (scan_result.info) |
pcercuei | 0:df031b60ca29 | 54 | iio_context_info_list_free(scan_result.info); |
pcercuei | 0:df031b60ca29 | 55 | return ret; |
pcercuei | 0:df031b60ca29 | 56 | } |
pcercuei | 0:df031b60ca29 | 57 | } |
pcercuei | 0:df031b60ca29 | 58 | #endif |
pcercuei | 0:df031b60ca29 | 59 | |
pcercuei | 0:df031b60ca29 | 60 | #ifdef WITH_USB_BACKEND |
pcercuei | 0:df031b60ca29 | 61 | if (ctx->usb_ctx) { |
pcercuei | 0:df031b60ca29 | 62 | int ret = usb_context_scan(ctx->usb_ctx, &scan_result); |
pcercuei | 0:df031b60ca29 | 63 | if (ret < 0) { |
pcercuei | 0:df031b60ca29 | 64 | if (scan_result.info) |
pcercuei | 0:df031b60ca29 | 65 | iio_context_info_list_free(scan_result.info); |
pcercuei | 0:df031b60ca29 | 66 | return ret; |
pcercuei | 0:df031b60ca29 | 67 | } |
pcercuei | 0:df031b60ca29 | 68 | } |
pcercuei | 0:df031b60ca29 | 69 | #endif |
pcercuei | 0:df031b60ca29 | 70 | |
pcercuei | 0:df031b60ca29 | 71 | *info = scan_result.info; |
pcercuei | 0:df031b60ca29 | 72 | |
pcercuei | 0:df031b60ca29 | 73 | return (ssize_t) scan_result.size; |
pcercuei | 0:df031b60ca29 | 74 | } |
pcercuei | 0:df031b60ca29 | 75 | |
pcercuei | 0:df031b60ca29 | 76 | void iio_context_info_list_free(struct iio_context_info **list) |
pcercuei | 0:df031b60ca29 | 77 | { |
pcercuei | 0:df031b60ca29 | 78 | struct iio_context_info **it; |
pcercuei | 0:df031b60ca29 | 79 | |
pcercuei | 0:df031b60ca29 | 80 | if (!list) |
pcercuei | 0:df031b60ca29 | 81 | return; |
pcercuei | 0:df031b60ca29 | 82 | |
pcercuei | 0:df031b60ca29 | 83 | for (it = list; *it; it++) { |
pcercuei | 0:df031b60ca29 | 84 | struct iio_context_info *info = *it; |
pcercuei | 0:df031b60ca29 | 85 | |
pcercuei | 0:df031b60ca29 | 86 | if (info->description) |
pcercuei | 0:df031b60ca29 | 87 | free(info->description); |
pcercuei | 0:df031b60ca29 | 88 | if (info->uri) |
pcercuei | 0:df031b60ca29 | 89 | free(info->uri); |
pcercuei | 0:df031b60ca29 | 90 | free(info); |
pcercuei | 0:df031b60ca29 | 91 | } |
pcercuei | 0:df031b60ca29 | 92 | |
pcercuei | 0:df031b60ca29 | 93 | free(list); |
pcercuei | 0:df031b60ca29 | 94 | } |
pcercuei | 0:df031b60ca29 | 95 | |
pcercuei | 0:df031b60ca29 | 96 | struct iio_context_info ** iio_scan_result_add( |
pcercuei | 0:df031b60ca29 | 97 | struct iio_scan_result *scan_result, size_t num) |
pcercuei | 0:df031b60ca29 | 98 | { |
pcercuei | 0:df031b60ca29 | 99 | struct iio_context_info **info; |
pcercuei | 0:df031b60ca29 | 100 | size_t old_size, new_size; |
pcercuei | 0:df031b60ca29 | 101 | size_t i; |
pcercuei | 0:df031b60ca29 | 102 | |
pcercuei | 0:df031b60ca29 | 103 | old_size = scan_result->size; |
pcercuei | 0:df031b60ca29 | 104 | new_size = old_size + num; |
pcercuei | 0:df031b60ca29 | 105 | |
pcercuei | 0:df031b60ca29 | 106 | info = realloc(scan_result->info, (new_size + 1) * sizeof(*info)); |
pcercuei | 0:df031b60ca29 | 107 | if (!info) |
pcercuei | 0:df031b60ca29 | 108 | goto err_free_info_list; |
pcercuei | 0:df031b60ca29 | 109 | |
pcercuei | 0:df031b60ca29 | 110 | for (i = old_size; i < new_size; i++) { |
pcercuei | 0:df031b60ca29 | 111 | /* Make sure iio_context_info_list_free won't overflow */ |
pcercuei | 0:df031b60ca29 | 112 | info[i + 1] = NULL; |
pcercuei | 0:df031b60ca29 | 113 | |
pcercuei | 0:df031b60ca29 | 114 | info[i] = zalloc(sizeof(**info)); |
pcercuei | 0:df031b60ca29 | 115 | if (!info[i]) |
pcercuei | 0:df031b60ca29 | 116 | goto err_free_info_list; |
pcercuei | 0:df031b60ca29 | 117 | } |
pcercuei | 0:df031b60ca29 | 118 | |
pcercuei | 0:df031b60ca29 | 119 | scan_result->info = info; |
pcercuei | 0:df031b60ca29 | 120 | scan_result->size = new_size; |
pcercuei | 0:df031b60ca29 | 121 | |
pcercuei | 0:df031b60ca29 | 122 | return &info[old_size]; |
pcercuei | 0:df031b60ca29 | 123 | |
pcercuei | 0:df031b60ca29 | 124 | err_free_info_list: |
pcercuei | 0:df031b60ca29 | 125 | scan_result->size = 0; |
pcercuei | 0:df031b60ca29 | 126 | iio_context_info_list_free(scan_result->info); |
pcercuei | 0:df031b60ca29 | 127 | return NULL; |
pcercuei | 0:df031b60ca29 | 128 | } |
pcercuei | 0:df031b60ca29 | 129 | |
pcercuei | 0:df031b60ca29 | 130 | struct iio_scan_context * iio_create_scan_context( |
pcercuei | 0:df031b60ca29 | 131 | const char *backend, unsigned int flags) |
pcercuei | 0:df031b60ca29 | 132 | { |
pcercuei | 0:df031b60ca29 | 133 | struct iio_scan_context *ctx; |
pcercuei | 0:df031b60ca29 | 134 | |
pcercuei | 0:df031b60ca29 | 135 | /* "flags" must be zero for now */ |
pcercuei | 0:df031b60ca29 | 136 | if (flags != 0) { |
pcercuei | 0:df031b60ca29 | 137 | errno = EINVAL; |
pcercuei | 0:df031b60ca29 | 138 | return NULL; |
pcercuei | 0:df031b60ca29 | 139 | } |
pcercuei | 0:df031b60ca29 | 140 | |
pcercuei | 0:df031b60ca29 | 141 | ctx = calloc(1, sizeof(*ctx)); |
pcercuei | 0:df031b60ca29 | 142 | if (!ctx) { |
pcercuei | 0:df031b60ca29 | 143 | errno = ENOMEM; |
pcercuei | 0:df031b60ca29 | 144 | return NULL; |
pcercuei | 0:df031b60ca29 | 145 | } |
pcercuei | 0:df031b60ca29 | 146 | |
pcercuei | 0:df031b60ca29 | 147 | if (!backend || !strcmp(backend, "local")) |
pcercuei | 0:df031b60ca29 | 148 | ctx->scan_local = true; |
pcercuei | 0:df031b60ca29 | 149 | |
pcercuei | 0:df031b60ca29 | 150 | #ifdef WITH_USB_BACKEND |
pcercuei | 0:df031b60ca29 | 151 | if (!backend || !strcmp(backend, "usb")) |
pcercuei | 0:df031b60ca29 | 152 | ctx->usb_ctx = usb_context_scan_init(); |
pcercuei | 0:df031b60ca29 | 153 | #endif |
pcercuei | 0:df031b60ca29 | 154 | |
pcercuei | 0:df031b60ca29 | 155 | return ctx; |
pcercuei | 0:df031b60ca29 | 156 | } |
pcercuei | 0:df031b60ca29 | 157 | |
pcercuei | 0:df031b60ca29 | 158 | void iio_scan_context_destroy(struct iio_scan_context *ctx) |
pcercuei | 0:df031b60ca29 | 159 | { |
pcercuei | 0:df031b60ca29 | 160 | #ifdef WITH_USB_BACKEND |
pcercuei | 0:df031b60ca29 | 161 | if (ctx->usb_ctx) |
pcercuei | 0:df031b60ca29 | 162 | usb_context_scan_free(ctx->usb_ctx); |
pcercuei | 0:df031b60ca29 | 163 | #endif |
pcercuei | 0:df031b60ca29 | 164 | free(ctx); |
pcercuei | 0:df031b60ca29 | 165 | } |
pcercuei | 0:df031b60ca29 | 166 |