# NXP K32W0x1 OTA guide ## The Secondary Stage Bootloader (SSBL) There are multiple SSBL binaries provided by the SDK: | description | github SDK path | package SDK path | | ------------------------------- | -------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------ | | Default SSBL | NA | `boards/k32w061dk6/wireless_examples/framework/ssbl/binary/ssbl.bin` | | SSBL with PDM in external flash | `examples/k32w061dk6/wireless_examples/framework/ssbl/binary/ssbl_ext_flash_pdm_support.bin` | `boards/k32w061dk6/wireless_examples/framework/ssbl/binary/ssbl_ext_flash_pdm_support.bin` | The SSBL is also built alongside the reference application and it can be configured according to the following table: | gn arg | default | description | | --------------------------------- | --------------------------- | ---------------------------------------------------------------------------------------- | | `ssbl_pdm_external_flash` | true | Enable/disable PDM in external flash | | `ssbl_multi_image_support` | true | Enable/disable multi-image OTA feature | | `ssbl_ota_entry_storage` | "OTACustomStorage_ExtFlash" | Configure custom OTA entry storage type | | `ssbl_simple_hash_verification` | false | Enable/disable simple hash verification alternative to secure boot | | `ssbl_optimize_spifi_flash` | false | Optimize `SPIFI` flash driver size | | `ssbl_spifi_dual_mode` | false | Enable/disable `SPIFI` dual mode support (e.g. used by K32W041AM variant) | | `ssbl_version` | 0 | Set SSBL version | | `ssbl_use_redlib` | false | Enable/disable usage of `redlib` NXP library. If false, the build will use `newlib` nano | | `ssbl_ota_data_in_external_flash` | false | Enable/disable OTA support for application with sections stored in external flash | ## Simple hash verification When secure boot is not used, a simple hash can be appended at the end of the image for integrity check. Applications should be built with `chip_simple_hash_verification=1`. ## Writing the SSBL Before writing the SSBL, it it recommanded to fully erase the internal flash. Using DK6Programmer utility from Windows: ``` DK6Programmer.exe -V 5 -P 1000000 -s -e Flash ``` Using `dk6prog` from `SPSDK`: ``` $ dk6prog listdev This is an experimental utility. Use with caution! List of available devices: DEVICE ID: DN038ZH3, VID: 0x403, PID: 0x6015, Serial number: DN038ZH3, Description: DK6 Carrier Board, Address: 9, Backend: Backend.PYFTDI $ dk6prog -d DN038ZH3 erase 0 0x9de00 This is an experimental utility. Use with caution! Erasing memory [####################################] 100% ``` `chip-k32w0x-ssbl.bin` must be written at address 0 in the internal flash: Using DK6Programmer utility from Windows: ``` DK6Programmer.exe -V2 -s -P 1000000 -Y -p FLASH@0x00="chip-k32w0x-ssbl.bin" ``` Using `dk6prog` from `SPSDK`: ``` $ dk6prog -d DN038ZH3 write 0 ~/path/to/bin/chip-k32w0x-ssbl.bin This is an experimental utility. Use with caution! Writing memory [####################################] 100% Written 7890 bytes to memory ID 0 at address 0x0 ``` ### Writing the PSECT This is the list of all supported partitions: ``` 0000000010000000 : SSBL partition 00000000 -----------> Start Address 1000 ---------------> 0x0010 Number of 512-bytes pages 00 -----------------> 0x00 Bootable flag 00 -----------------> 0x00 Image type (0x00 = SSBL) 00400000c9040101: Application partition 00400000 -----------> 0x00004000 Start Address c904 ---------------> 0x04c9 Number of 512-bytes pages 01 -----------------> 0x01 Bootable flag 01 -----------------> 0x01 Image type (0x01 = Application) 00000010800000fe: Ext Flash text partition 00000010 -----------> 0x10000000 Start Address (external flash) 8000 ---------------> 0x0080 Number of 512-bytes pages 00 -----------------> 0x00 Bootable flag fe -----------------> 0xFE Image type (0xFE = Ext Flash text) 00000110300200fc : OTA Image partition 00000110 -----------> 0x10010000 Start Address 3002----------------> 0x0230 Number of 512-bytes pages 00 -----------------> 0x00 Bootable flag fc -----------------> 0xFC Image type (0xFC = OTA partition) 00000510100000fd: NVM partition 00000510 -----------> 0x10050000 Start Address 1000 ---------------> 0x0010 Number of 512-bytes pages 00 -----------------> 0x00 Bootable flag fd -----------------> 0xFD Image type (0xFD = NVM partition) ``` First, image directory 0 (SSBL partition) must be written: Using DK6Programmer utility from Windows: ``` DK6Programmer.exe -V5 -s -P 1000000 -w image_dir_0=0000000010000000 ``` Using `dk6prog` from `SPSDK`: ``` $ dk6prog -d DN038ZH3 write 0x160 [[0000000010000000]] 8 PSECT This is an experimental utility. Use with caution! Writing memory [####################################] 100% Written 8 bytes to memory ID PSECT at address 0x160 ``` Here is the interpretation of the fields: ``` 00000000 -> start address 0x00000000 1000 -> size = 0x0010 pages of 512-bytes (= 8kB) 00 -> not bootable (only used by the SSBL to support SSBL update) 00 -> SSBL Image Type ``` Second, image directory 1 (application partition) must be written: Using DK6Programmer utility from Windows: ``` DK6Programmer.exe -V5 -s -P 1000000 -w image_dir_1=00400000C9040101 ``` Using `dk6prog` from `SPSDK`: ``` $ dk6prog -d DN038ZH3 write 0x168 [[00400000C9040101]] 8 PSECT This is an experimental utility. Use with caution! Writing memory [####################################] 100% Written 8 bytes to memory ID PSECT at address 0x168 ``` Here is the interpretation of the fields: ``` 00400000 -> start address 0x00004000 C904 -> 0x4C9 pages of 512-bytes (= 612.5kB) 01 -> bootable flag 01 -> image type for the application ``` Please note the user can write additional partitions by writing `image_dir_2/3/4` with the wanted configuration. In case of using the `SPSDK` tool, the appropriate offset must be calculated ## Removing SSBL Upgrade Region The example also offers the possibility to remove SSBL upgrade region, for reserving more space for application level. A new flag `chip_reduce_ssbl_size` is introduced. In order to remove the SSBL upgrade region, `chip_reduce_ssbl_size=true` must be provided to the build system The programming method will change: - Writing image directory 1 should change to Using DK6Programmer utility from Windows: ``` DK6Programmer.exe -V5 -s -P 1000000 -w image_dir_1=00200000D9040101 ``` Using `dk6prog` from `SPSDK`: ``` $ dk6prog -d DN038ZH3 write 0x168 [[00200000D9040101]] 8 PSECT This is an experimental utility. Use with caution! Writing memory [####################################] 100% Written 8 bytes to memory ID PSECT at address 0x168 ``` Here is the interpretation of the fields: ``` 00200000 -> start address 0x00002000 D904 -> 0x4D9 pages of 512-bytes (= 620.5kB) 01 -> bootable flag 01 -> image type for the application ``` - Matter application offset address should change to Using DK6Programmer utility from Windows: ``` DK6Programmer.exe -V2 -s -P 1000000 -Y -p FLASH@0x2000="chip-k32w0x-contact-example.bin" ``` Using `dk6prog` from `SPSDK`: ``` $ dk6prog -d DN038ZH3 write 0x2000 ~/path/to/bin/chip-k32w0x-contact-example.bin This is an experimental utility. Use with caution! Writing memory [####################################] 100% Written 596450 bytes to memory ID 0 at address 0x2000 ```