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