diff options
author | Jens Arnold <amiconn@rockbox.org> | 2005-11-30 00:05:40 +0000 |
---|---|---|
committer | Jens Arnold <amiconn@rockbox.org> | 2005-11-30 00:05:40 +0000 |
commit | 4c385148ac4a2f4959ec39841c20eaeb42ace668 (patch) | |
tree | 09f7e37c89a0a187fc1573efbfa9f2bd8cd60ec2 /firmware/decompressor | |
parent | 8b022749a7c29ce5f7254fc153ca78b087e53e04 (diff) | |
download | rockbox-4c385148ac4a2f4959ec39841c20eaeb42ace668.tar.gz rockbox-4c385148ac4a2f4959ec39841c20eaeb42ace668.zip |
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
Diffstat (limited to 'firmware/decompressor')
-rw-r--r-- | firmware/decompressor/Makefile | 17 | ||||
-rw-r--r-- | firmware/decompressor/decompressor.c | 13 | ||||
-rwxr-xr-x | firmware/decompressor/link.lds | 6 |
3 files changed, 19 insertions, 17 deletions
diff --git a/firmware/decompressor/Makefile b/firmware/decompressor/Makefile index 29a78523ea..4136eafdb7 100644 --- a/firmware/decompressor/Makefile +++ b/firmware/decompressor/Makefile @@ -18,13 +18,14 @@ OBJDIR := . # FIXME: get proper value from build system MEMORYSIZE = 2 - LDS := link.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 +all: $(OBJDIR)/compressed.bin + $(OBJDIR)/compressed.bin : $(OBJDIR)/compressed.elf @echo "OBJCOPY "`basename $@` @$(OC) -O binary $< $@ @@ -37,6 +38,12 @@ $(LINKFILE): $(LDS) @echo "Build LDS file" @cat $< | $(CC) -DMEMORYSIZE=$(MEMORYSIZE) $(INCLUDES) $(TARGET) $(DEFINES) -E -P $(ROMBUILD) - >$@ -$(OBJDIR)/rockboxucl.o: $(OBJDIR)/rockbox.ucl - @echo "OBJCOPY rockbox.ucl" - @$(OC) -I binary -O elf32-sh -B sh --rename-section .data=.image,alloc,load,data,contents $< $@ +$(OBJDIR)/decompressor.o : $(OBJDIR)/uclimage.h + +$(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 $< $@ diff --git a/firmware/decompressor/decompressor.c b/firmware/decompressor/decompressor.c index 9cd7d5998e..d368c79538 100644 --- a/firmware/decompressor/decompressor.c +++ b/firmware/decompressor/decompressor.c @@ -21,13 +21,13 @@ * ****************************************************************************/ +#include "uclimage.h" + #define ICODE_ATTR __attribute__ ((section (".icode"))) -#define UCL_HEADER 26 /* size of the header generated by uclpack */ /* Symbols defined in the linker script */ extern char iramcopy[], iramstart[], iramend[]; extern char stackend[]; -extern char imgstart[], imgend[]; extern char loadaddress[], dramend[]; /* Prototypes */ @@ -113,20 +113,19 @@ int ucl_nrv2e_decompress_8(const unsigned char *src, unsigned char *dst, return ilen; } +#define ALIGNED_IMG_SIZE ((sizeof(image) + 3) & ~3) /* This will never return */ void main(void) { unsigned long dst_len; /* dummy */ - unsigned long img_len = (unsigned long)(imgend - imgstart); - unsigned long *src = (unsigned long *)imgstart; - unsigned long *dst = (unsigned long *)(dramend - img_len); + unsigned long *src = (unsigned long *)image; + unsigned long *dst = (unsigned long *)(dramend - ALIGNED_IMG_SIZE); do *dst++ = *src++; while (dst < (unsigned long *)dramend); - ucl_nrv2e_decompress_8(dramend - img_len + UCL_HEADER, - loadaddress, &dst_len); + ucl_nrv2e_decompress_8(dramend - ALIGNED_IMG_SIZE, loadaddress, &dst_len); asm( "mov.l @%0+,r0 \n" diff --git a/firmware/decompressor/link.lds b/firmware/decompressor/link.lds index 9cb4be8830..d0e11c1094 100755 --- a/firmware/decompressor/link.lds +++ b/firmware/decompressor/link.lds @@ -40,15 +40,11 @@ SECTIONS { *(.data) . = ALIGN(0x4); - _imgstart = .; - *(.image) - . = ALIGN(0x4); - _imgend = .; _iramcopy = .; } > DRAM .iram IRAMORIG : AT ( _iramcopy ) - { + { _iramstart = .; *(.icode) *(.idata) |