--- v2: fix removed NULL terminator in option struct tools/btattach.c | 53 ++++++++++++++++++++++++++++++++++++++++++++--------- 1 file changed, 44 insertions(+), 9 deletions(-) diff --git a/tools/btattach.c b/tools/btattach.c index b7948a3..fa0ce11 100644 --- a/tools/btattach.c +++ b/tools/btattach.c @@ -187,28 +187,44 @@ static void usage(void) printf("options:\n" "\t-B, --bredr <device> Attach BR/EDR controller\n" "\t-A, --amp <device> Attach AMP controller\n" + "\t-P, --protocol <proto> Specify protocol type\n" "\t-h, --help Show help options\n"); } static const struct option main_options[] = { - { "bredr", required_argument, NULL, 'B' }, - { "amp", required_argument, NULL, 'A' }, - { "version", no_argument, NULL, 'v' }, - { "help", no_argument, NULL, 'h' }, + { "bredr", required_argument, NULL, 'B' }, + { "amp", required_argument, NULL, 'A' }, + { "protocol", required_argument, NULL, 'P' }, + { "version", no_argument, NULL, 'v' }, + { "help", no_argument, NULL, 'h' }, + { } +}; + +static const struct { + unsigned int id; + const char *name; +} proto_table[] = { + {HCI_UART_H4, "h4"}, + {HCI_UART_BCSP, "bcsp"}, + {HCI_UART_3WIRE, "3wire"}, + {HCI_UART_H4DS, "h4ds"}, + {HCI_UART_LL, "ll"}, + {HCI_UART_ATH3K, "ath3k"}, + {HCI_UART_INTEL, "intel"}, { } }; int main(int argc, char *argv[]) { - const char *bredr_path = NULL, *amp_path = NULL; + const char *bredr_path = NULL, *amp_path = NULL, *proto = NULL; bool raw_device = false; sigset_t mask; - int exit_status, count = 0; + int exit_status, count = 0, proto_id = HCI_UART_H4; for (;;) { int opt; - opt = getopt_long(argc, argv, "B:A:Rvh", + opt = getopt_long(argc, argv, "B:A:P:Rvh", main_options, NULL); if (opt < 0) break; @@ -220,6 +236,9 @@ int main(int argc, char *argv[]) case 'A': amp_path = optarg; break; + case 'P': + proto = optarg; + break; case 'R': raw_device = true; break; @@ -247,6 +266,22 @@ int main(int argc, char *argv[]) mainloop_set_signal(&mask, signal_callback, NULL, NULL); + if (proto) { + unsigned int i; + + for (i = 0; proto_table[i].name; i++) { + if (!strcmp(proto_table[i].name, proto)) { + proto_id = proto_table[i].id; + break; + } + } + + if (!proto_table[i].name) { + fprintf(stderr, "Invalid protocol\n"); + return EXIT_FAILURE; + } + } + if (bredr_path) { unsigned long flags; int fd; @@ -258,7 +293,7 @@ int main(int argc, char *argv[]) if (raw_device) flags = (1 << HCI_UART_RAW_DEVICE); - fd = attach_proto(bredr_path, HCI_UART_H4, flags); + fd = attach_proto(bredr_path, proto_id, flags); if (fd >= 0) { mainloop_add_fd(fd, 0, uart_callback, NULL, NULL); count++; @@ -277,7 +312,7 @@ int main(int argc, char *argv[]) if (raw_device) flags = (1 << HCI_UART_RAW_DEVICE); - fd = attach_proto(amp_path, HCI_UART_H4, flags); + fd = attach_proto(amp_path, proto_id, flags); if (fd >= 0) { mainloop_add_fd(fd, 0, uart_callback, NULL, NULL); count++; -- 1.9.1 -- To unsubscribe from this list: send the line "unsubscribe linux-bluetooth" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html