mbed_example.sh 8.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232
  1. #!/usr/bin/env bash
  2. #
  3. # Copyright (c) 2020 Project CHIP Authors
  4. #
  5. # Licensed under the Apache License, Version 2.0 (the "License");
  6. # you may not use this file except in compliance with the License.
  7. # You may obtain a copy of the License at
  8. #
  9. # http://www.apache.org/licenses/LICENSE-2.0
  10. #
  11. # Unless required by applicable law or agreed to in writing, software
  12. # distributed under the License is distributed on an "AS IS" BASIS,
  13. # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  14. # See the License for the specific language governing permissions and
  15. # limitations under the License.
  16. #
  17. cd "$(dirname "$0")"/../..
  18. CHIP_ROOT=$PWD
  19. SUPPORTED_TOOLCHAIN=(GCC_ARM ARM)
  20. SUPPORTED_TARGET_BOARD=(CY8CPROTO_062_4343W)
  21. SUPPORTED_APP=(lock-app lighting-app pigweed-app all-clusters-app all-clusters-minimal-app shell ota-requestor-app)
  22. SUPPORTED_PROFILES=(release develop debug)
  23. SUPPORTED_COMMAND=(build flash build-flash)
  24. SUPPORTED_TYPE=(simple boot upgrade)
  25. COMMAND=build
  26. APP=lock-app
  27. TARGET_BOARD=CY8CPROTO_062_4343W
  28. TOOLCHAIN=GCC_ARM
  29. PROFILE=release
  30. TYPE=simple
  31. TARGET_MEMORY_ALIGN[CY8CPROTO_062_4343W]=8
  32. TARGET_BOOT_IMAGE_ERASE_VALUE[CY8CPROTO_062_4343W]=0
  33. TARGET_UPGRADE_IMAGE_ERASE_VALUE[CY8CPROTO_062_4343W]=0xff
  34. for i in "$@"; do
  35. case $i in
  36. -a=* | --app=*)
  37. APP="${i#*=}"
  38. shift
  39. ;;
  40. -b=* | --board=*)
  41. TARGET_BOARD="${i#*=}"
  42. shift
  43. ;;
  44. -t=* | --toolchain=*)
  45. TOOLCHAIN="${i#*=}"
  46. shift
  47. ;;
  48. -p=* | --profile=*)
  49. PROFILE="${i#*=}"
  50. shift
  51. ;;
  52. -c=* | --command=*)
  53. COMMAND="${i#*=}"
  54. shift
  55. ;;
  56. -T=* | --type=*)
  57. TYPE="${i#*=}"
  58. shift
  59. ;;
  60. *)
  61. # unknown option
  62. ;;
  63. esac
  64. done
  65. if [[ ! " ${SUPPORTED_COMMAND[@]} " =~ " ${COMMAND} " ]]; then
  66. echo "ERROR: Command $COMMAND not supported"
  67. exit 1
  68. fi
  69. if [[ ! " ${SUPPORTED_TARGET_BOARD[@]} " =~ " ${TARGET_BOARD} " ]]; then
  70. echo "ERROR: Target $TARGET_BOARD not supported"
  71. exit 1
  72. fi
  73. if [[ ! " ${SUPPORTED_APP[@]} " =~ " ${APP} " ]]; then
  74. echo "ERROR: Application $APP not supported"
  75. exit 1
  76. fi
  77. if [[ ! " ${SUPPORTED_TOOLCHAIN[@]} " =~ " ${TOOLCHAIN} " ]]; then
  78. echo "ERROR: Toolchain $TOOLCHAIN not supported"
  79. exit 1
  80. fi
  81. if [[ ! " ${SUPPORTED_PROFILES[@]} " =~ " ${PROFILE} " ]]; then
  82. echo "ERROR: Profile $PROFILE not supported"
  83. exit 1
  84. fi
  85. if [[ ! " ${SUPPORTED_TYPE[@]} " =~ " ${TYPE} " ]]; then
  86. echo "ERROR: Type $TYPE not supported"
  87. exit 1
  88. fi
  89. if [[ "$TYPE" == "boot" ]] && [[ "$PROFILE" == "debug" ]]; then
  90. echo "ERROR: The $TYPE application type does not supprort ""$PROFILE profile"
  91. exit 1
  92. fi
  93. set -e # Exit immediately if a command exits with a non-zero status.
  94. # Activate Matter environment
  95. source "$CHIP_ROOT"/scripts/activate.sh
  96. # Application directory setup
  97. APP_DIRECTORY="$CHIP_ROOT"/examples/"$APP"/mbed
  98. # Build directory setup
  99. BUILD_DIRECTORY="$APP_DIRECTORY"/build-"$TARGET_BOARD"/"$PROFILE"
  100. # Set bootloader root directory
  101. BOOTLOADER_ROOT_DIRECTORY="$CHIP_ROOT"/examples/platform/mbed/bootloader
  102. # Set bootloader build directory
  103. BOOTLOADER_BUILD_DIRECTORY="$BOOTLOADER_ROOT_DIRECTORY"/build-"$TARGET_BOARD"/"$PROFILE"/
  104. # Set encryption key directory
  105. ENC_KEY_DIRECTORY="$BOOTLOADER_ROOT_DIRECTORY"/enc-key
  106. if [[ "$COMMAND" == *"build"* ]]; then
  107. echo "Build $TYPE $APP app for $TARGET_BOARD target with $TOOLCHAIN toolchain and $PROFILE profile"
  108. # Set Mbed OS path
  109. MBED_OS_PATH="$CHIP_ROOT"/third_party/mbed-os/repo
  110. # Set Mbed OS posix socket submodule path
  111. MBED_OS_POSIX_SOCKET_PATH="$CHIP_ROOT"/third_party/mbed-os-posix-socket/repo
  112. # Set Mbed MCU boot path
  113. MBED_MCU_BOOT_PATH="$CHIP_ROOT"/third_party/mbed-mcu-boot/repo
  114. if [[ "$TYPE" == "boot" ]]; then
  115. cd "$BOOTLOADER_ROOT_DIRECTORY"
  116. # Install mcuboot requirements (silently)
  117. pip install -q -r "$MBED_MCU_BOOT_PATH"/scripts/requirements.txt
  118. # Run mcuboot setup script
  119. python "$MBED_MCU_BOOT_PATH"/scripts/setup.py install
  120. # Check if encryption key exists, if not generate it
  121. if [[ ! -f "$ENC_KEY_DIRECTORY"/enc-key.pem ]]; then
  122. mkdir -p "$ENC_KEY_DIRECTORY"
  123. "$MBED_MCU_BOOT_PATH"/scripts/imgtool.py keygen -k "$ENC_KEY_DIRECTORY"/enc-key.pem -t rsa-2048
  124. fi
  125. # Create the signing keys source fille
  126. "$MBED_MCU_BOOT_PATH"/scripts/imgtool.py getpub -k "$ENC_KEY_DIRECTORY"/enc-key.pem >signing_keys.c
  127. ln -sfTr "$MBED_MCU_BOOT_PATH"/boot/mbed mcuboot
  128. # Generate config file for selected target, toolchain and hardware
  129. mbed-tools configure -t "$TOOLCHAIN" -m "$TARGET_BOARD" -o "$BOOTLOADER_BUILD_DIRECTORY" --mbed-os-path "$MBED_OS_PATH"
  130. # Remove old artifacts to force linking
  131. rm -rf "$BOOTLOADER_BUILD_DIRECTORY/chip-"*
  132. # Build application
  133. cmake -S . -B "$BOOTLOADER_BUILD_DIRECTORY" -GNinja -DCMAKE_BUILD_TYPE="$PROFILE" -DMBED_OS_PATH="$MBED_OS_PATH" -DMBED_MCU_BOOT_PATH="$MBED_MCU_BOOT_PATH"
  134. cmake --build "$BOOTLOADER_BUILD_DIRECTORY"
  135. cd "$CHIP_ROOT"/examples
  136. fi
  137. if [[ "$TYPE" == "upgrade" ]]; then
  138. # Check if encryption key exists
  139. if [[ ! -f "$ENC_KEY_DIRECTORY"/enc-key.pem ]]; then
  140. echo "ERROR: encryption key for upgrade image not exist"
  141. exit 1
  142. fi
  143. fi
  144. # Set Mbed OS posix socket submodule path
  145. MBED_OS_POSIX_SOCKET_PATH="$CHIP_ROOT"/third_party/mbed-os-posix-socket/repo
  146. if [[ "$TYPE" == "boot" || "$TYPE" == "upgrade" ]]; then
  147. ln -sfTr "$MBED_MCU_BOOT_PATH"/boot/mbed "$APP_DIRECTORY"/mcuboot
  148. fi
  149. # Generate config file for selected target, toolchain and hardware
  150. mbed-tools configure -t "$TOOLCHAIN" -m "$TARGET_BOARD" -p "$APP_DIRECTORY" -o "$BUILD_DIRECTORY" --mbed-os-path "$MBED_OS_PATH"
  151. # Remove old artifacts to force linking
  152. rm -rf "$BUILD_DIRECTORY/chip-"*
  153. # Build application
  154. cmake -S "$APP_DIRECTORY" -B "$BUILD_DIRECTORY" -GNinja -DCMAKE_BUILD_TYPE="$PROFILE" -DMBED_OS_PATH="$MBED_OS_PATH" -DMBED_OS_POSIX_SOCKET_PATH="$MBED_OS_POSIX_SOCKET_PATH" -DMBED_MCU_BOOT_PATH="$MBED_MCU_BOOT_PATH" -DMBED_APP_TYPE="$TYPE"
  155. cmake --build "$BUILD_DIRECTORY"
  156. if [[ "$TYPE" == "boot" || "$TYPE" == "upgrade" ]]; then
  157. APP_VERSION=$(jq '.config."version-number-str".value' "$APP_DIRECTORY"/mbed_app.json | tr -d '\\"')
  158. HEADER_SIZE=$(jq '.target_overrides.'\""$TARGET_BOARD"\"'."mcuboot.header-size"' "$APP_DIRECTORY"/mbed_app.json | tr -d \")
  159. SLOT_SIZE=$(jq '.target_overrides.'\""$TARGET_BOARD"\"'."mcuboot.slot-size"' "$APP_DIRECTORY"/mbed_app.json | tr -d \")
  160. if [[ "$TYPE" == "boot" ]]; then
  161. # Signed the primary application
  162. "$MBED_MCU_BOOT_PATH"/scripts/imgtool.py sign -k "$ENC_KEY_DIRECTORY"/enc-key.pem \
  163. --align "${TARGET_MEMORY_ALIGN[$TARGET_BOARD]}" -v "$APP_VERSION" --header-size $(($HEADER_SIZE)) --pad-header -S "$SLOT_SIZE" -R "${TARGET_BOOT_IMAGE_ERASE_VALUE[$TARGET_BOARD]}" \
  164. "$BUILD_DIRECTORY"/chip-mbed-"$APP"-example.hex "$BUILD_DIRECTORY"/chip-mbed-"$APP"-example-signed.hex
  165. # Create the factory firmware (bootloader + signed primary application)
  166. hexmerge.py -o "$BUILD_DIRECTORY"/chip-mbed-"$APP"-example.hex --no-start-addr "$BOOTLOADER_BUILD_DIRECTORY"/chip-mbed-bootloader.hex "$BUILD_DIRECTORY"/chip-mbed-"$APP"-example-signed.hex
  167. elif [[ "$TYPE" == "upgrade" ]]; then
  168. # Signed the secondary application
  169. "$MBED_MCU_BOOT_PATH"/scripts/imgtool.py sign -k "$ENC_KEY_DIRECTORY"/enc-key.pem \
  170. --align "${TARGET_MEMORY_ALIGN[$TARGET_BOARD]}" -v "$APP_VERSION" --header-size $(($HEADER_SIZE)) --pad-header -S "$SLOT_SIZE" -R "${TARGET_UPGRADE_IMAGE_ERASE_VALUE[$TARGET_BOARD]}" \
  171. "$BUILD_DIRECTORY"/chip-mbed-"$APP"-example.hex "$BUILD_DIRECTORY"/chip-mbed-"$APP"-example-signed.hex
  172. # Convert hex image to raw binary file
  173. arm-none-eabi-objcopy -I ihex -O binary "$BUILD_DIRECTORY"/chip-mbed-"$APP"-example-signed.hex "$BUILD_DIRECTORY"/chip-mbed-"$APP"-example.bin
  174. python "$CHIP_ROOT"/examples/platform/mbed/ota/generate_ota_list_image.py "$APP_DIRECTORY"/mbed_app.json "$BUILD_DIRECTORY"/chip-mbed-"$APP"-example.bin
  175. fi
  176. fi
  177. fi
  178. if [[ "$COMMAND" == *"flash"* ]]; then
  179. echo "Flash $TYPE $APP app to $TARGET_BOARD target [$TOOLCHAIN toolchain, $PROFILE profile]"
  180. # Flash scripts path setup
  181. MBED_FLASH_SCRIPTS_PATH=$CHIP_ROOT/config/mbed/scripts
  182. APP_PATH="$BUILD_DIRECTORY"/chip-mbed-"$APP"-example.elf
  183. # Flash application
  184. "$OPENOCD_PATH"/bin/openocd -f "$MBED_FLASH_SCRIPTS_PATH/$TARGET_BOARD".tcl -c "program $APP_PATH verify reset exit"
  185. fi