openwrt/target/linux/apm821xx/image/Makefile
riptidewave93 bc36678bdb apm821xx: Fix initramfs image for the Meraki MR24
When gzip is used, our kernel is too large and this causes the ramdisk
to be at the wrong offset. Fix by moving to lzma.

Signed-off-by: Chris Blake <chrisrblake93@gmail.com>
2016-09-05 07:28:44 +02:00

254 lines
7.1 KiB
Makefile

#
# 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
include $(INCLUDE_DIR)/host.mk
DEVICE_VARS += DEVICE_PROFILE IMAGE_SIZE DTB_SIZE
define Device/Default
PROFILES := Default
KERNEL_DEPENDS = $$(wildcard ../dts/$$(DEVICE_DTS).dts)
DEVICE_PROFILE :=
DEVICE_DTS :=
KERNEL_ENTRY := 0x00000000
KERNEL_LOADADDR := 0x00000000
DEVICE_DTS_DIR := ../dts
endef
define Build/dtb
$(call Image/BuildDTB,../dts/$(DEVICE_DTS).dts,$@.dtb,,--space $(DTB_SIZE))
endef
ifeq ($(SUBTARGET),nand)
define Image/cpiogz
( cd $(TARGET_DIR); find . | cpio -o -H newc | gzip -9n >$(KDIR_TMP)/$(IMG_PREFIX)-rootfs.cpio.gz )
endef
define Build/copy-file
cat "$(1)" > "$@"
endef
define Build/MerakiAdd-dtb
$(call Image/BuildDTB,../dts/$(DEVICE_DTS).dts,$@.dtb)
( \
dd if=$@.dtb bs=$(DTB_SIZE) conv=sync; \
dd if=$@ bs=$(BLOCKSIZE) conv=sync; \
) > $@.new
@mv $@.new $@
endef
define Build/MerakiAdd-initramfs
$(call Image/cpiogz)
-$(STAGING_DIR_HOST)/bin/mkimage -A $(LINUX_KARCH) -O linux -T ramdisk \
-C gzip -n "$(PROFILE) rootfs" \
-d $(KDIR_TMP)/$(IMG_PREFIX)-rootfs.cpio.gz \
$(KDIR_TMP)/$(IMG_PREFIX)-uramdisk.image.gz
( \
dd if=$@ bs=1k conv=sync; \
dd if=$(KDIR_TMP)/$(IMG_PREFIX)-uramdisk.image.gz bs=$(BLOCKSIZE) conv=sync; \
) > $@.new
@mv $@.new $@
endef
define Build/MerakiNAND
-$(STAGING_DIR_HOST)/bin/mkmerakifw \
-B $(DEVICE_PROFILE) -s \
-i $@ \
-o $@.new
@cp $@.new $@
endef
define Device/mr24
DEVICE_TITLE := Cisco Meraki MR24
DEVICE_PACKAGES := kmod-spi-gpio kmod-ath9k wpad-mini
DEVICE_PROFILE := MR24
DEVICE_DTS := MR24
BLOCKSIZE := 64512
IMAGES := sysupgrade.tar
DTB_SIZE := 64512
KERNEL_SIZE := 2048k
IMAGE_SIZE := 8191k
KERNEL := kernel-bin | lzma | uImage lzma | MerakiAdd-dtb | MerakiNAND
KERNEL_INITRAMFS := copy-file $(KDIR)/vmlinux | lzma | uImage lzma | MerakiAdd-dtb | pad-to 2047k | MerakiAdd-initramfs | MerakiNAND
IMAGE/sysupgrade.tar := sysupgrade-tar
endef
TARGET_DEVICES += mr24
define Build/create-uImage-dtb
# flat_dt target expect FIT image - which WNDR4700's uboot doesn't support
-$(STAGING_DIR_HOST)/bin/mkimage -A $(LINUX_KARCH) \
-O linux -T kernel -C none \
-n '$(call toupper,$(LINUX_KARCH)) LEDE Linux-$(LINUX_VERSION)' \
-d $(IMAGE_KERNEL).dtb $@.new
@mv $@.new $@
endef
define Build/append-fakerootfs
rm -rf $@.fakerootsquashfs $@.fakefs
# append a fake/empty rootfs to fool netgear's uboot
# CHECK_DNI_FIRMWARE_ROOTFS_INTEGRITY in do_chk_dniimg()
dd if=/dev/zero of=$@.fakerd bs=16 count=1 conv=sync
-$(STAGING_DIR_HOST)/bin/mkimage \
-A $(LINUX_KARCH) -O linux -T filesystem -C none \
-a 0x00000000 -e 0x00000000 \
-n '$(DEVICE_PROFILE) fakerootfs' \
-d $@.fakerd $@.fakefs
cat $@.fakefs >> $@
rm -rf $@.fakerootsquashfs $@.fakefs
endef
define Build/wndr4700-specialImage
rm -rf $@.fakerd $@.new
dd if=/dev/zero of=$@.fakerd bs=32 count=1 conv=sync
# Netgear used an old uboot that doesn't have FIT support.
# So we are stuck with either a full ext2/4 fs in a initrd.
# ... or we try to make the "multi" image approach to work
# for us.
#
# Sadly, the "multi" image has to consists of three
# "fixed" parts in the following "fixed" order:
# 1. The kernel which is in $@
# 2. The (fake) initrd which is in $@.fakerd
# 3. The device tree binary which is in $@.dtb
#
# Now, given that we use the function for the kernel which
# already has a initramfs image inside, we still have to
# add a "fake" initrd (which a mkimage header) in the second
# part of the legacy multi image. Since we need to put the
# device tree stuff into part 3.
-$(STAGING_DIR_HOST)/bin/mkimage -A $(LINUX_KARCH) -O linux -T multi \
-C $(1) -a $(KERNEL_LOADADDR) -e $(KERNEL_ENTRY) \
-n '$(DEVICE_PROFILE) initramfs' -d $@:$@.fakerd:$@.dtb $@.new
mv $@.new $@
rm -rf $@.fakerd
endef
define Device/WNDR4700
DEVICE_TITLE := Netgear Centria N900 WNDR4700/WNDR4720
DEVICE_PACKAGES := badblocks block-mount e2fsprogs \
kmod-ath9k kmod-dm kmod-fs-ext4 kmod-fs-vfat kmod-ledtrig-usbdev \
kmod-md-mod kmod-nls-cp437 kmod-nls-iso8859-1 kmod-nls-iso8859-15 \
kmod-nls-utf8 kmod-usb3 kmod-usb-dwc2 kmod-usb-storage \
partx-utils swconfig wpad-mini
DEVICE_NAME := wndr4700
DEVICE_PROFILE := wndr4700
DEVICE_DTS := wndr4700
PAGESIZE := 2048
SUBPAGESIZE := 512
BLOCKSIZE := 131072
DTB_SIZE := 131008
IMAGE_SIZE:=25559040
IMAGES := factory.img sysupgrade.tar
KERNEL_SIZE := 1920k
KERNEL := dtb | kernel-bin | lzma | uImage lzma | pad-offset $$(BLOCKSIZE) 64 | append-fakerootfs
KERNEL_INITRAMFS := kernel-bin | gzip | dtb | wndr4700-specialImage gzip
IMAGE/factory.img := create-uImage-dtb | append-kernel | pad-to 2M | append-ubi | \
netgear-dni | check-size $$$$(IMAGE_SIZE)
IMAGE/sysupgrade.tar := sysupgrade-tar
NETGEAR_BOARD_ID := WNDR4700
NETGEAR_HW_ID := 29763875+128+256
endef
TARGET_DEVICES += WNDR4700
endif
ifeq ($(SUBTARGET),sata)
### Image scripts for the WD My Book Live Series ###
define Build/boot-script
$(STAGING_DIR_HOST)/bin/mkimage -A powerpc -T script -C none -n "$(PROFILE) Boot Script" \
-d mbl_boot.scr \
$@.scr
endef
define Build/boot-img
$(RM) -rf $@.bootdir
mkdir -p $@.bootdir/boot
$(CP) $@.scr $@.bootdir/boot/boot.scr
$(CP) $(IMAGE_KERNEL).dtb $@.bootdir/boot/$(DEVICE_DTB)
$(CP) $(IMAGE_KERNEL) $@.bootdir/boot/uImage
genext2fs --block-size $(BLOCKSIZE) --size-in-blocks $$((1024 * $(BOOT_SIZE))) --root $@.bootdir $@.boot
# convert it to revision 1 - needed for u-boot ext2load
$(STAGING_DIR_HOST)/bin/tune2fs -O filetype $@.boot
$(STAGING_DIR_HOST)/bin/e2fsck -pDf $@.boot > /dev/null
endef
define Build/hdd-img
./mbl_gen_hdd_img.sh $@ $@.boot $(IMAGE_ROOTFS)
$(if $(CONFIG_TARGET_IMAGES_GZIP),gzip -9n -c $@ > $(BIN_DIR)/$(notdir $@).gz)
endef
define Build/uRamdisk
$(STAGING_DIR_HOST)/bin/mkimage \
-A powerpc -T ramdisk -C gzip \
-n "$(DEVICE_NAME) rootfs" \
-d $@ $@.new
mv $@.new $@
endef
define Build/recovery-tar
sh ./mbl_gen_recovery_tar.sh \
--profile $(DEVICE_PROFILE) \
--dtb $(IMAGE_KERNEL).dtb \
--dtbname $(DEVICE_DTB) \
--kernel $(IMAGE_KERNEL) \
--rootfs $@ \
$@
endef
define Build/export-dtb
cp $(IMAGE_KERNEL).dtb $@
endef
define Device/MyBookLiveDefault
IMAGE_SIZE := 48m
BLOCKSIZE := 1024
DTB_SIZE := 16384
KERNEL := kernel-bin | dtb | gzip | uImage gzip
BOOT_SIZE := 8
IMAGES := rootfs.img recovery.tar kernel.dtb
DEVICE_DTB := apollo3g.dtb
FILESYSTEMS := ext4
IMAGE/kernel.dtb := export-dtb
IMAGE/rootfs.img := boot-script | boot-img | hdd-img
IMAGE/recovery.tar := append-rootfs | gzip | uRamdisk | recovery-tar
endef
define Device/MyBookLiveSingle
$(Device/MyBookLiveDefault)
DEVICE_TITLE := Western Digital My Book Live
DEVICE_DTS := apollo3g
DEVICE_PROFILE := apollo3g
endef
TARGET_DEVICES += MyBookLiveSingle
define Device/MyBookLiveDuo
$(Device/MyBookLiveDefault)
DEVICE_TITLE := Western Digital My Book Live Duo
DEVICE_PACKAGES := kmod-usb-dwc2 kmod-ledtrig-usbdev kmod-usb-storage kmod-fs-vfat wpad-mini
DEVICE_DTS := apollo3g-duo
DEVICE_PROFILE := ap2nc
endef
TARGET_DEVICES += MyBookLiveDuo
endif
$(eval $(call BuildImage))