Blame view

cmd/cramfs.c 4.98 KB
83d290c56   Tom Rini   SPDX: Convert all...
1
  // SPDX-License-Identifier: GPL-2.0+
88ffb2665   Heiko Schocher   CRAMFS: support c...
2
  /*
88ffb2665   Heiko Schocher   CRAMFS: support c...
3
4
5
   *
   * based on: cmd_jffs2.c
   *
0cf207ec0   Wolfgang Denk   WS cleanup: remov...
6
   *	Add support for a CRAMFS located in RAM
88ffb2665   Heiko Schocher   CRAMFS: support c...
7
8
9
10
11
12
13
14
   */
  
  
  /*
   * CRAMFS support
   */
  #include <common.h>
  #include <command.h>
c7694dd48   Simon Glass   env: Move env_set...
15
  #include <env.h>
8e8ccfe1a   Simon Glass   common: Move the ...
16
  #include <image.h>
88ffb2665   Heiko Schocher   CRAMFS: support c...
17
  #include <malloc.h>
511c66b1e   Tyler Hall   cmd: cramfs: use ...
18
  #include <mapmem.h>
88ffb2665   Heiko Schocher   CRAMFS: support c...
19
20
21
22
23
  #include <linux/list.h>
  #include <linux/ctype.h>
  #include <jffs2/jffs2.h>
  #include <jffs2/load_kernel.h>
  #include <cramfs/cramfs_fs.h>
511c66b1e   Tyler Hall   cmd: cramfs: use ...
24
  #include <asm/io.h>
88ffb2665   Heiko Schocher   CRAMFS: support c...
25
26
27
28
29
30
31
32
33
34
  
  /* enable/disable debugging messages */
  #define	DEBUG_CRAMFS
  #undef	DEBUG_CRAMFS
  
  #ifdef  DEBUG_CRAMFS
  # define DEBUGF(fmt, args...)	printf(fmt ,##args)
  #else
  # define DEBUGF(fmt, args...)
  #endif
ee8bc961a   Heiko Schocher   cramfs: fix bug i...
35
  #include <flash.h>
88ffb2665   Heiko Schocher   CRAMFS: support c...
36

e856bdcfb   Masahiro Yamada   flash: complete C...
37
  #ifndef CONFIG_MTD_NOR_FLASH
62a813bca   Heiko Schocher   cramfs: make cram...
38
39
40
41
  # define OFFSET_ADJUSTMENT	0
  #else
  # define OFFSET_ADJUSTMENT	(flash_info[id.num].start[0])
  #endif
59e12a4a8   Simon Glass   fs: Kconfig: Add ...
42
  #ifndef CONFIG_FS_JFFS2
88ffb2665   Heiko Schocher   CRAMFS: support c...
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
  #include <linux/stat.h>
  char *mkmodestr(unsigned long mode, char *str)
  {
  	static const char *l = "xwr";
  	int mask = 1, i;
  	char c;
  
  	switch (mode & S_IFMT) {
  		case S_IFDIR:    str[0] = 'd'; break;
  		case S_IFBLK:    str[0] = 'b'; break;
  		case S_IFCHR:    str[0] = 'c'; break;
  		case S_IFIFO:    str[0] = 'f'; break;
  		case S_IFLNK:    str[0] = 'l'; break;
  		case S_IFSOCK:   str[0] = 's'; break;
  		case S_IFREG:    str[0] = '-'; break;
  		default:         str[0] = '?';
  	}
  
  	for(i = 0; i < 9; i++) {
  		c = l[i%3];
  		str[9-i] = (mode & mask)?c:'-';
  		mask = mask<<1;
  	}
  
  	if(mode & S_ISUID) str[3] = (mode & S_IXUSR)?'s':'S';
  	if(mode & S_ISGID) str[6] = (mode & S_IXGRP)?'s':'S';
  	if(mode & S_ISVTX) str[9] = (mode & S_IXOTH)?'t':'T';
  	str[10] = '\0';
  	return str;
  }
59e12a4a8   Simon Glass   fs: Kconfig: Add ...
73
  #endif /* CONFIG_FS_JFFS2 */
88ffb2665   Heiko Schocher   CRAMFS: support c...
74
75
76
77
78
79
80
  
  extern int cramfs_check (struct part_info *info);
  extern int cramfs_load (char *loadoffset, struct part_info *info, char *filename);
  extern int cramfs_ls (struct part_info *info, char *filename);
  extern int cramfs_info (struct part_info *info);
  
  /***************************************************/
a187559e3   Bin Meng   Use correct spell...
81
  /* U-Boot commands				   */
88ffb2665   Heiko Schocher   CRAMFS: support c...
82
83
84
85
86
87
88
89
90
91
92
  /***************************************************/
  
  /**
   * Routine implementing fsload u-boot command. This routine tries to load
   * a requested file from cramfs filesystem at location 'cramfsaddr'.
   * cramfsaddr is an evironment variable.
   *
   * @param cmdtp command internal data
   * @param flag command flag
   * @param argc number of arguments supplied to the command
   * @param argv arguments list
185f812c4   Heinrich Schuchardt   doc: replace @ret...
93
   * Return: 0 on success, 1 otherwise
88ffb2665   Heiko Schocher   CRAMFS: support c...
94
   */
091401131   Simon Glass   command: Remove t...
95
96
  int do_cramfs_load(struct cmd_tbl *cmdtp, int flag, int argc,
  		   char *const argv[])
88ffb2665   Heiko Schocher   CRAMFS: support c...
97
98
99
  {
  	char *filename;
  	int size;
bb872dd93   Simon Glass   image: Rename loa...
100
  	ulong offset = image_load_addr;
511c66b1e   Tyler Hall   cmd: cramfs: use ...
101
  	char *offset_virt;
88ffb2665   Heiko Schocher   CRAMFS: support c...
102
103
104
105
106
107
  
  	struct part_info part;
  	struct mtd_device dev;
  	struct mtdids id;
  
  	ulong addr;
7e5f460ec   Simon Glass   global: Convert s...
108
  	addr = hextoul(env_get("cramfsaddr"), NULL);
88ffb2665   Heiko Schocher   CRAMFS: support c...
109
110
111
112
113
114
115
116
117
  
  	/* hack! */
  	/* cramfs_* only supports NOR flash chips */
  	/* fake the device type */
  	id.type = MTD_DEV_TYPE_NOR;
  	id.num = 0;
  	dev.id = &id;
  	part.dev = &dev;
  	/* fake the address offset */
511c66b1e   Tyler Hall   cmd: cramfs: use ...
118
  	part.offset = (u64)(uintptr_t) map_sysmem(addr - OFFSET_ADJUSTMENT, 0);
88ffb2665   Heiko Schocher   CRAMFS: support c...
119
120
  
  	/* pre-set Boot file name */
00caae6d4   Simon Glass   env: Rename geten...
121
122
  	filename = env_get("bootfile");
  	if (!filename)
88ffb2665   Heiko Schocher   CRAMFS: support c...
123
  		filename = "uImage";
88ffb2665   Heiko Schocher   CRAMFS: support c...
124
125
126
127
128
129
  
  	if (argc == 2) {
  		filename = argv[1];
  	}
  	if (argc == 3) {
  		offset = simple_strtoul(argv[1], NULL, 0);
bb872dd93   Simon Glass   image: Rename loa...
130
  		image_load_addr = offset;
88ffb2665   Heiko Schocher   CRAMFS: support c...
131
132
  		filename = argv[2];
  	}
511c66b1e   Tyler Hall   cmd: cramfs: use ...
133
  	offset_virt = map_sysmem(offset, 0);
88ffb2665   Heiko Schocher   CRAMFS: support c...
134
135
  	size = 0;
  	if (cramfs_check(&part))
511c66b1e   Tyler Hall   cmd: cramfs: use ...
136
  		size = cramfs_load (offset_virt, &part, filename);
88ffb2665   Heiko Schocher   CRAMFS: support c...
137
138
  
  	if (size > 0) {
88ffb2665   Heiko Schocher   CRAMFS: support c...
139
140
141
  		printf("### CRAMFS load complete: %d bytes loaded to 0x%lx
  ",
  			size, offset);
018f53032   Simon Glass   env: Rename commo...
142
  		env_set_hex("filesize", size);
88ffb2665   Heiko Schocher   CRAMFS: support c...
143
144
145
146
  	} else {
  		printf("### CRAMFS LOAD ERROR<%x> for %s!
  ", size, filename);
  	}
511c66b1e   Tyler Hall   cmd: cramfs: use ...
147
148
  	unmap_sysmem(offset_virt);
  	unmap_sysmem((void *)(uintptr_t)part.offset);
88ffb2665   Heiko Schocher   CRAMFS: support c...
149
150
151
152
153
154
155
156
157
158
159
160
  	return !(size > 0);
  }
  
  /**
   * Routine implementing u-boot ls command which lists content of a given
   * directory at location 'cramfsaddr'.
   * cramfsaddr is an evironment variable.
   *
   * @param cmdtp command internal data
   * @param flag command flag
   * @param argc number of arguments supplied to the command
   * @param argv arguments list
185f812c4   Heinrich Schuchardt   doc: replace @ret...
161
   * Return: 0 on success, 1 otherwise
88ffb2665   Heiko Schocher   CRAMFS: support c...
162
   */
091401131   Simon Glass   command: Remove t...
163
  int do_cramfs_ls(struct cmd_tbl *cmdtp, int flag, int argc, char *const argv[])
88ffb2665   Heiko Schocher   CRAMFS: support c...
164
165
166
167
168
169
170
171
  {
  	char *filename = "/";
  	int ret;
  	struct part_info part;
  	struct mtd_device dev;
  	struct mtdids id;
  
  	ulong addr;
7e5f460ec   Simon Glass   global: Convert s...
172
  	addr = hextoul(env_get("cramfsaddr"), NULL);
88ffb2665   Heiko Schocher   CRAMFS: support c...
173
174
175
176
177
178
179
180
181
  
  	/* hack! */
  	/* cramfs_* only supports NOR flash chips */
  	/* fake the device type */
  	id.type = MTD_DEV_TYPE_NOR;
  	id.num = 0;
  	dev.id = &id;
  	part.dev = &dev;
  	/* fake the address offset */
511c66b1e   Tyler Hall   cmd: cramfs: use ...
182
  	part.offset = (u64)(uintptr_t) map_sysmem(addr - OFFSET_ADJUSTMENT, 0);
88ffb2665   Heiko Schocher   CRAMFS: support c...
183
184
185
186
187
188
189
  
  	if (argc == 2)
  		filename = argv[1];
  
  	ret = 0;
  	if (cramfs_check(&part))
  		ret = cramfs_ls (&part, filename);
511c66b1e   Tyler Hall   cmd: cramfs: use ...
190
  	unmap_sysmem((void *)(uintptr_t)part.offset);
88ffb2665   Heiko Schocher   CRAMFS: support c...
191
192
193
194
195
196
197
198
199
  
  	return ret ? 0 : 1;
  }
  
  /* command line only */
  
  /***************************************************/
  U_BOOT_CMD(
  	cramfsload,	3,	0,	do_cramfs_load,
cc9f607be   Frans Meulenbroeks   various cmd_* fil...
200
  	"load binary file from a filesystem image",
88ffb2665   Heiko Schocher   CRAMFS: support c...
201
202
203
204
205
206
207
208
209
  	"[ off ] [ filename ]
  "
  	"    - load binary file from address 'cramfsaddr'
  "
  	"      with offset 'off'
  "
  );
  U_BOOT_CMD(
  	cramfsls,	2,	1,	do_cramfs_ls,
cc9f607be   Frans Meulenbroeks   various cmd_* fil...
210
  	"list files in a directory (default /)",
88ffb2665   Heiko Schocher   CRAMFS: support c...
211
212
213
214
215
  	"[ directory ]
  "
  	"    - list files in a directory.
  "
  );