X-Git-Url: https://git.gag.com/?p=fw%2Faltos;a=blobdiff_plain;f=ao-tools%2Fao-chaosread%2Fao-chaosread.c;h=b0a6168aa71e991fc7f7e7ee86f55d299c4d2074;hp=806c2ef9e57f3b1018f886d90ecf0e48964f9671;hb=31f9ed231e63b214b405a141cabce3eb758e82e6;hpb=99d3248a390379cfabf821ea4a195072799861eb diff --git a/ao-tools/ao-chaosread/ao-chaosread.c b/ao-tools/ao-chaosread/ao-chaosread.c index 806c2ef9..b0a6168a 100644 --- a/ao-tools/ao-chaosread/ao-chaosread.c +++ b/ao-tools/ao-chaosread/ao-chaosread.c @@ -3,7 +3,8 @@ * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; version 2 of the License. + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of @@ -35,7 +36,7 @@ struct chaoskey { int kernel_active; }; -libusb_device_handle * +static libusb_device_handle * chaoskey_match(libusb_device *dev, char *match_serial) { struct libusb_device_descriptor desc; @@ -73,7 +74,7 @@ chaoskey_match(libusb_device *dev, char *match_serial) goto out; } - ret = libusb_get_string_descriptor_ascii(handle, desc.iSerialNumber, device_serial, match_len + 1); + ret = libusb_get_string_descriptor_ascii(handle, desc.iSerialNumber, (unsigned char *) device_serial, match_len + 1); if (ret < 0) { fprintf(stderr, "failed to get serial number: %s\n", libusb_strerror(ret)); @@ -90,20 +91,18 @@ chaoskey_match(libusb_device *dev, char *match_serial) return handle; out: - free(device_serial); if (handle) libusb_close(handle); return 0; } -struct chaoskey * +static struct chaoskey * chaoskey_open(char *serial) { struct chaoskey *ck; int ret; ssize_t num; libusb_device **list; - libusb_device *device = NULL; int d; ck = calloc(sizeof (struct chaoskey), 1); @@ -162,35 +161,21 @@ out: return NULL; } -void -chaoskey_close(struct chaoskey *ck) -{ - libusb_release_interface(ck->handle, 0); - if (ck->kernel_active) - libusb_attach_kernel_driver(ck->handle, 0); - libusb_close(ck->handle); - libusb_exit(ck->ctx); - free(ck); -} +#define COOKED_ENDPOINT 0x85 +#define RAW_ENDPOINT 0x86 +#define FLASH_ENDPOINT 0x87 -void -chaoskey_transfer_callback(struct libusb_transfer *transfer) -{ - struct chaoskey *ck = transfer->user_data; -} - -#define ENDPOINT 0x86 - -int -chaoskey_read(struct chaoskey *ck, uint8_t *buffer, int len) +static int +chaoskey_read(struct chaoskey *ck, int endpoint, void *buffer, int len) { + uint8_t *buf = buffer; int total = 0; while (len) { int ret; int transferred; - ret = libusb_bulk_transfer(ck->handle, ENDPOINT, buffer, len, &transferred, 10000); + ret = libusb_bulk_transfer(ck->handle, endpoint, buf, len, &transferred, 10000); if (ret) { if (total) return total; @@ -200,19 +185,26 @@ chaoskey_read(struct chaoskey *ck, uint8_t *buffer, int len) } } len -= transferred; - buffer += transferred; + buf += transferred; + total += transferred; } + return total; } static const struct option options[] = { { .name = "serial", .has_arg = 1, .val = 's' }, { .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' }, + { .name = "flash", .has_arg = 0, .val = 'f' }, { 0, 0, 0, 0}, }; static void usage(char *program) { - fprintf(stderr, "usage: %s [--serial=] [--length=[kMG]]\n", program); + fprintf(stderr, "usage: %s [--serial=] [--length=[kMG]] [--infinite] [--bytes] [--cooked] [--raw] [--flash]\n", program); exit(1); } @@ -220,16 +212,19 @@ int main (int argc, char **argv) { struct chaoskey *ck; - char buf[1024]; + uint16_t buf[512]; int got; int c; char *serial = NULL; char *length_string; char *length_end; unsigned long length = sizeof(buf); - int this_time; + int this_time; + int infinite = 0; + int bytes = 0; + int endpoint = RAW_ENDPOINT; - while ((c = getopt_long(argc, argv, "s:l:", options, NULL)) != -1) { + while ((c = getopt_long(argc, argv, "s:l:ibcrf", options, NULL)) != -1) { switch (c) { case 's': serial = optarg; @@ -246,6 +241,21 @@ main (int argc, char **argv) else if (strlen(length_end)) usage(argv[0]); break; + case 'i': + infinite = 1; + break; + case 'b': + bytes = 1; + break; + case 'c': + endpoint = COOKED_ENDPOINT; + break; + case 'r': + endpoint = RAW_ENDPOINT; + break; + case 'f': + endpoint = FLASH_ENDPOINT; + break; default: usage(argv[0]); break; @@ -256,16 +266,33 @@ main (int argc, char **argv) if (!ck) exit(1); - while (length) { + if (bytes) + length *= 2; + + while (length || infinite) { this_time = sizeof(buf); - if (length < 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); } - write(1, buf, got); + if (bytes) { + int i; + for (i = 0; i < got / 2; i++) + putchar((buf[i] >> 1 & 0xff)); + } else { + int i; + int ret; + for (i = 0; i < got; i += ret) { + ret = write(1, ((char *) buf) + i, got - i); + if (ret <= 0) { + perror("write"); + exit(1); + } + } + } length -= got; } exit(0);