move target/image/platform to target/linux/platform/image platform directories are now self contained
SVN-Revision: 5669
This commit is contained in:
102
target/linux/ar7-2.4/image/Makefile
Normal file
102
target/linux/ar7-2.4/image/Makefile
Normal file
@@ -0,0 +1,102 @@
|
||||
#
|
||||
# Copyright (C) 2006 OpenWrt.org
|
||||
#
|
||||
# This is free software, licensed under the GNU General Public License v2.
|
||||
# See /LICENSE for more information.
|
||||
#
|
||||
include $(TOPDIR)/rules.mk
|
||||
include $(INCLUDE_DIR)/image.mk
|
||||
|
||||
PKG_BUILD_DIR:=$(BUILD_DIR)/ar7loader
|
||||
|
||||
LOADADDR := 0x94020000
|
||||
OUTPUT_FORMAT := elf32-tradlittlemips
|
||||
|
||||
CFLAGS := -D__KERNEL__ -Wall -Wstrict-prototypes -Wno-trigraphs -Os \
|
||||
-fno-strict-aliasing -fno-common -fomit-frame-pointer -G 0 -mno-abicalls -fno-pic \
|
||||
-pipe -mlong-calls -fno-common \
|
||||
-mabi=32 -march=mips32 -Wa,-32 -Wa,-march=mips32 -Wa,-mips32 -Wa,--trap \
|
||||
-DLOADADDR=$(LOADADDR)
|
||||
|
||||
$(PKG_BUILD_DIR)/cksum.o: $(PKG_BUILD_DIR)/cksum.c
|
||||
$(HOSTCC) -o $@ $<
|
||||
|
||||
$(PKG_BUILD_DIR)/ckmain.o: $(PKG_BUILD_DIR)/ckmain.c
|
||||
$(HOSTCC) -o $@ $<
|
||||
|
||||
$(PKG_BUILD_DIR)/tichksum: $(PKG_BUILD_DIR)/ckmain.o $(PKG_BUILD_DIR)/cksum.o
|
||||
$(HOSTCC) -o $@ $<
|
||||
|
||||
$(PKG_BUILD_DIR)/LzmaDecode.o: src/LzmaDecode.c
|
||||
$(TARGET_CC) $(CFLAGS) -c -o $@ $<
|
||||
|
||||
$(PKG_BUILD_DIR)/loader.o: src/loader.c
|
||||
$(TARGET_CC) $(CFLAGS) -c -o $@ $<
|
||||
|
||||
$(STAGING_DIR)/bin/srec2bin: src/srec2bin.c
|
||||
$(HOSTCC) -o $@ $<
|
||||
|
||||
|
||||
define Build/Compile
|
||||
mkdir -p $(PKG_BUILD_DIR)
|
||||
sed -e 's/@@OUTPUT_FORMAT@@/$(OUTPUT_FORMAT)/' \
|
||||
-e 's/@@LOADADDR@@/$(LOADADDR)/' \
|
||||
< src/zimage.script.in \
|
||||
> $(PKG_BUILD_DIR)/zimage.script
|
||||
sed -e 's/@@OUTPUT_FORMAT@@/$(OUTPUT_FORMAT)/' \
|
||||
-e 's/@@LOADADDR@@/$(LOADADDR)/' \
|
||||
< src/ld.script.in \
|
||||
> $(PKG_BUILD_DIR)/ld.script
|
||||
$(MAKE) $(PKG_BUILD_DIR)/loader.o $(PKG_BUILD_DIR)/LzmaDecode.o $(STAGING_DIR)/bin/srec2bin
|
||||
endef
|
||||
|
||||
define Build/Clean
|
||||
rm -rf $(PKG_BUILD_DIR)
|
||||
endef
|
||||
|
||||
define Image/Prepare
|
||||
cat $(KDIR)/vmlinux | $(STAGING_DIR)/bin/lzma e -si -so -eos -lc1 -lp2 -pb2 > $(KDIR)/vmlinux.lzma
|
||||
$(TARGET_CROSS)ld -T $(PKG_BUILD_DIR)/zimage.script -r -b binary $(KDIR)/vmlinux.lzma -o $(KDIR)/zimage.o
|
||||
$(TARGET_CROSS)ld -static -G 0 --defsym kernel_entry=0x$${shell $(TARGET_CROSS)nm $(KDIR)/linux-*/vmlinux | grep kernel_entry | cut -d' ' -f1} -T $(PKG_BUILD_DIR)/ld.script \
|
||||
$(PKG_BUILD_DIR)/loader.o \
|
||||
$(PKG_BUILD_DIR)/LzmaDecode.o \
|
||||
$(KDIR)/zimage.o \
|
||||
-o $(KDIR)/loader
|
||||
$(TARGET_CROSS)objcopy -O srec $(KDIR)/loader $(KDIR)/ram_zimage.sre
|
||||
$(STAGING_DIR)/bin/srec2bin $(KDIR)/ram_zimage.sre $(KDIR)/vmlinux.bin
|
||||
endef
|
||||
|
||||
define align/jffs2-64k
|
||||
bs=65536 conv=sync
|
||||
endef
|
||||
|
||||
define align/jffs2-128k
|
||||
bs=131072 conv=sync
|
||||
endef
|
||||
|
||||
define Image/Build/CyberTAN
|
||||
(dd if=/dev/zero bs=16 count=1; cat $(BIN_DIR)/openwrt-$(BOARD)-$(KERNEL)-$(1).bin) | \
|
||||
$(STAGING_DIR)/bin/addpattern -p $(3) -o $(BIN_DIR)/openwrt-$(2)-$(KERNEL)-$(4).bin
|
||||
endef
|
||||
|
||||
define Image/Build/sErCoMm
|
||||
cat sercomm/adam2.bin "$(BIN_DIR)/openwrt-$(BOARD)-$(KERNEL)-$(1).bin" > "$(BIN_DIR)/openwrt-$(2)-$(KERNEL)-$(3).img"
|
||||
dd if=sercomm/$(2) of="$(KDIR)/dgfw.tmp" bs=$$$$((0x3e0000 - 80)) seek=1 conv=notrunc
|
||||
$(STAGING_DIR)/bin/dgfirmware -f -w "$(BIN_DIR)/openwrt-$(2)-$(KERNEL)-$(3).img" "$(KDIR)/dgfw.tmp"
|
||||
rm -f "$(KDIR)/dgfw.tmp"
|
||||
endef
|
||||
|
||||
define Image/Build
|
||||
dd if=$(KDIR)/vmlinux.bin $(call align/$(1)) > $(BIN_DIR)/openwrt-$(BOARD)-$(KERNEL)-$(1).bin
|
||||
cat $(BUILD_DIR)/linux-$(KERNEL)-$(BOARD)/root.$(1) >> $(BIN_DIR)/openwrt-$(BOARD)-$(KERNEL)-$(1).bin
|
||||
$(call Image/Build/CyberTAN,$(1),AG1B,AG1B,$(1))
|
||||
$(call Image/Build/CyberTAN,$(1),WA21,WA21,$(1))
|
||||
$(call Image/Build/CyberTAN,$(1),WA22,WA22,$(1))
|
||||
$(call Image/Build/CyberTAN,$(1),WAG2,WAG2,$(1))
|
||||
$(call Image/Build/CyberTAN,$(1),WA31,WA31 -b,$(1))
|
||||
$(call Image/Build/CyberTAN,$(1),WA32,WA32 -b,$(1))
|
||||
$(call Image/Build/sErCoMm,$(1),dg834,$(1))
|
||||
$(call Image/Build/sErCoMm,$(1),jdr454wb,$(1))
|
||||
endef
|
||||
|
||||
$(eval $(call BuildImage))
|
||||
BIN
target/linux/ar7-2.4/image/sercomm/adam2.bin
Normal file
BIN
target/linux/ar7-2.4/image/sercomm/adam2.bin
Normal file
Binary file not shown.
BIN
target/linux/ar7-2.4/image/sercomm/dg834
Normal file
BIN
target/linux/ar7-2.4/image/sercomm/dg834
Normal file
Binary file not shown.
BIN
target/linux/ar7-2.4/image/sercomm/jdr454wb
Normal file
BIN
target/linux/ar7-2.4/image/sercomm/jdr454wb
Normal file
Binary file not shown.
663
target/linux/ar7-2.4/image/src/LzmaDecode.c
Normal file
663
target/linux/ar7-2.4/image/src/LzmaDecode.c
Normal file
@@ -0,0 +1,663 @@
|
||||
/*
|
||||
LzmaDecode.c
|
||||
LZMA Decoder
|
||||
|
||||
LZMA SDK 4.05 Copyright (c) 1999-2004 Igor Pavlov (2004-08-25)
|
||||
http://www.7-zip.org/
|
||||
|
||||
LZMA SDK is licensed under two licenses:
|
||||
1) GNU Lesser General Public License (GNU LGPL)
|
||||
2) Common Public License (CPL)
|
||||
It means that you can select one of these two licenses and
|
||||
follow rules of that license.
|
||||
|
||||
SPECIAL EXCEPTION:
|
||||
Igor Pavlov, as the author of this code, expressly permits you to
|
||||
statically or dynamically link your code (or bind by name) to the
|
||||
interfaces of this file without subjecting your linked code to the
|
||||
terms of the CPL or GNU LGPL. Any modifications or additions
|
||||
to this file, however, are subject to the LGPL or CPL terms.
|
||||
*/
|
||||
|
||||
#include "LzmaDecode.h"
|
||||
|
||||
#ifndef Byte
|
||||
#define Byte unsigned char
|
||||
#endif
|
||||
|
||||
#define kNumTopBits 24
|
||||
#define kTopValue ((UInt32)1 << kNumTopBits)
|
||||
|
||||
#define kNumBitModelTotalBits 11
|
||||
#define kBitModelTotal (1 << kNumBitModelTotalBits)
|
||||
#define kNumMoveBits 5
|
||||
|
||||
typedef struct _CRangeDecoder
|
||||
{
|
||||
Byte *Buffer;
|
||||
Byte *BufferLim;
|
||||
UInt32 Range;
|
||||
UInt32 Code;
|
||||
#ifdef _LZMA_IN_CB
|
||||
ILzmaInCallback *InCallback;
|
||||
int Result;
|
||||
#endif
|
||||
int ExtraBytes;
|
||||
} CRangeDecoder;
|
||||
|
||||
Byte RangeDecoderReadByte(CRangeDecoder *rd)
|
||||
{
|
||||
if (rd->Buffer == rd->BufferLim)
|
||||
{
|
||||
#ifdef _LZMA_IN_CB
|
||||
UInt32 size;
|
||||
rd->Result = rd->InCallback->Read(rd->InCallback, &rd->Buffer, &size);
|
||||
rd->BufferLim = rd->Buffer + size;
|
||||
if (size == 0)
|
||||
#endif
|
||||
{
|
||||
rd->ExtraBytes = 1;
|
||||
return 0xFF;
|
||||
}
|
||||
}
|
||||
return (*rd->Buffer++);
|
||||
}
|
||||
|
||||
/* #define ReadByte (*rd->Buffer++) */
|
||||
#define ReadByte (RangeDecoderReadByte(rd))
|
||||
|
||||
void RangeDecoderInit(CRangeDecoder *rd,
|
||||
#ifdef _LZMA_IN_CB
|
||||
ILzmaInCallback *inCallback
|
||||
#else
|
||||
Byte *stream, UInt32 bufferSize
|
||||
#endif
|
||||
)
|
||||
{
|
||||
int i;
|
||||
#ifdef _LZMA_IN_CB
|
||||
rd->InCallback = inCallback;
|
||||
rd->Buffer = rd->BufferLim = 0;
|
||||
#else
|
||||
rd->Buffer = stream;
|
||||
rd->BufferLim = stream + bufferSize;
|
||||
#endif
|
||||
rd->ExtraBytes = 0;
|
||||
rd->Code = 0;
|
||||
rd->Range = (0xFFFFFFFF);
|
||||
for(i = 0; i < 5; i++)
|
||||
rd->Code = (rd->Code << 8) | ReadByte;
|
||||
}
|
||||
|
||||
#define RC_INIT_VAR UInt32 range = rd->Range; UInt32 code = rd->Code;
|
||||
#define RC_FLUSH_VAR rd->Range = range; rd->Code = code;
|
||||
#define RC_NORMALIZE if (range < kTopValue) { range <<= 8; code = (code << 8) | ReadByte; }
|
||||
|
||||
UInt32 RangeDecoderDecodeDirectBits(CRangeDecoder *rd, int numTotalBits)
|
||||
{
|
||||
RC_INIT_VAR
|
||||
UInt32 result = 0;
|
||||
int i;
|
||||
for (i = numTotalBits; i > 0; i--)
|
||||
{
|
||||
/* UInt32 t; */
|
||||
range >>= 1;
|
||||
|
||||
result <<= 1;
|
||||
if (code >= range)
|
||||
{
|
||||
code -= range;
|
||||
result |= 1;
|
||||
}
|
||||
/*
|
||||
t = (code - range) >> 31;
|
||||
t &= 1;
|
||||
code -= range & (t - 1);
|
||||
result = (result + result) | (1 - t);
|
||||
*/
|
||||
RC_NORMALIZE
|
||||
}
|
||||
RC_FLUSH_VAR
|
||||
return result;
|
||||
}
|
||||
|
||||
int RangeDecoderBitDecode(CProb *prob, CRangeDecoder *rd)
|
||||
{
|
||||
UInt32 bound = (rd->Range >> kNumBitModelTotalBits) * *prob;
|
||||
if (rd->Code < bound)
|
||||
{
|
||||
rd->Range = bound;
|
||||
*prob += (kBitModelTotal - *prob) >> kNumMoveBits;
|
||||
if (rd->Range < kTopValue)
|
||||
{
|
||||
rd->Code = (rd->Code << 8) | ReadByte;
|
||||
rd->Range <<= 8;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
else
|
||||
{
|
||||
rd->Range -= bound;
|
||||
rd->Code -= bound;
|
||||
*prob -= (*prob) >> kNumMoveBits;
|
||||
if (rd->Range < kTopValue)
|
||||
{
|
||||
rd->Code = (rd->Code << 8) | ReadByte;
|
||||
rd->Range <<= 8;
|
||||
}
|
||||
return 1;
|
||||
}
|
||||
}
|
||||
|
||||
#define RC_GET_BIT2(prob, mi, A0, A1) \
|
||||
UInt32 bound = (range >> kNumBitModelTotalBits) * *prob; \
|
||||
if (code < bound) \
|
||||
{ A0; range = bound; *prob += (kBitModelTotal - *prob) >> kNumMoveBits; mi <<= 1; } \
|
||||
else \
|
||||
{ A1; range -= bound; code -= bound; *prob -= (*prob) >> kNumMoveBits; mi = (mi + mi) + 1; } \
|
||||
RC_NORMALIZE
|
||||
|
||||
#define RC_GET_BIT(prob, mi) RC_GET_BIT2(prob, mi, ; , ;)
|
||||
|
||||
int RangeDecoderBitTreeDecode(CProb *probs, int numLevels, CRangeDecoder *rd)
|
||||
{
|
||||
int mi = 1;
|
||||
int i;
|
||||
#ifdef _LZMA_LOC_OPT
|
||||
RC_INIT_VAR
|
||||
#endif
|
||||
for(i = numLevels; i > 0; i--)
|
||||
{
|
||||
#ifdef _LZMA_LOC_OPT
|
||||
CProb *prob = probs + mi;
|
||||
RC_GET_BIT(prob, mi)
|
||||
#else
|
||||
mi = (mi + mi) + RangeDecoderBitDecode(probs + mi, rd);
|
||||
#endif
|
||||
}
|
||||
#ifdef _LZMA_LOC_OPT
|
||||
RC_FLUSH_VAR
|
||||
#endif
|
||||
return mi - (1 << numLevels);
|
||||
}
|
||||
|
||||
int RangeDecoderReverseBitTreeDecode(CProb *probs, int numLevels, CRangeDecoder *rd)
|
||||
{
|
||||
int mi = 1;
|
||||
int i;
|
||||
int symbol = 0;
|
||||
#ifdef _LZMA_LOC_OPT
|
||||
RC_INIT_VAR
|
||||
#endif
|
||||
for(i = 0; i < numLevels; i++)
|
||||
{
|
||||
#ifdef _LZMA_LOC_OPT
|
||||
CProb *prob = probs + mi;
|
||||
RC_GET_BIT2(prob, mi, ; , symbol |= (1 << i))
|
||||
#else
|
||||
int bit = RangeDecoderBitDecode(probs + mi, rd);
|
||||
mi = mi + mi + bit;
|
||||
symbol |= (bit << i);
|
||||
#endif
|
||||
}
|
||||
#ifdef _LZMA_LOC_OPT
|
||||
RC_FLUSH_VAR
|
||||
#endif
|
||||
return symbol;
|
||||
}
|
||||
|
||||
Byte LzmaLiteralDecode(CProb *probs, CRangeDecoder *rd)
|
||||
{
|
||||
int symbol = 1;
|
||||
#ifdef _LZMA_LOC_OPT
|
||||
RC_INIT_VAR
|
||||
#endif
|
||||
do
|
||||
{
|
||||
#ifdef _LZMA_LOC_OPT
|
||||
CProb *prob = probs + symbol;
|
||||
RC_GET_BIT(prob, symbol)
|
||||
#else
|
||||
symbol = (symbol + symbol) | RangeDecoderBitDecode(probs + symbol, rd);
|
||||
#endif
|
||||
}
|
||||
while (symbol < 0x100);
|
||||
#ifdef _LZMA_LOC_OPT
|
||||
RC_FLUSH_VAR
|
||||
#endif
|
||||
return symbol;
|
||||
}
|
||||
|
||||
Byte LzmaLiteralDecodeMatch(CProb *probs, CRangeDecoder *rd, Byte matchByte)
|
||||
{
|
||||
int symbol = 1;
|
||||
#ifdef _LZMA_LOC_OPT
|
||||
RC_INIT_VAR
|
||||
#endif
|
||||
do
|
||||
{
|
||||
int bit;
|
||||
int matchBit = (matchByte >> 7) & 1;
|
||||
matchByte <<= 1;
|
||||
#ifdef _LZMA_LOC_OPT
|
||||
{
|
||||
CProb *prob = probs + ((1 + matchBit) << 8) + symbol;
|
||||
RC_GET_BIT2(prob, symbol, bit = 0, bit = 1)
|
||||
}
|
||||
#else
|
||||
bit = RangeDecoderBitDecode(probs + ((1 + matchBit) << 8) + symbol, rd);
|
||||
symbol = (symbol << 1) | bit;
|
||||
#endif
|
||||
if (matchBit != bit)
|
||||
{
|
||||
while (symbol < 0x100)
|
||||
{
|
||||
#ifdef _LZMA_LOC_OPT
|
||||
CProb *prob = probs + symbol;
|
||||
RC_GET_BIT(prob, symbol)
|
||||
#else
|
||||
symbol = (symbol + symbol) | RangeDecoderBitDecode(probs + symbol, rd);
|
||||
#endif
|
||||
}
|
||||
break;
|
||||
}
|
||||
}
|
||||
while (symbol < 0x100);
|
||||
#ifdef _LZMA_LOC_OPT
|
||||
RC_FLUSH_VAR
|
||||
#endif
|
||||
return symbol;
|
||||
}
|
||||
|
||||
#define kNumPosBitsMax 4
|
||||
#define kNumPosStatesMax (1 << kNumPosBitsMax)
|
||||
|
||||
#define kLenNumLowBits 3
|
||||
#define kLenNumLowSymbols (1 << kLenNumLowBits)
|
||||
#define kLenNumMidBits 3
|
||||
#define kLenNumMidSymbols (1 << kLenNumMidBits)
|
||||
#define kLenNumHighBits 8
|
||||
#define kLenNumHighSymbols (1 << kLenNumHighBits)
|
||||
|
||||
#define LenChoice 0
|
||||
#define LenChoice2 (LenChoice + 1)
|
||||
#define LenLow (LenChoice2 + 1)
|
||||
#define LenMid (LenLow + (kNumPosStatesMax << kLenNumLowBits))
|
||||
#define LenHigh (LenMid + (kNumPosStatesMax << kLenNumMidBits))
|
||||
#define kNumLenProbs (LenHigh + kLenNumHighSymbols)
|
||||
|
||||
int LzmaLenDecode(CProb *p, CRangeDecoder *rd, int posState)
|
||||
{
|
||||
if(RangeDecoderBitDecode(p + LenChoice, rd) == 0)
|
||||
return RangeDecoderBitTreeDecode(p + LenLow +
|
||||
(posState << kLenNumLowBits), kLenNumLowBits, rd);
|
||||
if(RangeDecoderBitDecode(p + LenChoice2, rd) == 0)
|
||||
return kLenNumLowSymbols + RangeDecoderBitTreeDecode(p + LenMid +
|
||||
(posState << kLenNumMidBits), kLenNumMidBits, rd);
|
||||
return kLenNumLowSymbols + kLenNumMidSymbols +
|
||||
RangeDecoderBitTreeDecode(p + LenHigh, kLenNumHighBits, rd);
|
||||
}
|
||||
|
||||
#define kNumStates 12
|
||||
|
||||
#define kStartPosModelIndex 4
|
||||
#define kEndPosModelIndex 14
|
||||
#define kNumFullDistances (1 << (kEndPosModelIndex >> 1))
|
||||
|
||||
#define kNumPosSlotBits 6
|
||||
#define kNumLenToPosStates 4
|
||||
|
||||
#define kNumAlignBits 4
|
||||
#define kAlignTableSize (1 << kNumAlignBits)
|
||||
|
||||
#define kMatchMinLen 2
|
||||
|
||||
#define IsMatch 0
|
||||
#define IsRep (IsMatch + (kNumStates << kNumPosBitsMax))
|
||||
#define IsRepG0 (IsRep + kNumStates)
|
||||
#define IsRepG1 (IsRepG0 + kNumStates)
|
||||
#define IsRepG2 (IsRepG1 + kNumStates)
|
||||
#define IsRep0Long (IsRepG2 + kNumStates)
|
||||
#define PosSlot (IsRep0Long + (kNumStates << kNumPosBitsMax))
|
||||
#define SpecPos (PosSlot + (kNumLenToPosStates << kNumPosSlotBits))
|
||||
#define Align (SpecPos + kNumFullDistances - kEndPosModelIndex)
|
||||
#define LenCoder (Align + kAlignTableSize)
|
||||
#define RepLenCoder (LenCoder + kNumLenProbs)
|
||||
#define Literal (RepLenCoder + kNumLenProbs)
|
||||
|
||||
#if Literal != LZMA_BASE_SIZE
|
||||
StopCompilingDueBUG
|
||||
#endif
|
||||
|
||||
#ifdef _LZMA_OUT_READ
|
||||
|
||||
typedef struct _LzmaVarState
|
||||
{
|
||||
CRangeDecoder RangeDecoder;
|
||||
Byte *Dictionary;
|
||||
UInt32 DictionarySize;
|
||||
UInt32 DictionaryPos;
|
||||
UInt32 GlobalPos;
|
||||
UInt32 Reps[4];
|
||||
int lc;
|
||||
int lp;
|
||||
int pb;
|
||||
int State;
|
||||
int PreviousIsMatch;
|
||||
int RemainLen;
|
||||
} LzmaVarState;
|
||||
|
||||
int LzmaDecoderInit(
|
||||
unsigned char *buffer, UInt32 bufferSize,
|
||||
int lc, int lp, int pb,
|
||||
unsigned char *dictionary, UInt32 dictionarySize,
|
||||
#ifdef _LZMA_IN_CB
|
||||
ILzmaInCallback *inCallback
|
||||
#else
|
||||
unsigned char *inStream, UInt32 inSize
|
||||
#endif
|
||||
)
|
||||
{
|
||||
LzmaVarState *vs = (LzmaVarState *)buffer;
|
||||
CProb *p = (CProb *)(buffer + sizeof(LzmaVarState));
|
||||
UInt32 numProbs = Literal + ((UInt32)LZMA_LIT_SIZE << (lc + lp));
|
||||
UInt32 i;
|
||||
if (bufferSize < numProbs * sizeof(CProb) + sizeof(LzmaVarState))
|
||||
return LZMA_RESULT_NOT_ENOUGH_MEM;
|
||||
vs->Dictionary = dictionary;
|
||||
vs->DictionarySize = dictionarySize;
|
||||
vs->DictionaryPos = 0;
|
||||
vs->GlobalPos = 0;
|
||||
vs->Reps[0] = vs->Reps[1] = vs->Reps[2] = vs->Reps[3] = 1;
|
||||
vs->lc = lc;
|
||||
vs->lp = lp;
|
||||
vs->pb = pb;
|
||||
vs->State = 0;
|
||||
vs->PreviousIsMatch = 0;
|
||||
vs->RemainLen = 0;
|
||||
dictionary[dictionarySize - 1] = 0;
|
||||
for (i = 0; i < numProbs; i++)
|
||||
p[i] = kBitModelTotal >> 1;
|
||||
RangeDecoderInit(&vs->RangeDecoder,
|
||||
#ifdef _LZMA_IN_CB
|
||||
inCallback
|
||||
#else
|
||||
inStream, inSize
|
||||
#endif
|
||||
);
|
||||
return LZMA_RESULT_OK;
|
||||
}
|
||||
|
||||
int LzmaDecode(unsigned char *buffer,
|
||||
unsigned char *outStream, UInt32 outSize,
|
||||
UInt32 *outSizeProcessed)
|
||||
{
|
||||
LzmaVarState *vs = (LzmaVarState *)buffer;
|
||||
CProb *p = (CProb *)(buffer + sizeof(LzmaVarState));
|
||||
CRangeDecoder rd = vs->RangeDecoder;
|
||||
int state = vs->State;
|
||||
int previousIsMatch = vs->PreviousIsMatch;
|
||||
Byte previousByte;
|
||||
UInt32 rep0 = vs->Reps[0], rep1 = vs->Reps[1], rep2 = vs->Reps[2], rep3 = vs->Reps[3];
|
||||
UInt32 nowPos = 0;
|
||||
UInt32 posStateMask = (1 << (vs->pb)) - 1;
|
||||
UInt32 literalPosMask = (1 << (vs->lp)) - 1;
|
||||
int lc = vs->lc;
|
||||
int len = vs->RemainLen;
|
||||
UInt32 globalPos = vs->GlobalPos;
|
||||
|
||||
Byte *dictionary = vs->Dictionary;
|
||||
UInt32 dictionarySize = vs->DictionarySize;
|
||||
UInt32 dictionaryPos = vs->DictionaryPos;
|
||||
|
||||
if (len == -1)
|
||||
{
|
||||
*outSizeProcessed = 0;
|
||||
return LZMA_RESULT_OK;
|
||||
}
|
||||
|
||||
while(len > 0 && nowPos < outSize)
|
||||
{
|
||||
UInt32 pos = dictionaryPos - rep0;
|
||||
if (pos >= dictionarySize)
|
||||
pos += dictionarySize;
|
||||
outStream[nowPos++] = dictionary[dictionaryPos] = dictionary[pos];
|
||||
if (++dictionaryPos == dictionarySize)
|
||||
dictionaryPos = 0;
|
||||
len--;
|
||||
}
|
||||
if (dictionaryPos == 0)
|
||||
previousByte = dictionary[dictionarySize - 1];
|
||||
else
|
||||
previousByte = dictionary[dictionaryPos - 1];
|
||||
#else
|
||||
|
||||
int LzmaDecode(
|
||||
Byte *buffer, UInt32 bufferSize,
|
||||
int lc, int lp, int pb,
|
||||
#ifdef _LZMA_IN_CB
|
||||
ILzmaInCallback *inCallback,
|
||||
#else
|
||||
unsigned char *inStream, UInt32 inSize,
|
||||
#endif
|
||||
unsigned char *outStream, UInt32 outSize,
|
||||
UInt32 *outSizeProcessed)
|
||||
{
|
||||
UInt32 numProbs = Literal + ((UInt32)LZMA_LIT_SIZE << (lc + lp));
|
||||
CProb *p = (CProb *)buffer;
|
||||
CRangeDecoder rd;
|
||||
UInt32 i;
|
||||
int state = 0;
|
||||
int previousIsMatch = 0;
|
||||
Byte previousByte = 0;
|
||||
UInt32 rep0 = 1, rep1 = 1, rep2 = 1, rep3 = 1;
|
||||
UInt32 nowPos = 0;
|
||||
UInt32 posStateMask = (1 << pb) - 1;
|
||||
UInt32 literalPosMask = (1 << lp) - 1;
|
||||
int len = 0;
|
||||
if (bufferSize < numProbs * sizeof(CProb))
|
||||
return LZMA_RESULT_NOT_ENOUGH_MEM;
|
||||
for (i = 0; i < numProbs; i++)
|
||||
p[i] = kBitModelTotal >> 1;
|
||||
RangeDecoderInit(&rd,
|
||||
#ifdef _LZMA_IN_CB
|
||||
inCallback
|
||||
#else
|
||||
inStream, inSize
|
||||
#endif
|
||||
);
|
||||
#endif
|
||||
|
||||
*outSizeProcessed = 0;
|
||||
while(nowPos < outSize)
|
||||
{
|
||||
int posState = (int)(
|
||||
(nowPos
|
||||
#ifdef _LZMA_OUT_READ
|
||||
+ globalPos
|
||||
#endif
|
||||
)
|
||||
& posStateMask);
|
||||
#ifdef _LZMA_IN_CB
|
||||
if (rd.Result != LZMA_RESULT_OK)
|
||||
return rd.Result;
|
||||
#endif
|
||||
if (rd.ExtraBytes != 0)
|
||||
return LZMA_RESULT_DATA_ERROR;
|
||||
if (RangeDecoderBitDecode(p + IsMatch + (state << kNumPosBitsMax) + posState, &rd) == 0)
|
||||
{
|
||||
CProb *probs = p + Literal + (LZMA_LIT_SIZE *
|
||||
(((
|
||||
(nowPos
|
||||
#ifdef _LZMA_OUT_READ
|
||||
+ globalPos
|
||||
#endif
|
||||
)
|
||||
& literalPosMask) << lc) + (previousByte >> (8 - lc))));
|
||||
|
||||
if (state < 4) state = 0;
|
||||
else if (state < 10) state -= 3;
|
||||
else state -= 6;
|
||||
if (previousIsMatch)
|
||||
{
|
||||
Byte matchByte;
|
||||
#ifdef _LZMA_OUT_READ
|
||||
UInt32 pos = dictionaryPos - rep0;
|
||||
if (pos >= dictionarySize)
|
||||
pos += dictionarySize;
|
||||
matchByte = dictionary[pos];
|
||||
#else
|
||||
matchByte = outStream[nowPos - rep0];
|
||||
#endif
|
||||
previousByte = LzmaLiteralDecodeMatch(probs, &rd, matchByte);
|
||||
previousIsMatch = 0;
|
||||
}
|
||||
else
|
||||
previousByte = LzmaLiteralDecode(probs, &rd);
|
||||
outStream[nowPos++] = previousByte;
|
||||
#ifdef _LZMA_OUT_READ
|
||||
dictionary[dictionaryPos] = previousByte;
|
||||
if (++dictionaryPos == dictionarySize)
|
||||
dictionaryPos = 0;
|
||||
#endif
|
||||
}
|
||||
else
|
||||
{
|
||||
previousIsMatch = 1;
|
||||
if (RangeDecoderBitDecode(p + IsRep + state, &rd) == 1)
|
||||
{
|
||||
if (RangeDecoderBitDecode(p + IsRepG0 + state, &rd) == 0)
|
||||
{
|
||||
if (RangeDecoderBitDecode(p + IsRep0Long + (state << kNumPosBitsMax) + posState, &rd) == 0)
|
||||
{
|
||||
#ifdef _LZMA_OUT_READ
|
||||
UInt32 pos;
|
||||
#endif
|
||||
if (
|
||||
(nowPos
|
||||
#ifdef _LZMA_OUT_READ
|
||||
+ globalPos
|
||||
#endif
|
||||
)
|
||||
== 0)
|
||||
return LZMA_RESULT_DATA_ERROR;
|
||||
state = state < 7 ? 9 : 11;
|
||||
#ifdef _LZMA_OUT_READ
|
||||
pos = dictionaryPos - rep0;
|
||||
if (pos >= dictionarySize)
|
||||
pos += dictionarySize;
|
||||
previousByte = dictionary[pos];
|
||||
dictionary[dictionaryPos] = previousByte;
|
||||
if (++dictionaryPos == dictionarySize)
|
||||
dictionaryPos = 0;
|
||||
#else
|
||||
previousByte = outStream[nowPos - rep0];
|
||||
#endif
|
||||
outStream[nowPos++] = previousByte;
|
||||
continue;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
UInt32 distance;
|
||||
if(RangeDecoderBitDecode(p + IsRepG1 + state, &rd) == 0)
|
||||
distance = rep1;
|
||||
else
|
||||
{
|
||||
if(RangeDecoderBitDecode(p + IsRepG2 + state, &rd) == 0)
|
||||
distance = rep2;
|
||||
else
|
||||
{
|
||||
distance = rep3;
|
||||
rep3 = rep2;
|
||||
}
|
||||
rep2 = rep1;
|
||||
}
|
||||
rep1 = rep0;
|
||||
rep0 = distance;
|
||||
}
|
||||
len = LzmaLenDecode(p + RepLenCoder, &rd, posState);
|
||||
state = state < 7 ? 8 : 11;
|
||||
}
|
||||
else
|
||||
{
|
||||
int posSlot;
|
||||
rep3 = rep2;
|
||||
rep2 = rep1;
|
||||
rep1 = rep0;
|
||||
state = state < 7 ? 7 : 10;
|
||||
len = LzmaLenDecode(p + LenCoder, &rd, posState);
|
||||
posSlot = RangeDecoderBitTreeDecode(p + PosSlot +
|
||||
((len < kNumLenToPosStates ? len : kNumLenToPosStates - 1) <<
|
||||
kNumPosSlotBits), kNumPosSlotBits, &rd);
|
||||
if (posSlot >= kStartPosModelIndex)
|
||||
{
|
||||
int numDirectBits = ((posSlot >> 1) - 1);
|
||||
rep0 = ((2 | ((UInt32)posSlot & 1)) << numDirectBits);
|
||||
if (posSlot < kEndPosModelIndex)
|
||||
{
|
||||
rep0 += RangeDecoderReverseBitTreeDecode(
|
||||
p + SpecPos + rep0 - posSlot - 1, numDirectBits, &rd);
|
||||
}
|
||||
else
|
||||
{
|
||||
rep0 += RangeDecoderDecodeDirectBits(&rd,
|
||||
numDirectBits - kNumAlignBits) << kNumAlignBits;
|
||||
rep0 += RangeDecoderReverseBitTreeDecode(p + Align, kNumAlignBits, &rd);
|
||||
}
|
||||
}
|
||||
else
|
||||
rep0 = posSlot;
|
||||
rep0++;
|
||||
}
|
||||
if (rep0 == (UInt32)(0))
|
||||
{
|
||||
/* it's for stream version */
|
||||
len = -1;
|
||||
break;
|
||||
}
|
||||
if (rep0 > nowPos
|
||||
#ifdef _LZMA_OUT_READ
|
||||
+ globalPos
|
||||
#endif
|
||||
)
|
||||
{
|
||||
return LZMA_RESULT_DATA_ERROR;
|
||||
}
|
||||
len += kMatchMinLen;
|
||||
do
|
||||
{
|
||||
#ifdef _LZMA_OUT_READ
|
||||
UInt32 pos = dictionaryPos - rep0;
|
||||
if (pos >= dictionarySize)
|
||||
pos += dictionarySize;
|
||||
previousByte = dictionary[pos];
|
||||
dictionary[dictionaryPos] = previousByte;
|
||||
if (++dictionaryPos == dictionarySize)
|
||||
dictionaryPos = 0;
|
||||
#else
|
||||
previousByte = outStream[nowPos - rep0];
|
||||
#endif
|
||||
outStream[nowPos++] = previousByte;
|
||||
len--;
|
||||
}
|
||||
while(len > 0 && nowPos < outSize);
|
||||
}
|
||||
}
|
||||
|
||||
#ifdef _LZMA_OUT_READ
|
||||
vs->RangeDecoder = rd;
|
||||
vs->DictionaryPos = dictionaryPos;
|
||||
vs->GlobalPos = globalPos + nowPos;
|
||||
vs->Reps[0] = rep0;
|
||||
vs->Reps[1] = rep1;
|
||||
vs->Reps[2] = rep2;
|
||||
vs->Reps[3] = rep3;
|
||||
vs->State = state;
|
||||
vs->PreviousIsMatch = previousIsMatch;
|
||||
vs->RemainLen = len;
|
||||
#endif
|
||||
|
||||
*outSizeProcessed = nowPos;
|
||||
return LZMA_RESULT_OK;
|
||||
}
|
||||
100
target/linux/ar7-2.4/image/src/LzmaDecode.h
Normal file
100
target/linux/ar7-2.4/image/src/LzmaDecode.h
Normal file
@@ -0,0 +1,100 @@
|
||||
/*
|
||||
LzmaDecode.h
|
||||
LZMA Decoder interface
|
||||
|
||||
LZMA SDK 4.05 Copyright (c) 1999-2004 Igor Pavlov (2004-08-25)
|
||||
http://www.7-zip.org/
|
||||
|
||||
LZMA SDK is licensed under two licenses:
|
||||
1) GNU Lesser General Public License (GNU LGPL)
|
||||
2) Common Public License (CPL)
|
||||
It means that you can select one of these two licenses and
|
||||
follow rules of that license.
|
||||
|
||||
SPECIAL EXCEPTION:
|
||||
Igor Pavlov, as the author of this code, expressly permits you to
|
||||
statically or dynamically link your code (or bind by name) to the
|
||||
interfaces of this file without subjecting your linked code to the
|
||||
terms of the CPL or GNU LGPL. Any modifications or additions
|
||||
to this file, however, are subject to the LGPL or CPL terms.
|
||||
*/
|
||||
|
||||
#ifndef __LZMADECODE_H
|
||||
#define __LZMADECODE_H
|
||||
|
||||
/* #define _LZMA_IN_CB */
|
||||
/* Use callback for input data */
|
||||
|
||||
/* #define _LZMA_OUT_READ */
|
||||
/* Use read function for output data */
|
||||
|
||||
/* #define _LZMA_PROB32 */
|
||||
/* It can increase speed on some 32-bit CPUs,
|
||||
but memory usage will be doubled in that case */
|
||||
|
||||
/* #define _LZMA_LOC_OPT */
|
||||
/* Enable local speed optimizations inside code */
|
||||
|
||||
#ifndef UInt32
|
||||
#ifdef _LZMA_UINT32_IS_ULONG
|
||||
#define UInt32 unsigned long
|
||||
#else
|
||||
#define UInt32 unsigned int
|
||||
#endif
|
||||
#endif
|
||||
|
||||
#ifdef _LZMA_PROB32
|
||||
#define CProb UInt32
|
||||
#else
|
||||
#define CProb unsigned short
|
||||
#endif
|
||||
|
||||
#define LZMA_RESULT_OK 0
|
||||
#define LZMA_RESULT_DATA_ERROR 1
|
||||
#define LZMA_RESULT_NOT_ENOUGH_MEM 2
|
||||
|
||||
#ifdef _LZMA_IN_CB
|
||||
typedef struct _ILzmaInCallback
|
||||
{
|
||||
int (*Read)(void *object, unsigned char **buffer, UInt32 *bufferSize);
|
||||
} ILzmaInCallback;
|
||||
#endif
|
||||
|
||||
#define LZMA_BASE_SIZE 1846
|
||||
#define LZMA_LIT_SIZE 768
|
||||
|
||||
/*
|
||||
bufferSize = (LZMA_BASE_SIZE + (LZMA_LIT_SIZE << (lc + lp)))* sizeof(CProb)
|
||||
bufferSize += 100 in case of _LZMA_OUT_READ
|
||||
by default CProb is unsigned short,
|
||||
but if specify _LZMA_PROB_32, CProb will be UInt32(unsigned int)
|
||||
*/
|
||||
|
||||
#ifdef _LZMA_OUT_READ
|
||||
int LzmaDecoderInit(
|
||||
unsigned char *buffer, UInt32 bufferSize,
|
||||
int lc, int lp, int pb,
|
||||
unsigned char *dictionary, UInt32 dictionarySize,
|
||||
#ifdef _LZMA_IN_CB
|
||||
ILzmaInCallback *inCallback
|
||||
#else
|
||||
unsigned char *inStream, UInt32 inSize
|
||||
#endif
|
||||
);
|
||||
#endif
|
||||
|
||||
int LzmaDecode(
|
||||
unsigned char *buffer,
|
||||
#ifndef _LZMA_OUT_READ
|
||||
UInt32 bufferSize,
|
||||
int lc, int lp, int pb,
|
||||
#ifdef _LZMA_IN_CB
|
||||
ILzmaInCallback *inCallback,
|
||||
#else
|
||||
unsigned char *inStream, UInt32 inSize,
|
||||
#endif
|
||||
#endif
|
||||
unsigned char *outStream, UInt32 outSize,
|
||||
UInt32 *outSizeProcessed);
|
||||
|
||||
#endif
|
||||
51
target/linux/ar7-2.4/image/src/gzip.h
Normal file
51
target/linux/ar7-2.4/image/src/gzip.h
Normal file
@@ -0,0 +1,51 @@
|
||||
//bvb#include "timemmap.h"
|
||||
|
||||
#define OF(args) args
|
||||
#define STATIC static
|
||||
|
||||
#define WSIZE 0x8000 /* Slideing window size (defined as var
|
||||
* "window" below) must be at least 32k,
|
||||
* and a power of two. This is the
|
||||
* data work window used for input buffer
|
||||
* by the input routine */
|
||||
|
||||
typedef unsigned char uch;
|
||||
typedef unsigned short ush;
|
||||
typedef unsigned long ulg;
|
||||
|
||||
|
||||
static char *output_data;
|
||||
static ulg output_ptr;
|
||||
|
||||
#ifndef NULL
|
||||
#define NULL 0
|
||||
#endif
|
||||
|
||||
#define NOMEMCPY /* Does routine memcpy exist? */
|
||||
|
||||
//bvb static uch *inbuf; /* input buffer */
|
||||
static uch *window;
|
||||
|
||||
//bvb static uch outwin[WSIZE];
|
||||
|
||||
//bvb static unsigned insize; /* valid bytes in inbuf */
|
||||
static unsigned inptr; /* index of next byte to process in inbuf */
|
||||
|
||||
static unsigned outcnt; /* bytes in output buffer */
|
||||
|
||||
/* gzip flag byte */
|
||||
#define ASCII_FLAG 0x01 /* bit 0 set: file probably ascii text */
|
||||
#define CONTINUATION 0x02 /* bit 1 set: continuation of multi-part gzip file */
|
||||
#define EXTRA_FIELD 0x04 /* bit 2 set: extra field present */
|
||||
#define ORIG_NAME 0x08 /* bit 3 set: original file name present */
|
||||
#define COMMENT 0x10 /* bit 4 set: file comment present */
|
||||
#define ENCRYPTED 0x20 /* bit 5 set: file is encrypted */
|
||||
#define RESERVED 0xC0 /* bit 6,7: reserved */
|
||||
|
||||
/* If BMAX needs to be larger than 16, then h and x[] should be ulg. */
|
||||
#define BMAX 16 /* maximum bit length of any code (16 for explode) */
|
||||
#define N_MAX 288 /* maximum number of codes in any set */
|
||||
|
||||
static char *input_data;
|
||||
|
||||
static void *freememstart;
|
||||
34
target/linux/ar7-2.4/image/src/ld.script.in
Normal file
34
target/linux/ar7-2.4/image/src/ld.script.in
Normal file
@@ -0,0 +1,34 @@
|
||||
OUTPUT_FORMAT("@@OUTPUT_FORMAT@@")
|
||||
OUTPUT_ARCH(mips)
|
||||
ENTRY(tikernelunzip)
|
||||
SECTIONS
|
||||
{
|
||||
|
||||
/* Allocate memory space on top of kernel bss space */
|
||||
. = 0x94200000;
|
||||
.text :
|
||||
{
|
||||
*(.text)
|
||||
*(.rodata)
|
||||
*(.rodata1)
|
||||
*(.gnu.warning)
|
||||
*(.text.init)
|
||||
*(.data.init)
|
||||
}
|
||||
|
||||
.data :
|
||||
{
|
||||
*(*)
|
||||
}
|
||||
|
||||
.bss :
|
||||
{
|
||||
*(.dynbss)
|
||||
*(COMMON)
|
||||
*(.bss)
|
||||
*(.sbss)
|
||||
*(.scommon)
|
||||
. = ALIGN (0x8000);
|
||||
workspace = .;
|
||||
}
|
||||
}
|
||||
140
target/linux/ar7-2.4/image/src/loader.c
Normal file
140
target/linux/ar7-2.4/image/src/loader.c
Normal file
@@ -0,0 +1,140 @@
|
||||
/* inflate.c -- Not copyrighted 1992 by Mark Adler
|
||||
version c10p1, 10 January 1993 */
|
||||
|
||||
/*
|
||||
* Adapted for booting Linux by Hannu Savolainen 1993
|
||||
* based on gzip-1.0.3
|
||||
*
|
||||
* Nicolas Pitre <nico@visuaide.com>, 1999/04/14 :
|
||||
* Little mods for all variable to reside either into rodata or bss segments
|
||||
* by marking constant variables with 'const' and initializing all the others
|
||||
* at run-time only. This allows for the kernel uncompressor to run
|
||||
* directly from Flash or ROM memory on embeded systems.
|
||||
*/
|
||||
|
||||
#include <linux/config.h>
|
||||
#include "gzip.h"
|
||||
#include "LzmaDecode.h"
|
||||
|
||||
/* Function prototypes */
|
||||
unsigned char get_byte(void);
|
||||
int tikernelunzip(int,char *[], char *[]);
|
||||
static int tidecompress(uch *, uch *);
|
||||
|
||||
void kernel_entry(int, char *[], char *[]);
|
||||
void (*ke)(int, char *[], char *[]); /* Gen reference to kernel function */
|
||||
void (*prnt)(unsigned int, char *); /* Gen reference to Yamon print function */
|
||||
void printf(char *ptr); /* Generate our own printf */
|
||||
|
||||
int tikernelunzip(int argc, char *argv[], char *arge[])
|
||||
{
|
||||
extern unsigned int _ftext;
|
||||
extern uch kernelimage[];
|
||||
uch *in, *out;
|
||||
int status;
|
||||
|
||||
printf("Launching kernel decompressor.\n");
|
||||
|
||||
out = (unsigned char *) LOADADDR;
|
||||
in = &(kernelimage[0]);
|
||||
|
||||
status = tidecompress(in, out);
|
||||
|
||||
if (status == 0) {
|
||||
printf("Kernel decompressor was successful ... launching kernel.\n");
|
||||
|
||||
ke = ( void(*)(int, char *[],char*[]))kernel_entry;
|
||||
(*ke)(argc,argv,arge);
|
||||
|
||||
return (0);
|
||||
} else {
|
||||
printf("Error in decompression.\n");
|
||||
return(1);
|
||||
}
|
||||
}
|
||||
|
||||
#if 0
|
||||
char hex[] = {'0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B', 'C', 'D', 'E', 'F'};
|
||||
void print_i(int i)
|
||||
{
|
||||
int j;
|
||||
char buf[11];
|
||||
|
||||
buf[0] = '0';
|
||||
buf[1] = 'x';
|
||||
buf[10] = 0;
|
||||
|
||||
for (j = 0; j < 8; j++)
|
||||
{
|
||||
buf[2 + 7 - j] = hex[i & 0xf];
|
||||
i = i >> 4;
|
||||
}
|
||||
|
||||
printf(buf);
|
||||
}
|
||||
#endif
|
||||
|
||||
int tidecompress(uch *indata, uch *outdata)
|
||||
{
|
||||
extern unsigned int workspace;
|
||||
extern unsigned char kernelimage[], kernelimage_end[];
|
||||
unsigned int i; /* temp value */
|
||||
unsigned int lc; /* literal context bits */
|
||||
unsigned int lp; /* literal pos state bits */
|
||||
unsigned int pb; /* pos state bits */
|
||||
unsigned int osize; /* uncompressed size */
|
||||
unsigned int wsize; /* window size */
|
||||
unsigned int insize = kernelimage_end - kernelimage;
|
||||
int status;
|
||||
|
||||
output_ptr = 0;
|
||||
output_data = outdata;
|
||||
input_data = indata;
|
||||
|
||||
/* lzma args */
|
||||
i = get_byte();
|
||||
lc = i % 9, i = i / 9;
|
||||
lp = i % 5, pb = i / 5;
|
||||
|
||||
/* skip rest of the LZMA coder property */
|
||||
for (i = 0; i < 4; i++)
|
||||
get_byte();
|
||||
|
||||
/* read the lower half of uncompressed size in the header */
|
||||
osize = ((unsigned int)get_byte()) +
|
||||
((unsigned int)get_byte() << 8) +
|
||||
((unsigned int)get_byte() << 16) +
|
||||
((unsigned int)get_byte() << 24);
|
||||
|
||||
/* skip rest of the header (upper half of uncompressed size) */
|
||||
for (i = 0; i < 4; i++)
|
||||
get_byte();
|
||||
|
||||
i = 0;
|
||||
wsize = (LZMA_BASE_SIZE + (LZMA_LIT_SIZE << (lc + lp))) * sizeof(CProb);
|
||||
|
||||
if ((status = LzmaDecode((unsigned char *) &workspace, wsize, lc, lp, pb,
|
||||
indata + 13, insize - 13, (unsigned char *) output_data, osize, &i)) == LZMA_RESULT_OK)
|
||||
return 0;
|
||||
|
||||
return status;
|
||||
}
|
||||
|
||||
|
||||
void printf(char *ptr)
|
||||
{
|
||||
unsigned int *tempptr = (unsigned int *)0x90000534;
|
||||
prnt = ( void (*)(unsigned int, char *)) *tempptr;
|
||||
(*prnt)(0,ptr);
|
||||
}
|
||||
|
||||
unsigned char get_byte()
|
||||
{
|
||||
unsigned char c;
|
||||
|
||||
c = *input_data;
|
||||
input_data++;
|
||||
|
||||
return c;
|
||||
}
|
||||
|
||||
523
target/linux/ar7-2.4/image/src/srec2bin.c
Normal file
523
target/linux/ar7-2.4/image/src/srec2bin.c
Normal file
@@ -0,0 +1,523 @@
|
||||
#include <stdio.h>
|
||||
#include <ctype.h>
|
||||
|
||||
//Rev 0.1 Original
|
||||
// 8 Jan 2001 MJH Added code to write data to Binary file
|
||||
// note: outputfile is name.bin, where name is first part
|
||||
// of input file. ie tmp.rec -> tmp.bin
|
||||
//
|
||||
// srec2bin <input SREC file> <Output Binary File> <If Present, Big Endian>
|
||||
//
|
||||
// TAG
|
||||
// bit32u TAG_BIG = 0xDEADBE42;
|
||||
// bit32u TAG_LITTLE = 0xFEEDFA42;
|
||||
//
|
||||
// File Structure
|
||||
//
|
||||
// TAG : 32 Bits
|
||||
// [DATA RECORDS]
|
||||
//
|
||||
// Data Records Structure
|
||||
//
|
||||
// LENGTH : 32 Bits <- Length of DATA, excludes ADDRESS and CHECKSUM
|
||||
// ADDRESS : 32 Bits
|
||||
// DATA : 8 Bits * LENGTH
|
||||
// CHECKSUM: 32 Bits <- 0 - (Sum of Length --> End of Data)
|
||||
//
|
||||
// Note : If Length == 0, Address will be Program Start
|
||||
//
|
||||
//
|
||||
//
|
||||
//
|
||||
//
|
||||
|
||||
#define MajRevNum 0
|
||||
#define MinRevNum 2
|
||||
|
||||
|
||||
#define EndianSwitch(x) ((x >> 24) | (x << 24) | ((x << 8) & (0x00FF0000)) | ((x >> 8) & (0x0000FF00)) )
|
||||
|
||||
typedef unsigned char bit8u;
|
||||
typedef unsigned int bit32u;
|
||||
typedef int bit32;
|
||||
|
||||
#define FALSE 0
|
||||
#define TRUE (!FALSE)
|
||||
|
||||
|
||||
bit32u CheckSum;
|
||||
int RecStart;
|
||||
int debug;
|
||||
int verbose;
|
||||
|
||||
FILE *OpenOutputFile( char *Name );
|
||||
FILE *fOut;
|
||||
bit32u RecLength=0;
|
||||
|
||||
bit32u AddressCurrent;
|
||||
|
||||
bit32u gh(char *cp,int nibs);
|
||||
|
||||
int BigEndian;
|
||||
|
||||
int inputline;
|
||||
|
||||
// char buf[16*1024];
|
||||
|
||||
char buffer[2048];
|
||||
char *cur_ptr;
|
||||
int cur_line=0;
|
||||
int cur_len=0;
|
||||
|
||||
int s1s2s3_total=0;
|
||||
|
||||
bit32u PBVal;
|
||||
int PBValid;
|
||||
bit32u PBAdr;
|
||||
|
||||
|
||||
void dumpfTell(char *s, bit32u Value)
|
||||
{
|
||||
int Length;
|
||||
Length = (int) RecLength;
|
||||
if (debug)
|
||||
printf("[%s ] ftell()[0x%08lX] Length[0x%4X] Length[%4d] Value[0x%08x]\n",
|
||||
s, ftell(fOut), Length, Length, Value);
|
||||
}
|
||||
|
||||
void DispHex(bit32u Hex)
|
||||
{
|
||||
// printf("%X", Hex);
|
||||
}
|
||||
|
||||
void WaitDisplay(void)
|
||||
{
|
||||
static int Count=0;
|
||||
static int Index=0;
|
||||
char iline[]={"-\\|/"};
|
||||
|
||||
Count++;
|
||||
if ((Count % 32)==0)
|
||||
{
|
||||
if (verbose)
|
||||
printf("%c%c",iline[Index++],8);
|
||||
Index &= 3;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
void binOut32 ( bit32u Data )
|
||||
{
|
||||
// On UNIX machine all 32bit writes need ENDIAN switched
|
||||
// Data = EndianSwitch(Data);
|
||||
// fwrite( &Data, sizeof(bit32u), 1, fOut);
|
||||
|
||||
char sdat[4];
|
||||
int i;
|
||||
|
||||
for(i=0;i<4;i++)
|
||||
sdat[i]=(char)(Data>>(i*8));
|
||||
fwrite( sdat, 1, 4, fOut);
|
||||
dumpfTell("Out32" , Data);
|
||||
}
|
||||
|
||||
// Only update RecLength on Byte Writes
|
||||
// All 32 bit writes will be for Length etc
|
||||
|
||||
void binOut8 ( bit8u Data )
|
||||
{
|
||||
int n;
|
||||
dumpfTell("B4Data" , (bit32u) (Data & 0xFF) );
|
||||
n = fwrite( &Data, sizeof(bit8u), 1, fOut);
|
||||
if (n != 1)
|
||||
printf("Error in writing %X for Address 0x%8X\n", Data, AddressCurrent);
|
||||
RecLength += 1;
|
||||
}
|
||||
|
||||
// Currently ONLY used for outputting Program Start
|
||||
|
||||
void binRecStart(bit32u Address)
|
||||
{
|
||||
RecLength = 0;
|
||||
CheckSum = Address;
|
||||
RecStart = TRUE;
|
||||
|
||||
if (debug)
|
||||
printf("[RecStart] CheckSum[0x%08X] Length[%4d] Address[0x%08X]\n",
|
||||
CheckSum, RecLength, Address);
|
||||
|
||||
|
||||
dumpfTell("RecLength", RecLength);
|
||||
binOut32( RecLength );
|
||||
dumpfTell("Address", Address);
|
||||
binOut32( Address );
|
||||
}
|
||||
|
||||
void binRecEnd(void)
|
||||
{
|
||||
long RecEnd;
|
||||
|
||||
if (!RecStart) // if no record started, do not end it
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
RecStart = FALSE;
|
||||
|
||||
|
||||
RecEnd = ftell(fOut); // Save Current position
|
||||
|
||||
if (debug)
|
||||
printf("[RecEnd ] CheckSum[0x%08X] Length[%4d] Length[0x%X] RecEnd[0x%08lX]\n",
|
||||
CheckSum, RecLength, RecLength, RecEnd);
|
||||
|
||||
fseek( fOut, -((long) RecLength), SEEK_CUR); // move back Start Of Data
|
||||
|
||||
dumpfTell("Data ", -1);
|
||||
|
||||
fseek( fOut, -4, SEEK_CUR); // move back Start Of Address
|
||||
|
||||
dumpfTell("Address ", -1);
|
||||
|
||||
fseek( fOut, -4, SEEK_CUR); // move back Start Of Length
|
||||
|
||||
dumpfTell("Length ", -1);
|
||||
|
||||
binOut32( RecLength );
|
||||
|
||||
fseek( fOut, RecEnd, SEEK_SET); // move to end of Record
|
||||
|
||||
CheckSum += RecLength;
|
||||
|
||||
CheckSum = ~CheckSum + 1; // Two's complement
|
||||
|
||||
binOut32( CheckSum );
|
||||
|
||||
if (verbose)
|
||||
printf("[Created Record of %d Bytes with CheckSum [0x%8X]\n", RecLength, CheckSum);
|
||||
}
|
||||
|
||||
void binRecOutProgramStart(bit32u Address)
|
||||
{
|
||||
if (Address != (AddressCurrent+1))
|
||||
{
|
||||
binRecEnd();
|
||||
binRecStart(Address);
|
||||
}
|
||||
AddressCurrent = Address;
|
||||
}
|
||||
void binRecOutByte(bit32u Address, bit8u Data)
|
||||
{
|
||||
// If Address is one after Current Address, output Byte
|
||||
// If not, close out last record, update Length, write checksum
|
||||
// Then Start New Record, updating Current Address
|
||||
|
||||
if (Address != (AddressCurrent+1))
|
||||
{
|
||||
binRecEnd();
|
||||
binRecStart(Address);
|
||||
}
|
||||
AddressCurrent = Address;
|
||||
CheckSum += Data;
|
||||
binOut8( Data );
|
||||
}
|
||||
|
||||
//=============================================================================
|
||||
// SUPPORT FUNCTIONS
|
||||
//=============================================================================
|
||||
int readline(FILE *fil,char *buf,int len)
|
||||
{
|
||||
int rlen;
|
||||
|
||||
rlen=0;
|
||||
if (len==0) return(0);
|
||||
while(1)
|
||||
{
|
||||
if (cur_len==0)
|
||||
{
|
||||
cur_len=fread(buffer, 1, sizeof(buffer), fil);
|
||||
if (cur_len==0)
|
||||
{
|
||||
if (rlen)
|
||||
{
|
||||
*buf=0;
|
||||
return(rlen);
|
||||
}
|
||||
return(-1);
|
||||
}
|
||||
cur_ptr=buffer;
|
||||
}
|
||||
if (cur_len)
|
||||
{
|
||||
if (*cur_ptr=='\n')
|
||||
{
|
||||
*buf=0;
|
||||
cur_ptr++;
|
||||
cur_len--;
|
||||
return(rlen);
|
||||
}
|
||||
else
|
||||
{
|
||||
if ((len>1)&&(*cur_ptr!='\r'))
|
||||
{
|
||||
*buf++=*cur_ptr++;
|
||||
len--;
|
||||
}
|
||||
else
|
||||
cur_ptr++;
|
||||
|
||||
rlen++;
|
||||
cur_len--;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
*buf=0;
|
||||
cur_ptr++;
|
||||
cur_len--;
|
||||
return(rlen);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
int SRLerrorout(char *c1,char *c2)
|
||||
{
|
||||
printf("\nERROR: %s - '%s'.",c1,c2);
|
||||
return(FALSE);
|
||||
}
|
||||
|
||||
|
||||
int checksum(char *cp,int count)
|
||||
{
|
||||
char *scp;
|
||||
int cksum;
|
||||
int dum;
|
||||
|
||||
scp=cp;
|
||||
while(*scp)
|
||||
{
|
||||
if (!isxdigit(*scp++))
|
||||
return(SRLerrorout("Invalid hex digits",cp));
|
||||
}
|
||||
scp=cp;
|
||||
|
||||
cksum=count;
|
||||
|
||||
while(count)
|
||||
{
|
||||
cksum += gh(scp,2);
|
||||
if (count == 2)
|
||||
dum = ~cksum;
|
||||
scp += 2;
|
||||
count--;
|
||||
}
|
||||
cksum&=0x0ff;
|
||||
// printf("\nCk:%02x",cksum);
|
||||
return(cksum==0x0ff);
|
||||
}
|
||||
|
||||
bit32u gh(char *cp,int nibs)
|
||||
{
|
||||
int i;
|
||||
bit32u j;
|
||||
|
||||
j=0;
|
||||
|
||||
for(i=0;i<nibs;i++)
|
||||
{
|
||||
j<<=4;
|
||||
if ((*cp>='a')&&(*cp<='z')) *cp &= 0x5f;
|
||||
if ((*cp>='0')&&(*cp<='9'))
|
||||
j += (*cp-0x30);
|
||||
else
|
||||
if ((*cp>='A')&&(*cp<='F'))
|
||||
j += (*cp-0x37);
|
||||
else
|
||||
SRLerrorout("Bad Hex char", cp);
|
||||
cp++;
|
||||
}
|
||||
return(j);
|
||||
}
|
||||
|
||||
|
||||
//=============================================================================
|
||||
// PROCESS SREC LINE
|
||||
//=============================================================================
|
||||
|
||||
int srecLine(char *pSrecLine)
|
||||
{
|
||||
char *scp,ch;
|
||||
int itmp,count,dat;
|
||||
bit32u adr;
|
||||
static bit32u RecordCounter=0;
|
||||
|
||||
cur_line++;
|
||||
scp=pSrecLine;
|
||||
|
||||
if (*pSrecLine!='S')
|
||||
return(SRLerrorout("Not an Srecord file",scp));
|
||||
pSrecLine++;
|
||||
if (strlen(pSrecLine)<4)
|
||||
return(SRLerrorout("Srecord too short",scp));
|
||||
|
||||
ch=*pSrecLine++;
|
||||
|
||||
count=gh(pSrecLine,2);
|
||||
|
||||
pSrecLine += 2;
|
||||
|
||||
// if(debug)
|
||||
// printf("count %d, strlen(pSrecLine) = %d, pSrecLine =[%s]\n", count, strlen(pSrecLine), pSrecLine);
|
||||
RecordCounter++;
|
||||
DispHex(RecordCounter);
|
||||
|
||||
if ((count*2) != strlen(pSrecLine)) return(SRLerrorout("Count field larger than record",scp));
|
||||
|
||||
if (!checksum(pSrecLine, count)) return(SRLerrorout("Bad Checksum",scp));
|
||||
|
||||
switch(ch)
|
||||
{
|
||||
case '0': if (count<3) return(SRLerrorout("Invalid Srecord count field",scp));
|
||||
itmp=gh(pSrecLine,4); pSrecLine+=4; count-=2;
|
||||
if (itmp) return(SRLerrorout("Srecord 1 address not zero",scp));
|
||||
break;
|
||||
case '1': if (count<3) return(SRLerrorout("Invalid Srecord count field",scp));
|
||||
return(SRLerrorout("Srecord Not valid for MIPS",scp));
|
||||
break;
|
||||
case '2': if (count<4) return(SRLerrorout("Invalid Srecord count field",scp));
|
||||
return(SRLerrorout("Srecord Not valid for MIPS",scp));
|
||||
break;
|
||||
case '3': if (count<5) return(SRLerrorout("Invalid Srecord count field",scp));
|
||||
adr=gh(pSrecLine,8); pSrecLine+=8; count-=4;
|
||||
count--;
|
||||
while(count)
|
||||
{
|
||||
dat=gh(pSrecLine,2); pSrecLine+=2; count--;
|
||||
binRecOutByte(adr, (char) (dat & 0xFF));
|
||||
adr++;
|
||||
}
|
||||
s1s2s3_total++;
|
||||
break;
|
||||
case '4': return(SRLerrorout("Invalid Srecord type",scp));
|
||||
break;
|
||||
case '5': if (count<3) return(SRLerrorout("Invalid Srecord count field",scp));
|
||||
itmp=gh(pSrecLine,4); pSrecLine+=4; count-=2;
|
||||
if (itmp|=s1s2s3_total) return(SRLerrorout("Incorrect number of S3 Record processed",scp));
|
||||
break;
|
||||
case '6': return(SRLerrorout("Invalid Srecord type",scp));
|
||||
break;
|
||||
case '7': // PROGRAM START
|
||||
if (count<5) return(SRLerrorout("Invalid Srecord count field",scp));
|
||||
adr=gh(pSrecLine,8); pSrecLine+=8; count-=4;
|
||||
if (count!=1) return(SRLerrorout("Invalid Srecord count field",scp));
|
||||
binRecOutProgramStart(adr);
|
||||
break;
|
||||
case '8': if (count<4) return(SRLerrorout("Invalid Srecord count field",scp));
|
||||
return(SRLerrorout("Srecord Not valid for MIPS",scp));
|
||||
break;
|
||||
case '9': if (count<3) return(SRLerrorout("Invalid Srecord count field",scp));
|
||||
return(SRLerrorout("Srecord Not valid for MIPS",scp));
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
return(TRUE);
|
||||
}
|
||||
|
||||
|
||||
//=============================================================================
|
||||
// MAIN LOGIC, READS IN LINE AND OUTPUTS BINARY
|
||||
//=============================================================================
|
||||
|
||||
int srec2bin(int argc,char *argv[],int verbose)
|
||||
{
|
||||
int i,rlen,sts;
|
||||
FILE *fp;
|
||||
char ac;
|
||||
char buff[256];
|
||||
bit32u TAG_BIG = 0xDEADBE42;
|
||||
bit32u TAG_LITTLE = 0xFEEDFA42;
|
||||
|
||||
bit32u Tag;
|
||||
|
||||
|
||||
if(argc < 3)
|
||||
{
|
||||
printf("\nError: <srec2bin <srec input file> <bin output file>\n\n");
|
||||
return(0);
|
||||
}
|
||||
|
||||
if (argc > 3) BigEndian=TRUE; else BigEndian=FALSE;
|
||||
|
||||
if (BigEndian)
|
||||
Tag = TAG_BIG;
|
||||
else
|
||||
Tag = TAG_LITTLE;
|
||||
|
||||
if (verbose)
|
||||
printf("\nEndian: %s, Tag is 0x%8X\n",(BigEndian)?"BIG":"LITTLE", Tag);
|
||||
|
||||
fp = fopen(argv[1],"rt");
|
||||
|
||||
if (fp==NULL)
|
||||
{
|
||||
printf("\nError: Opening input file, %s.", argv[1]);
|
||||
return(0);
|
||||
}
|
||||
|
||||
fOut = fopen( argv[2], "wb");
|
||||
|
||||
if (fOut==NULL)
|
||||
{
|
||||
printf("\nError: Opening Output file, %s.", argv[2]);
|
||||
if(fp) fclose(fp);
|
||||
return(0);
|
||||
}
|
||||
|
||||
RecStart = FALSE;
|
||||
|
||||
AddressCurrent = 0xFFFFFFFFL;
|
||||
|
||||
// Setup Tag
|
||||
|
||||
dumpfTell("Tag", Tag);
|
||||
|
||||
binOut32(Tag);
|
||||
|
||||
|
||||
inputline=0;
|
||||
sts=TRUE;
|
||||
|
||||
rlen = readline(fp,buff,sizeof buff);
|
||||
|
||||
while( (sts) && (rlen != -1))
|
||||
{
|
||||
if (strlen(buff))
|
||||
{
|
||||
sts &= srecLine(buff);
|
||||
WaitDisplay();
|
||||
}
|
||||
rlen = readline(fp,buff,sizeof buff);
|
||||
}
|
||||
|
||||
|
||||
// printf("PC: 0x%08X, Length 0x%08X, Tag 0x%08X\n", ProgramStart, RecLength, TAG_LITTLE);
|
||||
|
||||
binRecEnd();
|
||||
|
||||
if(fp) fclose(fp);
|
||||
if(fOut) fclose(fOut);
|
||||
|
||||
return(1);
|
||||
}
|
||||
|
||||
main(int argc, char *argv[])
|
||||
{
|
||||
debug = TRUE;
|
||||
debug = FALSE;
|
||||
verbose = FALSE;
|
||||
srec2bin(argc,argv,verbose);
|
||||
return 0;
|
||||
}
|
||||
|
||||
11
target/linux/ar7-2.4/image/src/zimage.script.in
Normal file
11
target/linux/ar7-2.4/image/src/zimage.script.in
Normal file
@@ -0,0 +1,11 @@
|
||||
OUTPUT_FORMAT("@@OUTPUT_FORMAT@@")
|
||||
OUTPUT_ARCH(mips)
|
||||
SECTIONS
|
||||
{
|
||||
.data :
|
||||
{
|
||||
kernelimage = .;
|
||||
*(.data)
|
||||
kernelimage_end = .;
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user