diff options
author | Marcel Holtmann <marcel@holtmann.org> | 2005-10-19 10:51:58 +0000 |
---|---|---|
committer | Marcel Holtmann <marcel@holtmann.org> | 2005-10-19 10:51:58 +0000 |
commit | 5b90831adf64b3461986e52afe608b8917f389c9 (patch) | |
tree | a966ad2632c24d11da0aca137e25c1bfbee30f2d | |
parent | a6d4f9cdc6a4d189120dbffeba96a79f72a77c91 (diff) |
Add command for device discovery
-rw-r--r-- | tools/avctrl.8 | 1 | ||||
-rw-r--r-- | tools/avctrl.c | 38 |
2 files changed, 30 insertions, 9 deletions
diff --git a/tools/avctrl.8 b/tools/avctrl.8 index f791cf9e..7c3759d6 100644 --- a/tools/avctrl.8 +++ b/tools/avctrl.8 @@ -23,6 +23,7 @@ avctrl \- Bluetooth Audio/Video control utility [ .I options ] +<command> .SH DESCRIPTION .B avctrl is used to control the Audio/Video dongles. diff --git a/tools/avctrl.c b/tools/avctrl.c index 14d42e4a..03b54117 100644 --- a/tools/avctrl.c +++ b/tools/avctrl.c @@ -66,7 +66,7 @@ struct device_info; struct device_id { uint16_t vendor; uint16_t product; - int (*func)(struct device_info *dev); + int (*func)(struct device_info *dev, int argc, char *argv[]); }; struct device_info { @@ -80,12 +80,23 @@ struct device_info { #define SWITCH_TO_DFU 0x04 #define READ_CODEC 0x05 -static int dongle_csr(struct device_info *devinfo) +static int dongle_csr(struct device_info *devinfo, int argc, char *argv[]) { char buf[8]; struct usb_dev_handle *udev; int err, intf = 2; + memset(buf, 0, sizeof(buf)); + + if (!strncasecmp(argv[0], "discover", 4)) + buf[0] = DISCOVER; + else if (!strncasecmp(argv[0], "switch", 3)) + buf[0] = SWITCH_TO_DFU; + else if (!strncasecmp(argv[0], "dfu", 3)) + buf[0] = SWITCH_TO_DFU; + else + return -EINVAL; + udev = usb_open(devinfo->dev); if (!udev) return -errno; @@ -96,9 +107,6 @@ static int dongle_csr(struct device_info *devinfo) return err; } - memset(buf, 0, sizeof(buf)); - buf[0] = SWITCH_TO_DFU; - err = usb_control_msg(udev, USB_DIR_OUT | USB_TYPE_CLASS | USB_RECIP_INTERFACE, HID_REQ_SET_REPORT, 0x03 << 8, intf, buf, sizeof(buf), 10000); @@ -166,13 +174,18 @@ static void usage(void) printf("avctrl - Bluetooth Audio/Video control utility\n\n"); printf("Usage:\n" - "\tavctrl [options]\n" + "\tavctrl [options] <command>\n" "\n"); printf("Options:\n" "\t-h, --help Display help\n" "\t-q, --quiet Don't display any messages\n" "\n"); + + printf("Commands:\n" + "\tdiscover Simulate pressing the discover button\n" + "\tswitch Switch the dongle to DFU mode\n" + "\n"); } static struct option main_options[] = { @@ -203,6 +216,11 @@ int main(int argc, char *argv[]) argv += optind; optind = 0; + if (argc < 1) { + usage(); + exit(1); + } + usb_init(); num = find_devices(dev, sizeof(dev) / sizeof(dev[0])); @@ -214,15 +232,17 @@ int main(int argc, char *argv[]) for (i = 0; i < num; i++) { struct device_id *id = dev[i].id; + int err; if (!quiet) - printf("Switching device %04x:%04x ", + printf("Selecting device %04x:%04x ", id->vendor, id->product); fflush(stdout); - if (id->func(&dev[i]) < 0) { + err = id->func(&dev[i], argc, argv); + if (err < 0) { if (!quiet) - printf("failed (%s)\n", strerror(errno)); + printf("failed (%s)\n", strerror(-err)); } else { if (!quiet) printf("was successful\n"); |