diff options
| author | Tom Rini <[email protected]> | 2020-10-24 10:49:28 -0400 |
|---|---|---|
| committer | Tom Rini <[email protected]> | 2020-10-24 10:49:28 -0400 |
| commit | c99e87f82803500f9811b1e98926d9d25df35b38 (patch) | |
| tree | 9ed4491e17a925e5d7a50ff21af8c33080f32ef1 /cmd | |
| parent | 001ab99325bf82cf3284771d1312585570569740 (diff) | |
| parent | 16cc5ad0b439b1444af8134019d9d49d776fd67c (diff) | |
Merge branch '2020-10-23-misc-changes'
Highlights:
- Fix a problem with the bootm overlap tests
- Remove duplicated code in fatwrite
- Cleanup our current "misc" command code and add a new one for misc
class devices.
- Various GPIO fixes
Diffstat (limited to 'cmd')
| -rw-r--r-- | cmd/Kconfig | 11 | ||||
| -rw-r--r-- | cmd/Makefile | 4 | ||||
| -rw-r--r-- | cmd/fat.c | 43 | ||||
| -rw-r--r-- | cmd/misc.c | 168 | ||||
| -rw-r--r-- | cmd/sleep.c | 57 | ||||
| -rw-r--r-- | cmd/timer.c | 34 |
6 files changed, 211 insertions, 106 deletions
diff --git a/cmd/Kconfig b/cmd/Kconfig index a3166e4f314..11f299da2bd 100644 --- a/cmd/Kconfig +++ b/cmd/Kconfig @@ -1025,6 +1025,14 @@ config CMD_LSBLK Print list of available block device drivers, and for each, the list of known block devices. +config CMD_MISC + bool "misc" + depends on MISC + help + Enable the command "misc" for accessing miscellaneous devices with + a MISC uclass driver. The command provides listing all MISC devices + as well as read and write functionalities via their drivers. + config CMD_MMC bool "mmc" help @@ -1708,8 +1716,7 @@ config CMD_RNG help Print bytes from the hardware random number generator. -# TODO: rename to CMD_SLEEP -config CMD_MISC +config CMD_SLEEP bool "sleep" default y help diff --git a/cmd/Makefile b/cmd/Makefile index 19a891633f6..da4e0600b22 100644 --- a/cmd/Makefile +++ b/cmd/Makefile @@ -94,8 +94,9 @@ obj-$(CONFIG_CMD_MEMORY) += mem.o obj-$(CONFIG_CMD_IO) += io.o obj-$(CONFIG_CMD_MFSL) += mfsl.o obj-$(CONFIG_CMD_MII) += mii.o -obj-$(CONFIG_CMD_MDIO) += mdio.o obj-$(CONFIG_CMD_MISC) += misc.o +obj-$(CONFIG_CMD_MDIO) += mdio.o +obj-$(CONFIG_CMD_SLEEP) += sleep.o obj-$(CONFIG_CMD_MMC) += mmc.o obj-$(CONFIG_MP) += mp.o obj-$(CONFIG_CMD_MTD) += mtd.o @@ -141,6 +142,7 @@ obj-$(CONFIG_CMD_SMC) += smccc.o obj-$(CONFIG_CMD_SYSBOOT) += sysboot.o pxe_utils.o obj-$(CONFIG_CMD_TERMINAL) += terminal.o obj-$(CONFIG_CMD_TIME) += time.o +obj-$(CONFIG_CMD_TIMER) += timer.o obj-$(CONFIG_CMD_TRACE) += trace.o obj-$(CONFIG_HUSH_PARSER) += test.o obj-$(CONFIG_CMD_TPM) += tpm-common.o diff --git a/cmd/fat.c b/cmd/fat.c index b438ce16c91..69ce1fa5300 100644 --- a/cmd/fat.c +++ b/cmd/fat.c @@ -98,48 +98,7 @@ U_BOOT_CMD( static int do_fat_fswrite(struct cmd_tbl *cmdtp, int flag, int argc, char *const argv[]) { - loff_t size; - int ret; - unsigned long addr; - unsigned long count; - long offset; - struct blk_desc *dev_desc = NULL; - struct disk_partition info; - int dev = 0; - int part = 1; - void *buf; - - if (argc < 5) - return cmd_usage(cmdtp); - - part = blk_get_device_part_str(argv[1], argv[2], &dev_desc, &info, 1); - if (part < 0) - return 1; - - dev = dev_desc->devnum; - - if (fat_set_blk_dev(dev_desc, &info) != 0) { - printf("\n** Unable to use %s %d:%d for fatwrite **\n", - argv[1], dev, part); - return 1; - } - addr = simple_strtoul(argv[3], NULL, 16); - count = (argc <= 5) ? 0 : simple_strtoul(argv[5], NULL, 16); - /* offset should be a hex, but "-1" is allowed */ - offset = (argc <= 6) ? 0 : simple_strtol(argv[6], NULL, 16); - - buf = map_sysmem(addr, count); - ret = file_fat_write(argv[4], buf, offset, count, &size); - unmap_sysmem(buf); - if (ret < 0) { - printf("\n** Unable to write \"%s\" from %s %d:%d **\n", - argv[4], argv[1], dev, part); - return 1; - } - - printf("%llu bytes written\n", size); - - return 0; + return do_save(cmdtp, flag, argc, argv, FS_TYPE_FAT); } U_BOOT_CMD( diff --git a/cmd/misc.c b/cmd/misc.c index 20ab943494e..653deed7f57 100644 --- a/cmd/misc.c +++ b/cmd/misc.c @@ -1,88 +1,134 @@ // SPDX-License-Identifier: GPL-2.0+ /* - * (C) Copyright 2001 - * Wolfgang Denk, DENX Software Engineering, [email protected]. + * Copyright (c) 2020 Wind River Systems, Inc. + * + * Author: + * Bin Meng <[email protected]> + * + * A command interface to access misc devices with MISC uclass driver APIs. */ -/* - * Misc functions - */ #include <common.h> #include <command.h> -#include <console.h> -#include <linux/delay.h> - -static int do_sleep(struct cmd_tbl *cmdtp, int flag, int argc, - char *const argv[]) +#include <dm.h> +#include <errno.h> +#include <misc.h> + +enum misc_op { + MISC_OP_READ, + MISC_OP_WRITE +}; + +static char *misc_op_str[] = { + "read", + "write" +}; + +static int do_misc_list(struct cmd_tbl *cmdtp, int flag, + int argc, char *const argv[]) { - ulong start = get_timer(0); - ulong mdelay = 0; - ulong delay; - char *frpart; - - if (argc != 2) - return CMD_RET_USAGE; + struct udevice *dev; + + printf("Device Index Driver\n"); + printf("-------------------------------------\n"); + for (uclass_first_device(UCLASS_MISC, &dev); + dev; + uclass_next_device(&dev)) { + printf("%-20s %5d %10s\n", dev->name, dev->seq, + dev->driver->name); + } - delay = simple_strtoul(argv[1], NULL, 10) * CONFIG_SYS_HZ; + return 0; +} - frpart = strchr(argv[1], '.'); +static int do_misc_op(struct cmd_tbl *cmdtp, int flag, + int argc, char *const argv[], enum misc_op op) +{ + int (*misc_op)(struct udevice *, int, void *, int); + struct udevice *dev; + int offset; + void *buf; + int size; + int ret; + + ret = uclass_get_device_by_name(UCLASS_MISC, argv[0], &dev); + if (ret) { + printf("Unable to find device %s\n", argv[0]); + return ret; + } - if (frpart) { - uint mult = CONFIG_SYS_HZ / 10; - for (frpart++; *frpart != '\0' && mult > 0; frpart++) { - if (*frpart < '0' || *frpart > '9') { - mdelay = 0; - break; - } - mdelay += (*frpart - '0') * mult; - mult /= 10; + offset = simple_strtoul(argv[1], NULL, 16); + buf = (void *)simple_strtoul(argv[2], NULL, 16); + size = simple_strtoul(argv[3], NULL, 16); + + if (op == MISC_OP_READ) + misc_op = misc_read; + else + misc_op = misc_write; + + ret = misc_op(dev, offset, buf, size); + if (ret < 0) { + if (ret == -ENOSYS) { + printf("The device does not support %s\n", + misc_op_str[op]); + ret = 0; } + } else { + if (ret == size) + ret = 0; + else + printf("Partially %s %d bytes\n", misc_op_str[op], ret); } - delay += mdelay; - - while (get_timer(start) < delay) { - if (ctrlc()) - return (-1); + return ret; +} - udelay(100); - } +static int do_misc_read(struct cmd_tbl *cmdtp, int flag, + int argc, char *const argv[]) +{ + return do_misc_op(cmdtp, flag, argc, argv, MISC_OP_READ); +} - return 0; +static int do_misc_write(struct cmd_tbl *cmdtp, int flag, + int argc, char *const argv[]) +{ + return do_misc_op(cmdtp, flag, argc, argv, MISC_OP_WRITE); } -U_BOOT_CMD( - sleep , 2, 1, do_sleep, - "delay execution for some time", - "N\n" - " - delay execution for N seconds (N is _decimal_ and can be\n" - " fractional)" -); +static struct cmd_tbl misc_commands[] = { + U_BOOT_CMD_MKENT(list, 0, 1, do_misc_list, "", ""), + U_BOOT_CMD_MKENT(read, 4, 1, do_misc_read, "", ""), + U_BOOT_CMD_MKENT(write, 4, 1, do_misc_write, "", ""), +}; -#ifdef CONFIG_CMD_TIMER -static int do_timer(struct cmd_tbl *cmdtp, int flag, int argc, - char *const argv[]) +static int do_misc(struct cmd_tbl *cmdtp, int flag, + int argc, char *const argv[]) { - static ulong start; + struct cmd_tbl *misc_cmd; + int ret; - if (argc != 2) + if (argc < 2) + return CMD_RET_USAGE; + misc_cmd = find_cmd_tbl(argv[1], misc_commands, + ARRAY_SIZE(misc_commands)); + argc -= 2; + argv += 2; + if (!misc_cmd || argc != misc_cmd->maxargs) return CMD_RET_USAGE; - if (!strcmp(argv[1], "start")) - start = get_timer(0); + ret = misc_cmd->cmd(misc_cmd, flag, argc, argv); - if (!strcmp(argv[1], "get")) { - ulong msecs = get_timer(start) * 1000 / CONFIG_SYS_HZ; - printf("%ld.%03d\n", msecs / 1000, (int)(msecs % 1000)); - } - - return 0; + return cmd_process_error(misc_cmd, ret); } U_BOOT_CMD( - timer, 2, 1, do_timer, - "access the system timer", - "start - Reset the timer reference.\n" - "timer get - Print the time since 'start'." + misc, 6, 1, do_misc, + "Access miscellaneous devices with MISC uclass driver APIs", + "list - list all miscellaneous devices\n" + "misc read name offset addr len - read `len' bytes starting at\n" + " `offset' of device `name'\n" + " to memory at `addr'\n" + "misc write name offset addr len - write `len' bytes starting at\n" + " `offset' of device `name'\n" + " from memory at `addr'" ); -#endif diff --git a/cmd/sleep.c b/cmd/sleep.c new file mode 100644 index 00000000000..f0c78a8efb6 --- /dev/null +++ b/cmd/sleep.c @@ -0,0 +1,57 @@ +// SPDX-License-Identifier: GPL-2.0+ +/* + * (C) Copyright 2001 + * Wolfgang Denk, DENX Software Engineering, [email protected]. + */ + +#include <common.h> +#include <command.h> +#include <console.h> +#include <linux/delay.h> + +static int do_sleep(struct cmd_tbl *cmdtp, int flag, int argc, + char *const argv[]) +{ + ulong start = get_timer(0); + ulong mdelay = 0; + ulong delay; + char *frpart; + + if (argc != 2) + return CMD_RET_USAGE; + + delay = simple_strtoul(argv[1], NULL, 10) * CONFIG_SYS_HZ; + + frpart = strchr(argv[1], '.'); + + if (frpart) { + uint mult = CONFIG_SYS_HZ / 10; + for (frpart++; *frpart != '\0' && mult > 0; frpart++) { + if (*frpart < '0' || *frpart > '9') { + mdelay = 0; + break; + } + mdelay += (*frpart - '0') * mult; + mult /= 10; + } + } + + delay += mdelay; + + while (get_timer(start) < delay) { + if (ctrlc()) + return (-1); + + udelay(100); + } + + return 0; +} + +U_BOOT_CMD( + sleep , 2, 1, do_sleep, + "delay execution for some time", + "N\n" + " - delay execution for N seconds (N is _decimal_ and can be\n" + " fractional)" +); diff --git a/cmd/timer.c b/cmd/timer.c new file mode 100644 index 00000000000..551be5dd54e --- /dev/null +++ b/cmd/timer.c @@ -0,0 +1,34 @@ +// SPDX-License-Identifier: GPL-2.0+ +/* + * (C) Copyright 2001 + * Wolfgang Denk, DENX Software Engineering, [email protected]. + */ + +#include <common.h> +#include <command.h> + +static int do_timer(struct cmd_tbl *cmdtp, int flag, int argc, + char *const argv[]) +{ + static ulong start; + + if (argc != 2) + return CMD_RET_USAGE; + + if (!strcmp(argv[1], "start")) + start = get_timer(0); + + if (!strcmp(argv[1], "get")) { + ulong msecs = get_timer(start) * 1000 / CONFIG_SYS_HZ; + printf("%ld.%03d\n", msecs / 1000, (int)(msecs % 1000)); + } + + return 0; +} + +U_BOOT_CMD( + timer, 2, 1, do_timer, + "access the system timer", + "start - Reset the timer reference.\n" + "timer get - Print the time since 'start'." +); |
