diff options
author | Max Krummenacher <max.krummenacher@toradex.com> | 2015-03-28 14:22:53 +0100 |
---|---|---|
committer | Max Krummenacher <max.krummenacher@toradex.com> | 2015-05-12 10:04:35 +0200 |
commit | c06f362ce5b4c15d65bd81e19bff776ea5181ae4 (patch) | |
tree | 0a4e1201abc799818f5baa35b1eb8ab376eda443 /recipes | |
parent | 495ad28eadc1733c58fb644586f8f9ce60e4a6ce (diff) |
trdx-image-fstype: pull out common files
Pull out common files of the module specific trees into the common library
directory and symlink the files.
Diffstat (limited to 'recipes')
26 files changed, 878 insertions, 2265 deletions
diff --git a/recipes/images/files/apalis-imx6/apalis-imx6_bin/mk-u-boot-scripts.sh b/recipes/images/files/apalis-imx6/apalis-imx6_bin/mk-u-boot-scripts.sh index 2a4e898..ce71dbd 100755..120000 --- a/recipes/images/files/apalis-imx6/apalis-imx6_bin/mk-u-boot-scripts.sh +++ b/recipes/images/files/apalis-imx6/apalis-imx6_bin/mk-u-boot-scripts.sh @@ -1,5 +1 @@ -#!/bin/sh -for f in *.scr -do - mkimage -T script -C none -n 'Flash Apalis iMX6' -d $f `basename $f .scr`.img -done +../../library/mk-u-boot-scripts.sh
\ No newline at end of file diff --git a/recipes/images/files/apalis-imx6/create_configblock.sh b/recipes/images/files/apalis-imx6/create_configblock.sh new file mode 120000 index 0000000..c8bdac7 --- /dev/null +++ b/recipes/images/files/apalis-imx6/create_configblock.sh @@ -0,0 +1 @@ +../library/create_configblock.sh
\ No newline at end of file diff --git a/recipes/images/files/apalis-imx6/imx_flash/genext3fs.sh b/recipes/images/files/apalis-imx6/imx_flash/genext3fs.sh index 3c8ecc8..cc716db 100755..120000 --- a/recipes/images/files/apalis-imx6/imx_flash/genext3fs.sh +++ b/recipes/images/files/apalis-imx6/imx_flash/genext3fs.sh @@ -1,80 +1 @@ -#!/bin/sh -#creates a file containing a ext3 binary blob of the content of the ../rootfs folder - -# sometimes we need the binary echo, not the shell builtin -ECHO=`which echo` - -MOUNTPOINT="mnt/trdx-rootfs" - -Usage() -{ - echo "creates a file containing a ext3 binary blob. Output file name taken from command line" - echo "Usage: genext3fs.sh [OPTION]... dest_file_name" - echo "-h : Prints this message" - echo "-b : Sets the partition size in MBytes, default 256" - echo "-d : Selects the directory which contains the partition content, default ../rootfs" - echo "" -} - -PARTITIONSIZE=256 -SRCPATH=../rootfs - -while getopts "b:d:h" Option ; do - case $Option in - h) Usage - # Exit if only usage (-h) was specfied. - if [[ "$#" -eq "1" ]] ; then - exit 10 - fi - exit 0 - ;; - b) PARTITIONSIZE=$OPTARG - ;; - d) SRCPATH=$OPTARG - ;; - esac -done -#adjust the commandline arg for the now used options -shift $(($OPTIND - 1)) - -#create the file used for the loopbackdevice and format it for ext3 -#answer y to "is not a block special device" -dd if=/dev/zero of=$@ bs=1024k count=$PARTITIONSIZE -mkfs.ext3 -F -L arm $@ -#disable fsck checks based on mount count or time interval -tune2fs -c 0 -i 0 $@ - -#prepare mountpoint for the loopdevice -sudo mkdir -p $MOUNTPOINT -sudo umount $MOUNTPOINT &> /dev/null -sudo rm -rf $MOUNTPOINT/* -#mount the file as a loopdevice -#there seems to be a race between mkfs.ext3 not yet finished and mount already trying to mount, so try until it works -MOUNTED=0 -while [ "$MOUNTED" -eq "0" ] ; do - sync - sleep 1 - sudo mount $@ $MOUNTPOINT/ -o loop -t ext3 - MOUNTED=`mount | grep -c "$MOUNTPOINT"` -done -#extract rootfs into the file -sudo cp -rpP $SRCPATH/* $MOUNTPOINT -if [ "$?" -ne "0" ] ; then - $ECHO -e "\033[1mCopying the rootfs failed.\033[0m" - echo "Check for error messages from cp" - sudo rm $@ - exit 1 -fi - -#unmount again -sudo umount $MOUNTPOINT - -#if the mounting was unsuccesful all rootfs data now still is in MOUNTPOINT, and $@ contains an empty fs -#delete $@ in that case to fail early -sync -FAILED=`ls $MOUNTPOINT | wc -l` -if [ "$FAILED" -ne "0" ] ; then - $ECHO -e "\033[1mMounting the loopdevice $@ failed.\033[0m" - sudo rm $@ - exit 1 -fi +../../library/genext3fs.sh
\ No newline at end of file diff --git a/recipes/images/files/apalis-imx6/update.sh b/recipes/images/files/apalis-imx6/update.sh index 6f91728..fc60d21 100755..120000 --- a/recipes/images/files/apalis-imx6/update.sh +++ b/recipes/images/files/apalis-imx6/update.sh @@ -1,259 +1 @@ -#!/bin/sh -# Prepare files needed for flashing a Apalis/Colibri iMX6 module -# -# inspired by meta-fsl-arm/classes/image_types_fsl.bbclass - -# sometimes we need the binary echo, not the shell builtin -ECHO=`which echo` -#some distros have fs tools only in root's path -PARTED=`which parted` 2> /dev/null -if [ -e "$PARTED" ] ; then - MKFSVFAT=`which mkfs.vfat` -else - PARTED=`sudo which parted` - MKFSVFAT=`sudo which mkfs.vfat` -fi - -Flash() -{ - echo "" - echo "To flash the Apalis/Colibri iMX6 module, boot the module to the U-Boot prompt and" - echo "" - echo "when using a SD-card, insert the SD-card and enter:" - echo "run setupdate" - echo "" - echo "when using tftp, connect Ethernet and enter:" - echo "tftp \$loadaddr flash_eth.img ; source \$loadaddr" - echo "" - echo "then enter to update all:" - echo "run update" - echo "" - echo "to update a single component enter one of:" - echo "run update_uboot" - echo "run update_kernel" - echo "" - echo "" - echo "If you don't have a working U-Boot anymore, connect your PC to the module's" - echo "USB client port, bring the module in the serial download mode and start" - echo "the update.sh script with the -d option. This will copy U-Boot into the" - echo "modules RAM and execute it." -} - -Usage() -{ - echo "" - echo "Prepares and copies files for flashing the internal eMMC of a Apalis/Colibri iMX6" - echo "" - echo "Will require a running U-Boot on the target. Either one already flashed" - echo "on the eMMC or one copied over usb into the module's RAM" - echo "" - echo "-d : use USB connection to copy and execute U-Boot to the module's RAM" - echo "-h : Prints this message" - echo "-o directory : output directory, defaults to /media/KERNEL" - echo " if this is on a SD card, it should be the" - echo " first partition formated with VFAT" - echo "" - echo "Example \"./update.sh\" copies the requiered files to /media/KERNEL/" - echo "Example \"./update.sh -o /srv/tftp/\" copies the requiered files to /srv/tftp/" - echo "" - echo "" - Flash -} - -#initialise options -UBOOT_RECOVERY=0 -OUT_DIR="/media/KERNEL" -MIN_PARTITION_FREE_SIZE=100 -ROOTFSPATH=rootfs -# No devicetree by default -KERNEL_DEVICETREE="" -KERNEL_IMAGETYPE="uImage" - -while getopts "dho:" Option ; do - case $Option in - d) UBOOT_RECOVERY=1 - ;; - h) Usage - # Exit if only usage (-h) was specfied. - if [ "$#" -eq 1 ] ; then - exit 10 - fi - exit 0 - ;; - o) OUT_DIR=$OPTARG - ;; - esac -done - -# autotect MODTYPE from from rootfs directory -CNT=`grep -ic "Colibri.iMX6" rootfs/etc/issue || true` -if [ "$CNT" -ge 1 ] ; then - echo "Colibri iMX6 rootfs detected" - MODTYPE=colibri-imx6 - IMAGEFILE=root.ext3 - U_BOOT_BINARY=u-boot.imx - KERNEL_DEVICETREE="imx6dl-colibri-eval-v3.dtb" - LOCPATH="imx_flash" - # eMMC size [in sectors of 512] - EMMC_SIZE=$(expr 1024 \* 3500 \* 2) -else - CNT=`grep -ic "imx6" rootfs/etc/issue || true` - if [ "$CNT" -ge 1 ] ; then - echo "Apalis iMX6 rootfs detected" - MODTYPE=apalis-imx6 - IMAGEFILE=root.ext3 - U_BOOT_BINARY=u-boot.imx - KERNEL_DEVICETREE="imx6q-apalis-eval.dtb imx6q-apalis-eval_v1_0.dtb" - LOCPATH="imx_flash" - # eMMC size [in sectors of 512] - EMMC_SIZE=$(expr 1024 \* 3500 \* 2) - else - echo "can not detect module type from ./rootfs/etc/issue" - echo "exiting" - exit 1 - fi -fi -BINARIES=${MODTYPE}_bin - -#is only U-Boot to be copied to RAM? -if [ "$UBOOT_RECOVERY" -ge 1 ] ; then - cd ${LOCPATH} - sudo ./imx_usb ../${BINARIES}/${U_BOOT_BINARY} - exit 1 -fi - -# is OUT_DIR an existing directory? -if [ ! -d "$OUT_DIR" ] ; then - echo "$OUT_DIR" "does not exist, exiting" - exit 1 -fi - -#sanity check for correct untared rootfs -DEV_OWNER=`ls -ld rootfs/dev | awk '{print $3}'` -if [ "${DEV_OWNER}x" != "rootx" ] -then - $ECHO -e "rootfs/dev is not owned by root, but it should!" - $ECHO -e "\033[1mPlease unpack the tarball with root rights.\033[0m" - $ECHO -e "e.g. sudo tar xjvf Apalis_iMX6_LinuxImageV2.1_20140201.tar.bz2" - exit 1 -fi - -#sanity check for existens of U-Boot and kernel -[ -e ${BINARIES}/${U_BOOT_BINARY} ] || { echo "${BINARIES}/${U_BOOT_BINARY} does not exist"; exit 1; } -[ -e ${BINARIES}/uImage ] || { echo "${BINARIES}/uImage does not exist"; exit 1; } - -#sanity check for some programs -MCOPY=`sudo which mcopy` -[ "${MCOPY}x" != "x" ] || { echo >&2 "Program mcopy not available. Aborting."; exit 1; } -sudo ${PARTED} -v >/dev/null 2>&1 || { echo >&2 "Program parted not available. Aborting."; exit 1; } -[ "${MKFSVFAT}x" != "x" ] || { echo >&2 "Program mkfs.vfat not available. Aborting."; exit 1; } -MKFSEXT3=`sudo which mkfs.ext3` -[ "${MKFSEXT3}x" != "x" ] || { echo >&2 "Program mkfs.ext3 not available. Aborting."; exit 1; } -awk -V >/dev/null 2>&1 || { echo >&2 "Program awk not available. Aborting."; exit 1; } -dd --help >/dev/null 2>&1 || { echo >&2 "Program dd not available. Aborting."; exit 1; } - -#make the directory with the outputfiles writable -sudo chown $USER: ${BINARIES} - -#make a file with the used versions for U-Boot, kernel and rootfs -rm ${BINARIES}/versions.txt -touch ${BINARIES}/versions.txt -echo "Component Versions" > ${BINARIES}/versions.txt -basename "`readlink -e ${BINARIES}/${U_BOOT_BINARY}`" >> ${BINARIES}/versions.txt -basename "`readlink -e ${BINARIES}/uImage`" >> ${BINARIES}/versions.txt -$ECHO -n "Rootfs " >> ${BINARIES}/versions.txt -grep -i imx6 rootfs/etc/issue >> ${BINARIES}/versions.txt - - -# The emmc layout used is: -# -# user area aka general purpose eMMC region: -# -# 0 -> IMAGE_ROOTFS_ALIGNMENT - reserved to bootloader (not partitioned) -# IMAGE_ROOTFS_ALIGNMENT -> BOOT_SPACE - kernel and other data -# BOOT_SPACE -> SDIMG_SIZE - rootfs -# -# Default Free space = 1.3x -# Use IMAGE_OVERHEAD_FACTOR to add more space -# <---------> -# 4MiB 16MiB SDIMG_ROOTFS 4MiB -# <-----------------------> <----------> <----------------------> <------------------------------> -# ------------------------ ------------ ------------------------ ------------------------------- -# | IMAGE_ROOTFS_ALIGNMENT | BOOT_SPACE | ROOTFS_SIZE | IMAGE_ROOTFS_ALIGNMENT | -# ------------------------ ------------ ------------------------ ------------------------------- -# ^ ^ ^ ^ ^ -# | | | | | -# 0 4096 4MiB + 16MiB 4MiB + 16Mib + SDIMG_ROOTFS 4MiB + 16MiB + SDIMG_ROOTFS + 4MiB -# -# with U-Boot at 1024, the U-Boot environment at 512 * 1024, the config block is at 640 * 1024 - - -# Boot partition [in sectors of 512] -BOOT_START=$(expr 4096 \* 2) -# Rootfs partition [in sectors of 512] -ROOTFS_START=$(expr 20480 \* 2) -# Boot partition volume id -BOOTDD_VOLUME_ID="Boot" - -#make the partition size size(rootfs used + MIN_PARTITION_FREE_SIZE) -#add about 4% to the rootfs to account for fs overhead. (/1024/985 instead of /1024/1024). -#add 512 bytes per file to account for small files -NUMBER_OF_FILES=`sudo find ${ROOTFSPATH} | wc -l` -EXT_SIZE=`sudo du -DsB1 ${ROOTFSPATH} | awk -v min=$MIN_PARTITION_FREE_SIZE -v f=${NUMBER_OF_FILES} \ - '{rootfs_size=$1+f*512;rootfs_size=int(rootfs_size/1024/985); print (rootfs_size+min) }'` - -echo "" -echo "Creating MBR file and do the partitioning" -# Initialize a sparse file -dd if=/dev/zero of=${BINARIES}/mbr.bin bs=512 count=0 seek=${EMMC_SIZE} -${PARTED} -s ${BINARIES}/mbr.bin mklabel msdos -${PARTED} -a none -s ${BINARIES}/mbr.bin unit s mkpart primary fat32 ${BOOT_START} $(expr ${ROOTFS_START} - 1 ) -# the partition spans to the end of the disk, even though the fs size will be smaller -# on the target the fs is then grown to the full size -${PARTED} -a none -s ${BINARIES}/mbr.bin unit s mkpart primary ext2 ${ROOTFS_START} $(expr ${EMMC_SIZE} \- ${ROOTFS_START} \- 1) -${PARTED} -s ${BINARIES}/mbr.bin unit s print -# get the size of the VFAT partition -BOOT_BLOCKS=$(LC_ALL=C ${PARTED} -s ${BINARIES}/mbr.bin unit b print \ - | awk '/ 1 / { print int(substr($4, 1, length($4 -1)) / 1024) }') -# now crop the file to only the MBR size -IMG_SIZE=512 -truncate -s $IMG_SIZE ${BINARIES}/mbr.bin - - -echo "" -echo "Creating VFAT partion image with the kernel" -rm -f ${BINARIES}/boot.vfat -${MKFSVFAT} -n "${BOOTDD_VOLUME_ID}" -S 512 -C ${BINARIES}/boot.vfat $BOOT_BLOCKS -export MTOOLS_SKIP_CHECK=1 -mcopy -i ${BINARIES}/boot.vfat -s ${BINARIES}/uImage ::/uImage - -# Copy device tree file -COPIED=false -if test -n "${KERNEL_DEVICETREE}"; then - for DTS_FILE in ${KERNEL_DEVICETREE}; do - DTS_BASE_NAME=`basename ${DTS_FILE} | awk -F "." '{print $1}'` - if [ -e "${BINARIES}/${KERNEL_IMAGETYPE}-${DTS_BASE_NAME}.dtb" ]; then - kernel_bin="`readlink ${BINARIES}/${KERNEL_IMAGETYPE}`" - kernel_bin_for_dtb="`readlink ${BINARIES}/${KERNEL_IMAGETYPE}-${DTS_BASE_NAME}.dtb | sed "s,$DTS_BASE_NAME,${MODTYPE},g;s,\.dtb$,.bin,g"`" - if [ "$kernel_bin" = "$kernel_bin_for_dtb" ]; then - mcopy -i ${BINARIES}/boot.vfat -s ${BINARIES}/${DEPLOY_DIR_IMAGE}/${KERNEL_IMAGETYPE}-${DTS_BASE_NAME}.dtb ::/${DTS_BASE_NAME}.dtb - #copy also to out_dir - sudo cp ${BINARIES}/${DEPLOY_DIR_IMAGE}/${KERNEL_IMAGETYPE}-${DTS_BASE_NAME}.dtb "$OUT_DIR/${DTS_BASE_NAME}.dtb" - COPIED=true - fi - fi - done - [ $COPIED = true ] || { echo "Did not find the devicetrees from KERNEL_DEVICETREE, ${KERNEL_DEVICETREE}. Aborting."; exit 1; } -fi - -echo "" -echo "Creating rootfs partion image" -rm -f ${BINARIES}/${IMAGEFILE} -sudo $LOCPATH/genext3fs.sh -d rootfs -b ${EXT_SIZE} ${BINARIES}/${IMAGEFILE} || exit 1 - - -#copy to $OUT_DIR -sudo cp ${BINARIES}/configblock.bin ${BINARIES}/${U_BOOT_BINARY} ${BINARIES}/uImage ${BINARIES}/mbr.bin ${BINARIES}/boot.vfat ${BINARIES}/${IMAGEFILE} ${BINARIES}/flash*.img ${BINARIES}/versions.txt "$OUT_DIR" -sync - -Flash +../library/imx6/update.sh
\ No newline at end of file diff --git a/recipes/images/files/apalis-t30/apalis-t30_bin/mk-u-boot-scripts.sh b/recipes/images/files/apalis-t30/apalis-t30_bin/mk-u-boot-scripts.sh index 2a4e898..ce71dbd 100755..120000 --- a/recipes/images/files/apalis-t30/apalis-t30_bin/mk-u-boot-scripts.sh +++ b/recipes/images/files/apalis-t30/apalis-t30_bin/mk-u-boot-scripts.sh @@ -1,5 +1 @@ -#!/bin/sh -for f in *.scr -do - mkimage -T script -C none -n 'Flash Apalis iMX6' -d $f `basename $f .scr`.img -done +../../library/mk-u-boot-scripts.sh
\ No newline at end of file diff --git a/recipes/images/files/apalis-t30/create_configblock.sh b/recipes/images/files/apalis-t30/create_configblock.sh index a33600a..c8bdac7 100755..120000 --- a/recipes/images/files/apalis-t30/create_configblock.sh +++ b/recipes/images/files/apalis-t30/create_configblock.sh @@ -1,206 +1 @@ -#! /bin/sh - -Usage() -{ - echo "create_configblock creates a configblock binary from the info on the module sticker." - echo "This can be used when the configblock got lost during a failed update attempt." - echo "The created configblock can then be written to the module with:" - echo "update.sh -c" - echo "" -} - -while getopts "h" Option ; do - case $Option in - h) Usage - # Exit if only usage (-h) was specfied. - if [ "$#" -eq 1 ] ; then - exit 10 - fi - exit 0 - ;; - esac -done - -# autotect MODTYPE from from rootfs directory -CNT=`grep -c "T20" rootfs/etc/issue || true` -if [ ${CNT} -ge 1 ] ; then - echo "Colibri T20 rootfs detected" - MODTYPE=colibri-t20 - BOOT_DEVICE=nand -else - CNT=`grep -c "T30" rootfs/etc/issue || true` - if [ ${CNT} -ge 1 ] ; then - CNT=`grep -c "Apalis" rootfs/etc/issue || true` - if [ ${CNT} -ge 1 ] ; then - echo "Apalis T30 rootfs detected" - MODTYPE=apalis-t30 - else - echo "Colibri T30 rootfs detected" - MODTYPE=colibri-t30 - fi - else - CNT=`grep -c "VF" rootfs/etc/issue || true` - if [ "$CNT" -ge 1 ] ; then - CNT=`grep -c "VF50" rootfs/etc/issue || true` - if [ "$CNT" -ge 1 ] ; then - echo "Colibri VF50 rootfs detected" - MODTYPE=colibri-vf50 - else - echo "Colibri VF61 rootfs detected" - MODTYPE=colibri-vf61 - fi - else - CNT=`grep -c "Colibri_iMX6" rootfs/etc/issue || true` - if [ "$CNT" -ge 1 ] ; then - echo "Colibri iMX6 rootfs detected" - MODTYPE=colibri-imx6 - else - CNT=`grep -ic "imx6" rootfs/etc/issue || true` - if [ "$CNT" -ge 1 ] ; then - echo "Apalis iMX6 rootfs detected" - MODTYPE=apalis-imx6 - else - echo "can not detect modulue type from ./rootfs/etc/issue" - echo "exiting" - exit 1 - fi - fi - fi - fi -fi - -echo "Enter the modules serial number on the modules sticker or" -echo "use a barcode scanner to enter the content of the stickers barcode" - -# read a barcode and test it to be 8 or 16 numbers only 0025100102489109 0115100000000024 -# 1234567890123456 1234567890123456 -until [ "${BARCODE}x" != "x" ] -do - read BARCODE - #remove all whitespace - BARCODE=`echo $BARCODE | tr -d ' '` - #get strlen and the number of numeric characters - STRLEN=`echo $BARCODE | wc -c` - NUMCNT=`echo $BARCODE | sed 's/[^0-9]//g' | wc -c` - if [ $STRLEN -ne 17 ] ; then - if [ $STRLEN -ne 9 ] ; then - echo "The serial number must be 8 numbers long (the barcode 16)" - BARCODE="" - fi - fi - if [ $NUMCNT -ne $STRLEN ] ; then - echo "The serial number must contain all numeric characters" - BARCODE="" - fi -done -DATECODE=19700101000000 -if [ $STRLEN -eq 17 ] ; then - SERIALNR=`echo $BARCODE | awk 'BEGIN{ FIELDWIDTHS = "8 8"} {print $2}'` - PRODUCTNR=`echo $BARCODE | awk 'BEGIN{ FIELDWIDTHS = "8 8"} {print $1}'` -else - SERIALNR=$BARCODE - CONFIGBLOCK_FILE=${MODTYPE}_bin/configblock.bin - case ${MODTYPE} in - "colibri-t20") - RAM_SIZE=256 - echo "Enter the RAM size ( 256 / 512 ):" - read RAM_SIZE - echo "Enter I for IT version, nothing otherwise" - read IT - if [ $RAM_SIZE -eq 512 ] ; then - if [ "$IT"x = "I" ] ; then - PROD_ID="0022" - else - PROD_ID="0021" - fi - CONFIGBLOCK_FILE=${MODTYPE}_bin/configblock_512.bin - - else - if [ "$IT"x = "I" ] ; then - PROD_ID="0024" - else - PROD_ID="0020" - fi - PROD_ID="0020" - CONFIGBLOCK_FILE=${MODTYPE}_bin/configblock_256.bin - fi - ;; - "colibri-t30") - PROD_ID="0023" - ;; - "apalis-t30") - PROD_ID="0025" - ;; - "colibri-vf50") - PROD_ID="0010" - ;; - "colibir-vf61") - PROD_ID="0011" - ;; - "apalis-imx6") - PROD_ID="0027" - ;; - "colibri-imx6") - RAM_SIZE=256 - echo "Enter the RAM size ( 256 / 512 ):" - read RAM_SIZE - echo "Enter I for IT version, nothing otherwise" - read IT - if [ $RAM_SIZE -eq 512 ] ; then - if [ "$IT"x = "I" ] ; then - PROD_ID="0017" - else - PROD_ID="0015" - fi - CONFIGBLOCK_FILE=${MODTYPE}_bin/configblock.bin - - else - if [ "$IT"x = "I" ] ; then - PROD_ID="0016" - else - PROD_ID="0014" - fi - CONFIGBLOCK_FILE=${MODTYPE}_bin/configblock.bin - fi - ;; - esac - - echo "Enter the module version, e.g. V1.2 C" - read PRODVERSION - VER_MAJ=`echo $PRODVERSION | awk 'BEGIN{ FIELDWIDTHS = "1 1 1 1 1 1"} {print $2}'` - VER_MIN=`echo $PRODVERSION | awk 'BEGIN{ FIELDWIDTHS = "1 1 1 1 1 1"} {print $4}'` - #VARIANT: A=0, B=1 ... - VARIANT=`echo $PRODVERSION | awk 'BEGIN{ FIELDWIDTHS = "1 1 1 1 1 1"} {print $6}'` - VARIANT=`printf "%d\n" "'$VARIANT"` - VARIANT=`expr $VARIANT - 65` - if [ "$VARIANT" -lt 10 ] ; then - VARIANT=0$VARIANT - fi - PRODUCTNR=${PROD_ID}${VER_MAJ}${VER_MIN}${VARIANT} -fi - -#write the config block file -if [ "${MODTYPE}" = "colibri-t20" ] ; then - PROD_ID=`echo $PRODUCTNR | awk 'BEGIN{ FIELDWIDTHS = "4 4"} {print $1}'` - CONFIGBLOCK_FILE=${MODTYPE}_bin/configblock_256.bin - if [ ${PROD_ID} = "0021" ] ; then - CONFIGBLOCK_FILE=${MODTYPE}_bin/configblock_512.bin - fi - if [ ${PROD_ID} = "0022" ] ; then - CONFIGBLOCK_FILE=${MODTYPE}_bin/configblock_512.bin - fi -else - CONFIGBLOCK_FILE=${MODTYPE}_bin/configblock.bin -fi -sudo chown ${USER}: ${MODTYPE}_bin -sudo rm -f $CONFIGBLOCK_FILE -#file header -awk 'function sc(c) {return (c<128?c:(c-256))} BEGIN{printf "%c%c%c%c",0,64,1,-49}' > $CONFIGBLOCK_FILE -#mac addr / serial -echo $SERIALNR | awk 'function sc(c) {return (c<128?c:(c-256))} {printf "%c%c%c%c%c%c%c%c%c%c%c%c",2,64,0,0, 0,20,45, sc(int($0/256/256)), sc(int($0/256)%256), sc($0%256),0,0 }' >> $CONFIGBLOCK_FILE -#product describtion, $1 char 0/1: ??, $2 char 2/3: ProdID, $3 char 4:VerMaj, $4 char 5:VerMin, $5 char 6/7:Variant -echo $PRODUCTNR | awk 'BEGIN{ FIELDWIDTHS = "2 2 1 1 2"} function sc(c) {return (c<128?c:(c-256))} {printf "%c%c%c%c%c%c%c%c%c%c%c%c",2,64,8,0 ,sc($3),0, sc($4),0, sc($5),0, sc($2),0 }' >> $CONFIGBLOCK_FILE -#fill to 32 bytes -awk 'function sc(c) {return (c<128?c:(c-256))} BEGIN{printf "%c%c%c%c",-1,-1,-1,-1}' >> $CONFIGBLOCK_FILE - -exit 0 +../library/create_configblock.sh
\ No newline at end of file diff --git a/recipes/images/files/apalis-t30/tegra-uboot-flasher/genext3fs.sh b/recipes/images/files/apalis-t30/tegra-uboot-flasher/genext3fs.sh index 3c8ecc8..cc716db 100755..120000 --- a/recipes/images/files/apalis-t30/tegra-uboot-flasher/genext3fs.sh +++ b/recipes/images/files/apalis-t30/tegra-uboot-flasher/genext3fs.sh @@ -1,80 +1 @@ -#!/bin/sh -#creates a file containing a ext3 binary blob of the content of the ../rootfs folder - -# sometimes we need the binary echo, not the shell builtin -ECHO=`which echo` - -MOUNTPOINT="mnt/trdx-rootfs" - -Usage() -{ - echo "creates a file containing a ext3 binary blob. Output file name taken from command line" - echo "Usage: genext3fs.sh [OPTION]... dest_file_name" - echo "-h : Prints this message" - echo "-b : Sets the partition size in MBytes, default 256" - echo "-d : Selects the directory which contains the partition content, default ../rootfs" - echo "" -} - -PARTITIONSIZE=256 -SRCPATH=../rootfs - -while getopts "b:d:h" Option ; do - case $Option in - h) Usage - # Exit if only usage (-h) was specfied. - if [[ "$#" -eq "1" ]] ; then - exit 10 - fi - exit 0 - ;; - b) PARTITIONSIZE=$OPTARG - ;; - d) SRCPATH=$OPTARG - ;; - esac -done -#adjust the commandline arg for the now used options -shift $(($OPTIND - 1)) - -#create the file used for the loopbackdevice and format it for ext3 -#answer y to "is not a block special device" -dd if=/dev/zero of=$@ bs=1024k count=$PARTITIONSIZE -mkfs.ext3 -F -L arm $@ -#disable fsck checks based on mount count or time interval -tune2fs -c 0 -i 0 $@ - -#prepare mountpoint for the loopdevice -sudo mkdir -p $MOUNTPOINT -sudo umount $MOUNTPOINT &> /dev/null -sudo rm -rf $MOUNTPOINT/* -#mount the file as a loopdevice -#there seems to be a race between mkfs.ext3 not yet finished and mount already trying to mount, so try until it works -MOUNTED=0 -while [ "$MOUNTED" -eq "0" ] ; do - sync - sleep 1 - sudo mount $@ $MOUNTPOINT/ -o loop -t ext3 - MOUNTED=`mount | grep -c "$MOUNTPOINT"` -done -#extract rootfs into the file -sudo cp -rpP $SRCPATH/* $MOUNTPOINT -if [ "$?" -ne "0" ] ; then - $ECHO -e "\033[1mCopying the rootfs failed.\033[0m" - echo "Check for error messages from cp" - sudo rm $@ - exit 1 -fi - -#unmount again -sudo umount $MOUNTPOINT - -#if the mounting was unsuccesful all rootfs data now still is in MOUNTPOINT, and $@ contains an empty fs -#delete $@ in that case to fail early -sync -FAILED=`ls $MOUNTPOINT | wc -l` -if [ "$FAILED" -ne "0" ] ; then - $ECHO -e "\033[1mMounting the loopdevice $@ failed.\033[0m" - sudo rm $@ - exit 1 -fi +../../library/genext3fs.sh
\ No newline at end of file diff --git a/recipes/images/files/apalis-t30/update.sh b/recipes/images/files/apalis-t30/update.sh index 21b4ac6..fb897ec 100755..120000 --- a/recipes/images/files/apalis-t30/update.sh +++ b/recipes/images/files/apalis-t30/update.sh @@ -1,273 +1 @@ -#!/bin/sh -# Prepare files needed for flashing a Apalis/Colibri T30 module -# -# inspired by meta-fsl-arm/classes/image_types_fsl.bbclass - -# sometimes we need the binary echo, not the shell builtin -ECHO=`which echo` -#some distros have fs tools only in root's path -PARTED=`which parted` 2> /dev/null -if [ -e "$PARTED" ] ; then - MKFSVFAT=`which mkfs.vfat` -else - PARTED=`sudo which parted` - MKFSVFAT=`sudo which mkfs.vfat` -fi - -Flash() -{ - echo "" - echo "To flash the Apalis/Colibri T30 module, boot the module to the U-Boot prompt and" - echo "" - echo "when using a SD-card, insert the SD-card and enter:" - echo "run setupdate" - echo "" - echo "when using tftp, connect Ethernet and enter:" - echo "tftp \$loadaddr flash_eth.img ; source \$loadaddr" - echo "" - echo "then enter to update all:" - echo "run update" - echo "" - echo "to update a single component enter one of:" - echo "run update_uboot" - echo "run update_kernel" - echo "" - echo "" - echo "If you don't have a working U-Boot anymore, connect your PC to the module's" - echo "USB client port, bring the module in the serial download mode and start" - echo "the update.sh script with the -d option. This will copy U-Boot into the" - echo "modules RAM and execute it." -} - -Usage() -{ - echo "" - echo "Prepares and copies files for flashing the internal eMMC of a Apalis/Colibri T30" - echo "" - echo "Will require a running U-Boot on the target. Either one already flashed" - echo "on the eMMC or one copied over usb into the module's RAM" - echo "" - echo "-d : use USB connection to copy and execute U-Boot to the module's RAM" - echo "-h : Prints this message" - echo "-o directory : output directory, defaults to /media/KERNEL" - echo " if this is on a SD card, it should be the" - echo " first partition formated with VFAT" - echo "" - echo "Example \"./update.sh\" copies the requiered files to /media/KERNEL/" - echo "Example \"./update.sh -o /srv/tftp/\" copies the requiered files to /srv/tftp/" - echo "" - echo "" - Flash -} - -#initialise options -UBOOT_RECOVERY=0 -OUT_DIR="/media/KERNEL" -MIN_PARTITION_FREE_SIZE=100 -ROOTFSPATH=rootfs -# No devicetree by default -KERNEL_DEVICETREE="" -KERNEL_IMAGETYPE="uImage" - -while getopts "dho:" Option ; do - case $Option in - d) UBOOT_RECOVERY=1 - ;; - h) Usage - # Exit if only usage (-h) was specfied. - if [ "$#" -eq 1 ] ; then - exit 10 - fi - exit 0 - ;; - o) OUT_DIR=$OPTARG - ;; - esac -done - -# autotect MODTYPE from from rootfs directory -CNT=`grep -ic "t30" rootfs/etc/issue || true` -if [ "$CNT" -ge 1 ] ; then - CNT=`grep -ic "apalis" rootfs/etc/issue || true` - if [ "$CNT" -ge 1 ] ; then - echo "Apalis T30 rootfs detected" - MODTYPE=apalis-t30 - IMAGEFILE=root.ext3 - U_BOOT_BINARY=u-boot-dtb-tegra.bin - KERNEL_DEVICETREE="tegra30-apalis-eval.dtb" - LOCPATH="tegra-uboot-flasher" - # eMMC size [in sectors of 512] - EMMC_SIZE=$(expr 1024 \* 3500 \* 2) - BCT=apalis_t30_12MHz_MT41K512M8RH-125_533MHz.bct - CBOOT_IMAGE=apalis_t30.img - else - echo "Colibri T30 rootfs detected" - MODTYPE=colibri-t30 - IMAGEFILE=root.ext3 - U_BOOT_BINARY=u-boot-dtb-tegra.bin - KERNEL_DEVICETREE="tegra30-colibri-eval-v3.dtb" - LOCPATH="tegra-uboot-flasher" - EMMC_SIZE=$(expr 1024 \* 2000 \* 2) - # with new kernel, boot with 400MHz, then switch between 400 & 800 - BCT=colibri_t30_12MHz_NT5CC256M16CP-DI_400MHz.bct -# BCT=colibri_t30_12MHz_NT5CC256M16CP-DI_533MHz.bct - CBOOT_IMAGE=colibri_t30.img - fi -else - echo "can not detect module type from ./rootfs/etc/issue" - echo "exiting" - exit 1 -fi -BINARIES=${MODTYPE}_bin - -#is only U-Boot to be copied to RAM? -if [ "$UBOOT_RECOVERY" -ge 1 ] ; then - cd ${LOCPATH} - sudo ./tegrarcm --bct=../${BINARIES}/${BCT} --bootloader=../${BINARIES}/${U_BOOT_BINARY} --loadaddr=0x80108000 - exit 1 -fi - -# is OUT_DIR an existing directory? -if [ ! -d "$OUT_DIR" ] ; then - echo "$OUT_DIR" "does not exist, exiting" - exit 1 -fi - -#sanity check for correct untared rootfs -DEV_OWNER=`ls -ld rootfs/dev | awk '{print $3}'` -if [ "${DEV_OWNER}x" != "rootx" ] -then - $ECHO -e "rootfs/dev is not owned by root, but it should!" - $ECHO -e "\033[1mPlease unpack the tarball with root rights.\033[0m" - $ECHO -e "e.g. sudo tar xjvf Apalis_T30_LinuxImageV2.1_20140201.tar.bz2" - exit 1 -fi - -#sanity check for existens of U-Boot and kernel -[ -e ${BINARIES}/${U_BOOT_BINARY} ] || { echo "${BINARIES}/${U_BOOT_BINARY} does not exist"; exit 1; } -[ -e ${BINARIES}/uImage ] || { echo "${BINARIES}/uImage does not exist"; exit 1; } - -#sanity check for some programs -MCOPY=`sudo which mcopy` -[ "${MCOPY}x" != "x" ] || { echo >&2 "Program mcopy not available. Aborting."; exit 1; } -sudo ${PARTED} -v >/dev/null 2>&1 || { echo >&2 "Program parted not available. Aborting."; exit 1; } -[ "${MKFSVFAT}x" != "x" ] || { echo >&2 "Program mkfs.vfat not available. Aborting."; exit 1; } -MKFSEXT3=`sudo which mkfs.ext3` -[ "${MKFSEXT3}x" != "x" ] || { echo >&2 "Program mkfs.ext3 not available. Aborting."; exit 1; } -awk -V >/dev/null 2>&1 || { echo >&2 "Program awk not available. Aborting."; exit 1; } -dd --help >/dev/null 2>&1 || { echo >&2 "Program dd not available. Aborting."; exit 1; } -tegra-uboot-flasher/cbootimage -h >/dev/null 2>&1 -[ "$?" -lt 2 ] || { echo >&2 "Program cbootimage not available. 32bit compatibility libs? Aborting."; exit 1; } - -#make the directory with the outputfiles writable -sudo chown $USER: ${BINARIES} - -#make a file with the used versions for U-Boot, kernel and rootfs -rm ${BINARIES}/versions.txt -touch ${BINARIES}/versions.txt -echo "Component Versions" > ${BINARIES}/versions.txt -basename "`readlink -e ${BINARIES}/${U_BOOT_BINARY}`" >> ${BINARIES}/versions.txt -basename "`readlink -e ${BINARIES}/uImage`" >> ${BINARIES}/versions.txt -$ECHO -n "Rootfs " >> ${BINARIES}/versions.txt -grep -i t30 rootfs/etc/issue >> ${BINARIES}/versions.txt - - -# The emmc layout used is: -# -# boot area partition 1 aka eMMC boot sector: -# -# with cbootimage containing BCT and U-Boot boot loader -# -# user area aka general purpose eMMC region: -# -# 0 -> IMAGE_ROOTFS_ALIGNMENT - reserved to bootloader (not partitioned) -# IMAGE_ROOTFS_ALIGNMENT -> BOOT_SPACE - kernel and other data -# BOOT_SPACE -> SDIMG_SIZE - rootfs -# -# Default Free space = 1.3x -# Use IMAGE_OVERHEAD_FACTOR to add more space -# <---------> -# 4MiB 16MiB SDIMG_ROOTFS 4MiB -# <-----------------------> <----------> <----------------------> <------------------------------> -# ------------------------ ------------ ------------------------ ------------------------------- -# | IMAGE_ROOTFS_ALIGNMENT | BOOT_SPACE | ROOTFS_SIZE | IMAGE_ROOTFS_ALIGNMENT | -# ------------------------ ------------ ------------------------ ------------------------------- -# ^ ^ ^ ^ ^ -# | | | | | -# 0 4096 4MiB + 16MiB 4MiB + 16Mib + SDIMG_ROOTFS 4MiB + 16MiB + SDIMG_ROOTFS + 4MiB -# -# with the U-Boot environment at 512 * 1024, the config block is at 640 * 1024 - - -# generate cbootimage containing BCT and U-Boot boot loader -cd ${BINARIES} -sudo ../${LOCPATH}/cbootimage -s tegra30 ${CBOOT_IMAGE}.cfg ${CBOOT_IMAGE} -cd .. - - -# Boot partition [in sectors of 512] -BOOT_START=$(expr 4096 \* 2) -# Rootfs partition [in sectors of 512] -ROOTFS_START=$(expr 20480 \* 2) -# Boot partition volume id -BOOTDD_VOLUME_ID="Boot" - -#make the partition size size(rootfs used + MIN_PARTITION_FREE_SIZE) -#add about 4% to the rootfs to account for fs overhead. (/1024/985 instead of /1024/1024). -#add 512 bytes per file to account for small files -NUMBER_OF_FILES=`sudo find ${ROOTFSPATH} | wc -l` -EXT_SIZE=`sudo du -DsB1 ${ROOTFSPATH} | awk -v min=$MIN_PARTITION_FREE_SIZE -v f=${NUMBER_OF_FILES} \ - '{rootfs_size=$1+f*512;rootfs_size=int(rootfs_size/1024/985); print (rootfs_size+min) }'` - -echo "" -echo "Creating MBR file and do the partitioning" -# Initialize a sparse file -dd if=/dev/zero of=${BINARIES}/mbr.bin bs=512 count=0 seek=${EMMC_SIZE} -${PARTED} -s ${BINARIES}/mbr.bin mklabel msdos -${PARTED} -a none -s ${BINARIES}/mbr.bin unit s mkpart primary fat32 ${BOOT_START} $(expr ${ROOTFS_START} - 1 ) -# the partition spans to the end of the disk, even though the fs size will be smaller -# on the target the fs is then grown to the full size -${PARTED} -a none -s ${BINARIES}/mbr.bin unit s mkpart primary ext2 ${ROOTFS_START} $(expr ${EMMC_SIZE} \- ${ROOTFS_START} \- 1) -${PARTED} -s ${BINARIES}/mbr.bin unit s print -# get the size of the VFAT partition -BOOT_BLOCKS=$(LC_ALL=C ${PARTED} -s ${BINARIES}/mbr.bin unit b print \ - | awk '/ 1 / { print int(substr($4, 1, length($4 -1)) / 1024) }') -# now crop the file to only the MBR size -IMG_SIZE=512 -truncate -s $IMG_SIZE ${BINARIES}/mbr.bin - - -echo "" -echo "Creating VFAT partion image with the kernel" -rm -f ${BINARIES}/boot.vfat -${MKFSVFAT} -n "${BOOTDD_VOLUME_ID}" -S 512 -C ${BINARIES}/boot.vfat $BOOT_BLOCKS -export MTOOLS_SKIP_CHECK=1 -mcopy -i ${BINARIES}/boot.vfat -s ${BINARIES}/uImage ::/uImage - -# Copy device tree file -if test -n "${KERNEL_DEVICETREE}"; then - for DTS_FILE in ${KERNEL_DEVICETREE}; do - DTS_BASE_NAME=`basename ${DTS_FILE} | awk -F "." '{print $1}'` - if [ -e "${BINARIES}/${KERNEL_IMAGETYPE}-${DTS_BASE_NAME}.dtb" ]; then - kernel_bin="`readlink ${BINARIES}/${KERNEL_IMAGETYPE}`" - kernel_bin_for_dtb="`readlink ${BINARIES}/${KERNEL_IMAGETYPE}-${DTS_BASE_NAME}.dtb | sed "s,$DTS_BASE_NAME,${MODTYPE},g;s,\.dtb$,.bin,g"`" - if [ "$kernel_bin" = "$kernel_bin_for_dtb" ]; then - mcopy -i ${BINARIES}/boot.vfat -s ${BINARIES}/${DEPLOY_DIR_IMAGE}/${KERNEL_IMAGETYPE}-${DTS_BASE_NAME}.dtb ::/${DTS_BASE_NAME}.dtb - #copy also to out_dir - sudo cp ${BINARIES}/${DEPLOY_DIR_IMAGE}/${KERNEL_IMAGETYPE}-${DTS_BASE_NAME}.dtb "$OUT_DIR/${DTS_BASE_NAME}.dtb" - fi - fi - done -fi - -echo "" -echo "Creating rootfs partion image" -rm -f ${BINARIES}/${IMAGEFILE} -sudo $LOCPATH/genext3fs.sh -d rootfs -b ${EXT_SIZE} ${BINARIES}/${IMAGEFILE} || exit 1 - - -#copy to $OUT_DIR -sudo cp ${BINARIES}/configblock.bin ${BINARIES}/${CBOOT_IMAGE} ${BINARIES}/uImage ${BINARIES}/mbr.bin ${BINARIES}/boot.vfat ${BINARIES}/${IMAGEFILE} ${BINARIES}/flash*.img ${BINARIES}/versions.txt "$OUT_DIR" -sync - -Flash +../library/t30/update.sh
\ No newline at end of file diff --git a/recipes/images/files/colibri-imx6/colibri-imx6_bin/mk-u-boot-scripts.sh b/recipes/images/files/colibri-imx6/colibri-imx6_bin/mk-u-boot-scripts.sh index 2a4e898..ce71dbd 100755..120000 --- a/recipes/images/files/colibri-imx6/colibri-imx6_bin/mk-u-boot-scripts.sh +++ b/recipes/images/files/colibri-imx6/colibri-imx6_bin/mk-u-boot-scripts.sh @@ -1,5 +1 @@ -#!/bin/sh -for f in *.scr -do - mkimage -T script -C none -n 'Flash Apalis iMX6' -d $f `basename $f .scr`.img -done +../../library/mk-u-boot-scripts.sh
\ No newline at end of file diff --git a/recipes/images/files/colibri-imx6/create_configblock.sh b/recipes/images/files/colibri-imx6/create_configblock.sh new file mode 120000 index 0000000..c8bdac7 --- /dev/null +++ b/recipes/images/files/colibri-imx6/create_configblock.sh @@ -0,0 +1 @@ +../library/create_configblock.sh
\ No newline at end of file diff --git a/recipes/images/files/colibri-imx6/imx_flash/genext3fs.sh b/recipes/images/files/colibri-imx6/imx_flash/genext3fs.sh index 3c8ecc8..cc716db 100755..120000 --- a/recipes/images/files/colibri-imx6/imx_flash/genext3fs.sh +++ b/recipes/images/files/colibri-imx6/imx_flash/genext3fs.sh @@ -1,80 +1 @@ -#!/bin/sh -#creates a file containing a ext3 binary blob of the content of the ../rootfs folder - -# sometimes we need the binary echo, not the shell builtin -ECHO=`which echo` - -MOUNTPOINT="mnt/trdx-rootfs" - -Usage() -{ - echo "creates a file containing a ext3 binary blob. Output file name taken from command line" - echo "Usage: genext3fs.sh [OPTION]... dest_file_name" - echo "-h : Prints this message" - echo "-b : Sets the partition size in MBytes, default 256" - echo "-d : Selects the directory which contains the partition content, default ../rootfs" - echo "" -} - -PARTITIONSIZE=256 -SRCPATH=../rootfs - -while getopts "b:d:h" Option ; do - case $Option in - h) Usage - # Exit if only usage (-h) was specfied. - if [[ "$#" -eq "1" ]] ; then - exit 10 - fi - exit 0 - ;; - b) PARTITIONSIZE=$OPTARG - ;; - d) SRCPATH=$OPTARG - ;; - esac -done -#adjust the commandline arg for the now used options -shift $(($OPTIND - 1)) - -#create the file used for the loopbackdevice and format it for ext3 -#answer y to "is not a block special device" -dd if=/dev/zero of=$@ bs=1024k count=$PARTITIONSIZE -mkfs.ext3 -F -L arm $@ -#disable fsck checks based on mount count or time interval -tune2fs -c 0 -i 0 $@ - -#prepare mountpoint for the loopdevice -sudo mkdir -p $MOUNTPOINT -sudo umount $MOUNTPOINT &> /dev/null -sudo rm -rf $MOUNTPOINT/* -#mount the file as a loopdevice -#there seems to be a race between mkfs.ext3 not yet finished and mount already trying to mount, so try until it works -MOUNTED=0 -while [ "$MOUNTED" -eq "0" ] ; do - sync - sleep 1 - sudo mount $@ $MOUNTPOINT/ -o loop -t ext3 - MOUNTED=`mount | grep -c "$MOUNTPOINT"` -done -#extract rootfs into the file -sudo cp -rpP $SRCPATH/* $MOUNTPOINT -if [ "$?" -ne "0" ] ; then - $ECHO -e "\033[1mCopying the rootfs failed.\033[0m" - echo "Check for error messages from cp" - sudo rm $@ - exit 1 -fi - -#unmount again -sudo umount $MOUNTPOINT - -#if the mounting was unsuccesful all rootfs data now still is in MOUNTPOINT, and $@ contains an empty fs -#delete $@ in that case to fail early -sync -FAILED=`ls $MOUNTPOINT | wc -l` -if [ "$FAILED" -ne "0" ] ; then - $ECHO -e "\033[1mMounting the loopdevice $@ failed.\033[0m" - sudo rm $@ - exit 1 -fi +../../library/genext3fs.sh
\ No newline at end of file diff --git a/recipes/images/files/colibri-imx6/update.sh b/recipes/images/files/colibri-imx6/update.sh index 6f91728..fc60d21 100755..120000 --- a/recipes/images/files/colibri-imx6/update.sh +++ b/recipes/images/files/colibri-imx6/update.sh @@ -1,259 +1 @@ -#!/bin/sh -# Prepare files needed for flashing a Apalis/Colibri iMX6 module -# -# inspired by meta-fsl-arm/classes/image_types_fsl.bbclass - -# sometimes we need the binary echo, not the shell builtin -ECHO=`which echo` -#some distros have fs tools only in root's path -PARTED=`which parted` 2> /dev/null -if [ -e "$PARTED" ] ; then - MKFSVFAT=`which mkfs.vfat` -else - PARTED=`sudo which parted` - MKFSVFAT=`sudo which mkfs.vfat` -fi - -Flash() -{ - echo "" - echo "To flash the Apalis/Colibri iMX6 module, boot the module to the U-Boot prompt and" - echo "" - echo "when using a SD-card, insert the SD-card and enter:" - echo "run setupdate" - echo "" - echo "when using tftp, connect Ethernet and enter:" - echo "tftp \$loadaddr flash_eth.img ; source \$loadaddr" - echo "" - echo "then enter to update all:" - echo "run update" - echo "" - echo "to update a single component enter one of:" - echo "run update_uboot" - echo "run update_kernel" - echo "" - echo "" - echo "If you don't have a working U-Boot anymore, connect your PC to the module's" - echo "USB client port, bring the module in the serial download mode and start" - echo "the update.sh script with the -d option. This will copy U-Boot into the" - echo "modules RAM and execute it." -} - -Usage() -{ - echo "" - echo "Prepares and copies files for flashing the internal eMMC of a Apalis/Colibri iMX6" - echo "" - echo "Will require a running U-Boot on the target. Either one already flashed" - echo "on the eMMC or one copied over usb into the module's RAM" - echo "" - echo "-d : use USB connection to copy and execute U-Boot to the module's RAM" - echo "-h : Prints this message" - echo "-o directory : output directory, defaults to /media/KERNEL" - echo " if this is on a SD card, it should be the" - echo " first partition formated with VFAT" - echo "" - echo "Example \"./update.sh\" copies the requiered files to /media/KERNEL/" - echo "Example \"./update.sh -o /srv/tftp/\" copies the requiered files to /srv/tftp/" - echo "" - echo "" - Flash -} - -#initialise options -UBOOT_RECOVERY=0 -OUT_DIR="/media/KERNEL" -MIN_PARTITION_FREE_SIZE=100 -ROOTFSPATH=rootfs -# No devicetree by default -KERNEL_DEVICETREE="" -KERNEL_IMAGETYPE="uImage" - -while getopts "dho:" Option ; do - case $Option in - d) UBOOT_RECOVERY=1 - ;; - h) Usage - # Exit if only usage (-h) was specfied. - if [ "$#" -eq 1 ] ; then - exit 10 - fi - exit 0 - ;; - o) OUT_DIR=$OPTARG - ;; - esac -done - -# autotect MODTYPE from from rootfs directory -CNT=`grep -ic "Colibri.iMX6" rootfs/etc/issue || true` -if [ "$CNT" -ge 1 ] ; then - echo "Colibri iMX6 rootfs detected" - MODTYPE=colibri-imx6 - IMAGEFILE=root.ext3 - U_BOOT_BINARY=u-boot.imx - KERNEL_DEVICETREE="imx6dl-colibri-eval-v3.dtb" - LOCPATH="imx_flash" - # eMMC size [in sectors of 512] - EMMC_SIZE=$(expr 1024 \* 3500 \* 2) -else - CNT=`grep -ic "imx6" rootfs/etc/issue || true` - if [ "$CNT" -ge 1 ] ; then - echo "Apalis iMX6 rootfs detected" - MODTYPE=apalis-imx6 - IMAGEFILE=root.ext3 - U_BOOT_BINARY=u-boot.imx - KERNEL_DEVICETREE="imx6q-apalis-eval.dtb imx6q-apalis-eval_v1_0.dtb" - LOCPATH="imx_flash" - # eMMC size [in sectors of 512] - EMMC_SIZE=$(expr 1024 \* 3500 \* 2) - else - echo "can not detect module type from ./rootfs/etc/issue" - echo "exiting" - exit 1 - fi -fi -BINARIES=${MODTYPE}_bin - -#is only U-Boot to be copied to RAM? -if [ "$UBOOT_RECOVERY" -ge 1 ] ; then - cd ${LOCPATH} - sudo ./imx_usb ../${BINARIES}/${U_BOOT_BINARY} - exit 1 -fi - -# is OUT_DIR an existing directory? -if [ ! -d "$OUT_DIR" ] ; then - echo "$OUT_DIR" "does not exist, exiting" - exit 1 -fi - -#sanity check for correct untared rootfs -DEV_OWNER=`ls -ld rootfs/dev | awk '{print $3}'` -if [ "${DEV_OWNER}x" != "rootx" ] -then - $ECHO -e "rootfs/dev is not owned by root, but it should!" - $ECHO -e "\033[1mPlease unpack the tarball with root rights.\033[0m" - $ECHO -e "e.g. sudo tar xjvf Apalis_iMX6_LinuxImageV2.1_20140201.tar.bz2" - exit 1 -fi - -#sanity check for existens of U-Boot and kernel -[ -e ${BINARIES}/${U_BOOT_BINARY} ] || { echo "${BINARIES}/${U_BOOT_BINARY} does not exist"; exit 1; } -[ -e ${BINARIES}/uImage ] || { echo "${BINARIES}/uImage does not exist"; exit 1; } - -#sanity check for some programs -MCOPY=`sudo which mcopy` -[ "${MCOPY}x" != "x" ] || { echo >&2 "Program mcopy not available. Aborting."; exit 1; } -sudo ${PARTED} -v >/dev/null 2>&1 || { echo >&2 "Program parted not available. Aborting."; exit 1; } -[ "${MKFSVFAT}x" != "x" ] || { echo >&2 "Program mkfs.vfat not available. Aborting."; exit 1; } -MKFSEXT3=`sudo which mkfs.ext3` -[ "${MKFSEXT3}x" != "x" ] || { echo >&2 "Program mkfs.ext3 not available. Aborting."; exit 1; } -awk -V >/dev/null 2>&1 || { echo >&2 "Program awk not available. Aborting."; exit 1; } -dd --help >/dev/null 2>&1 || { echo >&2 "Program dd not available. Aborting."; exit 1; } - -#make the directory with the outputfiles writable -sudo chown $USER: ${BINARIES} - -#make a file with the used versions for U-Boot, kernel and rootfs -rm ${BINARIES}/versions.txt -touch ${BINARIES}/versions.txt -echo "Component Versions" > ${BINARIES}/versions.txt -basename "`readlink -e ${BINARIES}/${U_BOOT_BINARY}`" >> ${BINARIES}/versions.txt -basename "`readlink -e ${BINARIES}/uImage`" >> ${BINARIES}/versions.txt -$ECHO -n "Rootfs " >> ${BINARIES}/versions.txt -grep -i imx6 rootfs/etc/issue >> ${BINARIES}/versions.txt - - -# The emmc layout used is: -# -# user area aka general purpose eMMC region: -# -# 0 -> IMAGE_ROOTFS_ALIGNMENT - reserved to bootloader (not partitioned) -# IMAGE_ROOTFS_ALIGNMENT -> BOOT_SPACE - kernel and other data -# BOOT_SPACE -> SDIMG_SIZE - rootfs -# -# Default Free space = 1.3x -# Use IMAGE_OVERHEAD_FACTOR to add more space -# <---------> -# 4MiB 16MiB SDIMG_ROOTFS 4MiB -# <-----------------------> <----------> <----------------------> <------------------------------> -# ------------------------ ------------ ------------------------ ------------------------------- -# | IMAGE_ROOTFS_ALIGNMENT | BOOT_SPACE | ROOTFS_SIZE | IMAGE_ROOTFS_ALIGNMENT | -# ------------------------ ------------ ------------------------ ------------------------------- -# ^ ^ ^ ^ ^ -# | | | | | -# 0 4096 4MiB + 16MiB 4MiB + 16Mib + SDIMG_ROOTFS 4MiB + 16MiB + SDIMG_ROOTFS + 4MiB -# -# with U-Boot at 1024, the U-Boot environment at 512 * 1024, the config block is at 640 * 1024 - - -# Boot partition [in sectors of 512] -BOOT_START=$(expr 4096 \* 2) -# Rootfs partition [in sectors of 512] -ROOTFS_START=$(expr 20480 \* 2) -# Boot partition volume id -BOOTDD_VOLUME_ID="Boot" - -#make the partition size size(rootfs used + MIN_PARTITION_FREE_SIZE) -#add about 4% to the rootfs to account for fs overhead. (/1024/985 instead of /1024/1024). -#add 512 bytes per file to account for small files -NUMBER_OF_FILES=`sudo find ${ROOTFSPATH} | wc -l` -EXT_SIZE=`sudo du -DsB1 ${ROOTFSPATH} | awk -v min=$MIN_PARTITION_FREE_SIZE -v f=${NUMBER_OF_FILES} \ - '{rootfs_size=$1+f*512;rootfs_size=int(rootfs_size/1024/985); print (rootfs_size+min) }'` - -echo "" -echo "Creating MBR file and do the partitioning" -# Initialize a sparse file -dd if=/dev/zero of=${BINARIES}/mbr.bin bs=512 count=0 seek=${EMMC_SIZE} -${PARTED} -s ${BINARIES}/mbr.bin mklabel msdos -${PARTED} -a none -s ${BINARIES}/mbr.bin unit s mkpart primary fat32 ${BOOT_START} $(expr ${ROOTFS_START} - 1 ) -# the partition spans to the end of the disk, even though the fs size will be smaller -# on the target the fs is then grown to the full size -${PARTED} -a none -s ${BINARIES}/mbr.bin unit s mkpart primary ext2 ${ROOTFS_START} $(expr ${EMMC_SIZE} \- ${ROOTFS_START} \- 1) -${PARTED} -s ${BINARIES}/mbr.bin unit s print -# get the size of the VFAT partition -BOOT_BLOCKS=$(LC_ALL=C ${PARTED} -s ${BINARIES}/mbr.bin unit b print \ - | awk '/ 1 / { print int(substr($4, 1, length($4 -1)) / 1024) }') -# now crop the file to only the MBR size -IMG_SIZE=512 -truncate -s $IMG_SIZE ${BINARIES}/mbr.bin - - -echo "" -echo "Creating VFAT partion image with the kernel" -rm -f ${BINARIES}/boot.vfat -${MKFSVFAT} -n "${BOOTDD_VOLUME_ID}" -S 512 -C ${BINARIES}/boot.vfat $BOOT_BLOCKS -export MTOOLS_SKIP_CHECK=1 -mcopy -i ${BINARIES}/boot.vfat -s ${BINARIES}/uImage ::/uImage - -# Copy device tree file -COPIED=false -if test -n "${KERNEL_DEVICETREE}"; then - for DTS_FILE in ${KERNEL_DEVICETREE}; do - DTS_BASE_NAME=`basename ${DTS_FILE} | awk -F "." '{print $1}'` - if [ -e "${BINARIES}/${KERNEL_IMAGETYPE}-${DTS_BASE_NAME}.dtb" ]; then - kernel_bin="`readlink ${BINARIES}/${KERNEL_IMAGETYPE}`" - kernel_bin_for_dtb="`readlink ${BINARIES}/${KERNEL_IMAGETYPE}-${DTS_BASE_NAME}.dtb | sed "s,$DTS_BASE_NAME,${MODTYPE},g;s,\.dtb$,.bin,g"`" - if [ "$kernel_bin" = "$kernel_bin_for_dtb" ]; then - mcopy -i ${BINARIES}/boot.vfat -s ${BINARIES}/${DEPLOY_DIR_IMAGE}/${KERNEL_IMAGETYPE}-${DTS_BASE_NAME}.dtb ::/${DTS_BASE_NAME}.dtb - #copy also to out_dir - sudo cp ${BINARIES}/${DEPLOY_DIR_IMAGE}/${KERNEL_IMAGETYPE}-${DTS_BASE_NAME}.dtb "$OUT_DIR/${DTS_BASE_NAME}.dtb" - COPIED=true - fi - fi - done - [ $COPIED = true ] || { echo "Did not find the devicetrees from KERNEL_DEVICETREE, ${KERNEL_DEVICETREE}. Aborting."; exit 1; } -fi - -echo "" -echo "Creating rootfs partion image" -rm -f ${BINARIES}/${IMAGEFILE} -sudo $LOCPATH/genext3fs.sh -d rootfs -b ${EXT_SIZE} ${BINARIES}/${IMAGEFILE} || exit 1 - - -#copy to $OUT_DIR -sudo cp ${BINARIES}/configblock.bin ${BINARIES}/${U_BOOT_BINARY} ${BINARIES}/uImage ${BINARIES}/mbr.bin ${BINARIES}/boot.vfat ${BINARIES}/${IMAGEFILE} ${BINARIES}/flash*.img ${BINARIES}/versions.txt "$OUT_DIR" -sync - -Flash +../library/imx6/update.sh
\ No newline at end of file diff --git a/recipes/images/files/colibri-t20/create_configblock.sh b/recipes/images/files/colibri-t20/create_configblock.sh index bf0bc62..c8bdac7 100755..120000 --- a/recipes/images/files/colibri-t20/create_configblock.sh +++ b/recipes/images/files/colibri-t20/create_configblock.sh @@ -1,168 +1 @@ -#! /bin/sh - -Usage() -{ - echo "create_configblock creates a configblock binary from the info on the module sticker." - echo "This can be used when the configblock got lost during a failed update attempt." - echo "The created configblock can then be written to the module with:" - echo "update.sh -c" - echo "" -} - -while getopts "h" Option ; do - case $Option in - h) Usage - # Exit if only usage (-h) was specfied. - if [[ $# -eq 1 ]] ; then - exit 10 - fi - exit 0 - ;; - esac -done - -# autotect MODTYPE from from rootfs directory -CNT=`grep -c "T20" rootfs/etc/issue || true` -if [ ${CNT} -ge 1 ] ; then - echo "Colibri T20 rootfs detected" - MODTYPE=colibri-t20 - BOOT_DEVICE=nand -else - CNT=`grep -c "T30" rootfs/etc/issue || true` - if [ ${CNT} -ge 1 ] ; then - CNT=`grep -c "Apalis" rootfs/etc/issue || true` - if [ ${CNT} -ge 1 ] ; then - echo "Apalis T30 rootfs detected" - MODTYPE=apalis-t30 - else - echo "Colibri T30 rootfs detected" - MODTYPE=colibri-t30 - fi - else - CNT=`grep -c "VF" rootfs/etc/issue || true` - if [ "$CNT" -ge 1 ] ; then - CNT=`grep -c "VF50" rootfs/etc/issue || true` - if [ "$CNT" -ge 1 ] ; then - echo "Colibri VF50 rootfs detected" - MODTYPE=colibri-vf50 - else - echo "Colibri VF61 rootfs detected" - MODTYPE=colibri-vf61 - fi - else - echo "can not detect modulue type from ./rootfs/etc/issue" - echo "exiting" - exit 1 - fi - fi -fi - -echo "Enter the modules serial number on the modules sticker or" -echo "use a barcode scanner to enter the content of the stickers barcode" - -# read a barcode and test it to be 8 or 16 numbers only 0025100102489109 0115100000000024 -# 1234567890123456 1234567890123456 -until [ "${BARCODE}x" != "x" ] -do - read BARCODE - #remove all whitespace - BARCODE=`echo $BARCODE | tr -d ' '` - #get strlen and the number of numeric characters - STRLEN=`echo $BARCODE | wc -c` - NUMCNT=`echo $BARCODE | sed 's/[^0-9]//g' | wc -c` - if [ $STRLEN -ne 17 ] ; then - if [ $STRLEN -ne 9 ] ; then - echo "The serial number must be 8 numbers long (the barcode 16)" - BARCODE="" - fi - fi - if [ $NUMCNT -ne $STRLEN ] ; then - echo "The serial number must contain all numeric characters" - BARCODE="" - fi -done -DATECODE=19700101000000 -if [ $STRLEN -eq 17 ] ; then - SERIALNR=`echo $BARCODE | awk 'BEGIN{ FIELDWIDTHS = "8 8"} {print $2}'` - PRODUCTNR=`echo $BARCODE | awk 'BEGIN{ FIELDWIDTHS = "8 8"} {print $1}'` -else - SERIALNR=$BARCODE - CONFIGBLOCK_FILE=${MODTYPE}_bin/configblock.bin - case ${MODTYPE} in - "colibri-t20") - RAM_SIZE=256 - echo "Enter the RAM size ( 256 / 512 ):" - read RAM_SIZE - echo "Enter I for IT version, nothing otherwise" - read IT - if [ $RAM_SIZE -eq 512 ] ; then - if [ "$IT"x = "I" ] ; then - PROD_ID="0022" - else - PROD_ID="0021" - fi - CONFIGBLOCK_FILE=${MODTYPE}_bin/configblock_512.bin - - else - if [ "$IT"x = "I" ] ; then - PROD_ID="0024" - else - PROD_ID="0020" - fi - PROD_ID="0020" - CONFIGBLOCK_FILE=${MODTYPE}_bin/configblock_256.bin - fi - ;; - "colibri-t30") - PROD_ID="0023" - ;; - "apalis-t30") - PROD_ID="0025" - ;; - "colibri-vf50") - PROD_ID="0010" - ;; - "apalis-vf61") - PROD_ID="0011" - ;; - esac - - echo "Enter the module version, e.g. V1.2 C" - read PRODVERSION - VER_MAJ=`echo $PRODVERSION | awk 'BEGIN{ FIELDWIDTHS = "1 1 1 1 1 1"} {print $2}'` - VER_MIN=`echo $PRODVERSION | awk 'BEGIN{ FIELDWIDTHS = "1 1 1 1 1 1"} {print $4}'` - #VARIANT: A=0, B=1 ... - VARIANT=`echo $PRODVERSION | awk 'BEGIN{ FIELDWIDTHS = "1 1 1 1 1 1"} {print $6}'` - VARIANT=`printf "%d\n" "'$VARIANT"` - VARIANT=`expr $VARIANT - 65` - if [ "$VARIANT" -lt 10 ] ; then - VARIANT=0$VARIANT - fi - PRODUCTNR=${PROD_ID}${VER_MAJ}${VER_MIN}${VARIANT} -fi - -#write the config block file -if [ "${MODTYPE}" = "colibri-t20" ] ; then - PROD_ID=`echo $PRODUCTNR | awk 'BEGIN{ FIELDWIDTHS = "4 4"} {print $1}'` - CONFIGBLOCK_FILE=${MODTYPE}_bin/configblock_256.bin - if [ ${PROD_ID} = "0021" ] ; then - CONFIGBLOCK_FILE=${MODTYPE}_bin/configblock_512.bin - fi - if [ ${PROD_ID} = "0022" ] ; then - CONFIGBLOCK_FILE=${MODTYPE}_bin/configblock_512.bin - fi -else - CONFIGBLOCK_FILE=${MODTYPE}_bin/configblock.bin -fi -sudo chown ${USER}: ${MODTYPE}_bin -sudo rm -f $CONFIGBLOCK_FILE -#file header -awk 'function sc(c) {return (c<128?c:(c-256))} BEGIN{printf "%c%c%c%c",0,64,1,-49}' > $CONFIGBLOCK_FILE -#mac addr / serial -echo $SERIALNR | awk 'function sc(c) {return (c<128?c:(c-256))} {printf "%c%c%c%c%c%c%c%c%c%c%c%c",2,64,0,0, 0,20,45, sc(int($0/256/256)), sc(int($0/256)%256), sc($0%256),0,0 }' >> $CONFIGBLOCK_FILE -#product describtion, $1 char 0/1: ??, $2 char 2/3: ProdID, $3 char 4:VerMaj, $4 char 5:VerMin, $5 char 6/7:Variant -echo $PRODUCTNR | awk 'BEGIN{ FIELDWIDTHS = "2 2 1 1 2"} function sc(c) {return (c<128?c:(c-256))} {printf "%c%c%c%c%c%c%c%c%c%c%c%c",2,64,8,0 ,sc($3),0, sc($4),0, sc($5),0, sc($2),0 }' >> $CONFIGBLOCK_FILE -#fill to 32 bytes -awk 'function sc(c) {return (c<128?c:(c-256))} BEGIN{printf "%c%c%c%c",-1,-1,-1,-1}' >> $CONFIGBLOCK_FILE - -exit 0 +../library/create_configblock.sh
\ No newline at end of file diff --git a/recipes/images/files/colibri-t20/t20_nvflash/genext3fs.sh b/recipes/images/files/colibri-t20/t20_nvflash/genext3fs.sh index 3c8ecc8..cc716db 100755..120000 --- a/recipes/images/files/colibri-t20/t20_nvflash/genext3fs.sh +++ b/recipes/images/files/colibri-t20/t20_nvflash/genext3fs.sh @@ -1,80 +1 @@ -#!/bin/sh -#creates a file containing a ext3 binary blob of the content of the ../rootfs folder - -# sometimes we need the binary echo, not the shell builtin -ECHO=`which echo` - -MOUNTPOINT="mnt/trdx-rootfs" - -Usage() -{ - echo "creates a file containing a ext3 binary blob. Output file name taken from command line" - echo "Usage: genext3fs.sh [OPTION]... dest_file_name" - echo "-h : Prints this message" - echo "-b : Sets the partition size in MBytes, default 256" - echo "-d : Selects the directory which contains the partition content, default ../rootfs" - echo "" -} - -PARTITIONSIZE=256 -SRCPATH=../rootfs - -while getopts "b:d:h" Option ; do - case $Option in - h) Usage - # Exit if only usage (-h) was specfied. - if [[ "$#" -eq "1" ]] ; then - exit 10 - fi - exit 0 - ;; - b) PARTITIONSIZE=$OPTARG - ;; - d) SRCPATH=$OPTARG - ;; - esac -done -#adjust the commandline arg for the now used options -shift $(($OPTIND - 1)) - -#create the file used for the loopbackdevice and format it for ext3 -#answer y to "is not a block special device" -dd if=/dev/zero of=$@ bs=1024k count=$PARTITIONSIZE -mkfs.ext3 -F -L arm $@ -#disable fsck checks based on mount count or time interval -tune2fs -c 0 -i 0 $@ - -#prepare mountpoint for the loopdevice -sudo mkdir -p $MOUNTPOINT -sudo umount $MOUNTPOINT &> /dev/null -sudo rm -rf $MOUNTPOINT/* -#mount the file as a loopdevice -#there seems to be a race between mkfs.ext3 not yet finished and mount already trying to mount, so try until it works -MOUNTED=0 -while [ "$MOUNTED" -eq "0" ] ; do - sync - sleep 1 - sudo mount $@ $MOUNTPOINT/ -o loop -t ext3 - MOUNTED=`mount | grep -c "$MOUNTPOINT"` -done -#extract rootfs into the file -sudo cp -rpP $SRCPATH/* $MOUNTPOINT -if [ "$?" -ne "0" ] ; then - $ECHO -e "\033[1mCopying the rootfs failed.\033[0m" - echo "Check for error messages from cp" - sudo rm $@ - exit 1 -fi - -#unmount again -sudo umount $MOUNTPOINT - -#if the mounting was unsuccesful all rootfs data now still is in MOUNTPOINT, and $@ contains an empty fs -#delete $@ in that case to fail early -sync -FAILED=`ls $MOUNTPOINT | wc -l` -if [ "$FAILED" -ne "0" ] ; then - $ECHO -e "\033[1mMounting the loopdevice $@ failed.\033[0m" - sudo rm $@ - exit 1 -fi +../../library/genext3fs.sh
\ No newline at end of file diff --git a/recipes/images/files/colibri-t30/colibri-t30_bin/mk-u-boot-scripts.sh b/recipes/images/files/colibri-t30/colibri-t30_bin/mk-u-boot-scripts.sh index 2a4e898..ce71dbd 100755..120000 --- a/recipes/images/files/colibri-t30/colibri-t30_bin/mk-u-boot-scripts.sh +++ b/recipes/images/files/colibri-t30/colibri-t30_bin/mk-u-boot-scripts.sh @@ -1,5 +1 @@ -#!/bin/sh -for f in *.scr -do - mkimage -T script -C none -n 'Flash Apalis iMX6' -d $f `basename $f .scr`.img -done +../../library/mk-u-boot-scripts.sh
\ No newline at end of file diff --git a/recipes/images/files/colibri-t30/create_configblock.sh b/recipes/images/files/colibri-t30/create_configblock.sh index a33600a..c8bdac7 100755..120000 --- a/recipes/images/files/colibri-t30/create_configblock.sh +++ b/recipes/images/files/colibri-t30/create_configblock.sh @@ -1,206 +1 @@ -#! /bin/sh - -Usage() -{ - echo "create_configblock creates a configblock binary from the info on the module sticker." - echo "This can be used when the configblock got lost during a failed update attempt." - echo "The created configblock can then be written to the module with:" - echo "update.sh -c" - echo "" -} - -while getopts "h" Option ; do - case $Option in - h) Usage - # Exit if only usage (-h) was specfied. - if [ "$#" -eq 1 ] ; then - exit 10 - fi - exit 0 - ;; - esac -done - -# autotect MODTYPE from from rootfs directory -CNT=`grep -c "T20" rootfs/etc/issue || true` -if [ ${CNT} -ge 1 ] ; then - echo "Colibri T20 rootfs detected" - MODTYPE=colibri-t20 - BOOT_DEVICE=nand -else - CNT=`grep -c "T30" rootfs/etc/issue || true` - if [ ${CNT} -ge 1 ] ; then - CNT=`grep -c "Apalis" rootfs/etc/issue || true` - if [ ${CNT} -ge 1 ] ; then - echo "Apalis T30 rootfs detected" - MODTYPE=apalis-t30 - else - echo "Colibri T30 rootfs detected" - MODTYPE=colibri-t30 - fi - else - CNT=`grep -c "VF" rootfs/etc/issue || true` - if [ "$CNT" -ge 1 ] ; then - CNT=`grep -c "VF50" rootfs/etc/issue || true` - if [ "$CNT" -ge 1 ] ; then - echo "Colibri VF50 rootfs detected" - MODTYPE=colibri-vf50 - else - echo "Colibri VF61 rootfs detected" - MODTYPE=colibri-vf61 - fi - else - CNT=`grep -c "Colibri_iMX6" rootfs/etc/issue || true` - if [ "$CNT" -ge 1 ] ; then - echo "Colibri iMX6 rootfs detected" - MODTYPE=colibri-imx6 - else - CNT=`grep -ic "imx6" rootfs/etc/issue || true` - if [ "$CNT" -ge 1 ] ; then - echo "Apalis iMX6 rootfs detected" - MODTYPE=apalis-imx6 - else - echo "can not detect modulue type from ./rootfs/etc/issue" - echo "exiting" - exit 1 - fi - fi - fi - fi -fi - -echo "Enter the modules serial number on the modules sticker or" -echo "use a barcode scanner to enter the content of the stickers barcode" - -# read a barcode and test it to be 8 or 16 numbers only 0025100102489109 0115100000000024 -# 1234567890123456 1234567890123456 -until [ "${BARCODE}x" != "x" ] -do - read BARCODE - #remove all whitespace - BARCODE=`echo $BARCODE | tr -d ' '` - #get strlen and the number of numeric characters - STRLEN=`echo $BARCODE | wc -c` - NUMCNT=`echo $BARCODE | sed 's/[^0-9]//g' | wc -c` - if [ $STRLEN -ne 17 ] ; then - if [ $STRLEN -ne 9 ] ; then - echo "The serial number must be 8 numbers long (the barcode 16)" - BARCODE="" - fi - fi - if [ $NUMCNT -ne $STRLEN ] ; then - echo "The serial number must contain all numeric characters" - BARCODE="" - fi -done -DATECODE=19700101000000 -if [ $STRLEN -eq 17 ] ; then - SERIALNR=`echo $BARCODE | awk 'BEGIN{ FIELDWIDTHS = "8 8"} {print $2}'` - PRODUCTNR=`echo $BARCODE | awk 'BEGIN{ FIELDWIDTHS = "8 8"} {print $1}'` -else - SERIALNR=$BARCODE - CONFIGBLOCK_FILE=${MODTYPE}_bin/configblock.bin - case ${MODTYPE} in - "colibri-t20") - RAM_SIZE=256 - echo "Enter the RAM size ( 256 / 512 ):" - read RAM_SIZE - echo "Enter I for IT version, nothing otherwise" - read IT - if [ $RAM_SIZE -eq 512 ] ; then - if [ "$IT"x = "I" ] ; then - PROD_ID="0022" - else - PROD_ID="0021" - fi - CONFIGBLOCK_FILE=${MODTYPE}_bin/configblock_512.bin - - else - if [ "$IT"x = "I" ] ; then - PROD_ID="0024" - else - PROD_ID="0020" - fi - PROD_ID="0020" - CONFIGBLOCK_FILE=${MODTYPE}_bin/configblock_256.bin - fi - ;; - "colibri-t30") - PROD_ID="0023" - ;; - "apalis-t30") - PROD_ID="0025" - ;; - "colibri-vf50") - PROD_ID="0010" - ;; - "colibir-vf61") - PROD_ID="0011" - ;; - "apalis-imx6") - PROD_ID="0027" - ;; - "colibri-imx6") - RAM_SIZE=256 - echo "Enter the RAM size ( 256 / 512 ):" - read RAM_SIZE - echo "Enter I for IT version, nothing otherwise" - read IT - if [ $RAM_SIZE -eq 512 ] ; then - if [ "$IT"x = "I" ] ; then - PROD_ID="0017" - else - PROD_ID="0015" - fi - CONFIGBLOCK_FILE=${MODTYPE}_bin/configblock.bin - - else - if [ "$IT"x = "I" ] ; then - PROD_ID="0016" - else - PROD_ID="0014" - fi - CONFIGBLOCK_FILE=${MODTYPE}_bin/configblock.bin - fi - ;; - esac - - echo "Enter the module version, e.g. V1.2 C" - read PRODVERSION - VER_MAJ=`echo $PRODVERSION | awk 'BEGIN{ FIELDWIDTHS = "1 1 1 1 1 1"} {print $2}'` - VER_MIN=`echo $PRODVERSION | awk 'BEGIN{ FIELDWIDTHS = "1 1 1 1 1 1"} {print $4}'` - #VARIANT: A=0, B=1 ... - VARIANT=`echo $PRODVERSION | awk 'BEGIN{ FIELDWIDTHS = "1 1 1 1 1 1"} {print $6}'` - VARIANT=`printf "%d\n" "'$VARIANT"` - VARIANT=`expr $VARIANT - 65` - if [ "$VARIANT" -lt 10 ] ; then - VARIANT=0$VARIANT - fi - PRODUCTNR=${PROD_ID}${VER_MAJ}${VER_MIN}${VARIANT} -fi - -#write the config block file -if [ "${MODTYPE}" = "colibri-t20" ] ; then - PROD_ID=`echo $PRODUCTNR | awk 'BEGIN{ FIELDWIDTHS = "4 4"} {print $1}'` - CONFIGBLOCK_FILE=${MODTYPE}_bin/configblock_256.bin - if [ ${PROD_ID} = "0021" ] ; then - CONFIGBLOCK_FILE=${MODTYPE}_bin/configblock_512.bin - fi - if [ ${PROD_ID} = "0022" ] ; then - CONFIGBLOCK_FILE=${MODTYPE}_bin/configblock_512.bin - fi -else - CONFIGBLOCK_FILE=${MODTYPE}_bin/configblock.bin -fi -sudo chown ${USER}: ${MODTYPE}_bin -sudo rm -f $CONFIGBLOCK_FILE -#file header -awk 'function sc(c) {return (c<128?c:(c-256))} BEGIN{printf "%c%c%c%c",0,64,1,-49}' > $CONFIGBLOCK_FILE -#mac addr / serial -echo $SERIALNR | awk 'function sc(c) {return (c<128?c:(c-256))} {printf "%c%c%c%c%c%c%c%c%c%c%c%c",2,64,0,0, 0,20,45, sc(int($0/256/256)), sc(int($0/256)%256), sc($0%256),0,0 }' >> $CONFIGBLOCK_FILE -#product describtion, $1 char 0/1: ??, $2 char 2/3: ProdID, $3 char 4:VerMaj, $4 char 5:VerMin, $5 char 6/7:Variant -echo $PRODUCTNR | awk 'BEGIN{ FIELDWIDTHS = "2 2 1 1 2"} function sc(c) {return (c<128?c:(c-256))} {printf "%c%c%c%c%c%c%c%c%c%c%c%c",2,64,8,0 ,sc($3),0, sc($4),0, sc($5),0, sc($2),0 }' >> $CONFIGBLOCK_FILE -#fill to 32 bytes -awk 'function sc(c) {return (c<128?c:(c-256))} BEGIN{printf "%c%c%c%c",-1,-1,-1,-1}' >> $CONFIGBLOCK_FILE - -exit 0 +../library/create_configblock.sh
\ No newline at end of file diff --git a/recipes/images/files/colibri-t30/tegra-uboot-flasher/genext3fs.sh b/recipes/images/files/colibri-t30/tegra-uboot-flasher/genext3fs.sh index 3c8ecc8..cc716db 100755..120000 --- a/recipes/images/files/colibri-t30/tegra-uboot-flasher/genext3fs.sh +++ b/recipes/images/files/colibri-t30/tegra-uboot-flasher/genext3fs.sh @@ -1,80 +1 @@ -#!/bin/sh -#creates a file containing a ext3 binary blob of the content of the ../rootfs folder - -# sometimes we need the binary echo, not the shell builtin -ECHO=`which echo` - -MOUNTPOINT="mnt/trdx-rootfs" - -Usage() -{ - echo "creates a file containing a ext3 binary blob. Output file name taken from command line" - echo "Usage: genext3fs.sh [OPTION]... dest_file_name" - echo "-h : Prints this message" - echo "-b : Sets the partition size in MBytes, default 256" - echo "-d : Selects the directory which contains the partition content, default ../rootfs" - echo "" -} - -PARTITIONSIZE=256 -SRCPATH=../rootfs - -while getopts "b:d:h" Option ; do - case $Option in - h) Usage - # Exit if only usage (-h) was specfied. - if [[ "$#" -eq "1" ]] ; then - exit 10 - fi - exit 0 - ;; - b) PARTITIONSIZE=$OPTARG - ;; - d) SRCPATH=$OPTARG - ;; - esac -done -#adjust the commandline arg for the now used options -shift $(($OPTIND - 1)) - -#create the file used for the loopbackdevice and format it for ext3 -#answer y to "is not a block special device" -dd if=/dev/zero of=$@ bs=1024k count=$PARTITIONSIZE -mkfs.ext3 -F -L arm $@ -#disable fsck checks based on mount count or time interval -tune2fs -c 0 -i 0 $@ - -#prepare mountpoint for the loopdevice -sudo mkdir -p $MOUNTPOINT -sudo umount $MOUNTPOINT &> /dev/null -sudo rm -rf $MOUNTPOINT/* -#mount the file as a loopdevice -#there seems to be a race between mkfs.ext3 not yet finished and mount already trying to mount, so try until it works -MOUNTED=0 -while [ "$MOUNTED" -eq "0" ] ; do - sync - sleep 1 - sudo mount $@ $MOUNTPOINT/ -o loop -t ext3 - MOUNTED=`mount | grep -c "$MOUNTPOINT"` -done -#extract rootfs into the file -sudo cp -rpP $SRCPATH/* $MOUNTPOINT -if [ "$?" -ne "0" ] ; then - $ECHO -e "\033[1mCopying the rootfs failed.\033[0m" - echo "Check for error messages from cp" - sudo rm $@ - exit 1 -fi - -#unmount again -sudo umount $MOUNTPOINT - -#if the mounting was unsuccesful all rootfs data now still is in MOUNTPOINT, and $@ contains an empty fs -#delete $@ in that case to fail early -sync -FAILED=`ls $MOUNTPOINT | wc -l` -if [ "$FAILED" -ne "0" ] ; then - $ECHO -e "\033[1mMounting the loopdevice $@ failed.\033[0m" - sudo rm $@ - exit 1 -fi +../../library/genext3fs.sh
\ No newline at end of file diff --git a/recipes/images/files/colibri-t30/update.sh b/recipes/images/files/colibri-t30/update.sh index 21b4ac6..fb897ec 100755..120000 --- a/recipes/images/files/colibri-t30/update.sh +++ b/recipes/images/files/colibri-t30/update.sh @@ -1,273 +1 @@ -#!/bin/sh -# Prepare files needed for flashing a Apalis/Colibri T30 module -# -# inspired by meta-fsl-arm/classes/image_types_fsl.bbclass - -# sometimes we need the binary echo, not the shell builtin -ECHO=`which echo` -#some distros have fs tools only in root's path -PARTED=`which parted` 2> /dev/null -if [ -e "$PARTED" ] ; then - MKFSVFAT=`which mkfs.vfat` -else - PARTED=`sudo which parted` - MKFSVFAT=`sudo which mkfs.vfat` -fi - -Flash() -{ - echo "" - echo "To flash the Apalis/Colibri T30 module, boot the module to the U-Boot prompt and" - echo "" - echo "when using a SD-card, insert the SD-card and enter:" - echo "run setupdate" - echo "" - echo "when using tftp, connect Ethernet and enter:" - echo "tftp \$loadaddr flash_eth.img ; source \$loadaddr" - echo "" - echo "then enter to update all:" - echo "run update" - echo "" - echo "to update a single component enter one of:" - echo "run update_uboot" - echo "run update_kernel" - echo "" - echo "" - echo "If you don't have a working U-Boot anymore, connect your PC to the module's" - echo "USB client port, bring the module in the serial download mode and start" - echo "the update.sh script with the -d option. This will copy U-Boot into the" - echo "modules RAM and execute it." -} - -Usage() -{ - echo "" - echo "Prepares and copies files for flashing the internal eMMC of a Apalis/Colibri T30" - echo "" - echo "Will require a running U-Boot on the target. Either one already flashed" - echo "on the eMMC or one copied over usb into the module's RAM" - echo "" - echo "-d : use USB connection to copy and execute U-Boot to the module's RAM" - echo "-h : Prints this message" - echo "-o directory : output directory, defaults to /media/KERNEL" - echo " if this is on a SD card, it should be the" - echo " first partition formated with VFAT" - echo "" - echo "Example \"./update.sh\" copies the requiered files to /media/KERNEL/" - echo "Example \"./update.sh -o /srv/tftp/\" copies the requiered files to /srv/tftp/" - echo "" - echo "" - Flash -} - -#initialise options -UBOOT_RECOVERY=0 -OUT_DIR="/media/KERNEL" -MIN_PARTITION_FREE_SIZE=100 -ROOTFSPATH=rootfs -# No devicetree by default -KERNEL_DEVICETREE="" -KERNEL_IMAGETYPE="uImage" - -while getopts "dho:" Option ; do - case $Option in - d) UBOOT_RECOVERY=1 - ;; - h) Usage - # Exit if only usage (-h) was specfied. - if [ "$#" -eq 1 ] ; then - exit 10 - fi - exit 0 - ;; - o) OUT_DIR=$OPTARG - ;; - esac -done - -# autotect MODTYPE from from rootfs directory -CNT=`grep -ic "t30" rootfs/etc/issue || true` -if [ "$CNT" -ge 1 ] ; then - CNT=`grep -ic "apalis" rootfs/etc/issue || true` - if [ "$CNT" -ge 1 ] ; then - echo "Apalis T30 rootfs detected" - MODTYPE=apalis-t30 - IMAGEFILE=root.ext3 - U_BOOT_BINARY=u-boot-dtb-tegra.bin - KERNEL_DEVICETREE="tegra30-apalis-eval.dtb" - LOCPATH="tegra-uboot-flasher" - # eMMC size [in sectors of 512] - EMMC_SIZE=$(expr 1024 \* 3500 \* 2) - BCT=apalis_t30_12MHz_MT41K512M8RH-125_533MHz.bct - CBOOT_IMAGE=apalis_t30.img - else - echo "Colibri T30 rootfs detected" - MODTYPE=colibri-t30 - IMAGEFILE=root.ext3 - U_BOOT_BINARY=u-boot-dtb-tegra.bin - KERNEL_DEVICETREE="tegra30-colibri-eval-v3.dtb" - LOCPATH="tegra-uboot-flasher" - EMMC_SIZE=$(expr 1024 \* 2000 \* 2) - # with new kernel, boot with 400MHz, then switch between 400 & 800 - BCT=colibri_t30_12MHz_NT5CC256M16CP-DI_400MHz.bct -# BCT=colibri_t30_12MHz_NT5CC256M16CP-DI_533MHz.bct - CBOOT_IMAGE=colibri_t30.img - fi -else - echo "can not detect module type from ./rootfs/etc/issue" - echo "exiting" - exit 1 -fi -BINARIES=${MODTYPE}_bin - -#is only U-Boot to be copied to RAM? -if [ "$UBOOT_RECOVERY" -ge 1 ] ; then - cd ${LOCPATH} - sudo ./tegrarcm --bct=../${BINARIES}/${BCT} --bootloader=../${BINARIES}/${U_BOOT_BINARY} --loadaddr=0x80108000 - exit 1 -fi - -# is OUT_DIR an existing directory? -if [ ! -d "$OUT_DIR" ] ; then - echo "$OUT_DIR" "does not exist, exiting" - exit 1 -fi - -#sanity check for correct untared rootfs -DEV_OWNER=`ls -ld rootfs/dev | awk '{print $3}'` -if [ "${DEV_OWNER}x" != "rootx" ] -then - $ECHO -e "rootfs/dev is not owned by root, but it should!" - $ECHO -e "\033[1mPlease unpack the tarball with root rights.\033[0m" - $ECHO -e "e.g. sudo tar xjvf Apalis_T30_LinuxImageV2.1_20140201.tar.bz2" - exit 1 -fi - -#sanity check for existens of U-Boot and kernel -[ -e ${BINARIES}/${U_BOOT_BINARY} ] || { echo "${BINARIES}/${U_BOOT_BINARY} does not exist"; exit 1; } -[ -e ${BINARIES}/uImage ] || { echo "${BINARIES}/uImage does not exist"; exit 1; } - -#sanity check for some programs -MCOPY=`sudo which mcopy` -[ "${MCOPY}x" != "x" ] || { echo >&2 "Program mcopy not available. Aborting."; exit 1; } -sudo ${PARTED} -v >/dev/null 2>&1 || { echo >&2 "Program parted not available. Aborting."; exit 1; } -[ "${MKFSVFAT}x" != "x" ] || { echo >&2 "Program mkfs.vfat not available. Aborting."; exit 1; } -MKFSEXT3=`sudo which mkfs.ext3` -[ "${MKFSEXT3}x" != "x" ] || { echo >&2 "Program mkfs.ext3 not available. Aborting."; exit 1; } -awk -V >/dev/null 2>&1 || { echo >&2 "Program awk not available. Aborting."; exit 1; } -dd --help >/dev/null 2>&1 || { echo >&2 "Program dd not available. Aborting."; exit 1; } -tegra-uboot-flasher/cbootimage -h >/dev/null 2>&1 -[ "$?" -lt 2 ] || { echo >&2 "Program cbootimage not available. 32bit compatibility libs? Aborting."; exit 1; } - -#make the directory with the outputfiles writable -sudo chown $USER: ${BINARIES} - -#make a file with the used versions for U-Boot, kernel and rootfs -rm ${BINARIES}/versions.txt -touch ${BINARIES}/versions.txt -echo "Component Versions" > ${BINARIES}/versions.txt -basename "`readlink -e ${BINARIES}/${U_BOOT_BINARY}`" >> ${BINARIES}/versions.txt -basename "`readlink -e ${BINARIES}/uImage`" >> ${BINARIES}/versions.txt -$ECHO -n "Rootfs " >> ${BINARIES}/versions.txt -grep -i t30 rootfs/etc/issue >> ${BINARIES}/versions.txt - - -# The emmc layout used is: -# -# boot area partition 1 aka eMMC boot sector: -# -# with cbootimage containing BCT and U-Boot boot loader -# -# user area aka general purpose eMMC region: -# -# 0 -> IMAGE_ROOTFS_ALIGNMENT - reserved to bootloader (not partitioned) -# IMAGE_ROOTFS_ALIGNMENT -> BOOT_SPACE - kernel and other data -# BOOT_SPACE -> SDIMG_SIZE - rootfs -# -# Default Free space = 1.3x -# Use IMAGE_OVERHEAD_FACTOR to add more space -# <---------> -# 4MiB 16MiB SDIMG_ROOTFS 4MiB -# <-----------------------> <----------> <----------------------> <------------------------------> -# ------------------------ ------------ ------------------------ ------------------------------- -# | IMAGE_ROOTFS_ALIGNMENT | BOOT_SPACE | ROOTFS_SIZE | IMAGE_ROOTFS_ALIGNMENT | -# ------------------------ ------------ ------------------------ ------------------------------- -# ^ ^ ^ ^ ^ -# | | | | | -# 0 4096 4MiB + 16MiB 4MiB + 16Mib + SDIMG_ROOTFS 4MiB + 16MiB + SDIMG_ROOTFS + 4MiB -# -# with the U-Boot environment at 512 * 1024, the config block is at 640 * 1024 - - -# generate cbootimage containing BCT and U-Boot boot loader -cd ${BINARIES} -sudo ../${LOCPATH}/cbootimage -s tegra30 ${CBOOT_IMAGE}.cfg ${CBOOT_IMAGE} -cd .. - - -# Boot partition [in sectors of 512] -BOOT_START=$(expr 4096 \* 2) -# Rootfs partition [in sectors of 512] -ROOTFS_START=$(expr 20480 \* 2) -# Boot partition volume id -BOOTDD_VOLUME_ID="Boot" - -#make the partition size size(rootfs used + MIN_PARTITION_FREE_SIZE) -#add about 4% to the rootfs to account for fs overhead. (/1024/985 instead of /1024/1024). -#add 512 bytes per file to account for small files -NUMBER_OF_FILES=`sudo find ${ROOTFSPATH} | wc -l` -EXT_SIZE=`sudo du -DsB1 ${ROOTFSPATH} | awk -v min=$MIN_PARTITION_FREE_SIZE -v f=${NUMBER_OF_FILES} \ - '{rootfs_size=$1+f*512;rootfs_size=int(rootfs_size/1024/985); print (rootfs_size+min) }'` - -echo "" -echo "Creating MBR file and do the partitioning" -# Initialize a sparse file -dd if=/dev/zero of=${BINARIES}/mbr.bin bs=512 count=0 seek=${EMMC_SIZE} -${PARTED} -s ${BINARIES}/mbr.bin mklabel msdos -${PARTED} -a none -s ${BINARIES}/mbr.bin unit s mkpart primary fat32 ${BOOT_START} $(expr ${ROOTFS_START} - 1 ) -# the partition spans to the end of the disk, even though the fs size will be smaller -# on the target the fs is then grown to the full size -${PARTED} -a none -s ${BINARIES}/mbr.bin unit s mkpart primary ext2 ${ROOTFS_START} $(expr ${EMMC_SIZE} \- ${ROOTFS_START} \- 1) -${PARTED} -s ${BINARIES}/mbr.bin unit s print -# get the size of the VFAT partition -BOOT_BLOCKS=$(LC_ALL=C ${PARTED} -s ${BINARIES}/mbr.bin unit b print \ - | awk '/ 1 / { print int(substr($4, 1, length($4 -1)) / 1024) }') -# now crop the file to only the MBR size -IMG_SIZE=512 -truncate -s $IMG_SIZE ${BINARIES}/mbr.bin - - -echo "" -echo "Creating VFAT partion image with the kernel" -rm -f ${BINARIES}/boot.vfat -${MKFSVFAT} -n "${BOOTDD_VOLUME_ID}" -S 512 -C ${BINARIES}/boot.vfat $BOOT_BLOCKS -export MTOOLS_SKIP_CHECK=1 -mcopy -i ${BINARIES}/boot.vfat -s ${BINARIES}/uImage ::/uImage - -# Copy device tree file -if test -n "${KERNEL_DEVICETREE}"; then - for DTS_FILE in ${KERNEL_DEVICETREE}; do - DTS_BASE_NAME=`basename ${DTS_FILE} | awk -F "." '{print $1}'` - if [ -e "${BINARIES}/${KERNEL_IMAGETYPE}-${DTS_BASE_NAME}.dtb" ]; then - kernel_bin="`readlink ${BINARIES}/${KERNEL_IMAGETYPE}`" - kernel_bin_for_dtb="`readlink ${BINARIES}/${KERNEL_IMAGETYPE}-${DTS_BASE_NAME}.dtb | sed "s,$DTS_BASE_NAME,${MODTYPE},g;s,\.dtb$,.bin,g"`" - if [ "$kernel_bin" = "$kernel_bin_for_dtb" ]; then - mcopy -i ${BINARIES}/boot.vfat -s ${BINARIES}/${DEPLOY_DIR_IMAGE}/${KERNEL_IMAGETYPE}-${DTS_BASE_NAME}.dtb ::/${DTS_BASE_NAME}.dtb - #copy also to out_dir - sudo cp ${BINARIES}/${DEPLOY_DIR_IMAGE}/${KERNEL_IMAGETYPE}-${DTS_BASE_NAME}.dtb "$OUT_DIR/${DTS_BASE_NAME}.dtb" - fi - fi - done -fi - -echo "" -echo "Creating rootfs partion image" -rm -f ${BINARIES}/${IMAGEFILE} -sudo $LOCPATH/genext3fs.sh -d rootfs -b ${EXT_SIZE} ${BINARIES}/${IMAGEFILE} || exit 1 - - -#copy to $OUT_DIR -sudo cp ${BINARIES}/configblock.bin ${BINARIES}/${CBOOT_IMAGE} ${BINARIES}/uImage ${BINARIES}/mbr.bin ${BINARIES}/boot.vfat ${BINARIES}/${IMAGEFILE} ${BINARIES}/flash*.img ${BINARIES}/versions.txt "$OUT_DIR" -sync - -Flash +../library/t30/update.sh
\ No newline at end of file diff --git a/recipes/images/files/colibri-vf/colibri-vf_bin/mk-u-boot-scripts.sh b/recipes/images/files/colibri-vf/colibri-vf_bin/mk-u-boot-scripts.sh index 3c10ac4..ce71dbd 100755..120000 --- a/recipes/images/files/colibri-vf/colibri-vf_bin/mk-u-boot-scripts.sh +++ b/recipes/images/files/colibri-vf/colibri-vf_bin/mk-u-boot-scripts.sh @@ -1,7 +1 @@ -#!/bin/sh -for f in *.scr -do - mkimage -T script -C none -n 'Flash Colibri VF' -d $f `basename $f .scr`.img -done -#mkimage -T script -C none -n 'Flash Colibri VF with data from SD card' -d flash_mmc.scr flash_mmc.img -#mkimage -T script -C none -n 'Flash Colibri VF with u-boot from SD card' -d flash_mmc_u-boot.scr flash_mmc_u-boot.img +../../library/mk-u-boot-scripts.sh
\ No newline at end of file diff --git a/recipes/images/files/colibri-vf/create_configblock.sh b/recipes/images/files/colibri-vf/create_configblock.sh index 759a9dc..c8bdac7 100755..120000 --- a/recipes/images/files/colibri-vf/create_configblock.sh +++ b/recipes/images/files/colibri-vf/create_configblock.sh @@ -1,193 +1 @@ -#! /bin/sh - -Usage() -{ - echo "create_configblock creates a configblock binary from the info on the module sticker." - echo "This can be used when the configblock got lost during a failed update attempt." - echo "" - echo "The created config-block will be copied to the choosen output directory when running" - echo "the update.sh command. In order to write the config block, the boot configuration block" - echo "need to be recreated first:" - echo "run create_bcb" - echo "run update_configblock" - echo "" -} - -while getopts "h" Option ; do - case $Option in - h) Usage - # Exit if only usage (-h) was specfied. - if [[ $# -eq 1 ]] ; then - exit 10 - fi - exit 0 - ;; - esac -done - -# autotect MODTYPE from from rootfs directory -CNT=`grep -c "T20" rootfs/etc/issue || true` -if [ ${CNT} -ge 1 ] ; then - echo "Colibri T20 rootfs detected" - MODTYPE=colibri-t20 - BOOT_DEVICE=nand -else - CNT=`grep -c "T30" rootfs/etc/issue || true` - if [ ${CNT} -ge 1 ] ; then - CNT=`grep -c "Apalis" rootfs/etc/issue || true` - if [ ${CNT} -ge 1 ] ; then - echo "Apalis T30 rootfs detected" - MODTYPE=apalis-t30 - else - echo "Colibri T30 rootfs detected" - MODTYPE=colibri-t30 - fi - else - CNT=`grep -c "VF" rootfs/etc/issue || true` - if [ "$CNT" -ge 1 ] ; then - echo "Colibri VF rootfs detected" - - MODTYPE=colibri-vf - else - echo "can not detect modulue type from ./rootfs/etc/issue" - echo "exiting" - exit 1 - fi - fi -fi - -echo "Enter the modules serial number on the modules sticker or" -echo "use a barcode scanner to enter the content of the stickers barcode" - -# read a barcode and test it to be 8 or 16 numbers only 0025100102489109 0115100000000024 -# 1234567890123456 1234567890123456 -until [ "${BARCODE}x" != "x" ] -do - read BARCODE - #remove all whitespace - BARCODE=`echo $BARCODE | tr -d ' '` - #get strlen and the number of numeric characters - STRLEN=`echo $BARCODE | wc -c` - NUMCNT=`echo $BARCODE | sed 's/[^0-9]//g' | wc -c` - if [ $STRLEN -ne 17 ] ; then - if [ $STRLEN -ne 9 ] ; then - echo "The serial number must be 8 numbers long (the barcode 16)" - BARCODE="" - fi - fi - if [ $NUMCNT -ne $STRLEN ] ; then - echo "The serial number must contain all numeric characters" - BARCODE="" - fi -done -DATECODE=19700101000000 -if [ $STRLEN -eq 17 ] ; then - SERIALNR=`echo $BARCODE | awk 'BEGIN{ FIELDWIDTHS = "8 8"} {print $2}'` - PRODUCTNR=`echo $BARCODE | awk 'BEGIN{ FIELDWIDTHS = "8 8"} {print $1}'` -else - SERIALNR=$BARCODE - CONFIGBLOCK_FILE=${MODTYPE}_bin/configblock.bin - case ${MODTYPE} in - "colibri-t20") - RAM_SIZE=256 - echo "Enter the RAM size ( 256 / 512 ):" - read RAM_SIZE - echo "Enter I for IT version, nothing otherwise" - read IT - if [ $RAM_SIZE -eq 512 ] ; then - if [ "$IT"x = "I" ] ; then - PROD_ID="0022" - else - PROD_ID="0021" - fi - CONFIGBLOCK_FILE=${MODTYPE}_bin/configblock_512.bin - - else - if [ "$IT"x = "I" ] ; then - PROD_ID="0024" - else - PROD_ID="0020" - fi - PROD_ID="0020" - CONFIGBLOCK_FILE=${MODTYPE}_bin/configblock_256.bin - fi - ;; - "colibri-t30") - PROD_ID="0023" - ;; - "apalis-t30") - PROD_ID="0025" - ;; - "colibri-vf") - echo "Enter 50 for a Colibri VF50 or 61 for a Colibri VF61" - VF_TYPE="" - until [ "${VF_TYPE}x" != "x" ] - do - read VF_TYPE - #remove all whitespace - VF_TYPE=`echo $VF_TYPE | tr -d ' '` - #get strlen and the number of numeric characters - if [ "${VF_TYPE}" != "61" ] ; then - if [ "${VF_TYPE}" != "50" ] ; then - echo "Only 50 or 61 valid, try again" - VF_TYPE="" - fi - fi - done - - echo "Enter I for IT version, nothing otherwise" - read IT - - if [ "$VF_TYPE" = "50" ] ; then - if [ "$IT" = "I" ] ; then - PROD_ID="0013" - else - PROD_ID="0010" - fi - elif [ "$VF_TYPE" = "61" ] ; then - if [ "$IT" = "I" ] ; then - PROD_ID="0012" - else - PROD_ID="0011" - fi - fi - ;; - esac - - echo "Enter the module version, e.g. V1.2 C" - read PRODVERSION - VER_MAJ=`echo $PRODVERSION | awk 'BEGIN{ FIELDWIDTHS = "1 1 1 1 1 1"} {print $2}'` - VER_MIN=`echo $PRODVERSION | awk 'BEGIN{ FIELDWIDTHS = "1 1 1 1 1 1"} {print $4}'` - #VARIANT: A=0, B=1 ... - VARIANT=`echo $PRODVERSION | awk 'BEGIN{ FIELDWIDTHS = "1 1 1 1 1 1"} {print $6}'` - VARIANT=`printf "%d\n" "'$VARIANT"` - VARIANT=`expr $VARIANT - 65` - if [ "$VARIANT" -lt 10 ] ; then - VARIANT=0$VARIANT - fi - PRODUCTNR=${PROD_ID}${VER_MAJ}${VER_MIN}${VARIANT} -fi - -#write the config block file -if [ "${MODTYPE}" = "colibri-t20" ] ; then - PROD_ID=`echo $PRODUCTNR | awk 'BEGIN{ FIELDWIDTHS = "4 4"} {print $1}'` - CONFIGBLOCK_FILE=${MODTYPE}_bin/configblock_256.bin - if [ ${PROD_ID} = "0021" ] ; then - CONFIGBLOCK_FILE=${MODTYPE}_bin/configblock_512.bin - fi - if [ ${PROD_ID} = "0022" ] ; then - CONFIGBLOCK_FILE=${MODTYPE}_bin/configblock_512.bin - fi -fi -sudo chown ${USER}: `dirname $CONFIGBLOCK_FILE` -sudo rm -f $CONFIGBLOCK_FILE -#file header -awk 'function sc(c) {return (c<128?c:(c-256))} BEGIN{printf "%c%c%c%c",0,64,1,-49}' > $CONFIGBLOCK_FILE -#mac addr / serial -echo $SERIALNR | awk 'function sc(c) {return (c<128?c:(c-256))} {printf "%c%c%c%c%c%c%c%c%c%c%c%c",2,64,0,0, 0,20,45, sc(int($0/256/256)), sc(int($0/256)%256), sc($0%256),0,0 }' >> $CONFIGBLOCK_FILE -#product describtion, $1 char 0/1: ??, $2 char 2/3: ProdID, $3 char 4:VerMaj, $4 char 5:VerMin, $5 char 6/7:Variant -echo $PRODUCTNR | awk 'BEGIN{ FIELDWIDTHS = "2 2 1 1 2"} function sc(c) {return (c<128?c:(c-256))} {printf "%c%c%c%c%c%c%c%c%c%c%c%c",2,64,8,0 ,sc($3),0, sc($4),0, sc($5),0, sc($2),0 }' >> $CONFIGBLOCK_FILE -#fill to 32 bytes -awk 'function sc(c) {return (c<128?c:(c-256))} BEGIN{printf "%c%c%c%c",-1,-1,-1,-1}' >> $CONFIGBLOCK_FILE - -exit 0 +../library/create_configblock.sh
\ No newline at end of file diff --git a/recipes/images/files/library/create_configblock.sh b/recipes/images/files/library/create_configblock.sh new file mode 100755 index 0000000..f21b05c --- /dev/null +++ b/recipes/images/files/library/create_configblock.sh @@ -0,0 +1,240 @@ +#! /bin/sh + +Usage() +{ + echo "create_configblock creates a configblock binary from the info on the module sticker." + echo "This can be used when the configblock got lost during a failed update attempt." + echo "" + echo "The created config-block will be copied to the choosen output directory when running" + echo "the update.sh command." + echo "" + echo "In order to write the config block enter on the U-Boot commandline:" + echo "run update" + echo "run update_configblock" + echo "" + echo "For Colibri VF modules the boot configuration block needs to be recreated first:" + echo "run update" + echo "run create_bcb" + echo "run update_configblock" + echo "" +} + +while getopts "h" Option ; do + case $Option in + h) Usage + # Exit if only usage (-h) was specfied. + if [[ $# -eq 1 ]] ; then + exit 10 + fi + exit 0 + ;; + esac +done + +# autotect MODTYPE from from rootfs directory +CNT=`grep -c "T20" rootfs/etc/issue || true` +if [ ${CNT} -ge 1 ] ; then + echo "Colibri T20 rootfs detected" + MODTYPE=colibri-t20 + BOOT_DEVICE=nand +else + CNT=`grep -c "T30" rootfs/etc/issue || true` + if [ ${CNT} -ge 1 ] ; then + CNT=`grep -c "Apalis" rootfs/etc/issue || true` + if [ ${CNT} -ge 1 ] ; then + echo "Apalis T30 rootfs detected" + MODTYPE=apalis-t30 + else + echo "Colibri T30 rootfs detected" + MODTYPE=colibri-t30 + fi + else + CNT=`grep -c "VF" rootfs/etc/issue || true` + if [ "$CNT" -ge 1 ] ; then + echo "Colibri VF rootfs detected" + MODTYPE=colibri-vf + else + CNT=`grep -c "Colibri_iMX6" rootfs/etc/issue || true` + if [ "$CNT" -ge 1 ] ; then + echo "Colibri iMX6 rootfs detected" + MODTYPE=colibri-imx6 + else + CNT=`grep -ic "imx6" rootfs/etc/issue || true` + if [ "$CNT" -ge 1 ] ; then + echo "Apalis iMX6 rootfs detected" + MODTYPE=apalis-imx6 + else + echo "can not detect modulue type from ./rootfs/etc/issue" + echo "exiting" + exit 1 + fi + fi + fi + fi +fi + +echo "Enter the modules serial number on the modules sticker or" +echo "use a barcode scanner to enter the content of the stickers barcode" + +# read a barcode and test it to be 8 or 16 numbers only 0025100102489109 0115100000000024 +# 1234567890123456 1234567890123456 +until [ "${BARCODE}x" != "x" ] +do + read BARCODE + #remove all whitespace + BARCODE=`echo $BARCODE | tr -d ' '` + #get strlen and the number of numeric characters + STRLEN=`echo $BARCODE | wc -c` + NUMCNT=`echo $BARCODE | sed 's/[^0-9]//g' | wc -c` + if [ $STRLEN -ne 17 ] ; then + if [ $STRLEN -ne 9 ] ; then + echo "The serial number must be 8 numbers long (the barcode 16)" + BARCODE="" + fi + fi + if [ $NUMCNT -ne $STRLEN ] ; then + echo "The serial number must contain all numeric characters" + BARCODE="" + fi +done +DATECODE=19700101000000 +if [ $STRLEN -eq 17 ] ; then + SERIALNR=`echo $BARCODE | awk 'BEGIN{ FIELDWIDTHS = "8 8"} {print $2}'` + PRODUCTNR=`echo $BARCODE | awk 'BEGIN{ FIELDWIDTHS = "8 8"} {print $1}'` +else + SERIALNR=$BARCODE + case ${MODTYPE} in + "apalis-imx6") + RAM_SIZE=1024 + echo "Enter the RAM size ( 512 / 1024 / 2048 ):" + read RAM_SIZE + case ${RAM_SIZE} in + "512") + PROD_ID="0029" + ;; + "1024") + PROD_ID="0027" + ;; + "2048") + PROD_ID="0028" + ;; + esac + ;; + "apalis-t30") + RAM_SIZE=1024 + echo "Enter the RAM size ( 1024 / 2048 ):" + read RAM_SIZE + case ${RAM_SIZE} in + "1024") + PROD_ID="0026" + ;; + "2048") + PROD_ID="0025" + ;; + esac + ;; + "colibri-imx6") + RAM_SIZE=256 + echo "Enter the RAM size ( 256 / 512 ):" + read RAM_SIZE + echo "Enter I for IT version, nothing otherwise" + read IT + if [ $RAM_SIZE -eq 512 ] ; then + if [ "$IT"x = "Ix" ] ; then + PROD_ID="0017" + else + PROD_ID="0015" + fi + else + if [ "$IT"x = "Ix" ] ; then + PROD_ID="0016" + else + PROD_ID="0014" + fi + fi + ;; + "colibri-t20") + RAM_SIZE=256 + echo "Enter the RAM size ( 256 / 512 ):" + read RAM_SIZE + echo "Enter I for IT version, nothing otherwise" + read IT + if [ $RAM_SIZE -eq 512 ] ; then + if [ "$IT"x = "Ix" ] ; then + PROD_ID="0022" + else + PROD_ID="0021" + fi + else + if [ "$IT"x = "Ix" ] ; then + PROD_ID="0024" + else + PROD_ID="0020" + fi + fi + ;; + "colibri-t30") + PROD_ID="0023" + ;; + "colibri-vf") + VF_TYPE=50 + echo "Enter the Module Type (50 for a Colibri VF50 or 61 for a Colibri VF61)" + read VF_TYPE + + echo "Enter I for IT version, nothing otherwise" + read IT + if [ "$VF_TYPE" = "50" ] ; then + if [ "$IT"x = "Ix" ] ; then + PROD_ID="0013" + else + PROD_ID="0010" + fi + elif [ "$VF_TYPE" = "61" ] ; then + if [ "$IT"x = "I"x ] ; then + PROD_ID="0012" + else + PROD_ID="0011" + fi + fi + ;; + esac + + echo "Enter the module version, e.g. V1.2 C" + read PRODVERSION + VER_MAJ=`echo $PRODVERSION | awk 'BEGIN{ FIELDWIDTHS = "1 1 1 1 1 1"} {print $2}'` + VER_MIN=`echo $PRODVERSION | awk 'BEGIN{ FIELDWIDTHS = "1 1 1 1 1 1"} {print $4}'` + #VARIANT: A=0, B=1 ... + VARIANT=`echo $PRODVERSION | awk 'BEGIN{ FIELDWIDTHS = "1 1 1 1 1 1"} {print $6}'` + VARIANT=`printf "%d\n" "'$VARIANT"` + VARIANT=`expr $VARIANT - 65` + if [ "$VARIANT" -lt 10 ] ; then + VARIANT=0$VARIANT + fi + PRODUCTNR=${PROD_ID}${VER_MAJ}${VER_MIN}${VARIANT} +fi + +#write the config block file +if [ "${MODTYPE}" = "colibri-t20" ] ; then + PROD_ID=`echo $PRODUCTNR | awk 'BEGIN{ FIELDWIDTHS = "4 4"} {print $1}'` + CONFIGBLOCK_FILE=${MODTYPE}_bin/configblock_256.bin + if [ ${PROD_ID} = "0021" ] ; then + CONFIGBLOCK_FILE=${MODTYPE}_bin/configblock_512.bin + fi + if [ ${PROD_ID} = "0022" ] ; then + CONFIGBLOCK_FILE=${MODTYPE}_bin/configblock_512.bin + fi +else + CONFIGBLOCK_FILE=${MODTYPE}_bin/configblock.bin +fi +sudo chown ${USER}: `dirname $CONFIGBLOCK_FILE` +sudo rm -f $CONFIGBLOCK_FILE +#file header +awk 'function sc(c) {return (c<128?c:(c-256))} BEGIN{printf "%c%c%c%c",0,64,1,-49}' > $CONFIGBLOCK_FILE +#mac addr / serial +echo $SERIALNR | awk 'function sc(c) {return (c<128?c:(c-256))} {printf "%c%c%c%c%c%c%c%c%c%c%c%c",2,64,0,0, 0,20,45, sc(int($0/256/256)), sc(int($0/256)%256), sc($0%256),0,0 }' >> $CONFIGBLOCK_FILE +#product describtion, $1 char 0/1: ??, $2 char 2/3: ProdID, $3 char 4:VerMaj, $4 char 5:VerMin, $5 char 6/7:Variant +echo $PRODUCTNR | awk 'BEGIN{ FIELDWIDTHS = "2 2 1 1 2"} function sc(c) {return (c<128?c:(c-256))} {printf "%c%c%c%c%c%c%c%c%c%c%c%c",2,64,8,0 ,sc($3),0, sc($4),0, sc($5),0, sc($2),0 }' >> $CONFIGBLOCK_FILE +#fill to 32 bytes +awk 'function sc(c) {return (c<128?c:(c-256))} BEGIN{printf "%c%c%c%c",-1,-1,-1,-1}' >> $CONFIGBLOCK_FILE + +exit 0 diff --git a/recipes/images/files/library/genext3fs.sh b/recipes/images/files/library/genext3fs.sh new file mode 100755 index 0000000..3c8ecc8 --- /dev/null +++ b/recipes/images/files/library/genext3fs.sh @@ -0,0 +1,80 @@ +#!/bin/sh +#creates a file containing a ext3 binary blob of the content of the ../rootfs folder + +# sometimes we need the binary echo, not the shell builtin +ECHO=`which echo` + +MOUNTPOINT="mnt/trdx-rootfs" + +Usage() +{ + echo "creates a file containing a ext3 binary blob. Output file name taken from command line" + echo "Usage: genext3fs.sh [OPTION]... dest_file_name" + echo "-h : Prints this message" + echo "-b : Sets the partition size in MBytes, default 256" + echo "-d : Selects the directory which contains the partition content, default ../rootfs" + echo "" +} + +PARTITIONSIZE=256 +SRCPATH=../rootfs + +while getopts "b:d:h" Option ; do + case $Option in + h) Usage + # Exit if only usage (-h) was specfied. + if [[ "$#" -eq "1" ]] ; then + exit 10 + fi + exit 0 + ;; + b) PARTITIONSIZE=$OPTARG + ;; + d) SRCPATH=$OPTARG + ;; + esac +done +#adjust the commandline arg for the now used options +shift $(($OPTIND - 1)) + +#create the file used for the loopbackdevice and format it for ext3 +#answer y to "is not a block special device" +dd if=/dev/zero of=$@ bs=1024k count=$PARTITIONSIZE +mkfs.ext3 -F -L arm $@ +#disable fsck checks based on mount count or time interval +tune2fs -c 0 -i 0 $@ + +#prepare mountpoint for the loopdevice +sudo mkdir -p $MOUNTPOINT +sudo umount $MOUNTPOINT &> /dev/null +sudo rm -rf $MOUNTPOINT/* +#mount the file as a loopdevice +#there seems to be a race between mkfs.ext3 not yet finished and mount already trying to mount, so try until it works +MOUNTED=0 +while [ "$MOUNTED" -eq "0" ] ; do + sync + sleep 1 + sudo mount $@ $MOUNTPOINT/ -o loop -t ext3 + MOUNTED=`mount | grep -c "$MOUNTPOINT"` +done +#extract rootfs into the file +sudo cp -rpP $SRCPATH/* $MOUNTPOINT +if [ "$?" -ne "0" ] ; then + $ECHO -e "\033[1mCopying the rootfs failed.\033[0m" + echo "Check for error messages from cp" + sudo rm $@ + exit 1 +fi + +#unmount again +sudo umount $MOUNTPOINT + +#if the mounting was unsuccesful all rootfs data now still is in MOUNTPOINT, and $@ contains an empty fs +#delete $@ in that case to fail early +sync +FAILED=`ls $MOUNTPOINT | wc -l` +if [ "$FAILED" -ne "0" ] ; then + $ECHO -e "\033[1mMounting the loopdevice $@ failed.\033[0m" + sudo rm $@ + exit 1 +fi diff --git a/recipes/images/files/library/imx6/update.sh b/recipes/images/files/library/imx6/update.sh new file mode 100755 index 0000000..6f91728 --- /dev/null +++ b/recipes/images/files/library/imx6/update.sh @@ -0,0 +1,259 @@ +#!/bin/sh +# Prepare files needed for flashing a Apalis/Colibri iMX6 module +# +# inspired by meta-fsl-arm/classes/image_types_fsl.bbclass + +# sometimes we need the binary echo, not the shell builtin +ECHO=`which echo` +#some distros have fs tools only in root's path +PARTED=`which parted` 2> /dev/null +if [ -e "$PARTED" ] ; then + MKFSVFAT=`which mkfs.vfat` +else + PARTED=`sudo which parted` + MKFSVFAT=`sudo which mkfs.vfat` +fi + +Flash() +{ + echo "" + echo "To flash the Apalis/Colibri iMX6 module, boot the module to the U-Boot prompt and" + echo "" + echo "when using a SD-card, insert the SD-card and enter:" + echo "run setupdate" + echo "" + echo "when using tftp, connect Ethernet and enter:" + echo "tftp \$loadaddr flash_eth.img ; source \$loadaddr" + echo "" + echo "then enter to update all:" + echo "run update" + echo "" + echo "to update a single component enter one of:" + echo "run update_uboot" + echo "run update_kernel" + echo "" + echo "" + echo "If you don't have a working U-Boot anymore, connect your PC to the module's" + echo "USB client port, bring the module in the serial download mode and start" + echo "the update.sh script with the -d option. This will copy U-Boot into the" + echo "modules RAM and execute it." +} + +Usage() +{ + echo "" + echo "Prepares and copies files for flashing the internal eMMC of a Apalis/Colibri iMX6" + echo "" + echo "Will require a running U-Boot on the target. Either one already flashed" + echo "on the eMMC or one copied over usb into the module's RAM" + echo "" + echo "-d : use USB connection to copy and execute U-Boot to the module's RAM" + echo "-h : Prints this message" + echo "-o directory : output directory, defaults to /media/KERNEL" + echo " if this is on a SD card, it should be the" + echo " first partition formated with VFAT" + echo "" + echo "Example \"./update.sh\" copies the requiered files to /media/KERNEL/" + echo "Example \"./update.sh -o /srv/tftp/\" copies the requiered files to /srv/tftp/" + echo "" + echo "" + Flash +} + +#initialise options +UBOOT_RECOVERY=0 +OUT_DIR="/media/KERNEL" +MIN_PARTITION_FREE_SIZE=100 +ROOTFSPATH=rootfs +# No devicetree by default +KERNEL_DEVICETREE="" +KERNEL_IMAGETYPE="uImage" + +while getopts "dho:" Option ; do + case $Option in + d) UBOOT_RECOVERY=1 + ;; + h) Usage + # Exit if only usage (-h) was specfied. + if [ "$#" -eq 1 ] ; then + exit 10 + fi + exit 0 + ;; + o) OUT_DIR=$OPTARG + ;; + esac +done + +# autotect MODTYPE from from rootfs directory +CNT=`grep -ic "Colibri.iMX6" rootfs/etc/issue || true` +if [ "$CNT" -ge 1 ] ; then + echo "Colibri iMX6 rootfs detected" + MODTYPE=colibri-imx6 + IMAGEFILE=root.ext3 + U_BOOT_BINARY=u-boot.imx + KERNEL_DEVICETREE="imx6dl-colibri-eval-v3.dtb" + LOCPATH="imx_flash" + # eMMC size [in sectors of 512] + EMMC_SIZE=$(expr 1024 \* 3500 \* 2) +else + CNT=`grep -ic "imx6" rootfs/etc/issue || true` + if [ "$CNT" -ge 1 ] ; then + echo "Apalis iMX6 rootfs detected" + MODTYPE=apalis-imx6 + IMAGEFILE=root.ext3 + U_BOOT_BINARY=u-boot.imx + KERNEL_DEVICETREE="imx6q-apalis-eval.dtb imx6q-apalis-eval_v1_0.dtb" + LOCPATH="imx_flash" + # eMMC size [in sectors of 512] + EMMC_SIZE=$(expr 1024 \* 3500 \* 2) + else + echo "can not detect module type from ./rootfs/etc/issue" + echo "exiting" + exit 1 + fi +fi +BINARIES=${MODTYPE}_bin + +#is only U-Boot to be copied to RAM? +if [ "$UBOOT_RECOVERY" -ge 1 ] ; then + cd ${LOCPATH} + sudo ./imx_usb ../${BINARIES}/${U_BOOT_BINARY} + exit 1 +fi + +# is OUT_DIR an existing directory? +if [ ! -d "$OUT_DIR" ] ; then + echo "$OUT_DIR" "does not exist, exiting" + exit 1 +fi + +#sanity check for correct untared rootfs +DEV_OWNER=`ls -ld rootfs/dev | awk '{print $3}'` +if [ "${DEV_OWNER}x" != "rootx" ] +then + $ECHO -e "rootfs/dev is not owned by root, but it should!" + $ECHO -e "\033[1mPlease unpack the tarball with root rights.\033[0m" + $ECHO -e "e.g. sudo tar xjvf Apalis_iMX6_LinuxImageV2.1_20140201.tar.bz2" + exit 1 +fi + +#sanity check for existens of U-Boot and kernel +[ -e ${BINARIES}/${U_BOOT_BINARY} ] || { echo "${BINARIES}/${U_BOOT_BINARY} does not exist"; exit 1; } +[ -e ${BINARIES}/uImage ] || { echo "${BINARIES}/uImage does not exist"; exit 1; } + +#sanity check for some programs +MCOPY=`sudo which mcopy` +[ "${MCOPY}x" != "x" ] || { echo >&2 "Program mcopy not available. Aborting."; exit 1; } +sudo ${PARTED} -v >/dev/null 2>&1 || { echo >&2 "Program parted not available. Aborting."; exit 1; } +[ "${MKFSVFAT}x" != "x" ] || { echo >&2 "Program mkfs.vfat not available. Aborting."; exit 1; } +MKFSEXT3=`sudo which mkfs.ext3` +[ "${MKFSEXT3}x" != "x" ] || { echo >&2 "Program mkfs.ext3 not available. Aborting."; exit 1; } +awk -V >/dev/null 2>&1 || { echo >&2 "Program awk not available. Aborting."; exit 1; } +dd --help >/dev/null 2>&1 || { echo >&2 "Program dd not available. Aborting."; exit 1; } + +#make the directory with the outputfiles writable +sudo chown $USER: ${BINARIES} + +#make a file with the used versions for U-Boot, kernel and rootfs +rm ${BINARIES}/versions.txt +touch ${BINARIES}/versions.txt +echo "Component Versions" > ${BINARIES}/versions.txt +basename "`readlink -e ${BINARIES}/${U_BOOT_BINARY}`" >> ${BINARIES}/versions.txt +basename "`readlink -e ${BINARIES}/uImage`" >> ${BINARIES}/versions.txt +$ECHO -n "Rootfs " >> ${BINARIES}/versions.txt +grep -i imx6 rootfs/etc/issue >> ${BINARIES}/versions.txt + + +# The emmc layout used is: +# +# user area aka general purpose eMMC region: +# +# 0 -> IMAGE_ROOTFS_ALIGNMENT - reserved to bootloader (not partitioned) +# IMAGE_ROOTFS_ALIGNMENT -> BOOT_SPACE - kernel and other data +# BOOT_SPACE -> SDIMG_SIZE - rootfs +# +# Default Free space = 1.3x +# Use IMAGE_OVERHEAD_FACTOR to add more space +# <---------> +# 4MiB 16MiB SDIMG_ROOTFS 4MiB +# <-----------------------> <----------> <----------------------> <------------------------------> +# ------------------------ ------------ ------------------------ ------------------------------- +# | IMAGE_ROOTFS_ALIGNMENT | BOOT_SPACE | ROOTFS_SIZE | IMAGE_ROOTFS_ALIGNMENT | +# ------------------------ ------------ ------------------------ ------------------------------- +# ^ ^ ^ ^ ^ +# | | | | | +# 0 4096 4MiB + 16MiB 4MiB + 16Mib + SDIMG_ROOTFS 4MiB + 16MiB + SDIMG_ROOTFS + 4MiB +# +# with U-Boot at 1024, the U-Boot environment at 512 * 1024, the config block is at 640 * 1024 + + +# Boot partition [in sectors of 512] +BOOT_START=$(expr 4096 \* 2) +# Rootfs partition [in sectors of 512] +ROOTFS_START=$(expr 20480 \* 2) +# Boot partition volume id +BOOTDD_VOLUME_ID="Boot" + +#make the partition size size(rootfs used + MIN_PARTITION_FREE_SIZE) +#add about 4% to the rootfs to account for fs overhead. (/1024/985 instead of /1024/1024). +#add 512 bytes per file to account for small files +NUMBER_OF_FILES=`sudo find ${ROOTFSPATH} | wc -l` +EXT_SIZE=`sudo du -DsB1 ${ROOTFSPATH} | awk -v min=$MIN_PARTITION_FREE_SIZE -v f=${NUMBER_OF_FILES} \ + '{rootfs_size=$1+f*512;rootfs_size=int(rootfs_size/1024/985); print (rootfs_size+min) }'` + +echo "" +echo "Creating MBR file and do the partitioning" +# Initialize a sparse file +dd if=/dev/zero of=${BINARIES}/mbr.bin bs=512 count=0 seek=${EMMC_SIZE} +${PARTED} -s ${BINARIES}/mbr.bin mklabel msdos +${PARTED} -a none -s ${BINARIES}/mbr.bin unit s mkpart primary fat32 ${BOOT_START} $(expr ${ROOTFS_START} - 1 ) +# the partition spans to the end of the disk, even though the fs size will be smaller +# on the target the fs is then grown to the full size +${PARTED} -a none -s ${BINARIES}/mbr.bin unit s mkpart primary ext2 ${ROOTFS_START} $(expr ${EMMC_SIZE} \- ${ROOTFS_START} \- 1) +${PARTED} -s ${BINARIES}/mbr.bin unit s print +# get the size of the VFAT partition +BOOT_BLOCKS=$(LC_ALL=C ${PARTED} -s ${BINARIES}/mbr.bin unit b print \ + | awk '/ 1 / { print int(substr($4, 1, length($4 -1)) / 1024) }') +# now crop the file to only the MBR size +IMG_SIZE=512 +truncate -s $IMG_SIZE ${BINARIES}/mbr.bin + + +echo "" +echo "Creating VFAT partion image with the kernel" +rm -f ${BINARIES}/boot.vfat +${MKFSVFAT} -n "${BOOTDD_VOLUME_ID}" -S 512 -C ${BINARIES}/boot.vfat $BOOT_BLOCKS +export MTOOLS_SKIP_CHECK=1 +mcopy -i ${BINARIES}/boot.vfat -s ${BINARIES}/uImage ::/uImage + +# Copy device tree file +COPIED=false +if test -n "${KERNEL_DEVICETREE}"; then + for DTS_FILE in ${KERNEL_DEVICETREE}; do + DTS_BASE_NAME=`basename ${DTS_FILE} | awk -F "." '{print $1}'` + if [ -e "${BINARIES}/${KERNEL_IMAGETYPE}-${DTS_BASE_NAME}.dtb" ]; then + kernel_bin="`readlink ${BINARIES}/${KERNEL_IMAGETYPE}`" + kernel_bin_for_dtb="`readlink ${BINARIES}/${KERNEL_IMAGETYPE}-${DTS_BASE_NAME}.dtb | sed "s,$DTS_BASE_NAME,${MODTYPE},g;s,\.dtb$,.bin,g"`" + if [ "$kernel_bin" = "$kernel_bin_for_dtb" ]; then + mcopy -i ${BINARIES}/boot.vfat -s ${BINARIES}/${DEPLOY_DIR_IMAGE}/${KERNEL_IMAGETYPE}-${DTS_BASE_NAME}.dtb ::/${DTS_BASE_NAME}.dtb + #copy also to out_dir + sudo cp ${BINARIES}/${DEPLOY_DIR_IMAGE}/${KERNEL_IMAGETYPE}-${DTS_BASE_NAME}.dtb "$OUT_DIR/${DTS_BASE_NAME}.dtb" + COPIED=true + fi + fi + done + [ $COPIED = true ] || { echo "Did not find the devicetrees from KERNEL_DEVICETREE, ${KERNEL_DEVICETREE}. Aborting."; exit 1; } +fi + +echo "" +echo "Creating rootfs partion image" +rm -f ${BINARIES}/${IMAGEFILE} +sudo $LOCPATH/genext3fs.sh -d rootfs -b ${EXT_SIZE} ${BINARIES}/${IMAGEFILE} || exit 1 + + +#copy to $OUT_DIR +sudo cp ${BINARIES}/configblock.bin ${BINARIES}/${U_BOOT_BINARY} ${BINARIES}/uImage ${BINARIES}/mbr.bin ${BINARIES}/boot.vfat ${BINARIES}/${IMAGEFILE} ${BINARIES}/flash*.img ${BINARIES}/versions.txt "$OUT_DIR" +sync + +Flash diff --git a/recipes/images/files/library/mk-u-boot-scripts.sh b/recipes/images/files/library/mk-u-boot-scripts.sh new file mode 100755 index 0000000..2a4e898 --- /dev/null +++ b/recipes/images/files/library/mk-u-boot-scripts.sh @@ -0,0 +1,5 @@ +#!/bin/sh +for f in *.scr +do + mkimage -T script -C none -n 'Flash Apalis iMX6' -d $f `basename $f .scr`.img +done diff --git a/recipes/images/files/library/t30/update.sh b/recipes/images/files/library/t30/update.sh new file mode 100755 index 0000000..21b4ac6 --- /dev/null +++ b/recipes/images/files/library/t30/update.sh @@ -0,0 +1,273 @@ +#!/bin/sh +# Prepare files needed for flashing a Apalis/Colibri T30 module +# +# inspired by meta-fsl-arm/classes/image_types_fsl.bbclass + +# sometimes we need the binary echo, not the shell builtin +ECHO=`which echo` +#some distros have fs tools only in root's path +PARTED=`which parted` 2> /dev/null +if [ -e "$PARTED" ] ; then + MKFSVFAT=`which mkfs.vfat` +else + PARTED=`sudo which parted` + MKFSVFAT=`sudo which mkfs.vfat` +fi + +Flash() +{ + echo "" + echo "To flash the Apalis/Colibri T30 module, boot the module to the U-Boot prompt and" + echo "" + echo "when using a SD-card, insert the SD-card and enter:" + echo "run setupdate" + echo "" + echo "when using tftp, connect Ethernet and enter:" + echo "tftp \$loadaddr flash_eth.img ; source \$loadaddr" + echo "" + echo "then enter to update all:" + echo "run update" + echo "" + echo "to update a single component enter one of:" + echo "run update_uboot" + echo "run update_kernel" + echo "" + echo "" + echo "If you don't have a working U-Boot anymore, connect your PC to the module's" + echo "USB client port, bring the module in the serial download mode and start" + echo "the update.sh script with the -d option. This will copy U-Boot into the" + echo "modules RAM and execute it." +} + +Usage() +{ + echo "" + echo "Prepares and copies files for flashing the internal eMMC of a Apalis/Colibri T30" + echo "" + echo "Will require a running U-Boot on the target. Either one already flashed" + echo "on the eMMC or one copied over usb into the module's RAM" + echo "" + echo "-d : use USB connection to copy and execute U-Boot to the module's RAM" + echo "-h : Prints this message" + echo "-o directory : output directory, defaults to /media/KERNEL" + echo " if this is on a SD card, it should be the" + echo " first partition formated with VFAT" + echo "" + echo "Example \"./update.sh\" copies the requiered files to /media/KERNEL/" + echo "Example \"./update.sh -o /srv/tftp/\" copies the requiered files to /srv/tftp/" + echo "" + echo "" + Flash +} + +#initialise options +UBOOT_RECOVERY=0 +OUT_DIR="/media/KERNEL" +MIN_PARTITION_FREE_SIZE=100 +ROOTFSPATH=rootfs +# No devicetree by default +KERNEL_DEVICETREE="" +KERNEL_IMAGETYPE="uImage" + +while getopts "dho:" Option ; do + case $Option in + d) UBOOT_RECOVERY=1 + ;; + h) Usage + # Exit if only usage (-h) was specfied. + if [ "$#" -eq 1 ] ; then + exit 10 + fi + exit 0 + ;; + o) OUT_DIR=$OPTARG + ;; + esac +done + +# autotect MODTYPE from from rootfs directory +CNT=`grep -ic "t30" rootfs/etc/issue || true` +if [ "$CNT" -ge 1 ] ; then + CNT=`grep -ic "apalis" rootfs/etc/issue || true` + if [ "$CNT" -ge 1 ] ; then + echo "Apalis T30 rootfs detected" + MODTYPE=apalis-t30 + IMAGEFILE=root.ext3 + U_BOOT_BINARY=u-boot-dtb-tegra.bin + KERNEL_DEVICETREE="tegra30-apalis-eval.dtb" + LOCPATH="tegra-uboot-flasher" + # eMMC size [in sectors of 512] + EMMC_SIZE=$(expr 1024 \* 3500 \* 2) + BCT=apalis_t30_12MHz_MT41K512M8RH-125_533MHz.bct + CBOOT_IMAGE=apalis_t30.img + else + echo "Colibri T30 rootfs detected" + MODTYPE=colibri-t30 + IMAGEFILE=root.ext3 + U_BOOT_BINARY=u-boot-dtb-tegra.bin + KERNEL_DEVICETREE="tegra30-colibri-eval-v3.dtb" + LOCPATH="tegra-uboot-flasher" + EMMC_SIZE=$(expr 1024 \* 2000 \* 2) + # with new kernel, boot with 400MHz, then switch between 400 & 800 + BCT=colibri_t30_12MHz_NT5CC256M16CP-DI_400MHz.bct +# BCT=colibri_t30_12MHz_NT5CC256M16CP-DI_533MHz.bct + CBOOT_IMAGE=colibri_t30.img + fi +else + echo "can not detect module type from ./rootfs/etc/issue" + echo "exiting" + exit 1 +fi +BINARIES=${MODTYPE}_bin + +#is only U-Boot to be copied to RAM? +if [ "$UBOOT_RECOVERY" -ge 1 ] ; then + cd ${LOCPATH} + sudo ./tegrarcm --bct=../${BINARIES}/${BCT} --bootloader=../${BINARIES}/${U_BOOT_BINARY} --loadaddr=0x80108000 + exit 1 +fi + +# is OUT_DIR an existing directory? +if [ ! -d "$OUT_DIR" ] ; then + echo "$OUT_DIR" "does not exist, exiting" + exit 1 +fi + +#sanity check for correct untared rootfs +DEV_OWNER=`ls -ld rootfs/dev | awk '{print $3}'` +if [ "${DEV_OWNER}x" != "rootx" ] +then + $ECHO -e "rootfs/dev is not owned by root, but it should!" + $ECHO -e "\033[1mPlease unpack the tarball with root rights.\033[0m" + $ECHO -e "e.g. sudo tar xjvf Apalis_T30_LinuxImageV2.1_20140201.tar.bz2" + exit 1 +fi + +#sanity check for existens of U-Boot and kernel +[ -e ${BINARIES}/${U_BOOT_BINARY} ] || { echo "${BINARIES}/${U_BOOT_BINARY} does not exist"; exit 1; } +[ -e ${BINARIES}/uImage ] || { echo "${BINARIES}/uImage does not exist"; exit 1; } + +#sanity check for some programs +MCOPY=`sudo which mcopy` +[ "${MCOPY}x" != "x" ] || { echo >&2 "Program mcopy not available. Aborting."; exit 1; } +sudo ${PARTED} -v >/dev/null 2>&1 || { echo >&2 "Program parted not available. Aborting."; exit 1; } +[ "${MKFSVFAT}x" != "x" ] || { echo >&2 "Program mkfs.vfat not available. Aborting."; exit 1; } +MKFSEXT3=`sudo which mkfs.ext3` +[ "${MKFSEXT3}x" != "x" ] || { echo >&2 "Program mkfs.ext3 not available. Aborting."; exit 1; } +awk -V >/dev/null 2>&1 || { echo >&2 "Program awk not available. Aborting."; exit 1; } +dd --help >/dev/null 2>&1 || { echo >&2 "Program dd not available. Aborting."; exit 1; } +tegra-uboot-flasher/cbootimage -h >/dev/null 2>&1 +[ "$?" -lt 2 ] || { echo >&2 "Program cbootimage not available. 32bit compatibility libs? Aborting."; exit 1; } + +#make the directory with the outputfiles writable +sudo chown $USER: ${BINARIES} + +#make a file with the used versions for U-Boot, kernel and rootfs +rm ${BINARIES}/versions.txt +touch ${BINARIES}/versions.txt +echo "Component Versions" > ${BINARIES}/versions.txt +basename "`readlink -e ${BINARIES}/${U_BOOT_BINARY}`" >> ${BINARIES}/versions.txt +basename "`readlink -e ${BINARIES}/uImage`" >> ${BINARIES}/versions.txt +$ECHO -n "Rootfs " >> ${BINARIES}/versions.txt +grep -i t30 rootfs/etc/issue >> ${BINARIES}/versions.txt + + +# The emmc layout used is: +# +# boot area partition 1 aka eMMC boot sector: +# +# with cbootimage containing BCT and U-Boot boot loader +# +# user area aka general purpose eMMC region: +# +# 0 -> IMAGE_ROOTFS_ALIGNMENT - reserved to bootloader (not partitioned) +# IMAGE_ROOTFS_ALIGNMENT -> BOOT_SPACE - kernel and other data +# BOOT_SPACE -> SDIMG_SIZE - rootfs +# +# Default Free space = 1.3x +# Use IMAGE_OVERHEAD_FACTOR to add more space +# <---------> +# 4MiB 16MiB SDIMG_ROOTFS 4MiB +# <-----------------------> <----------> <----------------------> <------------------------------> +# ------------------------ ------------ ------------------------ ------------------------------- +# | IMAGE_ROOTFS_ALIGNMENT | BOOT_SPACE | ROOTFS_SIZE | IMAGE_ROOTFS_ALIGNMENT | +# ------------------------ ------------ ------------------------ ------------------------------- +# ^ ^ ^ ^ ^ +# | | | | | +# 0 4096 4MiB + 16MiB 4MiB + 16Mib + SDIMG_ROOTFS 4MiB + 16MiB + SDIMG_ROOTFS + 4MiB +# +# with the U-Boot environment at 512 * 1024, the config block is at 640 * 1024 + + +# generate cbootimage containing BCT and U-Boot boot loader +cd ${BINARIES} +sudo ../${LOCPATH}/cbootimage -s tegra30 ${CBOOT_IMAGE}.cfg ${CBOOT_IMAGE} +cd .. + + +# Boot partition [in sectors of 512] +BOOT_START=$(expr 4096 \* 2) +# Rootfs partition [in sectors of 512] +ROOTFS_START=$(expr 20480 \* 2) +# Boot partition volume id +BOOTDD_VOLUME_ID="Boot" + +#make the partition size size(rootfs used + MIN_PARTITION_FREE_SIZE) +#add about 4% to the rootfs to account for fs overhead. (/1024/985 instead of /1024/1024). +#add 512 bytes per file to account for small files +NUMBER_OF_FILES=`sudo find ${ROOTFSPATH} | wc -l` +EXT_SIZE=`sudo du -DsB1 ${ROOTFSPATH} | awk -v min=$MIN_PARTITION_FREE_SIZE -v f=${NUMBER_OF_FILES} \ + '{rootfs_size=$1+f*512;rootfs_size=int(rootfs_size/1024/985); print (rootfs_size+min) }'` + +echo "" +echo "Creating MBR file and do the partitioning" +# Initialize a sparse file +dd if=/dev/zero of=${BINARIES}/mbr.bin bs=512 count=0 seek=${EMMC_SIZE} +${PARTED} -s ${BINARIES}/mbr.bin mklabel msdos +${PARTED} -a none -s ${BINARIES}/mbr.bin unit s mkpart primary fat32 ${BOOT_START} $(expr ${ROOTFS_START} - 1 ) +# the partition spans to the end of the disk, even though the fs size will be smaller +# on the target the fs is then grown to the full size +${PARTED} -a none -s ${BINARIES}/mbr.bin unit s mkpart primary ext2 ${ROOTFS_START} $(expr ${EMMC_SIZE} \- ${ROOTFS_START} \- 1) +${PARTED} -s ${BINARIES}/mbr.bin unit s print +# get the size of the VFAT partition +BOOT_BLOCKS=$(LC_ALL=C ${PARTED} -s ${BINARIES}/mbr.bin unit b print \ + | awk '/ 1 / { print int(substr($4, 1, length($4 -1)) / 1024) }') +# now crop the file to only the MBR size +IMG_SIZE=512 +truncate -s $IMG_SIZE ${BINARIES}/mbr.bin + + +echo "" +echo "Creating VFAT partion image with the kernel" +rm -f ${BINARIES}/boot.vfat +${MKFSVFAT} -n "${BOOTDD_VOLUME_ID}" -S 512 -C ${BINARIES}/boot.vfat $BOOT_BLOCKS +export MTOOLS_SKIP_CHECK=1 +mcopy -i ${BINARIES}/boot.vfat -s ${BINARIES}/uImage ::/uImage + +# Copy device tree file +if test -n "${KERNEL_DEVICETREE}"; then + for DTS_FILE in ${KERNEL_DEVICETREE}; do + DTS_BASE_NAME=`basename ${DTS_FILE} | awk -F "." '{print $1}'` + if [ -e "${BINARIES}/${KERNEL_IMAGETYPE}-${DTS_BASE_NAME}.dtb" ]; then + kernel_bin="`readlink ${BINARIES}/${KERNEL_IMAGETYPE}`" + kernel_bin_for_dtb="`readlink ${BINARIES}/${KERNEL_IMAGETYPE}-${DTS_BASE_NAME}.dtb | sed "s,$DTS_BASE_NAME,${MODTYPE},g;s,\.dtb$,.bin,g"`" + if [ "$kernel_bin" = "$kernel_bin_for_dtb" ]; then + mcopy -i ${BINARIES}/boot.vfat -s ${BINARIES}/${DEPLOY_DIR_IMAGE}/${KERNEL_IMAGETYPE}-${DTS_BASE_NAME}.dtb ::/${DTS_BASE_NAME}.dtb + #copy also to out_dir + sudo cp ${BINARIES}/${DEPLOY_DIR_IMAGE}/${KERNEL_IMAGETYPE}-${DTS_BASE_NAME}.dtb "$OUT_DIR/${DTS_BASE_NAME}.dtb" + fi + fi + done +fi + +echo "" +echo "Creating rootfs partion image" +rm -f ${BINARIES}/${IMAGEFILE} +sudo $LOCPATH/genext3fs.sh -d rootfs -b ${EXT_SIZE} ${BINARIES}/${IMAGEFILE} || exit 1 + + +#copy to $OUT_DIR +sudo cp ${BINARIES}/configblock.bin ${BINARIES}/${CBOOT_IMAGE} ${BINARIES}/uImage ${BINARIES}/mbr.bin ${BINARIES}/boot.vfat ${BINARIES}/${IMAGEFILE} ${BINARIES}/flash*.img ${BINARIES}/versions.txt "$OUT_DIR" +sync + +Flash diff --git a/recipes/images/trdx-image-fstype.inc b/recipes/images/trdx-image-fstype.inc index 6a6b0a9..2868bbb 100644 --- a/recipes/images/trdx-image-fstype.inc +++ b/recipes/images/trdx-image-fstype.inc @@ -74,7 +74,7 @@ imagedeploy_kernel_vf() { fakeroot do_imagedeploy() { cd ${WORKDIR} - cp -pPr ${BURNFLASH}/* ${IMAGE_NAME}${PV}/ + cp -pLr ${BURNFLASH}/* ${IMAGE_NAME}${PV}/ imagedeploy_kernel |