]>
Commit | Line | Data |
---|---|---|
c609719b WD |
1 | /* |
2 | * (C) Copyright 2002 | |
3 | * Wolfgang Denk, DENX Software Engineering, [email protected]. | |
dd875c76 WD |
4 | * (C) Copyright 2002 |
5 | * Robert Schwebel, Pengutronix, <[email protected]> | |
6 | * (C) Copyright 2003 | |
7 | * Kai-Uwe Bloem, Auerswald GmbH & Co KG, <[email protected]> | |
c609719b WD |
8 | * |
9 | * See file CREDITS for list of people who contributed to this | |
10 | * project. | |
11 | * | |
12 | * This program is free software; you can redistribute it and/or | |
13 | * modify it under the terms of the GNU General Public License as | |
14 | * published by the Free Software Foundation; either version 2 of | |
15 | * the License, or (at your option) any later version. | |
16 | * | |
17 | * This program is distributed in the hope that it will be useful, | |
18 | * but WITHOUT ANY WARRANTY; without even the implied warranty of | |
19 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |
20 | * GNU General Public License for more details. | |
21 | * | |
22 | * You should have received a copy of the GNU General Public License | |
23 | * along with this program; if not, write to the Free Software | |
24 | * Foundation, Inc., 59 Temple Place, Suite 330, Boston, | |
25 | * MA 02111-1307 USA | |
26 | */ | |
27 | ||
28 | /* | |
29 | * Boot support | |
30 | */ | |
31 | #include <common.h> | |
32 | #include <command.h> | |
c609719b | 33 | #include <s_record.h> |
8bde7f77 | 34 | #include <jffs2/load_kernel.h> |
c609719b WD |
35 | #include <net.h> |
36 | ||
37 | #if (CONFIG_COMMANDS & CFG_CMD_JFFS2) | |
dd875c76 WD |
38 | |
39 | #include <cramfs/cramfs_fs.h> | |
40 | ||
180d3f74 WD |
41 | extern int cramfs_check (struct part_info *info); |
42 | extern int cramfs_load (char *loadoffset, struct part_info *info, char *filename); | |
43 | extern int cramfs_ls (struct part_info *info, char *filename); | |
44 | extern int cramfs_info (struct part_info *info); | |
45 | ||
c609719b WD |
46 | static int part_num=0; |
47 | ||
48 | #ifndef CFG_JFFS_CUSTOM_PART | |
49 | ||
50 | static struct part_info part; | |
51 | ||
998eaaec WD |
52 | #ifndef CONFIG_JFFS2_NAND |
53 | ||
c609719b WD |
54 | struct part_info* |
55 | jffs2_part_info(int part_num) | |
56 | { | |
57 | extern flash_info_t flash_info[]; /* info for FLASH chips */ | |
58 | int i; | |
59 | ||
60 | if(part_num==0){ | |
61 | ||
62 | if(part.usr_priv==(void*)1) | |
63 | return ∂ | |
64 | ||
65 | memset(&part, 0, sizeof(part)); | |
66 | ||
67 | #if defined(CFG_JFFS2_FIRST_SECTOR) | |
68 | part.offset = (unsigned char *) flash_info[CFG_JFFS2_FIRST_BANK].start[CFG_JFFS2_FIRST_SECTOR]; | |
69 | #else | |
70 | part.offset = (unsigned char *) flash_info[CFG_JFFS2_FIRST_BANK].start[0]; | |
71 | #endif | |
72 | ||
73 | /* Figure out flash partition size */ | |
74 | for (i = CFG_JFFS2_FIRST_BANK; i < CFG_JFFS2_NUM_BANKS+CFG_JFFS2_FIRST_BANK; i++) | |
75 | part.size += flash_info[i].size; | |
76 | ||
77 | #if defined(CFG_JFFS2_FIRST_SECTOR) && (CFG_JFFS2_FIRST_SECTOR > 0) | |
78 | part.size -= | |
79 | flash_info[CFG_JFFS2_FIRST_BANK].start[CFG_JFFS2_FIRST_SECTOR] - | |
80 | flash_info[CFG_JFFS2_FIRST_BANK].start[0]; | |
81 | #endif | |
82 | ||
fc1cfcdb WD |
83 | /* unused in current jffs2 loader */ |
84 | part.erasesize = 0; | |
c609719b WD |
85 | |
86 | /* Mark the struct as ready */ | |
87 | part.usr_priv=(void*)1; | |
88 | ||
89 | return ∂ | |
90 | } | |
91 | return 0; | |
92 | } | |
998eaaec WD |
93 | |
94 | #else /* CONFIG_JFFS2_NAND */ | |
95 | ||
96 | struct part_info* | |
97 | jffs2_part_info(int part_num) | |
98 | { | |
99 | if(part_num==0){ | |
100 | ||
101 | if(part.usr_priv==(void*)1) | |
102 | return ∂ | |
103 | ||
104 | memset(&part, 0, sizeof(part)); | |
105 | ||
b54d32b4 | 106 | part.offset = (char *)CONFIG_JFFS2_NAND_OFF; |
998eaaec WD |
107 | part.size = CONFIG_JFFS2_NAND_SIZE; /* the bigger size the slower jffs2 */ |
108 | ||
109 | #ifndef CONFIG_JFFS2_NAND_DEV | |
110 | #define CONFIG_JFFS2_NAND_DEV 0 | |
111 | #endif | |
112 | /* nand device with the JFFS2 parition plus 1 */ | |
113 | part.usr_priv = (void*)(CONFIG_JFFS2_NAND_DEV+1); | |
114 | return ∂ | |
115 | } | |
116 | return 0; | |
117 | } | |
118 | ||
119 | #endif /* CONFIG_JFFS2_NAND */ | |
c609719b | 120 | #endif /* ifndef CFG_JFFS_CUSTOM_PART */ |
dd875c76 | 121 | |
c609719b WD |
122 | int |
123 | do_jffs2_fsload(cmd_tbl_t *cmdtp, int flag, int argc, char *argv[]) | |
124 | { | |
8bde7f77 WD |
125 | struct part_info* jffs2_part_info(int); |
126 | int jffs2_1pass_load(char *, struct part_info *,const char *); | |
dd875c76 | 127 | char *fsname; |
8bde7f77 | 128 | |
f39748ae WD |
129 | char *filename; |
130 | ||
131 | /* pre-set Boot file name */ | |
132 | if ((filename = getenv("bootfile")) == NULL) { | |
133 | filename = "uImage"; | |
134 | } | |
135 | ||
4b9206ed | 136 | ulong offset = load_addr; |
c609719b WD |
137 | int size; |
138 | struct part_info *part; | |
139 | ||
140 | if (argc == 2) { | |
141 | filename = argv[1]; | |
142 | } | |
143 | if (argc == 3) { | |
144 | offset = simple_strtoul(argv[1], NULL, 16); | |
4b9206ed | 145 | load_addr = offset; |
c609719b WD |
146 | filename = argv[2]; |
147 | } | |
148 | ||
149 | if (0 != (part=jffs2_part_info(part_num))){ | |
150 | ||
dd875c76 WD |
151 | /* check partition type for cramfs */ |
152 | fsname = (cramfs_check(part) ? "CRAMFS" : "JFFS2"); | |
153 | printf("### %s loading '%s' to 0x%lx\n", fsname, filename, offset); | |
154 | ||
155 | if (cramfs_check(part)) { | |
156 | size = cramfs_load ((char *) offset, part, filename); | |
157 | } else { | |
158 | /* if this is not cramfs assume jffs2 */ | |
159 | size = jffs2_1pass_load((char *)offset, part, filename); | |
160 | } | |
c609719b WD |
161 | |
162 | if (size > 0) { | |
163 | char buf[10]; | |
dd875c76 WD |
164 | printf("### %s load complete: %d bytes loaded to 0x%lx\n", |
165 | fsname, size, offset); | |
c609719b WD |
166 | sprintf(buf, "%x", size); |
167 | setenv("filesize", buf); | |
168 | } else { | |
dd875c76 | 169 | printf("### %s LOAD ERROR<%x> for %s!\n", fsname, size, filename); |
c609719b WD |
170 | } |
171 | ||
172 | return !(size > 0); | |
173 | } | |
4b9206ed | 174 | puts ("Active partition not valid\n"); |
c609719b WD |
175 | return 0; |
176 | } | |
177 | ||
178 | int | |
179 | do_jffs2_ls(cmd_tbl_t *cmdtp, int flag, int argc, char *argv[]) | |
180 | { | |
8bde7f77 WD |
181 | struct part_info* jffs2_part_info(int); |
182 | int jffs2_1pass_ls(struct part_info *,char *); | |
183 | ||
184 | char *filename = "/"; | |
c609719b WD |
185 | int ret; |
186 | struct part_info *part; | |
187 | ||
188 | if (argc == 2) | |
189 | filename = argv[1]; | |
190 | ||
191 | if (0 != (part=jffs2_part_info(part_num))){ | |
192 | ||
dd875c76 WD |
193 | /* check partition type for cramfs */ |
194 | if (cramfs_check(part)) { | |
195 | ret = cramfs_ls (part, filename); | |
196 | } else { | |
197 | /* if this is not cramfs assume jffs2 */ | |
198 | ret = jffs2_1pass_ls(part, filename); | |
199 | } | |
c609719b WD |
200 | |
201 | return (ret == 1); | |
202 | } | |
4b9206ed | 203 | puts ("Active partition not valid\n"); |
c609719b WD |
204 | return 0; |
205 | } | |
206 | ||
207 | int | |
208 | do_jffs2_fsinfo(cmd_tbl_t *cmdtp, int flag, int argc, char *argv[]) | |
209 | { | |
dd875c76 WD |
210 | struct part_info* jffs2_part_info(int); |
211 | int jffs2_1pass_info(struct part_info *); | |
c609719b | 212 | struct part_info *part; |
dd875c76 WD |
213 | char *fsname; |
214 | int ret; | |
c609719b | 215 | |
dd875c76 WD |
216 | if ((part=jffs2_part_info(part_num))){ |
217 | ||
218 | /* check partition type for cramfs */ | |
219 | fsname = (cramfs_check(part) ? "CRAMFS" : "JFFS2"); | |
220 | printf("### filesystem type is %s\n", fsname); | |
c609719b | 221 | |
dd875c76 WD |
222 | if (cramfs_check(part)) { |
223 | ret = cramfs_info (part); | |
224 | } else { | |
225 | /* if this is not cramfs assume jffs2 */ | |
226 | ret = jffs2_1pass_info(part); | |
227 | } | |
c609719b WD |
228 | |
229 | return (ret == 1); | |
230 | } | |
4b9206ed | 231 | puts ("Active partition not valid\n"); |
c609719b WD |
232 | return 0; |
233 | } | |
234 | ||
235 | int | |
236 | do_jffs2_chpart(cmd_tbl_t *cmdtp, int flag, int argc, char *argv[]) | |
237 | { | |
238 | int tmp_part; | |
dd875c76 | 239 | char str_part_num[3]; |
8bde7f77 | 240 | struct part_info* jffs2_part_info(int); |
c609719b | 241 | |
8bde7f77 | 242 | if (argc >= 2) { |
c609719b WD |
243 | tmp_part = simple_strtoul(argv[1], NULL, 16); |
244 | }else{ | |
4b9206ed | 245 | puts ("Need partition number in argument list\n"); |
c609719b WD |
246 | return 0; |
247 | ||
248 | } | |
249 | ||
250 | if (jffs2_part_info(tmp_part)){ | |
7205e407 | 251 | printf("Partition changed to %d\n",tmp_part); |
c609719b | 252 | part_num=tmp_part; |
dd875c76 WD |
253 | sprintf(str_part_num, "%d", part_num); |
254 | setenv("partition", str_part_num); | |
c609719b WD |
255 | return 0; |
256 | } | |
257 | ||
258 | printf("Partition %d is not valid partiton\n",tmp_part); | |
259 | return 0; | |
260 | ||
261 | } | |
8bde7f77 WD |
262 | |
263 | /***************************************************/ | |
264 | ||
0d498393 WD |
265 | U_BOOT_CMD( |
266 | fsload, 3, 0, do_jffs2_fsload, | |
aa5590b6 | 267 | "fsload\t- load binary file from a filesystem image\n", |
8bde7f77 WD |
268 | "[ off ] [ filename ]\n" |
269 | " - load binary file from flash bank\n" | |
270 | " with offset 'off'\n" | |
271 | ); | |
272 | ||
0d498393 WD |
273 | U_BOOT_CMD( |
274 | fsinfo, 1, 1, do_jffs2_fsinfo, | |
aa5590b6 | 275 | "fsinfo\t- print information about filesystems\n", |
8bde7f77 WD |
276 | " - print information about filesystems\n" |
277 | ); | |
278 | ||
0d498393 WD |
279 | U_BOOT_CMD( |
280 | ls, 2, 1, do_jffs2_ls, | |
aa5590b6 | 281 | "ls\t- list files in a directory (default /)\n", |
8bde7f77 WD |
282 | "[ directory ]\n" |
283 | " - list files in a directory.\n" | |
284 | ); | |
285 | ||
0d498393 WD |
286 | U_BOOT_CMD( |
287 | chpart, 2, 0, do_jffs2_chpart, | |
aa5590b6 | 288 | "chpart\t- change active partition\n", |
8bde7f77 WD |
289 | " - change active partition\n" |
290 | ); | |
291 | ||
c609719b | 292 | #endif /* CFG_CMD_JFFS2 */ |