ao-chaosread: add --raw and --cooked flags
authorKeith Packard <keithp@keithp.com>
Mon, 8 Jan 2018 05:43:22 +0000 (21:43 -0800)
committerKeith Packard <keithp@keithp.com>
Mon, 8 Jan 2018 05:43:22 +0000 (21:43 -0800)
Allow reading from the cooked endpoint as well as the raw one.

Signed-off-by: Keith Packard <keithp@keithp.com>
ao-tools/ao-chaosread/ao-chaosread.1
ao-tools/ao-chaosread/ao-chaosread.c

index ead8afb..e6ed2fa 100644 (file)
@@ -33,6 +33,20 @@ one found.
 \-l length | --length length
 Set the amount of data to read. Suffixes 'k', 'M' and 'G' are
 supported. The default is 1k.
+.TP
+\-i | --infinite
+Read an unlimited amount of data.
+.TP
+\-b | --bytes
+For each 16-bit value read, output bits 1-8 as a byte, don't output
+bit 0 or bits 9-15 at all.
+.TP
+\-c | --cooked
+Read whitened data from the device. The default is to read raw data
+from the noise source.
+.TP
+\-r | --raw
+Read raw data from the noise source. This is the default.
 .SH USAGE
 .I ao-chaosread
 reads noise data.
index 6d86013..8a814a0 100644 (file)
@@ -172,10 +172,11 @@ chaoskey_close(struct chaoskey *ck)
        free(ck);
 }
 
-#define ENDPOINT       0x86
+#define COOKED_ENDPOINT        0x85
+#define RAW_ENDPOINT   0x86
 
 int
-chaoskey_read(struct chaoskey *ck, void *buffer, int len)
+chaoskey_read(struct chaoskey *ck, int endpoint, void *buffer, int len)
 {
        uint8_t *buf = buffer;
        int     total = 0;
@@ -184,7 +185,7 @@ chaoskey_read(struct chaoskey *ck, void *buffer, int len)
                int     ret;
                int     transferred;
 
-               ret = libusb_bulk_transfer(ck->handle, ENDPOINT, buf, len, &transferred, 10000);
+               ret = libusb_bulk_transfer(ck->handle, endpoint, buf, len, &transferred, 10000);
                if (ret) {
                        if (total)
                                return total;
@@ -205,12 +206,14 @@ static const struct option options[] = {
        { .name = "length", .has_arg = 1, .val = 'l' },
        { .name = "infinite", .has_arg = 0, .val = 'i' },
        { .name = "bytes", .has_arg = 0, .val = 'b' },
+       { .name = "cooked", .has_arg = 0, .val = 'c' },
+       { .name = "raw", .has_arg = 0, .val = 'r' },
        { 0, 0, 0, 0},
 };
 
 static void usage(char *program)
 {
-       fprintf(stderr, "usage: %s [--serial=<serial>] [--length=<length>[kMG]] [--infinite] [--bytes]\n", program);
+       fprintf(stderr, "usage: %s [--serial=<serial>] [--length=<length>[kMG]] [--infinite] [--bytes] [--cooked] [--raw]\n", program);
        exit(1);
 }
 
@@ -228,8 +231,9 @@ main (int argc, char **argv)
        int     this_time;
        int     infinite = 0;
        int     bytes = 0;
+       int     endpoint = RAW_ENDPOINT;
 
-       while ((c = getopt_long(argc, argv, "s:l:ib", options, NULL)) != -1) {
+       while ((c = getopt_long(argc, argv, "s:l:ibcr", options, NULL)) != -1) {
                switch (c) {
                case 's':
                        serial = optarg;
@@ -252,6 +256,12 @@ main (int argc, char **argv)
                case 'b':
                        bytes = 1;
                        break;
+               case 'c':
+                       endpoint = COOKED_ENDPOINT;
+                       break;
+               case 'r':
+                       endpoint = RAW_ENDPOINT;
+                       break;
                default:
                        usage(argv[0]);
                        break;
@@ -269,7 +279,7 @@ main (int argc, char **argv)
                this_time = sizeof(buf);
                if (!infinite && length < sizeof(buf))
                        this_time = (int) length;
-               got = chaoskey_read(ck, buf, this_time);
+               got = chaoskey_read(ck, endpoint, buf, this_time);
                if (got < 0) {
                        perror("read");
                        exit(1);