mirror of
https://github.com/Rockbox/rockbox.git
synced 2025-10-13 10:07:38 -04:00
Self-extracting loader: Cleaner method for inclusion of the UCL-compressed image. The input image is now checked for correctness and converted to C source. The Makefile still needs fixing...
git-svn-id: svn://svn.rockbox.org/rockbox/trunk@8109 a1c6a512-1295-4272-9138-f99709370657
This commit is contained in:
parent
8b022749a7
commit
4c385148ac
4 changed files with 129 additions and 17 deletions
|
@ -18,13 +18,14 @@ OBJDIR := .
|
||||||
# FIXME: get proper value from build system
|
# FIXME: get proper value from build system
|
||||||
MEMORYSIZE = 2
|
MEMORYSIZE = 2
|
||||||
|
|
||||||
|
|
||||||
LDS := link.lds
|
LDS := link.lds
|
||||||
LINKFILE = $(OBJDIR)/linkage.lds
|
LINKFILE = $(OBJDIR)/linkage.lds
|
||||||
OBJS := $(OBJDIR)/decompressor.o $(OBJDIR)/rockboxucl.o $(OBJDIR)/startup.o
|
OBJS := $(OBJDIR)/decompressor.o $(OBJDIR)/uclimage.o $(OBJDIR)/startup.o
|
||||||
|
|
||||||
CFLAGS = -O -W -Wall -m1 -nostdlib -ffreestanding -Wstrict-prototypes -fomit-frame-pointer -fschedule-insns
|
CFLAGS = -O -W -Wall -m1 -nostdlib -ffreestanding -Wstrict-prototypes -fomit-frame-pointer -fschedule-insns
|
||||||
|
|
||||||
|
all: $(OBJDIR)/compressed.bin
|
||||||
|
|
||||||
$(OBJDIR)/compressed.bin : $(OBJDIR)/compressed.elf
|
$(OBJDIR)/compressed.bin : $(OBJDIR)/compressed.elf
|
||||||
@echo "OBJCOPY "`basename $@`
|
@echo "OBJCOPY "`basename $@`
|
||||||
@$(OC) -O binary $< $@
|
@$(OC) -O binary $< $@
|
||||||
|
@ -37,6 +38,12 @@ $(LINKFILE): $(LDS)
|
||||||
@echo "Build LDS file"
|
@echo "Build LDS file"
|
||||||
@cat $< | $(CC) -DMEMORYSIZE=$(MEMORYSIZE) $(INCLUDES) $(TARGET) $(DEFINES) -E -P $(ROMBUILD) - >$@
|
@cat $< | $(CC) -DMEMORYSIZE=$(MEMORYSIZE) $(INCLUDES) $(TARGET) $(DEFINES) -E -P $(ROMBUILD) - >$@
|
||||||
|
|
||||||
$(OBJDIR)/rockboxucl.o: $(OBJDIR)/rockbox.ucl
|
$(OBJDIR)/decompressor.o : $(OBJDIR)/uclimage.h
|
||||||
@echo "OBJCOPY rockbox.ucl"
|
|
||||||
@$(OC) -I binary -O elf32-sh -B sh --rename-section .data=.image,alloc,load,data,contents $< $@
|
$(OBJDIR)/uclimage.c : $(OBJDIR)/rockbox.ucl $(TOOLSDIR)/ucl2src.pl
|
||||||
|
@echo "UCL2SRC"
|
||||||
|
@perl -s $(TOOLSDIR)/ucl2src.pl -p=uclimage $< $@
|
||||||
|
|
||||||
|
$(OBJDIR)/uclimage.h : $(OBJDIR)/rockbox.ucl $(TOOLSDIR)/ucl2src.pl
|
||||||
|
@echo "UCL2SRC"
|
||||||
|
@perl -s $(TOOLSDIR)/ucl2src.pl -p=uclimage $< $@
|
||||||
|
|
|
@ -21,13 +21,13 @@
|
||||||
*
|
*
|
||||||
****************************************************************************/
|
****************************************************************************/
|
||||||
|
|
||||||
|
#include "uclimage.h"
|
||||||
|
|
||||||
#define ICODE_ATTR __attribute__ ((section (".icode")))
|
#define ICODE_ATTR __attribute__ ((section (".icode")))
|
||||||
#define UCL_HEADER 26 /* size of the header generated by uclpack */
|
|
||||||
|
|
||||||
/* Symbols defined in the linker script */
|
/* Symbols defined in the linker script */
|
||||||
extern char iramcopy[], iramstart[], iramend[];
|
extern char iramcopy[], iramstart[], iramend[];
|
||||||
extern char stackend[];
|
extern char stackend[];
|
||||||
extern char imgstart[], imgend[];
|
|
||||||
extern char loadaddress[], dramend[];
|
extern char loadaddress[], dramend[];
|
||||||
|
|
||||||
/* Prototypes */
|
/* Prototypes */
|
||||||
|
@ -113,20 +113,19 @@ int ucl_nrv2e_decompress_8(const unsigned char *src, unsigned char *dst,
|
||||||
return ilen;
|
return ilen;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#define ALIGNED_IMG_SIZE ((sizeof(image) + 3) & ~3)
|
||||||
/* This will never return */
|
/* This will never return */
|
||||||
void main(void)
|
void main(void)
|
||||||
{
|
{
|
||||||
unsigned long dst_len; /* dummy */
|
unsigned long dst_len; /* dummy */
|
||||||
unsigned long img_len = (unsigned long)(imgend - imgstart);
|
unsigned long *src = (unsigned long *)image;
|
||||||
unsigned long *src = (unsigned long *)imgstart;
|
unsigned long *dst = (unsigned long *)(dramend - ALIGNED_IMG_SIZE);
|
||||||
unsigned long *dst = (unsigned long *)(dramend - img_len);
|
|
||||||
|
|
||||||
do
|
do
|
||||||
*dst++ = *src++;
|
*dst++ = *src++;
|
||||||
while (dst < (unsigned long *)dramend);
|
while (dst < (unsigned long *)dramend);
|
||||||
|
|
||||||
ucl_nrv2e_decompress_8(dramend - img_len + UCL_HEADER,
|
ucl_nrv2e_decompress_8(dramend - ALIGNED_IMG_SIZE, loadaddress, &dst_len);
|
||||||
loadaddress, &dst_len);
|
|
||||||
|
|
||||||
asm(
|
asm(
|
||||||
"mov.l @%0+,r0 \n"
|
"mov.l @%0+,r0 \n"
|
||||||
|
|
|
@ -40,15 +40,11 @@ SECTIONS
|
||||||
{
|
{
|
||||||
*(.data)
|
*(.data)
|
||||||
. = ALIGN(0x4);
|
. = ALIGN(0x4);
|
||||||
_imgstart = .;
|
|
||||||
*(.image)
|
|
||||||
. = ALIGN(0x4);
|
|
||||||
_imgend = .;
|
|
||||||
_iramcopy = .;
|
_iramcopy = .;
|
||||||
} > DRAM
|
} > DRAM
|
||||||
|
|
||||||
.iram IRAMORIG : AT ( _iramcopy )
|
.iram IRAMORIG : AT ( _iramcopy )
|
||||||
{
|
{
|
||||||
_iramstart = .;
|
_iramstart = .;
|
||||||
*(.icode)
|
*(.icode)
|
||||||
*(.idata)
|
*(.idata)
|
||||||
|
|
110
tools/ucl2src.pl
Executable file
110
tools/ucl2src.pl
Executable file
|
@ -0,0 +1,110 @@
|
||||||
|
#!/usr/bin/env perl
|
||||||
|
############################################################################
|
||||||
|
# __________ __ ___.
|
||||||
|
# Open \______ \ ____ ____ | | _\_ |__ _______ ___
|
||||||
|
# Source | _// _ \_/ ___\| |/ /| __ \ / _ \ \/ /
|
||||||
|
# Jukebox | | ( <_> ) \___| < | \_\ ( <_> > < <
|
||||||
|
# Firmware |____|_ /\____/ \___ >__|_ \|___ /\____/__/\_ \
|
||||||
|
# \/ \/ \/ \/ \/
|
||||||
|
# $Id$
|
||||||
|
#
|
||||||
|
# Copyright (C) 2005 by Jens Arnold
|
||||||
|
#
|
||||||
|
# All files in this archive are subject to the GNU General Public License.
|
||||||
|
# See the file COPYING in the source tree root for full license agreement.
|
||||||
|
#
|
||||||
|
# This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
|
||||||
|
# KIND, either express or implied.
|
||||||
|
#
|
||||||
|
############################################################################
|
||||||
|
|
||||||
|
if (!$ARGV[0])
|
||||||
|
{
|
||||||
|
print <<HERE
|
||||||
|
Usage: ucl2src [-p=<prefix>] <ucl file>
|
||||||
|
|
||||||
|
Check & strip header from an .ucl file and generate <prefix>.c and
|
||||||
|
<prefix>.h from it.
|
||||||
|
HERE
|
||||||
|
;
|
||||||
|
exit;
|
||||||
|
}
|
||||||
|
|
||||||
|
my $prefix = $p;
|
||||||
|
if(!$prefix) {
|
||||||
|
$prefix="uclimage";
|
||||||
|
}
|
||||||
|
|
||||||
|
my $input = $ARGV[0];
|
||||||
|
my $buffer;
|
||||||
|
my $insize;
|
||||||
|
my $readsize = 0;
|
||||||
|
|
||||||
|
open(INF, "<$input") or die "Can't open $input";
|
||||||
|
binmode INF;
|
||||||
|
|
||||||
|
# check UCL header
|
||||||
|
|
||||||
|
# magic header
|
||||||
|
read(INF, $buffer, 8);
|
||||||
|
if ($buffer ne pack("C8", 0x00, 0xe9, 0x55, 0x43, 0x4c, 0xff, 0x01, 0x1a))
|
||||||
|
{
|
||||||
|
die "Not an UCL file.";
|
||||||
|
}
|
||||||
|
read(INF, $buffer, 4);
|
||||||
|
|
||||||
|
# method
|
||||||
|
read(INF, $buffer, 1);
|
||||||
|
if (ord($buffer) != 0x2E)
|
||||||
|
{
|
||||||
|
die sprintf("Wrong compression method (expected 0x2E, found 0x%02X)",
|
||||||
|
ord($buffer));
|
||||||
|
}
|
||||||
|
|
||||||
|
read(INF, $buffer, 9);
|
||||||
|
|
||||||
|
# file size
|
||||||
|
read(INF, $buffer, 4);
|
||||||
|
$insize = unpack("N", $buffer) + 8;
|
||||||
|
|
||||||
|
open(OUTF, ">$prefix.c") or die "Can't open $prefix.c";
|
||||||
|
|
||||||
|
print OUTF <<HERE
|
||||||
|
/* This file was automatically generated using ucl2src.pl */
|
||||||
|
|
||||||
|
/* Data compressed with UCL method 0x2e follows */
|
||||||
|
const unsigned char image[] = {
|
||||||
|
HERE
|
||||||
|
;
|
||||||
|
|
||||||
|
while (read(INF, $buffer, 1))
|
||||||
|
{
|
||||||
|
$readsize++;
|
||||||
|
printf OUTF ("0x%02x,", ord($buffer));
|
||||||
|
if (!($readsize % 16))
|
||||||
|
{
|
||||||
|
print OUTF "\n";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
close(INF);
|
||||||
|
|
||||||
|
if ($readsize != $insize)
|
||||||
|
{
|
||||||
|
die "Input file truncated, got $readsize of $insize bytes."
|
||||||
|
}
|
||||||
|
|
||||||
|
print OUTF <<HERE
|
||||||
|
};
|
||||||
|
/* end of compressed image */
|
||||||
|
HERE
|
||||||
|
;
|
||||||
|
close(OUTF);
|
||||||
|
|
||||||
|
open(OUTF, ">$prefix.h") or die "Can't open $prefix.h";
|
||||||
|
|
||||||
|
print OUTF "/* This file was automatically generated using ucl2src.pl */\n";
|
||||||
|
print OUTF "extern const unsigned char image[".$insize."];\n";
|
||||||
|
|
||||||
|
close(OUTF);
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue