summaryrefslogtreecommitdiffstats
path: root/commands
diff options
context:
space:
mode:
authorSascha Hauer <s.hauer@pengutronix.de>2021-07-18 07:13:58 +0200
committerSascha Hauer <s.hauer@pengutronix.de>2021-07-18 07:13:58 +0200
commit68a34282e9de28a448cbb653277b8020bf945696 (patch)
tree48822a4d0eebd275f519d3bcfa067b2e5889c088 /commands
parent8d25e409dd5a30bdd26b89c9409720f47b93b4c7 (diff)
parent0f621c63d7c3396010001c043e190b628d7b2982 (diff)
downloadbarebox-68a34282e9de28a448cbb653277b8020bf945696.tar.gz
barebox-68a34282e9de28a448cbb653277b8020bf945696.tar.xz
Merge branch 'for-next/usb-gadget'
Diffstat (limited to 'commands')
-rw-r--r--commands/bthread.c83
-rw-r--r--commands/usbgadget.c29
2 files changed, 78 insertions, 34 deletions
diff --git a/commands/bthread.c b/commands/bthread.c
index 964a1044c5..aaade46e92 100644
--- a/commands/bthread.c
+++ b/commands/bthread.c
@@ -10,12 +10,15 @@
#include <command.h>
#include <getopt.h>
#include <clock.h>
+#include <slice.h>
static int bthread_time(void)
{
uint64_t start = get_time_ns();
int i = 0;
+ slice_release(&command_slice);
+
/*
* How many background tasks can we have in one second?
*
@@ -25,15 +28,15 @@ static int bthread_time(void)
while (!is_timeout(start, SECOND))
i++;
+ slice_acquire(&command_slice);
+
return i;
}
-static int bthread_infinite(void *data)
+static void bthread_infinite(void *data)
{
while (!bthread_should_stop())
;
-
- return 0;
}
static int bthread_isolated_time(void)
@@ -57,14 +60,19 @@ static int bthread_isolated_time(void)
i += 2;
}
- bthread_stop(bthread);
- bthread_free(bthread);
+ __bthread_stop(bthread);
return i;
}
-static int bthread_printer(void *arg)
+struct arg {
+ unsigned long in;
+ long out;
+};
+
+static void bthread_printer(void *_arg)
{
+ struct arg *arg = _arg;
volatile u64 start;
volatile unsigned long i = 0;
start = get_time_ns();
@@ -73,28 +81,30 @@ static int bthread_printer(void *arg)
if (!is_timeout_non_interruptible(start, 225 * MSECOND))
continue;
- if ((unsigned long)arg == i++)
+ if (arg->in == i++)
printf("%s yield #%lu\n", bthread_name(current), i);
start = get_time_ns();
}
- return i;
+ arg->out = i;
}
static int yields;
-static int bthread_spawner(void *arg)
+static void bthread_spawner(void *_spawner_arg)
{
+ struct arg *arg, *spawner_arg = _spawner_arg;
struct bthread *bthread[4];
volatile u64 start;
volatile unsigned long i = 0;
int ret = 0;
- int ecode;
start = get_time_ns();
for (i = 0; i < ARRAY_SIZE(bthread); i++) {
- bthread[i] = bthread_run(bthread_printer, (void *)(long)i,
+ arg = malloc(sizeof(*arg));
+ arg->in = i;
+ bthread[i] = bthread_run(bthread_printer, arg,
"%s-bthread%u", bthread_name(current), i+1);
if (!bthread[i]) {
ret = -ENOMEM;
@@ -107,14 +117,15 @@ static int bthread_spawner(void *arg)
cleanup:
while (i--) {
- ecode = bthread_stop(bthread[i]);
- bthread_free(bthread[i]);
+ arg = bthread_data(bthread[i]);
+ __bthread_stop(bthread[i]);
- if (!ret && (ecode != 4 || yields < ecode))
+ if (!ret && (arg->out != 4 || yields < arg->out))
ret = -EIO;
+ free(arg);
}
- return ret;
+ spawner_arg->out = ret;
}
struct spawn {
@@ -124,14 +135,38 @@ struct spawn {
static int do_bthread(int argc, char *argv[])
{
+ static int dummynr;
+ static LIST_HEAD(dummies);
LIST_HEAD(spawners);
struct spawn *spawner, *tmp;
int ret = 0;
- int ecode, opt, i = 0;
+ int opt, i = 0;
bool time = false;
+ struct arg *arg;
- while ((opt = getopt(argc, argv, "itcv")) > 0) {
+ while ((opt = getopt(argc, argv, "aritcv")) > 0) {
switch (opt) {
+ case 'a':
+ spawner = xzalloc(sizeof(*spawner));
+ spawner->bthread = bthread_run(bthread_infinite, NULL,
+ "dummy%u", dummynr++);
+ if (!spawner->bthread) {
+ free(spawner);
+ ret = -ENOMEM;
+ goto cleanup;
+ }
+
+ list_add(&spawner->list, &dummies);
+ break;
+ case 'r':
+ if (dummynr == 0)
+ return -EINVAL;
+ spawner = list_first_entry(&dummies, struct spawn, list);
+ bthread_cancel(spawner->bthread);
+ list_del(&spawner->list);
+ free(spawner);
+ dummynr--;
+ break;
case 'i':
bthread_info();
break;
@@ -141,7 +176,8 @@ static int do_bthread(int argc, char *argv[])
break;
case 'v':
spawner = xzalloc(sizeof(*spawner));
- spawner->bthread = bthread_run(bthread_spawner, NULL,
+ arg = malloc(sizeof(*arg));
+ spawner->bthread = bthread_run(bthread_spawner, arg,
"spawner%u", ++i);
if (!spawner->bthread) {
free(spawner);
@@ -167,10 +203,11 @@ static int do_bthread(int argc, char *argv[])
cleanup:
list_for_each_entry_safe(spawner, tmp, &spawners, list) {
- ecode = bthread_stop(spawner->bthread);
- bthread_free(spawner->bthread);
- if (!ret && ecode)
- ret = ecode;
+ arg = bthread_data(spawner->bthread);
+ __bthread_stop(spawner->bthread);
+ if (!ret && arg->out)
+ ret = arg->out;
+ free(arg);
free(spawner);
}
@@ -184,6 +221,8 @@ BAREBOX_CMD_HELP_START(bthread)
BAREBOX_CMD_HELP_OPT ("-i", "Print information about registered bthreads")
BAREBOX_CMD_HELP_OPT ("-t", "measure how many bthreads we currently run in 1s")
BAREBOX_CMD_HELP_OPT ("-c", "count maximum context switches in 1s")
+ BAREBOX_CMD_HELP_OPT ("-a", "add a dummy bthread")
+ BAREBOX_CMD_HELP_OPT ("-r", "remove a dummy bthread")
BAREBOX_CMD_HELP_OPT ("-v", "verify correct bthread operation")
BAREBOX_CMD_HELP_END
diff --git a/commands/usbgadget.c b/commands/usbgadget.c
index 3b115f147d..290f33eff3 100644
--- a/commands/usbgadget.c
+++ b/commands/usbgadget.c
@@ -18,26 +18,29 @@
static int do_usbgadget(int argc, char *argv[])
{
+ struct usbgadget_funcs funcs = {};
int opt;
- bool acm = false, dfu = false, fastboot = false, export_bbu = false;
- const char *fastboot_opts = NULL, *dfu_opts = NULL;
- while ((opt = getopt(argc, argv, "asdA::D::b")) > 0) {
+ while ((opt = getopt(argc, argv, "asdA::D::S::b")) > 0) {
switch (opt) {
case 'a':
case 's':
- acm = true;
+ funcs.flags |= USBGADGET_ACM;
break;
case 'D':
- dfu = true;
- dfu_opts = optarg;
+ funcs.flags |= USBGADGET_DFU;
+ funcs.dfu_opts = optarg;
break;
case 'A':
- fastboot = true;
- fastboot_opts = optarg;
+ funcs.flags |= USBGADGET_FASTBOOT;
+ funcs.fastboot_opts = optarg;
+ break;
+ case 'S':
+ funcs.flags |= USBGADGET_MASS_STORAGE;
+ funcs.ums_opts = optarg;
break;
case 'b':
- export_bbu = true;
+ funcs.flags |= USBGADGET_EXPORT_BBU;
break;
case 'd':
usb_multi_unregister();
@@ -47,8 +50,8 @@ static int do_usbgadget(int argc, char *argv[])
}
}
- return usbgadget_register(dfu, dfu_opts, fastboot, fastboot_opts, acm,
- export_bbu);
+
+ return usbgadget_register(&funcs);
}
BAREBOX_CMD_HELP_START(usbgadget)
@@ -61,13 +64,15 @@ BAREBOX_CMD_HELP_OPT ("-A <desc>", "Create Android Fastboot function. If 'desc'
BAREBOX_CMD_HELP_OPT ("-b\t", "include registered barebox update handlers (fastboot specific)")
BAREBOX_CMD_HELP_OPT ("-D <desc>", "Create DFU function. If 'desc' is not provided, "
"try to use 'global.usbgadget.dfu_function' variable.")
+BAREBOX_CMD_HELP_OPT ("-S <desc>", "Create USB Mass Storage function. If 'desc' is not provided,"
+ "fallback directly to 'global.system.partitions' variable.")
BAREBOX_CMD_HELP_OPT ("-d\t", "Disable the currently running gadget")
BAREBOX_CMD_HELP_END
BAREBOX_CMD_START(usbgadget)
.cmd = do_usbgadget,
BAREBOX_CMD_DESC("Create USB Gadget multifunction device")
- BAREBOX_CMD_OPTS("[-adAD]")
+ BAREBOX_CMD_OPTS("[-adADS]")
BAREBOX_CMD_GROUP(CMD_GRP_HWMANIP)
BAREBOX_CMD_HELP(cmd_usbgadget_help)
BAREBOX_CMD_END