A shell function of the firmware updating for Debian at present stage

Hey! Guys, I wrote a bash function for firmware updating of the supported Debian, you can upgrade the firmware easily if you have installed Debian on VF2, it may help y’all at present stage:

#!/bin/bash  
update_firmware(){
    if ! [[ -x $(which uuid) ]];
    then 
        echo "Installing uuid......"
        sudo apt-get install uuid -y
    fi
    if ! [[ -x $(which wget) ]];
    then
        echo "Install wget......"
        sudo apt-get install wget -y
    fi
    if ! [[ -x $(which flashcp) ]];
    then
        echo "Install mtd-utils......"
        sudo apt-get install mtd-utils -y
    fi
    spl_file="u-boot-spl.bin.normal.$(uuid).out"
    u_boot_file="visionfive2_fw_payload.$(uuid).img"
    releases_page_file="$(uuid)$(uuid)"
    vf2_repo_url="https://github.com/starfive-tech/VisionFive2"
    fw_release_url="${vf2_repo_url}/releases"
    fw_url="${fw_release_url}/download"
    
    echo "Download releases page......"
    wget -nv -O ${releases_page_file} ${fw_release_url}
    latest_version=$( \
        grep -oP 'VF2_v\d+.\d+.\d+' ${releases_page_file} | \
        head -1 \
    )   
    
    echo "The latest version: ${latest_version}"

    echo "Download SPL file......"
    wget -nv -O ${spl_file} \
        ${fw_url}/${latest_version}/u-boot-spl.bin.normal.out
    echo "Download U-Boot file......"
    wget -nv -O ${u_boot_file} \
        ${fw_url}/${latest_version}/visionfive2_fw_payload.img
    
    devices=$(ls /dev)
    echo "Update SPL of SD & eMMC......"
    if [[ $devices == *"mmcblk0p1"* ]];
    then
        echo "'/dev/mmcblk0p1'(eMMC) exists, updating......"
        sudo dd if=${spl_file} of=/dev/mmcblk0p1 conv=fsync 
    fi
    if [[ $devices == *"mmcblk1p1"* ]];
    then
        echo "'/dev/mmcblk1p1'(SD card) exists, updating......"
        sudo dd if=${spl_file} of=/dev/mmcblk1p1 conv=fsync 
    fi

    echo "Update U-Boot of SD & eMMC......"
    if [[ $devices == *"mmcblk0p2"* ]];
    then
        echo "'/dev/mmcblk0p2'(eMMC) exists, updating......"
        sudo dd if=${u_boot_file} of=/dev/mmcblk0p2 conv=fsync 
    fi
    if [[ $devices == *"mmcblk1p2"* ]];
    then
        echo "'/dev/mmcblk1p2'(SD card) exists, updating......"
        sudo dd if=${u_boot_file} of=/dev/mmcblk1p2 conv=fsync 
    fi

    echo "Update SPL & U-Boot of Flash......"
    sudo flashcp -v ${spl_file}    /dev/mtd0
    sudo flashcp -v ${u_boot_file} /dev/mtd1

    echo "Finished!"
    
    read -p "Do you wish to delete downloaded files?([Y]y/Nn)" del_yn
    if [[ $del_yn =~ ^[Yy]$ ]] || [[ $del_yn == "" ]] ;
    then
        echo "Remove ${spl_file}, ${u_boot_file}, ${releases_page_file}......"
        rm -rf ${spl_file} ${u_boot_file} ${releases_page_file}
    fi
}

You can add this function to ~/.bashrc for convenience or run it via:

wget -O upgrade-firmware.sh https://raw.githubusercontent.com/larryw3i/VisionFive2/JH7110_VisionFive2_devel/upgrade-firmware.sh && sudo bash upgrade-firmware.sh

.bashrc (8.8 KB)

4 Likes

This script looks great but should ONLY be run when a firmware update is needed, and only by the superuser.

Running from a users .bashrc is a terrible idea.
…every new shell you re-flash the machine firmware… and the user must have sudo access…
This is bad advice.

This would be a great candidate to run as a startup job via systemd, but without any check of whether a reflash is actually needed it is unsuitable for repeated running.

4 Likes

:sweat_smile: Yea! Perhaps “curl -fsSL xxxxxx.sh | sh” is more useful.

BTW, how can I get the firmware version being used through the installed Debian System?

The Ubuntu image uses partition 1 for the root file system. The script above will delete it.

The boot ROM uses the GPT partition type GUID to find the partition with U-Boot SPL. The bash script above should do the same.

5 Likes

Hey, @xypron , do expect you contribute the codes to upgrade firmware on Ubuntu.