int main(void) { usbg_state *s; usbg_gadget *g; usbg_config *c; usbg_function *f_ffs1, *f_ffs2; int ret = -EINVAL; int usbg_ret; struct usbg_gadget_attrs g_attrs = { .bcdUSB = 0x0200, .bDeviceClass = USB_CLASS_PER_INTERFACE, .bDeviceSubClass = 0x00, .bDeviceProtocol = 0x00, .bMaxPacketSize0 = 64, /* Max allowed ep0 packet size */ .idVendor = VENDOR, .idProduct = PRODUCT, .bcdDevice = 0x0001, /* Verson of device */ }; struct usbg_gadget_strs g_strs = { .serial = "0123456789", /* Serial number */ .manufacturer = "Foo Inc.", /* Manufacturer */ .product = "Bar Gadget" /* Product string */ }; struct usbg_config_strs c_strs = { .configuration = "2xFFS" }; usbg_ret = usbg_init("/sys/kernel/config", &s); if (usbg_ret != USBG_SUCCESS) { fprintf(stderr, "Error on USB gadget init\n"); fprintf(stderr, "Error: %s : %s\n", usbg_error_name(usbg_ret), usbg_strerror(usbg_ret)); goto out1; } usbg_ret = usbg_create_gadget(s, "g1", &g_attrs, &g_strs, &g); if (usbg_ret != USBG_SUCCESS) { fprintf(stderr, "Error on create gadget\n"); fprintf(stderr, "Error: %s : %s\n", usbg_error_name(usbg_ret), usbg_strerror(usbg_ret)); goto out2; } usbg_ret = usbg_create_function(g, USBG_F_FFS, "my_dev_name", NULL, &f_ffs1); if (usbg_ret != USBG_SUCCESS) { fprintf(stderr, "Error creating ffs1 function\n"); fprintf(stderr, "Error: %s : %s\n", usbg_error_name(usbg_ret), usbg_strerror(usbg_ret)); goto out2; } usbg_ret = usbg_create_function(g, USBG_F_FFS, "my_other_dev_name", NULL, &f_ffs2); if (usbg_ret != USBG_SUCCESS) { fprintf(stderr, "Error creating ffs2 function\n"); fprintf(stderr, "Error: %s : %s\n", usbg_error_name(usbg_ret), usbg_strerror(usbg_ret)); goto out2; } /* NULL can be passed to use kernel defaults */ usbg_ret = usbg_create_config(g, 1, "The only one", NULL, &c_strs, &c); if (usbg_ret != USBG_SUCCESS) { fprintf(stderr, "Error creating config\n"); fprintf(stderr, "Error: %s : %s\n", usbg_error_name(usbg_ret), usbg_strerror(usbg_ret)); goto out2; } usbg_ret = usbg_add_config_function(c, "some_name_here", f_ffs1); if (usbg_ret != USBG_SUCCESS) { fprintf(stderr, "Error adding ffs1\n"); fprintf(stderr, "Error: %s : %s\n", usbg_error_name(usbg_ret), usbg_strerror(usbg_ret)); goto out2; } usbg_ret = usbg_add_config_function(c, "some_name_here_too", f_ffs2); if (usbg_ret != USBG_SUCCESS) { fprintf(stderr, "Error adding ffs2\n"); fprintf(stderr, "Error: %s : %s\n", usbg_error_name(usbg_ret), usbg_strerror(usbg_ret)); goto out2; } fprintf(stdout, "2xFFS gadget has been created.\n" "Enable it after preparing your functions.\n"); /* * Here we end up with two created ffs instances but they are not * fully operational. Now we have to do step by step: * 1) Mount both instances: * $ mount my_dev_name -t functionfs /path/to/mount/dir1 * $ mount my_awesome_dev_name -t functionfs /path/to/mount/dir2 * * 2) Run ffs daemons for both instances: * $ my-ffs-daemon /path/to/mount/dir1 * $ my-ffs-daemon /path/to/mount/dir2 * * 3) Enable your gadget: * $ echo "my_udc_name" > /sys/kernel/config/usb_gadget/g1/UDC */ ret = 0; out2: usbg_cleanup(s); out1: return ret; }
int gt_backend_init(const char *program_name, enum gt_option_flags flags) { enum gt_backend_type backend_type; GError *err = NULL; if (strcmp(program_name, "gt") == 0) backend_type = GT_BACKEND_LIBUSBG; else if (strcmp(program_name, "gadgetctl") == 0) backend_type = GT_BACKEND_GADGETD; else if (strcmp(program_name, "gt-parse-test") == 0) backend_type = GT_BACKEND_NOT_IMPLEMENTED; else backend_type = GT_BACKEND_AUTO; if (backend_type == GT_BACKEND_NOT_IMPLEMENTED) { backend_ctx.backend = >_backend_not_implemented; return 0; } if (backend_type == GT_BACKEND_GADGETD || backend_type == GT_BACKEND_AUTO) { GDBusConnection *conn; backend_ctx.backend = >_backend_gadgetd; #if ! GLIB_CHECK_VERSION(2, 36, 0) g_type_init(); #endif conn = g_bus_get_sync(G_BUS_TYPE_SYSTEM, NULL, &err); if (err) { fprintf(stderr, "Unable to connect to d-bus: %s\n", err->message); goto out_gadgetd; } g_dbus_connection_call_sync(conn, "org.usb.gadgetd", "/", "org.freedesktop.DBus.Peer", "Ping", NULL, NULL, G_DBUS_CALL_FLAGS_NONE, -1, NULL, &err); if (err) { /* We omit showing glib-provided error message here * as it's not really that useful for end-users. * * This message could be probably shown in verbose * mode (which we don't have yet). */ fprintf(stderr, "Unable to initialize gadgetd backend_type\n"); goto out_gadgetd; } backend_ctx.backend_type = GT_BACKEND_GADGETD; backend_ctx.gadgetd_conn = conn; return 0; } out_gadgetd: if (err && backend_type == GT_BACKEND_GADGETD) return -1; if (backend_type == GT_BACKEND_LIBUSBG || backend_type == GT_BACKEND_AUTO) { usbg_state *s = NULL; int r; backend_ctx.backend = >_backend_libusbg; r = usbg_init("/sys/kernel/config", &s); if (r != USBG_SUCCESS) { fprintf(stderr, "Unable to initialize libusbg backend_type: %s\n", usbg_strerror(r)); goto out_libusbg; } backend_ctx.backend_type = GT_BACKEND_LIBUSBG; backend_ctx.libusbg_state = s; return 0; } out_libusbg: return -1; }
int main(void) { usbg_state *s; usbg_gadget *g; usbg_config *c; usbg_function *f_acm0, *f_acm1, *f_ecm; int ret = -EINVAL; int usbg_ret; usbg_gadget_attrs g_attrs = { .bcdUSB = 0x0200, .bDeviceClass = USB_CLASS_PER_INTERFACE, .bDeviceSubClass = 0x00, .bDeviceProtocol = 0x00, .bMaxPacketSize0 = 64, /* Max allowed ep0 packet size */ .idVendor = VENDOR, .idProduct = PRODUCT, .bcdDevice = 0x0001, /* Verson of device */ }; usbg_gadget_strs g_strs = { .str_ser = "0123456789", /* Serial number */ .str_mnf = "Foo Inc.", /* Manufacturer */ .str_prd = "Bar Gadget" /* Product string */ }; usbg_config_strs c_strs = { .configuration = "CDC 2xACM+ECM" }; usbg_ret = usbg_init("/sys/kernel/config", &s); if (usbg_ret != USBG_SUCCESS) { fprintf(stderr, "Error on USB gadget init\n"); fprintf(stderr, "Error: %s : %s\n", usbg_error_name(usbg_ret), usbg_strerror(usbg_ret)); goto out1; } usbg_ret = usbg_create_gadget(s, "g1", &g_attrs, &g_strs, &g); if (usbg_ret != USBG_SUCCESS) { fprintf(stderr, "Error on create gadget\n"); fprintf(stderr, "Error: %s : %s\n", usbg_error_name(usbg_ret), usbg_strerror(usbg_ret)); goto out2; } usbg_ret = usbg_create_function(g, F_ACM, "usb0", NULL, &f_acm0); if (usbg_ret != USBG_SUCCESS) { fprintf(stderr, "Error creating acm0 function\n"); fprintf(stderr, "Error: %s : %s\n", usbg_error_name(usbg_ret), usbg_strerror(usbg_ret)); goto out2; } usbg_ret = usbg_create_function(g, F_ACM, "usb1", NULL, &f_acm1); if (usbg_ret != USBG_SUCCESS) { fprintf(stderr, "Error creating acm1 function\n"); fprintf(stderr, "Error: %s : %s\n", usbg_error_name(usbg_ret), usbg_strerror(usbg_ret)); goto out2; } usbg_ret = usbg_create_function(g, F_ECM, "usb0", NULL, &f_ecm); if (usbg_ret != USBG_SUCCESS) { fprintf(stderr, "Error creating ecm function\n"); fprintf(stderr, "Error: %s : %s\n", usbg_error_name(usbg_ret), usbg_strerror(usbg_ret)); goto out2; } /* NULL can be passed to use kernel defaults */ usbg_ret = usbg_create_config(g, 1, "The only one", NULL, &c_strs, &c); if (usbg_ret != USBG_SUCCESS) { fprintf(stderr, "Error creating config\n"); fprintf(stderr, "Error: %s : %s\n", usbg_error_name(usbg_ret), usbg_strerror(usbg_ret)); goto out2; } usbg_ret = usbg_add_config_function(c, "acm.GS0", f_acm0); if (usbg_ret != USBG_SUCCESS) { fprintf(stderr, "Error adding acm.GS0\n"); fprintf(stderr, "Error: %s : %s\n", usbg_error_name(usbg_ret), usbg_strerror(usbg_ret)); goto out2; } usbg_ret = usbg_add_config_function(c, "acm.GS1", f_acm1); if (usbg_ret != USBG_SUCCESS) { fprintf(stderr, "Error adding acm.GS1\n"); fprintf(stderr, "Error: %s : %s\n", usbg_error_name(usbg_ret), usbg_strerror(usbg_ret)); goto out2; } usbg_ret = usbg_add_config_function(c, "ecm.usb0", f_ecm); if (usbg_ret != USBG_SUCCESS) { fprintf(stderr, "Error adding ecm.usb0\n"); fprintf(stderr, "Error: %s : %s\n", usbg_error_name(usbg_ret), usbg_strerror(usbg_ret)); goto out2; } usbg_ret = usbg_enable_gadget(g, DEFAULT_UDC); if (usbg_ret != USBG_SUCCESS) { fprintf(stderr, "Error enabling gadget\n"); fprintf(stderr, "Error: %s : %s\n", usbg_error_name(usbg_ret), usbg_strerror(usbg_ret)); goto out2; } ret = 0; out2: usbg_cleanup(s); out1: return ret; }
int main(void) { usbg_state *s; usbg_gadget *g; usbg_config *c; usbg_function *f_acm0, *f_acm1, *f_ecm; int ret = -EINVAL; int usbg_ret; usbg_gadget_attrs g_attrs = { 0x0200, /* bcdUSB */ 0x00, /* Defined at interface level */ 0x00, /* subclass */ 0x00, /* device protocol */ 0x0040, /* Max allowed packet size */ VENDOR, PRODUCT, 0x0001, /* Verson of device */ }; usbg_gadget_strs g_strs = { "0123456789", /* Serial number */ "Foo Inc.", /* Manufacturer */ "Bar Gadget" /* Product string */ }; usbg_config_strs c_strs = { "CDC 2xACM+ECM" }; usbg_ret = usbg_init("/sys/kernel/config", &s); if (usbg_ret != USBG_SUCCESS) { fprintf(stderr, "Error on USB gadget init\n"); fprintf(stderr, "Error: %s : %s\n", usbg_error_name(usbg_ret), usbg_strerror(usbg_ret)); goto out1; } usbg_ret = usbg_create_gadget(s, "g1", &g_attrs, &g_strs, &g); if (usbg_ret != USBG_SUCCESS) { fprintf(stderr, "Error on create gadget\n"); fprintf(stderr, "Error: %s : %s\n", usbg_error_name(usbg_ret), usbg_strerror(usbg_ret)); goto out2; } usbg_ret = usbg_create_function(g, F_ACM, "usb0", NULL, &f_acm0); if (usbg_ret != USBG_SUCCESS) { fprintf(stderr, "Error creating acm0 function\n"); fprintf(stderr, "Error: %s : %s\n", usbg_error_name(usbg_ret), usbg_strerror(usbg_ret)); goto out2; } usbg_ret = usbg_create_function(g, F_ACM, "usb1", NULL, &f_acm1); if (usbg_ret != USBG_SUCCESS) { fprintf(stderr, "Error creating acm1 function\n"); fprintf(stderr, "Error: %s : %s\n", usbg_error_name(usbg_ret), usbg_strerror(usbg_ret)); goto out2; } usbg_ret = usbg_create_function(g, F_ECM, "usb0", NULL, &f_ecm); if (usbg_ret != USBG_SUCCESS) { fprintf(stderr, "Error creating ecm function\n"); fprintf(stderr, "Error: %s : %s\n", usbg_error_name(usbg_ret), usbg_strerror(usbg_ret)); goto out2; } /* NULL can be passed to use kernel defaults */ usbg_ret = usbg_create_config(g, 1, "The only one", NULL, &c_strs, &c); if (usbg_ret != USBG_SUCCESS) { fprintf(stderr, "Error creating config\n"); fprintf(stderr, "Error: %s : %s\n", usbg_error_name(usbg_ret), usbg_strerror(usbg_ret)); goto out2; } usbg_ret = usbg_add_config_function(c, "acm.GS0", f_acm0); if (usbg_ret != USBG_SUCCESS) { fprintf(stderr, "Error adding acm.GS0\n"); fprintf(stderr, "Error: %s : %s\n", usbg_error_name(usbg_ret), usbg_strerror(usbg_ret)); goto out2; } usbg_ret = usbg_add_config_function(c, "acm.GS1", f_acm1); if (usbg_ret != USBG_SUCCESS) { fprintf(stderr, "Error adding acm.GS1\n"); fprintf(stderr, "Error: %s : %s\n", usbg_error_name(usbg_ret), usbg_strerror(usbg_ret)); goto out2; } usbg_ret = usbg_add_config_function(c, "ecm.usb0", f_ecm); if (usbg_ret != USBG_SUCCESS) { fprintf(stderr, "Error adding ecm.usb0\n"); fprintf(stderr, "Error: %s : %s\n", usbg_error_name(usbg_ret), usbg_strerror(usbg_ret)); goto out2; } usbg_ret = usbg_enable_gadget(g, DEFAULT_UDC); if (usbg_ret != USBG_SUCCESS) { fprintf(stderr, "Error enabling gadget\n"); fprintf(stderr, "Error: %s : %s\n", usbg_error_name(usbg_ret), usbg_strerror(usbg_ret)); goto out2; } ret = 0; out2: usbg_cleanup(s); out1: return ret; }