arc770: Introduce images for SD-cards
authorAlexey Brodkin <Alexey.Brodkin@synopsys.com>
Wed, 24 Aug 2016 14:48:12 +0000 (17:48 +0300)
committerFelix Fietkau <nbd@nbd.name>
Sun, 28 Aug 2016 11:51:42 +0000 (13:51 +0200)
Historically on ARC we started from initramfs-based images because:
 a) It was much easier to debug especially when toolchain and other
    components were changing quite dynamically
 b) It was our usual approach for embedded Linux

But now with ARC port of Lede/OpenWRT getting more stable and mature
we're ready for more real-life scenarios with FS permanently stored
on SD-card. This essentially benefits from ability to setup devices
that survive reboots with all settings and extra packages kept in place.

Still we keep an ability to build images with initramfs.
This allows us to use storage-less simulators for testing still.

Signed-off-by: Alexey Brodkin <abrodkin@synopsys.com>
Cc: John Crispin <john@phrozen.org>
Cc: Jo-Philipp Wich <jo@mein.io>
target/linux/arc770/generic/profiles/01-minimal.mk [deleted file]
target/linux/arc770/generic/profiles/02-axs101.mk [deleted file]
target/linux/arc770/generic/profiles/03-nsim_700.mk [deleted file]
target/linux/arc770/generic/target.mk
target/linux/arc770/image/Config.in [new file with mode: 0644]
target/linux/arc770/image/Makefile
target/linux/arc770/image/gen_axs10x_sdcard_img.sh [new file with mode: 0755]
target/linux/arc770/image/uEnv.txt [new file with mode: 0644]

diff --git a/target/linux/arc770/generic/profiles/01-minimal.mk b/target/linux/arc770/generic/profiles/01-minimal.mk
deleted file mode 100644 (file)
index c8968da..0000000
+++ /dev/null
@@ -1,15 +0,0 @@
-#
-# Copyright (C) 2015 OpenWrt.org
-#
-# This is free software, licensed under the GNU General Public License v2.
-# See /LICENSE for more information.
-#
-
-define Profile/Minimal
-       NAME:=Minimal Profile (no drivers)
-endef
-
-define Profile/Minimal/Description
-       Minimal package set compatible with most boards.
-endef
-$(eval $(call Profile,Minimal))
diff --git a/target/linux/arc770/generic/profiles/02-axs101.mk b/target/linux/arc770/generic/profiles/02-axs101.mk
deleted file mode 100644 (file)
index 3fb6526..0000000
+++ /dev/null
@@ -1,16 +0,0 @@
-#
-# Copyright (C) 2015 OpenWrt.org
-#
-# This is free software, licensed under the GNU General Public License v2.
-# See /LICENSE for more information.
-#
-
-define Profile/axs101
-       NAME:=Synopsys DesignWare AXS101
-       PACKAGES:= kmod-usb-core kmod-usb-ohci kmod-usb2 kmod-ath9k-htc wpad-mini
-endef
-
-define Profile/axs101/Description
-       Package set compatible with hardware using Synopsys DesignWare AXS101 boards.
-endef
-$(eval $(call Profile,axs101))
diff --git a/target/linux/arc770/generic/profiles/03-nsim_700.mk b/target/linux/arc770/generic/profiles/03-nsim_700.mk
deleted file mode 100644 (file)
index 843a342..0000000
+++ /dev/null
@@ -1,15 +0,0 @@
-#
-# Copyright (C) 2015 OpenWrt.org
-#
-# This is free software, licensed under the GNU General Public License v2.
-# See /LICENSE for more information.
-#
-
-define Profile/nsim_700
-       NAME:=Synopsys nSIM
-endef
-
-define Profile/nsim_700/Description
-       Package set compatible with hardware using Synopsys nSIM 700 boards.
-endef
-$(eval $(call Profile,nsim_700))
index eba5c3c7e8413753cecf36e14c0cf199e7186819..15f598ee16cc966ecf77579050e67fe2960cae4a 100644 (file)
@@ -1,5 +1,5 @@
 BOARDNAME:=Generic
-FEATURES += ramdisk usb
+FEATURES += ramdisk usb ext4
 
 define Target/Description
        Build firmware images for generic ARC 770D based boards.
diff --git a/target/linux/arc770/image/Config.in b/target/linux/arc770/image/Config.in
new file mode 100644 (file)
index 0000000..52f68ba
--- /dev/null
@@ -0,0 +1,5 @@
+config AXS10X_SD_BOOT_PARTSIZE
+       int "Boot (SD Card) filesystem partition size (in MB)"
+       depends on TARGET_arc770
+       default 20
+
index 79ce71e726f02a9448af4edf3fe1ad3eba79fa84..f5e43f5bc949fdc683c2dce26ff26049d678e6b7 100644 (file)
@@ -11,46 +11,76 @@ include $(INCLUDE_DIR)/image.mk
 # in memory from build to built. Thus we need to extract EP from vmlinux
 # every time before generation of uImage.
 define Build/calculate-ep
-       $(eval KERNEL_ENTRY=$(shell $(KERNEL_CROSS)readelf -h $(LINUX_DIR)/vmlinux | grep "Entry point address" | grep -o 0x.*))
+       $(eval KERNEL_ENTRY=$(shell $(KERNEL_CROSS)readelf -h $(1) | grep "Entry point address" | grep -o 0x.*))
 endef
 
-define Build/patch-dtb
-       $(call Image/BuildDTB,$(DTS_DIR)/$(DEVICE_DTS).dts,$@.dtb)
-       $(STAGING_DIR_HOST)/bin/patch-dtb $@ $@.dtb
+define Build/build-dtb
+       $(call Image/BuildDTB,$(DTS_DIR)/$(DEVICE_DTS).dts,$(DTS_DIR)/$(DEVICE_DTS).dtb)
 endef
 
-# Shared device definition: applies to every defined device
-define Device/Default
-  PROFILES = Default $$(DEVICE_PROFILE)
-  KERNEL_DEPENDS = $$(wildcard ../dts/$$(DEVICE_DTS).dts)
-  DEVICE_PROFILE :=
+define Build/patch-dtb
+       $(STAGING_DIR_HOST)/bin/patch-dtb $@ $(DTS_DIR)/$(DEVICE_DTS).dtb
 endef
-DEVICE_VARS += DEVICE_PROFILE
 
+ifneq ($(CONFIG_TARGET_ROOTFS_INITRAMFS),)
+# Root FS built-in
 define Device/vmlinux
-  KERNEL_SUFFIX := .elf
-  KERNEL_INITRAMFS := kernel-bin | patch-dtb
-  KERNEL_INITRAMFS_NAME = vmlinux-initramfs.elf
-endef
-
-define Device/uImage
-  KERNEL_SUFFIX := -uImage
-  KERNEL_INITRAMFS := kernel-bin | patch-dtb | calculate-ep | uImage none
-  KERNEL_LOADADDR := 0x80000000
+       KERNEL_SUFFIX := .elf
+       KERNEL := kernel-bin | build-dtb | patch-dtb
+       KERNEL_INITRAMFS_NAME = vmlinux-initramfs.elf
 endef
 
-define Device/axs101
-       $(call Device/uImage)
-       DEVICE_PROFILE := axs101
-       DEVICE_DTS := axs101
-endef
-TARGET_DEVICES += axs101
-
 define Device/nsim
        $(call Device/vmlinux)
        DEVICE_PROFILE := nsim
        DEVICE_DTS := nsim_700
 endef
 TARGET_DEVICES += nsim
+endif
+
+# Root FS on SD-card
+KERNEL_LOADADDR := 0x80000000
+DEVICE_DTS_LIST:= axs101
+FAT32_BLOCK_SIZE=1024
+FAT32_BLOCKS=$(shell echo $$(($(CONFIG_AXS10X_SD_BOOT_PARTSIZE)*1024*1024/$(FAT32_BLOCK_SIZE))))
+
+define Image/Build/SDCard
+       rm -f $(KDIR_TMP)/$(IMG_PREFIX)-$(PROFILE)-boot.img
+       mkdosfs $(KDIR_TMP)/$(IMG_PREFIX)-$(PROFILE)-boot.img -C $(FAT32_BLOCKS)
+       mkimage -C none -A arc -T script -d uEnv.txt $(BIN_DIR)/uEnv.scr
+       mcopy -i $(KDIR_TMP)/$(IMG_PREFIX)-$(PROFILE)-boot.img $(BIN_DIR)/uEnv.scr ::boot.scr
+       mcopy -i $(KDIR_TMP)/$(IMG_PREFIX)-$(PROFILE)-boot.img $(DTS_DIR)/*.dtb ::
+       mcopy -i $(KDIR_TMP)/$(IMG_PREFIX)-$(PROFILE)-boot.img $(BIN_DIR)/$(IMG_PREFIX)-uImage ::uImage
+
+       ./gen_axs10x_sdcard_img.sh \
+               $(BIN_DIR)/$(IMG_PREFIX)-$(PROFILE)-sdcard-vfat-$(1).img \
+               $(KDIR_TMP)/$(IMG_PREFIX)-$(PROFILE)-boot.img \
+               $(KDIR)/root.$(1) \
+               $(CONFIG_AXS10X_SD_BOOT_PARTSIZE) \
+               $(CONFIG_TARGET_ROOTFS_PARTSIZE)
+
+ifneq ($(CONFIG_TARGET_IMAGES_GZIP),)
+       gzip -f9n $(BIN_DIR)/$(IMG_PREFIX)-$(PROFILE)-sdcard-vfat-$(1).img
+endif
+endef
+
+define Image/BuildKernel
+       # Build unified uImage
+       $(call Build/calculate-ep, $(KDIR)/vmlinux.elf)
+       $(call Image/BuildKernel/MkuImage, \
+               none, $(KERNEL_LOADADDR), $(KERNEL_ENTRY), \
+               $(KDIR)/vmlinux, \
+               $(BIN_DIR)/$(IMG_PREFIX)-uImage \
+       )
+
+       # Build .dtb for all boards we may run on
+       $(foreach DEVICE_DTS,$(shell echo $(DEVICE_DTS_LIST)), $(call Build/build-dtb))
+endef
+
+define Image/Build
+       $(call Image/Build/$(1),$(1))
+       $(call Image/Build/SDCard,$(1))
+       dd if=$(KDIR)/root.$(1) of=$(BIN_DIR)/$(IMG_PREFIX)-root.$(1) bs=128k conv=sync
+endef
 
 $(eval $(call BuildImage))
diff --git a/target/linux/arc770/image/gen_axs10x_sdcard_img.sh b/target/linux/arc770/image/gen_axs10x_sdcard_img.sh
new file mode 100755 (executable)
index 0000000..9a6f93d
--- /dev/null
@@ -0,0 +1,33 @@
+#!/usr/bin/env bash
+
+#
+# Copyright (C) 2016 OpenWrt.org
+#
+# This is free software, licensed under the GNU General Public License v2.
+# See /LICENSE for more information.
+#
+
+set -x
+[ $# -eq 5 ] || {
+    echo "SYNTAX: $0 <file> <bootfs image> <rootfs image> <bootfs size> <rootfs size>"
+    exit 1
+}
+
+OUTPUT="$1"
+BOOTFS="$2"
+ROOTFS="$3"
+BOOTFSSIZE="$4"
+ROOTFSSIZE="$5"
+
+head=4
+sect=63
+
+set `ptgen -o $OUTPUT -h $head -s $sect -l 1024 -t c -p ${BOOTFSSIZE}M -t 83 -p ${ROOTFSSIZE}M`
+
+BOOTOFFSET="$(($1 / 512))"
+BOOTSIZE="$(($2 / 512))"
+ROOTFSOFFSET="$(($3 / 512))"
+ROOTFSSIZE="$(($4 / 512))"
+
+dd bs=512 if="$BOOTFS" of="$OUTPUT" seek="$BOOTOFFSET" conv=notrunc
+dd bs=512 if="$ROOTFS" of="$OUTPUT" seek="$ROOTFSOFFSET" conv=notrunc
diff --git a/target/linux/arc770/image/uEnv.txt b/target/linux/arc770/image/uEnv.txt
new file mode 100644 (file)
index 0000000..35549cb
--- /dev/null
@@ -0,0 +1,7 @@
+setenv kernel_addr_r 0x82000000
+setenv fdt_addr_r 0x83000000
+setenv loadkernel fatload mmc 0 \$(kernel_addr_r) uImage
+setenv loaddtb fatload mmc 0 \$(fdt_addr_r) \$(dts)
+setenv bootargs earlycon=uart8250,mmio32,0xe0022000,115200n8 console=ttyS3,115200n8 root=/dev/mmcblk0p2 rootwait print-fatal-signals=1
+setenv uenvcmd run loadkernel\; run loaddtb\; bootm \$(kernel_addr_r) - \$(fdt_addr_r)
+run uenvcmd