aboutsummaryrefslogtreecommitdiffstats
path: root/tools/iio/generic_buffer.c
diff options
context:
space:
mode:
authorLinus Torvalds <torvalds@linux-foundation.org>2015-08-31 12:24:06 -0400
committerLinus Torvalds <torvalds@linux-foundation.org>2015-08-31 12:24:06 -0400
commit2f37d65a6a5c360ba0c386a6aa0d2afcbda7060d (patch)
treea2c0ab8b6d7fd7ea57d0140f22a79337064d761e /tools/iio/generic_buffer.c
parent1af115d675f323afee1e64650277a9b170845b81 (diff)
parent415bcb5c6eff630967baa4e671cebe883d83ee79 (diff)
Merge tag 'staging-4.3-rc1' of git://git.kernel.org/pub/scm/linux/kernel/git/gregkh/staging
Pull staging driver updates from Greg KH: "Here is the big staging driver updates for 4.3-rc1. Lots of things all over the place, almost all of them trivial fixups and changes. The usual IIO updates and new drivers and we have added the MOST driver subsystem which is getting cleaned up in the tree. The ozwpan driver is finally being deleted as it is obviously abandoned and no one cares about it. Full details are in the shortlog, and all of these have been in linux-next with no reported issues" * tag 'staging-4.3-rc1' of git://git.kernel.org/pub/scm/linux/kernel/git/gregkh/staging: (912 commits) staging/lustre/o2iblnd: remove references to ib_reg_phsy_mr() staging: wilc1000: fix build warning with setup_timer() staging: wilc1000: remove DECLARE_WILC_BUFFER() staging: wilc1000: remove void function return statements that are not useful staging: wilc1000: coreconfigurator.c: fix kmalloc error check staging: wilc1000: coreconfigurator.c: use kmalloc instead of WILC_MALLOC staging: wilc1000: remove unused codes of gps8ConfigPacket staging: wilc1000: remove unnecessary void pointer cast staging: wilc1000: remove WILC_NEW and WILC_NEW_EX staging: wilc1000: use kmalloc instead of WILC_NEW staging: wilc1000: Process WARN, INFO options of debug levels from user staging: wilc1000: remove unneeded tstrWILC_MsgQueueAttrs typedef staging: wilc1000: delete wilc_osconfig.h staging: wilc1000: delete wilc_log.h staging: wilc1000: delete wilc_timer.h staging: wilc1000: remove WILC_TimerStart() staging: wilc1000: remove WILC_TimerCreate() staging: wilc1000: remove WILC_TimerDestroy() staging: wilc1000: remove WILC_TimerStop() staging: wilc1000: remove tstrWILC_TimerAttrs typedef ...
Diffstat (limited to 'tools/iio/generic_buffer.c')
-rw-r--r--tools/iio/generic_buffer.c115
1 files changed, 75 insertions, 40 deletions
diff --git a/tools/iio/generic_buffer.c b/tools/iio/generic_buffer.c
index 4eebb6616e5c..9f7b85bf6ada 100644
--- a/tools/iio/generic_buffer.c
+++ b/tools/iio/generic_buffer.c
@@ -51,14 +51,33 @@ int size_from_channelarray(struct iio_channel_info *channels, int num_channels)
51 if (bytes % channels[i].bytes == 0) 51 if (bytes % channels[i].bytes == 0)
52 channels[i].location = bytes; 52 channels[i].location = bytes;
53 else 53 else
54 channels[i].location = bytes - bytes%channels[i].bytes 54 channels[i].location = bytes - bytes % channels[i].bytes
55 + channels[i].bytes; 55 + channels[i].bytes;
56
56 bytes = channels[i].location + channels[i].bytes; 57 bytes = channels[i].location + channels[i].bytes;
57 i++; 58 i++;
58 } 59 }
60
59 return bytes; 61 return bytes;
60} 62}
61 63
64void print1byte(uint8_t input, struct iio_channel_info *info)
65{
66 /*
67 * Shift before conversion to avoid sign extension
68 * of left aligned data
69 */
70 input >>= info->shift;
71 input &= info->mask;
72 if (info->is_signed) {
73 int8_t val = (int8_t)(input << (8 - info->bits_used)) >>
74 (8 - info->bits_used);
75 printf("%05f ", ((float)val + info->offset) * info->scale);
76 } else {
77 printf("%05f ", ((float)input + info->offset) * info->scale);
78 }
79}
80
62void print2byte(uint16_t input, struct iio_channel_info *info) 81void print2byte(uint16_t input, struct iio_channel_info *info)
63{ 82{
64 /* First swap if incorrect endian */ 83 /* First swap if incorrect endian */
@@ -136,9 +155,9 @@ void print8byte(uint64_t input, struct iio_channel_info *info)
136/** 155/**
137 * process_scan() - print out the values in SI units 156 * process_scan() - print out the values in SI units
138 * @data: pointer to the start of the scan 157 * @data: pointer to the start of the scan
139 * @channels: information about the channels. Note 158 * @channels: information about the channels.
140 * size_from_channelarray must have been called first to fill the 159 * Note: size_from_channelarray must have been called first
141 * location offsets. 160 * to fill the location offsets.
142 * @num_channels: number of channels 161 * @num_channels: number of channels
143 **/ 162 **/
144void process_scan(char *data, 163void process_scan(char *data,
@@ -150,6 +169,10 @@ void process_scan(char *data,
150 for (k = 0; k < num_channels; k++) 169 for (k = 0; k < num_channels; k++)
151 switch (channels[k].bytes) { 170 switch (channels[k].bytes) {
152 /* only a few cases implemented so far */ 171 /* only a few cases implemented so far */
172 case 1:
173 print1byte(*(uint8_t *)(data + channels[k].location),
174 &channels[k]);
175 break;
153 case 2: 176 case 2:
154 print2byte(*(uint16_t *)(data + channels[k].location), 177 print2byte(*(uint16_t *)(data + channels[k].location),
155 &channels[k]); 178 &channels[k]);
@@ -170,15 +193,15 @@ void process_scan(char *data,
170 193
171void print_usage(void) 194void print_usage(void)
172{ 195{
173 printf("Usage: generic_buffer [options]...\n" 196 fprintf(stderr, "Usage: generic_buffer [options]...\n"
174 "Capture, convert and output data from IIO device buffer\n" 197 "Capture, convert and output data from IIO device buffer\n"
175 " -c <n> Do n conversions\n" 198 " -c <n> Do n conversions\n"
176 " -e Disable wait for event (new data)\n" 199 " -e Disable wait for event (new data)\n"
177 " -g Use trigger-less mode\n" 200 " -g Use trigger-less mode\n"
178 " -l <n> Set buffer length to n samples\n" 201 " -l <n> Set buffer length to n samples\n"
179 " -n <name> Set device name (mandatory)\n" 202 " -n <name> Set device name (mandatory)\n"
180 " -t <name> Set trigger name\n" 203 " -t <name> Set trigger name\n"
181 " -w <n> Set delay between reads in us (event-less mode)\n"); 204 " -w <n> Set delay between reads in us (event-less mode)\n");
182} 205}
183 206
184int main(int argc, char **argv) 207int main(int argc, char **argv)
@@ -213,6 +236,7 @@ int main(int argc, char **argv)
213 num_loops = strtoul(optarg, &dummy, 10); 236 num_loops = strtoul(optarg, &dummy, 10);
214 if (errno) 237 if (errno)
215 return -errno; 238 return -errno;
239
216 break; 240 break;
217 case 'e': 241 case 'e':
218 noevents = 1; 242 noevents = 1;
@@ -225,6 +249,7 @@ int main(int argc, char **argv)
225 buf_len = strtoul(optarg, &dummy, 10); 249 buf_len = strtoul(optarg, &dummy, 10);
226 if (errno) 250 if (errno)
227 return -errno; 251 return -errno;
252
228 break; 253 break;
229 case 'n': 254 case 'n':
230 device_name = optarg; 255 device_name = optarg;
@@ -245,8 +270,8 @@ int main(int argc, char **argv)
245 } 270 }
246 } 271 }
247 272
248 if (device_name == NULL) { 273 if (!device_name) {
249 printf("Device name not set\n"); 274 fprintf(stderr, "Device name not set\n");
250 print_usage(); 275 print_usage();
251 return -1; 276 return -1;
252 } 277 }
@@ -254,9 +279,10 @@ int main(int argc, char **argv)
254 /* Find the device requested */ 279 /* Find the device requested */
255 dev_num = find_type_by_name(device_name, "iio:device"); 280 dev_num = find_type_by_name(device_name, "iio:device");
256 if (dev_num < 0) { 281 if (dev_num < 0) {
257 printf("Failed to find the %s\n", device_name); 282 fprintf(stderr, "Failed to find the %s\n", device_name);
258 return dev_num; 283 return dev_num;
259 } 284 }
285
260 printf("iio device number being used is %d\n", dev_num); 286 printf("iio device number being used is %d\n", dev_num);
261 287
262 ret = asprintf(&dev_dir_name, "%siio:device%d", iio_dir, dev_num); 288 ret = asprintf(&dev_dir_name, "%siio:device%d", iio_dir, dev_num);
@@ -264,7 +290,7 @@ int main(int argc, char **argv)
264 return -ENOMEM; 290 return -ENOMEM;
265 291
266 if (!notrigger) { 292 if (!notrigger) {
267 if (trigger_name == NULL) { 293 if (!trigger_name) {
268 /* 294 /*
269 * Build the trigger name. If it is device associated 295 * Build the trigger name. If it is device associated
270 * its name is <device_name>_dev[n] where n matches 296 * its name is <device_name>_dev[n] where n matches
@@ -281,13 +307,16 @@ int main(int argc, char **argv)
281 /* Verify the trigger exists */ 307 /* Verify the trigger exists */
282 trig_num = find_type_by_name(trigger_name, "trigger"); 308 trig_num = find_type_by_name(trigger_name, "trigger");
283 if (trig_num < 0) { 309 if (trig_num < 0) {
284 printf("Failed to find the trigger %s\n", trigger_name); 310 fprintf(stderr, "Failed to find the trigger %s\n",
311 trigger_name);
285 ret = trig_num; 312 ret = trig_num;
286 goto error_free_triggername; 313 goto error_free_triggername;
287 } 314 }
315
288 printf("iio trigger number being used is %d\n", trig_num); 316 printf("iio trigger number being used is %d\n", trig_num);
289 } else 317 } else {
290 printf("trigger-less mode selected\n"); 318 printf("trigger-less mode selected\n");
319 }
291 320
292 /* 321 /*
293 * Parse the files in scan_elements to identify what channels are 322 * Parse the files in scan_elements to identify what channels are
@@ -295,8 +324,8 @@ int main(int argc, char **argv)
295 */ 324 */
296 ret = build_channel_array(dev_dir_name, &channels, &num_channels); 325 ret = build_channel_array(dev_dir_name, &channels, &num_channels);
297 if (ret) { 326 if (ret) {
298 printf("Problem reading scan element information\n"); 327 fprintf(stderr, "Problem reading scan element information\n"
299 printf("diag %s\n", dev_dir_name); 328 "diag %s\n", dev_dir_name);
300 goto error_free_triggername; 329 goto error_free_triggername;
301 } 330 }
302 331
@@ -314,13 +343,16 @@ int main(int argc, char **argv)
314 343
315 if (!notrigger) { 344 if (!notrigger) {
316 printf("%s %s\n", dev_dir_name, trigger_name); 345 printf("%s %s\n", dev_dir_name, trigger_name);
317 /* Set the device trigger to be the data ready trigger found 346 /*
318 * above */ 347 * Set the device trigger to be the data ready trigger found
348 * above
349 */
319 ret = write_sysfs_string_and_verify("trigger/current_trigger", 350 ret = write_sysfs_string_and_verify("trigger/current_trigger",
320 dev_dir_name, 351 dev_dir_name,
321 trigger_name); 352 trigger_name);
322 if (ret < 0) { 353 if (ret < 0) {
323 printf("Failed to write current_trigger file\n"); 354 fprintf(stderr,
355 "Failed to write current_trigger file\n");
324 goto error_free_buf_dir_name; 356 goto error_free_buf_dir_name;
325 } 357 }
326 } 358 }
@@ -332,10 +364,14 @@ int main(int argc, char **argv)
332 364
333 /* Enable the buffer */ 365 /* Enable the buffer */
334 ret = write_sysfs_int("enable", buf_dir_name, 1); 366 ret = write_sysfs_int("enable", buf_dir_name, 1);
335 if (ret < 0) 367 if (ret < 0) {
368 fprintf(stderr,
369 "Failed to enable buffer: %s\n", strerror(-ret));
336 goto error_free_buf_dir_name; 370 goto error_free_buf_dir_name;
371 }
372
337 scan_size = size_from_channelarray(channels, num_channels); 373 scan_size = size_from_channelarray(channels, num_channels);
338 data = malloc(scan_size*buf_len); 374 data = malloc(scan_size * buf_len);
339 if (!data) { 375 if (!data) {
340 ret = -ENOMEM; 376 ret = -ENOMEM;
341 goto error_free_buf_dir_name; 377 goto error_free_buf_dir_name;
@@ -349,13 +385,12 @@ int main(int argc, char **argv)
349 385
350 /* Attempt to open non blocking the access dev */ 386 /* Attempt to open non blocking the access dev */
351 fp = open(buffer_access, O_RDONLY | O_NONBLOCK); 387 fp = open(buffer_access, O_RDONLY | O_NONBLOCK);
352 if (fp == -1) { /* If it isn't there make the node */ 388 if (fp == -1) { /* TODO: If it isn't there make the node */
353 ret = -errno; 389 ret = -errno;
354 printf("Failed to open %s\n", buffer_access); 390 fprintf(stderr, "Failed to open %s\n", buffer_access);
355 goto error_free_buffer_access; 391 goto error_free_buffer_access;
356 } 392 }
357 393
358 /* Wait for events 10 times */
359 for (j = 0; j < num_loops; j++) { 394 for (j = 0; j < num_loops; j++) {
360 if (!noevents) { 395 if (!noevents) {
361 struct pollfd pfd = { 396 struct pollfd pfd = {
@@ -372,25 +407,22 @@ int main(int argc, char **argv)
372 } 407 }
373 408
374 toread = buf_len; 409 toread = buf_len;
375
376 } else { 410 } else {
377 usleep(timedelay); 411 usleep(timedelay);
378 toread = 64; 412 toread = 64;
379 } 413 }
380 414
381 read_size = read(fp, 415 read_size = read(fp, data, toread * scan_size);
382 data,
383 toread*scan_size);
384 if (read_size < 0) { 416 if (read_size < 0) {
385 if (errno == EAGAIN) { 417 if (errno == EAGAIN) {
386 printf("nothing available\n"); 418 fprintf(stderr, "nothing available\n");
387 continue; 419 continue;
388 } else 420 } else {
389 break; 421 break;
422 }
390 } 423 }
391 for (i = 0; i < read_size/scan_size; i++) 424 for (i = 0; i < read_size / scan_size; i++)
392 process_scan(data + scan_size*i, 425 process_scan(data + scan_size * i, channels,
393 channels,
394 num_channels); 426 num_channels);
395 } 427 }
396 428
@@ -404,11 +436,13 @@ int main(int argc, char **argv)
404 ret = write_sysfs_string("trigger/current_trigger", 436 ret = write_sysfs_string("trigger/current_trigger",
405 dev_dir_name, "NULL"); 437 dev_dir_name, "NULL");
406 if (ret < 0) 438 if (ret < 0)
407 printf("Failed to write to %s\n", dev_dir_name); 439 fprintf(stderr, "Failed to write to %s\n",
440 dev_dir_name);
408 441
409error_close_buffer_access: 442error_close_buffer_access:
410 if (close(fp) == -1) 443 if (close(fp) == -1)
411 perror("Failed to close buffer"); 444 perror("Failed to close buffer");
445
412error_free_buffer_access: 446error_free_buffer_access:
413 free(buffer_access); 447 free(buffer_access);
414error_free_data: 448error_free_data:
@@ -424,6 +458,7 @@ error_free_channels:
424error_free_triggername: 458error_free_triggername:
425 if (datardytrigger) 459 if (datardytrigger)
426 free(trigger_name); 460 free(trigger_name);
461
427error_free_dev_dir_name: 462error_free_dev_dir_name:
428 free(dev_dir_name); 463 free(dev_dir_name);
429 464