#include <common.h> #include <command.h> #include <fs.h> #include <fcntl.h> #include <ioctl.h> #include <errno.h> #include <getopt.h> #include <linux/mtd/mtd.h> #include <linux/kernel.h> #include <linux/mtd/mtd-abi.h> #include <mtd/ubi-user.h> #include <ubi-media.h> static int do_ubimkvol(struct command *cmdtp, int argc, char *argv[]) { struct ubi_mkvol_req req; int fd, ret; size_t size; if (argc != 4) return COMMAND_ERROR_USAGE; size = strtoul_suffix(argv[3], NULL, 0); req.name_len = min_t(int, strlen(argv[2]), UBI_VOL_NAME_MAX); strncpy(req.name, argv[2], req.name_len); req.name[req.name_len] = 0; req.vol_type = UBI_DYNAMIC_VOLUME; req.bytes = size; req.vol_id = UBI_VOL_NUM_AUTO; req.alignment = 1; fd = open(argv[1], O_WRONLY); if (fd < 0) { perror("open"); return 1; } ret = ioctl(fd, UBI_IOCMKVOL, &req); if (ret) printf("failed to create: %s\n", strerror(-ret)); close(fd); return ret ? 1 : 0; } static const __maybe_unused char cmd_ubimkvol_help[] = "Usage: ubimkvol <ubidev> <name> <size>\n" "Create an ubi volume on <ubidev> with name <name> and size <size>\n" "If size os zero all available space is used for the volume\n"; BAREBOX_CMD_START(ubimkvol) .cmd = do_ubimkvol, .usage = "create an ubi volume", BAREBOX_CMD_HELP(cmd_ubimkvol_help) BAREBOX_CMD_END static int do_ubiattach(struct command *cmdtp, int argc, char *argv[]) { struct mtd_info_user user; int fd, ret; if (argc != 2) return COMMAND_ERROR_USAGE; fd = open(argv[1], O_RDWR); if (fd < 0) { perror("open"); return 1; } ret = ioctl(fd, MEMGETINFO, &user); if (!ret) ret = ubi_attach_mtd_dev(user.mtd, UBI_DEV_NUM_AUTO, 0); if (ret) printf("failed to attach: %s\n", strerror(-ret)); close(fd); return ret ? 1 : 0; } static const __maybe_unused char cmd_ubiattach_help[] = "Usage: ubiattach <mtddev>\n" "Attach <mtddev> to ubi\n"; BAREBOX_CMD_START(ubiattach) .cmd = do_ubiattach, .usage = "attach a mtd dev to ubi", BAREBOX_CMD_HELP(cmd_ubiattach_help) BAREBOX_CMD_END static int do_ubirmvol(struct command *cmdtp, int argc, char *argv[]) { struct ubi_mkvol_req req; int fd, ret; if (argc != 3) return COMMAND_ERROR_USAGE; strncpy(req.name, argv[2], UBI_VOL_NAME_MAX); req.name[UBI_VOL_NAME_MAX] = 0; fd = open(argv[1], O_WRONLY); if (fd < 0) { perror("open"); return 1; } ret = ioctl(fd, UBI_IOCRMVOL, &req); if (ret) printf("failed to delete: %s\n", strerror(-ret)); close(fd); return ret ? 1 : 0; } static const __maybe_unused char cmd_ubirmvol_help[] = "Usage: ubirmvol <ubidev> <name>\n" "Delete ubi volume <name> from <ubidev>\n"; BAREBOX_CMD_START(ubirmvol) .cmd = do_ubirmvol, .usage = "delete an ubi volume", BAREBOX_CMD_HELP(cmd_ubirmvol_help) BAREBOX_CMD_END