mailarchive of the ptxdist mailing list
 help / color / mirror / Atom feed
From: Bernhard Walle <bernhard@bwalle.de>
To: ptxdist@pengutronix.de
Cc: Bernhard Walle <walle@corscience.de>
Subject: [ptxdist] [PATCH 2/3] Allow creation of bootable SD card for OMAP CPUs
Date: Wed, 25 Apr 2012 16:18:02 +0200	[thread overview]
Message-ID: <1335363483-19730-2-git-send-email-bernhard@bwalle.de> (raw)
In-Reply-To: <1335363483-19730-1-git-send-email-bernhard@bwalle.de>

With the new option IMAGE_OMAPSD it's possible to create an image for
OMAP-bootable SD cards. Tested with a devkit8000 and a virtual beagle
board (qemu).

See the comment in platforms/image_omapsd.in for more information.

Signed-off-by: Bernhard Walle <walle@corscience.de>
---
 platforms/image_omapsd.in    |   48 +++++++++++
 rules/post/image_omapsd.make |   33 ++++++++
 scripts/genomapsdimg         |  188 ++++++++++++++++++++++++++++++++++++++++++
 3 files changed, 269 insertions(+)
 create mode 100644 platforms/image_omapsd.in
 create mode 100644 rules/post/image_omapsd.make
 create mode 100755 scripts/genomapsdimg

diff --git a/platforms/image_omapsd.in b/platforms/image_omapsd.in
new file mode 100644
index 0000000..ef6c5e4
--- /dev/null
+++ b/platforms/image_omapsd.in
@@ -0,0 +1,48 @@
+## SECTION=image
+
+menuconfig IMAGE_OMAPSD
+	bool
+	select IMAGE_VFAT_TOOLS
+	select HOST_PARTED
+	select IMAGE_EXT2
+	depends on ARCH_ARM
+	prompt "Generate OMAP bootable SD card"
+	help
+	  Creates an bootable SD card for OMAP CPUs, for example for the beagle board.
+	  The resulting image is called "omap_sd.img". You can copy it with "dd"
+	  on a raw SD card, without partitioning.
+
+	  The SD card contains two file systems:
+	    1) A FAT file system that contains MLO, a bootloader and a Linux kernel
+	       (plus additional files like an initramfs).
+	    2) The root file system as ext3 file system.
+
+	  OMAP has special requirements regarding the geometry of partition table,
+	  and the location of MLO, that's why a fixed image makes more sense here
+	  than copying the files manually.
+
+if IMAGE_OMAPSD
+
+config IMAGE_OMAPSD_BOOTLOADER
+	string
+	default "u-boot.img"
+	prompt "Bootloader file"
+	help
+	  The name of the bootloader that should be copied to the SD card. If you use
+	  u-boot SPL, then "u-boot.img" is the right choice here. If you still use
+	  x-loader, then "u-boot.bin" should be copied. Also barebox can be used
+	  with its MLO. The file must reside in the images directory of the platform.
+
+config IMAGE_OMAPSD_ADDITIONAL_BOOT_FILES
+	string
+	default ""
+	prompt "Additional files for the boot partition"
+	help
+	  A (whitespace separated) list of additional files can be specified here.
+	  The files get copied in the boot partition (1st FAT partition). They must
+	  be in the images/ directory of the platform that is built. One example is
+	  a uRamdisk that gets loaded by the bootloader.
+
+endif
+
+# vim: set sw=8 ts=8 noet ft=kconfig:
diff --git a/rules/post/image_omapsd.make b/rules/post/image_omapsd.make
new file mode 100644
index 0000000..5131b40
--- /dev/null
+++ b/rules/post/image_omapsd.make
@@ -0,0 +1,33 @@
+# -*-makefile-*-
+#
+# Copyright (C) 2012 by Bernhard Walle <walle@corscience.de>
+#
+# See CREDITS for details about who has contributed to this project.
+#
+# For further information about the PTXdist project and license conditions
+# see the README file.
+#
+
+SEL_ROOTFS-$(PTXCONF_IMAGE_OMAPSD)		+= $(IMAGEDIR)/omap_sd.img
+
+# preprend the $(IMAGEDIR) if PTXCONF_IMAGE_OMAPSD_ADDITIONAL_BOOT_FILES is not
+# empty
+ifneq ($(PTXCONF_IMAGE_OMAPSD_ADDITIONAL_BOOT_FILES),"")
+PTXCONF_IMAGE_OMAPSD_ADDITIONAL_BOOT_FILES_FULL := \
+	$(addprefix $(IMAGEDIR)/, $(PTXCONF_IMAGE_OMAPSD_ADDITIONAL_BOOT_FILES))
+endif
+
+$(IMAGEDIR)/omap_sd.img: $(IMAGEDIR)/root.ext2
+	@ln -sf $(IMAGEDIR)/linuximage $(IMAGEDIR)/uImage
+	@echo "Creating bootable SD card for OMAP";					\
+	PATH=$(PTXCONF_SYSROOT_HOST)/bin:$$PATH $(PTXDIST_TOPDIR)/scripts/genomapsdimg	\
+		 -m $(IMAGEDIR)/MLO							\
+		 -b $(IMAGEDIR)/$(PTXCONF_IMAGE_OMAPSD_BOOTLOADER)			\
+		 -k $(IMAGEDIR)/uImage							\
+		 -f $(IMAGEDIR)/root.ext2						\
+		 -a "$(PTXCONF_IMAGE_OMAPSD_ADDITIONAL_BOOT_FILES_FULL)"		\
+		 -o $@
+	@echo "done."
+	@rm -f $(IMAGEDIR)/uImage
+
+# vim: syntax=make
diff --git a/scripts/genomapsdimg b/scripts/genomapsdimg
new file mode 100755
index 0000000..cd48fd5
--- /dev/null
+++ b/scripts/genomapsdimg
@@ -0,0 +1,188 @@
+#!/bin/bash
+#
+# Copyright (C) 2011 by Bernhard Walle <walle@corscience.de>
+#
+# Creates a OMAP bootable SD card.
+# The image has a PC-style partition table with two partitions:
+#
+#   1) a FAT partition with MLO, bootloader and a Linux kernel
+#   2) a ext3 partition with the root file system.
+#
+# That's a bit tricky because the OMAP needs a special partition table
+# (therefore, genpart cannot be used).
+#
+# Parts of the script have been copied from 'debian-cd' (post-boot-armel).
+
+usage() {
+cat <<-EOF
+
+Usage: `basename "$0"` OPTIONS
+
+    -h              this help
+    -m <mlo>        path to the MLO file (SPL)
+    -b <bootloader> path to the bootloader
+    -k <kernel>     path to the linux kernel
+    -a <file>       additional file that should be included in the FAT partition
+                    (e.g. a FTD or an initramfs). Multiple files can be specified
+                    using whitespace separation. Don't forget to quote.
+    -f <filesystem> the (ext3) file system image for the second partition
+    -o <output>     the output file that should be written
+
+EOF
+}
+
+error()
+{
+	echo >&2 "$@"
+	exit 1
+}
+
+file_length()
+{
+	stat -c %s "$1"
+}
+
+create_partitions()
+{
+	local boot_size="$((72 * 1024 * 1024))" # 72 MB for the partition
+	local image_size="$(file_length "${FILESYSTEM}")"
+	local img_size_blocks="$(((${boot_size} + ${image_size} + 512 - 1) / 512))"
+
+	dd if=/dev/zero of="${OUTPUT}" bs=512 count=0 seek="${img_size_blocks}" >/dev/null 2>&1
+	if [ $? -ne 0 ] ; then
+		error "Unable to create '${OUTPUT}' with 'dd'"
+	fi
+
+	local trg_size="$(file_length "${OUTPUT}")"
+	local cylinders=$(( ${trg_size}/255/63/512 ))
+
+	{
+		echo ,9,0x0C,*
+		echo ,,,-
+	} | sfdisk -D -H 255 -S 63 -C ${cylinders} "${OUTPUT}" >/dev/null 2>&1
+
+	if [ $? -ne 0 ] ; then
+		error "Unable to execute sfdisk"
+	fi
+}
+
+check_input()
+{
+	if ! [ -r "${MLO}" ] ; then
+		echo "MLO '${MLO}' does not exist."
+		usage
+		exit 1
+	fi
+
+	if ! [ -r "${BOOTLOADER}" ] ; then
+		echo "Bootloader '${BOOTLOADER}' does not exist."
+		usage
+		exit 1
+	fi
+
+	if ! [ -r "${KERNEL}" ] ; then
+		echo "Kernel '${KERNEL}' does not exist."
+		usage
+		exit 1
+	fi
+
+	if ! [ -r "${FILESYSTEM}" ] ; then
+		echo "File system image '${FILESYSTEM}' does not exist."
+		usage
+		exit 1
+	fi
+
+	if [ -z "${OUTPUT}" ] ; then
+		echo "You have to specify an output file with -o."
+		usage
+		exit 1
+	fi
+}
+
+create_filesystem()
+{
+	local vatstart=$(parted "${OUTPUT}" unit B print 2>/dev/null|grep "^ 1"|awk '{print $2}')
+	local vatsize=$(LANG=C fdisk -l "${OUTPUT}" 2>/dev/null|grep W95 |awk '{print $5}')
+
+	if ! mkdosfs -F 32 -C "${OUTPUT_FAT}" "${vatsize}" >/dev/null 2>&1 ; then
+		error "Unable to create '${OUTPUT_FAT}' via 'mkdosfs'"
+	fi
+}
+
+copy_files()
+{
+	export MTOOLS_SKIP_CHECK=1
+
+	# it's important to copy the MLO first
+	mcopy -i "${OUTPUT_FAT}" "${MLO}" ::MLO
+	mcopy -i "${OUTPUT_FAT}" "${BOOTLOADER}" "::$(basename "${BOOTLOADER}")"
+	mcopy -i "${OUTPUT_FAT}" "${KERNEL}" "::$(basename "${KERNEL}")"
+
+	# copy additional files (like FTD or an initramfs)
+	if [ -n "$ADDITIONAL_FILES" ] ; then
+		for file in ${ADDITIONAL_FILES} ; do
+			local targetname=$(basename "${file}")
+			if ! mcopy -i "${OUTPUT_FAT}" "${file}" "::${targetname}" ; then
+				error "Unable to copy '${file}' to '${OUTPUT_FAT}'"
+			fi
+		done
+	fi
+}
+
+create_image()
+{
+	# now put the whole vfat into the first partition
+	local vatstart=$(parted "${OUTPUT}" unit B print 2>/dev/null | grep "^ 1" | awk '{print $2}')
+
+	dd conv=notrunc bs="${vatstart%B}" if="${OUTPUT_FAT}" of="${OUTPUT}" seek=1 >/dev/null 2>&1
+	if [ $? -ne 0 ] ; then
+		error "Unable to append '${OUTPUT_FAT}' to '${OUTPUT}'"
+	fi
+	rm "${OUTPUT_FAT}"
+
+	# put ext3 content into the second partition
+	local ext3start=$(parted "${OUTPUT}" unit B print 2>/dev/null | grep "^ 2" | awk '{print $2}')
+	dd conv=notrunc bs="${ext3start%B}" if="${FILESYSTEM}" of="${OUTPUT}" seek=1 >/dev/null 2>&1
+	if [ $? -ne 0 ] ; then
+		error "Unable to append '${FILESYSTEM}' to '${OUTPUT}'"
+	fi
+}
+
+
+# command line parsing
+
+while getopts hm:b:k:a:f:o: name ; do
+	case $name in
+		m)  MLO="${OPTARG}"
+			;;
+		b)  BOOTLOADER="${OPTARG}"
+			;;
+		k)  KERNEL="${OPTARG}"
+			;;
+		a)  ADDITIONAL_FILES="${OPTARG}"
+			;;
+		f)  FILESYSTEM="${OPTARG}"
+			;;
+		o)  OUTPUT="${OPTARG}"
+			;;
+		h)  usage
+			exit 0
+			;;
+		*)  usage
+			exit 1
+			;;
+	esac
+done
+
+OUTPUT_FAT="${OUTPUT}.vfat"
+[ -r "${OUTPUT_FAT}" ] && rm "${OUTPUT_FAT}"
+
+check_input
+create_partitions
+create_filesystem
+copy_files
+create_image
+
+echo "${OUTPUT} ready"
+
+# vim: set sw=4 ts=4 noet:
-- 
1.7.10


-- 
ptxdist mailing list
ptxdist@pengutronix.de

  reply	other threads:[~2012-04-25 14:18 UTC|newest]

Thread overview: 3+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2012-04-25 14:18 [ptxdist] [PATCH 1/3] Add host-parted Bernhard Walle
2012-04-25 14:18 ` Bernhard Walle [this message]
2012-04-25 14:18 ` [ptxdist] [PATCH 3/3 v2] fontconfig: Fix Darwin build Bernhard Walle

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=1335363483-19730-2-git-send-email-bernhard@bwalle.de \
    --to=bernhard@bwalle.de \
    --cc=ptxdist@pengutronix.de \
    --cc=walle@corscience.de \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox