diff options
Diffstat (limited to 'tools/iio/generic_buffer.c')
| -rw-r--r-- | tools/iio/generic_buffer.c | 115 | 
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)  		if (bytes % channels[i].bytes == 0)  			channels[i].location = bytes;  		else -			channels[i].location = bytes - bytes%channels[i].bytes -				+ channels[i].bytes; +			channels[i].location = bytes - bytes % channels[i].bytes +					       + channels[i].bytes; +  		bytes = channels[i].location + channels[i].bytes;  		i++;  	} +  	return bytes;  } +void print1byte(uint8_t input, struct iio_channel_info *info) +{ +	/* +	 * Shift before conversion to avoid sign extension +	 * of left aligned data +	 */ +	input >>= info->shift; +	input &= info->mask; +	if (info->is_signed) { +		int8_t val = (int8_t)(input << (8 - info->bits_used)) >> +			     (8 - info->bits_used); +		printf("%05f ", ((float)val + info->offset) * info->scale); +	} else { +		printf("%05f ", ((float)input + info->offset) * info->scale); +	} +} +  void print2byte(uint16_t input, struct iio_channel_info *info)  {  	/* First swap if incorrect endian */ @@ -136,9 +155,9 @@ void print8byte(uint64_t input, struct iio_channel_info *info)  /**   * 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. + * @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, @@ -150,6 +169,10 @@ void process_scan(char *data,  	for (k = 0; k < num_channels; k++)  		switch (channels[k].bytes) {  			/* only a few cases implemented so far */ +		case 1: +			print1byte(*(uint8_t *)(data + channels[k].location), +				   &channels[k]); +			break;  		case 2:  			print2byte(*(uint16_t *)(data + channels[k].location),  				   &channels[k]); @@ -170,15 +193,15 @@ void process_scan(char *data,  void print_usage(void)  { -	printf("Usage: generic_buffer [options]...\n" -	       "Capture, convert and output data from IIO device buffer\n" -	       "  -c <n>     Do n conversions\n" -	       "  -e         Disable wait for event (new data)\n" -	       "  -g         Use trigger-less mode\n" -	       "  -l <n>     Set buffer length to n samples\n" -	       "  -n <name>  Set device name (mandatory)\n" -	       "  -t <name>  Set trigger name\n" -	       "  -w <n>     Set delay between reads in us (event-less mode)\n"); +	fprintf(stderr, "Usage: generic_buffer [options]...\n" +		"Capture, convert and output data from IIO device buffer\n" +		"  -c <n>     Do n conversions\n" +		"  -e         Disable wait for event (new data)\n" +		"  -g         Use trigger-less mode\n" +		"  -l <n>     Set buffer length to n samples\n" +		"  -n <name>  Set device name (mandatory)\n" +		"  -t <name>  Set trigger name\n" +		"  -w <n>     Set delay between reads in us (event-less mode)\n");  }  int main(int argc, char **argv) @@ -213,6 +236,7 @@ int main(int argc, char **argv)  			num_loops = strtoul(optarg, &dummy, 10);  			if (errno)  				return -errno; +  			break;  		case 'e':  			noevents = 1; @@ -225,6 +249,7 @@ int main(int argc, char **argv)  			buf_len = strtoul(optarg, &dummy, 10);  			if (errno)  				return -errno; +  			break;  		case 'n':  			device_name = optarg; @@ -245,8 +270,8 @@ int main(int argc, char **argv)  		}  	} -	if (device_name == NULL) { -		printf("Device name not set\n"); +	if (!device_name) { +		fprintf(stderr, "Device name not set\n");  		print_usage();  		return -1;  	} @@ -254,9 +279,10 @@ int main(int argc, char **argv)  	/* 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); +		fprintf(stderr, "Failed to find the %s\n", device_name);  		return dev_num;  	} +  	printf("iio device number being used is %d\n", dev_num);  	ret = asprintf(&dev_dir_name, "%siio:device%d", iio_dir, dev_num); @@ -264,7 +290,7 @@ int main(int argc, char **argv)  		return -ENOMEM;  	if (!notrigger) { -		if (trigger_name == NULL) { +		if (!trigger_name) {  			/*  			 * Build the trigger name. If it is device associated  			 * its name is <device_name>_dev[n] where n matches @@ -281,13 +307,16 @@ int main(int argc, char **argv)  		/* 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); +			fprintf(stderr, "Failed to find the trigger %s\n", +				trigger_name);  			ret = trig_num;  			goto error_free_triggername;  		} +  		printf("iio trigger number being used is %d\n", trig_num); -	} else +	} else {  		printf("trigger-less mode selected\n"); +	}  	/*  	 * Parse the files in scan_elements to identify what channels are @@ -295,8 +324,8 @@ int main(int argc, char **argv)  	 */  	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); +		fprintf(stderr, "Problem reading scan element information\n" +			"diag %s\n", dev_dir_name);  		goto error_free_triggername;  	} @@ -314,13 +343,16 @@ int main(int argc, char **argv)  	if (!notrigger) {  		printf("%s %s\n", dev_dir_name, trigger_name); -		/* Set the device trigger to be the data ready trigger found -		 * above */ +		/* +		 * 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"); +			fprintf(stderr, +				"Failed to write current_trigger file\n");  			goto error_free_buf_dir_name;  		}  	} @@ -332,10 +364,14 @@ int main(int argc, char **argv)  	/* Enable the buffer */  	ret = write_sysfs_int("enable", buf_dir_name, 1); -	if (ret < 0) +	if (ret < 0) { +		fprintf(stderr, +			"Failed to enable buffer: %s\n", strerror(-ret));  		goto error_free_buf_dir_name; +	} +  	scan_size = size_from_channelarray(channels, num_channels); -	data = malloc(scan_size*buf_len); +	data = malloc(scan_size * buf_len);  	if (!data) {  		ret = -ENOMEM;  		goto error_free_buf_dir_name; @@ -349,13 +385,12 @@ int main(int argc, char **argv)  	/* 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 */ +	if (fp == -1) { /* TODO: If it isn't there make the node */  		ret = -errno; -		printf("Failed to open %s\n", buffer_access); +		fprintf(stderr, "Failed to open %s\n", buffer_access);  		goto error_free_buffer_access;  	} -	/* Wait for events 10 times */  	for (j = 0; j < num_loops; j++) {  		if (!noevents) {  			struct pollfd pfd = { @@ -372,25 +407,22 @@ int main(int argc, char **argv)  			}  			toread = buf_len; -  		} else {  			usleep(timedelay);  			toread = 64;  		} -		read_size = read(fp, -				 data, -				 toread*scan_size); +		read_size = read(fp, data, toread * scan_size);  		if (read_size < 0) {  			if (errno == EAGAIN) { -				printf("nothing available\n"); +				fprintf(stderr, "nothing available\n");  				continue; -			} else +			} else {  				break; +			}  		} -		for (i = 0; i < read_size/scan_size; i++) -			process_scan(data + scan_size*i, -				     channels, +		for (i = 0; i < read_size / scan_size; i++) +			process_scan(data + scan_size * i, channels,  				     num_channels);  	} @@ -404,11 +436,13 @@ int main(int argc, char **argv)  		ret = write_sysfs_string("trigger/current_trigger",  					 dev_dir_name, "NULL");  		if (ret < 0) -			printf("Failed to write to %s\n", dev_dir_name); +			fprintf(stderr, "Failed to write to %s\n", +				dev_dir_name);  error_close_buffer_access:  	if (close(fp) == -1)  		perror("Failed to close buffer"); +  error_free_buffer_access:  	free(buffer_access);  error_free_data: @@ -424,6 +458,7 @@ error_free_channels:  error_free_triggername:  	if (datardytrigger)  		free(trigger_name); +  error_free_dev_dir_name:  	free(dev_dir_name);  |