#!/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: --- #=============================================================================== 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 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 else echo "- Populate partition $partName (/dev/mmcblk0p$j)" >> $FLASHLAYOUT_infoname echo " dd if=$bin2flash 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 check_if_command_exists() { command -v $1 >/dev/null 2>&1 \ || { echo "Cannot continue. Please install $1 first."; exit 1; } } 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 # Pre-requisite tools for i in sgdisk du dd; do check_if_command_exists $i done 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 else echo "Cannot continue." exit 1 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