From e4885b83f6e239cf9e1e9bd8a4ef461a40a4f794 Mon Sep 17 00:00:00 2001 From: Pawel Szewczyk Date: Thu, 9 Jul 2015 10:24:41 +0200 Subject: [PATCH] gadget: Add gadget set command at libusbg backend Change-Id: I37026a7e0e5064f9fdfa11fd6e0747bef815f8c4 Signed-off-by: Pawel Szewczyk --- source/gadget/include/gadget.h | 3 +- source/gadget/src/gadget.c | 87 +++++++++++++++++------------- source/gadget/src/gadget_libusbg.c | 46 +++++++++++++++- source/gadget/src/gadget_not_implemented.c | 20 +++++-- 4 files changed, 113 insertions(+), 43 deletions(-) diff --git a/source/gadget/include/gadget.h b/source/gadget/include/gadget.h index a0fbb6b..9403312 100644 --- a/source/gadget/include/gadget.h +++ b/source/gadget/include/gadget.h @@ -110,7 +110,8 @@ struct gt_gadget_get_data { struct gt_gadget_set_data { const char *name; - struct gt_setting *attrs; + int attr_val[USBG_GADGET_ATTR_MAX]; + char *str_val[GT_GADGET_STRS_COUNT]; int opts; }; diff --git a/source/gadget/src/gadget.c b/source/gadget/src/gadget.c index ac536bd..2b2c5c8 100644 --- a/source/gadget/src/gadget.c +++ b/source/gadget/src/gadget.c @@ -108,41 +108,14 @@ static int gt_gadget_create_help(void *data) return 0; } -static void gt_parse_gadget_create(const Command *cmd, int argc, char **argv, - ExecutableCommand *exec, void *data) +static int gt_parse_gadget_attrs(struct gt_setting *attrs, int *attr_val, char **str_val) { - struct gt_gadget_create_data *dt; - int ind; - int c; - int avaible_opts = GT_FORCE | GT_HELP; - struct gt_setting *setting, *attrs = NULL; + struct gt_setting *setting; + int attr_id; _Bool iter; int i; - dt = zalloc(sizeof(*dt)); - if (dt == NULL) - goto out; - - ind = gt_get_options(&dt->opts, avaible_opts, argc, argv); - if (ind < 0 || dt->opts & GT_HELP) - goto out; - - if (ind == argc) - goto out; - - dt->name = argv[ind++]; - - c = gt_parse_setting_list(&attrs, argc - ind, argv + ind); - if (c < 0) - goto out; - - for (i = 0; i < USBG_GADGET_ATTR_MAX; i++) - dt->attr_val[i] = -1; - memset(dt->str_val, 0, sizeof(dt->str_val)); - for (setting = attrs; setting->variable; setting++) { - int attr_id; - iter = TRUE; attr_id = usbg_lookup_gadget_attr(setting->variable); @@ -159,16 +132,16 @@ static void gt_parse_gadget_create(const Command *cmd, int argc, char **argv, fprintf(stderr, "Invalid value '%s' for attribute '%s'\n", setting->value, setting->variable); - goto out; + return -1; } - dt->attr_val[attr_id] = val; + attr_val[attr_id] = val; iter = FALSE; } for (i = 0; iter && i < GT_GADGET_STRS_COUNT; i++) { if (streq(setting->variable, gadget_strs[i].name)) { - dt->str_val[i] = setting->value; + str_val[i] = setting->value; iter = FALSE; break; } @@ -176,10 +149,46 @@ static void gt_parse_gadget_create(const Command *cmd, int argc, char **argv, if (iter) { fprintf(stderr, "Unknown attribute passed: %s\n", setting->variable); - goto out; + return -1; } } + return 0; +} + +static void gt_parse_gadget_create(const Command *cmd, int argc, char **argv, + ExecutableCommand *exec, void *data) +{ + struct gt_gadget_create_data *dt; + int ind; + int c; + int avaible_opts = GT_FORCE | GT_HELP; + struct gt_setting *attrs = NULL; + int i; + + dt = zalloc(sizeof(*dt)); + if (dt == NULL) + goto out; + + ind = gt_get_options(&dt->opts, avaible_opts, argc, argv); + if (ind < 0 || dt->opts & GT_HELP) + goto out; + + if (ind == argc) + goto out; + + dt->name = argv[ind++]; + + c = gt_parse_setting_list(&attrs, argc - ind, argv + ind); + if (c < 0) + goto out; + + for (i = 0; i < USBG_GADGET_ATTR_MAX; i++) + dt->attr_val[i] = -1; + memset(dt->str_val, 0, sizeof(dt->str_val)); + + gt_parse_gadget_attrs(attrs, dt->attr_val, dt->str_val); + executable_command_set(exec, GET_EXECUTABLE(create), (void *)dt, gt_gadget_create_destructor); @@ -313,7 +322,6 @@ static void gt_gadget_set_destructor(void *data) if (data == NULL) return; dt = (struct gt_gadget_set_data *)data; - gt_setting_list_cleanup(dt->attrs); free(dt); } @@ -330,6 +338,8 @@ static void gt_parse_gadget_set(const Command *cmd, int argc, char **argv, int tmp; int ind; int avaible_opts = GT_HELP; + struct gt_setting *attrs; + int i; dt = zalloc(sizeof(*dt)); if (dt == NULL) @@ -343,10 +353,15 @@ static void gt_parse_gadget_set(const Command *cmd, int argc, char **argv, goto out; dt->name = argv[ind++]; - tmp = gt_parse_setting_list(&dt->attrs, argc - ind, argv + ind); + tmp = gt_parse_setting_list(&attrs, argc - ind, argv + ind); if (tmp < 0) goto out; + for (i = 0; i < USBG_GADGET_ATTR_MAX; i++) + dt->attr_val[i] = -1; + memset(dt->str_val, 0, sizeof(dt->str_val)); + + gt_parse_gadget_attrs(attrs, dt->attr_val, dt->str_val); executable_command_set(exec, GET_EXECUTABLE(set), (void *)dt, gt_gadget_set_destructor); return; diff --git a/source/gadget/src/gadget_libusbg.c b/source/gadget/src/gadget_libusbg.c index 4094d0e..c40b101 100644 --- a/source/gadget/src/gadget_libusbg.c +++ b/source/gadget/src/gadget_libusbg.c @@ -516,11 +516,55 @@ out: return ret; } +static int set_func(void *data) +{ + struct gt_gadget_set_data *dt; + int i; + usbg_gadget *g; + int ret; + + dt = (struct gt_gadget_set_data *)data; + + g = usbg_get_gadget(backend_ctx.libusbg_state, dt->name); + if (!g) { + fprintf(stderr, "Error on get gadget\n"); + return -1; + } + + for (i = 0; i < ARRAY_SIZE(dt->attr_val); ++i) { + if (dt->attr_val[i] < 0) + continue; + + ret = usbg_set_gadget_attr(g, i, dt->attr_val[i]); + if (ret != USBG_SUCCESS) { + fprintf(stderr, "Unable to set attribute %s: %s\n", + usbg_get_gadget_attr_str(i), + usbg_strerror(ret)); + return -1; + } + } + + for (i = 0; i < G_N_ELEMENTS(dt->str_val); i++) { + if (dt->str_val[i] == NULL) + continue; + + ret = gadget_strs[i].set_fn(g, LANG_US_ENG, dt->str_val[i]); + if (ret != USBG_SUCCESS) { + fprintf(stderr, "Unable to set string %s: %s\n", + gadget_strs[i].name, + usbg_strerror(ret)); + return -1; + } + } + + return 0; +} + struct gt_gadget_backend gt_gadget_backend_libusbg = { .create = create_func, .rm = rm_func, .get = get_func, - .set = NULL, + .set = set_func, .enable = enable_func, .disable = disable_func, .gadget = gadget_func, diff --git a/source/gadget/src/gadget_not_implemented.c b/source/gadget/src/gadget_not_implemented.c index b5edd8a..a173c09 100644 --- a/source/gadget/src/gadget_not_implemented.c +++ b/source/gadget/src/gadget_not_implemented.c @@ -65,16 +65,26 @@ static int get_func(void *data) static int set_func(void *data) { struct gt_gadget_set_data *dt; - struct gt_setting *ptr; + int i; dt = (struct gt_gadget_set_data *)data; printf("Gadget set called successfully. Not implemented.\n"); printf("name = %s", dt->name); - ptr = dt->attrs; - while (ptr->variable) { - printf(", %s = %s", ptr->variable, ptr->value); - ptr++; + + for (i = 0; i < ARRAY_SIZE(dt->attr_val); ++i) { + if (dt->attr_val[i] >= 0) { + printf(", %s = %d", usbg_get_gadget_attr_str(i), + dt->attr_val[i]); + } } + + for (i = 0; i < ARRAY_SIZE(dt->str_val); ++i) { + if (dt->str_val[i] != NULL) { + printf(", %s = %s", gadget_strs[i].name, + dt->str_val[i]); + } + } + putchar('\n'); return 0; } -- 2.7.4