from now on, the lzma loader is able to pass parameters to the kernel
authorGabor Juhos <juhosg@openwrt.org>
Mon, 25 Jun 2007 08:47:10 +0000 (08:47 +0000)
committerGabor Juhos <juhosg@openwrt.org>
Mon, 25 Jun 2007 08:47:10 +0000 (08:47 +0000)
SVN-Revision: 7723

target/linux/adm5120-2.6/image/Makefile
target/linux/adm5120-2.6/image/lzma-loader/Makefile
target/linux/adm5120-2.6/image/lzma-loader/src/Makefile
target/linux/adm5120-2.6/image/lzma-loader/src/config.h [new file with mode: 0644]
target/linux/adm5120-2.6/image/lzma-loader/src/decompress.c
target/linux/adm5120eb-2.6/image/Makefile

index 02b57be99207dbf1c45529372495b899d0803fab..360a87f657810257442b5cf9873fdc4ddf0914e6 100644 (file)
@@ -7,18 +7,14 @@
 include $(TOPDIR)/rules.mk
 include $(INCLUDE_DIR)/image.mk
 
+IMGNAME = $(BIN_DIR)/openwrt-$(BOARD)-$(KERNEL)
 LOADER_MAKE = $(MAKE) -C lzma-loader KDIR=$(KDIR)
 
-define PrepareLoader
-       $(LOADER_MAKE) LOADER=$(1) LOADER_DATA="" \
-               LZMA_TEXT_START=$(2) LZMA_STARTUP_ORG=$(3) \
-               compile
-
-endef
-define PrepareLZMAKernel
-       $(LOADER_MAKE) LOADER=vmlinux-lzma-$(1) LOADER_DATA=$(KDIR)/vmlinux.lzma \
-               LZMA_TEXT_START=$(2) LZMA_STARTUP_ORG=$(3) \
-               compile
+define Image/Build/Loader
+       $(LOADER_MAKE) LOADER=loader-$(1).$(2) LOADER_DATA="" \
+               LZMA_TEXT_START=$(3) LZMA_STARTUP_ORG=$(4) \
+               CONFIG_PASS_KARGS=$(5) CONFIG_BOARD=$(6) \
+               compile loader.$(2)
 endef
 
 define Build/Clean
@@ -27,13 +23,6 @@ endef
 
 define Image/Prepare
        cat $(KDIR)/vmlinux | $(STAGING_DIR)/bin/lzma e -si -so -eos -lc1 -lp2 -pb2 > $(KDIR)/vmlinux.lzma
-ifneq ($(CONFIG_TARGET_ROOTFS_INITRAMFS),y)
-       $(call PrepareLoader,generic,0x80500000,0)
-       $(call PrepareLoader,admboot,0x80500000,0x6D8)
-else
-       $(call PrepareLZMAKernel,generic,0x80500000,0)
-       $(call PrepareLZMAKernel,admboot,0x80500000,0x6D8)
-endif
 endef
 
 define trxalign/jffs2-128k
@@ -46,36 +35,57 @@ define trxalign/squashfs
 -a 1024
 endef
 
+define Image/Build/TRX
+       $(STAGING_DIR)/bin/trx -o $(1) -f $(3) -f $(KDIR)/vmlinux.lzma \
+               $(call trxalign/$(2)) -f $(KDIR)/root.$(2)
+endef
+
+define Image/Build/TRXNoloader
+       $(STAGING_DIR)/bin/trx -o $(1) -f $(KDIR)/vmlinux.lzma \
+               $(call trxalign/$(2)) -f $(KDIR)/root.$(2)
+endef
+
 define Image/Build/Compex
-       $(CP) $(BIN_DIR)/openwrt-$(BOARD)-$(KERNEL)-$(1).trx $(BIN_DIR)/openwrt-$(BOARD)-$(KERNEL)-$(3)-$(2).trx
+       $(call Image/Build/Loader,$(2),gz,0x80500000,0,y,$(2))
+       $(call Image/Build/TRX,$(IMGNAME)-$(3)-$(2).trx,$(1),$(KDIR)/loader-$(2).gz)
 endef
 
 define Image/Build/Edimax
+       $(call Image/Build/Loader,$(2),gz,0x80500000,0x6D8,y,$(2))
+       $(call Image/Build/TRXNoloader,$(IMGNAME)-$(3)-$(2).trx,$(1))
        $(STAGING_DIR)/bin/mkcsysimg -B $(4) -d -w \
-               -r $(KDIR)/loader-admboot.gz \
-               -x $(BIN_DIR)/openwrt-$(BOARD)-$(KERNEL)-$(1)-noloader.trx \
-               $(BIN_DIR)/openwrt-$(BOARD)-$(KERNEL)-$(3)-$(2).bin
+               -r $(KDIR)/loader-$(2).gz \
+               -x $(IMGNAME)-$(3)-$(2).trx \
+               $(IMGNAME)-$(3)-$(2).bin
+endef
+
+define Image/Build/Infineon
+       $(call Image/Build/Loader,$(2),gz,0x80500000,0x6D8,y,$(2))
+       $(call Image/Build/TRXNoloader,$(IMGNAME)-$(3)-$(2).trx,$(1))
+       dd if=$(KDIR)/loader-$(2).gz of=$(IMGNAME)-$(3)-$(2).img bs=64k conv=sync
+       cat $(IMGNAME)-$(3)-$(2).trx >>$(IMGNAME)-$(3)-$(2).img
 endef
 
 define Image/Build/MyLoader
-       $(CP) $(BIN_DIR)/openwrt-$(BOARD)-$(KERNEL)-$(1)-noloader.trx $(BIN_DIR)/openwrt-$(BOARD)-$(KERNEL)-$(3)-$(2).trx
+       $(call Image/Build/Loader,$(2),gz,0x80500000,0)
+       $(call Image/Build/TRXNoloader,$(IMGNAME)-$(3)-$(2).trx,$(1))
        $(STAGING_DIR)/bin/mkmylofw -B $(4) \
                -p0x20000:0x10000:ahp:0x80001000 \
                -p0x30000:0 \
-               -b0x20000:0x10000:h:$(KDIR)/loader-generic.gz \
-               -b0x30000:0::$(BIN_DIR)/openwrt-$(BOARD)-$(KERNEL)-$(3)-$(2).trx \
-               $(BIN_DIR)/openwrt-$(BOARD)-$(KERNEL)-$(3)-$(2).bin
+               -b0x20000:0x10000:h:$(KDIR)/loader-$(2).gz \
+               -b0x30000:0::$(IMGNAME)-$(3)-$(2).trx \
+               $(IMGNAME)-$(3)-$(2).bin
 endef
 
 define Image/Build/RouterBoard
-       $(CP) $(KDIR)/vmlinux.elf $(BIN_DIR)/openwrt-$(BOARD)-$(KERNEL)-vmlinux
+       $(CP) $(KDIR)/vmlinux.elf $(IMGNAME)-vmlinux
 endef
 
 define Image/Build
-       $(STAGING_DIR)/bin/trx -o $(BIN_DIR)/openwrt-$(BOARD)-$(KERNEL)-$(1).trx -f $(KDIR)/loader-generic.gz -f $(KDIR)/vmlinux.lzma $(call trxalign/$(1)) -f $(KDIR)/root.$(1)
-       $(STAGING_DIR)/bin/trx -o $(BIN_DIR)/openwrt-$(BOARD)-$(KERNEL)-$(1)-noloader.trx -f $(KDIR)/vmlinux.lzma $(call trxalign/$(1)) -f $(KDIR)/root.$(1)
-ifneq ($(1),jffs2-128K)
-       $(call Image/Build/Compex,$(1),wp54g-wrt,$(patsubst jffs2-%,jffs2,$(1)))
+# this line is here intentionally
+ifneq ($(1),jffs2-256k)
+ifneq ($(1),jffs2-128k)
+       $(call Image/Build/Compex,$(1),wp54g-wrt,$(patsubst jffs2-%,jffs2,$(1)),WP54G-WRT)
        $(call Image/Build/Edimax,$(1),br-6104k,$(patsubst jffs2-%,jffs2,$(1)),BR-6104K)
        $(call Image/Build/Edimax,$(1),br-6104kp,$(patsubst jffs2-%,jffs2,$(1)),BR-6104KP)
        $(call Image/Build/Edimax,$(1),br-6114wg,$(patsubst jffs2-%,jffs2,$(1)),BR-6114WG)
@@ -89,6 +99,10 @@ ifneq ($(1),jffs2-128K)
        $(call Image/Build/Edimax,$(1),ps-3205uwg,$(patsubst jffs2-%,jffs2,$(1)),PS-3205UWg)
        $(call Image/Build/Edimax,$(1),br-6524wg,$(patsubst jffs2-%,jffs2,$(1)),BR-6524WG)
        $(call Image/Build/Edimax,$(1),br-6524wp,$(patsubst jffs2-%,jffs2,$(1)),BR-6524WP)
+       $(call Image/Build/Infineon,$(1),easy-5120,$(patsubst jffs2-%,jffs2,$(1)))
+       $(call Image/Build/Infineon,$(1),easy-5120-rt,$(patsubst jffs2-%,jffs2,$(1)))
+       $(call Image/Build/Infineon,$(1),easy-5120p-ata,$(patsubst jffs2-%,jffs2,$(1)))
+       $(call Image/Build/Infineon,$(1),easy-83000,$(patsubst jffs2-%,jffs2,$(1)))
        $(call Image/Build/MyLoader,$(1),np27g,$(patsubst jffs2-%,jffs2,$(1)),NP27G)
        $(call Image/Build/MyLoader,$(1),np28g,$(patsubst jffs2-%,jffs2,$(1)),NP28G)
        $(call Image/Build/MyLoader,$(1),np28ghs,$(patsubst jffs2-%,jffs2,$(1)),NP28GHS)
@@ -97,24 +111,48 @@ ifneq ($(1),jffs2-128K)
        $(call Image/Build/MyLoader,$(1),wpp54g,$(patsubst jffs2-%,jffs2,$(1)),WPP54G)
        $(call Image/Build/MyLoader,$(1),wpp54ag,$(patsubst jffs2-%,jffs2,$(1)),WPP54AG)
 endif
+endif
 ifeq ($(1),tgz)
        $(call Image/Build/RouterBoard)
 endif
 endef
 
 define Image/Build/LZMAKernel
-       $(CP) $(KDIR)/loader-vmlinux-lzma-$(2).$(3) \
-           $(BIN_DIR)/openwrt-$(BOARD)-$(KERNEL)-vmlinux-lzma-$(1).$(3)
+       $(LOADER_MAKE) TARGET_DIR=$(BIN_DIR) \
+               LOADER=openwrt-$(BOARD)-$(KERNEL)-ramfs-lzma-$(1).$(2) \
+               LOADER_DATA=$(KDIR)/vmlinux.lzma \
+               LZMA_TEXT_START=$(3) LZMA_STARTUP_ORG=$(4) \
+               CONFIG_PASS_KARGS=$(5) CONFIG_BOARD=$(6) \
+               compile loader.$(2)
+endef
+
+define Image/Build/LZMAKernel/Compex
+       $(call Image/Build/LZMAKernel,$(1),$(2),0x80500000,0,y,$(1))
+endef
+
+define Image/Build/LZMAKernel/Generic
+       $(call Image/Build/LZMAKernel,$(1),$(2),0x80500000,0)
+endef
+
+define Image/Build/LZMAKernel/Admboot
+       $(call Image/Build/LZMAKernel,$(1),$(2),0x80500000,0x6D8,y,$(1))
 endef
 
 define Image/Build/Initramfs
-       $(call Image/Build/LZMAKernel,generic,generic,elf)
-       $(call Image/Build/LZMAKernel,rb-100,generic,elf)
-       $(call Image/Build/LZMAKernel,np27g,generic,bin)
-       $(call Image/Build/LZMAKernel,wp54g,generic,bin)
-       $(call Image/Build/LZMAKernel,br-6104k,admboot,gz)
-       $(call Image/Build/LZMAKernel,cas-771,admboot,gz)
+       $(call Image/Build/LZMAKernel/Generic,generic,bin)
+       $(call Image/Build/LZMAKernel/Generic,rb-100,elf)
+       $(call Image/Build/LZMAKernel/Generic,np27g,bin)
+       $(call Image/Build/LZMAKernel/Generic,wp54g,bin)
+       $(call Image/Build/LZMAKernel/Compex,wp54g-wrt,bin)
+       $(call Image/Build/LZMAKernel/Admboot,br-6104k,gz)
+       $(call Image/Build/LZMAKernel/Admboot,easy-5120,gz)
+       $(call Image/Build/LZMAKernel/Admboot,easy-83000,gz)
+       $(call Image/Build/LZMAKernel/Admboot,cas-630,gz)
+       $(call Image/Build/LZMAKernel/Admboot,cas-670,gz)
+       $(call Image/Build/LZMAKernel/Admboot,cas-700,gz)
+       $(call Image/Build/LZMAKernel/Admboot,cas-771,gz)
+       $(call Image/Build/LZMAKernel/Admboot,cas-790,gz)
+       $(call Image/Build/LZMAKernel/Admboot,cas-861,gz)
 endef
 
 $(eval $(call BuildImage))
-
index 0245e44ccd961cce929b71c348ecbe7f3eea6618..74866e765e66370d2b7199d0870d4827a7637f57 100644 (file)
@@ -8,13 +8,18 @@
 
 include $(TOPDIR)/rules.mk
 
-LOADER         := adm5120
-LOADER_NAME    := loader-$(LOADER)
+LOADER         := loader.bin
+LOADER_NAME    := $(basename $(notdir $(LOADER)))
 LOADER_DATA    :=
+TARGET_DIR     :=
 
-LOADER_BIN     := $(KDIR)/$(LOADER_NAME).bin
-LOADER_GZ      := $(KDIR)/$(LOADER_NAME).gz
-LOADER_ELF     := $(KDIR)/$(LOADER_NAME).elf
+ifeq ($(TARGET_DIR),)
+TARGET_DIR     := $(KDIR)
+endif
+
+LOADER_BIN     := $(TARGET_DIR)/$(LOADER_NAME).bin
+LOADER_GZ      := $(TARGET_DIR)/$(LOADER_NAME).gz
+LOADER_ELF     := $(TARGET_DIR)/$(LOADER_NAME).elf
 
 LZMA_STARTUP_ORG:= 0
 LZMA_TEXT_START        := 0x80300000
@@ -22,7 +27,7 @@ LZMA_TEXT_START       := 0x80300000
 PKG_NAME := lzma-loader
 PKG_BUILD_DIR := $(KDIR)/$(PKG_NAME)
 
-.PHONY : loader-compile
+.PHONY : loader-compile loader.bin loader.elf loader.gz
 
 $(PKG_BUILD_DIR)/.prepared:
        mkdir $(PKG_BUILD_DIR)
@@ -34,23 +39,25 @@ loader-compile: $(PKG_BUILD_DIR)/.prepared
                LZMA_STARTUP_ORG=$(LZMA_STARTUP_ORG) \
                LZMA_TEXT_START=$(LZMA_TEXT_START) \
                LOADER_DATA=$(LOADER_DATA) \
+               CONFIG_BOARD=$(CONFIG_BOARD) \
+               CONFIG_PASS_KARGS=$(CONFIG_PASS_KARGS) \
                clean all
 
-$(LOADER_GZ): $(PKG_BUILD_DIR)/loader.bin
-       gzip -nc9 $< > $@
+loader.gz: $(PKG_BUILD_DIR)/loader.bin
+       gzip -nc9 $< > $(LOADER_GZ)
 
-$(LOADER_ELF) : $(PKG_BUILD_DIR)/loader.elf
-       $(CP) $< $@
+loader.elf: $(PKG_BUILD_DIR)/loader.elf
+       $(CP) $< $(LOADER_ELF)
 
-$(LOADER_BIN) : $(PKG_BUILD_DIR)/loader.bin
-       $(CP) $< $@
+loader.bin: $(PKG_BUILD_DIR)/loader.bin
+       $(CP) $< $(LOADER_BIN)
 
 download:
 prepare: $(PKG_BUILD_DIR)/.prepared
-compile: loader-compile $(LOADER_BIN) $(LOADER_GZ) $(LOADER_ELF)
+compile: loader-compile
 
 install:
 
 clean:
        rm -rf $(PKG_BUILD_DIR)
-       rm -f $(KDIR)/loader-*.gz $(KDIR)/loader-*.elf $(KDIR)/loader-*.bin
+
index 0f4ffa63a9c6a3bf9a299e1df4268bf91d4df01d..a3749f2ee96eb0dfb36387bcd8f12bbeb6eed5bc 100644 (file)
@@ -25,6 +25,8 @@ LOADADDR      := 0x80001000
 LZMA_TEXT_START        := 0x80500000
 LZMA_STARTUP_ORG:= 0
 LOADER_DATA    :=
+CONFIG_PASS_KARGS :=
+CONFIG_BOARD   :=
 
 CC             := $(CROSS_COMPILE)gcc
 LD             := $(CROSS_COMPILE)ld
@@ -55,6 +57,16 @@ else
 CFLAGS         += -D_LZMA_IN_CB
 endif
 
+ifneq ($(strip $(CONFIG_PASS_KARGS)),)
+CFLAGS         += -DCONFIG_PASS_KARGS
+endif
+
+BOARD_DEF := $(strip $(CONFIG_BOARD))
+BOARD_DEF := $(shell echo $(BOARD_DEF) | tr a-z A-Z | tr -d -)
+ifneq ($(BOARD_DEF),)
+CFLAGS         += -DCONFIG_BOARD_$(BOARD_DEF)
+endif
+
 all: loader.bin
 
 # Don't build dependencies, this may die if $(CC) isn't gcc
@@ -80,7 +92,7 @@ loader.elf: $(OBJECTS)
 mrproper: clean
 
 clean:
-       rm -f *.gz *.elf *.bin *.o
+       rm -f *.elf *.bin *.o
 
 
 
diff --git a/target/linux/adm5120-2.6/image/lzma-loader/src/config.h b/target/linux/adm5120-2.6/image/lzma-loader/src/config.h
new file mode 100644 (file)
index 0000000..5002b18
--- /dev/null
@@ -0,0 +1,83 @@
+/*
+ * Cellvision/SparkLAN boards
+ */
+
+#if defined(CONFIG_BOARD_CAS630)
+#  define CONFIG_BOARD_NAME    "CAS-630"
+#endif
+
+#if defined(CONFIG_BOARD_CAS670)
+#  define CONFIG_BOARD_NAME    "CAS-670"
+#endif
+
+#if defined(CONFIG_BOARD_CAS700)
+#  define CONFIG_BOARD_NAME    "CAS-700"
+#endif
+
+#if defined(CONFIG_BOARD_CAS790)
+#  define CONFIG_BOARD_NAME    "CAS-790"
+#endif
+
+#if defined(CONFIG_BOARD_CAS771)
+#  define CONFIG_BOARD_NAME    "CAS-771"
+#endif
+
+#if defined(CONFIG_BOARD_CAS861)
+#  define CONFIG_BOARD_NAME    "CAS-861"
+#endif
+
+#if defined(CONFIG_BOARD_NFS101U)
+#  define CONFIG_BOARD_NAME    "NFS-101U"
+#endif
+
+#if defined(CONFIG_BOARD_NFS202U)
+#  define CONFIG_BOARD_NAME    "NFS-202U"
+#endif
+
+/*
+ * Edimax boards
+ */
+#if defined(CONFIG_BOARD_BR6104K)
+#  define CONFIG_BOARD_NAME    "BR-6104K"
+#endif
+
+#if defined(CONFIG_BOARD_BR6104KP)
+#  define CONFIG_BOARD_NAME    "BR-6104KP"
+#endif
+
+/*
+ * Infineon boards
+ */
+#if defined(CONFIG_BOARD_EASY5120)
+#  define CONFIG_BOARD_NAME    "EASY 5120"
+#endif
+
+#if defined(CONFIG_BOARD_EASY5120RT)
+#  define CONFIG_BOARD_NAME    "EASY 5120-RT"
+#endif
+
+#if defined(CONFIG_BOARD_EASY5120PATA)
+#  define CONFIG_BOARD_NAME    "EASY 5120P-ATA"
+#endif
+
+#if defined(CONFIG_BOARD_EASY83000)
+#  define CONFIG_BOARD_NAME    "EASY 83000"
+#endif
+
+/*
+ * ZyXEL boards
+ */
+#if defined(CONFIG_BOARD_P334WT)
+#  define CONFIG_BOARD_NAME    "P-334WT"
+#endif
+
+#if defined(CONFIG_BOARD_P335)
+#  define CONFIG_BOARD_NAME    "P-335"
+#endif
+
+/*
+ * Default values
+ */
+#ifndef CONFIG_BOARD_NAME
+#  define CONFIG_BOARD_NAME    "ADM5120"
+#endif
index ffc87ee0db56a3bd4e03a4757e97cdb014ef9314..e2f9bee234e1ce555118724eb3e085cef146b48f 100644 (file)
  *
  * 19-May-2007 Gabor Juhos
  *   endiannes related cleanups
- *   add support for decompressing an embedded kernel 
+ *   add support for decompressing an embedded kernel
  *
  */
 
 #include <stddef.h>
 
+#include "config.h"
 #include "LzmaDecode.h"
 
 #define ADM5120_FLASH_START    0x1fc00000      /* Flash start */
@@ -109,6 +110,19 @@ extern unsigned char _lzma_data_end[];
 extern void board_init(void);
 extern void board_putc(int ch);
 
+struct env_var {
+       char    *name;
+       char    *value;
+};
+
+#ifdef CONFIG_PASS_KARGS
+#define ENVV(n,v)      {.name = (n), .value = (v)}
+struct env_var env_vars[] = {
+       ENVV("board_name",      CONFIG_BOARD_NAME),
+       ENVV(NULL, NULL)
+};
+#endif
+
 unsigned char *data;
 unsigned long datalen;
 
@@ -167,6 +181,7 @@ static void print_hex(int val)
        }
 }
 
+#if !(LZMA_WRAPPER)
 static unsigned char *find_kernel(void)
 {
        struct trx_header *hdr;
@@ -178,7 +193,7 @@ static unsigned char *find_kernel(void)
        for (ret = ((unsigned char *) KSEG1ADDR(ADM5120_FLASH_START));
                ret < ((unsigned char *)KSEG1ADDR(ADM5120_FLASH_END));
                ret += TRX_ALIGN) {
-               
+
                if (read_le32(ret) == TRX_MAGIC) {
                        hdr = (struct trx_header *)ret;
                        break;
@@ -187,13 +202,13 @@ static unsigned char *find_kernel(void)
 
        if (hdr == NULL) {
                print_str("not found!\n");
-               return NULL;    
+               return NULL;
        }
 
        print_str("found at ");
        print_hex((unsigned int)ret);
        print_str(", kernel in partition ");
-       
+
        /* compressed kernel is in the partition 0 or 1 */
        if ((read_le32(&hdr->offsets[1]) == 0) ||
                (read_le32(&hdr->offsets[1]) > 65536)) {
@@ -203,9 +218,10 @@ static unsigned char *find_kernel(void)
                ret += read_le32(&hdr->offsets[1]);
                print_str("1\n");
        }
-               
+
        return ret;
 }
+#endif /* !(LZMA_WRAPPER) */
 
 static void halt(void)
 {
@@ -231,7 +247,8 @@ void decompress_entry(unsigned long reg_a0, unsigned long reg_a1,
 
        board_init();
 
-       print_str("\n\nLZMA loader for ADM5120, Copyright (C) 2007 OpenWrt.org\n\n");
+       print_str("\n\nLZMA loader for " CONFIG_BOARD_NAME
+                       ", Copyright (C) 2007 OpenWrt.org\n\n");
 
 #if LZMA_WRAPPER
        data = _lzma_data_start;
@@ -301,8 +318,12 @@ void decompress_entry(unsigned long reg_a0, unsigned long reg_a1,
 
        print_str("launching kernel...\n\n");
 
+#ifdef CONFIG_PASS_KARGS
+       reg_a0 = 0;
+       reg_a1 = 0;
+       reg_a2 = (unsigned long)env_vars;
+       reg_a3 = 0;
+#endif
        /* Jump to load address */
        ((kernel_entry) LOADADDR)(reg_a0, reg_a1, reg_a2, reg_a3);
 }
-
-
index ce4644da178b85c4d1f787fadf9f89c7beaa8f26..0022b4844887e2455bf5355100b8edb1b79f6ec2 100644 (file)
@@ -7,18 +7,14 @@
 include $(TOPDIR)/rules.mk
 include $(INCLUDE_DIR)/image.mk
 
+IMGNAME = $(BIN_DIR)/openwrt-$(BOARD)-$(KERNEL)
 LOADER_MAKE = $(MAKE) -C lzma-loader KDIR=$(KDIR)
 
-define CompileLoader
-       $(LOADER_MAKE) LOADER=$(1) LOADER_DATA="" \
-               LZMA_TEXT_START=$(2) LZMA_STARTUP_ORG=$(3) \
-               compile
-endef
-
-define CompileLZMAKernel
-       $(LOADER_MAKE) LOADER=vmlinux-lzma-$(1) LOADER_DATA=$(KDIR)/vmlinux.lzma \
-               LZMA_TEXT_START=$(2) LZMA_STARTUP_ORG=$(3) \
-               compile
+define Image/Build/Loader
+       $(LOADER_MAKE) LOADER=loader-$(1).$(2) LOADER_DATA="" \
+               LZMA_TEXT_START=$(3) LZMA_STARTUP_ORG=$(4) \
+               CONFIG_PASS_KARGS=$(5) CONFIG_BOARD=$(6) \
+               compile loader.$(2)
 endef
 
 define Build/Clean
@@ -27,11 +23,6 @@ endef
 
 define Image/Prepare
        cat $(KDIR)/vmlinux | $(STAGING_DIR)/bin/lzma e -si -so -eos -lc1 -lp2 -pb2 > $(KDIR)/vmlinux.lzma
-ifneq ($(CONFIG_TARGET_ROOTFS_INITRAMFS),y)
-       $(call CompileLoader,zyxel,0x80500000,0)
-else   
-       $(call CompileLZMAKernel,zyxel,0x80500000,0)
-endif
 endef
 
 define trxalign/jffs2-128k
@@ -44,25 +35,42 @@ define trxalign/squashfs
 -a 1024
 endef
 
+define Image/Build/TRX
+       $(STAGING_DIR)/bin/trx -o $(1) -f $(3) -f $(KDIR)/vmlinux.lzma \
+               $(call trxalign/$(2)) -f $(KDIR)/root.$(2)
+endef
+
+define Image/Build/TRXNoloader
+       $(STAGING_DIR)/bin/trx -o $(1) -f $(KDIR)/vmlinux.lzma \
+               $(call trxalign/$(2)) -f $(KDIR)/root.$(2)
+endef
+
 define Image/Build/ZyXEL
-       $(CP) $(BIN_DIR)/openwrt-$(BOARD)-$(KERNEL)-$(1)-noloader.trx $(BIN_DIR)/openwrt-$(BOARD)-$(KERNEL)-$(3)-$(2).trx
+       $(call Image/Build/Loader,loader-$(2),gz,0x80500000,0)
+       $(call Image/Build/TRXNoloader,$(IMGNAME)-$(3)-$(2).trx,$(1))
+       #TODO: firmware generation tool needed
 endef
 
 define Image/Build
-       $(STAGING_DIR)/bin/trx -o $(BIN_DIR)/openwrt-$(BOARD)-$(KERNEL)-$(1)-noloader.trx -f $(KDIR)/vmlinux.lzma $(call trxalign/$(1)) -f $(KDIR)/root.$(1)
-ifneq ($(1),jffs2-128K)
-       #FIXME: firware images yet
-endif
+       #FIXME: No firmware images yet
 endef
 
 define Image/Build/LZMAKernel
-       $(CP) $(KDIR)/loader-vmlinux-lzma-$(2).$(3) \
-           $(BIN_DIR)/openwrt-$(BOARD)-$(KERNEL)-vmlinux-lzma-$(1).$(3)
+       $(LOADER_MAKE) TARGET_DIR=$(BIN_DIR) \
+               LOADER=openwrt-$(BOARD)-$(KERNEL)-ramfs-lzma-$(1).$(2) \
+               LOADER_DATA=$(KDIR)/vmlinux.lzma \
+               LZMA_TEXT_START=$(3) LZMA_STARTUP_ORG=$(4) \
+               CONFIG_PASS_KARGS=$(5) CONFIG_BOARD=$(6) \
+               compile loader.$(2)
+endef
+
+define Image/Build/LZMAKernel/ZyXEL
+       $(call Image/Build/LZMAKernel,$(1),$(2),0x80500000,0,y,$(1))
 endef
 
 define Image/Build/Initramfs
-       $(call Image/Build/LZMAKernel,p-334wt,zyxel,bin)
-       $(call Image/Build/LZMAKernel,p-335wt,zyxel,bin)
+       $(call Image/Build/LZMAKernel/Generic,p-334wt,bin)
+       $(call Image/Build/LZMAKernel/Generic,p-335,bin)
 endef
 
 $(eval $(call BuildImage))