1*2e192b24SSimon Glass /* 2*2e192b24SSimon Glass * (C) Copyright 2002 3*2e192b24SSimon Glass * Richard Jones, rjones@nexus-tech.net 4*2e192b24SSimon Glass * 5*2e192b24SSimon Glass * SPDX-License-Identifier: GPL-2.0+ 6*2e192b24SSimon Glass */ 7*2e192b24SSimon Glass 8*2e192b24SSimon Glass /* 9*2e192b24SSimon Glass * Boot support 10*2e192b24SSimon Glass */ 11*2e192b24SSimon Glass #include <common.h> 12*2e192b24SSimon Glass #include <command.h> 13*2e192b24SSimon Glass #include <s_record.h> 14*2e192b24SSimon Glass #include <net.h> 15*2e192b24SSimon Glass #include <ata.h> 16*2e192b24SSimon Glass #include <asm/io.h> 17*2e192b24SSimon Glass #include <mapmem.h> 18*2e192b24SSimon Glass #include <part.h> 19*2e192b24SSimon Glass #include <fat.h> 20*2e192b24SSimon Glass #include <fs.h> 21*2e192b24SSimon Glass 22*2e192b24SSimon Glass int do_fat_size(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[]) 23*2e192b24SSimon Glass { 24*2e192b24SSimon Glass return do_size(cmdtp, flag, argc, argv, FS_TYPE_FAT); 25*2e192b24SSimon Glass } 26*2e192b24SSimon Glass 27*2e192b24SSimon Glass U_BOOT_CMD( 28*2e192b24SSimon Glass fatsize, 4, 0, do_fat_size, 29*2e192b24SSimon Glass "determine a file's size", 30*2e192b24SSimon Glass "<interface> <dev[:part]> <filename>\n" 31*2e192b24SSimon Glass " - Find file 'filename' from 'dev' on 'interface'\n" 32*2e192b24SSimon Glass " and determine its size." 33*2e192b24SSimon Glass ); 34*2e192b24SSimon Glass 35*2e192b24SSimon Glass int do_fat_fsload (cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[]) 36*2e192b24SSimon Glass { 37*2e192b24SSimon Glass return do_load(cmdtp, flag, argc, argv, FS_TYPE_FAT); 38*2e192b24SSimon Glass } 39*2e192b24SSimon Glass 40*2e192b24SSimon Glass 41*2e192b24SSimon Glass U_BOOT_CMD( 42*2e192b24SSimon Glass fatload, 7, 0, do_fat_fsload, 43*2e192b24SSimon Glass "load binary file from a dos filesystem", 44*2e192b24SSimon Glass "<interface> [<dev[:part]> [<addr> [<filename> [bytes [pos]]]]]\n" 45*2e192b24SSimon Glass " - Load binary file 'filename' from 'dev' on 'interface'\n" 46*2e192b24SSimon Glass " to address 'addr' from dos filesystem.\n" 47*2e192b24SSimon Glass " 'pos' gives the file position to start loading from.\n" 48*2e192b24SSimon Glass " If 'pos' is omitted, 0 is used. 'pos' requires 'bytes'.\n" 49*2e192b24SSimon Glass " 'bytes' gives the size to load. If 'bytes' is 0 or omitted,\n" 50*2e192b24SSimon Glass " the load stops on end of file.\n" 51*2e192b24SSimon Glass " If either 'pos' or 'bytes' are not aligned to\n" 52*2e192b24SSimon Glass " ARCH_DMA_MINALIGN then a misaligned buffer warning will\n" 53*2e192b24SSimon Glass " be printed and performance will suffer for the load." 54*2e192b24SSimon Glass ); 55*2e192b24SSimon Glass 56*2e192b24SSimon Glass static int do_fat_ls(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[]) 57*2e192b24SSimon Glass { 58*2e192b24SSimon Glass return do_ls(cmdtp, flag, argc, argv, FS_TYPE_FAT); 59*2e192b24SSimon Glass } 60*2e192b24SSimon Glass 61*2e192b24SSimon Glass U_BOOT_CMD( 62*2e192b24SSimon Glass fatls, 4, 1, do_fat_ls, 63*2e192b24SSimon Glass "list files in a directory (default /)", 64*2e192b24SSimon Glass "<interface> [<dev[:part]>] [directory]\n" 65*2e192b24SSimon Glass " - list files from 'dev' on 'interface' in a 'directory'" 66*2e192b24SSimon Glass ); 67*2e192b24SSimon Glass 68*2e192b24SSimon Glass static int do_fat_fsinfo(cmd_tbl_t *cmdtp, int flag, int argc, 69*2e192b24SSimon Glass char * const argv[]) 70*2e192b24SSimon Glass { 71*2e192b24SSimon Glass int dev, part; 72*2e192b24SSimon Glass block_dev_desc_t *dev_desc; 73*2e192b24SSimon Glass disk_partition_t info; 74*2e192b24SSimon Glass 75*2e192b24SSimon Glass if (argc < 2) { 76*2e192b24SSimon Glass printf("usage: fatinfo <interface> [<dev[:part]>]\n"); 77*2e192b24SSimon Glass return 0; 78*2e192b24SSimon Glass } 79*2e192b24SSimon Glass 80*2e192b24SSimon Glass part = get_device_and_partition(argv[1], argv[2], &dev_desc, &info, 1); 81*2e192b24SSimon Glass if (part < 0) 82*2e192b24SSimon Glass return 1; 83*2e192b24SSimon Glass 84*2e192b24SSimon Glass dev = dev_desc->dev; 85*2e192b24SSimon Glass if (fat_set_blk_dev(dev_desc, &info) != 0) { 86*2e192b24SSimon Glass printf("\n** Unable to use %s %d:%d for fatinfo **\n", 87*2e192b24SSimon Glass argv[1], dev, part); 88*2e192b24SSimon Glass return 1; 89*2e192b24SSimon Glass } 90*2e192b24SSimon Glass return file_fat_detectfs(); 91*2e192b24SSimon Glass } 92*2e192b24SSimon Glass 93*2e192b24SSimon Glass U_BOOT_CMD( 94*2e192b24SSimon Glass fatinfo, 3, 1, do_fat_fsinfo, 95*2e192b24SSimon Glass "print information about filesystem", 96*2e192b24SSimon Glass "<interface> [<dev[:part]>]\n" 97*2e192b24SSimon Glass " - print information about filesystem from 'dev' on 'interface'" 98*2e192b24SSimon Glass ); 99*2e192b24SSimon Glass 100*2e192b24SSimon Glass #ifdef CONFIG_FAT_WRITE 101*2e192b24SSimon Glass static int do_fat_fswrite(cmd_tbl_t *cmdtp, int flag, 102*2e192b24SSimon Glass int argc, char * const argv[]) 103*2e192b24SSimon Glass { 104*2e192b24SSimon Glass loff_t size; 105*2e192b24SSimon Glass int ret; 106*2e192b24SSimon Glass unsigned long addr; 107*2e192b24SSimon Glass unsigned long count; 108*2e192b24SSimon Glass block_dev_desc_t *dev_desc = NULL; 109*2e192b24SSimon Glass disk_partition_t info; 110*2e192b24SSimon Glass int dev = 0; 111*2e192b24SSimon Glass int part = 1; 112*2e192b24SSimon Glass void *buf; 113*2e192b24SSimon Glass 114*2e192b24SSimon Glass if (argc < 5) 115*2e192b24SSimon Glass return cmd_usage(cmdtp); 116*2e192b24SSimon Glass 117*2e192b24SSimon Glass part = get_device_and_partition(argv[1], argv[2], &dev_desc, &info, 1); 118*2e192b24SSimon Glass if (part < 0) 119*2e192b24SSimon Glass return 1; 120*2e192b24SSimon Glass 121*2e192b24SSimon Glass dev = dev_desc->dev; 122*2e192b24SSimon Glass 123*2e192b24SSimon Glass if (fat_set_blk_dev(dev_desc, &info) != 0) { 124*2e192b24SSimon Glass printf("\n** Unable to use %s %d:%d for fatwrite **\n", 125*2e192b24SSimon Glass argv[1], dev, part); 126*2e192b24SSimon Glass return 1; 127*2e192b24SSimon Glass } 128*2e192b24SSimon Glass addr = simple_strtoul(argv[3], NULL, 16); 129*2e192b24SSimon Glass count = simple_strtoul(argv[5], NULL, 16); 130*2e192b24SSimon Glass 131*2e192b24SSimon Glass buf = map_sysmem(addr, count); 132*2e192b24SSimon Glass ret = file_fat_write(argv[4], buf, 0, count, &size); 133*2e192b24SSimon Glass unmap_sysmem(buf); 134*2e192b24SSimon Glass if (ret < 0) { 135*2e192b24SSimon Glass printf("\n** Unable to write \"%s\" from %s %d:%d **\n", 136*2e192b24SSimon Glass argv[4], argv[1], dev, part); 137*2e192b24SSimon Glass return 1; 138*2e192b24SSimon Glass } 139*2e192b24SSimon Glass 140*2e192b24SSimon Glass printf("%llu bytes written\n", size); 141*2e192b24SSimon Glass 142*2e192b24SSimon Glass return 0; 143*2e192b24SSimon Glass } 144*2e192b24SSimon Glass 145*2e192b24SSimon Glass U_BOOT_CMD( 146*2e192b24SSimon Glass fatwrite, 6, 0, do_fat_fswrite, 147*2e192b24SSimon Glass "write file into a dos filesystem", 148*2e192b24SSimon Glass "<interface> <dev[:part]> <addr> <filename> <bytes>\n" 149*2e192b24SSimon Glass " - write file 'filename' from the address 'addr' in RAM\n" 150*2e192b24SSimon Glass " to 'dev' on 'interface'" 151*2e192b24SSimon Glass ); 152*2e192b24SSimon Glass #endif 153