1// SPDX-License-Identifier: GPL-2.0+ 2/* 3 * (C) Copyright 2008 4 * Stefan Roese, DENX Software Engineering, sr@denx.de. 5 */ 6 7 8/* 9 * UBIFS command support 10 */ 11 12#undef DEBUG 13 14#include <common.h> 15#include <config.h> 16#include <command.h> 17#include <log.h> 18#include <ubifs_uboot.h> 19 20static int ubifs_initialized; 21static int ubifs_mounted; 22 23int cmd_ubifs_mount(char *vol_name) 24{ 25 int ret; 26 27 debug("Using volume %s\n", vol_name); 28 29 if (ubifs_initialized == 0) { 30 ubifs_init(); 31 ubifs_initialized = 1; 32 } 33 34 ret = uboot_ubifs_mount(vol_name); 35 if (ret) 36 return CMD_RET_FAILURE; 37 38 ubifs_mounted = 1; 39 40 return ret; 41} 42 43static int do_ubifs_mount(struct cmd_tbl *cmdtp, int flag, int argc, 44 char *const argv[]) 45{ 46 char *vol_name; 47 48 if (argc != 2) 49 return CMD_RET_USAGE; 50 51 vol_name = argv[1]; 52 53 return cmd_ubifs_mount(vol_name); 54} 55 56int ubifs_is_mounted(void) 57{ 58 return ubifs_mounted; 59} 60 61int cmd_ubifs_umount(void) 62{ 63 if (ubifs_initialized == 0) { 64 printf("No UBIFS volume mounted!\n"); 65 return CMD_RET_FAILURE; 66 } 67 68 uboot_ubifs_umount(); 69 ubifs_mounted = 0; 70 ubifs_initialized = 0; 71 72 return 0; 73} 74 75static int do_ubifs_umount(struct cmd_tbl *cmdtp, int flag, int argc, 76 char *const argv[]) 77{ 78 if (argc != 1) 79 return CMD_RET_USAGE; 80 81 return cmd_ubifs_umount(); 82} 83 84static int do_ubifs_ls(struct cmd_tbl *cmdtp, int flag, int argc, 85 char *const argv[]) 86{ 87 char *filename = "/"; 88 int ret; 89 90 if (!ubifs_mounted) { 91 printf("UBIFS not mounted, use ubifsmount to mount volume first!\n"); 92 return CMD_RET_FAILURE; 93 } 94 95 if (argc == 2) 96 filename = argv[1]; 97 debug("Using filename %s\n", filename); 98 99 ret = ubifs_ls(filename); 100 if (ret) { 101 printf("** File not found %s **\n", filename); 102 ret = CMD_RET_FAILURE; 103 } 104 105 return ret; 106} 107 108static int do_ubifs_load(struct cmd_tbl *cmdtp, int flag, int argc, 109 char *const argv[]) 110{ 111 char *filename; 112 char *endp; 113 int ret; 114 unsigned long addr; 115 u32 size = 0; 116 117 if (!ubifs_mounted) { 118 printf("UBIFS not mounted, use ubifs mount to mount volume first!\n"); 119 return CMD_RET_FAILURE; 120 } 121 122 if (argc < 3) 123 return CMD_RET_USAGE; 124 125 addr = hextoul(argv[1], &endp); 126 if (endp == argv[1]) 127 return CMD_RET_USAGE; 128 129 filename = argv[2]; 130 131 if (argc == 4) { 132 size = hextoul(argv[3], &endp); 133 if (endp == argv[3]) 134 return CMD_RET_USAGE; 135 } 136 debug("Loading file '%s' to address 0x%08lx (size %d)\n", filename, addr, size); 137 138 ret = ubifs_load(filename, addr, size); 139 if (ret) { 140 printf("** File not found %s **\n", filename); 141 ret = CMD_RET_FAILURE; 142 } 143 144 return ret; 145} 146 147U_BOOT_CMD( 148 ubifsmount, 2, 0, do_ubifs_mount, 149 "mount UBIFS volume", 150 "<volume-name>\n" 151 " - mount 'volume-name' volume" 152); 153 154U_BOOT_CMD( 155 ubifsumount, 1, 0, do_ubifs_umount, 156 "unmount UBIFS volume", 157 " - unmount current volume" 158); 159 160U_BOOT_CMD( 161 ubifsls, 2, 0, do_ubifs_ls, 162 "list files in a directory", 163 "[directory]\n" 164 " - list files in a 'directory' (default '/')" 165); 166 167U_BOOT_CMD( 168 ubifsload, 4, 0, do_ubifs_load, 169 "load file from an UBIFS filesystem", 170 "<addr> <filename> [bytes]\n" 171 " - load file 'filename' to address 'addr'" 172); 173