FlashAlgo icon indicating copy to clipboard operation
FlashAlgo copied to clipboard

pyocd raises FlashAlgoException on FlashAlgo FLM

Open driftregion opened this issue 3 years ago • 1 comments

Background

I have a Keil pack that is missing a flash memory region which I'd like to manipulate via pyocd.

Pack

https://developer.arm.com/embedded/cmsis/cmsis-packs/devices/NXP/S32K142UAxxxLLx Keil.S32_SDK_DFP.1.5.0.pack Keil.S32_SDK_DFP.pdsc

Memory regions

  1. 0x00000000-0x00040000 "Program / code flash" (pack contains .FLM, usable with pyocd)
  2. 0x10000000-0x1000FFFF "FlexNVM / code flash" (no .FLM)

relevant section of .pdsc:

        <!-- ******************************  Device 'S32K142'  ****************************** -->
        <device Dname="S32K142">
          <book name="doc/S32SDK_S32K142_UserManual.pdf" title="S32SDK User Manual"/>

          <compile header="platform/devices/device_registers.h"/> <!-- generates warning in PackCheck because name is not CMSIS conform -->
          <compile define="CPU_S32K142"/>
          <debug  svd="platform/devices/S32K142/S32K142.svd"/>
          <memory id="IROM1"                                     start="0x00000000" size="0x00040000" default="1" startup="1"/>
          <algorithm name="CMSIS/Flash/S32K142_P256_2KB_SEC.FLM" start="0x00000000" size="0x00040000" default="1"/>
        <!-- variants... -->
        </device>

Problem encountered

I've found and read the CMSIS-Pack-Spec Flash Algorithm documentation: https://open-cmsis-pack.github.io/Open-CMSIS-Pack-Spec/main/html/flashAlgorithm.html

I've started by reproducing the existing .FLM for memory region 0x0000000-0x00040000. A patch is here: https://github.com/driftregion/FlashAlgo/commit/c6463340f6a7b6ac6807efc8c93610f1f253068e

Using this patch to pyocd flash ... , I find the following error:

pyocd.target.pack.flash_algo.FlashAlgoException: RW section does not follow RO section

This looks linker-related, but I'm not sure where to start.

I've attached the original .FLM (S32K142_P256_2KB_SEC.FLM.bak) and the .FLM produced by my patch (S32K142_P256_2KB_SEC.FLM) as a zip file:
S32K142_P256_2KB_SEC.zip

FlashAlgo:project_generator question

  • is it possible for a project in projects.yaml to output multiple .elf/.FLM files? This target device has two non-contiguous flash regions. If I understand correctly, each region needs its own .FLM

Upstreaming question

  • If this works and results in a usable .FLM, is there an established way to share community-extended .pack files?
  • Alternately (preferably?), is it probable that NXP would update their .pack?

Related: https://github.com/pyocd/cmsis-pack-manager/issues/122#issuecomment-538858623

driftregion avatar Aug 18 '22 03:08 driftregion

I'm now able to build a .FLM that passes flash_algo.py. https://github.com/driftregion/FlashAlgo/commit/c685f32928f080c977b1badc97f1f9f0efb3157e

Now flash erase fails with the following error:

pyocd.core.exceptions.FlashEraseFailure: flash erase sector failure (address 0x0000f000; result code 0x1)

driftregion avatar Aug 18 '22 07:08 driftregion