diff options
Diffstat (limited to 'target/linux/bcm63xx/image')
21 files changed, 3408 insertions, 0 deletions
diff --git a/target/linux/bcm63xx/image/Makefile b/target/linux/bcm63xx/image/Makefile new file mode 100644 index 0000000000..cc1660aa25 --- /dev/null +++ b/target/linux/bcm63xx/image/Makefile @@ -0,0 +1,179 @@ +# +# Copyright (C) 2006-2015 OpenWrt.org +# Copyright (C) 2016 LEDE project +# +# 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 + +LOADADDR = 0x80010000 # RAM start + 64K +KERNEL_ENTRY = $(LOADADDR) # Newer kernels add a jmp to the kernel_entry at the start of the binary +LOADER_ENTRY = 0x80a00000 # RAM start + 10M, for relocate +RAMSIZE = 0x02000000 # 32MB +LZMA_TEXT_START = 0x81800000 # 32MB - 8MB + +LOADER_MAKEOPTS= \ + KDIR=$(KDIR) \ + LOADADDR=$(LOADADDR) \ + KERNEL_ENTRY=$(KERNEL_ENTRY) \ + RAMSIZE=$(RAMSIZE) \ + LZMA_TEXT_START=$(LZMA_TEXT_START) \ + +RELOCATE_MAKEOPTS= \ + CACHELINE_SIZE=16 \ + KERNEL_ADDR=$(KERNEL_ENTRY) \ + CROSS_COMPILE=$(TARGET_CROSS) \ + LZMA_TEXT_START=$(LOADER_ENTRY) + +define Build/Compile + rm -rf $(KDIR)/relocate + $(CP) ../../generic/image/relocate $(KDIR) + $(MAKE) -C $(KDIR)/relocate $(RELOCATE_MAKEOPTS) +endef + +### Kernel scripts ### +define Build/hcs-initramfs + $(STAGING_DIR_HOST)/bin/hcsmakeimage --magic_bytes=$(HCS_MAGIC_BYTES) \ + --rev_maj=$(HCS_REV_MAJ) --rev_min=$(HCS_REV_MIN) --input_file=$@ \ + --output_file=$@.hcs --ldaddress=$(LOADADDR) + mv $@.hcs $@ +endef + +define Build/loader-lzma + rm -rf $@.src + $(MAKE) -C lzma-loader \ + $(LOADER_MAKEOPTS) \ + PKG_BUILD_DIR="$@.src" \ + TARGET_DIR="$(dir $@)" \ + LOADER_DATA="$@" \ + LOADER_NAME="$(notdir $@)" \ + compile loader.$(1) + mv "$@.$(1)" "$@" + rm -rf $@.src +endef + +define Build/lzma + # CFE is a LZMA nazi! It took me hours to find out the parameters! + # Also I think lzma has a bug cause it generates different output depending on + # if you use stdin / stdout or not. Use files instead of stdio here, cause + # otherwise CFE will complain and not boot the image. + $(STAGING_DIR_HOST)/bin/lzma e $@ -d22 -fb64 -a1 $@.lzma + mv $@.lzma $@ +endef + +define Build/lzma-cfe + # Strip out the length, CFE doesn't like this + dd if=$@ of=$@.lzma.cfe bs=5 count=1 + dd if=$@ of=$@.lzma.cfe ibs=13 obs=5 skip=1 seek=1 conv=notrunc + mv $@.lzma.cfe $@ +endef + +define Build/relocate-kernel + # CFE only allows ~4 MiB for the uncompressed kernels, but uncompressed + # kernel might get larger than that, so let CFE unpack and load at a + # higher address and make the kernel relocate itself to the expected + # location. + ( \ + dd if=$(KDIR)/relocate/loader.bin bs=32 conv=sync && \ + perl -e '@s = stat("$@"); print pack("N", @s[7])' && \ + cat $@ \ + ) > $@.relocate + mv $@.relocate $@ +endef + +### Image scripts ### +define rootfspad/jffs2-128k +--align-rootfs +endef +define rootfspad/jffs2-64k +--align-rootfs +endef +define rootfspad/squashfs +endef + +define Image/LimitName16 +$(shell expr substr "$(1)" 1 16) +endef + +define Image/FileSystemStrip +$(firstword $(subst +,$(space),$(subst root.,,$(notdir $(1))))) +endef + +define Build/cfe-bin + $(STAGING_DIR_HOST)/bin/imagetag -i $(IMAGE_KERNEL) -f $(IMAGE_ROOTFS) \ + --output $@ --boardid $(CFE_BOARD_ID) --chipid $(CFE_CHIP_ID) \ + --entry $(LOADER_ENTRY) --load-addr $(LOADER_ENTRY) \ + --info1 "$(call Image/LimitName16,$(DEVICE_NAME))" \ + --info2 "$(call Image/FileSystemStrip,$(IMAGE_ROOTFS))" \ + $(call rootfspad/$(call Image/FileSystemStrip,$(IMAGE_ROOTFS))) \ + $(CFE_EXTRAS) $(1) +endef + +define Build/cfe-old-bin + $(TOPDIR)/scripts/brcmImage.pl -t -p \ + -o $@ -b $(CFE_BOARD_ID) -c $(CFE_CHIP_ID) \ + -e $(LOADER_ENTRY) -a $(LOADER_ENTRY) \ + -k $(IMAGE_KERNEL) -r $(IMAGE_ROOTFS) \ + $(CFE_EXTRAS) +endef + +define Build/cfe-spw303v-bin + $(STAGING_DIR_HOST)/bin/imagetag -i $(IMAGE_KERNEL) -f $(IMAGE_ROOTFS) \ + --output $@ --boardid $(CFE_BOARD_ID) --chipid $(CFE_CHIP_ID) \ + --entry $(LOADER_ENTRY) --load-addr $(LOADER_ENTRY) \ + $(call rootfspad/$(call Image/FileSystemStrip,$(IMAGE_ROOTFS))) \ + $(CFE_EXTRAS) $(1) +endef + +define Build/spw303v-bin + $(STAGING_DIR_HOST)/bin/spw303v -i $@ -o $@.spw303v + mv $@.spw303v $@ +endef + +define Build/zyxel-bin + $(STAGING_DIR_HOST)/bin/zyxbcm -i $@ -o $@.zyxel + mv $@.zyxel $@ +endef + +define Build/redboot-bin + # Prepare kernel and rootfs + dd if=$(IMAGE_KERNEL) of=$(BIN_DIR)/$(REDBOOT_PREFIX)-vmlinux.gz bs=65536 conv=sync + dd if=$(IMAGE_ROOTFS) of=$(BIN_DIR)/$(REDBOOT_PREFIX)-$(notdir $(IMAGE_ROOTFS)) bs=64k conv=sync + echo -ne \\xDE\\xAD\\xC0\\xDE >> $(BIN_DIR)/$(REDBOOT_PREFIX)-$(notdir $(IMAGE_ROOTFS)) + # Generate the scripted image + $(TOPDIR)/scripts/redboot-script.pl \ + -k $(BIN_DIR)/$(REDBOOT_PREFIX)-vmlinux.gz \ + -r $(BIN_DIR)/$(REDBOOT_PREFIX)-$(notdir $(IMAGE_ROOTFS)) \ + -a $(strip $(LOADER_ENTRY)) -f 0xbe430000 -l 0x7c0000 \ + -s 0x1000 -t 20 -o $@.redbootscript + dd if="$@.redbootscript" of="$@.redbootscript.padded" bs=4096 conv=sync + cat \ + "$@.redbootscript.padded" \ + "$(BIN_DIR)/$(REDBOOT_PREFIX)-vmlinux.gz" \ + "$(BIN_DIR)/$(REDBOOT_PREFIX)-$(notdir $(IMAGE_ROOTFS))" \ + > "$@" +endef + +define Device/Default + PROFILES = Default $$(DEVICE_NAME) + KERNEL_DEPENDS = $$(wildcard ../dts/$$(DEVICE_DTS).dts) + KERNEL_INITRAMFS_SUFFIX := .elf + DEVICE_DTS_DIR := ../dts + SOC = bcm$$(CFE_CHIP_ID) + DEVICE_DTS = $$(SOC)-$(subst _,-,$(1)) +endef + +ATH5K_PACKAGES := kmod-ath5k wpad-basic +ATH9K_PACKAGES := kmod-ath9k wpad-basic +B43_PACKAGES := kmod-b43 wpad-basic +BRCMWL_PACKAGES := kmod-brcm-wl nas wlc +RT28_PACKAGES := kmod-rt2800-pci wpad-basic +RT61_PACKAGES := kmod-rt61-pci wpad-basic +USB1_PACKAGES := kmod-usb-ohci kmod-usb-ledtrig-usbport +USB2_PACKAGES := kmod-usb2 kmod-usb-ohci kmod-usb-ledtrig-usbport + +include bcm63xx.mk + +$(eval $(call BuildImage)) diff --git a/target/linux/bcm63xx/image/README.images-bcm63xx b/target/linux/bcm63xx/image/README.images-bcm63xx new file mode 100644 index 0000000000..91b6d019ee --- /dev/null +++ b/target/linux/bcm63xx/image/README.images-bcm63xx @@ -0,0 +1,127 @@ +The image neede to flash onto a Broadcom 63xx-series board depends on the +board, method you are using to flash, and, for web-based flash, on the version +of the Broadcom code your router uses. + +There are two major revisions of the Broadcom code as far as imagetags are +concerned, before 3.08 and after 3.08, however there are some variations +within in that, either due to vendor differences or due to changes at +Broadcom (it's not clear yet which is the case). In addtion Pirelli modified +the Broadcom code, so Alice Gate models use a different imagetag than any +other vendor. + +The imagetag format for flashing via CFE is the same for almost all the +boards, and is the same for all images generated by the imagetag utility. +Images flashable using cfe are labelled openwrt-<board>-<filesystem>-cfe.bin + +The imagetags for tftp/ftp flashing is based on Broadcom 3.00-3.04 imagetags +and is known to be correct as the source code GPL and is available for reading. + +Broadcom code 2.21 is based on the BT Voyager firmware image I looked at. It +may in fact be BT Voyager-specific. 2.21 is actually more difficult to deal +with the imagetag from 3.00 as it has three different CRC calculations in +addtition to the header CRC. + +Broadcom 3.00-3.02 flashing has been tested on Comtrend CT-5261, CT-536 and +Tecom GW6000, and is the version of the flashing that was present before the +imagetags were split by broadcom code version (early June 2009) + +3.04 is guessed to be the same as 3.00-3.02 based on available information + +Broadom 3.06 is thought to be the same as 3.00-3.02, however the only 3.06 +this author (Daniel Dickinson) has seen is the Alice Gate (Pirelli) firmware +which is known to be different due to vendor (Pirelli) modifications to the +Broadcom code. + +Broadcom 3.10 uses an imagetag that is believed to apply to all 3.10 and 3.12 +versions, and has been tested on the Tecom GW6200. This version introdec changes to +the imagetag to deal with TR69 (a remote rouer management system developed by the +DSL forum). There is a field for vendor-specific information, that at least in some +cases is not optional. It is based on the hexedit of a neufbox4 firmware image, the +information in https://dev.openwrt.org/ticket/4987, and the hexedit of a Tecom +GW6200 image. + +Some boards share the same tag format, but require vendor-specific fields in +the board. In that case the tagid is shared, but the filename of the generated +image reflects the router for which the image was created. + +router |method | codever |filename ++-------------+-------------+---------+--------------------------------------- +|any |cfe+most web | any |openwrt-<board>-<fs>-cfe.bin +|AGVoIP2+WiFi |cfe |alice3.06|openwrt-AGV2+W-cfe-<fs>-cfe.bin +|AGVoIP2+WiFi |web |alice3.06|openwrt-AGV2+W-cfe-<fs>-cfe.bin +|CT536 |web |3.02 |openwrt-CT536_CT5621-<fs>-cfe.bin +|CT5621 |web |3.02 |openwrt-CT536_CT5621-<fs>-cfe.bin +|DG834GT |web |3.02 |openwrt-DG834GT_DG834PN-<fs>-cfe.bin +|DG834PN |web |3.02 |openwrt-DG834GT_DG834PN-<fs>-cfe.bin +|DSL-2640B |web |3.10 |openwrt-DSL2640B-<fs>-cfe.bin +|DSL-2740B |web |3.10 |openwrt-DSL2670B-<fs>-cfe.bin +|F5D7633 |web |3.10 |openwrt-F5D7633-<fs>-cfe.bin +|F@ST2404 |web |3.0X? |openwrt-F@ST2404-cfe-<fs>-cfe.bin +|F@ST2404 |web |3.1X? |openwrt-F@ST2404-<fs>-cfe.bin +|GW6000 |web |3.00 |openwrt-GW6000-<fs>-cfe.bin +|GW6200 |web |3.10 |openwrt-GW6200-<fs>-cfe.bin +|Neufbox4 |web |3.12 |openwrt-NEUFBOX4-<fs>-cfe.bin +|TD8810A |web |3.06 |openwrt-TD8810-<fs>-cfe.bin +|TD8810B |web |3.06 |openwrt-TD8810-<fs>-cfe.bin +|TD8811A |web |3.06 |openwrt-TD8811-<fs>-cfe.bin +|TD8811B |web |3.06 |openwrt-TD881-<fs>-cfe.bin +|TD8900GB |web |3.06 |openwrt-TD8900DB<fs>-cfe.bin +|USR9108 |web |3.0X? |openwrt-USR9108-<fs>-cfe.bin +|V2091_BTR |web |2.21 |openwrt-V2091_BTR-<fs>-cfe.bin +|V2091_ROI |web |2.21 |openwrt-V2091-<fs>-cfe.bin +|V2091_WB |web |2.21 |openwrt-V2091-<fs>-cfe.bin +|V210_BTR |web |2.21 |openwrt-V210_BTR-<fs>-cfe.bin +|V210_ROI |web |2.21 |openwrt-V210-ROI_WB<fs>-cfe.bin +|V210_WB |web |2.21 |openwrt-V210-ROI_WB<fs>-cfe.bin +|V2110 |web |2.21 |openwrt-V2110-<fs>-cfe.bin +|V2110_AA |web |2.21 |openwrt-V2110-<fs>-cfe.bin +|V2110_ROI |web |2.21 |openwrt-V2110-<fs>-cfe.bin +|V2500V |web |2.21 |openwrt-V2500V<fs>-cfe.bin +|V2500V_AA |web |2.21 |openwrt-V2500V-<fs>-cfe.bin +|V2500V_SIP_CLUB |web |2.21 |openwrt-V2500V-<fs>-cfe.bin + +Old imagetag routers +-------------------- +Davolink DV201AMR + +Redboot routers +--------------- +Inventel Livebox + +Known router->code versions +--------------------------- + +Vendor |Model |Code Ver +---------------------------+------------------------------------------+-------- +Belkin |F5D7633 |3.10 +British Telecom (BT) |Voyager V2091_BTR |2.21 +British Telecom (BT) |Voyager V2091_ROI |2.21 +British Telecom (BT) |Voyager V2091_WB |2.21 +British Telecom (BT) |Voyager V210_BTR |2.21 +British Telecom (BT) |Voyager V210_ROI |2.21 +British Telecom (BT) |Voyager V210_WB |2.21 +British Telecom (BT) |Voyager V2110 |2.21 +British Telecom (BT) |Voyager V2110_AA |2.21 +British Telecom (BT) |Voyager V2110_ROI |2.21 +British Telecom (BT) |Voyager V220V |2.21 +British Telecom (BT) |Voyager V2500V |2.21 +British Telecom (BT) |Voyager V2500V_AA |2.21 +British Telecom (BT) |Voyager V2500V_SIP_CLUB |2.21 +Comtrend |CT-5261 |3.02 +Comtrend |CT-536 |3.02 +D-Link |DSL-2640B |3.10 +D-Link |DSL-2670B |3.10 +NetGear |DG834GT |3.02 +NetGear |DG834PN |3.02 +Neuf Cegetel |Neufbox 4 |3.12 +Pirelli |Alice Gate Wi-Fi (+VoIP models?) |ag 3.06 +Sagem |F@ST2404 |? +TP-Link |TD-8810A |3.06 +TP-Link |TD-8810B |3.06 +TP-Link |TD-8811A |3.06 +TP-Link |TD-8811B |3.06 +TP-Link |TD-W8900GB |3.06 +Tecom |GW6000 |3.00 +Tecom |GW6200 |3.10 +USR |9108 |? + diff --git a/target/linux/bcm63xx/image/bcm63xx.mk b/target/linux/bcm63xx/image/bcm63xx.mk new file mode 100644 index 0000000000..265fa0958a --- /dev/null +++ b/target/linux/bcm63xx/image/bcm63xx.mk @@ -0,0 +1,1151 @@ + +# +# BCM33XX/BCM63XX Profiles +# + +define Device/bcm33xx + KERNEL_INITRAMFS := kernel-bin | append-dtb | lzma | loader-lzma bin | hcs-initramfs + IMAGES := + HCS_MAGIC_BYTES := + HCS_REV_MIN := + HCS_REV_MAJ := +endef +DEVICE_VARS += HCS_MAGIC_BYTES HCS_REV_MIN HCS_REV_MAJ + +define Device/bcm63xx + FILESYSTEMS := squashfs jffs2-64k jffs2-128k + KERNEL := kernel-bin | append-dtb | relocate-kernel | lzma | lzma-cfe + KERNEL_INITRAMFS := kernel-bin | append-dtb | lzma | loader-lzma elf + IMAGES := cfe.bin + IMAGE/cfe.bin := cfe-bin --pad $$$$(shell expr $$$$(FLASH_MB) / 2) + IMAGE/cfe-4M.bin := cfe-bin --pad 2 + IMAGE/cfe-8M.bin := cfe-bin --pad 4 + IMAGE/cfe-16M.bin := cfe-bin --pad 8 + IMAGE/cfe-bc221.bin := cfe-bin --layoutver 5 + IMAGE/cfe-old.bin := cfe-old-bin + IMAGE/sysupgrade.bin := cfe-bin + BLOCK_SIZE := 0x10000 + IMAGE_OFFSET := + FLASH_MB := 4 + CFE_BOARD_ID := + CFE_CHIP_ID := + CFE_EXTRAS = --block-size $$(BLOCK_SIZE) --image-offset $$(if $$(IMAGE_OFFSET),$$(IMAGE_OFFSET),$$(BLOCK_SIZE)) +endef +DEVICE_VARS += BLOCK_SIZE FLASH_MB IMAGE_OFFSET +DEVICE_VARS += CFE_BOARD_ID CFE_CHIP_ID CFE_EXTRAS + +define Device/bcm63xx_netgear + $(Device/bcm63xx) + DEVICE_VENDOR := NETGEAR + IMAGES := factory.chk sysupgrade.bin + IMAGE/factory.chk := cfe-bin | netgear-chk + NETGEAR_BOARD_ID := + NETGEAR_REGION := +endef +DEVICE_VARS += NETGEAR_BOARD_ID NETGEAR_REGION + +define Device/bcm63xx_redboot + FILESYSTEMS := squashfs + KERNEL := kernel-bin | append-dtb | relocate-kernel | gzip + KERNEL_INITRAMFS := kernel-bin | append-dtb | lzma | loader-lzma elf + IMAGES := redboot.bin + IMAGE/redboot.bin := redboot-bin + REDBOOT_PREFIX := $$(IMAGE_PREFIX) +endef +DEVICE_VARS += REDBOOT_PREFIX + +### Generic ### +define Device/brcm_bcm963281tan + $(Device/bcm63xx) + DEVICE_VENDOR := Generic + DEVICE_MODEL := 963281TAN + IMAGES := cfe-4M.bin cfe-8M.bin cfe-16M.bin + CFE_BOARD_ID := 963281TAN + CFE_CHIP_ID := 6328 +endef +TARGET_DEVICES += brcm_bcm963281tan + +define Device/brcm_bcm96328avng + $(Device/bcm63xx) + DEVICE_VENDOR := Generic + DEVICE_MODEL := 96328avng + IMAGES := cfe-4M.bin cfe-8M.bin cfe-16M.bin + CFE_BOARD_ID := 96328avng + CFE_CHIP_ID := 6328 +endef +TARGET_DEVICES += brcm_bcm96328avng + +define Device/brcm_bcm96338gw + $(Device/bcm63xx) + DEVICE_VENDOR := Generic + DEVICE_MODEL := 96338GW + CFE_BOARD_ID := 6338GW + CFE_CHIP_ID := 6338 +endef +TARGET_DEVICES += brcm_bcm96338gw + +define Device/brcm_bcm96338w + $(Device/bcm63xx) + DEVICE_VENDOR := Generic + DEVICE_MODEL := 96338W + CFE_BOARD_ID := 6338W + CFE_CHIP_ID := 6338 +endef +TARGET_DEVICES += brcm_bcm96338w + +define Device/brcm_bcm96345gw2 + $(Device/bcm63xx) + DEVICE_VENDOR := Generic + DEVICE_MODEL := 96345GW2 + IMAGES += cfe-bc221.bin + CFE_BOARD_ID := 96345GW2 + CFE_CHIP_ID := 6345 + DEFAULT := n +endef +TARGET_DEVICES += brcm_bcm96345gw2 + +define Device/brcm_bcm96348gw + $(Device/bcm63xx) + DEVICE_VENDOR := Generic + DEVICE_MODEL := 96348GW + IMAGES += cfe-bc221.bin + CFE_BOARD_ID := 96348GW + CFE_CHIP_ID := 6348 +endef +TARGET_DEVICES += brcm_bcm96348gw + +define Device/brcm_bcm96348gw-10 + $(Device/bcm63xx) + DEVICE_VENDOR := Generic + DEVICE_MODEL := 96348GW-10 + CFE_BOARD_ID := 96348GW-10 + CFE_CHIP_ID := 6348 +endef +TARGET_DEVICES += brcm_bcm96348gw-10 + +define Device/brcm_bcm96348gw-11 + $(Device/bcm63xx) + DEVICE_VENDOR := Generic + DEVICE_MODEL := 96348GW-11 + CFE_BOARD_ID := 96348GW-11 + CFE_CHIP_ID := 6348 +endef +TARGET_DEVICES += brcm_bcm96348gw-11 + +define Device/brcm_bcm96348r + $(Device/bcm63xx) + DEVICE_VENDOR := Generic + DEVICE_MODEL := 96348R + CFE_BOARD_ID := 96348R + CFE_CHIP_ID := 6348 +endef +TARGET_DEVICES += brcm_bcm96348r + +define Device/brcm_bcm96358vw + $(Device/bcm63xx) + DEVICE_VENDOR := Generic + DEVICE_MODEL := 96358VW + CFE_BOARD_ID := 96358VW + CFE_CHIP_ID := 6358 +endef +TARGET_DEVICES += brcm_bcm96358vw + +define Device/brcm_bcm96358vw2 + $(Device/bcm63xx) + DEVICE_VENDOR := Generic + DEVICE_MODEL := 96358VW2 + CFE_BOARD_ID := 96358VW2 + CFE_CHIP_ID := 6358 +endef +TARGET_DEVICES += brcm_bcm96358vw2 + +define Device/brcm_bcm96368mvngr + $(Device/bcm63xx) + DEVICE_VENDOR := Generic + DEVICE_MODEL := 96368MVNgr + CFE_BOARD_ID := 96368MVNgr + CFE_CHIP_ID := 6368 +endef +TARGET_DEVICES += brcm_bcm96368mvngr + +define Device/brcm_bcm96368mvwg + $(Device/bcm63xx) + DEVICE_VENDOR := Generic + DEVICE_MODEL := 96368MVWG + CFE_BOARD_ID := 96368MVWG + CFE_CHIP_ID := 6368 +endef +TARGET_DEVICES += brcm_bcm96368mvwg + +### Actiontec ### +define Device/actiontec_r1000h + $(Device/bcm63xx) + DEVICE_VENDOR := Actiontec + DEVICE_MODEL := R1000H + FILESYSTEMS := squashfs + CFE_BOARD_ID := 96368MVWG + CFE_CHIP_ID := 6368 + FLASH_MB := 32 + IMAGE_OFFSET := 0x20000 + DEVICE_PACKAGES := $(USB2_PACKAGES) $(BRCMWL_PACKAGES) +endef +TARGET_DEVICES += actiontec_r1000h + +### ADB ### +define Device/adb_a4001n + $(Device/bcm63xx) + DEVICE_VENDOR := ADB + DEVICE_MODEL := P.DG A4001N + CFE_BOARD_ID := 96328dg2x2 + CFE_CHIP_ID := 6328 + FLASH_MB := 8 + DEVICE_PACKAGES := $(USB2_PACKAGES) $(B43_PACKAGES) +endef +TARGET_DEVICES += adb_a4001n + +define Device/adb_a4001n1 + $(Device/bcm63xx) + DEVICE_VENDOR := ADB + DEVICE_MODEL := P.DG A4001N1 + IMAGES += sysupgrade.bin + CFE_BOARD_ID := 963281T_TEF + CFE_CHIP_ID := 6328 + FLASH_MB := 16 + DEVICE_PACKAGES := $(USB2_PACKAGES) $(B43_PACKAGES) +endef +TARGET_DEVICES += adb_a4001n1 + +define Device/adb_av4202n + $(Device/bcm63xx) + DEVICE_VENDOR := ADB + DEVICE_MODEL := P.DG AV4202N + IMAGE_OFFSET := 0x20000 + CFE_BOARD_ID := 96368_Swiss_S1 + CFE_CHIP_ID := 6368 + DEVICE_PACKAGES := $(USB2_PACKAGES) $(B43_PACKAGES) +endef +TARGET_DEVICES += adb_av4202n + +### Alcatel ### +define Device/alcatel_rg100a + $(Device/bcm63xx) + DEVICE_VENDOR := Alcatel + DEVICE_MODEL := RG100A + CFE_BOARD_ID := 96358VW2 + CFE_CHIP_ID := 6358 + BLOCK_SIZE := 0x20000 + DEVICE_PACKAGES := $(USB2_PACKAGES) $(B43_PACKAGES) +endef +TARGET_DEVICES += alcatel_rg100a + +### Asmax ### +define Device/asmax_ar-1004g + $(Device/bcm63xx) + DEVICE_VENDOR := Asmax + DEVICE_MODEL := AR 1004g + CFE_BOARD_ID := 96348GW-10 + CFE_CHIP_ID := 6348 + DEVICE_PACKAGES := $(B43_PACKAGES) + DEFAULT := n +endef +TARGET_DEVICES += asmax_ar-1004g + +### Belkin ### +define Device/belkin_f5d7633 + $(Device/bcm63xx) + DEVICE_VENDOR := Belkin + DEVICE_MODEL := F5D7633 + CFE_BOARD_ID := 96348GW-10 + CFE_CHIP_ID := 6348 + BLOCK_SIZE := 0x20000 + DEVICE_PACKAGES := $(B43_PACKAGES) + DEFAULT := n +endef +TARGET_DEVICES += belkin_f5d7633 + +### Broadcom ### +define Device/brcm_bcm96318ref + $(Device/bcm63xx) + DEVICE_VENDOR := Broadcom + DEVICE_MODEL := BCM96318REF reference board + IMAGES := + CFE_BOARD_ID := 96318REF + CFE_CHIP_ID := 6318 + DEVICE_PACKAGES := $(B43_PACKAGES) $(USB2_PACKAGES) kmod-bcm63xx-udc +endef +TARGET_DEVICES += brcm_bcm96318ref + +define Device/brcm_bcm96318ref-p300 + $(Device/bcm63xx) + DEVICE_VENDOR := Broadcom + DEVICE_MODEL := BCM96318REF_P300 reference board + IMAGES := + CFE_BOARD_ID := 96318REF_P300 + CFE_CHIP_ID := 6318 + DEVICE_PACKAGES := $(B43_PACKAGES) $(USB2_PACKAGES) kmod-bcm63xx-udc +endef +TARGET_DEVICES += brcm_bcm96318ref-p300 + +define Device/brcm_bcm963268bu-p300 + $(Device/bcm63xx) + DEVICE_VENDOR := Broadcom + DEVICE_MODEL := BCM963268BU_P300 reference board + IMAGES := + CFE_BOARD_ID := 963268BU_P300 + CFE_CHIP_ID := 63268 + DEVICE_PACKAGES := $(USB2_PACKAGES) kmod-bcm63xx-udc +endef +TARGET_DEVICES += brcm_bcm963268bu-p300 + +define Device/brcm_bcm963269bhr + $(Device/bcm63xx) + DEVICE_VENDOR := Broadcom + DEVICE_MODEL := BCM963269BHR reference board + IMAGES := + CFE_BOARD_ID := 963269BHR + CFE_CHIP_ID := 63268 + SOC := bcm63269 + DEVICE_PACKAGES := $(USB2_PACKAGES) kmod-bcm63xx-udc +endef +TARGET_DEVICES += brcm_bcm963269bhr + +### BT ### +define Device/bt_home-hub-2-a + $(Device/bcm63xx) + DEVICE_VENDOR := BT + DEVICE_MODEL := Home Hub 2.0 + DEVICE_VARIANT := A + CFE_BOARD_ID := HOMEHUB2A + CFE_CHIP_ID := 6358 + BLOCK_SIZE := 0x20000 + DEVICE_PACKAGES := $(B43_PACKAGES) $(USB2_PACKAGES) +endef +TARGET_DEVICES += bt_home-hub-2-a + +define Device/bt_voyager-2110 + $(Device/bcm63xx) + DEVICE_VENDOR := BT + DEVICE_MODEL := Voyager 2110 + CFE_BOARD_ID := V2110 + CFE_CHIP_ID := 6348 + CFE_EXTRAS += --layoutver 5 + DEVICE_PACKAGES := $(B43_PACKAGES) + DEFAULT := n +endef +TARGET_DEVICES += bt_voyager-2110 + +define Device/bt_voyager-2500v-bb + $(Device/bcm63xx) + DEVICE_VENDOR := BT + DEVICE_MODEL := Voyager 2500V + CFE_BOARD_ID := V2500V_BB + CFE_CHIP_ID := 6348 + CFE_EXTRAS += --layoutver 5 + DEVICE_PACKAGES := $(B43_PACKAGES) + DEFAULT := n +endef +TARGET_DEVICES += bt_voyager-2500v-bb + +### Comtrend ### +define Device/comtrend_ar-5315u + $(Device/bcm63xx) + DEVICE_VENDOR := Comtrend + DEVICE_MODEL := AR-5315u + IMAGES += sysupgrade.bin + CFE_BOARD_ID := 96318A-1441N1 + CFE_CHIP_ID := 6318 + FLASH_MB := 16 + DEVICE_PACKAGES := $(B43_PACKAGES) $(USB2_PACKAGES) +endef +TARGET_DEVICES += comtrend_ar-5315u + +define Device/comtrend_ar-5381u + $(Device/bcm63xx) + DEVICE_VENDOR := Comtrend + DEVICE_MODEL := AR-5381u + IMAGES += sysupgrade.bin + CFE_BOARD_ID := 96328A-1241N + CFE_CHIP_ID := 6328 + FLASH_MB := 16 + DEVICE_PACKAGES := $(B43_PACKAGES) $(USB2_PACKAGES) +endef +TARGET_DEVICES += comtrend_ar-5381u + +define Device/comtrend_ar-5387un + $(Device/bcm63xx) + DEVICE_VENDOR := Comtrend + DEVICE_MODEL := AR-5387un + IMAGES += sysupgrade.bin + CFE_BOARD_ID := 96328A-1441N1 + CFE_CHIP_ID := 6328 + FLASH_MB := 16 + DEVICE_PACKAGES := $(B43_PACKAGES) $(USB2_PACKAGES) +endef +TARGET_DEVICES += comtrend_ar-5387un + +define Device/comtrend_ct-536plus + $(Device/bcm63xx) + DEVICE_VENDOR := Comtrend + DEVICE_MODEL := CT-536+ + DEVICE_ALT0_VENDOR := Comtrend + DEVICE_ALT0_MODEL := CT-5621 + CFE_BOARD_ID := 96348GW-11 + CFE_CHIP_ID := 6348 + DEVICE_PACKAGES := $(B43_PACKAGES) + DEFAULT := n +endef +TARGET_DEVICES += comtrend_ct-536plus + +define Device/comtrend_ct-5365 + $(Device/bcm63xx) + DEVICE_VENDOR := Comtrend + DEVICE_MODEL := CT-5365 + CFE_BOARD_ID := 96348A-122 + CFE_CHIP_ID := 6348 + DEVICE_PACKAGES := $(B43_PACKAGES) + DEFAULT := n +endef +TARGET_DEVICES += comtrend_ct-5365 + +define Device/comtrend_ct-6373 + $(Device/bcm63xx) + DEVICE_VENDOR := Comtrend + DEVICE_MODEL := CT-6373 + CFE_BOARD_ID := CT6373-1 + CFE_CHIP_ID := 6358 + DEVICE_PACKAGES := $(B43_PACKAGES) $(USB2_PACKAGES) +endef +TARGET_DEVICES += comtrend_ct-6373 + +define Device/comtrend_vr-3025u + $(Device/bcm63xx) + DEVICE_VENDOR := Comtrend + DEVICE_MODEL := VR-3025u + IMAGES += sysupgrade.bin + CFE_BOARD_ID := 96368M-1541N + CFE_CHIP_ID := 6368 + BLOCK_SIZE := 0x20000 + FLASH_MB := 32 + DEVICE_PACKAGES := $(B43_PACKAGES) $(USB2_PACKAGES) +endef +TARGET_DEVICES += comtrend_vr-3025u + +define Device/comtrend_vr-3025un + $(Device/bcm63xx) + DEVICE_VENDOR := Comtrend + DEVICE_MODEL := VR-3025un + CFE_BOARD_ID := 96368M-1341N + CFE_CHIP_ID := 6368 + FLASH_MB := 8 + DEVICE_PACKAGES := $(B43_PACKAGES) $(USB2_PACKAGES) +endef +TARGET_DEVICES += comtrend_vr-3025un + +define Device/comtrend_vr-3026e + $(Device/bcm63xx) + DEVICE_VENDOR := Comtrend + DEVICE_MODEL := VR-3026e + CFE_BOARD_ID := 96368MT-1341N1 + CFE_CHIP_ID := 6368 + FLASH_MB := 8 + DEVICE_PACKAGES := $(B43_PACKAGES) +endef +TARGET_DEVICES += comtrend_vr-3026e + +define Device/comtrend_wap-5813n + $(Device/bcm63xx) + DEVICE_VENDOR := Comtrend + DEVICE_MODEL := WAP-5813n + CFE_BOARD_ID := 96369R-1231N + CFE_CHIP_ID := 6368 + FLASH_MB := 8 + SOC := bcm6369 + DEVICE_PACKAGES := $(B43_PACKAGES) $(USB2_PACKAGES) +endef +TARGET_DEVICES += comtrend_wap-5813n + +### D-Link ### +define Device/d-link_dsl-2640b-b + $(Device/bcm63xx) + DEVICE_VENDOR := D-Link + DEVICE_MODEL := DSL-2640B + DEVICE_VARIANT := B2 + CFE_BOARD_ID := D-4P-W + CFE_CHIP_ID := 6348 + DEVICE_PACKAGES := $(B43_PACKAGES) + DEFAULT := n +endef +TARGET_DEVICES += d-link_dsl-2640b-b + +define Device/d-link_dsl-2640u + $(Device/bcm63xx) + DEVICE_VENDOR := D-Link + DEVICE_MODEL := DSL-2640U + DEVICE_VARIANT := C1 + DEVICE_ALT0_VENDOR := D-Link + DEVICE_ALT0_MODEL := DSL-2640U/BRU/C + CFE_BOARD_ID := 96338W2_E7T + CFE_CHIP_ID := 6338 + DEVICE_PACKAGES := $(B43_PACKAGES) + DEFAULT := n +endef +TARGET_DEVICES += d-link_dsl-2640u + +define Device/d-link_dsl-2650u + $(Device/bcm63xx) + DEVICE_VENDOR := D-Link + DEVICE_MODEL := DSL-2650U + CFE_BOARD_ID := 96358VW2 + CFE_CHIP_ID := 6358 + DEVICE_PACKAGES := $(B43_PACKAGES) $(USB2_PACKAGES) +endef +TARGET_DEVICES += d-link_dsl-2650u + +define Device/d-link_dsl-274xb-c2 + $(Device/bcm63xx) + DEVICE_VENDOR := D-Link + DEVICE_MODEL := DSL-2740B + DEVICE_VARIANT := C2 + DEVICE_ALT0_VENDOR := D-Link + DEVICE_ALT0_MODEL := DSL-2741B + DEVICE_ALT0_VARIANT := C2 + CFE_BOARD_ID := 96358GW + CFE_CHIP_ID := 6358 + DEVICE_PACKAGES := $(B43_PACKAGES) +endef +TARGET_DEVICES += d-link_dsl-274xb-c2 + +define Device/d-link_dsl-274xb-c3 + $(Device/bcm63xx) + DEVICE_VENDOR := D-Link + DEVICE_MODEL := DSL-2740B + DEVICE_VARIANT := C3 + DEVICE_ALT0_VENDOR := D-Link + DEVICE_ALT0_MODEL := DSL-2741B + DEVICE_ALT0_VARIANT := C3 + DEVICE_DTS := bcm6358-d-link-dsl-274xb-c2 + CFE_BOARD_ID := AW4139 + CFE_CHIP_ID := 6358 + DEVICE_PACKAGES := $(B43_PACKAGES) +endef +TARGET_DEVICES += d-link_dsl-274xb-c3 + +define Device/d-link_dsl-274xb-f1 + $(Device/bcm63xx) + DEVICE_VENDOR := D-Link + DEVICE_MODEL := DSL-2740B + DEVICE_VARIANT := F1 + DEVICE_ALT0_VENDOR := D-Link + DEVICE_ALT0_MODEL := DSL-2741B + DEVICE_ALT0_VARIANT := F1 + CFE_BOARD_ID := AW4339U + CFE_CHIP_ID := 6328 + IMAGES := cfe-EU.bin cfe-AU.bin + IMAGE/cfe-AU.bin := cfe-bin --signature2 "4.06.01.AUF1" --pad 4 + IMAGE/cfe-EU.bin := cfe-bin --signature2 "4.06.01.EUF1" --pad 4 + DEVICE_PACKAGES := $(ATH9K_PACKAGES) +endef +TARGET_DEVICES += d-link_dsl-274xb-f1 + +define Device/d-link_dsl-275xb-d1 + $(Device/bcm63xx) + DEVICE_VENDOR := D-Link + DEVICE_MODEL := DSL-2750B + DEVICE_VARIANT := D1 + DEVICE_ALT0_VENDOR := D-Link + DEVICE_ALT0_MODEL := DSL-2751 + DEVICE_ALT0_VARIANT := D1 + CFE_BOARD_ID := AW5200B + CFE_CHIP_ID := 6318 + FLASH_MB := 8 + DEVICE_PACKAGES := $(B43_PACKAGES) $(USB2_PACKAGES) +endef +TARGET_DEVICES += d-link_dsl-275xb-d1 + +define Device/d-link_dva-g3810bn-tl + $(Device/bcm63xx) + DEVICE_VENDOR := D-Link + DEVICE_MODEL := DVA-G3810BN/TL + CFE_BOARD_ID := 96358VW + CFE_CHIP_ID := 6358 + DEVICE_PACKAGES := $(B43_PACKAGES) $(USB2_PACKAGES) +endef +TARGET_DEVICES += d-link_dva-g3810bn-tl + +### Davolink ### +define Device/davolink_dv-201amr + $(Device/bcm63xx) + DEVICE_VENDOR := Davolink + DEVICE_MODEL := DV-201AMR + IMAGES := cfe-old.bin + CFE_BOARD_ID := DV201AMR + CFE_CHIP_ID := 6348 + DEVICE_PACKAGES := $(B43_PACKAGES) + DEFAULT := n +endef +TARGET_DEVICES += davolink_dv-201amr + +### Dynalink ### +define Device/dynalink_rta770bw + $(Device/bcm63xx) + DEVICE_VENDOR := Dynalink + DEVICE_MODEL := RTA770BW + DEVICE_ALT0_VENDOR := Siemens + DEVICE_ALT0_MODEL := SE515 + IMAGES = + CFE_BOARD_ID := RTA770BW + CFE_CHIP_ID := 6345 + CFE_EXTRAS += --layoutver 5 + DEVICE_PACKAGES := $(B43_PACKAGES) + DEFAULT := n +endef +TARGET_DEVICES += dynalink_rta770bw + +define Device/dynalink_rta770w + $(Device/bcm63xx) + DEVICE_VENDOR := Dynalink + DEVICE_MODEL := RTA770W + IMAGES = + CFE_BOARD_ID := RTA770W + CFE_CHIP_ID := 6345 + CFE_EXTRAS += --layoutver 5 + DEVICE_PACKAGES := $(B43_PACKAGES) + DEFAULT := n +endef +TARGET_DEVICES += dynalink_rta770w + +define Device/dynalink_rta1025w + $(Device/bcm63xx) + DEVICE_VENDOR := Dynalink + DEVICE_MODEL := RTA1025W + CFE_BOARD_ID := RTA1025W_16 + CFE_CHIP_ID := 6348 + CFE_EXTRAS += --layoutver 5 + DEVICE_PACKAGES := $(B43_PACKAGES) + DEFAULT := n +endef +TARGET_DEVICES += dynalink_rta1025w + +define Device/dynalink_rta1320 + $(Device/bcm63xx) + DEVICE_VENDOR := Dynalink + DEVICE_MODEL := RTA1320 + CFE_BOARD_ID := RTA1320_16M + CFE_CHIP_ID := 6338 + CFE_EXTRAS += --layoutver 5 + DEFAULT := n +endef +TARGET_DEVICES += dynalink_rta1320 + +### Huawei ### +define Device/huawei_echolife-hg520v + $(Device/bcm63xx) + DEVICE_VENDOR := Huawei + DEVICE_MODEL := EchoLife HG520v + CFE_BOARD_ID := HW6358GW_B + CFE_CHIP_ID := 6358 + CFE_EXTRAS += --rsa-signature "EchoLife_HG520v" + SOC := bcm6359 + DEVICE_PACKAGES := $(B43_PACKAGES) +endef +TARGET_DEVICES += huawei_echolife-hg520v + +define Device/huawei_echolife-hg553 + $(Device/bcm63xx) + DEVICE_VENDOR := Huawei + DEVICE_MODEL := EchoLife HG553 + CFE_BOARD_ID := HW553 + CFE_CHIP_ID := 6358 + CFE_EXTRAS += --rsa-signature "EchoLife_HG553" --tag-version 7 + BLOCK_SIZE := 0x20000 + DEVICE_PACKAGES := $(B43_PACKAGES) $(USB2_PACKAGES) +endef +TARGET_DEVICES += huawei_echolife-hg553 + +define Device/huawei_echolife-hg556a-a + $(Device/bcm63xx) + DEVICE_VENDOR := Huawei + DEVICE_MODEL := EchoLife HG556a + DEVICE_VARIANT := A + DEVICE_DESCRIPTION = Build firmware images for Huawei HG556a version A (Atheros) + CFE_BOARD_ID := HW556 + CFE_CHIP_ID := 6358 + CFE_EXTRAS += --rsa-signature "EchoLife_HG556a" --tag-version 8 + IMAGE_OFFSET := 0x20000 + DEVICE_PACKAGES := $(ATH9K_PACKAGES) $(USB2_PACKAGES) +endef +TARGET_DEVICES += huawei_echolife-hg556a-a + +define Device/huawei_echolife-hg556a-b + $(Device/bcm63xx) + DEVICE_VENDOR := Huawei + DEVICE_MODEL := EchoLife HG556a + DEVICE_VARIANT := B + DEVICE_DESCRIPTION = Build firmware images for Huawei HG556a version B (Atheros) + CFE_BOARD_ID := HW556 + CFE_CHIP_ID := 6358 + CFE_EXTRAS += --rsa-signature "EchoLife_HG556a" --tag-version 8 + BLOCK_SIZE := 0x20000 + DEVICE_PACKAGES := $(ATH9K_PACKAGES) $(USB2_PACKAGES) +endef +TARGET_DEVICES += huawei_echolife-hg556a-b + +define Device/huawei_echolife-hg556a-c + $(Device/bcm63xx) + DEVICE_VENDOR := Huawei + DEVICE_MODEL := EchoLife HG556a + DEVICE_VARIANT := C + DEVICE_DESCRIPTION = Build firmware images for Huawei HG556a version C (Ralink) + CFE_BOARD_ID := HW556 + CFE_CHIP_ID := 6358 + CFE_EXTRAS += --rsa-signature "EchoLife_HG556a" --tag-version 8 + BLOCK_SIZE := 0x20000 + DEVICE_PACKAGES := $(RT28_PACKAGES) $(USB2_PACKAGES) +endef +TARGET_DEVICES += huawei_echolife-hg556a-c + +define Device/huawei_echolife-hg622 + $(Device/bcm63xx) + DEVICE_VENDOR := Huawei + DEVICE_MODEL := EchoLife HG622 + IMAGES += sysupgrade.bin + CFE_BOARD_ID := 96368MVWG_hg622 + CFE_CHIP_ID := 6368 + CFE_EXTRAS += --tag-version 7 + BLOCK_SIZE := 0x20000 + FLASH_MB := 16 + DEVICE_PACKAGES := $(RT28_PACKAGES) $(USB2_PACKAGES) +endef +TARGET_DEVICES += huawei_echolife-hg622 + +define Device/huawei_echolife-hg655b + $(Device/bcm63xx) + DEVICE_VENDOR := Huawei + DEVICE_MODEL := EchoLife HG655b + CFE_BOARD_ID := HW65x + CFE_CHIP_ID := 6368 + CFE_EXTRAS += --tag-version 7 + IMAGE_OFFSET := 0x20000 + FLASH_MB := 8 + DEVICE_PACKAGES := $(RT28_PACKAGES) $(USB2_PACKAGES) +endef +TARGET_DEVICES += huawei_echolife-hg655b + +### Inteno ### +define Device/inteno_vg50 + $(Device/bcm63xx) + DEVICE_VENDOR := Inteno + DEVICE_MODEL := VG50 Multi-WAN CPE + IMAGES := + CFE_BOARD_ID := VW6339GU + CFE_CHIP_ID := 63268 + DEVICE_PACKAGES := $(USB2_PACKAGES) +endef +TARGET_DEVICES += inteno_vg50 + +### Inventel ### +define Device/inventel_livebox-1 + $(Device/bcm63xx_redboot) + DEVICE_VENDOR := Inventel + DEVICE_MODEL := Livebox 1 + SOC := bcm6348 + DEVICE_PACKAGES := $(B43_PACKAGES) $(USB1_PACKAGES) + DEFAULT := n +endef +TARGET_DEVICES += inventel_livebox-1 + +### Netgear ### +define Device/netgear_cvg834g + $(Device/bcm33xx) + DEVICE_VENDOR := NETGEAR + DEVICE_MODEL := CVG834G + SOC := bcm3368 + HCS_MAGIC_BYTES := 0xa020 + HCS_REV_MIN := 0001 + HCS_REV_MAJ := 0022 +endef +TARGET_DEVICES += netgear_cvg834g + +define Device/netgear_dg834gt-pn + $(Device/bcm63xx) + DEVICE_VENDOR := NETGEAR + DEVICE_MODEL := DG834GT + DEVICE_ALT0_VENDOR := NETGEAR + DEVICE_ALT0_MODEL := DG834PN + CFE_BOARD_ID := 96348GW-10 + CFE_CHIP_ID := 6348 + DEVICE_PACKAGES := $(ATH5K_PACKAGES) + DEFAULT := n +endef +TARGET_DEVICES += netgear_dg834gt-pn + +define Device/netgear_dg834g-v4 + $(Device/bcm63xx) + DEVICE_VENDOR := NETGEAR + DEVICE_MODEL := DG834G + DEVICE_VARIANT := v4 + IMAGES := + CFE_BOARD_ID := 96348W3 + CFE_CHIP_ID := 6348 + DEVICE_PACKAGES := $(B43_PACKAGES) + DEFAULT := n +endef +TARGET_DEVICES += netgear_dg834g-v4 + +define Device/netgear_dgnd3700-v1 + $(Device/bcm63xx_netgear) + DEVICE_MODEL := DGND3700 + DEVICE_VARIANT := v1 + CFE_BOARD_ID := 96368MVWG + CFE_CHIP_ID := 6368 + BLOCK_SIZE := 0x20000 + NETGEAR_BOARD_ID := U12L144T01_NETGEAR_NEWLED + NETGEAR_REGION := 1 + DEVICE_PACKAGES := $(B43_PACKAGES) $(USB2_PACKAGES) +endef +TARGET_DEVICES += netgear_dgnd3700-v1 + +define Device/netgear_dgnd3800b + $(Device/bcm63xx_netgear) + DEVICE_MODEL := DGND3800B + DEVICE_DTS := bcm6368-netgear-dgnd3700-v1 + CFE_BOARD_ID := 96368MVWG + CFE_CHIP_ID := 6368 + BLOCK_SIZE := 0x20000 + NETGEAR_BOARD_ID := U12L144T11_NETGEAR_NEWLED + NETGEAR_REGION := 1 + DEVICE_PACKAGES := $(B43_PACKAGES) $(USB2_PACKAGES) +endef +TARGET_DEVICES += netgear_dgnd3800b + +define Device/netgear_evg2000 + $(Device/bcm63xx_netgear) + DEVICE_MODEL := EVG2000 + CFE_BOARD_ID := 96369PVG + CFE_CHIP_ID := 6368 + BLOCK_SIZE := 0x20000 + NETGEAR_BOARD_ID := U12H154T90_NETGEAR + NETGEAR_REGION := 1 + SOC := bcm6369 + DEVICE_PACKAGES := $(B43_PACKAGES) $(USB2_PACKAGES) +endef +TARGET_DEVICES += netgear_evg2000 + +### NuCom ### +define Device/nucom_r5010un-v2 + $(Device/bcm63xx) + DEVICE_VENDOR := NuCom + DEVICE_MODEL := R5010UN + DEVICE_VARIANT := v2 + IMAGES += sysupgrade.bin + CFE_BOARD_ID := 96328ang + CFE_CHIP_ID := 6328 + FLASH_MB := 16 + DEVICE_PACKAGES := $(B43_PACKAGES) +endef +TARGET_DEVICES += nucom_r5010un-v2 + +### Observa ### +define Device/observa_vh4032n + $(Device/bcm63xx) + DEVICE_VENDOR := Observa + DEVICE_MODEL := VH4032N + IMAGES += sysupgrade.bin + CFE_BOARD_ID := 96368VVW + CFE_CHIP_ID := 6368 + BLOCK_SIZE := 0x20000 + FLASH_MB := 32 + DEVICE_PACKAGES := $(B43_PACKAGES) $(USB2_PACKAGES) +endef +TARGET_DEVICES += observa_vh4032n + +### Pirelli ### +define Device/pirelli_a226g + $(Device/bcm63xx) + DEVICE_VENDOR := Pirelli + DEVICE_MODEL := A226G + CFE_BOARD_ID := DWV-S0 + CFE_CHIP_ID := 6358 + CFE_EXTRAS += --signature2 IMAGE --tag-version 8 + DEVICE_PACKAGES := $(B43_PACKAGES) $(USB2_PACKAGES) +endef +TARGET_DEVICES += pirelli_a226g + +define Device/pirelli_a226m + $(Device/bcm63xx) + DEVICE_VENDOR := Pirelli + DEVICE_MODEL := A226M + CFE_BOARD_ID := DWV-S0 + CFE_CHIP_ID := 6358 + CFE_EXTRAS += --signature2 IMAGE --tag-version 8 + DEVICE_PACKAGES := $(USB2_PACKAGES) +endef +TARGET_DEVICES += pirelli_a226m + +define Device/pirelli_a226m-fwb + $(Device/bcm63xx) + DEVICE_VENDOR := Pirelli + DEVICE_MODEL := A226M-FWB + CFE_BOARD_ID := DWV-S0 + CFE_CHIP_ID := 6358 + CFE_EXTRAS += --signature2 IMAGE --tag-version 8 + BLOCK_SIZE := 0x20000 + DEVICE_PACKAGES := $(USB2_PACKAGES) +endef +TARGET_DEVICES += pirelli_a226m-fwb + +define Device/pirelli_agpf-s0 + $(Device/bcm63xx) + DEVICE_VENDOR := Pirelli + DEVICE_MODEL := Alice Gate VoIP 2 Plus Wi-Fi AGPF-S0 + CFE_BOARD_ID := AGPF-S0 + CFE_CHIP_ID := 6358 + CFE_EXTRAS += --signature2 IMAGE --tag-version 8 + BLOCK_SIZE := 0x20000 + DEVICE_PACKAGES := $(B43_PACKAGES) $(USB2_PACKAGES) +endef +TARGET_DEVICES += pirelli_agpf-s0 + +### Sagem ### +define Device/sagem_fast-2404 + $(Device/bcm63xx) + DEVICE_VENDOR := Sagemcom + DEVICE_MODEL := F@st 2404 + CFE_BOARD_ID := F@ST2404 + CFE_CHIP_ID := 6348 + DEVICE_PACKAGES := $(B43_PACKAGES) + DEFAULT := n +endef +TARGET_DEVICES += sagem_fast-2404 + +define Device/sagem_fast-2504n + $(Device/bcm63xx) + DEVICE_VENDOR := Sagemcom + DEVICE_MODEL := F@st 2504N + CFE_BOARD_ID := F@ST2504n + CFE_CHIP_ID := 6362 + DEVICE_PACKAGES := $(B43_PACKAGES) +endef +TARGET_DEVICES += sagem_fast-2504n + +define Device/sagem_fast-2604 + $(Device/bcm63xx) + DEVICE_VENDOR := Sagemcom + DEVICE_MODEL := F@st 2604 + CFE_BOARD_ID := F@ST2604 + CFE_CHIP_ID := 6348 + DEVICE_PACKAGES := $(B43_PACKAGES) + DEFAULT := n +endef +TARGET_DEVICES += sagem_fast-2604 + +define Device/sagem_fast-2704n + $(Device/bcm63xx) + DEVICE_VENDOR := Sagemcom + DEVICE_MODEL := F@st 2704N + CFE_BOARD_ID := F@ST2704N + CFE_CHIP_ID := 6318 + FLASH_MB := 8 + DEVICE_PACKAGES := $(B43_PACKAGES) $(USB2_PACKAGES) +endef +TARGET_DEVICES += sagem_fast-2704n + +define Device/sagem_fast-2704-v2 + $(Device/bcm63xx) + DEVICE_VENDOR := Sagemcom + DEVICE_MODEL := F@st 2704 + DEVICE_VARIANT := V2 + CFE_BOARD_ID := F@ST2704V2 + CFE_CHIP_ID := 6328 + FLASH_MB := 8 + DEVICE_PACKAGES := $(B43_PACKAGES) $(USB2_PACKAGES) +endef +TARGET_DEVICES += sagem_fast-2704-v2 + +### Sercomm ### +define Device/sercomm_ad1018-nor + $(Device/bcm63xx) + DEVICE_VENDOR := Sercomm + DEVICE_MODEL := AD1018 + DEVICE_VARIANT := SPI flash mod + CFE_BOARD_ID := 96328avngr + CFE_CHIP_ID := 6328 + DEVICE_PACKAGES := $(B43_PACKAGES) $(USB2_PACKAGES) +endef +TARGET_DEVICES += sercomm_ad1018-nor + +### SFR ### +define Device/sfr_neufbox-4-sercomm-r0 + $(Device/bcm63xx) + DEVICE_VENDOR := SFR + DEVICE_MODEL := Neufbox 4 + DEVICE_VARIANT := Sercomm + CFE_BOARD_ID := 96358VW + CFE_CHIP_ID := 6358 + CFE_EXTRAS += --rsa-signature "$(VERSION_DIST)-$(firstword $(subst -,$(space),$(REVISION)))" + DEVICE_PACKAGES := $(B43_PACKAGES) $(USB2_PACKAGES) +endef +TARGET_DEVICES += sfr_neufbox-4-sercomm-r0 + +define Device/sfr_neufbox-4-foxconn-r1 + $(Device/bcm63xx) + DEVICE_VENDOR := SFR + DEVICE_MODEL := Neufbox 4 + DEVICE_VARIANT := Foxconn + CFE_BOARD_ID := 96358VW + CFE_CHIP_ID := 6358 + CFE_EXTRAS += --rsa-signature "$(VERSION_DIST)-$(firstword $(subst -,$(space),$(REVISION)))" + DEVICE_PACKAGES := $(B43_PACKAGES) $(USB2_PACKAGES) +endef +TARGET_DEVICES += sfr_neufbox-4-foxconn-r1 + +define Device/sfr_neufbox-6-sercomm-r0 + $(Device/bcm63xx) + DEVICE_VENDOR := SFR + DEVICE_MODEL := Neufbox 6 + CFE_BOARD_ID := NB6-SER-r0 + CFE_CHIP_ID := 6362 + CFE_EXTRAS += --rsa-signature "$(VERSION_DIST)-$(firstword $(subst -,$(space),$(REVISION)))" + SOC := bcm6361 + DEVICE_PACKAGES := $(USB2_PACKAGES) +endef +TARGET_DEVICES += sfr_neufbox-6-sercomm-r0 + +define Device/sky_sr102 + $(Device/bcm63xx) + DEVICE_VENDOR := SKY + DEVICE_MODEL := SR102 + CFE_BOARD_ID := BSKYB_63168 + CFE_CHIP_ID := 63268 + CFE_EXTRAS += --rsa-signature "$(VERSION_DIST)-$(firstword $(subst -,$(space),$(REVISION)))" + SOC := bcm63168 + DEVICE_PACKAGES := $(USB2_PACKAGES) +endef +TARGET_DEVICES += sky_sr102 + +### T-Com ### +define Device/t-com_speedport-w-303v + $(Device/bcm63xx) + DEVICE_VENDOR := T-Com + DEVICE_MODEL := Speedport W 303V + IMAGES := factory.bin sysupgrade.bin + IMAGE/factory.bin := cfe-spw303v-bin --pad 4 | spw303v-bin | xor-image + IMAGE/sysupgrade.bin := cfe-spw303v-bin | spw303v-bin + CFE_BOARD_ID := 96358-502V + CFE_CHIP_ID := 6358 + DEVICE_PACKAGES := $(B43_PACKAGES) +endef +TARGET_DEVICES += t-com_speedport-w-303v + +define Device/t-com_speedport-w-500v + $(Device/bcm63xx) + DEVICE_VENDOR := T-Com + DEVICE_MODEL := Speedport W 500V + CFE_BOARD_ID := 96348GW + CFE_CHIP_ID := 6348 + DEVICE_PACKAGES := $(B43_PACKAGES) + DEFAULT := n +endef +TARGET_DEVICES += t-com_speedport-w-500v + +### Tecom ### +define Device/tecom_gw6000 + $(Device/bcm63xx) + DEVICE_VENDOR := Tecom + DEVICE_MODEL := GW6000 + CFE_BOARD_ID := 96348GW + CFE_CHIP_ID := 6348 + DEVICE_PACKAGES := $(BRCMWL_PACKAGES) $(USB1_PACKAGES) +endef +TARGET_DEVICES += tecom_gw6000 + +define Device/tecom_gw6200 + $(Device/bcm63xx) + DEVICE_VENDOR := Tecom + DEVICE_MODEL := GW6200 + CFE_BOARD_ID := 96348GW + CFE_CHIP_ID := 6348 + CFE_EXTRAS += --rsa-signature "$(shell printf '\x99')" + DEVICE_PACKAGES := $(BRCMWL_PACKAGES) $(USB1_PACKAGES) +endef +TARGET_DEVICES += tecom_gw6200 + +### Telsey ### +define Device/telsey_cpva502plus + $(Device/bcm63xx) + DEVICE_VENDOR := Telsey + DEVICE_MODEL := CPVA502+ + CFE_BOARD_ID := CPVA502+ + CFE_CHIP_ID := 6348 + CFE_EXTRAS += --signature "Telsey Tlc" --signature2 "99.99.999" + DEVICE_PACKAGES := $(B43_PACKAGES) + DEFAULT := n +endef +TARGET_DEVICES += telsey_cpva502plus + +define Device/telsey_cpva642 + $(Device/bcm63xx) + DEVICE_VENDOR := Telsey + DEVICE_MODEL := CPVA642-type (CPA-ZNTE60T) + CFE_BOARD_ID := CPVA642 + CFE_CHIP_ID := 6358 + CFE_EXTRAS += --signature "Telsey Tlc" --signature2 "99.99.999" --second-image-flag "0" + FLASH_MB := 8 + DEVICE_PACKAGES := $(RT63_PACKAGES) $(USB2_PACKAGES) +endef +TARGET_DEVICES += telsey_cpva642 + +define Device/telsey_magic + $(Device/bcm63xx) + DEVICE_VENDOR := Alice + DEVICE_MODEL := W-Gate + DEVICE_ALT0_VENDOR := Telsey + DEVICE_ALT0_MODEL := MAGIC + IMAGES := + CFE_BOARD_ID := MAGIC + CFE_CHIP_ID := 6348 + DEVICE_PACKAGES := $(RT63_PACKAGES) + DEFAULT := n +endef +TARGET_DEVICES += telsey_magic + +### TP-Link ### +define Device/tp-link_td-w8900gb + $(Device/bcm63xx) + DEVICE_VENDOR := TP-Link + DEVICE_MODEL := TD-W8900GB + CFE_BOARD_ID := 96348GW-11 + CFE_CHIP_ID := 6348 + CFE_EXTRAS += --rsa-signature "$(shell printf 'PRID\x89\x10\x00\x02')" + IMAGE_OFFSET := 0x20000 + DEVICE_PACKAGES := $(B43_PACKAGES) + DEFAULT := n +endef +TARGET_DEVICES += tp-link_td-w8900gb + +### USRobotics ### +define Device/usrobotics_usr9108 + $(Device/bcm63xx) + DEVICE_VENDOR := USRobotics + DEVICE_MODEL := USR9108 + CFE_BOARD_ID := 96348GW-A + CFE_CHIP_ID := 6348 + DEVICE_PACKAGES := $(B43_PACKAGES) $(USB1_PACKAGES) + DEFAULT := n +endef +TARGET_DEVICES += usrobotics_usr9108 + +### ZyXEL ### +define Device/zyxel_p870hw-51a-v2 + $(Device/bcm63xx) + DEVICE_VENDOR := ZyXEL + DEVICE_MODEL := P870HW-51a + DEVICE_VARIANT := v2 + IMAGES := factory.bin + IMAGE/factory.bin := cfe-bin | zyxel-bin + CFE_BOARD_ID := 96368VVW + CFE_CHIP_ID := 6368 + CFE_EXTRAS += --rsa-signature "ZyXEL" --signature "ZyXEL_0001" + DEVICE_PACKAGES := $(B43_PACKAGES) +endef +TARGET_DEVICES += zyxel_p870hw-51a-v2 diff --git a/target/linux/bcm63xx/image/lzma-loader/Makefile b/target/linux/bcm63xx/image/lzma-loader/Makefile new file mode 100644 index 0000000000..8d36691cb5 --- /dev/null +++ b/target/linux/bcm63xx/image/lzma-loader/Makefile @@ -0,0 +1,62 @@ +# +# Copyright (C) 2011 OpenWrt.org +# Copyright (C) 2011 Gabor Juhos <juhosg@openwrt.org> +# +# This is free software, licensed under the GNU General Public License v2. +# See /LICENSE for more information. +# + +include $(TOPDIR)/rules.mk + +LZMA_TEXT_START := 0x80a00000 +LOADER := loader.bin +LOADER_NAME := $(basename $(notdir $(LOADER))) +LOADER_DATA := +TARGET_DIR := +FLASH_OFFS := +FLASH_MAX := + +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 + +PKG_NAME := lzma-loader +PKG_BUILD_DIR := $(KDIR)/$(PKG_NAME) + +.PHONY : loader-compile loader.bin loader.elf loader.gz + +$(PKG_BUILD_DIR)/.prepared: + mkdir $(PKG_BUILD_DIR) + $(CP) ./src/* $(PKG_BUILD_DIR)/ + touch $@ + +loader-compile: $(PKG_BUILD_DIR)/.prepared + $(MAKE) -C $(PKG_BUILD_DIR) CROSS_COMPILE="$(TARGET_CROSS)" \ + LZMA_TEXT_START=$(LZMA_TEXT_START) \ + LOADER_DATA=$(LOADER_DATA) \ + FLASH_OFFS=$(FLASH_OFFS) \ + FLASH_MAX=$(FLASH_MAX) \ + clean all + +loader.gz: $(PKG_BUILD_DIR)/loader.bin + gzip -nc9 $< > $(LOADER_GZ) + +loader.elf: $(PKG_BUILD_DIR)/loader.elf + $(CP) $< $(LOADER_ELF) + +loader.bin: $(PKG_BUILD_DIR)/loader.bin + $(CP) $< $(LOADER_BIN) + +download: +prepare: $(PKG_BUILD_DIR)/.prepared +compile: loader-compile + +install: + +clean: + rm -rf $(PKG_BUILD_DIR) + diff --git a/target/linux/bcm63xx/image/lzma-loader/src/LzmaDecode.c b/target/linux/bcm63xx/image/lzma-loader/src/LzmaDecode.c new file mode 100644 index 0000000000..cb8345377e --- /dev/null +++ b/target/linux/bcm63xx/image/lzma-loader/src/LzmaDecode.c @@ -0,0 +1,584 @@ +/* + LzmaDecode.c + LZMA Decoder (optimized for Speed version) + + LZMA SDK 4.40 Copyright (c) 1999-2006 Igor Pavlov (2006-05-01) + 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" + +#define kNumTopBits 24 +#define kTopValue ((UInt32)1 << kNumTopBits) + +#define kNumBitModelTotalBits 11 +#define kBitModelTotal (1 << kNumBitModelTotalBits) +#define kNumMoveBits 5 + +#define RC_READ_BYTE (*Buffer++) + +#define RC_INIT2 Code = 0; Range = 0xFFFFFFFF; \ + { int i; for(i = 0; i < 5; i++) { RC_TEST; Code = (Code << 8) | RC_READ_BYTE; }} + +#ifdef _LZMA_IN_CB + +#define RC_TEST { if (Buffer == BufferLim) \ + { SizeT size; int result = InCallback->Read(InCallback, &Buffer, &size); if (result != LZMA_RESULT_OK) return result; \ + BufferLim = Buffer + size; if (size == 0) return LZMA_RESULT_DATA_ERROR; }} + +#define RC_INIT Buffer = BufferLim = 0; RC_INIT2 + +#else + +#define RC_TEST { if (Buffer == BufferLim) return LZMA_RESULT_DATA_ERROR; } + +#define RC_INIT(buffer, bufferSize) Buffer = buffer; BufferLim = buffer + bufferSize; RC_INIT2 + +#endif + +#define RC_NORMALIZE if (Range < kTopValue) { RC_TEST; Range <<= 8; Code = (Code << 8) | RC_READ_BYTE; } + +#define IfBit0(p) RC_NORMALIZE; bound = (Range >> kNumBitModelTotalBits) * *(p); if (Code < bound) +#define UpdateBit0(p) Range = bound; *(p) += (kBitModelTotal - *(p)) >> kNumMoveBits; +#define UpdateBit1(p) Range -= bound; Code -= bound; *(p) -= (*(p)) >> kNumMoveBits; + +#define RC_GET_BIT2(p, mi, A0, A1) IfBit0(p) \ + { UpdateBit0(p); mi <<= 1; A0; } else \ + { UpdateBit1(p); mi = (mi + mi) + 1; A1; } + +#define RC_GET_BIT(p, mi) RC_GET_BIT2(p, mi, ; , ;) + +#define RangeDecoderBitTreeDecode(probs, numLevels, res) \ + { int i = numLevels; res = 1; \ + do { CProb *p = probs + res; RC_GET_BIT(p, res) } while(--i != 0); \ + res -= (1 << numLevels); } + + +#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) + + +#define kNumStates 12 +#define kNumLitStates 7 + +#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 + +int LzmaDecodeProperties(CLzmaProperties *propsRes, const unsigned char *propsData, int size) +{ + unsigned char prop0; + if (size < LZMA_PROPERTIES_SIZE) + return LZMA_RESULT_DATA_ERROR; + prop0 = propsData[0]; + if (prop0 >= (9 * 5 * 5)) + return LZMA_RESULT_DATA_ERROR; + { + for (propsRes->pb = 0; prop0 >= (9 * 5); propsRes->pb++, prop0 -= (9 * 5)); + for (propsRes->lp = 0; prop0 >= 9; propsRes->lp++, prop0 -= 9); + propsRes->lc = prop0; + /* + unsigned char remainder = (unsigned char)(prop0 / 9); + propsRes->lc = prop0 % 9; + propsRes->pb = remainder / 5; + propsRes->lp = remainder % 5; + */ + } + + #ifdef _LZMA_OUT_READ + { + int i; + propsRes->DictionarySize = 0; + for (i = 0; i < 4; i++) + propsRes->DictionarySize += (UInt32)(propsData[1 + i]) << (i * 8); + if (propsRes->DictionarySize == 0) + propsRes->DictionarySize = 1; + } + #endif + return LZMA_RESULT_OK; +} + +#define kLzmaStreamWasFinishedId (-1) + +int LzmaDecode(CLzmaDecoderState *vs, + #ifdef _LZMA_IN_CB + ILzmaInCallback *InCallback, + #else + const unsigned char *inStream, SizeT inSize, SizeT *inSizeProcessed, + #endif + unsigned char *outStream, SizeT outSize, SizeT *outSizeProcessed) +{ + CProb *p = vs->Probs; + SizeT nowPos = 0; + Byte previousByte = 0; + UInt32 posStateMask = (1 << (vs->Properties.pb)) - 1; + UInt32 literalPosMask = (1 << (vs->Properties.lp)) - 1; + int lc = vs->Properties.lc; + + #ifdef _LZMA_OUT_READ + + UInt32 Range = vs->Range; + UInt32 Code = vs->Code; + #ifdef _LZMA_IN_CB + const Byte *Buffer = vs->Buffer; + const Byte *BufferLim = vs->BufferLim; + #else + const Byte *Buffer = inStream; + const Byte *BufferLim = inStream + inSize; + #endif + int state = vs->State; + UInt32 rep0 = vs->Reps[0], rep1 = vs->Reps[1], rep2 = vs->Reps[2], rep3 = vs->Reps[3]; + int len = vs->RemainLen; + UInt32 globalPos = vs->GlobalPos; + UInt32 distanceLimit = vs->DistanceLimit; + + Byte *dictionary = vs->Dictionary; + UInt32 dictionarySize = vs->Properties.DictionarySize; + UInt32 dictionaryPos = vs->DictionaryPos; + + Byte tempDictionary[4]; + + #ifndef _LZMA_IN_CB + *inSizeProcessed = 0; + #endif + *outSizeProcessed = 0; + if (len == kLzmaStreamWasFinishedId) + return LZMA_RESULT_OK; + + if (dictionarySize == 0) + { + dictionary = tempDictionary; + dictionarySize = 1; + tempDictionary[0] = vs->TempDictionary[0]; + } + + if (len == kLzmaNeedInitId) + { + { + UInt32 numProbs = Literal + ((UInt32)LZMA_LIT_SIZE << (lc + vs->Properties.lp)); + UInt32 i; + for (i = 0; i < numProbs; i++) + p[i] = kBitModelTotal >> 1; + rep0 = rep1 = rep2 = rep3 = 1; + state = 0; + globalPos = 0; + distanceLimit = 0; + dictionaryPos = 0; + dictionary[dictionarySize - 1] = 0; + #ifdef _LZMA_IN_CB + RC_INIT; + #else + RC_INIT(inStream, inSize); + #endif + } + len = 0; + } + 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 /* if !_LZMA_OUT_READ */ + + int state = 0; + UInt32 rep0 = 1, rep1 = 1, rep2 = 1, rep3 = 1; + int len = 0; + const Byte *Buffer; + const Byte *BufferLim; + UInt32 Range; + UInt32 Code; + + #ifndef _LZMA_IN_CB + *inSizeProcessed = 0; + #endif + *outSizeProcessed = 0; + + { + UInt32 i; + UInt32 numProbs = Literal + ((UInt32)LZMA_LIT_SIZE << (lc + vs->Properties.lp)); + for (i = 0; i < numProbs; i++) + p[i] = kBitModelTotal >> 1; + } + + #ifdef _LZMA_IN_CB + RC_INIT; + #else + RC_INIT(inStream, inSize); + #endif + + #endif /* _LZMA_OUT_READ */ + + while(nowPos < outSize) + { + CProb *prob; + UInt32 bound; + int posState = (int)( + (nowPos + #ifdef _LZMA_OUT_READ + + globalPos + #endif + ) + & posStateMask); + + prob = p + IsMatch + (state << kNumPosBitsMax) + posState; + IfBit0(prob) + { + int symbol = 1; + UpdateBit0(prob) + prob = p + Literal + (LZMA_LIT_SIZE * + ((( + (nowPos + #ifdef _LZMA_OUT_READ + + globalPos + #endif + ) + & literalPosMask) << lc) + (previousByte >> (8 - lc)))); + + if (state >= kNumLitStates) + { + int matchByte; + #ifdef _LZMA_OUT_READ + UInt32 pos = dictionaryPos - rep0; + if (pos >= dictionarySize) + pos += dictionarySize; + matchByte = dictionary[pos]; + #else + matchByte = outStream[nowPos - rep0]; + #endif + do + { + int bit; + CProb *probLit; + matchByte <<= 1; + bit = (matchByte & 0x100); + probLit = prob + 0x100 + bit + symbol; + RC_GET_BIT2(probLit, symbol, if (bit != 0) break, if (bit == 0) break) + } + while (symbol < 0x100); + } + while (symbol < 0x100) + { + CProb *probLit = prob + symbol; + RC_GET_BIT(probLit, symbol) + } + previousByte = (Byte)symbol; + + outStream[nowPos++] = previousByte; + #ifdef _LZMA_OUT_READ + if (distanceLimit < dictionarySize) + distanceLimit++; + + dictionary[dictionaryPos] = previousByte; + if (++dictionaryPos == dictionarySize) + dictionaryPos = 0; + #endif + if (state < 4) state = 0; + else if (state < 10) state -= 3; + else state -= 6; + } + else + { + UpdateBit1(prob); + prob = p + IsRep + state; + IfBit0(prob) + { + UpdateBit0(prob); + rep3 = rep2; + rep2 = rep1; + rep1 = rep0; + state = state < kNumLitStates ? 0 : 3; + prob = p + LenCoder; + } + else + { + UpdateBit1(prob); + prob = p + IsRepG0 + state; + IfBit0(prob) + { + UpdateBit0(prob); + prob = p + IsRep0Long + (state << kNumPosBitsMax) + posState; + IfBit0(prob) + { + #ifdef _LZMA_OUT_READ + UInt32 pos; + #endif + UpdateBit0(prob); + + #ifdef _LZMA_OUT_READ + if (distanceLimit == 0) + #else + if (nowPos == 0) + #endif + return LZMA_RESULT_DATA_ERROR; + + state = state < kNumLitStates ? 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; + #ifdef _LZMA_OUT_READ + if (distanceLimit < dictionarySize) + distanceLimit++; + #endif + + continue; + } + else + { + UpdateBit1(prob); + } + } + else + { + UInt32 distance; + UpdateBit1(prob); + prob = p + IsRepG1 + state; + IfBit0(prob) + { + UpdateBit0(prob); + distance = rep1; + } + else + { + UpdateBit1(prob); + prob = p + IsRepG2 + state; + IfBit0(prob) + { + UpdateBit0(prob); + distance = rep2; + } + else + { + UpdateBit1(prob); + distance = rep3; + rep3 = rep2; + } + rep2 = rep1; + } + rep1 = rep0; + rep0 = distance; + } + state = state < kNumLitStates ? 8 : 11; + prob = p + RepLenCoder; + } + { + int numBits, offset; + CProb *probLen = prob + LenChoice; + IfBit0(probLen) + { + UpdateBit0(probLen); + probLen = prob + LenLow + (posState << kLenNumLowBits); + offset = 0; + numBits = kLenNumLowBits; + } + else + { + UpdateBit1(probLen); + probLen = prob + LenChoice2; + IfBit0(probLen) + { + UpdateBit0(probLen); + probLen = prob + LenMid + (posState << kLenNumMidBits); + offset = kLenNumLowSymbols; + numBits = kLenNumMidBits; + } + else + { + UpdateBit1(probLen); + probLen = prob + LenHigh; + offset = kLenNumLowSymbols + kLenNumMidSymbols; + numBits = kLenNumHighBits; + } + } + RangeDecoderBitTreeDecode(probLen, numBits, len); + len += offset; + } + + if (state < 4) + { + int posSlot; + state += kNumLitStates; + prob = p + PosSlot + + ((len < kNumLenToPosStates ? len : kNumLenToPosStates - 1) << + kNumPosSlotBits); + RangeDecoderBitTreeDecode(prob, kNumPosSlotBits, posSlot); + if (posSlot >= kStartPosModelIndex) + { + int numDirectBits = ((posSlot >> 1) - 1); + rep0 = (2 | ((UInt32)posSlot & 1)); + if (posSlot < kEndPosModelIndex) + { + rep0 <<= numDirectBits; + prob = p + SpecPos + rep0 - posSlot - 1; + } + else + { + numDirectBits -= kNumAlignBits; + do + { + RC_NORMALIZE + Range >>= 1; + rep0 <<= 1; + if (Code >= Range) + { + Code -= Range; + rep0 |= 1; + } + } + while (--numDirectBits != 0); + prob = p + Align; + rep0 <<= kNumAlignBits; + numDirectBits = kNumAlignBits; + } + { + int i = 1; + int mi = 1; + do + { + CProb *prob3 = prob + mi; + RC_GET_BIT2(prob3, mi, ; , rep0 |= i); + i <<= 1; + } + while(--numDirectBits != 0); + } + } + else + rep0 = posSlot; + if (++rep0 == (UInt32)(0)) + { + /* it's for stream version */ + len = kLzmaStreamWasFinishedId; + break; + } + } + + len += kMatchMinLen; + #ifdef _LZMA_OUT_READ + if (rep0 > distanceLimit) + #else + if (rep0 > nowPos) + #endif + return LZMA_RESULT_DATA_ERROR; + + #ifdef _LZMA_OUT_READ + if (dictionarySize - distanceLimit > (UInt32)len) + distanceLimit += len; + else + distanceLimit = dictionarySize; + #endif + + 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 + len--; + outStream[nowPos++] = previousByte; + } + while(len != 0 && nowPos < outSize); + } + } + RC_NORMALIZE; + + #ifdef _LZMA_OUT_READ + vs->Range = Range; + vs->Code = Code; + vs->DictionaryPos = dictionaryPos; + vs->GlobalPos = globalPos + (UInt32)nowPos; + vs->DistanceLimit = distanceLimit; + vs->Reps[0] = rep0; + vs->Reps[1] = rep1; + vs->Reps[2] = rep2; + vs->Reps[3] = rep3; + vs->State = state; + vs->RemainLen = len; + vs->TempDictionary[0] = tempDictionary[0]; + #endif + + #ifdef _LZMA_IN_CB + vs->Buffer = Buffer; + vs->BufferLim = BufferLim; + #else + *inSizeProcessed = (SizeT)(Buffer - inStream); + #endif + *outSizeProcessed = nowPos; + return LZMA_RESULT_OK; +} diff --git a/target/linux/bcm63xx/image/lzma-loader/src/LzmaDecode.h b/target/linux/bcm63xx/image/lzma-loader/src/LzmaDecode.h new file mode 100644 index 0000000000..2870eeb9c9 --- /dev/null +++ b/target/linux/bcm63xx/image/lzma-loader/src/LzmaDecode.h @@ -0,0 +1,113 @@ +/* + LzmaDecode.h + LZMA Decoder interface + + LZMA SDK 4.40 Copyright (c) 1999-2006 Igor Pavlov (2006-05-01) + 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 + +#include "LzmaTypes.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 */ + +#ifdef _LZMA_PROB32 +#define CProb UInt32 +#else +#define CProb UInt16 +#endif + +#define LZMA_RESULT_OK 0 +#define LZMA_RESULT_DATA_ERROR 1 + +#ifdef _LZMA_IN_CB +typedef struct _ILzmaInCallback +{ + int (*Read)(void *object, const unsigned char **buffer, SizeT *bufferSize); +} ILzmaInCallback; +#endif + +#define LZMA_BASE_SIZE 1846 +#define LZMA_LIT_SIZE 768 + +#define LZMA_PROPERTIES_SIZE 5 + +typedef struct _CLzmaProperties +{ + int lc; + int lp; + int pb; + #ifdef _LZMA_OUT_READ + UInt32 DictionarySize; + #endif +}CLzmaProperties; + +int LzmaDecodeProperties(CLzmaProperties *propsRes, const unsigned char *propsData, int size); + +#define LzmaGetNumProbs(Properties) (LZMA_BASE_SIZE + (LZMA_LIT_SIZE << ((Properties)->lc + (Properties)->lp))) + +#define kLzmaNeedInitId (-2) + +typedef struct _CLzmaDecoderState +{ + CLzmaProperties Properties; + CProb *Probs; + + #ifdef _LZMA_IN_CB + const unsigned char *Buffer; + const unsigned char *BufferLim; + #endif + + #ifdef _LZMA_OUT_READ + unsigned char *Dictionary; + UInt32 Range; + UInt32 Code; + UInt32 DictionaryPos; + UInt32 GlobalPos; + UInt32 DistanceLimit; + UInt32 Reps[4]; + int State; + int RemainLen; + unsigned char TempDictionary[4]; + #endif +} CLzmaDecoderState; + +#ifdef _LZMA_OUT_READ +#define LzmaDecoderInit(vs) { (vs)->RemainLen = kLzmaNeedInitId; } +#endif + +int LzmaDecode(CLzmaDecoderState *vs, + #ifdef _LZMA_IN_CB + ILzmaInCallback *inCallback, + #else + const unsigned char *inStream, SizeT inSize, SizeT *inSizeProcessed, + #endif + unsigned char *outStream, SizeT outSize, SizeT *outSizeProcessed); + +#endif diff --git a/target/linux/bcm63xx/image/lzma-loader/src/LzmaTypes.h b/target/linux/bcm63xx/image/lzma-loader/src/LzmaTypes.h new file mode 100644 index 0000000000..9c27290757 --- /dev/null +++ b/target/linux/bcm63xx/image/lzma-loader/src/LzmaTypes.h @@ -0,0 +1,45 @@ +/* +LzmaTypes.h + +Types for LZMA Decoder + +This file written and distributed to public domain by Igor Pavlov. +This file is part of LZMA SDK 4.40 (2006-05-01) +*/ + +#ifndef __LZMATYPES_H +#define __LZMATYPES_H + +#ifndef _7ZIP_BYTE_DEFINED +#define _7ZIP_BYTE_DEFINED +typedef unsigned char Byte; +#endif + +#ifndef _7ZIP_UINT16_DEFINED +#define _7ZIP_UINT16_DEFINED +typedef unsigned short UInt16; +#endif + +#ifndef _7ZIP_UINT32_DEFINED +#define _7ZIP_UINT32_DEFINED +#ifdef _LZMA_UINT32_IS_ULONG +typedef unsigned long UInt32; +#else +typedef unsigned int UInt32; +#endif +#endif + +/* #define _LZMA_NO_SYSTEM_SIZE_T */ +/* You can use it, if you don't want <stddef.h> */ + +#ifndef _7ZIP_SIZET_DEFINED +#define _7ZIP_SIZET_DEFINED +#ifdef _LZMA_NO_SYSTEM_SIZE_T +typedef UInt32 SizeT; +#else +#include <stddef.h> +typedef size_t SizeT; +#endif +#endif + +#endif diff --git a/target/linux/bcm63xx/image/lzma-loader/src/Makefile b/target/linux/bcm63xx/image/lzma-loader/src/Makefile new file mode 100644 index 0000000000..167bf6455a --- /dev/null +++ b/target/linux/bcm63xx/image/lzma-loader/src/Makefile @@ -0,0 +1,87 @@ +# +# Makefile for the LZMA compressed kernel loader for +# Atheros AR7XXX/AR9XXX based boards +# +# Copyright (C) 2011 Gabor Juhos <juhosg@openwrt.org> +# +# Some parts of this file was based on the OpenWrt specific lzma-loader +# for the BCM47xx and ADM5120 based boards: +# Copyright (C) 2004 Manuel Novoa III (mjn3@codepoet.org) +# Copyright (C) 2005 Mineharu Takahara <mtakahar@yahoo.com> +# Copyright (C) 2005 by Oleg I. Vdovikin <oleg@cs.msu.su> +# +# This program is free software; you can redistribute it and/or modify it +# under the terms of the GNU General Public License version 2 as published +# by the Free Software Foundation. +# + +LOADADDR := +LZMA_TEXT_START := 0x80a00000 +LOADER_DATA := + +CC := $(CROSS_COMPILE)gcc +LD := $(CROSS_COMPILE)ld +OBJCOPY := $(CROSS_COMPILE)objcopy +OBJDUMP := $(CROSS_COMPILE)objdump + +BIN_FLAGS := -O binary -R .reginfo -R .note -R .comment -R .mdebug \ + -R .MIPS.abiflags -S + +CFLAGS = -D__KERNEL__ -Wall -Wstrict-prototypes -Wno-trigraphs -Os \ + -fno-strict-aliasing -fno-common -fomit-frame-pointer -G 0 \ + -mno-abicalls -fno-pic -ffunction-sections -pipe \ + -ffreestanding -fhonour-copts \ + -mabi=32 -march=mips32 \ + -Wa,-32 -Wa,-march=mips32 -Wa,-mips32 -Wa,--trap +CFLAGS += -D_LZMA_PROB32 + +ASFLAGS = $(CFLAGS) -D__ASSEMBLY__ + +LDFLAGS = -static --gc-sections -no-warn-mismatch +LDFLAGS += -e startup -T loader.lds -Ttext $(LZMA_TEXT_START) + +O_FORMAT = $(shell $(OBJDUMP) -i | head -2 | grep elf32) + +OBJECTS := head.o loader.o cache.o board.o printf.o LzmaDecode.o + +ifneq ($(strip $(LOADER_DATA)),) +OBJECTS += data.o +CFLAGS += -DLZMA_WRAPPER=1 -DLOADADDR=$(LOADADDR) +endif + + +all: loader.elf + +# Don't build dependencies, this may die if $(CC) isn't gcc +dep: + +install: + +%.o : %.c + $(CC) $(CFLAGS) -c -o $@ $< + +%.o : %.S + $(CC) $(ASFLAGS) -c -o $@ $< + +data.o: $(LOADER_DATA) + $(LD) -r -b binary --oformat $(O_FORMAT) -T lzma-data.lds -o $@ $< + +loader: $(OBJECTS) + $(LD) $(LDFLAGS) -o $@ $(OBJECTS) + +loader.bin: loader + $(OBJCOPY) $(BIN_FLAGS) $< $@ + +loader2.o: loader.bin + $(LD) -r -b binary --oformat $(O_FORMAT) -o $@ $< + +loader.elf: loader2.o + $(LD) -e startup -T loader2.lds -Ttext $(LOADADDR) -o $@ $< + +mrproper: clean + +clean: + rm -f loader *.elf *.bin *.o + + + diff --git a/target/linux/bcm63xx/image/lzma-loader/src/board.c b/target/linux/bcm63xx/image/lzma-loader/src/board.c new file mode 100644 index 0000000000..6a1b132254 --- /dev/null +++ b/target/linux/bcm63xx/image/lzma-loader/src/board.c @@ -0,0 +1,111 @@ +/* + * BCM63XX specific implementation parts + * + * Copyright (C) 2014 Jonas Gorski <jogo@openwrt.org> + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 as published + * by the Free Software Foundation. + */ + +#include <stddef.h> +#include "config.h" +#include "cp0regdef.h" + +#define READREG(r) *(volatile unsigned int *)(r) +#define WRITEREG(r,v) *(volatile unsigned int *)(r) = v + +#define UART_IR_REG 0x10 +#define UART_FIFO_REG 0x14 + +unsigned long uart_base; + +static void wait_xfered(void) +{ + unsigned int val; + + do { + val = READREG(uart_base + UART_IR_REG); + if (val & (1 << 5)) + break; + } while (1); +} + +void board_putc(int ch) +{ + if (!uart_base) + return; + + wait_xfered(); + WRITEREG(uart_base + UART_FIFO_REG, ch); + wait_xfered(); +} + +#define PRID_IMP_BMIPS32_REV4 0x4000 +#define PRID_IMP_BMIPS32_REV8 0x8000 +#define PRID_IMP_BMIPS3300 0x9000 +#define PRID_IMP_BMIPS3300_ALT 0x9100 +#define PRID_IMP_BMIPS3300_BUG 0x0000 +#define PRID_IMP_BMIPS43XX 0xa000 + +void board_init(void) +{ + unsigned long prid, chipid, chipid_reg; + + prid = read_32bit_c0_register($15, 0); + + switch (prid & 0xff00) { + case PRID_IMP_BMIPS32_REV4: + case PRID_IMP_BMIPS32_REV8: + case PRID_IMP_BMIPS3300_ALT: + case PRID_IMP_BMIPS3300_BUG: + chipid_reg = 0xfffe0000; + break; + case PRID_IMP_BMIPS3300: + if ((prid & 0xff) >= 0x33) + chipid_reg = 0xb0000000; + else + chipid_reg = 0xfffe0000; + break; + case PRID_IMP_BMIPS43XX: + if ((prid & 0xff) == 0x04) + chipid_reg = 0xfff8c000; + else if ((prid & 0xff) == 0x70) + return; /* FIXME: 0002a070 can be 6362 and 3380 */ + else if ((prid & 0xff) >= 0x30) + chipid_reg = 0xb0000000; + else + chipid_reg = 0xfffe0000; + break; + default: + return; + } + + chipid = READREG(chipid_reg); + + switch (chipid >> 16) { + case 0x3368: + case 0x6318: + case 0x6328: + case 0x6358: + case 0x6362: + case 0x6368: + case 0x6369: + uart_base = chipid_reg + 0x100; + break; + case 0x6316: + case 0x6326: + uart_base = chipid_reg + 0x180; + break; + case 0x3380: + uart_base = chipid_reg + 0x200; + break; + case 0x6338: + case 0x6345: + case 0x6348: + uart_base = chipid_reg + 0x300; + break; + default: + return; + } +} diff --git a/target/linux/bcm63xx/image/lzma-loader/src/cache.c b/target/linux/bcm63xx/image/lzma-loader/src/cache.c new file mode 100644 index 0000000000..93751c311a --- /dev/null +++ b/target/linux/bcm63xx/image/lzma-loader/src/cache.c @@ -0,0 +1,46 @@ +/* + * LZMA compressed kernel loader for Atheros AR7XXX/AR9XXX based boards + * + * Copyright (C) 2011 Gabor Juhos <juhosg@openwrt.org> + * + * The cache manipulation routine has been taken from the U-Boot project. + * (C) Copyright 2003 + * Wolfgang Denk, DENX Software Engineering, <wd@denx.de> + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 as published + * by the Free Software Foundation. + * + */ + +#include "cache.h" +#include "cacheops.h" +#include "config.h" +#include "printf.h" + +#define cache_op(op,addr) \ + __asm__ __volatile__( \ + " .set push \n" \ + " .set noreorder \n" \ + " .set mips3\n\t \n" \ + " cache %0, %1 \n" \ + " .set pop \n" \ + : \ + : "i" (op), "R" (*(unsigned char *)(addr))) + +void flush_cache(unsigned long start_addr, unsigned long size) +{ + unsigned long lsize = CONFIG_CACHELINE_SIZE; + unsigned long addr = start_addr & ~(lsize - 1); + unsigned long aend = (start_addr + size + (lsize - 1)) & ~(lsize - 1); + + printf("blasting from 0x%08x to 0x%08x (0x%08x - 0x%08x)\n", start_addr, size, addr, aend); + + while (1) { + cache_op(Hit_Writeback_Inv_D, addr); + cache_op(Hit_Invalidate_I, addr); + if (addr == aend) + break; + addr += lsize; + } +} diff --git a/target/linux/bcm63xx/image/lzma-loader/src/cache.h b/target/linux/bcm63xx/image/lzma-loader/src/cache.h new file mode 100644 index 0000000000..506a235884 --- /dev/null +++ b/target/linux/bcm63xx/image/lzma-loader/src/cache.h @@ -0,0 +1,17 @@ +/* + * LZMA compressed kernel loader for Atheros AR7XXX/AR9XXX based boards + * + * Copyright (C) 2011 Gabor Juhos <juhosg@openwrt.org> + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 as published + * by the Free Software Foundation. + * + */ + +#ifndef __CACHE_H +#define __CACHE_H + +void flush_cache(unsigned long start_addr, unsigned long size); + +#endif /* __CACHE_H */ diff --git a/target/linux/bcm63xx/image/lzma-loader/src/cacheops.h b/target/linux/bcm63xx/image/lzma-loader/src/cacheops.h new file mode 100644 index 0000000000..70bcad7694 --- /dev/null +++ b/target/linux/bcm63xx/image/lzma-loader/src/cacheops.h @@ -0,0 +1,85 @@ +/* + * Cache operations for the cache instruction. + * + * This file is subject to the terms and conditions of the GNU General Public + * License. See the file "COPYING" in the main directory of this archive + * for more details. + * + * (C) Copyright 1996, 97, 99, 2002, 03 Ralf Baechle + * (C) Copyright 1999 Silicon Graphics, Inc. + */ +#ifndef __ASM_CACHEOPS_H +#define __ASM_CACHEOPS_H + +/* + * Cache Operations available on all MIPS processors with R4000-style caches + */ +#define Index_Invalidate_I 0x00 +#define Index_Writeback_Inv_D 0x01 +#define Index_Load_Tag_I 0x04 +#define Index_Load_Tag_D 0x05 +#define Index_Store_Tag_I 0x08 +#define Index_Store_Tag_D 0x09 +#if defined(CONFIG_CPU_LOONGSON2) +#define Hit_Invalidate_I 0x00 +#else +#define Hit_Invalidate_I 0x10 +#endif +#define Hit_Invalidate_D 0x11 +#define Hit_Writeback_Inv_D 0x15 + +/* + * R4000-specific cacheops + */ +#define Create_Dirty_Excl_D 0x0d +#define Fill 0x14 +#define Hit_Writeback_I 0x18 +#define Hit_Writeback_D 0x19 + +/* + * R4000SC and R4400SC-specific cacheops + */ +#define Index_Invalidate_SI 0x02 +#define Index_Writeback_Inv_SD 0x03 +#define Index_Load_Tag_SI 0x06 +#define Index_Load_Tag_SD 0x07 +#define Index_Store_Tag_SI 0x0A +#define Index_Store_Tag_SD 0x0B +#define Create_Dirty_Excl_SD 0x0f +#define Hit_Invalidate_SI 0x12 +#define Hit_Invalidate_SD 0x13 +#define Hit_Writeback_Inv_SD 0x17 +#define Hit_Writeback_SD 0x1b +#define Hit_Set_Virtual_SI 0x1e +#define Hit_Set_Virtual_SD 0x1f + +/* + * R5000-specific cacheops + */ +#define R5K_Page_Invalidate_S 0x17 + +/* + * RM7000-specific cacheops + */ +#define Page_Invalidate_T 0x16 + +/* + * R10000-specific cacheops + * + * Cacheops 0x02, 0x06, 0x0a, 0x0c-0x0e, 0x16, 0x1a and 0x1e are unused. + * Most of the _S cacheops are identical to the R4000SC _SD cacheops. + */ +#define Index_Writeback_Inv_S 0x03 +#define Index_Load_Tag_S 0x07 +#define Index_Store_Tag_S 0x0B +#define Hit_Invalidate_S 0x13 +#define Cache_Barrier 0x14 +#define Hit_Writeback_Inv_S 0x17 +#define Index_Load_Data_I 0x18 +#define Index_Load_Data_D 0x19 +#define Index_Load_Data_S 0x1b +#define Index_Store_Data_I 0x1c +#define Index_Store_Data_D 0x1d +#define Index_Store_Data_S 0x1f + +#endif /* __ASM_CACHEOPS_H */ diff --git a/target/linux/bcm63xx/image/lzma-loader/src/config.h b/target/linux/bcm63xx/image/lzma-loader/src/config.h new file mode 100644 index 0000000000..ce391f8864 --- /dev/null +++ b/target/linux/bcm63xx/image/lzma-loader/src/config.h @@ -0,0 +1,31 @@ +/* + * LZMA compressed kernel loader for Atheros AR7XXX/AR9XXX based boards + * + * Copyright (C) 2011 Gabor Juhos <juhosg@openwrt.org> + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 as published + * by the Free Software Foundation. + * + */ + +#ifndef _CONFIG_H_ +#define _CONFIG_H_ + +#define CONFIG_ICACHE_SIZE (32 * 1024) +#define CONFIG_DCACHE_SIZE (32 * 1024) +#define CONFIG_CACHELINE_SIZE 16 + +#ifndef CONFIG_FLASH_OFFS +#define CONFIG_FLASH_OFFS 0 +#endif + +#ifndef CONFIG_FLASH_MAX +#define CONFIG_FLASH_MAX 0 +#endif + +#ifndef CONFIG_FLASH_STEP +#define CONFIG_FLASH_STEP 0x1000 +#endif + +#endif /* _CONFIG_H_ */ diff --git a/target/linux/bcm63xx/image/lzma-loader/src/cp0regdef.h b/target/linux/bcm63xx/image/lzma-loader/src/cp0regdef.h new file mode 100644 index 0000000000..0d824f4444 --- /dev/null +++ b/target/linux/bcm63xx/image/lzma-loader/src/cp0regdef.h @@ -0,0 +1,54 @@ +/* + * Copyright (C) 1994, 1995, 1996, 1997, 2000, 2001 by Ralf Baechle + * + * Copyright (C) 2001, Monta Vista Software + * Author: jsun@mvista.com or jsun@junsun.net + */ +#ifndef _cp0regdef_h_ +#define _cp0regdef_h_ + +#define CP0_INDEX $0 +#define CP0_RANDOM $1 +#define CP0_ENTRYLO0 $2 +#define CP0_ENTRYLO1 $3 +#define CP0_CONTEXT $4 +#define CP0_PAGEMASK $5 +#define CP0_WIRED $6 +#define CP0_BADVADDR $8 +#define CP0_COUNT $9 +#define CP0_ENTRYHI $10 +#define CP0_COMPARE $11 +#define CP0_STATUS $12 +#define CP0_CAUSE $13 +#define CP0_EPC $14 +#define CP0_PRID $15 +#define CP0_CONFIG $16 +#define CP0_LLADDR $17 +#define CP0_WATCHLO $18 +#define CP0_WATCHHI $19 +#define CP0_XCONTEXT $20 +#define CP0_FRAMEMASK $21 +#define CP0_DIAGNOSTIC $22 +#define CP0_PERFORMANCE $25 +#define CP0_ECC $26 +#define CP0_CACHEERR $27 +#define CP0_TAGLO $28 +#define CP0_TAGHI $29 +#define CP0_ERROREPC $30 + +#define read_32bit_c0_register(reg,sel) \ +({ int __res; \ + if (sel == 0) \ + __asm__ __volatile__( \ + "mfc0\t%0, " #reg "\n\t" \ + : "=r" (__res)); \ + else \ + __asm__ __volatile__( \ + ".set\tmips32\n\t" \ + "mfc0\t%0, " #reg ", " #sel "\n\t" \ + ".set mips0\n\t" \ + : "=r" (__res)); \ + __res; \ +}) + +#endif diff --git a/target/linux/bcm63xx/image/lzma-loader/src/head.S b/target/linux/bcm63xx/image/lzma-loader/src/head.S new file mode 100644 index 0000000000..47a7c9bd63 --- /dev/null +++ b/target/linux/bcm63xx/image/lzma-loader/src/head.S @@ -0,0 +1,121 @@ +/* + * LZMA compressed kernel loader for Atheros AR7XXX/AR9XXX based boards + * + * Copyright (C) 2011 Gabor Juhos <juhosg@openwrt.org> + * + * Some parts of this code was based on the OpenWrt specific lzma-loader + * for the BCM47xx and ADM5120 based boards: + * Copyright (C) 2004 Manuel Novoa III (mjn3@codepoet.org) + * Copyright (C) 2005 by Oleg I. Vdovikin <oleg@cs.msu.su> + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 as published + * by the Free Software Foundation. + */ + +#include <asm/asm.h> +#include <asm/regdef.h> +#include "cp0regdef.h" +#include "cacheops.h" +#include "config.h" + +#define KSEG0 0x80000000 + + .macro ehb + sll zero, 3 + .endm + + .text + +LEAF(startup) + .set noreorder + .set mips32 + + mtc0 zero, CP0_WATCHLO # clear watch registers + mtc0 zero, CP0_WATCHHI + mtc0 zero, CP0_CAUSE # clear before writing status register + + mfc0 t0, CP0_STATUS + li t1, 0x1000001f + or t0, t1 + xori t0, 0x1f + mtc0 t0, CP0_STATUS + ehb + + mtc0 zero, CP0_COUNT + mtc0 zero, CP0_COMPARE + ehb + + la t0, __reloc_label # get linked address of label + bal __reloc_label # branch and link to label to + nop # get actual address +__reloc_label: + subu t0, ra, t0 # get reloc_delta + + beqz t0, __reloc_done # if delta is 0 we are in the right place + nop + + /* Copy our code to the right place */ + la t1, _code_start # get linked address of _code_start + la t2, _code_end # get linked address of _code_end + addu t0, t0, t1 # calculate actual address of _code_start + +__reloc_copy: + lw t3, 0(t0) + sw t3, 0(t1) + add t1, 4 + blt t1, t2, __reloc_copy + add t0, 4 + + /* flush cache */ + la t0, _code_start + la t1, _code_end + + li t2, ~(CONFIG_CACHELINE_SIZE - 1) + and t0, t2 + and t1, t2 + li t2, CONFIG_CACHELINE_SIZE + + b __flush_check + nop + +__flush_line: + cache Hit_Writeback_Inv_D, 0(t0) + cache Hit_Invalidate_I, 0(t0) + add t0, t2 + +__flush_check: + bne t0, t1, __flush_line + nop + + sync + +__reloc_done: + + /* clear bss */ + la t0, _bss_start + la t1, _bss_end + b __bss_check + nop + +__bss_fill: + sw zero, 0(t0) + addi t0, 4 + +__bss_check: + bne t0, t1, __bss_fill + nop + + /* Setup new "C" stack */ + la sp, _stack + + /* reserve stack space for a0-a3 registers */ + subu sp, 16 + + /* jump to the decompressor routine */ + la t0, loader_main + jr t0 + nop + + .set reorder +END(startup) diff --git a/target/linux/bcm63xx/image/lzma-loader/src/loader.c b/target/linux/bcm63xx/image/lzma-loader/src/loader.c new file mode 100644 index 0000000000..0848ce601f --- /dev/null +++ b/target/linux/bcm63xx/image/lzma-loader/src/loader.c @@ -0,0 +1,175 @@ +/* + * LZMA compressed kernel loader for Atheros AR7XXX/AR9XXX based boards + * + * Copyright (C) 2011 Gabor Juhos <juhosg@openwrt.org> + * + * Some parts of this code was based on the OpenWrt specific lzma-loader + * for the BCM47xx and ADM5120 based boards: + * Copyright (C) 2004 Manuel Novoa III (mjn3@codepoet.org) + * Copyright (C) 2005 Mineharu Takahara <mtakahar@yahoo.com> + * Copyright (C) 2005 by Oleg I. Vdovikin <oleg@cs.msu.su> + * + * The image_header structure has been taken from the U-Boot project. + * (C) Copyright 2008 Semihalf + * (C) Copyright 2000-2005 + * Wolfgang Denk, DENX Software Engineering, wd@denx.de. + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 as published + * by the Free Software Foundation. + */ + +#include <stddef.h> +#include <stdint.h> + +#include "config.h" +#include "cache.h" +#include "printf.h" +#include "LzmaDecode.h" + +#define KSEG0 0x80000000 +#define KSEG1 0xa0000000 + +#define KSEG1ADDR(a) ((((unsigned)(a)) & 0x1fffffffU) | KSEG1) + +#undef LZMA_DEBUG + +#ifdef LZMA_DEBUG +# define DBG(f, a...) printf(f, ## a) +#else +# define DBG(f, a...) do {} while (0) +#endif + +/* beyond the image end, size not known in advance */ +extern unsigned char workspace[]; + + +extern void board_init(void); + +static CLzmaDecoderState lzma_state; +static unsigned char *lzma_data; +static unsigned long lzma_datasize; +static unsigned long lzma_outsize; +static unsigned long kernel_la; + +static void halt(void) +{ + printf("\nSystem halted!\n"); + for(;;); +} + +static __inline__ unsigned char lzma_get_byte(void) +{ + unsigned char c; + + lzma_datasize--; + c = *lzma_data++; + + return c; +} + +static int lzma_init_props(void) +{ + unsigned char props[LZMA_PROPERTIES_SIZE]; + int res; + int i; + + /* read lzma properties */ + for (i = 0; i < LZMA_PROPERTIES_SIZE; i++) + props[i] = lzma_get_byte(); + + /* read the lower half of uncompressed size in the header */ + lzma_outsize = ((SizeT) lzma_get_byte()) + + ((SizeT) lzma_get_byte() << 8) + + ((SizeT) lzma_get_byte() << 16) + + ((SizeT) lzma_get_byte() << 24); + + /* skip rest of the header (upper half of uncompressed size) */ + for (i = 0; i < 4; i++) + lzma_get_byte(); + + res = LzmaDecodeProperties(&lzma_state.Properties, props, + LZMA_PROPERTIES_SIZE); + return res; +} + +static int lzma_decompress(unsigned char *outStream) +{ + SizeT ip, op; + int ret; + + lzma_state.Probs = (CProb *) workspace; + + ret = LzmaDecode(&lzma_state, lzma_data, lzma_datasize, &ip, outStream, + lzma_outsize, &op); + + if (ret != LZMA_RESULT_OK) { + int i; + + DBG("LzmaDecode error %d at %08x, osize:%d ip:%d op:%d\n", + ret, lzma_data + ip, lzma_outsize, ip, op); + + for (i = 0; i < 16; i++) + DBG("%02x ", lzma_data[ip + i]); + + DBG("\n"); + } + + return ret; +} + +static void lzma_init_data(void) +{ + extern unsigned char _lzma_data_start[]; + extern unsigned char _lzma_data_end[]; + + kernel_la = LOADADDR; + lzma_data = _lzma_data_start; + lzma_datasize = _lzma_data_end - _lzma_data_start; +} + +void loader_main(unsigned long reg_a0, unsigned long reg_a1, + unsigned long reg_a2, unsigned long reg_a3) +{ + void (*kernel_entry) (unsigned long, unsigned long, unsigned long, + unsigned long); + int res; + + board_init(); + + printf("\n\nOpenWrt kernel loader for BCM63XX\n"); + printf("Copyright (C) 2011 Gabor Juhos <juhosg@openwrt.org>\n"); + printf("Copyright (C) 2014 Jonas Gorski <jogo@openwrt.org>\n"); + + lzma_init_data(); + + res = lzma_init_props(); + if (res != LZMA_RESULT_OK) { + printf("Incorrect LZMA stream properties!\n"); + halt(); + } + + printf("Decompressing kernel... "); + + res = lzma_decompress((unsigned char *) kernel_la); + if (res != LZMA_RESULT_OK) { + printf("failed, "); + switch (res) { + case LZMA_RESULT_DATA_ERROR: + printf("data error!\n"); + break; + default: + printf("unknown error %d!\n", res); + } + halt(); + } else { + printf("done!\n"); + } + + flush_cache(kernel_la, lzma_outsize); + + printf("Starting kernel at %08x...\n\n", kernel_la); + + kernel_entry = (void *) kernel_la; + kernel_entry(reg_a0, reg_a1, reg_a2, reg_a3); +} diff --git a/target/linux/bcm63xx/image/lzma-loader/src/loader.lds b/target/linux/bcm63xx/image/lzma-loader/src/loader.lds new file mode 100644 index 0000000000..01ff852361 --- /dev/null +++ b/target/linux/bcm63xx/image/lzma-loader/src/loader.lds @@ -0,0 +1,34 @@ +OUTPUT_ARCH(mips) +SECTIONS { + .text : { + _code_start = .; + *(.text) + *(.text.*) + *(.rodata) + *(.rodata.*) + *(.data.lzma) + } + + . = ALIGN(32); + .data : { + *(.data) + *(.data.*) + } + + . = ALIGN(32); + _code_end = .; + + _bss_start = .; + .bss : { + *(.bss) + *(.bss.*) + } + + . = ALIGN(32); + _bss_end = .; + + . = . + 8192; + _stack = .; + + workspace = .; +} diff --git a/target/linux/bcm63xx/image/lzma-loader/src/loader2.lds b/target/linux/bcm63xx/image/lzma-loader/src/loader2.lds new file mode 100644 index 0000000000..db0bb46424 --- /dev/null +++ b/target/linux/bcm63xx/image/lzma-loader/src/loader2.lds @@ -0,0 +1,10 @@ +OUTPUT_ARCH(mips) +SECTIONS { + .text : { + startup = .; + *(.text) + *(.text.*) + *(.data) + *(.data.*) + } +} diff --git a/target/linux/bcm63xx/image/lzma-loader/src/lzma-data.lds b/target/linux/bcm63xx/image/lzma-loader/src/lzma-data.lds new file mode 100644 index 0000000000..abf756ba13 --- /dev/null +++ b/target/linux/bcm63xx/image/lzma-loader/src/lzma-data.lds @@ -0,0 +1,8 @@ +OUTPUT_ARCH(mips) +SECTIONS { + .data.lzma : { + _lzma_data_start = .; + *(.data) + _lzma_data_end = .; + } +} diff --git a/target/linux/bcm63xx/image/lzma-loader/src/printf.c b/target/linux/bcm63xx/image/lzma-loader/src/printf.c new file mode 100644 index 0000000000..7bb5a86e18 --- /dev/null +++ b/target/linux/bcm63xx/image/lzma-loader/src/printf.c @@ -0,0 +1,350 @@ +/* + * Copyright (C) 2001 MontaVista Software Inc. + * Author: Jun Sun, jsun@mvista.com or jsun@junsun.net + * + * 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. + * + */ + +#include "printf.h" + +extern void board_putc(int ch); + +/* this is the maximum width for a variable */ +#define LP_MAX_BUF 256 + +/* macros */ +#define IsDigit(x) ( ((x) >= '0') && ((x) <= '9') ) +#define Ctod(x) ( (x) - '0') + +/* forward declaration */ +static int PrintChar(char *, char, int, int); +static int PrintString(char *, char *, int, int); +static int PrintNum(char *, unsigned long, int, int, int, int, char, int); + +/* private variable */ +static const char theFatalMsg[] = "fatal error in lp_Print!"; + +/* -*- + * A low level printf() function. + */ +static void +lp_Print(void (*output)(void *, char *, int), + void * arg, + char *fmt, + va_list ap) +{ + +#define OUTPUT(arg, s, l) \ + { if (((l) < 0) || ((l) > LP_MAX_BUF)) { \ + (*output)(arg, (char*)theFatalMsg, sizeof(theFatalMsg)-1); for(;;); \ + } else { \ + (*output)(arg, s, l); \ + } \ + } + + char buf[LP_MAX_BUF]; + + char c; + char *s; + long int num; + + int longFlag; + int negFlag; + int width; + int prec; + int ladjust; + char padc; + + int length; + + for(;;) { + { + /* scan for the next '%' */ + char *fmtStart = fmt; + while ( (*fmt != '\0') && (*fmt != '%')) { + fmt ++; + } + + /* flush the string found so far */ + OUTPUT(arg, fmtStart, fmt-fmtStart); + + /* are we hitting the end? */ + if (*fmt == '\0') break; + } + + /* we found a '%' */ + fmt ++; + + /* check for long */ + if (*fmt == 'l') { + longFlag = 1; + fmt ++; + } else { + longFlag = 0; + } + + /* check for other prefixes */ + width = 0; + prec = -1; + ladjust = 0; + padc = ' '; + + if (*fmt == '-') { + ladjust = 1; + fmt ++; + } + + if (*fmt == '0') { + padc = '0'; + fmt++; + } + + if (IsDigit(*fmt)) { + while (IsDigit(*fmt)) { + width = 10 * width + Ctod(*fmt++); + } + } + + if (*fmt == '.') { + fmt ++; + if (IsDigit(*fmt)) { + prec = 0; + while (IsDigit(*fmt)) { + prec = prec*10 + Ctod(*fmt++); + } + } + } + + + /* check format flag */ + negFlag = 0; + switch (*fmt) { + case 'b': + if (longFlag) { + num = va_arg(ap, long int); + } else { + num = va_arg(ap, int); + } + length = PrintNum(buf, num, 2, 0, width, ladjust, padc, 0); + OUTPUT(arg, buf, length); + break; + + case 'd': + case 'D': + if (longFlag) { + num = va_arg(ap, long int); + } else { + num = va_arg(ap, int); + } + if (num < 0) { + num = - num; + negFlag = 1; + } + length = PrintNum(buf, num, 10, negFlag, width, ladjust, padc, 0); + OUTPUT(arg, buf, length); + break; + + case 'o': + case 'O': + if (longFlag) { + num = va_arg(ap, long int); + } else { + num = va_arg(ap, int); + } + length = PrintNum(buf, num, 8, 0, width, ladjust, padc, 0); + OUTPUT(arg, buf, length); + break; + + case 'u': + case 'U': + if (longFlag) { + num = va_arg(ap, long int); + } else { + num = va_arg(ap, int); + } + length = PrintNum(buf, num, 10, 0, width, ladjust, padc, 0); + OUTPUT(arg, buf, length); + break; + + case 'x': + if (longFlag) { + num = va_arg(ap, long int); + } else { + num = va_arg(ap, int); + } + length = PrintNum(buf, num, 16, 0, width, ladjust, padc, 0); + OUTPUT(arg, buf, length); + break; + + case 'X': + if (longFlag) { + num = va_arg(ap, long int); + } else { + num = va_arg(ap, int); + } + length = PrintNum(buf, num, 16, 0, width, ladjust, padc, 1); + OUTPUT(arg, buf, length); + break; + + case 'c': + c = (char)va_arg(ap, int); + length = PrintChar(buf, c, width, ladjust); + OUTPUT(arg, buf, length); + break; + + case 's': + s = (char*)va_arg(ap, char *); + length = PrintString(buf, s, width, ladjust); + OUTPUT(arg, buf, length); + break; + + case '\0': + fmt --; + break; + + default: + /* output this char as it is */ + OUTPUT(arg, fmt, 1); + } /* switch (*fmt) */ + + fmt ++; + } /* for(;;) */ + + /* special termination call */ + OUTPUT(arg, "\0", 1); +} + + +/* --------------- local help functions --------------------- */ +static int +PrintChar(char * buf, char c, int length, int ladjust) +{ + int i; + + if (length < 1) length = 1; + if (ladjust) { + *buf = c; + for (i=1; i< length; i++) buf[i] = ' '; + } else { + for (i=0; i< length-1; i++) buf[i] = ' '; + buf[length - 1] = c; + } + return length; +} + +static int +PrintString(char * buf, char* s, int length, int ladjust) +{ + int i; + int len=0; + char* s1 = s; + while (*s1++) len++; + if (length < len) length = len; + + if (ladjust) { + for (i=0; i< len; i++) buf[i] = s[i]; + for (i=len; i< length; i++) buf[i] = ' '; + } else { + for (i=0; i< length-len; i++) buf[i] = ' '; + for (i=length-len; i < length; i++) buf[i] = s[i-length+len]; + } + return length; +} + +static int +PrintNum(char * buf, unsigned long u, int base, int negFlag, + int length, int ladjust, char padc, int upcase) +{ + /* algorithm : + * 1. prints the number from left to right in reverse form. + * 2. fill the remaining spaces with padc if length is longer than + * the actual length + * TRICKY : if left adjusted, no "0" padding. + * if negtive, insert "0" padding between "0" and number. + * 3. if (!ladjust) we reverse the whole string including paddings + * 4. otherwise we only reverse the actual string representing the num. + */ + + int actualLength =0; + char *p = buf; + int i; + + do { + int tmp = u %base; + if (tmp <= 9) { + *p++ = '0' + tmp; + } else if (upcase) { + *p++ = 'A' + tmp - 10; + } else { + *p++ = 'a' + tmp - 10; + } + u /= base; + } while (u != 0); + + if (negFlag) { + *p++ = '-'; + } + + /* figure out actual length and adjust the maximum length */ + actualLength = p - buf; + if (length < actualLength) length = actualLength; + + /* add padding */ + if (ladjust) { + padc = ' '; + } + if (negFlag && !ladjust && (padc == '0')) { + for (i = actualLength-1; i< length-1; i++) buf[i] = padc; + buf[length -1] = '-'; + } else { + for (i = actualLength; i< length; i++) buf[i] = padc; + } + + + /* prepare to reverse the string */ + { + int begin = 0; + int end; + if (ladjust) { + end = actualLength - 1; + } else { + end = length -1; + } + + while (end > begin) { + char tmp = buf[begin]; + buf[begin] = buf[end]; + buf[end] = tmp; + begin ++; + end --; + } + } + + /* adjust the string pointer */ + return length; +} + +static void printf_output(void *arg, char *s, int l) +{ + int i; + + // special termination call + if ((l==1) && (s[0] == '\0')) return; + + for (i=0; i< l; i++) { + board_putc(s[i]); + if (s[i] == '\n') board_putc('\r'); + } +} + +void printf(char *fmt, ...) +{ + va_list ap; + va_start(ap, fmt); + lp_Print(printf_output, 0, fmt, ap); + va_end(ap); +} diff --git a/target/linux/bcm63xx/image/lzma-loader/src/printf.h b/target/linux/bcm63xx/image/lzma-loader/src/printf.h new file mode 100644 index 0000000000..9b1c1df232 --- /dev/null +++ b/target/linux/bcm63xx/image/lzma-loader/src/printf.h @@ -0,0 +1,18 @@ +/* + * Copyright (C) 2001 MontaVista Software Inc. + * Author: Jun Sun, jsun@mvista.com or jsun@junsun.net + * + * 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. + * + */ + +#ifndef _printf_h_ +#define _printf_h_ + +#include <stdarg.h> +void printf(char *fmt, ...); + +#endif /* _printf_h_ */ |