[OpenWrt-Devel] [PATCH] apm821xx: increase WNDR4700's dtb+kernel partition to 3.5 MiB

Christian Lamparter chunkeey at gmail.com
Mon Mar 26 11:25:32 EDT 2018


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:
<https://openwrt.org/docs/guide-user/installation/generic.backup#backup_openwrt_configuration>
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 <hauke at hauke-m.de>
Signed-off-by: Christian Lamparter <chunkeey at gmail.com>
---
 target/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 at 0x00000000 {
+			partition0,0 at 0 {
 				label = "NAND 128MiB 3,3V 8-bit";
 				reg = <0x00000000 0x08000000>;
 				read-only;
 			};
 
-			partition0,1 at 0x00000000 {
+			partition0,1 at 0 {
 				label = "uboot";
 				reg = <0x00000000 0x00180000>;
 				read-only;
 			};
 
-			partition0,2 at 0x00180000 {
+			partition0,2 at 180000 {
 				label = "device-tree";
 				reg = <0x00180000 0x00020000>;
 			};
 
-			partition0,3 at 0x001a0000 {
+			partition0,3 at 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 at 0x00380000 {
+			partition0,4 at 500000 {
 				label = "ubi";
-				reg = <0x00380000 0x01660000>;
+				reg = <0x00500000 0x014e0000>;
 			};
 
-			partition0,5 at 0x019e0000 {
+			partition0,5 at 19e0000 {
 				label = "config";
 				reg = <0x019e0000 0x00080000>;
 				read-only;
 			};
 
-			partition0,6 at 0x01a60000 {
+			partition0,6 at 1a60000 {
 				label = "pot";
 				reg = <0x01a60000 0x00080000>;
 				read-only;
 			};
 
-			partition0,7 at 0x01ae0000 {
+			partition0,7 at 1ae0000 {
 				label = "traffic_meter";
 				reg = <0x01ae0000 0x00300000>;
 				read-only;
 			};
 
-			partition0,8 at 0x01de0000 {
+			partition0,8 at 1de0000 {
 				label = "language";
 				reg = <0x01de0000 0x001c0000>;
 				read-only;
 			};
 
-			partition0,9 at 0x01fa0000 {
+			partition0,9 at 1fa0000 {
 				label = "ecos";
 				reg = <0x01fa0000 0x06020000>;
 				read-only;
 			};
 
-			partition0,10 at 0x07fc0000 {
+			partition0,10 at 7fc0000 {
 				label = "wifi_data";
 				reg = <0x07fc0000 0x00040000>;
 				read-only;
 			};
 
-			partition0,11 at 0x00180000 {
+			partition0,11 at 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
-- 
2.16.3
_______________________________________________
openwrt-devel mailing list
openwrt-devel at lists.openwrt.org
https://lists.openwrt.org/cgi-bin/mailman/listinfo/openwrt-devel


More information about the openwrt-devel mailing list