12e192b24SSimon Glass /*
22e192b24SSimon Glass * (C) Copyright 2002
32e192b24SSimon Glass * Richard Jones, rjones@nexus-tech.net
42e192b24SSimon Glass *
52e192b24SSimon Glass * SPDX-License-Identifier: GPL-2.0+
62e192b24SSimon Glass */
72e192b24SSimon Glass
82e192b24SSimon Glass /*
92e192b24SSimon Glass * Boot support
102e192b24SSimon Glass */
112e192b24SSimon Glass #include <common.h>
122e192b24SSimon Glass #include <command.h>
132e192b24SSimon Glass #include <s_record.h>
142e192b24SSimon Glass #include <net.h>
152e192b24SSimon Glass #include <ata.h>
162e192b24SSimon Glass #include <asm/io.h>
172e192b24SSimon Glass #include <mapmem.h>
182e192b24SSimon Glass #include <part.h>
192e192b24SSimon Glass #include <fat.h>
202e192b24SSimon Glass #include <fs.h>
212e192b24SSimon Glass
do_fat_size(cmd_tbl_t * cmdtp,int flag,int argc,char * const argv[])222e192b24SSimon Glass int do_fat_size(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
232e192b24SSimon Glass {
242e192b24SSimon Glass return do_size(cmdtp, flag, argc, argv, FS_TYPE_FAT);
252e192b24SSimon Glass }
262e192b24SSimon Glass
272e192b24SSimon Glass U_BOOT_CMD(
282e192b24SSimon Glass fatsize, 4, 0, do_fat_size,
292e192b24SSimon Glass "determine a file's size",
302e192b24SSimon Glass "<interface> <dev[:part]> <filename>\n"
312e192b24SSimon Glass " - Find file 'filename' from 'dev' on 'interface'\n"
322e192b24SSimon Glass " and determine its size."
332e192b24SSimon Glass );
342e192b24SSimon Glass
do_fat_fsload(cmd_tbl_t * cmdtp,int flag,int argc,char * const argv[])352e192b24SSimon Glass int do_fat_fsload (cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
362e192b24SSimon Glass {
372e192b24SSimon Glass return do_load(cmdtp, flag, argc, argv, FS_TYPE_FAT);
382e192b24SSimon Glass }
392e192b24SSimon Glass
402e192b24SSimon Glass
412e192b24SSimon Glass U_BOOT_CMD(
422e192b24SSimon Glass fatload, 7, 0, do_fat_fsload,
432e192b24SSimon Glass "load binary file from a dos filesystem",
442e192b24SSimon Glass "<interface> [<dev[:part]> [<addr> [<filename> [bytes [pos]]]]]\n"
452e192b24SSimon Glass " - Load binary file 'filename' from 'dev' on 'interface'\n"
462e192b24SSimon Glass " to address 'addr' from dos filesystem.\n"
472e192b24SSimon Glass " 'pos' gives the file position to start loading from.\n"
482e192b24SSimon Glass " If 'pos' is omitted, 0 is used. 'pos' requires 'bytes'.\n"
492e192b24SSimon Glass " 'bytes' gives the size to load. If 'bytes' is 0 or omitted,\n"
502e192b24SSimon Glass " the load stops on end of file.\n"
512e192b24SSimon Glass " If either 'pos' or 'bytes' are not aligned to\n"
522e192b24SSimon Glass " ARCH_DMA_MINALIGN then a misaligned buffer warning will\n"
532e192b24SSimon Glass " be printed and performance will suffer for the load."
542e192b24SSimon Glass );
552e192b24SSimon Glass
do_fat_ls(cmd_tbl_t * cmdtp,int flag,int argc,char * const argv[])562e192b24SSimon Glass static int do_fat_ls(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
572e192b24SSimon Glass {
582e192b24SSimon Glass return do_ls(cmdtp, flag, argc, argv, FS_TYPE_FAT);
592e192b24SSimon Glass }
602e192b24SSimon Glass
612e192b24SSimon Glass U_BOOT_CMD(
622e192b24SSimon Glass fatls, 4, 1, do_fat_ls,
632e192b24SSimon Glass "list files in a directory (default /)",
642e192b24SSimon Glass "<interface> [<dev[:part]>] [directory]\n"
652e192b24SSimon Glass " - list files from 'dev' on 'interface' in a 'directory'"
662e192b24SSimon Glass );
672e192b24SSimon Glass
do_fat_fsinfo(cmd_tbl_t * cmdtp,int flag,int argc,char * const argv[])682e192b24SSimon Glass static int do_fat_fsinfo(cmd_tbl_t *cmdtp, int flag, int argc,
692e192b24SSimon Glass char * const argv[])
702e192b24SSimon Glass {
712e192b24SSimon Glass int dev, part;
724101f687SSimon Glass struct blk_desc *dev_desc;
732e192b24SSimon Glass disk_partition_t info;
742e192b24SSimon Glass
752e192b24SSimon Glass if (argc < 2) {
762e192b24SSimon Glass printf("usage: fatinfo <interface> [<dev[:part]>]\n");
772e192b24SSimon Glass return 0;
782e192b24SSimon Glass }
792e192b24SSimon Glass
80e35929e4SSimon Glass part = blk_get_device_part_str(argv[1], argv[2], &dev_desc, &info, 1);
812e192b24SSimon Glass if (part < 0)
822e192b24SSimon Glass return 1;
832e192b24SSimon Glass
84bcce53d0SSimon Glass dev = dev_desc->devnum;
852e192b24SSimon Glass if (fat_set_blk_dev(dev_desc, &info) != 0) {
862e192b24SSimon Glass printf("\n** Unable to use %s %d:%d for fatinfo **\n",
872e192b24SSimon Glass argv[1], dev, part);
882e192b24SSimon Glass return 1;
892e192b24SSimon Glass }
902e192b24SSimon Glass return file_fat_detectfs();
912e192b24SSimon Glass }
922e192b24SSimon Glass
932e192b24SSimon Glass U_BOOT_CMD(
942e192b24SSimon Glass fatinfo, 3, 1, do_fat_fsinfo,
952e192b24SSimon Glass "print information about filesystem",
962e192b24SSimon Glass "<interface> [<dev[:part]>]\n"
972e192b24SSimon Glass " - print information about filesystem from 'dev' on 'interface'"
982e192b24SSimon Glass );
992e192b24SSimon Glass
1002e192b24SSimon Glass #ifdef CONFIG_FAT_WRITE
do_fat_fswrite(cmd_tbl_t * cmdtp,int flag,int argc,char * const argv[])1012e192b24SSimon Glass static int do_fat_fswrite(cmd_tbl_t *cmdtp, int flag,
1022e192b24SSimon Glass int argc, char * const argv[])
1032e192b24SSimon Glass {
1042e192b24SSimon Glass loff_t size;
1052e192b24SSimon Glass int ret;
1062e192b24SSimon Glass unsigned long addr;
1072e192b24SSimon Glass unsigned long count;
1084101f687SSimon Glass struct blk_desc *dev_desc = NULL;
1092e192b24SSimon Glass disk_partition_t info;
1102e192b24SSimon Glass int dev = 0;
1112e192b24SSimon Glass int part = 1;
1122e192b24SSimon Glass void *buf;
1132e192b24SSimon Glass
1142e192b24SSimon Glass if (argc < 5)
1152e192b24SSimon Glass return cmd_usage(cmdtp);
1162e192b24SSimon Glass
117e35929e4SSimon Glass part = blk_get_device_part_str(argv[1], argv[2], &dev_desc, &info, 1);
1182e192b24SSimon Glass if (part < 0)
1192e192b24SSimon Glass return 1;
1202e192b24SSimon Glass
121bcce53d0SSimon Glass dev = dev_desc->devnum;
1222e192b24SSimon Glass
1232e192b24SSimon Glass if (fat_set_blk_dev(dev_desc, &info) != 0) {
1242e192b24SSimon Glass printf("\n** Unable to use %s %d:%d for fatwrite **\n",
1252e192b24SSimon Glass argv[1], dev, part);
1262e192b24SSimon Glass return 1;
1272e192b24SSimon Glass }
1282e192b24SSimon Glass addr = simple_strtoul(argv[3], NULL, 16);
129*454e3d90SStefan Brüns count = (argc <= 5) ? 0 : simple_strtoul(argv[5], NULL, 16);
1302e192b24SSimon Glass
1312e192b24SSimon Glass buf = map_sysmem(addr, count);
1322e192b24SSimon Glass ret = file_fat_write(argv[4], buf, 0, count, &size);
1332e192b24SSimon Glass unmap_sysmem(buf);
1342e192b24SSimon Glass if (ret < 0) {
1352e192b24SSimon Glass printf("\n** Unable to write \"%s\" from %s %d:%d **\n",
1362e192b24SSimon Glass argv[4], argv[1], dev, part);
1372e192b24SSimon Glass return 1;
1382e192b24SSimon Glass }
1392e192b24SSimon Glass
1402e192b24SSimon Glass printf("%llu bytes written\n", size);
1412e192b24SSimon Glass
1422e192b24SSimon Glass return 0;
1432e192b24SSimon Glass }
1442e192b24SSimon Glass
1452e192b24SSimon Glass U_BOOT_CMD(
1462e192b24SSimon Glass fatwrite, 6, 0, do_fat_fswrite,
1472e192b24SSimon Glass "write file into a dos filesystem",
148*454e3d90SStefan Brüns "<interface> <dev[:part]> <addr> <filename> [<bytes>]\n"
1492e192b24SSimon Glass " - write file 'filename' from the address 'addr' in RAM\n"
1502e192b24SSimon Glass " to 'dev' on 'interface'"
1512e192b24SSimon Glass );
1522e192b24SSimon Glass #endif
153