MC3302_SDK_V1.1.9_202507281.../media/tools/post_build/xmodem.sh
2025-11-11 12:08:31 +08:00

194 lines
7.3 KiB
Bash
Executable File

#!/bin/bash
pkg_type=3
pkg_mode=1
pos_pkg_mode=17
pos_image_size=1
pos_mem_base=5
pos_nvm_offset=9
pos_image_ver=0
pos_nvm_type=18
pos_page_size=19
pos_erase_size=21
#if_baud_rate=0
pos_nand_main_size=25
pos_nand_oob_size=29
pos_nand_ecc_mode=33
pos_nand_ecc_pos=37
pos_nand_sector_num=89
pos_nand_info_size=93
pos_nand_block_page=97
#emmc_partition_sel=0
pos_emmc_part=25
xmodem_nvm_file="./xmodem_nvm_csv"
#desc_frame_name="desc_frame_data"
#$1: nvm_type
function xmodem_frame_add()
{
xmodem_page_size=0
xmodem_erase_size=0
xmodem_nor_page_size=0
xmodem_nor_erase_size=0
xmodem_nvm_type=$1
desc_frame_name=$2
xmodem_image_size=$3
xmodem_mem_base=$4
xmodem_nvm_offset=$5
xmodem_emmc_part=$6
tmp_file="tmp0"
if [ -f "$desc_frame_name" ]; then
echo "file exist...."
rm $desc_frame_name
fi
dd if=/dev/zero of="${desc_frame_name}" bs=128 count=1
while read line; do
IFS=' ', read -ra array <<< "$line"
count=${#array[@]}
if [ $count -eq 3 ]; then
if [ ${array[0]} = "nvm_type" ]; then
#echo "ignore title."
continue
fi
if [ ${array[0]} = "nor" ]; then
if [ ${array[1]} = "page_size" ]; then
xmodem_nor_page_size=${array[2]}
elif [ ${array[1]} = "erase_size" ]; then
xmodem_nor_erase_size=${array[2]}
else
echo "unused nvm info."
fi
elif [ ${array[0]} = "nand" ]; then
if [ ${array[1]} = "page_size" ]; then
xmodem_page_size=${array[2]}
elif [ ${array[1]} = "erase_size" ]; then
xmodem_erase_size=${array[2]}
elif [ ${array[1]} = "nand_main_size" ]; then
xmodem_nand_main_size=${array[2]}
elif [ ${array[1]} = "nand_oob_size" ]; then
xmodem_nand_oob_size=${array[2]}
elif [ ${array[1]} = "nand_ecc_mode" ]; then
xmodem_nand_ecc_mode=${array[2]}
elif [ ${array[1]} = "nand_ecc_pos" ]; then
xmodem_nand_ecc_pos=${array[2]}
elif [ ${array[1]} = "nand_sector_num" ]; then
xmodem_nand_sector_num=${array[2]}
elif [ ${array[1]} = "nand_info_size" ]; then
xmodem_nand_info_size=${array[2]}
elif [ ${array[1]} = "nand_block_page" ]; then
xmodem_nand_block_page=${array[2]}
else
echo "unused nvm info."
fi
elif [ ${array[0]} = "emmc" ]; then
if [ ${array[1]} = "block_size" ]; then
emmc_page_size=${array[2]}
else
echo "unused nvm info"
fi
else
echo "xmodem: unkown nvm type."
fi
else
echo "xmodem: invalid nvm information."
fi
done < "$xmodem_nvm_file"
#update package type...
printf "%08x" ${pkg_type} | xxd -r -p -l 4 > "$tmp_file".org
objcopy -I binary --reverse-bytes=4 "${tmp_file}".org "${tmp_file}".rev
dd conv=notrunc bs=1 seek=0 count=1 if="${tmp_file}".rev of="${desc_frame_name}" > /dev/null 2>&1;
#update package mode.
printf "%08x" ${pkg_mode} | xxd -r -p -l 4 > "$tmp_file".org
objcopy -I binary --reverse-bytes=4 "${tmp_file}".org "${tmp_file}".rev
dd conv=notrunc bs=1 seek="${pos_pkg_mode}" count=1 if="${tmp_file}".rev of="${desc_frame_name}" > /dev/null 2>&1;
#update nvm type.
printf "%08x" ${xmodem_nvm_type} | xxd -r -p -l 4 > "$tmp_file".org
objcopy -I binary --reverse-bytes=4 "${tmp_file}".org "${tmp_file}".rev
dd conv=notrunc bs=1 seek="${pos_nvm_type}" count=1 if="${tmp_file}".rev of="${desc_frame_name}" > /dev/null 2>&1;
if [ $xmodem_nvm_type -eq 1 ]; then
#update page size.
printf "%08x" ${xmodem_nor_page_size} | xxd -r -p -l 4 > "$tmp_file".org
objcopy -I binary --reverse-bytes=4 "${tmp_file}".org "${tmp_file}".rev
dd conv=notrunc bs=1 seek="${pos_page_size}" count=1 if="${tmp_file}".rev of="${desc_frame_name}" > /dev/null 2>&1;
#update erase size.
printf "%08x" ${xmodem_nor_erase_size} | xxd -r -p -l 4 > "$tmp_file".org
objcopy -I binary --reverse-bytes=4 "${tmp_file}".org "${tmp_file}".rev
dd conv=notrunc bs=1 seek="${pos_erase_size}" count=4 if="${tmp_file}".rev of="${desc_frame_name}" > /dev/null 2>&1;
fi
if [ $xmodem_nvm_type -eq 3 ]; then
#update page size.
printf "%08x" ${emmc_page_size} | xxd -r -p -l 4 > "$tmp_file".org
objcopy -I binary --reverse-bytes=4 "${tmp_file}".org "${tmp_file}".rev
dd conv=notrunc bs=1 seek="${pos_page_size}" count=1 if="${tmp_file}".rev of="${desc_frame_name}" > /dev/null 2>&1;
printf "%08x" ${xmodem_emmc_part} | xxd -r -p -l 4 > "$tmp_file".org
objcopy -I binary --reverse-bytes=4 "${tmp_file}".org "${tmp_file}".rev
dd conv=notrunc bs=1 seek="${pos_emmc_part}" count=1 if="${tmp_file}".rev of="${desc_frame_name}" > /dev/null 2>&1;
fi
#update image size.
printf "%08x" ${xmodem_image_size} | xxd -r -p -l 4 > "$tmp_file".org
objcopy -I binary --reverse-bytes=4 "${tmp_file}".org "${tmp_file}".rev
dd conv=notrunc bs=1 seek="${pos_image_size}" count=4 if="${tmp_file}".rev of="${desc_frame_name}" > /dev/null 2>&1;
#update memory base.
printf "%08x" ${xmodem_mem_base} | xxd -r -p -l 4 > "$tmp_file".org
objcopy -I binary --reverse-bytes=4 "${tmp_file}".org "${tmp_file}".rev
dd conv=notrunc bs=1 seek="${pos_mem_base}" count=4 if="${tmp_file}".rev of="${desc_frame_name}" > /dev/null 2>&1;
#update nvm offset.
printf "%08x" ${xmodem_nvm_offset} | xxd -r -p -l 4 > "$tmp_file".org
objcopy -I binary --reverse-bytes=4 "${tmp_file}".org "${tmp_file}".rev
dd conv=notrunc bs=1 seek="${pos_nvm_offset}" count=4 if="${tmp_file}".rev of="${desc_frame_name}" > /dev/null 2>&1;
#nand flash.
if [ $xmodem_nvm_type -eq 2 ]; then
printf "%08x" ${xmodem_nand_main_size} | xxd -r -p -l 4 > "$tmp_file".org
objcopy -I binary --reverse-bytes=4 "${tmp_file}".org "${tmp_file}".rev
dd conv=notrunc bs=1 seek="${pos_nand_main_size}" count=4 if="${tmp_file}".rev of="${desc_frame_name}" > /dev/null 2>&1;
printf "%08x" ${xmodem_nand_oob_size} | xxd -r -p -l 4 > "$tmp_file".org
objcopy -I binary --reverse-bytes=4 "${tmp_file}".org "${tmp_file}".rev
dd conv=notrunc bs=1 seek="${pos_nand_oob_size}" count=4 if="${tmp_file}".rev of="${desc_frame_name}" > /dev/null 2>&1;
printf "%08x" ${xmodem_nand_ecc_mode} | xxd -r -p -l 4 > "$tmp_file".org
objcopy -I binary --reverse-bytes=4 "${tmp_file}".org "${tmp_file}".rev
dd conv=notrunc bs=1 seek="${pos_nand_ecc_mode}" count=4 if="${tmp_file}".rev of="${desc_frame_name}" > /dev/null 2>&1;
printf "%08x" ${xmodem_nand_ecc_pos} | xxd -r -p -l 4 > "$tmp_file".org
objcopy -I binary --reverse-bytes=4 "${tmp_file}".org "${tmp_file}".rev
dd conv=notrunc bs=1 seek="${pos_nand_ecc_pos}" count=4 if="${tmp_file}".rev of="${desc_frame_name}" > /dev/null 2>&1;
printf "%08x" ${xmodem_nand_sector_num} | xxd -r -p -l 4 > "$tmp_file".org
objcopy -I binary --reverse-bytes=4 "${tmp_file}".org "${tmp_file}".rev
dd conv=notrunc bs=1 seek="${pos_nand_sector_num}" count=4 if="${tmp_file}".rev of="${desc_frame_name}" > /dev/null 2>&1;
printf "%08x" ${xmodem_nand_info_size} | xxd -r -p -l 4 > "$tmp_file".org
objcopy -I binary --reverse-bytes=4 "${tmp_file}".org "${tmp_file}".rev
dd conv=notrunc bs=1 seek="${pos_nand_info_size}" count=4 if="${tmp_file}".rev of="${desc_frame_name}" > /dev/null 2>&1;
printf "%08x" ${xmodem_nand_block_page} | xxd -r -p -l 4 > "$tmp_file".org
objcopy -I binary --reverse-bytes=4 "${tmp_file}".org "${tmp_file}".rev
dd conv=notrunc bs=1 seek="${pos_nand_block_page}" count=4 if="${tmp_file}".rev of="${desc_frame_name}" > /dev/null 2>&1;
fi
if [ -f "$tmp_file".org ]; then
rm "$tmp_file".org
fi
if [ -f "$tmp_file".rev ]; then
rm "$tmp_file".rev
fi
}