openwrtv4/target/linux/apm821xx/image/Makefile
Christian Lamparter 4fc48a8cf2 apm821xx: replace recovery image for the MBL with initramfs
The patch "images: bump default rootfs size to 256 MB"
a1f83bad60 caused a crash
during boot for the recovery images. This is because
both variants of the MyBook Live only have 256MB of RAM
and for the recovery option, the ext4 rootfs was simply
stored in the RAMDISK.

This patch replaces recovery image for the MBL with an
initramfs kernel.

In order to boot the initramfs (for recovery or development):

0. copy the initramfs and device tree into tftp's server directory
   # cp *-initramfs-kernel.bin to /tftp-server/mbl.bin
   # cp *-ext4-kernel.dtb to /tftp-server/fdt.bin

1. Connect the MyBook Live (Duo) serial port.
   (Warning! Use a 3.3v level shifter).

2. Hit Enter during u-boot and insert these three lines:
   # setenv serverip 192.168.1.254; setenv ipaddr 192.168.1.1;
   # tftp ${kernel_addr_r} mbl.bin; tftp ${fdt_addr_r} fdt.bin
   # run addtty addmisc; bootm ${kernel_addr_r} - ${fdt_addr_r}

   Where 192.168.1.254 is your TFTP server.

Signed-off-by: Christian Lamparter <chunkeey@gmail.com>
2016-10-13 17:04:33 +02:00

238 lines
6.8 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 := 63k
IMAGES := sysupgrade.tar
DTB_SIZE := 64512
KERNEL_SIZE := 1984k
IMAGE_SIZE := 8191k
KERNEL := kernel-bin | lzma | uImage lzma | MerakiAdd-dtb | MerakiNAND
KERNEL_INITRAMFS := copy-file $(KDIR)/vmlinux | lzma | uImage lzma | \
check-size $$(KERNEL_SIZE) | \
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 := 128k
DTB_SIZE := 131008
IMAGE_SIZE := 24960k
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:%k=%Ki) --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/export-dtb
cp $(IMAGE_KERNEL).dtb $@
endef
define Device/MyBookLiveDefault
IMAGE_SIZE := 48m
BLOCKSIZE := 1k
DTB_SIZE := 16384
KERNEL := kernel-bin | dtb | gzip | uImage gzip
KERNEL_INITRAMFS := kernel-bin | dtb | gzip | uImage gzip
BOOT_SIZE := 8
IMAGES := rootfs.img kernel.dtb
DEVICE_DTB := apollo3g.dtb
FILESYSTEMS := ext4
IMAGE/kernel.dtb := export-dtb
IMAGE/rootfs.img := boot-script | boot-img | hdd-img
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))