[LEDE-DEV] [PATCH 5/5] archs38: Introduce images for SD-cards

Alexey Brodkin Alexey.Brodkin at synopsys.com
Tue Aug 16 04:49:20 PDT 2016


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 at synopsys.com>
Cc: John Crispin <john at phrozen.org>
---
 target/linux/archs38/Makefile                      |  2 +-
 .../linux/archs38/generic/profiles/01-minimal.mk   | 15 ----
 target/linux/archs38/generic/profiles/02-axs103.mk | 16 -----
 .../linux/archs38/generic/profiles/03-nsim_hs.mk   | 15 ----
 target/linux/archs38/generic/target.mk             |  8 ---
 target/linux/archs38/image/Config.in               |  5 ++
 target/linux/archs38/image/Makefile                | 80 +++++++++++++++-------
 .../linux/archs38/image/gen_axs10x_sdcard_img.sh   | 33 +++++++++
 target/linux/archs38/image/uEnv.txt                |  7 ++
 .../{generic => ramdisk}/profiles/00-default.mk    |  1 -
 target/linux/archs38/ramdisk/target.mk             |  8 +++
 .../archs38/{generic => sd}/profiles/00-default.mk |  0
 target/linux/archs38/sd/target.mk                  |  8 +++
 13 files changed, 117 insertions(+), 81 deletions(-)
 delete mode 100644 target/linux/archs38/generic/profiles/01-minimal.mk
 delete mode 100644 target/linux/archs38/generic/profiles/02-axs103.mk
 delete mode 100644 target/linux/archs38/generic/profiles/03-nsim_hs.mk
 delete mode 100644 target/linux/archs38/generic/target.mk
 create mode 100644 target/linux/archs38/image/Config.in
 create mode 100755 target/linux/archs38/image/gen_axs10x_sdcard_img.sh
 create mode 100644 target/linux/archs38/image/uEnv.txt
 copy target/linux/archs38/{generic => ramdisk}/profiles/00-default.mk (84%)
 create mode 100644 target/linux/archs38/ramdisk/target.mk
 rename target/linux/archs38/{generic => sd}/profiles/00-default.mk (100%)
 create mode 100644 target/linux/archs38/sd/target.mk

diff --git a/target/linux/archs38/Makefile b/target/linux/archs38/Makefile
index 166d3d5..cbdbfba 100644
--- a/target/linux/archs38/Makefile
+++ b/target/linux/archs38/Makefile
@@ -11,7 +11,7 @@ CPU_TYPE:=archs
 BOARD:=archs38
 BOARDNAME:=Synopsys DesignWare ARC HS38
 MAINTAINER:=Alexey Brodkin <abrodkin at synopsys.com>
-SUBTARGETS:=generic
+SUBTARGETS:=sd ramdisk
 
 KERNEL_PATCHVER:=4.4
 
diff --git a/target/linux/archs38/generic/profiles/01-minimal.mk b/target/linux/archs38/generic/profiles/01-minimal.mk
deleted file mode 100644
index fe8d8c3..0000000
--- a/target/linux/archs38/generic/profiles/01-minimal.mk
+++ /dev/null
@@ -1,15 +0,0 @@
-#
-# Copyright (C) 2016 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/archs38/generic/profiles/02-axs103.mk b/target/linux/archs38/generic/profiles/02-axs103.mk
deleted file mode 100644
index 7a89b21..0000000
--- a/target/linux/archs38/generic/profiles/02-axs103.mk
+++ /dev/null
@@ -1,16 +0,0 @@
-#
-# Copyright (C) 2016 OpenWrt.org
-#
-# This is free software, licensed under the GNU General Public License v2.
-# See /LICENSE for more information.
-#
-
-define Profile/axs103
-	NAME:=Synopsys DesignWare AXS103
-	PACKAGES:= kmod-usb-core kmod-usb-ohci kmod-ath9k-htc wpad-mini
-endef
-
-define Profile/axs103/Description
-	Package set compatible with hardware using Synopsys DesignWare AXS103 boards.
-endef
-$(eval $(call Profile,axs103))
diff --git a/target/linux/archs38/generic/profiles/03-nsim_hs.mk b/target/linux/archs38/generic/profiles/03-nsim_hs.mk
deleted file mode 100644
index cebb0a6..0000000
--- a/target/linux/archs38/generic/profiles/03-nsim_hs.mk
+++ /dev/null
@@ -1,15 +0,0 @@
-#
-# Copyright (C) 2016 OpenWrt.org
-#
-# This is free software, licensed under the GNU General Public License v2.
-# See /LICENSE for more information.
-#
-
-define Profile/nsim_hs
-	NAME:=Synopsys nSIM
-endef
-
-define Profile/nsim_hs/Description
-	Package set compatible with hardware using Synopsys nSIM HS boards.
-endef
-$(eval $(call Profile,nsim_hs))
diff --git a/target/linux/archs38/generic/target.mk b/target/linux/archs38/generic/target.mk
deleted file mode 100644
index 19b310e..0000000
--- a/target/linux/archs38/generic/target.mk
+++ /dev/null
@@ -1,8 +0,0 @@
-BOARDNAME:=Generic
-FEATURES += ramdisk usb
-
-define Target/Description
-	Build firmware images for generic ARC HS38 based boards.
-endef
-
-
diff --git a/target/linux/archs38/image/Config.in b/target/linux/archs38/image/Config.in
new file mode 100644
index 0000000..e51db83
--- /dev/null
+++ b/target/linux/archs38/image/Config.in
@@ -0,0 +1,5 @@
+config AXS10X_SD_BOOT_PARTSIZE
+	int "Boot (SD Card) filesystem partition size (in MB)"
+	depends on TARGET_archs38
+	default 20
+
diff --git a/target/linux/archs38/image/Makefile b/target/linux/archs38/image/Makefile
index f5dce28..505ed02 100644
--- a/target/linux/archs38/image/Makefile
+++ b/target/linux/archs38/image/Makefile
@@ -14,43 +14,73 @@ define Build/calculate-ep
 	$(eval KERNEL_ENTRY=$(shell $(KERNEL_CROSS)readelf -h $(LINUX_DIR)/vmlinux | 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/axs103
-	$(call Device/uImage)
-	DEVICE_PROFILE := axs103
-	DEVICE_DTS := axs103_idu
-endef
-TARGET_DEVICES += axs103
-
 define Device/nsim_hs
 	$(call Device/vmlinux)
 	DEVICE_PROFILE := nsim_hs
 	DEVICE_DTS := nsim_hs_idu
 endef
 TARGET_DEVICES += nsim_hs
+else
+# Root FS on SD-card
+KERNEL_LOADADDR := 0x80000000
+DEVICE_DTS_LIST:= axs103_idu
+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)
+	$(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
+endif
 
 $(eval $(call BuildImage))
diff --git a/target/linux/archs38/image/gen_axs10x_sdcard_img.sh b/target/linux/archs38/image/gen_axs10x_sdcard_img.sh
new file mode 100755
index 0000000..9a6f93d
--- /dev/null
+++ b/target/linux/archs38/image/gen_axs10x_sdcard_img.sh
@@ -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/archs38/image/uEnv.txt b/target/linux/archs38/image/uEnv.txt
new file mode 100644
index 0000000..35549cb
--- /dev/null
+++ b/target/linux/archs38/image/uEnv.txt
@@ -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
diff --git a/target/linux/archs38/generic/profiles/00-default.mk b/target/linux/archs38/ramdisk/profiles/00-default.mk
similarity index 84%
copy from target/linux/archs38/generic/profiles/00-default.mk
copy to target/linux/archs38/ramdisk/profiles/00-default.mk
index fd8143a..4d86da3 100644
--- a/target/linux/archs38/generic/profiles/00-default.mk
+++ b/target/linux/archs38/ramdisk/profiles/00-default.mk
@@ -7,7 +7,6 @@
 
 define Profile/Default
 	NAME:=Default Profile (all drivers)
-	PACKAGES:= kmod-usb-core kmod-usb-ohci kmod-ath9k-htc wpad-mini
 endef
 
 define Profile/Default/Description
diff --git a/target/linux/archs38/ramdisk/target.mk b/target/linux/archs38/ramdisk/target.mk
new file mode 100644
index 0000000..8612d32
--- /dev/null
+++ b/target/linux/archs38/ramdisk/target.mk
@@ -0,0 +1,8 @@
+BOARDNAME:=Ramdisk
+FEATURES += ramdisk
+
+define Target/Description
+	Build firmware images for generic ARC HS38 based boards that use built-in initramfs
+endef
+
+
diff --git a/target/linux/archs38/generic/profiles/00-default.mk b/target/linux/archs38/sd/profiles/00-default.mk
similarity index 100%
rename from target/linux/archs38/generic/profiles/00-default.mk
rename to target/linux/archs38/sd/profiles/00-default.mk
diff --git a/target/linux/archs38/sd/target.mk b/target/linux/archs38/sd/target.mk
new file mode 100644
index 0000000..ca4f191
--- /dev/null
+++ b/target/linux/archs38/sd/target.mk
@@ -0,0 +1,8 @@
+BOARDNAME:=SD
+FEATURES += ext4 usb
+
+define Target/Description
+	Build firmware images for ARC HS38 based boards that use SD-card for booting.
+endef
+
+
-- 
2.7.4




More information about the Lede-dev mailing list