blob: 90412d6233a867446fc21499a37341c2eec12ab4 [file] [log] [blame]
wdenk71f95112003-06-15 22:40:42 +00001/*
2 * (C) Copyright 2002
3 * Richard Jones, rjones@nexus-tech.net
4 *
5 * See file CREDITS for list of people who contributed to this
6 * project.
7 *
8 * This program is free software; you can redistribute it and/or
9 * modify it under the terms of the GNU General Public License as
10 * published by the Free Software Foundation; either version 2 of
11 * the License, or (at your option) any later version.
12 *
13 * This program is distributed in the hope that it will be useful,
14 * but WITHOUT ANY WARRANTY; without even the implied warranty of
15 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16 * GNU General Public License for more details.
17 *
18 * You should have received a copy of the GNU General Public License
19 * along with this program; if not, write to the Free Software
20 * Foundation, Inc., 59 Temple Place, Suite 330, Boston,
21 * MA 02111-1307 USA
22 */
23
24/*
25 * Boot support
26 */
27#include <common.h>
28#include <command.h>
wdenk71f95112003-06-15 22:40:42 +000029#include <s_record.h>
30#include <net.h>
31#include <ata.h>
Grant Likely735dd972007-02-20 09:04:34 +010032#include <part.h>
wdenk71f95112003-06-15 22:40:42 +000033#include <fat.h>
34
wdenk7205e402003-09-10 22:30:53 +000035
Wolfgang Denk54841ab2010-06-28 22:00:46 +020036int do_fat_fsload (cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
wdenk71f95112003-06-15 22:40:42 +000037{
38 long size;
39 unsigned long offset;
40 unsigned long count;
wdenkfbe4b5c2003-10-06 21:55:32 +000041 char buf [12];
wdenk7205e402003-09-10 22:30:53 +000042 block_dev_desc_t *dev_desc=NULL;
Rob Herringcfda5ae2012-08-23 11:31:47 +000043 disk_partition_t info;
44 int part, dev;
wdenk71f95112003-06-15 22:40:42 +000045
wdenk7205e402003-09-10 22:30:53 +000046 if (argc < 5) {
Rob Herringcfda5ae2012-08-23 11:31:47 +000047 printf("usage: fatload <interface> [<dev[:part]>] "
Wolfgang Denk7385c282010-07-19 11:37:00 +020048 "<addr> <filename> [bytes]\n");
wdenk31a64922004-08-28 21:09:14 +000049 return 1;
wdenk71f95112003-06-15 22:40:42 +000050 }
Wolfgang Denk7385c282010-07-19 11:37:00 +020051
Rob Herringcfda5ae2012-08-23 11:31:47 +000052 part = get_device_and_partition(argv[1], argv[2], &dev_desc, &info);
53 if (part < 0)
wdenk7205e402003-09-10 22:30:53 +000054 return 1;
Rob Herringcfda5ae2012-08-23 11:31:47 +000055
56 dev = dev_desc->dev;
wdenk7205e402003-09-10 22:30:53 +000057 if (fat_register_device(dev_desc,part)!=0) {
Wolfgang Denk7385c282010-07-19 11:37:00 +020058 printf("\n** Unable to use %s %d:%d for fatload **\n",
59 argv[1], dev, part);
wdenk7205e402003-09-10 22:30:53 +000060 return 1;
61 }
Wolfgang Denk7385c282010-07-19 11:37:00 +020062 offset = simple_strtoul(argv[3], NULL, 16);
wdenk7205e402003-09-10 22:30:53 +000063 if (argc == 6)
Wolfgang Denk7385c282010-07-19 11:37:00 +020064 count = simple_strtoul(argv[5], NULL, 16);
wdenk71f95112003-06-15 22:40:42 +000065 else
66 count = 0;
Wolfgang Denk7385c282010-07-19 11:37:00 +020067 size = file_fat_read(argv[4], (unsigned char *)offset, count);
wdenk71f95112003-06-15 22:40:42 +000068
wdenkfbe4b5c2003-10-06 21:55:32 +000069 if(size==-1) {
Wolfgang Denk7385c282010-07-19 11:37:00 +020070 printf("\n** Unable to read \"%s\" from %s %d:%d **\n",
71 argv[4], argv[1], dev, part);
wdenk31a64922004-08-28 21:09:14 +000072 return 1;
wdenkfbe4b5c2003-10-06 21:55:32 +000073 }
74
Wolfgang Denk7385c282010-07-19 11:37:00 +020075 printf("\n%ld bytes read\n", size);
wdenk31a64922004-08-28 21:09:14 +000076
77 sprintf(buf, "%lX", size);
78 setenv("filesize", buf);
79
80 return 0;
wdenk71f95112003-06-15 22:40:42 +000081}
82
wdenk7205e402003-09-10 22:30:53 +000083
wdenk0d498392003-07-01 21:06:45 +000084U_BOOT_CMD(
wdenk7205e402003-09-10 22:30:53 +000085 fatload, 6, 0, do_fat_fsload,
Peter Tyser2fb26042009-01-27 18:03:12 -060086 "load binary file from a dos filesystem",
Rob Herringcfda5ae2012-08-23 11:31:47 +000087 "<interface> [<dev[:part]>] <addr> <filename> [bytes]\n"
wdenk7205e402003-09-10 22:30:53 +000088 " - load binary file 'filename' from 'dev' on 'interface'\n"
Wolfgang Denka89c33d2009-05-24 17:06:54 +020089 " to address 'addr' from dos filesystem"
wdenkb0fce992003-06-29 21:03:46 +000090);
91
Wolfgang Denk54841ab2010-06-28 22:00:46 +020092int do_fat_ls (cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
wdenk71f95112003-06-15 22:40:42 +000093{
94 char *filename = "/";
Rob Herringcfda5ae2012-08-23 11:31:47 +000095 int ret, dev, part;
wdenk7205e402003-09-10 22:30:53 +000096 block_dev_desc_t *dev_desc=NULL;
Rob Herringcfda5ae2012-08-23 11:31:47 +000097 disk_partition_t info;
wdenk71f95112003-06-15 22:40:42 +000098
Rob Herringcfda5ae2012-08-23 11:31:47 +000099 if (argc < 2) {
100 printf("usage: fatls <interface> [<dev[:part]>] [directory]\n");
Wolfgang Denk7385c282010-07-19 11:37:00 +0200101 return 0;
wdenk7205e402003-09-10 22:30:53 +0000102 }
Rob Herringcfda5ae2012-08-23 11:31:47 +0000103
104 part = get_device_and_partition(argv[1], argv[2], &dev_desc, &info);
105 if (part < 0)
wdenk7205e402003-09-10 22:30:53 +0000106 return 1;
Rob Herringcfda5ae2012-08-23 11:31:47 +0000107
108 dev = dev_desc->dev;
wdenk7205e402003-09-10 22:30:53 +0000109 if (fat_register_device(dev_desc,part)!=0) {
Wolfgang Denk7385c282010-07-19 11:37:00 +0200110 printf("\n** Unable to use %s %d:%d for fatls **\n",
111 argv[1], dev, part);
wdenk7205e402003-09-10 22:30:53 +0000112 return 1;
113 }
114 if (argc == 4)
Wolfgang Denk7385c282010-07-19 11:37:00 +0200115 ret = file_fat_ls(argv[3]);
wdenk71f95112003-06-15 22:40:42 +0000116 else
Wolfgang Denk7385c282010-07-19 11:37:00 +0200117 ret = file_fat_ls(filename);
wdenk71f95112003-06-15 22:40:42 +0000118
wdenk7205e402003-09-10 22:30:53 +0000119 if(ret!=0)
120 printf("No Fat FS detected\n");
Wolfgang Denk7385c282010-07-19 11:37:00 +0200121 return ret;
wdenk71f95112003-06-15 22:40:42 +0000122}
123
wdenk0d498392003-07-01 21:06:45 +0000124U_BOOT_CMD(
wdenk7205e402003-09-10 22:30:53 +0000125 fatls, 4, 1, do_fat_ls,
Peter Tyser2fb26042009-01-27 18:03:12 -0600126 "list files in a directory (default /)",
Rob Herringcfda5ae2012-08-23 11:31:47 +0000127 "<interface> [<dev[:part]>] [directory]\n"
Wolfgang Denka89c33d2009-05-24 17:06:54 +0200128 " - list files from 'dev' on 'interface' in a 'directory'"
wdenkb0fce992003-06-29 21:03:46 +0000129);
130
Wolfgang Denk54841ab2010-06-28 22:00:46 +0200131int do_fat_fsinfo (cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
wdenk71f95112003-06-15 22:40:42 +0000132{
Rob Herringcfda5ae2012-08-23 11:31:47 +0000133 int dev, part;
134 block_dev_desc_t *dev_desc;
135 disk_partition_t info;
wdenk71f95112003-06-15 22:40:42 +0000136
wdenk7205e402003-09-10 22:30:53 +0000137 if (argc < 2) {
Rob Herringcfda5ae2012-08-23 11:31:47 +0000138 printf("usage: fatinfo <interface> [<dev[:part]>]\n");
Wolfgang Denk7385c282010-07-19 11:37:00 +0200139 return 0;
wdenk7205e402003-09-10 22:30:53 +0000140 }
Rob Herringcfda5ae2012-08-23 11:31:47 +0000141
142 part = get_device_and_partition(argv[1], argv[2], &dev_desc, &info);
143 if (part < 0)
wdenk7205e402003-09-10 22:30:53 +0000144 return 1;
Rob Herringcfda5ae2012-08-23 11:31:47 +0000145
146 dev = dev_desc->dev;
wdenk7205e402003-09-10 22:30:53 +0000147 if (fat_register_device(dev_desc,part)!=0) {
Wolfgang Denk7385c282010-07-19 11:37:00 +0200148 printf("\n** Unable to use %s %d:%d for fatinfo **\n",
149 argv[1], dev, part);
wdenk7205e402003-09-10 22:30:53 +0000150 return 1;
151 }
Wolfgang Denk7385c282010-07-19 11:37:00 +0200152 return file_fat_detectfs();
wdenk71f95112003-06-15 22:40:42 +0000153}
154
wdenk0d498392003-07-01 21:06:45 +0000155U_BOOT_CMD(
wdenk7205e402003-09-10 22:30:53 +0000156 fatinfo, 3, 1, do_fat_fsinfo,
Peter Tyser2fb26042009-01-27 18:03:12 -0600157 "print information about filesystem",
Rob Herringcfda5ae2012-08-23 11:31:47 +0000158 "<interface> [<dev[:part]>]\n"
Wolfgang Denka89c33d2009-05-24 17:06:54 +0200159 " - print information about filesystem from 'dev' on 'interface'"
wdenkb0fce992003-06-29 21:03:46 +0000160);
Donggeun Kim656f4c62012-03-22 04:38:56 +0000161
162#ifdef CONFIG_FAT_WRITE
163static int do_fat_fswrite(cmd_tbl_t *cmdtp, int flag,
164 int argc, char * const argv[])
165{
166 long size;
167 unsigned long addr;
168 unsigned long count;
169 block_dev_desc_t *dev_desc = NULL;
Rob Herringcfda5ae2012-08-23 11:31:47 +0000170 disk_partition_t info;
Donggeun Kim656f4c62012-03-22 04:38:56 +0000171 int dev = 0;
172 int part = 1;
173 char *ep;
174
175 if (argc < 5)
176 return cmd_usage(cmdtp);
177
Rob Herringcfda5ae2012-08-23 11:31:47 +0000178 part = get_device_and_partition(argv[1], argv[2], &dev_desc, &info);
179 if (part < 0)
Donggeun Kim656f4c62012-03-22 04:38:56 +0000180 return 1;
Rob Herringcfda5ae2012-08-23 11:31:47 +0000181
182 dev = dev_desc->dev;
183
Donggeun Kim656f4c62012-03-22 04:38:56 +0000184 if (fat_register_device(dev_desc, part) != 0) {
185 printf("\n** Unable to use %s %d:%d for fatwrite **\n",
186 argv[1], dev, part);
187 return 1;
188 }
189 addr = simple_strtoul(argv[3], NULL, 16);
190 count = simple_strtoul(argv[5], NULL, 16);
191
192 size = file_fat_write(argv[4], (void *)addr, count);
193 if (size == -1) {
194 printf("\n** Unable to write \"%s\" from %s %d:%d **\n",
195 argv[4], argv[1], dev, part);
196 return 1;
197 }
198
199 printf("%ld bytes written\n", size);
200
201 return 0;
202}
203
204U_BOOT_CMD(
205 fatwrite, 6, 0, do_fat_fswrite,
206 "write file into a dos filesystem",
207 "<interface> <dev[:part]> <addr> <filename> <bytes>\n"
208 " - write file 'filename' from the address 'addr' in RAM\n"
209 " to 'dev' on 'interface'"
210);
211#endif