Blame view

cmd/cramfs.c 4.99 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
6
7
8
9
10
11
12
13
14
   *
   * based on: cmd_jffs2.c
   *
   * 	Add support for a CRAMFS located in RAM
   */
  
  
  /*
   * 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
93
94
  /***************************************************/
  
  /**
   * 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
   * @return 0 on success, 1 otherwise
   */
54841ab50   Wolfgang Denk   Make sure that ar...
95
  int do_cramfs_load(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
88ffb2665   Heiko Schocher   CRAMFS: support c...
96
97
98
  {
  	char *filename;
  	int size;
bb872dd93   Simon Glass   image: Rename loa...
99
  	ulong offset = image_load_addr;
511c66b1e   Tyler Hall   cmd: cramfs: use ...
100
  	char *offset_virt;
88ffb2665   Heiko Schocher   CRAMFS: support c...
101
102
103
104
105
106
  
  	struct part_info part;
  	struct mtd_device dev;
  	struct mtdids id;
  
  	ulong addr;
00caae6d4   Simon Glass   env: Rename geten...
107
  	addr = simple_strtoul(env_get("cramfsaddr"), NULL, 16);
88ffb2665   Heiko Schocher   CRAMFS: support c...
108
109
110
111
112
113
114
115
116
  
  	/* 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 ...
117
  	part.offset = (u64)(uintptr_t) map_sysmem(addr - OFFSET_ADJUSTMENT, 0);
88ffb2665   Heiko Schocher   CRAMFS: support c...
118
119
  
  	/* pre-set Boot file name */
00caae6d4   Simon Glass   env: Rename geten...
120
121
  	filename = env_get("bootfile");
  	if (!filename)
88ffb2665   Heiko Schocher   CRAMFS: support c...
122
  		filename = "uImage";
88ffb2665   Heiko Schocher   CRAMFS: support c...
123
124
125
126
127
128
  
  	if (argc == 2) {
  		filename = argv[1];
  	}
  	if (argc == 3) {
  		offset = simple_strtoul(argv[1], NULL, 0);
bb872dd93   Simon Glass   image: Rename loa...
129
  		image_load_addr = offset;
88ffb2665   Heiko Schocher   CRAMFS: support c...
130
131
  		filename = argv[2];
  	}
511c66b1e   Tyler Hall   cmd: cramfs: use ...
132
  	offset_virt = map_sysmem(offset, 0);
88ffb2665   Heiko Schocher   CRAMFS: support c...
133
134
  	size = 0;
  	if (cramfs_check(&part))
511c66b1e   Tyler Hall   cmd: cramfs: use ...
135
  		size = cramfs_load (offset_virt, &part, filename);
88ffb2665   Heiko Schocher   CRAMFS: support c...
136
137
  
  	if (size > 0) {
88ffb2665   Heiko Schocher   CRAMFS: support c...
138
139
140
  		printf("### CRAMFS load complete: %d bytes loaded to 0x%lx
  ",
  			size, offset);
018f53032   Simon Glass   env: Rename commo...
141
  		env_set_hex("filesize", size);
88ffb2665   Heiko Schocher   CRAMFS: support c...
142
143
144
145
  	} else {
  		printf("### CRAMFS LOAD ERROR<%x> for %s!
  ", size, filename);
  	}
511c66b1e   Tyler Hall   cmd: cramfs: use ...
146
147
  	unmap_sysmem(offset_virt);
  	unmap_sysmem((void *)(uintptr_t)part.offset);
88ffb2665   Heiko Schocher   CRAMFS: support c...
148
149
150
151
152
153
154
155
156
157
158
159
160
161
  	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
   * @return 0 on success, 1 otherwise
   */
54841ab50   Wolfgang Denk   Make sure that ar...
162
  int do_cramfs_ls(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
88ffb2665   Heiko Schocher   CRAMFS: support c...
163
164
165
166
167
168
169
170
  {
  	char *filename = "/";
  	int ret;
  	struct part_info part;
  	struct mtd_device dev;
  	struct mtdids id;
  
  	ulong addr;
00caae6d4   Simon Glass   env: Rename geten...
171
  	addr = simple_strtoul(env_get("cramfsaddr"), NULL, 16);
88ffb2665   Heiko Schocher   CRAMFS: support c...
172
173
174
175
176
177
178
179
180
  
  	/* 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 ...
181
  	part.offset = (u64)(uintptr_t) map_sysmem(addr - OFFSET_ADJUSTMENT, 0);
88ffb2665   Heiko Schocher   CRAMFS: support c...
182
183
184
185
186
187
188
  
  	if (argc == 2)
  		filename = argv[1];
  
  	ret = 0;
  	if (cramfs_check(&part))
  		ret = cramfs_ls (&part, filename);
511c66b1e   Tyler Hall   cmd: cramfs: use ...
189
  	unmap_sysmem((void *)(uintptr_t)part.offset);
88ffb2665   Heiko Schocher   CRAMFS: support c...
190
191
192
193
194
195
196
197
198
  
  	return ret ? 0 : 1;
  }
  
  /* command line only */
  
  /***************************************************/
  U_BOOT_CMD(
  	cramfsload,	3,	0,	do_cramfs_load,
cc9f607be   Frans Meulenbroeks   various cmd_* fil...
199
  	"load binary file from a filesystem image",
88ffb2665   Heiko Schocher   CRAMFS: support c...
200
201
202
203
204
205
206
207
208
  	"[ 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...
209
  	"list files in a directory (default /)",
88ffb2665   Heiko Schocher   CRAMFS: support c...
210
211
212
213
214
  	"[ directory ]
  "
  	"    - list files in a directory.
  "
  );