Skip to content
GitLab
Menu
Projects
Groups
Snippets
/
Help
Help
Support
Community forum
Keyboard shortcuts
?
Submit feedback
Sign in / Register
Toggle navigation
Menu
Open sidebar
Librem5
uboot-imx
Commits
bcd0be5c
Commit
bcd0be5c
authored
Dec 16, 2004
by
stroese
Browse files
ext2fs support added
parent
2b918712
Changes
2
Hide whitespace changes
Inline
Side-by-side
common/cmd_ext2.c
0 → 100644
View file @
bcd0be5c
/*
* (C) Copyright 2004
* esd gmbh <www.esd-electronics.com>
* Reinhard Arlt <reinhard.arlt@esd-electronics.com>
*
* made from cmd_reiserfs by
*
* (C) Copyright 2003 - 2004
* Sysgo Real-Time Solutions, AG <www.elinos.com>
* Pavel Bartusek <pba@sysgo.com>
*
* See file CREDITS for list of people who contributed to this
* project.
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License as
* published by the Free Software Foundation; either version 2 of
* the License, or (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston,
* MA 02111-1307 USA
*
*/
/*
* Ext2fs support
*/
#include
<common.h>
#if (CONFIG_COMMANDS & CFG_CMD_EXT2)
#include
<config.h>
#include
<command.h>
#include
<image.h>
#include
<linux/ctype.h>
#include
<asm/byteorder.h>
#include
<ext2fs.h>
#ifndef CONFIG_DOS_PARTITION
#error DOS partition support must be selected
#endif
/* #define EXT2_DEBUG */
#ifdef EXT2_DEBUG
#define PRINTF(fmt,args...) printf (fmt ,##args)
#else
#define PRINTF(fmt,args...)
#endif
static
block_dev_desc_t
*
get_dev
(
char
*
ifname
,
int
dev
)
{
#if (CONFIG_COMMANDS & CFG_CMD_IDE)
if
(
strncmp
(
ifname
,
"ide"
,
3
)
==
0
)
{
extern
block_dev_desc_t
*
ide_get_dev
(
int
dev
);
return
((
dev
>=
CFG_IDE_MAXDEVICE
)
?
NULL
:
ide_get_dev
(
dev
));
}
#endif
#if (CONFIG_COMMANDS & CFG_CMD_SCSI)
if
(
strncmp
(
ifname
,
"scsi"
,
4
)
==
0
)
{
extern
block_dev_desc_t
*
scsi_get_dev
(
int
dev
);
return
((
dev
>=
CFG_SCSI_MAXDEVICE
)
?
NULL
:
scsi_get_dev
(
dev
));
}
#endif
#if ((CONFIG_COMMANDS & CFG_CMD_USB) && defined(CONFIG_USB_STORAGE))
if
(
strncmp
(
ifname
,
"usb"
,
3
)
==
0
)
{
extern
block_dev_desc_t
*
usb_stor_get_dev
(
int
dev
);
return
((
dev
>=
USB_MAX_STOR_DEV
)
?
NULL
:
usb_stor_get_dev
(
dev
));
}
#endif
#if defined(CONFIG_MMC)
if
(
strncmp
(
ifname
,
"mmc"
,
3
)
==
0
)
{
extern
block_dev_desc_t
*
mmc_get_dev
(
int
dev
);
return
((
dev
>=
1
)
?
NULL
:
mmc_get_dev
(
dev
));
}
#endif
#if defined(CONFIG_SYSTEMACE)
if
(
strcmp
(
ifname
,
"ace"
)
==
0
)
{
extern
block_dev_desc_t
*
systemace_get_dev
(
int
dev
);
return
((
dev
>=
1
)
?
NULL
:
systemace_get_dev
(
dev
));
}
#endif
return
(
NULL
);
}
int
do_ext2ls
(
cmd_tbl_t
*
cmdtp
,
int
flag
,
int
argc
,
char
*
argv
[])
{
char
*
filename
=
"/"
;
int
dev
=
0
;
int
part
=
1
;
char
*
ep
;
block_dev_desc_t
*
dev_desc
=
NULL
;
int
part_length
;
if
(
argc
<
3
)
{
printf
(
"Usage:
\n
%s
\n
"
,
cmdtp
->
usage
);
return
(
1
);
}
dev
=
(
int
)
simple_strtoul
(
argv
[
2
],
&
ep
,
16
);
dev_desc
=
get_dev
(
argv
[
1
],
dev
);
if
(
dev_desc
==
NULL
)
{
printf
(
"
\n
** Block device %s %d not supported
\n
"
,
argv
[
1
],
dev
);
return
(
1
);
}
if
(
*
ep
)
{
if
(
*
ep
!=
':'
)
{
puts
(
"
\n
** Invalid boot device, use `dev[:part]' **
\n
"
);
return
(
1
);
}
part
=
(
int
)
simple_strtoul
(
++
ep
,
NULL
,
16
);
}
if
(
argc
==
4
)
{
filename
=
argv
[
3
];
}
PRINTF
(
"Using device %s %d:%d, directory: %s
\n
"
,
argv
[
1
],
dev
,
part
,
filename
);
if
((
part_length
=
ext2fs_set_blk_dev
(
dev_desc
,
part
))
==
0
)
{
printf
(
"** Bad partition - %s %d:%d **
\n
"
,
argv
[
1
],
dev
,
part
);
ext2fs_close
();
return
(
1
);
}
if
(
!
ext2fs_mount
(
part_length
))
{
printf
(
"** Bad ext2 partition or disk - %s %d:%d **
\n
"
,
argv
[
1
],
dev
,
part
);
ext2fs_close
();
return
(
1
);
}
if
(
ext2fs_ls
(
filename
))
{
printf
(
"** Error ext2fs_ls() **
\n
"
);
ext2fs_close
();
return
(
1
);
};
ext2fs_close
();
return
(
0
);
}
U_BOOT_CMD
(
ext2ls
,
4
,
1
,
do_ext2ls
,
"ext2ls- list files in a directory (default /)
\n
"
,
"<interface> <dev[:part]> [directory]
\n
"
" - list files from 'dev' on 'interface' in a 'directory'
\n
"
);
/******************************************************************************
* Ext2fs boot command intepreter. Derived from diskboot
*/
int
do_ext2load
(
cmd_tbl_t
*
cmdtp
,
int
flag
,
int
argc
,
char
*
argv
[])
{
char
*
filename
=
NULL
;
char
*
ep
;
int
dev
,
part
=
0
;
ulong
addr
=
0
,
part_length
,
filelen
;
disk_partition_t
info
;
block_dev_desc_t
*
dev_desc
=
NULL
;
char
buf
[
12
];
unsigned
long
count
;
char
*
addr_str
;
switch
(
argc
)
{
case
3
:
addr_str
=
getenv
(
"loadaddr"
);
if
(
addr_str
!=
NULL
)
{
addr
=
simple_strtoul
(
addr_str
,
NULL
,
16
);
}
else
{
addr
=
CFG_LOAD_ADDR
;
}
filename
=
getenv
(
"bootfile"
);
count
=
0
;
break
;
case
4
:
addr
=
simple_strtoul
(
argv
[
3
],
NULL
,
16
);
filename
=
getenv
(
"bootfile"
);
count
=
0
;
break
;
case
5
:
addr
=
simple_strtoul
(
argv
[
3
],
NULL
,
16
);
filename
=
argv
[
4
];
count
=
0
;
break
;
case
6
:
addr
=
simple_strtoul
(
argv
[
3
],
NULL
,
16
);
filename
=
argv
[
4
];
count
=
simple_strtoul
(
argv
[
5
],
NULL
,
16
);
break
;
default:
printf
(
"Usage:
\n
%s
\n
"
,
cmdtp
->
usage
);
return
(
1
);
}
if
(
!
filename
)
{
puts
(
"
\n
** No boot file defined **
\n
"
);
return
(
1
);
}
dev
=
(
int
)
simple_strtoul
(
argv
[
2
],
&
ep
,
16
);
dev_desc
=
get_dev
(
argv
[
1
],
dev
);
if
(
dev_desc
==
NULL
)
{
printf
(
"
\n
** Block device %s %d not supported
\n
"
,
argv
[
1
],
dev
);
return
(
1
);
}
if
(
*
ep
)
{
if
(
*
ep
!=
':'
)
{
puts
(
"
\n
** Invalid boot device, use `dev[:part]' **
\n
"
);
return
(
1
);
}
part
=
(
int
)
simple_strtoul
(
++
ep
,
NULL
,
16
);
}
PRINTF
(
"Using device %s%d, partition %d
\n
"
,
argv
[
1
],
dev
,
part
);
if
(
part
!=
0
)
{
if
(
get_partition_info
(
&
dev_desc
[
dev
],
part
,
&
info
))
{
printf
(
"** Bad partition %d **
\n
"
,
part
);
return
(
1
);
}
if
(
strncmp
(
info
.
type
,
BOOT_PART_TYPE
,
sizeof
(
info
.
type
))
!=
0
)
{
printf
(
"
\n
** Invalid partition type
\"
%.32s
\"
"
" (expect
\"
"
BOOT_PART_TYPE
"
\"
)
\n
"
,
info
.
type
);
return
(
1
);
}
PRINTF
(
"
\n
Loading from block device %s device %d, partition %d: "
"Name: %.32s Type: %.32s File:%s
\n
"
,
argv
[
1
],
dev
,
part
,
info
.
name
,
info
.
type
,
filename
);
}
else
{
PRINTF
(
"
\n
Loading from block device %s device %d, File:%s
\n
"
,
argv
[
1
],
dev
,
filename
);
}
if
((
part_length
=
ext2fs_set_blk_dev
(
dev_desc
,
part
))
==
0
)
{
printf
(
"** Bad partition - %s %d:%d **
\n
"
,
argv
[
1
],
dev
,
part
);
ext2fs_close
();
return
(
1
);
}
if
(
!
ext2fs_mount
(
part_length
))
{
printf
(
"** Bad ext2 partition or disk - %s %d:%d **
\n
"
,
argv
[
1
],
dev
,
part
);
ext2fs_close
();
return
(
1
);
}
filelen
=
ext2fs_open
(
filename
);
if
(
filelen
<
0
)
{
printf
(
"** File not found %s
\n
"
,
filename
);
ext2fs_close
();
return
(
1
);
}
if
((
count
<
filelen
)
&&
(
count
!=
0
))
{
filelen
=
count
;
}
if
(
ext2fs_read
((
char
*
)
addr
,
filelen
)
!=
filelen
)
{
printf
(
"
\n
** Unable to read
\"
%s
\"
from %s %d:%d **
\n
"
,
filename
,
argv
[
1
],
dev
,
part
);
ext2fs_close
();
return
(
1
);
}
ext2fs_close
();
/* Loading ok, update default load address */
load_addr
=
addr
;
printf
(
"
\n
%ld bytes read
\n
"
,
filelen
);
sprintf
(
buf
,
"%lX"
,
filelen
);
setenv
(
"filesize"
,
buf
);
return
(
filelen
);
}
U_BOOT_CMD
(
ext2load
,
6
,
0
,
do_ext2load
,
"ext2load- load binary file from a Ext2 filesystem
\n
"
,
"<interface> <dev[:part]> [addr] [filename] [bytes]
\n
"
" - load binary file 'filename' from 'dev' on 'interface'
\n
"
" to address 'addr' from ext2 filesystem
\n
"
);
#endif
/* CONFIG_COMMANDS & CFG_CMD_EXT2 */
include/ext2fs.h
0 → 100644
View file @
bcd0be5c
/*
* GRUB -- GRand Unified Bootloader
* Copyright (C) 2000, 2001 Free Software Foundation, Inc.
*
* (C) Copyright 2003 Sysgo Real-Time Solutions, AG <www.elinos.com>
* Pavel Bartusek <pba@sysgo.de>
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
*/
/* An implementation for the Ext2FS filesystem ported from GRUB.
* Some parts of this code (mainly the structures and defines) are
* from the original ext2 fs code, as found in the linux kernel.
*/
#define SECTOR_SIZE 0x200
#define SECTOR_BITS 9
/* Error codes */
typedef
enum
{
ERR_NONE
=
0
,
ERR_BAD_FILENAME
,
ERR_BAD_FILETYPE
,
ERR_BAD_GZIP_DATA
,
ERR_BAD_GZIP_HEADER
,
ERR_BAD_PART_TABLE
,
ERR_BAD_VERSION
,
ERR_BELOW_1MB
,
ERR_BOOT_COMMAND
,
ERR_BOOT_FAILURE
,
ERR_BOOT_FEATURES
,
ERR_DEV_FORMAT
,
ERR_DEV_VALUES
,
ERR_EXEC_FORMAT
,
ERR_FILELENGTH
,
ERR_FILE_NOT_FOUND
,
ERR_FSYS_CORRUPT
,
ERR_FSYS_MOUNT
,
ERR_GEOM
,
ERR_NEED_LX_KERNEL
,
ERR_NEED_MB_KERNEL
,
ERR_NO_DISK
,
ERR_NO_PART
,
ERR_NUMBER_PARSING
,
ERR_OUTSIDE_PART
,
ERR_READ
,
ERR_SYMLINK_LOOP
,
ERR_UNRECOGNIZED
,
ERR_WONT_FIT
,
ERR_WRITE
,
ERR_BAD_ARGUMENT
,
ERR_UNALIGNED
,
ERR_PRIVILEGED
,
ERR_DEV_NEED_INIT
,
ERR_NO_DISK_SPACE
,
ERR_NUMBER_OVERFLOW
,
MAX_ERR_NUM
}
ext2fs_error_t
;
extern
int
ext2fs_set_blk_dev
(
block_dev_desc_t
*
rbdd
,
int
part
);
extern
int
ext2fs_ls
(
char
*
dirname
);
extern
int
ext2fs_open
(
char
*
filename
);
extern
int
ext2fs_read
(
char
*
buf
,
unsigned
len
);
extern
int
ext2fs_mount
(
unsigned
part_length
);
extern
int
ext2fs_close
(
void
);
Write
Preview
Supports
Markdown
0%
Try again
or
attach a new file
.
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment