luckfox-pico-sdk/project/scripts/mk-tftp_sd_update.sh
2023-08-08 20:36:47 +08:00

173 lines
5.1 KiB
Bash
Executable File

#!/bin/bash
GLOBAL_PARTITIONS="$1"
IMAGE_DIRS="$2"
BOOT_MEDIUM="$3"
TFTP_FILE_NAME=$IMAGE_DIRS/"tftp_update.txt"
SD_FILE_NAME=$IMAGE_DIRS/"sd_update.txt"
function eraseddr(){
fileSize=$1
dstname=$2
echo -n "mw.b \${ramdisk_addr_r} 0xff $fileSize;" >> $dstname
}
function mktftp(){
fileName=$1
dstname=$2
echo -n " tftp \${ramdisk_addr_r} $fileName;" >> $dstname
}
function mkfatload(){
fileName=$1
dstname=$2
echo -n " fatload mmc 1 \${ramdisk_addr_r} $fileName;" >> $dstname
}
function mkemmc(){
offset=$1
fileSectorCount=$2
dstname=$3
echo " mmc write \${ramdisk_addr_r} $offset $fileSectorCount;" >> $dstname
}
function mkspinand(){
partitionOffset=$1
partitionSize=$2
dstname=$3
echo -n " mtd erase spi-nand0 $partitionOffset $partitionSize;" >> $dstname
echo " mtd write spi-nand0 \${ramdisk_addr_r} $partitionOffset ${fileSize};" >> $dstname
}
function mkslcnand(){
partitionOffset=$1
partitionSize=$2
dstname=$3
echo -n " nand erase $partitionOffset $partitionSize;" >> $dstname
echo " nand write \${ramdisk_addr_r} $partitionOffset ${fileSize};" >> $dstname
}
function mkspinor(){
offset=$1
fileSectorCount=$2
dstname=$3
echo -n " mtd_blk dev 2;" >> $dstname
echo " mtd_blk write \${ramdisk_addr_r} $offset $fileSectorCount;" >> $dstname
}
function mkcmdline(){
fileName=$1
partitionOffsetSector=$2
partitionSizeSector=$3
fileSize=$4
partitionOffset=$(($partitionOffsetSector))
partitionOffset=$(($partitionOffset*512))
partitionOffset="0x`echo "obase=16;$partitionOffset"|bc`"
partitionSize=$(($partitionSizeSector))
partitionSize=$(($partitionSize*512))
partitionSize="0x`echo "obase=16;$partitionSize"|bc`"
fileSizeSector=$(($fileSize))
remainder=$(($fileSizeSector%512))
fileSizeSector=$(($fileSizeSector/512))
if [ $remainder -ne 0 ]; then
fileSizeSector=$(($fileSizeSector+1))
fi
fileSizeSector="0x`echo "obase=16;$fileSizeSector"|bc`"
echo "#$fileName $partitionOffsetSector:$partitionOffset $partitionSizeSector:$partitionSize $fileSizeSector:$fileSize" >> $TFTP_FILE_NAME
eraseddr $fileSize $TFTP_FILE_NAME
mktftp $fileName $TFTP_FILE_NAME
echo "#$fileName $partitionOffsetSector:$partitionOffset $partitionSizeSector:$partitionSize $fileSizeSector:$fileSize" >> $SD_FILE_NAME
eraseddr $fileSize $SD_FILE_NAME
mkfatload $fileName $SD_FILE_NAME
if [ "$BOOT_MEDIUM" == "emmc" ];then
mkemmc $partitionOffsetSector $fileSizeSector $TFTP_FILE_NAME
mkemmc $partitionOffsetSector $fileSizeSector $SD_FILE_NAME
elif [ "$BOOT_MEDIUM" == "spi_nand" ];then
mkspinand $partitionOffset $partitionSize $TFTP_FILE_NAME
mkspinand $partitionOffset $partitionSize $SD_FILE_NAME
elif [ "$BOOT_MEDIUM" == "slc_nand" ];then
mkslcnand $partitionOffset $partitionSize $TFTP_FILE_NAME
mkslcnand $partitionOffset $partitionSize $SD_FILE_NAME
elif [ "$BOOT_MEDIUM" == "spi_nor" ];then
mkspinor $partitionOffsetSector $fileSizeSector $TFTP_FILE_NAME
mkspinor $partitionOffsetSector $fileSizeSector $SD_FILE_NAME
else
echo "Not support storage medium type: $BOOT_MEDIUM"
exit 1
fi
echo "" >> $TFTP_FILE_NAME
echo "" >> $SD_FILE_NAME
}
function list_partition(){
OLD_IFS=$IFS
IFS=$', \t\n'
for part in $GLOBAL_PARTITIONS;
do
part_size=`echo $part | cut -d '@' -f1`
part_offset=`echo $part | cut -d '(' -f1|cut -d '@' -f2`
part_name=`echo $part | cut -d '(' -f2|cut -d ')' -f1`
if [[ "$part_size" == "-" ]];then
echo "$0: Partition Name ($part_name) is growup partiton, ignore!!!"
continue
fi
for fileName in `ls $IMAGE_DIRS/`
do
if [[ "${part_name%_[ab]}.img" == "$fileName" ]];then
[[ "${part_name%_[ab]}" == "idblock" ]] && [[ "$BOOT_MEDIUM" == "slc_nand" ]] && continue
fileSize=`realpath $IMAGE_DIRS/$fileName |xargs stat -c "%s"`
#partition size (base 10)
partitionSize=$(($part_size))
remainder=$(($partitionSize%512))
#partition sector size (base 10)
partitionSizeSector=$(($partitionSize/512))
if [ $remainder -ne 0 ]; then
partitionSizeSector=$(($partitionSizeSector+1))
fi
#partition offset (base 10)
partitionOffset=$(($part_offset))
remainder=$(($partitionOffset%512))
#partition sector offset (base 10)
partitionOffsetSector=$(($partitionOffset/512))
if [ $remainder -ne 0 ]; then
partitionOffsetSector=$(($partitionOffsetSector+1))
fi
if [ $fileSize -gt $partitionSize ]; then
echo -e "\e[35mERROR:\e[0m The \e[35m$fileName\e[0m file size is larger than the partition size! \c"
echo -e "Please check the image size or the partition in BoardConfig."
exit -1
fi
# Convert base 10 to base 16
partitionOffsetSectorB16="0x`echo "obase=16;$partitionOffsetSector"|bc`"
partitionSizeSectorB16="0x`echo "obase=16;$partitionSizeSector"|bc`"
fileSizeB16="0x`echo "obase=16;$fileSize"|bc`"
mkcmdline $fileName $partitionOffsetSectorB16 $partitionSizeSectorB16 $fileSizeB16
fi
done
done
IFS=$OLD_IFS
}
rm -rf $TFTP_FILE_NAME
rm -rf $SD_FILE_NAME
list_partition
echo "reset" >> $TFTP_FILE_NAME
# echo "reset" >> $SD_FILE_NAME
echo "% <- this is end of file symbol" >> $SD_FILE_NAME
echo "% <- this is end of file symbol" >> $TFTP_FILE_NAME