Blame view

common/cmd_cramfs.c 4.8 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
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
   *
   * based on: cmd_jffs2.c
   *
   * 	Add support for a CRAMFS located in RAM
   */
  
  
  /*
   * CRAMFS support
   */
  #include <common.h>
  #include <command.h>
  #include <malloc.h>
  #include <linux/list.h>
  #include <linux/ctype.h>
  #include <jffs2/jffs2.h>
  #include <jffs2/load_kernel.h>
  #include <cramfs/cramfs_fs.h>
  
  /* 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
  
  #ifdef CONFIG_CRAMFS_CMDLINE
ee8bc961a   Heiko Schocher   cramfs: fix bug i...
33
  #include <flash.h>
88ffb2665   Heiko Schocher   CRAMFS: support c...
34

62a813bca   Heiko Schocher   cramfs: make cram...
35
36
37
38
39
  #ifdef CONFIG_SYS_NO_FLASH
  # define OFFSET_ADJUSTMENT	0
  #else
  # define OFFSET_ADJUSTMENT	(flash_info[id.num].start[0])
  #endif
88ffb2665   Heiko Schocher   CRAMFS: support c...
40
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
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
  #ifndef CONFIG_CMD_JFFS2
  #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;
  }
  #endif /* CONFIG_CMD_JFFS2 */
  
  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);
  
  /***************************************************/
  /* U-boot commands				   */
  /***************************************************/
  
  /**
   * 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
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
  {
  	char *filename;
  	int size;
  	ulong offset = load_addr;
  
  	struct part_info part;
  	struct mtd_device dev;
  	struct mtdids id;
  
  	ulong addr;
  	addr = simple_strtoul(getenv("cramfsaddr"), NULL, 16);
  
  	/* 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 */
62a813bca   Heiko Schocher   cramfs: make cram...
114
  	part.offset = addr - OFFSET_ADJUSTMENT;
88ffb2665   Heiko Schocher   CRAMFS: support c...
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
  
  	/* pre-set Boot file name */
  	if ((filename = getenv("bootfile")) == NULL) {
  		filename = "uImage";
  	}
  
  	if (argc == 2) {
  		filename = argv[1];
  	}
  	if (argc == 3) {
  		offset = simple_strtoul(argv[1], NULL, 0);
  		load_addr = offset;
  		filename = argv[2];
  	}
  
  	size = 0;
  	if (cramfs_check(&part))
  		size = cramfs_load ((char *) offset, &part, filename);
  
  	if (size > 0) {
88ffb2665   Heiko Schocher   CRAMFS: support c...
135
136
137
  		printf("### CRAMFS load complete: %d bytes loaded to 0x%lx
  ",
  			size, offset);
41ef372c1   Simon Glass   common: Use new n...
138
  		setenv_hex("filesize", size);
88ffb2665   Heiko Schocher   CRAMFS: support c...
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
  	} else {
  		printf("### CRAMFS LOAD ERROR<%x> for %s!
  ", size, filename);
  	}
  
  	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...
158
  int do_cramfs_ls(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
88ffb2665   Heiko Schocher   CRAMFS: support c...
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
  {
  	char *filename = "/";
  	int ret;
  	struct part_info part;
  	struct mtd_device dev;
  	struct mtdids id;
  
  	ulong addr;
  	addr = simple_strtoul(getenv("cramfsaddr"), NULL, 16);
  
  	/* 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 */
62a813bca   Heiko Schocher   cramfs: make cram...
177
  	part.offset = addr - OFFSET_ADJUSTMENT;
88ffb2665   Heiko Schocher   CRAMFS: support c...
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
  
  	if (argc == 2)
  		filename = argv[1];
  
  	ret = 0;
  	if (cramfs_check(&part))
  		ret = cramfs_ls (&part, filename);
  
  	return ret ? 0 : 1;
  }
  
  /* command line only */
  
  /***************************************************/
  U_BOOT_CMD(
  	cramfsload,	3,	0,	do_cramfs_load,
cc9f607be   Frans Meulenbroeks   various cmd_* fil...
194
  	"load binary file from a filesystem image",
88ffb2665   Heiko Schocher   CRAMFS: support c...
195
196
197
198
199
200
201
202
203
  	"[ 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...
204
  	"list files in a directory (default /)",
88ffb2665   Heiko Schocher   CRAMFS: support c...
205
206
207
208
209
210
211
212
213
  	"[ directory ]
  "
  	"    - list files in a directory.
  "
  );
  
  #endif /* #ifdef CONFIG_CRAMFS_CMDLINE */
  
  /***************************************************/