diff --git a/recipes-devtools/sdcard-raw-tools/sdcard-raw-tools.bb b/recipes-devtools/sdcard-raw-tools/sdcard-raw-tools.bb new file mode 100644 index 0000000..fe1e7a7 --- /dev/null +++ b/recipes-devtools/sdcard-raw-tools/sdcard-raw-tools.bb @@ -0,0 +1,27 @@ +# Copyright (C) 2017, STMicroelectronics - All Rights Reserved +# Released under the MIT license (see COPYING.MIT for the terms) + +DESCRIPTION = "script for creating raw SDCARD image ready to flash" +LICENSE = "MIT" +LIC_FILES_CHKSUM = "file://${COREBASE}/meta/files/common-licenses/MIT;md5=0835ade698e0bcf8506ecda2f7b4f302" + +SRC_URI = "file://create_sdcard_from_flashlayout.sh" + +BBCLASSEXTEND = "native nativesdk" + +RRECOMMENDS_${PN}_append_class-nativesdk = "nativesdk-gptfdisk" + +inherit deploy + +SCRIPT_DEPLOYDIR ?= "scripts" + +do_install() { + install -d ${D}/${bindir} + install -m 0755 ${WORKDIR}/create_sdcard_from_flashlayout.sh ${D}/${bindir} +} + +do_deploy() { + install -d ${DEPLOYDIR}/${SCRIPT_DEPLOYDIR} + install -m 0755 ${WORKDIR}/create_sdcard_from_flashlayout.sh ${DEPLOYDIR}/${SCRIPT_DEPLOYDIR}/ +} +addtask deploy before do_build after do_compile diff --git a/recipes-devtools/sdcard-raw-tools/sdcard-raw-tools/create_sdcard_from_flashlayout.sh b/recipes-devtools/sdcard-raw-tools/sdcard-raw-tools/create_sdcard_from_flashlayout.sh new file mode 100755 index 0000000..84712fa --- /dev/null +++ b/recipes-devtools/sdcard-raw-tools/sdcard-raw-tools/create_sdcard_from_flashlayout.sh @@ -0,0 +1,837 @@ +#!/bin/bash - +#=============================================================================== +# +# FILE: create_sdcard_from_flashlayout.sh +# +# USAGE: ./create_sdcard_from_flashlayout.sh +# +# DESCRIPTION: generate raw image with information from flash layout +# +# SPDX-License-Identifier: MIT +# AUTHOR: Christophe Priouzeau (christophe.priouzeau@st.com), +# ORGANIZATION: STMicroelectronics +# COPYRIGHT: Copyright (C) 2017, STMicroelectronics - All Rights Reserved +# CREATED: 11/22/2017 15:03 +# REVISION: --- +#=============================================================================== +#TODO: Pre-requisite tools +# sgdisk +# du +# dd + +unset FLASHLAYOUT_data +unset FLASHLAYOUT_filename +unset FLASHLAYOUT_rawname +unset FLASHLAYOUT_filename_path +unset FLASHLAYOUT_prefix_image_path +unset FLASHLAYOUT_number_of_line + +declare -A FLASHLAYOUT_data + +SDCARD_TOKEN=mmc0 + +# Size of 2GB +#DEFAULT_RAW_SIZE=2048 +# Size of 1.5GB +DEFAULT_RAW_SIZE=1536 + +# size of 768MB +DEFAULT_ROOTFS_PARTITION_SIZE=768432 +# size of 1024MB +#DEFAULT_ROOTFS_PARTITION_SIZE=1232896 + + +# 32 MB of Padding on B +DEFAULT_PADDING_SIZE=33554432 + +# Columns name on FLASHLAYOUT_data +COL_SELECTED_OPT=0 +COL_PARTID=1 +COL_PARTNAME=2 +COL_PARTYPE=3 +COL_IP=4 +COL_OFFSET=5 +COL_BIN2FLASH=6 +COL_BIN2BOOT=7 + +# SELECTED/OPT variable meaning: +# - : boot stage +# P: programme +# E: erase +# D: delete + +WARNING_TEXT="" + +usage() { + echo "Usage: $0 " + exit 0 +} + +debug() { + if [ $DEBUG ]; + then + echo "" + echo "[DEBUG]: $@" + fi +} + +function exec_print() { + if [ $DEBUG ]; + then + echo "" + echo "[DEBUG]: $@" + $@ + else + $@ 2> /dev/null > /dev/null + fi +} + +# Read Flash Layout file and put information on array: FLASHLAYOUT_data +function read_flash_layout() { + local i=0 + declare -a flashlayout_data # Create an indexed array (necessary for the read command). + FLASHLAYOUT_number_of_line=$(wc -l "$FLASHLAYOUT_filename" | cut -sf 1 -d ' ') + debug "Number of line: $FLASHLAYOUT_number_of_line" + while read -ra flashlayout_data; do + selected=${flashlayout_data[0]} + if [ "$selected" == "P" ] || [ "$selected" == "E" ]; + then + # Selected= + FLASHLAYOUT_data[$i,$COL_SELECTED_OPT]=${flashlayout_data[0]} + # PartId + FLASHLAYOUT_data[$i,$COL_PARTID]=${flashlayout_data[1]} + #PartName + FLASHLAYOUT_data[$i,$COL_PARTNAME]=${flashlayout_data[2]} + #PartType + FLASHLAYOUT_data[$i,$COL_PARTYPE]=${flashlayout_data[3]} + #IP + FLASHLAYOUT_data[$i,$COL_IP]=${flashlayout_data[4]} + #Offset + FLASHLAYOUT_data[$i,$COL_OFFSET]=${flashlayout_data[5]} + #Bin2flash + FLASHLAYOUT_data[$i,$COL_BIN2FLASH]=${flashlayout_data[6]} + #Bin2boot + FLASHLAYOUT_data[$i,$COL_BIN2BOOT]=${flashlayout_data[7]} + + i=$(($i+1)) + + debug "READ: ${flashlayout_data[0]} ${flashlayout_data[1]} ${flashlayout_data[2]} ${flashlayout_data[3]} ..." + fi + done < "$FLASHLAYOUT_filename" + + FLASHLAYOUT_number_of_line=$i +} + +function debug_dump_flashlayout_data_array() { + columns=8 + for ((i=0;i +function move_partition_offset() { + ind=$1 + new_offset=$2 + offset_hexa=$(printf "%x\n" $new_offset) + + for ((k=$ind;k> $FLASHLAYOUT_infoname + fi + fi + done + echo "=" >> $FLASHLAYOUT_infoname + + #empty line + for ((i=0;i> $FLASHLAYOUT_infoname + # part name + for ((i=0;i> $FLASHLAYOUT_infoname + fi + fi + done + echo "=" >> $FLASHLAYOUT_infoname + #empty + for ((i=0;i> $FLASHLAYOUT_infoname + # partition number + for ((i=0;i> $FLASHLAYOUT_infoname + j=$(($j+1)) + fi + fi + done + echo "=" >> $FLASHLAYOUT_infoname + j=1 + for ((i=0;i> $FLASHLAYOUT_infoname + j=$(($j+1)) + fi + fi + done + echo "=" >> $FLASHLAYOUT_infoname + for ((i=0;i> $FLASHLAYOUT_infoname + for ((i=0;i> $FLASHLAYOUT_infoname + fi + fi + done + echo "=" >> $FLASHLAYOUT_infoname + # print legend of partition + j=1 + for ((i=0;i> $FLASHLAYOUT_infoname + echo " Device: /dev/mmcblk0p$j" >> $FLASHLAYOUT_infoname + echo " Label: $partName" >> $FLASHLAYOUT_infoname + if [ -n "$bin2flash" ]; + then + echo " Image: $bin2flash" >> $FLASHLAYOUT_infoname + else + echo " Image:" >> $FLASHLAYOUT_infoname + fi + j=$(($j+1)) + fi + fi + done +} + +function print_populate_on_infofile() { + local j=1 + for ((i=0;i> $FLASHLAYOUT_infoname + echo " dd if=$bin2flash of=/dev/mmcblk0p$j bs=1M conv=fdatasync status=progress" >> $FLASHLAYOUT_infoname + echo "" >> $FLASHLAYOUT_infoname + j=$(($j+1)) + fi + if [ "$selected" == "E" ]; + then + echo "- Populate partition $partName (/dev/mmcblk0p$j)" >> $FLASHLAYOUT_infoname + if [ -n "$bin2flash" ]; + then + echo " dd if=$bin2flash of=/dev/mmcblk0p$j bs=1M conv=fdatasync status=progress" >> $FLASHLAYOUT_infoname + else + echo " dd if= of=/dev/mmcblk0p$j bs=1M conv=fdatasync status=progress" >> $FLASHLAYOUT_infoname + fi + echo "" >> $FLASHLAYOUT_infoname + j=$(($j+1)) + fi + fi + done +} + +function create_info() { + +cat > $FLASHLAYOUT_infoname << EOF +This file describe How to update manually the partition of SDCARD: +1. SDCARD schema of partition +2. How to populate each partition +3. How to update the kernel/devicetree + +1. SDCARD schema of partition: +------------------------------ + +EOF +print_shema_on_infofile + +cat >> $FLASHLAYOUT_infoname << EOF + +2. How to populate each partition +--------------------------------- +EOF + +print_populate_on_infofile + +cat >> $FLASHLAYOUT_infoname << EOF + +3. How to update the kernel/devicetree +-------------------------------------- +The kernel and devicetree are present on "bootfs" partition. +To change kernel and devicetree, you can copy the file on this partitions: +- plug SDCARD on your PC +- copy kernel uImage on SDCARD + sudo cp uImage /media/\$USER/bootfs/ +- copy devicetree uImage on SDCARD + sudo cp stm32mp1*.dtb /media/\$USER/bootfs/ +- umount partitions of SDCARD + sudo umount /media/\$USER/bootfs/ + (dont't forget to umount the other partitions of SDCARD: + sudo umount \`lsblk --list | grep mmcblk0 | grep part | gawk '{ print \$7 }' | tr '\\n' ' '\` + ) + +EOF + +} +# ---------------------------------------- +# ---------------------------------------- + +function print_info() { + echo "" + echo "###########################################################################" + echo "###########################################################################" + echo "" + echo "RAW IMAGE generated: $FLASHLAYOUT_rawname" + echo "" + echo "WARNING: before to use the command dd, please umount all the partitions" + echo " associated to SDCARD." + echo " sudo umount \`lsblk --list | grep mmcblk0 | grep part | gawk '{ print \$7 }' | tr '\\n' ' '\`" + echo "" + echo "To put this raw image on sdcard:" + echo " sudo dd if=$FLASHLAYOUT_rawname of=/dev/mmcblk0 bs=8M conv=fdatasync status=progress" + echo "" + echo "(mmcblk0 can be replaced by:" + echo " sdX if it's a device dedicated to receive the raw image " + echo " (where X can be a, b, c, d, e)" + echo "" + echo "###########################################################################" + echo "###########################################################################" +} + +function print_warning() { + if [ -n "$WARNING_TEXT" ]; + then + echo "" + echo "???????????????????????????????????????????????????????????????????????????" + echo "???????????????????????????????????????????????????????????????????????????" + for t in "`echo $WARNING_TEXT | tr '#' '\n'`"; + do + echo "$t" + done + echo "[WARNING]: IT'S POSSIBLE, THE BOARD DOES NOT BOOT CORRECTLY DUE TO " + echo " FILE(s) NOT PRESENT." + echo "???????????????????????????????????????????????????????????????????????????" + echo "???????????????????????????????????????????????????????????????????????????" + fi +} + +function usage() { + echo "" + echo "Help:" + echo " $0 " + echo "" + exit 1 +} +# ------------------ +# Main +# ------------------ +# check opt args +if [ $# -ne 1 ]; +then + echo "[ERROR]: bad number of parameters" + echo "" + usage +else + FLASHLAYOUT_filename=$1 + FLASHLAYOUT_filename_path=$(dirname $FLASHLAYOUT_filename) + FLASHLAYOUT_filename_name=$(basename $FLASHLAYOUT_filename) + FLASHLAYOUT_dirname=$(basename $FLASHLAYOUT_filename_path) + + _extension="${FLASHLAYOUT_filename##*.}" + if [ ! "$_extension" == "tsv" ]; + then + echo "" + echo "[ERROR]: bad extension of Flashlayout file." + echo "[ERROR]: the flashlayout must have a tsv extension." + usage + fi + # File have a correct extension + # + if echo $FLASHLAYOUT_dirname | grep -q flashlayout + then + # add directory name as prefix for raw image + new_filename=$(echo "$FLASHLAYOUT_dirname/$FLASHLAYOUT_filename_name" | sed -e "s|/|_|g") + filename_for_raw_to_use="$FLASHLAYOUT_filename_path/$new_filename" + else + filename_for_raw_to_use=$FLASHLAYOUT_filename + fi + FLASHLAYOUT_rawname=$(basename $filename_for_raw_to_use | sed -e "s/tsv/raw/") + FLASHLAYOUT_infoname=$(basename $filename_for_raw_to_use | sed -e "s/tsv/how_to_update.txt/") + + # check if flashlayout have sdcard name + if [ $(grep -i $SDCARD_TOKEN $FLASHLAYOUT_filename| wc -l) -eq 0 ]; + then + echo "" + echo "[WARNING]: THE FLASHLAYOUT NAME DOES NOT CONTAINS SDCARD REFERENCE." + echo "[WARNING]: SDCARD TYPE = $SDCARD_TOKEN" + echo "[WARNING]: FILE=$FLASHLAYOUT_filename" + echo "Terminated without generated raw file." + exit 0 + fi + + read_flash_layout + #debug_dump_flashlayout_data_array + get_last_image_path + + #put the raw image generate near the binaries images + FLASHLAYOUT_rawname=$FLASHLAYOUT_prefix_image_path/$FLASHLAYOUT_rawname + FLASHLAYOUT_infoname=$FLASHLAYOUT_prefix_image_path/$FLASHLAYOUT_infoname + + # erase previous raw image + if [ -f $FLASHLAYOUT_rawname ]; + then + echo "" + echo "[WARNING]: A previous raw image are present on this directory" + echo "[WARNING]: $FLASHLAYOUT_rawname" + echo "[WARNING]: would you like to erase it: [Y/n]" + read answer + if [[ "$answer" =~ ^[Yy]+[ESes]* ]]; then + rm -f $FLASHLAYOUT_rawname $FLASHLAYOUT_infoname + fi + fi + + debug "DUMP FlashLayout name: $FLASHLAYOUT_filename" + debug "DUMP FlashLayout dir path: $FLASHLAYOUT_filename_path" + debug "DUMP images dir path: $FLASHLAYOUT_prefix_image_path" + debug "DUMP RAW SDCARD image name: $FLASHLAYOUT_rawname" +fi + +generate_empty_raw_image +generate_gpt_partition_table_from_flash_layout +populate_gpt_partition_table_from_flash_layout + +create_info +print_info +print_warning