zynq: reworked image creation process

After commit a1248da (zynq: convert to new image build code),
all boards, became unbootable, entering into a boot loop.

Replace the compressed kernel zImage by an uncompressed Image,
which is compressed after with gzip. Also, enable the creation
of an initramfs image by default.

Change images' filename to match the compatible string from the
respective .dts file (<vendor>_<model>). Also, use the shared
mkits.sh script and remove the target specific one.

Fixes: FS#1204

Run-tested: ZedBoard

Signed-off-by: Luis Araneda <luaraneda@gmail.com>
This commit is contained in:
Luis Araneda 2018-05-13 14:05:38 -04:00 committed by John Crispin
parent c335649629
commit dfac3ffd07
3 changed files with 31 additions and 199 deletions

View file

@ -9,7 +9,7 @@ include $(TOPDIR)/rules.mk
ARCH:=arm
BOARD:=zynq
BOARDNAME:=Xilinx Zynq 7000 SoCs
FEATURES:=fpu gpio rtc usb usbgadget targz source-only
FEATURES:=fpu gpio rtc usb usbgadget ramdisk targz source-only
CPU_TYPE:=cortex-a9
CPU_SUBTYPE:=neon
MAINTAINER:=Jason Wu <jason.wu.misc@gmail.com>
@ -24,7 +24,7 @@ KERNEL_PATCHVER:=4.4
include $(INCLUDE_DIR)/target.mk
KERNELNAME:=zImage dtbs
KERNELNAME:=Image dtbs
DEFAULT_PACKAGES += uboot-envtools

View file

@ -8,64 +8,46 @@ include $(TOPDIR)/rules.mk
include $(INCLUDE_DIR)/image.mk
#################################################
# Images
# Default and templates
#################################################
# $(1): rootfs contents directory
define Image/mkfs/cpio
( cd $(call mkfs_target_dir,$(1))/; find . | cpio -o -H newc | gzip -9n > $@ )
define Device/Default
PROFILES := Default
KERNEL_DEPENDS = $$(wildcard $(DTS_DIR)/$$(DEVICE_DTS).dts)
KERNEL_INITRAMFS_PREFIX := $$(IMG_PREFIX)-$(1)-initramfs
KERNEL_PREFIX := $$(IMAGE_PREFIX)
KERNEL_LOADADDR := 0x8000
endef
# $(1): zynq board id
define Build/dtb
$(call Image/BuildDTB,$(DTS_DIR)/zynq-$(1).dts,$@.dtb)
endef
define Build/uRamdisk
# Create uboot cpio.gz
mkimage -A arm -T ramdisk -C gzip -n "$(PROFILE) OpenWRT rootfs" \
-d $(IMAGE_ROOTFS) $@.new
mv $@.new $@
endef
# $(1): FIT name/description
define Build/fit
# create FIT image with rootfs
./mkits.sh \
-D $(1) -o $@.its -k $(IMAGE_KERNEL) -d $(IMAGE_KERNEL).dtb \
-C none -a $(KERNEL_LOADADDR) -e $(KERNEL_ENTRY) \
-A $(ARCH) -v $(LINUX_VERSION) -r $(IMAGE_ROOTFS) -z gzip
PATH=$(LINUX_DIR)/scripts/dtc:$(PATH) mkimage -f $@.its $@
define Device/FitImageGzip
KERNEL_SUFFIX := -fit-uImage.itb
KERNEL = kernel-bin | gzip | fit gzip $$(DTS_DIR)/$$(DEVICE_DTS).dtb
KERNEL_NAME := Image
endef
#################################################
# Devices
#################################################
# default kernel load address
KERNEL_LOADADDR=0x8000
KERNEL_ENTRY=0x8000
TARGET_FILESYSTEMS += cpio
# $(1): canonical device name
# $(2): lowercase device id
define ZynqDevice
define Device/$(1)
DEVICE_TITLE := $(1) development board
KERNEL := dtb $(2) | kernel-bin | uImage none
KERNEL_NAME = zImage
IMAGES := uramdisk.image.gz fit.itb
IMAGE/uramdisk.image.gz := uRamdisk
IMAGE/fit.itb := fit $(2)
IMAGE_NAME = $$$$(IMG_PREFIX)-$(2)-$$$$(2)
endef
TARGET_DEVICES += $(1)
define Device/digilent_zynq-zybo
$(call Device/FitImageGzip)
DEVICE_TITLE := ZYBO Development Board
DEVICE_DTS := zynq-zybo
endef
TARGET_DEVICES += digilent_zynq-zybo
$(eval $(call ZynqDevice,ZC702,zc702))
$(eval $(call ZynqDevice,ZedBoard,zed))
$(eval $(call ZynqDevice,ZYBO,zybo))
define Device/xlnx_zynq-zc702
$(call Device/FitImageGzip)
DEVICE_TITLE := ZC702 Development Board
DEVICE_DTS := zynq-zc702
endef
TARGET_DEVICES += xlnx_zynq-zc702
define Device/xlnx_zynq-zed
$(call Device/FitImageGzip)
DEVICE_TITLE := Zed Development Board
DEVICE_DTS := zynq-zed
endef
TARGET_DEVICES += xlnx_zynq-zed
$(eval $(call BuildImage))

View file

@ -1,150 +0,0 @@
#!/bin/bash
#
# Licensed under the terms of the GNU GPL License version 2 or later.
#
# Author: Peter Tyser <ptyser@xes-inc.com>
#
# U-Boot firmware supports the booting of images in the Flattened Image
# Tree (FIT) format. The FIT format uses a device tree structure to
# describe a kernel image, device tree blob, ramdisk, etc. This script
# creates an Image Tree Source (.its file) which can be passed to the
# 'mkimage' utility to generate an Image Tree Blob (.itb file). The .itb
# file can then be booted by U-Boot (or other bootloaders which support
# FIT images). See doc/uImage.FIT/howto.txt in U-Boot source code for
# additional information on FIT images.
#
usage() {
echo "Usage: `basename $0` -A arch -C comp -a addr -e entry" \
"-v version -k kernel [-D name -d dtb] -o its_file"
echo -e "\t-A ==> set architecture to 'arch'"
echo -e "\t-C ==> set compression type 'comp'"
echo -e "\t-a ==> set load address to 'addr' (hex)"
echo -e "\t-e ==> set entry point to 'entry' (hex)"
echo -e "\t-v ==> set kernel version to 'version'"
echo -e "\t-k ==> include kernel image 'kernel'"
echo -e "\t-D ==> human friendly Device Tree Blob 'name'"
echo -e "\t-d ==> include Device Tree Blob 'dtb'"
echo -e "\t-r ==> include ramdisk"
echo -e "\t-z ==> ramdisk compression type"
echo -e "\t-o ==> create output file 'its_file'"
exit 1
}
while getopts ":A:a:C:D:d:e:k:o:v:r:z:" OPTION
do
case $OPTION in
A ) ARCH=$OPTARG;;
a ) LOAD_ADDR=$OPTARG;;
C ) COMPRESS=$OPTARG;;
D ) DEVICE=$OPTARG;;
d ) DTB=$OPTARG;;
e ) ENTRY_ADDR=$OPTARG;;
k ) KERNEL=$OPTARG;;
o ) OUTPUT=$OPTARG;;
v ) VERSION=$OPTARG;;
r ) RAMDISK=$OPTARG;;
z ) RD_COMPRESS=$OPTARG;;
* ) echo "Invalid option passed to '$0' (options:$@)"
usage;;
esac
done
# Make sure user entered all required parameters
if [ -z "${ARCH}" ] || [ -z "${COMPRESS}" ] || [ -z "${LOAD_ADDR}" ] || \
[ -z "${ENTRY_ADDR}" ] || [ -z "${VERSION}" ] || [ -z "${KERNEL}" ] || \
[ -z "${OUTPUT}" ]; then
usage
fi
ARCH_UPPER=`echo $ARCH | tr '[:lower:]' '[:upper:]'`
# Conditionally create fdt information
if [ -n "${DTB}" ]; then
FDT="
fdt@1 {
description = \"${ARCH_UPPER} OpenWrt ${DEVICE} device tree blob\";
data = /incbin/(\"${DTB}\");
type = \"flat_dt\";
arch = \"${ARCH}\";
compression = \"none\";
hash@1 {
algo = \"crc32\";
};
hash@2 {
algo = \"sha1\";
};
};
"
CONF=" fdt = \"fdt@1\";"
fi
# Conditionally create ramdisk node
if [ -n "${RAMDISK}" ]; then
RD_COMPRESS=${RD_COMPRESS:-none}
RD="
ramdisk@1 {
description = \"${ARCH_UPPER} OpenWrt ${DEVICE} ramdisk\";
data = /incbin/(\"${RAMDISK}\");
type = \"ramdisk\";
arch = \"${ARCH}\";
os = \"linux\";
compression = \"${RD_COMPRESS}\";
hash@1 {
algo = \"crc32\";
};
hash@2 {
algo = \"sha1\";
};
};
"
if [ -z "${CONF}" ]; then
CONF=" ramdisk = \"ramdisk@1\";"
else
CONF="$CONF
ramdisk = \"ramdisk@1\";"
fi
fi
# Create a default, fully populated DTS file
DATA="/dts-v1/;
/ {
description = \"${ARCH_UPPER} OpenWrt FIT (Flattened Image Tree)\";
#address-cells = <1>;
images {
kernel@1 {
description = \"${ARCH_UPPER} OpenWrt Linux-${VERSION}\";
data = /incbin/(\"${KERNEL}\");
type = \"kernel\";
arch = \"${ARCH}\";
os = \"linux\";
compression = \"${COMPRESS}\";
load = <${LOAD_ADDR}>;
entry = <${ENTRY_ADDR}>;
hash@1 {
algo = \"crc32\";
};
hash@2 {
algo = \"sha1\";
};
};
${RD}
${FDT}
};
configurations {
default = \"config@1\";
config@1 {
description = \"OpenWrt\";
kernel = \"kernel@1\";
${CONF}
};
};
};"
# Write .its file to disk
echo "$DATA" > ${OUTPUT}