diff --git a/README.md b/README.md index d3f419ec..d46b09a4 100644 --- a/README.md +++ b/README.md @@ -154,42 +154,53 @@ When using Windows, run theses steps in MSYS2. ## Preparing and executing an OBSW update -A OBSW update consists of the following two files +A OBSW update consists of a `xz` compressed file `eive-sw-update.tar.xz` +which contains the following two files: -1. Stripped OBSW binary compressed with `xz` with the name `eive-obsw.tar.xz` +1. Stripped OBSW binary `eive-obsw-stripped` 2. OBSW version text file with the name `obsw_version.txt` These files can be created manually: 1. Build the release image and then switch into the build directory -2. Run the following command: `tar -cJvf eive-obsw.tar.xz eive-obsw-stripped` -3. Run the following command to create the version file +2. Run the following command to create the version file ```sh git describe --tags --always --exclude docker_* > obsw_version.txt ``` +3. Run the following command to create the compressed archive + + ```sh + tar -cJvf eive-sw-update.tar.xz eive-obsw-stripped obsw_version.txt + ``` + You can also use the helper script `prepare-obsw-update.sh` inside the build folder after sourcing the `q7s-env.sh` helper script to perform all three steps. After creating these files, they need to be transferred onto the Q7S -to either the `/mnt/sd0/bin` or to the `/mnt/sd1/bin` folder depending on which -SD card is used. +to either the `/mnt/sd0/bin` or `/mnt/sd1/bin` folder if the OBSW update +is performed from the SD card. It can also be transferred to the `/tmp` folder +to perform the update from a temporary directory, which does not rely on any +of the SD cards being on and mounted. However, all files in the temporary +directory will be deleted if the Linux OS is rebooted for any reason. After both files are in place (this is checked by the OBSW), the example command sequence is used by the OBSW to write the OBSW update to the QSPI chip 0 and slot 0 using SD card 0: ```sh -tar -xJvf eive-obsw.tar.xz -cp-to-other-slots.sh 0 0 /mnt/sd0/bin/eive-obsw-stripped /usr/bin/eive-obsw --np -cp-to-other-slots.sh 0 0 /mnt/sd0/bin/obsw_update.txt /usr/share/obsw_update.txt +tar -xJvf eive-update.tar.xz +xsc_mount_copy 0 0 +cp eive-obsw-stripped /tmp/mntupdate-xdi-qspi0-nom-rootfs/usr/bin/eive-obsw +cp obsw_update.txt /tmp/mntupdate-xdi-qspi0-nom-rootfs/usr/share/obsw_update.txt +writeprotect 0 0 1 ``` -The helper script `cp-to-other-slots.sh` performs the following steps: +Some context information about the used commands: 1. It mounts the target chip and copy combination into the `/tmp` folder - using the `xsc_mount_copy` utility. This also unlocks the + using the `xsc_mount_copy ` utility. This also unlocks the writeprotection for the chip. The mount point name inside `/tmp` depends on which chip and copy is used @@ -197,11 +208,9 @@ The helper script `cp-to-other-slots.sh` performs the following steps: - Chip 0 Copy 1: `/tmp/mntupdate-xdi-qspi0-gold-rootfs` - Slot 0 Copy 0: `/tmp/mntupdate-xdi-qspi1-nom-rootfs` - Slot 0 Copy 0: `/tmp/mntupdate-xdi-qspi1-gold-rootfs` -2. It writes the file with a regular `cp ` command -3. It enables the writeprotection using the `writeprotect` utility. -This script also has an additional `--np` arguments to disable the -re-application of write-protection after the mount and copy operation. +2. Writing the file with a regular `cp ` command +3. Enabling the writeprotection using the `writeprotect 1` utility. ## Build for the Q7S target root filesystem with `yocto` diff --git a/bsp_q7s/core/CoreController.cpp b/bsp_q7s/core/CoreController.cpp index 8406d78b..08b179c8 100644 --- a/bsp_q7s/core/CoreController.cpp +++ b/bsp_q7s/core/CoreController.cpp @@ -198,6 +198,9 @@ ReturnValue_t CoreController::executeAction(ActionId_t actionId, MessageQueueId_ } return HasActionsIF::EXECUTION_FINISHED; } + case(OBSW_UPDATE_FROM_SD_0): { + break; + } case (SWITCH_IMG_LOCK): { if (size != 3) { return HasActionsIF::INVALID_PARAMETERS; diff --git a/bsp_q7s/core/CoreController.h b/bsp_q7s/core/CoreController.h index ea3ae0ea..666d0b82 100644 --- a/bsp_q7s/core/CoreController.h +++ b/bsp_q7s/core/CoreController.h @@ -51,6 +51,7 @@ class CoreController : public ExtendedControllerBase { static constexpr char CHIP_PROT_SCRIPT[] = "get-chip-prot-status.sh"; static constexpr char CHIP_STATE_FILE[] = "/tmp/chip_prot_status.txt"; static constexpr char CURR_COPY_FILE[] = "/tmp/curr_copy.txt"; + static constexpr char OBSW_COMPRESSED_NAME[] = "eive-obsw.tar.xz"; static constexpr char CONF_FOLDER[] = "conf"; static constexpr char VERSION_FILE_NAME[] = "version.txt"; static constexpr char REBOOT_FILE_NAME[] = "reboot.txt"; @@ -61,6 +62,11 @@ class CoreController : public ExtendedControllerBase { "/" + std::string(CONF_FOLDER) + "/" + std::string(REBOOT_FILE_NAME); const std::string TIME_FILE = "/" + std::string(CONF_FOLDER) + "/" + std::string(TIME_FILE_NAME); + static constexpr char CHIP_0_COPY_0_MOUNT_DIR = "/tmp/mntupdate-xdi-qspi0-nom-rootfs"; + static constexpr char CHIP_0_COPY_1_MOUNT_DIR = "/tmp/mntupdate-xdi-qspi0-gold-rootfs"; + static constexpr char CHIP_1_COPY_0_MOUNT_DIR = "/tmp/mntupdate-xdi-qspi1-nom-rootfs"; + static constexpr char CHIP_1_COPY_1_MOUNT_DIR = "/tmp/mntupdate-xdi-qspi1-gold-rootfs"; + static constexpr ActionId_t LIST_DIRECTORY_INTO_FILE = 0; static constexpr ActionId_t SWITCH_REBOOT_FILE_HANDLING = 5; static constexpr ActionId_t RESET_REBOOT_COUNTERS = 6; diff --git a/scripts/compress-obsw.sh b/scripts/compress-obsw.sh deleted file mode 100755 index ca2b7254..00000000 --- a/scripts/compress-obsw.sh +++ /dev/null @@ -1,9 +0,0 @@ -#!/bin/bash - -if [ -d eive-obsw-stripped ]; then - echo "No file eive-obsw-stripped found. Please ensure you are in the build folder" -fi - -cmd="tar -cJvf eive-obsw.tar.xz eive-obsw-stripped" -echo "Running command ${cmd} to generate compressed OBSW" -eval ${cmd} diff --git a/scripts/create-sw-update.sh b/scripts/create-sw-update.sh new file mode 100755 index 00000000..89ad9aff --- /dev/null +++ b/scripts/create-sw-update.sh @@ -0,0 +1,17 @@ +#!/bin/bash + +if [ -f eive-obsw-stripped ]; then + echo "No file eive-obsw-stripped found. Please ensure you are in the " + echo "build folder and the OBSW was built properly" + exit 1 +fi + +if [ -f obsw_version.txt ]; then + echo "No OBSW version file found." + echo "You can use the create-version-file.sh script to create it" + exit 1 +fi + +cmd="tar -cJvf eive-obsw.tar.xz eive-obsw-stripped obsw_version.txt" +echo "Running command ${cmd} to generate compressed SW update archive" +eval ${cmd} diff --git a/scripts/prepare-obsw-update.sh b/scripts/prepare-obsw-update.sh index 87a92105..3d18df21 100755 --- a/scripts/prepare-obsw-update.sh +++ b/scripts/prepare-obsw-update.sh @@ -1,3 +1,3 @@ #!/bin/bash source create-version-file.sh -source compress-obsw.sh +source create-sw-update.sh