gadget: Add gadget command at libusbg backend
authorPawel Szewczyk <p.szewczyk@samsung.com>
Mon, 6 Jul 2015 15:48:28 +0000 (17:48 +0200)
committerKrzysztof Opasiak <k.opasiak@samsung.com>
Tue, 28 Jul 2015 16:06:53 +0000 (18:06 +0200)
Change-Id: I4e74bb680b19ef87b4f59796496ab19808cffd89
Signed-off-by: Pawel Szewczyk <p.szewczyk@samsung.com>
source/base/include/parser.h
source/base/src/parser.c
source/gadget/src/gadget.c
source/gadget/src/gadget_libusbg.c

index 3f53a5d..cc132af 100644 (file)
@@ -84,6 +84,7 @@ enum gt_option_flags {
        GT_STDIN = 16,
        GT_STDOUT = 32,
        GT_HELP = 64,
+       GT_QUIET = 128,
 };
 
 /**
index 73194ca..1e65d15 100644 (file)
@@ -188,6 +188,7 @@ int gt_get_options(int *optmask, int allowed_opts, int argc, char **argv)
                {GT_STDIN, {"stdin", no_argument, 0, 1}},
                {GT_STDIN, {"stdout", no_argument, 0, 2}},
                {GT_HELP, {"help", no_argument, 0, 'h'}},
+               {GT_QUIET, {"quiet", no_argument, 0, 'q'}},
                {0, {NULL, 0, 0, 0}}
        };
 
@@ -241,6 +242,9 @@ int gt_get_options(int *optmask, int allowed_opts, int argc, char **argv)
                case 'h':
                        *optmask |= GT_HELP;
                        break;
+               case 'q':
+                       *optmask |= GT_QUIET;
+                       break;
                default:
                        return -1;
                }
index 1c5ec29..dd8f351 100644 (file)
@@ -466,7 +466,17 @@ out:
 
 static int gt_gadget_gadget_help(void *data)
 {
-       printf("Gadget gadget help.\n");
+       printf("usage: %s gadget [options] [gadget] \n"
+              "If no gadget specified shows the list of gadgets, otherwise shows the gadget "
+              "name, list of configurations and list of functions."
+              "\n"
+              "Options:\n"
+              "  -v, --verbose\t\tShow not only name of gadget but also its attributes\n"
+              "  -r, --recursive\tShow the details about each function and configuration\n"
+              "  -q, --quiet\t\tShow only list of gadget names\n"
+              "  -h, --help\t\tPrint this help\n",
+              program_name);
+
        return -1;
 }
 
@@ -475,7 +485,7 @@ static void gt_parse_gadget_gadget(const Command *cmd, int argc,
 {
        struct gt_gadget_gadget_data *dt;
        int ind;
-       int avaible_opts = GT_RECURSIVE | GT_VERBOSE | GT_HELP;
+       int avaible_opts = GT_RECURSIVE | GT_VERBOSE | GT_HELP | GT_QUIET;
 
        dt = zalloc(sizeof(*dt));
        if (dt == NULL)
index 07a33c7..798164c 100644 (file)
@@ -230,10 +230,46 @@ static int disable_func(void *data)
        return 0;
 }
 
-static int print_gadget_attrs(usbg_gadget *g, int *mask) {
+static void print_gadget_attrs(usbg_gadget_attrs *g_attrs, int *mask) {
+       if (!mask || mask[BCD_USB])
+               printf("  bcdUSB\t\t%x.%02x\n",
+                       g_attrs->bcdUSB >> 8,
+                       g_attrs->bcdUSB & 0x00ff);
+
+       if (!mask || mask[B_DEVICE_CLASS])
+               printf("  bDeviceClass\t\t0x%02x\n", g_attrs->bDeviceClass);
+       if (!mask || mask[B_DEVICE_SUB_CLASS])
+               printf("  bDeviceSubClass\t0x%02x\n", g_attrs->bDeviceSubClass);
+       if (!mask || mask[B_DEVICE_PROTOCOL])
+               printf("  bDeviceProtocol\t0x%02x\n", g_attrs->bDeviceProtocol);
+       if (!mask || mask[B_MAX_PACKET_SIZE_0])
+               printf("  bMaxPacketSize0\t%d\n", g_attrs->bMaxPacketSize0);
+       if (!mask || mask[ID_VENDOR])
+               printf("  idVendor\t\t0x%04x\n", g_attrs->idVendor);
+       if (!mask || mask[ID_PRODUCT])
+               printf("  idProduct\t\t0x%04x\n", g_attrs->idProduct);
+       if (!mask || mask[BCD_DEVICE])
+               printf("  bcdDevice\t\t%x.%02x\n",
+                       g_attrs->bcdDevice >> 8,
+                       g_attrs->bcdDevice & 0x00ff);
+}
+
+static int get_func(void *data)
+{
+       struct gt_gadget_get_data *dt;
+
+       usbg_gadget *g;
        usbg_gadget_attrs g_attrs;
        int usbg_ret;
 
+       dt = (struct gt_gadget_get_data *)data;
+
+       g = usbg_get_gadget(backend_ctx.libusbg_state, dt->name);
+       if (g == NULL) {
+               fprintf(stderr, "Gadget '%s' not found\n", dt->name);
+               return -1;
+       }
+
        usbg_ret = usbg_get_gadget_attrs(g, &g_attrs);
        if (usbg_ret != USBG_SUCCESS) {
                fprintf(stderr, "Error: %s : %s\n", usbg_error_name(usbg_ret),
@@ -241,49 +277,83 @@ static int print_gadget_attrs(usbg_gadget *g, int *mask) {
                return -1;
        }
 
-       if (mask[BCD_USB])
-               printf("  bcdUSB\t\t%x.%02x\n",
-                       g_attrs.bcdUSB >> 8,
-                       g_attrs.bcdUSB & 0x00ff);
-
-       if (mask[B_DEVICE_CLASS])
-               printf("  bDeviceClass\t\t0x%02x\n", g_attrs.bDeviceClass);
-       if (mask[B_DEVICE_SUB_CLASS])
-               printf("  bDeviceSubClass\t0x%02x\n", g_attrs.bDeviceSubClass);
-       if (mask[B_DEVICE_PROTOCOL])
-               printf("  bDeviceProtocol\t0x%02x\n", g_attrs.bDeviceProtocol);
-       if (mask[B_MAX_PACKET_SIZE_0])
-               printf("  bMaxPacketSize0\t%d\n", g_attrs.bMaxPacketSize0);
-       if (mask[ID_VENDOR])
-               printf("  idVendor\t\t0x%04x\n", g_attrs.idVendor);
-       if (mask[ID_PRODUCT])
-               printf("  idProduct\t\t0x%04x\n", g_attrs.idProduct);
-       if (mask[BCD_DEVICE])
-               printf("  bcdDevice\t\t%x.%02x\n",
-                       g_attrs.bcdDevice >> 8,
-                       g_attrs.bcdDevice & 0x00ff);
+       print_gadget_attrs(&g_attrs, dt->attrs);
 
        return 0;
 }
 
-static int get_func(void *data)
+static int print_gadget(usbg_gadget *g, int opts)
 {
-       struct gt_gadget_get_data *dt;
-
-       usbg_gadget *g;
-       int ret;
+       usbg_gadget_attrs g_attrs;
+       usbg_udc *u;
+       int usbg_ret;
+       const char *name;
 
-       dt = (struct gt_gadget_get_data *)data;
+       usbg_ret = usbg_get_gadget_attrs(g, &g_attrs);
+       if (usbg_ret != USBG_SUCCESS) {
+               fprintf(stderr, "Error: %s : %s\n",
+                       usbg_error_name(usbg_ret), usbg_strerror(usbg_ret));
+               return -1;
+       }
 
-       g = usbg_get_gadget(backend_ctx.libusbg_state, dt->name);
-       if (g == NULL) {
-               fprintf(stderr, "Gadget '%s' not found\n", dt->name);
+       name = usbg_get_gadget_name(g);
+       if (name == NULL) {
+               fprintf(stderr, "Unable to get gadget name\n");
                return -1;
        }
 
-       ret = print_gadget_attrs(g, dt->attrs);
+       if (opts & GT_QUIET) {
+               printf("%s\n", name);
+       } else {
+               printf("ID %04x:%04x '%s'", g_attrs.idVendor,
+                               g_attrs.idProduct, name);
+
+               u = usbg_get_gadget_udc(g);
+               if (u) {
+                       printf("\t%s", usbg_get_udc_name(u));
+               }
+
+               putchar('\n');
+       }
+
+       if (opts & GT_VERBOSE)
+               print_gadget_attrs(&g_attrs, NULL);
+
+       /* TODO --recursive*/
+
+       return 0;
+}
+
+static int gadget_func(void *data)
+{
+       struct gt_gadget_gadget_data *dt;
+
+       usbg_gadget *g;
+       int usbg_ret = 0;
+
+       dt = (struct gt_gadget_gadget_data *)data;
+
+       if (dt->name) {
+               g = usbg_get_gadget(backend_ctx.libusbg_state, dt->name);
+               if (g == NULL) {
+                       fprintf(stderr, "Gadget '%s' not found\n", dt->name);
+                       return -1;
+               }
+
+               usbg_ret = print_gadget(g, dt->opts);
+               if (usbg_ret < 0)
+                       goto out;
+
+       } else {
+               usbg_for_each_gadget(g, backend_ctx.libusbg_state) {
+                       usbg_ret = print_gadget(g, dt->opts);
+                       if (usbg_ret < 0)
+                               goto out;
+               }
+       }
 
-       return ret;
+out:
+       return usbg_ret;
 }
 
 struct gt_gadget_backend gt_gadget_backend_libusbg = {
@@ -293,7 +363,7 @@ struct gt_gadget_backend gt_gadget_backend_libusbg = {
        .set = NULL,
        .enable = enable_func,
        .disable = disable_func,
-       .gadget = NULL,
+       .gadget = gadget_func,
        .load = NULL,
        .save = NULL,
        .template_default = NULL,