From c555b524c7e55f54aea69d11113bc36326aabafe Mon Sep 17 00:00:00 2001 From: Christian Lamparter Date: Mon, 26 Mar 2018 17:25:32 +0200 Subject: [PATCH] apm821xx: increase WNDR4700's dtb+kernel partition to 3.5 MiB This patch cleans and reworks the WNDR4700 dts to increase the now combined dtb+kernel partition to 3.5 MiB. This has become necessary due to the switch to GCC 7.3 and the ever increasing kernel binary size. The dtb+kernel partition was combined in order to finally fix the problem with out-of-sync device-trees. From now on, the kernel and device-tree will always be updated together. Upgrade Note: Existing installations will have to use the TFTP firmware recovery option in order to install the update. Affected users are advised to make a backup of their existing configuration prior to running sysupgrade: Due to the repartitioning of the NAND, the generated backup should be placed on either the internal HDD, an attached USB-Stick or on another PC (externally). To manually trigger the firmware recovery, the reset button has to be pressed (and hold) during boot. U-boot will enter the "Upgrade Mode" and starts a tftpserver listening on 192.168.1.1 for a tftp client from one of the four LAN/Ethernet ports to connect and upload the new system: (enable tftp binary mode!). openwrt-apm821xx-nand-netgear_wndr4700-squashfs-factory.img Cc: Hauke Mehrtens Signed-off-by: Christian Lamparter --- .../linux/apm821xx/dts/netgear-wndr4700.dts | 38 ++++++++++--------- target/linux/apm821xx/image/Makefile | 18 ++++++--- 2 files changed, 33 insertions(+), 23 deletions(-) diff --git a/target/linux/apm821xx/dts/netgear-wndr4700.dts b/target/linux/apm821xx/dts/netgear-wndr4700.dts index 96cf97c45c..4a252cf0b8 100644 --- a/target/linux/apm821xx/dts/netgear-wndr4700.dts +++ b/target/linux/apm821xx/dts/netgear-wndr4700.dts @@ -160,75 +160,79 @@ #address-cells = <1>; #size-cells = <1>; - partition0,0@0x00000000 { + partition0,0@0 { label = "NAND 128MiB 3,3V 8-bit"; reg = <0x00000000 0x08000000>; read-only; }; - partition0,1@0x00000000 { + partition0,1@0 { label = "uboot"; reg = <0x00000000 0x00180000>; read-only; }; - partition0,2@0x00180000 { + partition0,2@180000 { label = "device-tree"; reg = <0x00180000 0x00020000>; }; - partition0,3@0x001a0000 { + partition0,3@180000 { label = "kernel"; - reg = <0x001a0000 0x001e0000>; + reg = <0x00180000 0x00380000>; /* - * will also contain a fake/empty - * rootfs to fool Netgear's uboot - * rootfs integrety checks. + * device-tree is @ 0x00180000 - 0x001fffff + * kernel starts from 0x200000. + * this is coded into netgear's u-boot. + * + * this partition will also contain a + * fake/empty rootfs at the end to fool + * Netgear's uboot rootfs integrety checks. */ }; - partition0,4@0x00380000 { + partition0,4@500000 { label = "ubi"; - reg = <0x00380000 0x01660000>; + reg = <0x00500000 0x014e0000>; }; - partition0,5@0x019e0000 { + partition0,5@19e0000 { label = "config"; reg = <0x019e0000 0x00080000>; read-only; }; - partition0,6@0x01a60000 { + partition0,6@1a60000 { label = "pot"; reg = <0x01a60000 0x00080000>; read-only; }; - partition0,7@0x01ae0000 { + partition0,7@1ae0000 { label = "traffic_meter"; reg = <0x01ae0000 0x00300000>; read-only; }; - partition0,8@0x01de0000 { + partition0,8@1de0000 { label = "language"; reg = <0x01de0000 0x001c0000>; read-only; }; - partition0,9@0x01fa0000 { + partition0,9@1fa0000 { label = "ecos"; reg = <0x01fa0000 0x06020000>; read-only; }; - partition0,10@0x07fc0000 { + partition0,10@7fc0000 { label = "wifi_data"; reg = <0x07fc0000 0x00040000>; read-only; }; - partition0,11@0x00180000 { + partition0,11@180000 { label = "firmware"; reg = <0x00180000 0x01860000>; read-only; diff --git a/target/linux/apm821xx/image/Makefile b/target/linux/apm821xx/image/Makefile index 4e6b6e4995..4cfbea4cbd 100644 --- a/target/linux/apm821xx/image/Makefile +++ b/target/linux/apm821xx/image/Makefile @@ -21,6 +21,11 @@ define Build/dtb $(call Image/BuildDTB,../dts/$(DEVICE_DTS).dts,$@.dtb,,--space $(DTB_SIZE)) endef +define Build/prepend-dtb + cat "$@.dtb.uimage" "$@" > "$@.new" + mv "$@.new" "$@" +endef + define Build/export-dtb cp $(IMAGE_KERNEL).dtb $@ endef @@ -115,8 +120,7 @@ define Build/create-uImage-dtb -$(STAGING_DIR_HOST)/bin/mkimage -A $(LINUX_KARCH) \ -O linux -T kernel -C none \ -n '$(call toupper,$(LINUX_KARCH)) $(VERSION_DIST) Linux-$(LINUX_VERSION)' \ - -d $(IMAGE_KERNEL).dtb $@.new - @mv $@.new $@ + -d "$@.dtb" "$@.dtb.uimage" endef define Build/MuImage-initramfs @@ -163,11 +167,13 @@ define Device/netgear_wndr4700 DTB_SIZE := 131008 IMAGE_SIZE := 24960k IMAGES := factory.img sysupgrade.tar kernel.dtb - KERNEL_SIZE := 1920k - KERNEL := dtb | kernel-bin | lzma | uImage lzma | pad-offset $$(BLOCKSIZE) 64 | \ - append-uImage-fakeroot-hdr + KERNEL_SIZE := 3584k + # append a fake/empty rootfs to fool netgear's uboot + # CHECK_DNI_FIRMWARE_ROOTFS_INTEGRITY in do_chk_dniimg() + KERNEL := kernel-bin | lzma | uImage lzma | pad-offset $$(BLOCKSIZE) 64 | \ + append-uImage-fakeroot-hdr | dtb | create-uImage-dtb | prepend-dtb KERNEL_INITRAMFS := kernel-bin | gzip | dtb | MuImage-initramfs gzip - IMAGE/factory.img := create-uImage-dtb | append-kernel | pad-to 2M | append-ubi | \ + IMAGE/factory.img := append-kernel | pad-to $$$$(KERNEL_SIZE) | append-ubi | \ netgear-dni | check-size $$$$(IMAGE_SIZE) IMAGE/sysupgrade.tar := sysupgrade-tar | append-metadata IMAGE/kernel.dtb := export-dtb | uImage none