From c0ef1a9dcb0816a071195c2fcbefbccc126fa81d Mon Sep 17 00:00:00 2001 From: David Sidrane Date: Sat, 21 Nov 2015 04:01:55 -1000 Subject: [PATCH 1/6] Move uavcan bin files to ROMFS based on naming convention --- .travis.yml | 3 +-- Tools/uavcan_copy.sh | 33 +++++++++++++++++++++++++++++++++ 2 files changed, 34 insertions(+), 2 deletions(-) create mode 100755 Tools/uavcan_copy.sh diff --git a/.travis.yml b/.travis.yml index f2a72b9ff5..48e674881c 100644 --- a/.travis.yml +++ b/.travis.yml @@ -102,9 +102,8 @@ script: - echo 'Building UAVCAN node firmware..' && git clone https://github.com/thiemar/vectorcontrol - cd vectorcontrol - BOARD=s2740vc_1_0 make && BOARD=px4esc_1_6 make + - ../Tools/uavcan_copy.sh - cd .. - - mkdir -p ROMFS/px4fmu_common/uavcan/fw/com.thiemar.s2740vc-v1/1.0/ - - mkdir -p ROMFS/px4fmu_common/uavcan/fw/org.pixhawk.px4esc-v1/1.0/ - echo 'Building NuttX px4fmu-v1 Firmware..' && make px4fmu-v1_default - echo 'Building NuttX px4fmu-v2 Firmware..' && make px4fmu-v2_default - echo 'Building NuttX px4fmu-v4 Firmware..' && make px4fmu-v4_default diff --git a/Tools/uavcan_copy.sh b/Tools/uavcan_copy.sh new file mode 100755 index 0000000000..34969cf8fe --- /dev/null +++ b/Tools/uavcan_copy.sh @@ -0,0 +1,33 @@ +#!/bin/bash +UAVCANFW=../ROMFS/px4fmu_common/uavcan/fw +echo Removing : $UAVCANFW +rm -fr $UAVCANFW +for f in $(find firmware -type f -name "*.*.bin") +do + UAVCAN_NAME=$(echo $f | cut -d"/" -f2 | cut -d. -f1-4 | cut -d- -f1-2) + UAVCAN_HW=$(echo $f cut -d/ -f2 | cut -d. -f1-4 | cut -d- -f3) + DST=$(echo $f | cut -d. -f3-7 | cut -d- -f1,2,3).$(echo $f | cut -d. -f6,7) + # deal with legacy non conforming naming + if [[ ${DST:(-7)} == bin.bin ]] + then + echo " WARNING: Improper name format!!!!!!!!! $f see should be -...bin" + DST=${DST%???} + fi + if [ ${#DST} -le 28 ] + echo Processing file: $f + then + if [ -d "${UAVCANFW}/${UAVCAN_NAME}/${UAVCAN_HW}" ] + then + echo " ERROR: name colision directory ${UAVCANFW}/${UAVCAN_NAME}/${UAVCAN_HW} exits!" + exit 2 + fi + echo " Creating Directory ${UAVCANFW}/${UAVCAN_NAME}/${UAVCAN_HW}" + mkdir -p ${UAVCANFW}/${UAVCAN_NAME}/${UAVCAN_HW} + echo " Copying $f to ${UAVCANFW}/${UAVCAN_NAME}/${UAVCAN_HW}/${DST}" + cp $f ${UAVCANFW}/${UAVCAN_NAME}/${UAVCAN_HW}/${DST} + else + echo " ERROR: $DST is ${#DST} charaters and needs to be less than or equal to 28" + exit 1 + fi +done +exit 0 From 31a773e3cef4d618ddb9ea70309a3f8338cd6e1e Mon Sep 17 00:00:00 2001 From: David Sidrane Date: Sat, 21 Nov 2015 06:17:27 -1000 Subject: [PATCH 2/6] Use _ prefix o uavcan files in ROMFS , simplify upgrade --- Tools/uavcan_copy.sh | 7 +++--- src/modules/uavcan/uavcan_servers.cpp | 33 +++++++++++++-------------- src/modules/uavcan/uavcan_servers.hpp | 2 +- 3 files changed, 21 insertions(+), 21 deletions(-) diff --git a/Tools/uavcan_copy.sh b/Tools/uavcan_copy.sh index 34969cf8fe..9d21e0b562 100755 --- a/Tools/uavcan_copy.sh +++ b/Tools/uavcan_copy.sh @@ -1,20 +1,21 @@ #!/bin/bash UAVCANFW=../ROMFS/px4fmu_common/uavcan/fw +ROMFS_REFIX=_ echo Removing : $UAVCANFW rm -fr $UAVCANFW for f in $(find firmware -type f -name "*.*.bin") do UAVCAN_NAME=$(echo $f | cut -d"/" -f2 | cut -d. -f1-4 | cut -d- -f1-2) UAVCAN_HW=$(echo $f cut -d/ -f2 | cut -d. -f1-4 | cut -d- -f3) - DST=$(echo $f | cut -d. -f3-7 | cut -d- -f1,2,3).$(echo $f | cut -d. -f6,7) + DST=${ROMFS_REFIX}$(echo $f | cut -d. -f3-7 | cut -d- -f1,2,3).$(echo $f | cut -d. -f6,7) # deal with legacy non conforming naming if [[ ${DST:(-7)} == bin.bin ]] then echo " WARNING: Improper name format!!!!!!!!! $f see should be -...bin" - DST=${DST%???} + DST=${DST%????} fi + echo Processing file: $f Length:${#DST} if [ ${#DST} -le 28 ] - echo Processing file: $f then if [ -d "${UAVCANFW}/${UAVCAN_NAME}/${UAVCAN_HW}" ] then diff --git a/src/modules/uavcan/uavcan_servers.cpp b/src/modules/uavcan/uavcan_servers.cpp index 318940eb64..2da32688b0 100644 --- a/src/modules/uavcan/uavcan_servers.cpp +++ b/src/modules/uavcan/uavcan_servers.cpp @@ -886,14 +886,15 @@ void UavcanServers::unpackFwFromROMFS(const char* sd_path, const char* romfs_pat /fs/microsd/fw - /c - - - /1a2b3c4d.bin cache file (copy of /fs/microsd/fw/org.pixhawk.nodename-v1/1.1/1a2b3c4d.bin) - - /org.pixhawk.nodename-v1 device directory for org.pixhawk.nodename-v1 - - - /1.0 version directory for hardware 1.0 - - - /1.1 version directory for hardware 1.1 - - - - /1a2b3c4d.bin firmware file for org.pixhawk.nodename-v1 nodes, hardware version 1.1 - - /com.example.othernode-v3 device directory for com.example.othernode-v3 - - - /1.0 version directory for hardawre 1.0 - - - - /deadbeef.bin firmware file for com.example.othernode-v3, hardware version 1.0 + - /nodename-v1-1.0.25d0137d.bin cache file (copy of /fs/microsd/fw/org.pixhawk.nodename-v1/1.1/nodename-v1-1.0.25d0137d.bin) + - /othernode-v3-1.6.25d0137d.bin cache file (copy of /fs/microsd/fw/com.example.othernode-v3/1.6/othernode-v3-1.6.25d0137d.bin) + - /org.pixhawk.nodename-v1 device directory for org.pixhawk.nodename-v1 + - - /1.0 version directory for hardware 1.0 + - - /1.1 version directory for hardware 1.1 + - - - /nodename-v1-1.0.25d0137d.bin firmware file for org.pixhawk.nodename-v1 nodes, hardware version 1.1 + - /com.example.othernode-v3 device directory for com.example.othernode-v3 + - - /1.0 version directory for hardawre 1.0 + - - - /othernode-v3-1.6.25d0137d.bin firmware file for com.example.othernode-v3, hardware version 1.6 The ROMFS directory structure is the same, but located at /etc/uavcan/fw @@ -1037,7 +1038,7 @@ void UavcanServers::unpackFwFromROMFS(const char* sd_path, const char* romfs_pat continue; } - if (!memcmp(&fw_dirent->d_name[sizeof(UAVCAN_ROMFS_FW_PREFIX) - 1], src_fw_dirent->d_name, fw_len)) { + if (!memcmp(&fw_dirent->d_name, src_fw_dirent->d_name, fw_len)) { /* * Exact match between SD card filename and ROMFS filename; must be the same version * so don't bother deleting and rewriting it. @@ -1048,14 +1049,13 @@ void UavcanServers::unpackFwFromROMFS(const char* sd_path, const char* romfs_pat size_t dstpath_fw_len = dstpath_ver_len + sizeof(UAVCAN_ROMFS_FW_PREFIX) + fw_len; if (dstpath_fw_len > maxlen) { // sizeof(prefix) includes trailing NUL, cancelling out the +1 for the path separator - warnx("unlink: path '%s/%s%s' too long", dstpath, UAVCAN_ROMFS_FW_PREFIX, fw_dirent->d_name); + warnx("unlink: path '%s/%s' too long", dstpath, fw_dirent->d_name); } else { - // File name starts with "romfs_", delete it. + // File name starts with "_", delete it. dstpath[dstpath_ver_len] = '/'; memcpy(&dstpath[dstpath_ver_len + 1], fw_dirent->d_name, fw_len + 1); unlink(dstpath); - - warnx("unlink: removed '%s/%s%s'", dstpath, UAVCAN_ROMFS_FW_PREFIX, fw_dirent->d_name); + warnx("unlink: removed '%s/%s'", dstpath, fw_dirent->d_name); } } else { // User file, don't copy firmware @@ -1068,20 +1068,19 @@ void UavcanServers::unpackFwFromROMFS(const char* sd_path, const char* romfs_pat // If we need to, copy the file from ROMFS to the SD card if (copy_fw) { size_t srcpath_fw_len = srcpath_ver_len + 1 + fw_len; - size_t dstpath_fw_len = dstpath_ver_len + sizeof(UAVCAN_ROMFS_FW_PREFIX) + fw_len; + size_t dstpath_fw_len = dstpath_ver_len + fw_len; if (srcpath_fw_len > maxlen) { warnx("copy: srcpath '%s/%s' too long", srcpath, src_fw_dirent->d_name); } else if (dstpath_fw_len > maxlen) { - warnx("copy: dstpath '%s/%s%s' too long", dstpath, UAVCAN_ROMFS_FW_PREFIX, src_fw_dirent->d_name); + warnx("copy: dstpath '%s/%s' too long", dstpath, src_fw_dirent->d_name); } else { // All OK, make the paths and copy the file srcpath[srcpath_ver_len] = '/'; memcpy(&srcpath[srcpath_ver_len + 1], src_fw_dirent->d_name, fw_len + 1); dstpath[dstpath_ver_len] = '/'; - memcpy(&dstpath[dstpath_ver_len + 1], UAVCAN_ROMFS_FW_PREFIX, sizeof(UAVCAN_ROMFS_FW_PREFIX)); - memcpy(&dstpath[dstpath_ver_len + sizeof(UAVCAN_ROMFS_FW_PREFIX)], src_fw_dirent->d_name, fw_len + 1); + memcpy(&dstpath[dstpath_ver_len], src_fw_dirent->d_name, fw_len + 1); rv = copyFw(dstpath, srcpath); if (rv != 0) { diff --git a/src/modules/uavcan/uavcan_servers.hpp b/src/modules/uavcan/uavcan_servers.hpp index 3cf4cbb4da..30fb3f5255 100644 --- a/src/modules/uavcan/uavcan_servers.hpp +++ b/src/modules/uavcan/uavcan_servers.hpp @@ -70,7 +70,7 @@ #define UAVCAN_NODE_DB_PATH "/fs/microsd/uavcan.db" #define UAVCAN_FIRMWARE_PATH "/fs/microsd/fw" #define UAVCAN_ROMFS_FW_PATH "/etc/uavcan/fw" -#define UAVCAN_ROMFS_FW_PREFIX "romfs_" +#define UAVCAN_ROMFS_FW_PREFIX "_" #define UAVCAN_MAX_PATH_LENGTH (128 + 40) #define UAVCAN_LOG_FILE UAVCAN_NODE_DB_PATH"/trace.log" From 31241c9b49372509ad8aee326ebeac1ad36bd2fb Mon Sep 17 00:00:00 2001 From: David Sidrane Date: Mon, 23 Nov 2015 13:56:07 -1000 Subject: [PATCH 3/6] Fixed off-by-one errors --- src/modules/uavcan/uavcan_servers.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/modules/uavcan/uavcan_servers.cpp b/src/modules/uavcan/uavcan_servers.cpp index 2da32688b0..701390de86 100644 --- a/src/modules/uavcan/uavcan_servers.cpp +++ b/src/modules/uavcan/uavcan_servers.cpp @@ -1046,7 +1046,7 @@ void UavcanServers::unpackFwFromROMFS(const char* sd_path, const char* romfs_pat copy_fw = false; } else if (!memcmp(fw_dirent->d_name, UAVCAN_ROMFS_FW_PREFIX, sizeof(UAVCAN_ROMFS_FW_PREFIX) - 1)) { size_t fw_len = strlen(fw_dirent->d_name); - size_t dstpath_fw_len = dstpath_ver_len + sizeof(UAVCAN_ROMFS_FW_PREFIX) + fw_len; + size_t dstpath_fw_len = dstpath_ver_len + fw_len; if (dstpath_fw_len > maxlen) { // sizeof(prefix) includes trailing NUL, cancelling out the +1 for the path separator warnx("unlink: path '%s/%s' too long", dstpath, fw_dirent->d_name); @@ -1080,7 +1080,7 @@ void UavcanServers::unpackFwFromROMFS(const char* sd_path, const char* romfs_pat memcpy(&srcpath[srcpath_ver_len + 1], src_fw_dirent->d_name, fw_len + 1); dstpath[dstpath_ver_len] = '/'; - memcpy(&dstpath[dstpath_ver_len], src_fw_dirent->d_name, fw_len + 1); + memcpy(&dstpath[dstpath_ver_len +1], src_fw_dirent->d_name, fw_len + 1); rv = copyFw(dstpath, srcpath); if (rv != 0) { From daccfc6c40ecbdbe99c9cddfbc750f59c9580d9a Mon Sep 17 00:00:00 2001 From: David Sidrane Date: Mon, 23 Nov 2015 13:56:39 -1000 Subject: [PATCH 4/6] Fixed repeated output --- src/modules/uavcan/uavcan_servers.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/modules/uavcan/uavcan_servers.cpp b/src/modules/uavcan/uavcan_servers.cpp index 701390de86..ce80a88fab 100644 --- a/src/modules/uavcan/uavcan_servers.cpp +++ b/src/modules/uavcan/uavcan_servers.cpp @@ -1055,7 +1055,7 @@ void UavcanServers::unpackFwFromROMFS(const char* sd_path, const char* romfs_pat dstpath[dstpath_ver_len] = '/'; memcpy(&dstpath[dstpath_ver_len + 1], fw_dirent->d_name, fw_len + 1); unlink(dstpath); - warnx("unlink: removed '%s/%s'", dstpath, fw_dirent->d_name); + warnx("unlink: removed '%s'", dstpath); } } else { // User file, don't copy firmware From bc89f6faefd5eaa6321b3de9ac18d27963bac67f Mon Sep 17 00:00:00 2001 From: David Sidrane Date: Mon, 23 Nov 2015 13:58:55 -1000 Subject: [PATCH 5/6] todo:Added todo for using strcat --- src/modules/uavcan/uavcan_servers.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/src/modules/uavcan/uavcan_servers.cpp b/src/modules/uavcan/uavcan_servers.cpp index ce80a88fab..1b4a7e1056 100644 --- a/src/modules/uavcan/uavcan_servers.cpp +++ b/src/modules/uavcan/uavcan_servers.cpp @@ -907,6 +907,7 @@ void UavcanServers::unpackFwFromROMFS(const char* sd_path, const char* romfs_pat In each version directory, we remove any files with a name starting with "romfs_" in the corresponding directory on the SD card that don't match the bundled firmware filename; if the directory is empty after that process, we copy the bundled firmware. + todo:This code would benefit from the use of strcat. */ const size_t maxlen = UAVCAN_MAX_PATH_LENGTH; const size_t sd_path_len = strlen(sd_path); From 5d422f5c300e4b74642f614ed5e8597b88dc11c1 Mon Sep 17 00:00:00 2001 From: David Sidrane Date: Mon, 23 Nov 2015 14:10:23 -1000 Subject: [PATCH 6/6] Updated comments --- src/modules/uavcan/uavcan_servers.cpp | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/src/modules/uavcan/uavcan_servers.cpp b/src/modules/uavcan/uavcan_servers.cpp index 1b4a7e1056..5e51317737 100644 --- a/src/modules/uavcan/uavcan_servers.cpp +++ b/src/modules/uavcan/uavcan_servers.cpp @@ -897,6 +897,8 @@ void UavcanServers::unpackFwFromROMFS(const char* sd_path, const char* romfs_pat - - - /othernode-v3-1.6.25d0137d.bin firmware file for com.example.othernode-v3, hardware version 1.6 The ROMFS directory structure is the same, but located at /etc/uavcan/fw + Files located there are prefixed with _ to identify them a comming from the rom + file system. We iterate over all device directories in the ROMFS base directory, and create corresponding device directories on the SD card if they don't already exist. @@ -904,10 +906,12 @@ void UavcanServers::unpackFwFromROMFS(const char* sd_path, const char* romfs_pat In each device directory, we iterate over each version directory and create a corresponding version directory on the SD card if it doesn't already exist. - In each version directory, we remove any files with a name starting with "romfs_" + In each version directory, we remove any files with a name starting with "_" in the corresponding directory on the SD card that don't match the bundled firmware filename; if the directory is empty after that process, we copy the bundled firmware. + todo:This code would benefit from the use of strcat. + */ const size_t maxlen = UAVCAN_MAX_PATH_LENGTH; const size_t sd_path_len = strlen(sd_path);