Install pyOCD on Raspberry Pi

Installing pyOCD on Raspberry Pi turned out to be a bit more complicated than a simple pip install. The main problem is that pyOCD depend on cmsis-pack-manager but there is no wheel available for Raspberry Pi and the package can't be compiled without running out of memory. It is described in the documentation and a simple fix is also suggested. The problem is that the fix didn't work for me. Instead this is what worked for me:

Custom build pyOCD with cmsis-pack-manager removed

Install build package on system python on the Raspberry Pi

$ python -m pip install build

Clone pyocd source and checkout the version you need

$ git clone git@github.com:pyocd/pyOCD.git
$ git checkout tags/v0.33.1

Remove cmsis-pack-manager from dependencies in setup.cfg. It is one line under the install_requires option.

From the root folder of the pyOCD source build pyOCD with

$ python -m build --sdist

The build is saved as a .tar.gz file in the dist directory. You need the path to the .tar.gz in the next step.

Pip install custom built package and patch missing type

Create and activate a virtual environment and install your custom pyocd package

$ python -m venv .venv
$ source .venv/bin/activate
(.venv) $ python -m pip install [path_to_local_pyocd_dist_tar_gz]

If you try to run pyocd now you get an error about a missing object. Patch the missing type in .venv/lib/python3.X/site-packages/pyocd/target/pack/pack_target.py Add this to the start of pack_target.py

class Mock:
    class Cache:
        pass

cmsis_pack_manager = Mock()

Update: It seems that a better solution is to add

from __future__ import annotations

as the first line in pack_target.py instead of monkey-patching cmsis_pack_manager. Found here: https://github.com/pyocd/pyOCD/issues/1338

Copy udev rules for your debugger and download pack for mcu

pyOCD is now installed and ready to run. I am using an Atmel ICE debugger and to get access to it I had to copy some udev rules from the pyocd source and restart udev

$ cp <pyocd_source>/udev/50-cmsis-dap.rules /etc/udev/rules.d/
$ sudo udevadm control --reload
$ sudo udevadm trigger

Also since pyOCD is built without the cmsis-pack-manager you have to manually download the correct pack for your board which you can find here (https://www.keil.com/dd2/pack/). You can read more about manually installing packs here.

I am working on an SAMD21J17A from Microchip so I downloaded the corresponding pack

$ wget https://packs.download.microchip.com/Microchip.SAMD21_DFP.3.6.144.atpack

And the last step is to create a pyocd config file (pyocd.yaml) that points to the downloaded pack

pack:
  - <abs_path_to_pack_file>

Ready to flash

Finally you are ready to flash

(.venv) $ python -m pyocd reset -t atsamd21j17a --frequency 400khz --method hw
(.venv) $ python -m pyocd flash -t atsamd21j17a --frequency 400khz [file_to_flash]