2 * Copyright (c) 2012-2013 Samsung Electronics Co., Ltd.
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
8 * http://www.apache.org/licenses/LICENSE-2.0
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
30 #define GET_EXECUTABLE(func) \
31 (backend_ctx.backend->gadget->func ? \
32 backend_ctx.backend->gadget->func : \
33 gt_gadget_backend_not_implemented.func)
35 const struct gt_gadget_str gadget_strs[] = {
36 { "product", usbg_set_gadget_product },
37 { "manufacturer", usbg_set_gadget_manufacturer },
38 { "serialnumber", usbg_set_gadget_serial_number },
41 static void gt_gadget_create_destructor(void *data)
43 struct gt_gadget_create_data *dt;
48 dt = (struct gt_gadget_create_data *)data;
49 for (i = 0; i < GT_GADGET_STRS_COUNT; i++)
55 char *attr_type_get(usbg_gadget_attr a)
59 case B_DEVICE_SUB_CLASS:
60 case B_DEVICE_PROTOCOL:
61 case B_MAX_PACKET_SIZE_0:
75 static int attr_val_in_range(usbg_gadget_attr a, unsigned long int val)
77 char *type = attr_type_get(a);
83 return val <= UINT8_MAX;
84 else if (type[0] == 'q')
85 return val <= UINT16_MAX;
90 static int gt_gadget_create_help(void *data)
94 printf("usage: %s create <name> [attr=value]...\n"
95 "Create new gadget of specified name, attributes and language strings.\n"
100 for (i = USBG_GADGET_ATTR_MIN; i < USBG_GADGET_ATTR_MAX; i++)
101 printf(" %s\n", usbg_get_gadget_attr_str(i));
103 printf("Device strings (en_US locale):\n");
105 for (i = 0; i < GT_GADGET_STRS_COUNT; i++)
106 printf(" %s\n", gadget_strs[i].name);
111 static void gt_parse_gadget_create(const Command *cmd, int argc, char **argv,
112 ExecutableCommand *exec, void *data)
114 struct gt_gadget_create_data *dt;
117 int avaible_opts = GT_FORCE | GT_HELP;
118 struct gt_setting *setting, *attrs = NULL;
122 dt = zalloc(sizeof(*dt));
126 ind = gt_get_options(&dt->opts, avaible_opts, argc, argv);
127 if (ind < 0 || dt->opts & GT_HELP)
133 dt->name = argv[ind++];
135 c = gt_parse_setting_list(&attrs, argc - ind, argv + ind);
139 for (i = 0; i < USBG_GADGET_ATTR_MAX; i++)
140 dt->attr_val[i] = -1;
141 memset(dt->str_val, 0, sizeof(dt->str_val));
143 for (setting = attrs; setting->variable; setting++) {
148 attr_id = usbg_lookup_gadget_attr(setting->variable);
150 unsigned long int val;
154 val = strtoul(setting->value, &endptr, 0);
156 || *setting->value == 0
157 || (endptr && *endptr != 0)
158 || attr_val_in_range(attr_id, val) == 0) {
160 fprintf(stderr, "Invalid value '%s' for attribute '%s'\n",
161 setting->value, setting->variable);
165 dt->attr_val[attr_id] = val;
169 for (i = 0; iter && i < GT_GADGET_STRS_COUNT; i++) {
170 if (streq(setting->variable, gadget_strs[i].name)) {
171 dt->str_val[i] = setting->value;
178 fprintf(stderr, "Unknown attribute passed: %s\n", setting->variable);
183 executable_command_set(exec, GET_EXECUTABLE(create),
184 (void *)dt, gt_gadget_create_destructor);
188 gt_setting_list_cleanup(attrs);
189 gt_gadget_create_destructor((void *)dt);
190 executable_command_set(exec, cmd->printHelp, data, NULL);
193 static int gt_gadget_rm_help(void *data)
195 printf("usage: %s rm [options] <name> \n"
196 "Remove gadget of specified name\n"
199 " -f, --force\tDisable gadget if it was enabled\n"
200 " -r, --recursive\tRemove configs and functions recursively\n"
201 " -h, --help\tPrint this help\n",
206 static void gt_parse_gadget_rm(const Command *cmd, int argc, char **argv,
207 ExecutableCommand *exec, void *data)
209 struct gt_gadget_rm_data *dt;
211 int avaible_opts = GT_FORCE | GT_RECURSIVE | GT_HELP;
213 dt = zalloc(sizeof(*dt));
217 ind = gt_get_options(&dt->opts, avaible_opts, argc, argv);
218 if (ind < 0 || dt->opts & GT_HELP)
223 dt->name = argv[ind];
224 executable_command_set(exec, GET_EXECUTABLE(rm), (void *)dt,
229 executable_command_set(exec, cmd->printHelp, data, NULL);
232 static void gt_gadget_get_destructor(void *data)
234 struct gt_gadget_get_data *dt;
238 dt = (struct gt_gadget_get_data *)data;
244 static int gt_gadget_get_help(void *data)
246 printf("Gadget get help.\n");
250 static void gt_parse_gadget_get(const Command *cmd, int argc, char **argv,
251 ExecutableCommand *exec, void * data)
253 struct gt_gadget_get_data *dt = NULL;
256 int avaible_opts = GT_HELP;
261 dt = zalloc(sizeof(*dt));
265 ind = gt_get_options(&dt->opts, avaible_opts, argc, argv);
266 if (ind < 0 || dt->opts & GT_HELP)
269 dt->name = argv[ind++];
270 dt->attrs = calloc(argc - ind + 1, sizeof(char *));
271 if (dt->attrs == NULL)
276 dt->attrs[i++] = argv[ind++];
278 executable_command_set(exec, GET_EXECUTABLE(get), (void *)dt,
279 gt_gadget_get_destructor);
283 gt_gadget_get_destructor((void *)dt);
284 executable_command_set(exec, cmd->printHelp, data, NULL);
287 static void gt_gadget_set_destructor(void *data)
289 struct gt_gadget_set_data *dt;
293 dt = (struct gt_gadget_set_data *)data;
294 gt_setting_list_cleanup(dt->attrs);
298 static int gt_gadget_set_help(void *data)
300 printf("Gadget set help.\n");
304 static void gt_parse_gadget_set(const Command *cmd, int argc, char **argv,
305 ExecutableCommand *exec, void * data)
307 struct gt_gadget_set_data *dt = NULL;
310 int avaible_opts = GT_HELP;
312 dt = zalloc(sizeof(*dt));
316 ind = gt_get_options(&dt->opts, avaible_opts, argc, argv);
317 if (ind < 0 || dt->opts & GT_HELP)
323 dt->name = argv[ind++];
324 tmp = gt_parse_setting_list(&dt->attrs, argc - ind, argv + ind);
328 executable_command_set(exec, GET_EXECUTABLE(set), (void *)dt,
329 gt_gadget_set_destructor);
332 gt_gadget_set_destructor((void *)dt);
333 executable_command_set(exec, cmd->printHelp, data, NULL);
336 static int gt_gadget_enable_help(void *data)
338 printf("Gadget enable help.\n");
342 static void gt_parse_gadget_enable(const Command *cmd, int argc,
343 char **argv, ExecutableCommand *exec, void * data)
345 struct gt_gadget_enable_data *dt;
347 int avaible_opts = GT_HELP;
349 dt = zalloc(sizeof(*dt));
353 ind = gt_get_options(&dt->opts, avaible_opts, argc, argv);
354 if (ind < 0 || dt->opts & GT_HELP)
357 switch (argc - ind) {
359 dt->gadget = argv[ind++];
362 dt->gadget = argv[ind++];
363 dt->udc = argv[ind++];
369 executable_command_set(exec, GET_EXECUTABLE(enable),
374 executable_command_set(exec, cmd->printHelp, data, NULL);
377 static int gt_gadget_disable_help(void *data)
379 printf("Gadget disable help.\n");
383 static void gt_parse_gadget_disable(const Command *cmd, int argc,
384 char **argv, ExecutableCommand *exec, void * data)
386 struct gt_gadget_disable_data *dt;
388 struct option opts[] = {
389 {"udc", required_argument, 0, 'u'},
390 {"help", no_argument, 0, 'h'},
394 dt = zalloc(sizeof(*dt));
401 c = getopt_long(argc, argv, "u:h", opts, &opt_index);
416 if (optind < argc - 1 || (dt->udc && optind < argc)) {
417 printf("Too many arguments\n");
421 dt->gadget = argv[optind];
422 executable_command_set(exec, GET_EXECUTABLE(disable), (void *)dt, free);
426 executable_command_set(exec, cmd->printHelp, data, NULL);
429 static int gt_gadget_gadget_help(void *data)
431 printf("Gadget gadget help.\n");
435 static void gt_parse_gadget_gadget(const Command *cmd, int argc,
436 char **argv, ExecutableCommand *exec, void * data)
438 struct gt_gadget_gadget_data *dt;
440 int avaible_opts = GT_RECURSIVE | GT_VERBOSE | GT_HELP;
442 dt = zalloc(sizeof(*dt));
446 ind = gt_get_options(&dt->opts, avaible_opts, argc, argv);
447 if (ind < 0 || dt->opts & GT_HELP)
450 switch (argc - ind) {
454 dt->name = argv[ind];
460 executable_command_set(exec, GET_EXECUTABLE(gadget), (void *)dt,
465 executable_command_set(exec, cmd->printHelp, data, NULL);
468 static int gt_gadget_load_help(void *data)
470 printf("Gadget load help\n");
474 static void gt_parse_gadget_load(const Command *cmd, int argc,
475 char **argv, ExecutableCommand *exec, void * data)
478 struct gt_gadget_load_data *dt;
479 struct option opts[] = {
480 {"off", no_argument, 0, 'o'},
481 {"file", required_argument, 0, 1},
482 {"stdin", no_argument, 0, 2},
483 {"path", required_argument, 0, 3},
484 {"help", no_argument, 0, 'h'},
488 dt = zalloc(sizeof(*dt));
495 c = getopt_long(argc, argv, "oh", opts, &opt_index);
503 if (dt->path || dt->opts & GT_STDIN)
508 if (dt->path || dt->file)
510 dt->opts |= GT_STDIN;
513 if (dt->file || dt->opts & GT_STDIN)
525 if (optind == argc || optind < argc - 2)
528 dt->name = argv[optind++];
529 if (dt->opts & GT_STDIN || dt->file) {
530 dt->gadget_name = dt->name;
537 dt->gadget_name = argv[optind++];
539 executable_command_set(exec, GET_EXECUTABLE(load), (void *)dt, free);
543 executable_command_set(exec, cmd->printHelp, data, NULL);
546 static void gt_gadget_save_destructor(void *data)
548 struct gt_gadget_save_data *dt;
552 dt = (struct gt_gadget_save_data *)data;
553 gt_setting_list_cleanup(dt->attrs);
557 static int gt_gadget_save_help(void *data)
559 printf("Gadget save help.\n");
563 static void gt_parse_gadget_save(const Command *cmd, int argc,
564 char **argv, ExecutableCommand *exec, void * data)
567 struct gt_gadget_save_data *dt;
568 struct option opts[] = {
569 {"force", no_argument, 0, 'f'},
570 {"file", required_argument, 0, 1},
571 {"stdout", no_argument, 0, 2},
572 {"path", required_argument, 0, 3},
573 {"help", no_argument, 0, 'h'},
577 dt = zalloc(sizeof(*dt));
584 c = getopt_long(argc, argv, "fh", opts, &opt_index);
589 dt->opts |= GT_FORCE;
592 if (dt->path || dt->opts & GT_STDOUT)
597 if (dt->file || dt->path)
599 dt->opts |= GT_STDOUT;
602 if (dt->file || dt->opts & GT_STDOUT)
617 dt->gadget = argv[optind++];
621 && !(dt->opts & GT_STDOUT)
622 && strchr(argv[optind], '=') == NULL)
623 dt->name = argv[optind++];
625 c = gt_parse_setting_list(&dt->attrs, argc - optind,
630 executable_command_set(exec, GET_EXECUTABLE(save), (void *)dt,
631 gt_gadget_save_destructor);
635 gt_gadget_save_destructor((void *)dt);
636 executable_command_set(exec, cmd->printHelp, data, NULL);
639 static int gt_gadget_template_help(void *data)
641 printf("Gadget template help.\n");
645 static void gt_parse_gadget_template(const Command *cmd, int argc,
646 char **argv, ExecutableCommand *exec, void * data)
649 struct gt_gadget_template_data *dt;
650 int avaible_opts = GT_VERBOSE | GT_RECURSIVE | GT_HELP;
652 dt = zalloc(sizeof(*dt));
656 ind = gt_get_options(&dt->opts, avaible_opts, argc, argv);
657 if (ind < 0 || dt->opts & GT_HELP)
664 dt->name = argv[ind];
666 executable_command_set(exec, GET_EXECUTABLE(template_default), (void *)dt,
672 executable_command_set(exec, cmd->printHelp, data, NULL);
675 static int gt_gadget_template_rm_help(void *data)
677 printf("Gadget template rm help.\n");
681 static void gt_parse_gadget_template_rm(const Command *cmd, int argc,
682 char **argv, ExecutableCommand *exec, void * data)
684 struct gt_gadget_template_rm_data *dt = NULL;
686 int avaible_opts = GT_HELP;
688 dt = zalloc(sizeof(*dt));
692 ind = gt_get_options(&dt->opts, avaible_opts, argc, argv);
693 if (ind < 0 || dt->opts & GT_HELP)
699 dt->name = argv[ind++];
700 executable_command_set(exec, GET_EXECUTABLE(template_rm), (void *)dt,
705 executable_command_set(exec, cmd->printHelp, data, NULL);
708 static void gt_gadget_template_set_destructor(void *data)
710 struct gt_gadget_template_set_data *dt;
714 dt = (struct gt_gadget_template_set_data *)data;
715 gt_setting_list_cleanup(dt->attr);
719 static int gt_gadget_template_set_help(void *data)
721 printf("Gadget template set help.\n");
725 static void gt_parse_gadget_template_set(const Command *cmd, int argc,
726 char **argv, ExecutableCommand *exec, void * data)
729 struct gt_gadget_template_set_data *dt;
731 int avaible_opts = GT_HELP;
733 dt = zalloc(sizeof(*dt));
737 ind = gt_get_options(&dt->opts, avaible_opts, argc, argv);
738 if (ind < 0 || dt->opts & GT_HELP)
744 dt->name = argv[ind++];
745 tmp = gt_parse_setting_list(&dt->attr, argc - ind, argv + ind);
749 executable_command_set(exec, GET_EXECUTABLE(set), (void *)dt,
750 gt_gadget_template_set_destructor);
754 gt_gadget_template_set_destructor((void *)dt);
755 executable_command_set(exec, cmd->printHelp, data, NULL);
758 static void gt_gadget_template_get_destructor(void *data)
760 struct gt_gadget_template_get_data *dt;
764 dt = (struct gt_gadget_template_get_data *)data;
769 static int gt_gadget_template_get_help(void *data)
771 printf("Gadget template get help.\n");
775 static void gt_parse_gadget_template_get(const Command *cmd, int argc,
776 char **argv, ExecutableCommand *exec, void * data)
779 struct gt_gadget_template_get_data *dt;
781 int avaible_opts = GT_HELP;
783 dt = zalloc(sizeof(*dt));
787 ind = gt_get_options(&dt->opts, avaible_opts, argc, argv);
788 if (ind < 0 || dt->opts & GT_HELP)
794 dt->name = argv[ind++];
795 dt->attr = calloc(argc, sizeof(char *));
796 if (dt->attr == NULL)
801 dt->attr[i++] = argv[ind++];
803 executable_command_set(exec, GET_EXECUTABLE(get), (void *)dt,
804 gt_gadget_template_get_destructor);
808 gt_gadget_template_get_destructor((void *)dt);
809 executable_command_set(exec, cmd->printHelp, data, NULL);
812 const Command *get_gadget_template_children(const Command *cmd)
814 static Command commands[] = {
815 {"get", NEXT, gt_parse_gadget_template_get, NULL,
816 gt_gadget_template_get_help},
817 {"set", NEXT, gt_parse_gadget_template_set, NULL,
818 gt_gadget_template_set_help},
819 {"rm", NEXT, gt_parse_gadget_template_rm, NULL,
820 gt_gadget_template_rm_help},
821 {NULL, AGAIN, gt_parse_gadget_template, NULL,
822 gt_gadget_template_help},
829 const Command *get_gadget_children(const Command *cmd)
831 static Command commands[] = {
832 {"create", NEXT, gt_parse_gadget_create, NULL,
833 gt_gadget_create_help},
834 {"rm", NEXT, gt_parse_gadget_rm, NULL, gt_gadget_rm_help},
835 {"get", NEXT, gt_parse_gadget_get, NULL, gt_gadget_get_help},
836 {"set", NEXT, gt_parse_gadget_set, NULL, gt_gadget_set_help},
837 {"enable", NEXT, gt_parse_gadget_enable, NULL,
838 gt_gadget_enable_help},
839 {"disable", NEXT, gt_parse_gadget_disable, NULL,
840 gt_gadget_disable_help},
841 {"gadget", NEXT, gt_parse_gadget_gadget, NULL,
842 gt_gadget_gadget_help},
843 {"template", NEXT, command_parse, get_gadget_template_children,
844 gt_gadget_template_help},
845 {"load", NEXT, gt_parse_gadget_load, NULL,
846 gt_gadget_load_help},
847 {"save", NEXT, gt_parse_gadget_save, NULL,
848 gt_gadget_save_help},
855 int gt_gadget_help(void *data)
857 printf("Gadget help function\n");