imx6: convert ventana images to squashfs+ubifs overlay
authorLuka Perkov <luka@openwrt.org>
Wed, 18 Nov 2015 21:35:24 +0000 (21:35 +0000)
committerLuka Perkov <luka@openwrt.org>
Wed, 18 Nov 2015 21:35:24 +0000 (21:35 +0000)
Replace the ventana ubi images from a single rootfs volume containing the
rootfs as well as kernel+dtbs in the boot/ subdir to a multi-volume ubi
containing kernel+dtbs+bootscript in 'root' ubifs volume, rootfs in 'rootfs'
squasfs volume, and rootfs_data an empty ubifs volume.

At the same time move ventana image creation over to using the new
TARGET_DEVICE syntax as a cleanup.

Additionally removed FIT image creation as it is recommended that this be
done manually to produce signed FIT images if needed.

Note that a bootscript is needed for Ventana to change its default mtdparts
to rename the 2nd partition from 'rootfs' to 'ubi'. This is because there
are patches in OpenWrt kernels that try to auto-attach and auto-mount and these
get in the way if the mtd partition is named 'rootfs'.

Signed-off-by: Tim Harvey <tharvey@gateworks.com>
SVN-Revision: 47508

target/linux/imx6/image/Makefile
target/linux/imx6/image/bootscript-ventana [new file with mode: 0644]
target/linux/imx6/image/ubinize-ventana.cfg [new file with mode: 0644]

index 9b9f948..a4de7d9 100644 (file)
 include $(TOPDIR)/rules.mk
 include $(INCLUDE_DIR)/image.mk
 
-define Image/BuildKernel/Template
-
- ifneq ($(1),)
-       $(CP) $(DTS_DIR)/$(1).dtb $(BIN_DIR)/$(IMG_PREFIX)-$(1).dtb
-
-       $(call Image/BuildKernel/MkFIT,$(1),$(KDIR)/zImage,$(BIN_DIR)/$(IMG_PREFIX)-$(1).dtb,none,0x10008000,0x10008000)
-       $(CP) $(KDIR)/fit-$(1).itb $(BIN_DIR)/$(IMG_PREFIX)-$(1)-fit-uImage.itb
-
-  ifneq ($(CONFIG_TARGET_ROOTFS_INITRAMFS),)
-       $(call Image/BuildKernel/MkFIT,$(1),$(KDIR)/zImage-initramfs,$(BIN_DIR)/$(IMG_PREFIX)-$(1).dtb,none,0x10008000,0x10008000,-initramfs)
-       $(CP) $(KDIR)/fit-$(1)-initramfs.itb $(BIN_DIR)/$(IMG_PREFIX)-$(1)-fit-uImage-initramfs.itb
-  endif
- endif
-
-       $(CP) $(KDIR)/zImage $(BIN_DIR)/$(IMG_PREFIX)-zImage
-       $(call Image/BuildKernel/MkuImage, \
-               none, 0x10008000, 0x10008000, \
-               $(BIN_DIR)/$(IMG_PREFIX)-zImage, \
-               $(BIN_DIR)/$(IMG_PREFIX)-uImage \
-       )
-
- ifneq ($(CONFIG_TARGET_ROOTFS_INITRAMFS),)
-       $(CP) $(KDIR)/zImage-initramfs $(BIN_DIR)/$(IMG_PREFIX)-zImage-initramfs
-       $(call Image/BuildKernel/MkuImage, \
-               none, 0x10008000, 0x10008000, \
-               $(BIN_DIR)/$(IMG_PREFIX)-zImage-initramfs, \
-               $(BIN_DIR)/$(IMG_PREFIX)-uImage-initramfs \
-       )
- endif
-endef
-
-define Image/InstallKernel/Template
-
- ifneq ($(CONFIG_TARGET_ROOTFS_INCLUDE_KERNEL)$(CONFIG_TARGET_imx6_VENTANA),)
-       $(INSTALL_DIR) $(TARGET_DIR)/boot
-   ifneq ($(CONFIG_TARGET_ROOTFS_INCLUDE_UIMAGE)$(CONFIG_TARGET_imx6_VENTANA),)
-       $(CP) $(BIN_DIR)/$(IMG_PREFIX)-uImage $(TARGET_DIR)/boot/
-       ln -sf $(IMG_PREFIX)-uImage $(TARGET_DIR)/boot/uImage
-   endif
-   ifneq ($(CONFIG_TARGET_ROOTFS_INCLUDE_ZIMAGE),)
-       $(CP) $(BIN_DIR)/$(IMG_PREFIX)-zImage $(TARGET_DIR)/boot/
-       ln -sf $(IMG_PREFIX)-zImage $(TARGET_DIR)/boot/zImage
-   endif
-   ifneq ($(CONFIG_TARGET_ROOTFS_INCLUDE_FIT),)
-       $(foreach dts,$(shell echo $(1)), \
-               $(CP) $(BIN_DIR)/$(IMG_PREFIX)-$(dts)-fit-uImage.itb $(TARGET_DIR)/boot/
+#################################################
+# Images
+#################################################
+
+# build a ubi for a specific flash geometry/layout which can contain
+# volumes with the following data from ubinize-$(DEVICE_NAME).cfg:
+#   - 'boot.ubifs' volume: kernel+dtbs+bootscript
+#   - 'root.squashfs' volume: rootfs
+# $(1): name (used for suffix)
+# $(2): PAGESIZE (-m param to mkfs.ubifs/ubinize)
+# $(3): ERASESIZE (logical eraseblock size: -e param to mkfs.ubifs)
+# $(4): BLOCKSIZE (-p param to ubinize)
+# $(5): MAXSIZE (maximum file-system size in LEB's -c param to mkfs.ubifs)
+#
+define Build/ubi-boot-overlay
+       # ubi-boot-overlay $(DEVICE_NAME) $(word 1, $(1))
+
+       # boot filesystem
+       rm -rf $(TARGET_ROOTFS_DIR)/boot-$(DEVICE_NAME)_$(word 1, $(1))
+       mkdir -p $(TARGET_ROOTFS_DIR)/boot-$(DEVICE_NAME)_$(word 1, $(1))
+       $(CP) $< $(TARGET_ROOTFS_DIR)/boot-$(DEVICE_NAME)_$(word 1, $(1))/$(IMG_PREFIX)-uImage
+       ln -sf $(IMG_PREFIX)-uImage \
+               $(TARGET_ROOTFS_DIR)/boot-$(DEVICE_NAME)_$(word 1, $(1))/uImage
+       $(foreach dts,$(shell echo $(DEVICE_DTS)), \
+               $(CP) $(LINUX_DIR)/arch/$(ARCH)/boot/dts/$(dts).dtb \
+                       $(BIN_DIR)/$(IMG_PREFIX)-$(dts).dtb; \
+               $(CP) $(LINUX_DIR)/arch/$(ARCH)/boot/dts/$(dts).dtb \
+                       $(TARGET_ROOTFS_DIR)/boot-$(DEVICE_NAME)_$(word 1, $(1))/$(IMG_PREFIX)-$(dts).dtb; \
+               ln -sf $(IMG_PREFIX)-$(dts).dtb \
+                       $(TARGET_ROOTFS_DIR)/boot-$(DEVICE_NAME)_$(word 1, $(1))/$(dts).dtb; \
        )
-   endif
- endif
-
- ifneq ($(CONFIG_TARGET_ROOTFS_INCLUDE_DTB)$(CONFIG_TARGET_imx6_VENTANA),)
-       $(INSTALL_DIR) $(TARGET_DIR)/boot
-       $(foreach dts,$(shell echo $(1)), \
-               $(CP) $(BIN_DIR)/$(IMG_PREFIX)-$(dts).dtb $(TARGET_DIR)/boot/ ; \
-               ln -sf $(IMG_PREFIX)-$(dts).dtb $(TARGET_DIR)/boot/$(dts).dtb ; \
+       mkimage -A arm -O linux -T script -C none -a 0 -e 0 \
+               -n '$(DEVICE_ID) OpenWrt bootscript' \
+               -d ./bootscript-$(DEVICE_NAME) \
+               $(TARGET_ROOTFS_DIR)/boot-$(DEVICE_NAME)_$(word 1, $(1))/6x_bootscript-$(DEVICE_NAME)
+       $(STAGING_DIR_HOST)/bin/mkfs.ubifs \
+               --space-fixup --force-compr=zlib --squash-uids \
+               -m $(word 2, $(1)) -e $(word 3, $(1)) -c $(word 5, $(1)) \
+               -o $(KDIR)/boot-$(DEVICE_NAME)-bootfs_$(word 1, $(1)).ubifs \
+               -d $(TARGET_ROOTFS_DIR)/boot-$(DEVICE_NAME)_$(word 1, $(1))
+       $(CP) $(KDIR)/boot-$(DEVICE_NAME)-bootfs_$(word 1, $(1)).ubifs \
+               $(BIN_DIR)/$(IMG_PREFIX)-$(DEVICE_NAME)-bootfs_$(word 1, $(1)).ubifs
+
+       # ubi
+       rm -rf p $(KDIR)/$(DEVICE_NAME)_$(word 1, $(1))
+       mkdir -p $(KDIR)/$(DEVICE_NAME)_$(word 1, $(1))
+       $(CP) $(word 2, $^) \
+               $(KDIR)/$(DEVICE_NAME)_$(word 1, $(1))/
+       $(CP) $(KDIR)/boot-$(DEVICE_NAME)-bootfs_$(word 1, $(1)).ubifs \
+               $(KDIR)/$(DEVICE_NAME)_$(word 1, $(1))/boot.ubifs
+       $(CP) ./ubinize-$(DEVICE_NAME).cfg \
+               $(KDIR)/$(DEVICE_NAME)_$(word 1, $(1))/ubinize.cfg
+       ( cd $(KDIR)/$(DEVICE_NAME)_$(word 1, $(1)); \
+               $(STAGING_DIR_HOST)/bin/ubinize \
+               -m $(word 2, $(1)) -p $(word 4, $(1)) -s $(word 2, $(1)) \
+               -o $@ \
+               ubinize.cfg \
        )
- endif
 endef
 
-define Image/Build/squashfs
-       $(call prepare_generic_squashfs,$(KDIR)/root.$(1))
-       dd if=$(KDIR)/root.$(1) of=$(BIN_DIR)/$(IMG_PREFIX)-$(1).bin bs=128k conv=sync
-       [ -f "$(BIN_DIR)/$(IMG_PREFIX)-$(PROFILE_SANITIZED)-fit-uImage.itb" ] && ( \
-               dd if=$(BIN_DIR)/$(IMG_PREFIX)-$(PROFILE_SANITIZED)-fit-uImage.itb bs=2048k conv=sync; \
-               dd if=$(KDIR)/root.$(1) bs=128k conv=sync; \
-       ) > $(BIN_DIR)/$(IMG_PREFIX)-$(PROFILE_SANITIZED)-fit-$(1).bin || true
+#################################################
+# Devices
+#################################################
+
+KERNEL_LOADADDR=0x10008000
+
+define Device/Default
+       DEVICE_DTS :=
+       FILESYSTEMS := squashfs ext4
+       KERNEL_INSTALL := 1
+       KERNEL_SUFFIX := -uImage
+       KERNEL_NAME := zImage
+       KERNEL := kernel-bin | uImage none
+       IMAGE_NAME = $$(IMAGE_PREFIX)-$$(1).$$(2)
+       IMAGES :=
 endef
 
-define ubifs_imx_gateworks_ventana
-       # Micron MT29F1G08ABAD/MT29F2G08ABAE/MT29F4G08ABAD/MT29F8G08ADAD NAND
-       $(eval VENTANA_UBIFS_OPTS:="-m 2048 -e 124KiB -c 8124")
-       $(eval VENTANA_UBI_OPTS:="-m 2048 -p 128KiB -s 2048")
-       $(call Image/mkfs/ubifs)
-       $(CP) $(KDIR)/root.ubifs $(BIN_DIR)/$(IMG_PREFIX)-$(PROFILE_SANITIZED)-rootfs_normal.ubifs
-       $(CP) $(KDIR)/root.ubi $(BIN_DIR)/$(IMG_PREFIX)-$(PROFILE_SANITIZED)-rootfs_normal.ubi
-
-       # Micron MT29F8G08ABAC/MT29F16G08ADAC 1GB/2GB NAND
-       $(eval VENTANA_UBIFS_OPTS:="-m 4096 -e 248KiB -c 8124")
-       $(eval VENTANA_UBI_OPTS:="-m 4096 -p 256KiB -s 4096")
-       $(call Image/mkfs/ubifs)
-       $(CP) $(KDIR)/root.ubifs $(BIN_DIR)/$(IMG_PREFIX)-$(PROFILE_SANITIZED)-rootfs_large.ubifs
-       $(CP) $(KDIR)/root.ubi $(BIN_DIR)/$(IMG_PREFIX)-$(PROFILE_SANITIZED)-rootfs_large.ubi
+DEVICE_VARS += DEVICE_DTS
+
+define Device/ventana
+       PROFILES = Generic VENTANA
+       DEVICE_DTS:= \
+               imx6dl-gw51xx \
+               imx6dl-gw52xx \
+               imx6dl-gw53xx \
+               imx6dl-gw54xx \
+               imx6dl-gw551x \
+               imx6dl-gw552x \
+               imx6q-gw51xx \
+               imx6q-gw52xx \
+               imx6q-gw53xx \
+               imx6q-gw54xx \
+               imx6q-gw5400-a \
+               imx6q-gw551x \
+               imx6q-gw552x
+       IMAGES := nand-factory_normal.ubi nand-factory_large.ubi
+       IMAGE/nand-factory_normal.ubi := ubi-boot-overlay normal 2048 124KiB 128KiB 8124
+       IMAGE/nand-factory_large.ubi := ubi-boot-overlay large 4096 248KiB 256KiB 8124
 endef
 
-define Image/Build/ubifs
-       true
+define Device/wandboard
+       PROFILES = Generic IMX6DL_WANDBOARD
+       DEVICE_DTS := imx6dl-wandboard
 endef
 
-define Image/Build/ubi
-       true
-endef
-
-
-Image/BuildKernel/Template/Generic=$(call Image/BuildKernel/Template)
-Image/InstallKernel/Template/Generic=$(call Image/InstallKernel/Template)
-
-Image/BuildKernel/Template/IMX6DL_WANDBOARD=$(call Image/BuildKernel/Template,imx6dl-wandboard)
-Image/InstallKernel/Template/IMX6DL_WANDBOARD=$(call Image/InstallKernel/Template,imx6dl-wandboard)
-
-Image/BuildKernel/Template/VENTANA=$(foreach dts,$(shell echo $(VENTANA_DTS)),$(call Image/BuildKernel/Template,$(dts)))
-Image/InstallKernel/Template/VENTANA=$(call Image/InstallKernel/Template,$(VENTANA_DTS))
-Image/ubifs/VENTANA=$(call ubifs_imx_gateworks_ventana)
-
-
-define Image/BuildKernel
-       $(call Image/BuildKernel/Template/$(PROFILE))
-endef
-
-define Image/InstallKernel
-       $(call Image/InstallKernel/Template/$(PROFILE))
-       $(if $(Image/ubifs/$(PROFILE)), \
-               $(call Image/ubifs/$(PROFILE))
-       )
-endef
-
-define Image/Build
-       $(if $(Image/Build/$(1)), \
-               $(call Image/Build/$(1),$(1)), \
-               $(CP) $(KDIR)/root.$(1) $(BIN_DIR)/$(IMG_PREFIX)-$(PROFILE_SANITIZED)-$(1).img \
-       )
-endef
+TARGET_DEVICES += \
+       ventana \
+       wandboard
 
 $(eval $(call BuildImage))
diff --git a/target/linux/imx6/image/bootscript-ventana b/target/linux/imx6/image/bootscript-ventana
new file mode 100644 (file)
index 0000000..8c789e5
--- /dev/null
@@ -0,0 +1,150 @@
+echo "Gateworks Ventana OpenWrt Boot script v1.00"
+
+# set some defaults
+# set some defaults
+test -n "$fs"    || fs=ext2
+test -n "$disk"  || disk=0
+setenv nextcon 0
+setenv bootargs console=${console},${baudrate}
+setenv loadaddr 10800000
+setenv fdt_addr 18000000
+
+# detect displays in the following priority: HDMI, LVDS
+# setenv display to override detection for a single display
+# or setenv video if you want multiple displays
+if test -n "$video" ; then
+  echo "using video config from env: $video"
+  setenv bootargs "${bootargs}" "${video}"
+else
+  if test -n "$display" ; then
+    echo "using display from env: $display"
+  elif test -n "$panel" ; then
+    echo "using display from env: $panel"
+    setenv display "$panel"
+  else
+    echo "Detecting displays..."
+    i2c dev 2
+    if hdmidet ; then
+       echo "  HDMI detected"
+       setenv display "HDMI"
+    elif i2c probe 0x04 ; then
+       echo "  Freescale MXC-LVDS1 detected"
+       setenv display "LVDS"
+    elif i2c probe 0x14 ; then
+       echo "  DLC800FIGT3 detected"
+       setenv display "LVDS"
+    elif i2c probe 0x38 ; then
+       echo "  DLC700JMGT4 detected"
+       setenv display "LVDS"
+    fi
+  fi
+
+  # configure displays
+  echo "Configuring kernel bootargs for display(s): $display"
+  for p in ${display}; do
+    if itest.s "x${p}" == "xHannstar-XGA" ; then
+       setenv ptype "LVDS"
+    elif itest.s "x${p}" == "xDLC700JMGT4" ; then
+       setenv ptype "LVDS"
+    elif itest.s "x${p}" == "xDLC800FIGT3" ; then
+       setenv ptype "LVDS"
+    elif itest.s "x${p}" == "xLVDS" ; then
+       setenv ptype "LVDS"
+    elif itest.s "x${p}" == "xHDMI" ; then
+       setenv ptype "HDMI"
+       test -n "$hdmi" || hdmi=1080p
+       if itest.s "x${hdmi}" == "x1080p" ; then
+               setenv hdmi "1920x1080M@60"
+       elif itest.s "x${hdmi}" == "x720p" ; then
+               setenv hdmi "1280x720M@60"
+       elif itest.s "x${hdmi}" == "x480p" ; then
+               setenv hdmi "720x480M@60"
+       fi
+    else
+        echo "${p} not supported"
+    fi
+
+    if itest.s "x${ptype}" == "xLVDS" ; then
+       echo "  mxcfb${nextcon}: LVDS ($p)"
+       setenv bootargs "${bootargs}" video=mxcfb${nextcon}:dev=ldb,bpp=32,if=RGB666
+       setexpr nextcon $nextcon + 1
+    elif itest.s "x${ptype}" == "xHDMI" ; then
+       echo "  mxcfb${nextcon}: HDMI ($hdmi)"
+       setenv bootargs "${bootargs}" video=mxcfb${nextcon}:dev=hdmi,bpp=32,${hdmi},if=RGB24
+       setexpr nextcon $nextcon + 1
+    fi
+
+  done
+
+  # disable remaining mxcfb devices
+  while test "4" -ne $nextcon ; do
+       setenv bootargs "${bootargs}" video=mxcfb${nextcon}:off
+       setexpr nextcon $nextcon + 1
+  done
+fi
+
+# detect dtype and bootdev by looking for kernel on media the bootloader
+# has mounted (in order of preference: usb/mmc/sata)
+#
+# This assumes the bootloader has already started the respective subsystem
+# or mounted the filesystem if appropriate to get to this bootscript
+#
+# To Speed up boot set dtype manually
+if test -n "$dtype" ; then
+       echo "Using dtype from env: $dtype"
+else
+       echo "Detecting boot device (dtype)..."
+       if ${fs}load usb ${disk}:1 ${loadaddr} ${bootdir}/uImage ; then
+               dtype=usb
+       elif ${fs}load mmc ${disk}:1 ${loadaddr} ${bootdir}/uImage ; then
+               dtype=mmc
+       elif ${fs}load sata ${disk}:1 ${loadaddr} ${bootdir}/uImage ; then
+               dtype=sata
+       elif ubifsload ${loadaddr} ${bootdir}/uImage ; then
+               dtype=nand
+       fi
+       echo "detected dtype:$dtype"
+fi
+if test -n "$bootdev" ; then
+       echo "Using bootdev from env: $bootdev"
+else
+       if itest.s "x${dtype}" == "xmmc" ; then
+               bootdev=mmcblk0
+       else
+               bootdev=sda
+       fi
+fi
+
+if itest.s "x${dtype}" == "xnand" ; then
+       echo "Booting from NAND..."
+       # fix partition name
+       #  OpenWrt kernel bug prevents partition name of 'rootfs' from booting
+       #  instead name the partition ubi which is what is looked for by
+       #  procd sysupgrade
+       mtdparts del rootfs && mtdparts add nand0 - ubi
+       echo "mtdparts:${mtdparts}"
+       setenv fsload ubifsload
+       setenv root "ubi0:ubi ubi.mtd=2 rootfstype=squashfs,ubifs"
+else
+       echo "Booting from block device ${bootdev}..."
+       setenv fsload "${fs}load ${dtype} ${disk}:1"
+       setenv root "root=/dev/${bootdev}"
+fi
+
+setenv bootargs "${bootargs}" "${root}" "${extra}"
+if ${fsload} ${loadaddr} ${bootdir}/uImage; then
+       if ${fsload} ${fdt_addr} ${bootdir}/${fdt_file}; then
+               echo Loaded DTB from ${bootdir}/${fdt_file}
+               bootm ${loadaddr} - ${fdt_addr}
+       elif ${fsload} ${fdt_addr} ${bootdir}/${fdt_file1}; then
+               echo Loaded DTB from ${bootdir}/${fdt_file1}
+               bootm ${loadaddr} - ${fdt_addr}
+       elif ${fsload} ${fdt_addr} ${bootdir}/${fdt_file2}; then
+               echo Loaded DTB from ${bootdir}/${fdt_file2}
+               bootm ${loadaddr} - ${fdt_addr}
+       else
+               echo "Error loading device-tree"
+       fi
+else
+       echo "Error loading kernel image"
+fi
diff --git a/target/linux/imx6/image/ubinize-ventana.cfg b/target/linux/imx6/image/ubinize-ventana.cfg
new file mode 100644 (file)
index 0000000..6b30b09
--- /dev/null
@@ -0,0 +1,37 @@
+[boot]
+# Volume mode (other option is static)
+mode=ubi
+# Source image
+image=boot.ubifs
+# Volume ID in UBI image
+vol_id=0
+# Allow for dynamic resize
+vol_type=dynamic
+# Volume name
+vol_name=boot
+vol_size=15MiB
+
+[rootfs]
+# Volume mode (other option is static)
+mode=ubi
+# Source image
+image=root.squashfs
+# Volume ID in UBI image
+vol_id=1
+# Allow for dynamic resize
+vol_type=dynamic
+# Volume name
+vol_name=rootfs
+
+[rootfs_data]
+# Volume mode (other option is static)
+mode=ubi
+# Volume ID in UBI image
+vol_id=2
+# Allow for dynamic resize
+vol_type=dynamic
+# Volume name
+vol_name=rootfs_data
+# Autoresize volume at first mount
+vol_flags=autoresize
+vol_size=1MiB