Blame view

cmd/cramfs.c 4.95 KB
88ffb2665   Heiko Schocher   CRAMFS: support c...
1
  /*
1a4596601   Wolfgang Denk   Add GPL-2.0+ SPDX...
2
   * SPDX-License-Identifier:	GPL-2.0+
88ffb2665   Heiko Schocher   CRAMFS: support c...
3
4
5
6
7
8
9
10
11
12
13
14
15
   *
   * based on: cmd_jffs2.c
   *
   * 	Add support for a CRAMFS located in RAM
   */
  
  
  /*
   * CRAMFS support
   */
  #include <common.h>
  #include <command.h>
  #include <malloc.h>
511c66b1e   Tyler Hall   cmd: cramfs: use ...
16
  #include <mapmem.h>
88ffb2665   Heiko Schocher   CRAMFS: support c...
17
18
19
20
21
  #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 ...
22
  #include <asm/io.h>
88ffb2665   Heiko Schocher   CRAMFS: support c...
23
24
25
26
27
28
29
30
31
32
  
  /* 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...
33
  #include <flash.h>
88ffb2665   Heiko Schocher   CRAMFS: support c...
34

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