From mboxrd@z Thu Jan 1 00:00:00 1970 Return-path: Received: from smtprelay04.ispgateway.de ([80.67.31.32]) by metis.ext.pengutronix.de with esmtp (Exim 4.72) (envelope-from ) id 1SN32q-0004eT-R8 for ptxdist@pengutronix.de; Wed, 25 Apr 2012 16:18:15 +0200 From: Bernhard Walle Date: Wed, 25 Apr 2012 16:18:02 +0200 Message-Id: <1335363483-19730-2-git-send-email-bernhard@bwalle.de> In-Reply-To: <1335363483-19730-1-git-send-email-bernhard@bwalle.de> References: <1335363483-19730-1-git-send-email-bernhard@bwalle.de> Subject: [ptxdist] [PATCH 2/3] Allow creation of bootable SD card for OMAP CPUs Reply-To: ptxdist@pengutronix.de List-Id: PTXdist Development Mailing List List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , MIME-Version: 1.0 Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit Sender: ptxdist-bounces@pengutronix.de Errors-To: ptxdist-bounces@pengutronix.de To: ptxdist@pengutronix.de Cc: Bernhard Walle 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 --- 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 +# +# 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 +# +# 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 path to the MLO file (SPL) + -b path to the bootloader + -k path to the linux kernel + -a 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 the (ext3) file system image for the second partition + -o 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