pyocd / pyocd/pyOCD

`pyocd load`/`flash` fails on micro:bit V2 trying to erase sectors

Open
#1,262 12 comments 0 reactions 0 assignees View on GitHub

Nobody has claimed this yet.

Dominant language
Python
Stars
1.5k
Forks
560
Avg merge
1h 41m
Merged PRs (30d)
3

Description

Chip erase works, but the flashing via load or flash commands, with and without the --target nrf52833 flag fail:

 $ pyocd --version
0.32.1
 $ pyocd list
  #   Probe                     Unique ID
----------------------------------------------------------------------------------
  0   micro:bit v2 [nrf52833]   9904360249624e45005160190000003b000000009796990b
 $ pyocd erase --chip --target nrf52833
0002165:INFO:eraser:Erasing chip...
0010320:INFO:eraser:Done
 $ pyocd load CALL_ME_MICROBIT.hex
0001357:INFO:load_cmd:Loading /Users/microbit-carlos/Downloads/CALL_ME_MICROBIT.hex
[                                                  ]   0%0002229:CRITICAL:__main__:flash erase sector failure (address 0x00000000; result code 0x67)
Traceback (most recent call last):
  File "/Users/microbit-carlos/workspace/microbit-foundation/DAPLink-mbef-fork/venv/lib/python3.6/site-packages/pyocd/__main__.py", line 150, in run
    status = cmd.invoke()
  File "/Users/microbit-carlos/workspace/microbit-foundation/DAPLink-mbef-fork/venv/lib/python3.6/site-packages/pyocd/subcommands/load_cmd.py", line 120, in invoke
    file_format=self._args.format)
  File "/Users/microbit-carlos/workspace/microbit-foundation/DAPLink-mbef-fork/venv/lib/python3.6/site-packages/pyocd/flash/file_programmer.py", line 171, in program
    self._loader.commit()
  File "/Users/microbit-carlos/workspace/microbit-foundation/DAPLink-mbef-fork/venv/lib/python3.6/site-packages/pyocd/flash/loader.py", line 293, in commit
    keep_unwritten=self._keep_unwritten)
  File "/Users/microbit-carlos/workspace/microbit-foundation/DAPLink-mbef-fork/venv/lib/python3.6/site-packages/pyocd/flash/builder.py", line 509, in program
    flash_operation = self._sector_erase_program_double_buffer(progress_cb)
  File "/Users/microbit-carlos/workspace/microbit-foundation/DAPLink-mbef-fork/venv/lib/python3.6/site-packages/pyocd/flash/builder.py", line 911, in _sector_erase_program_double_buffer
    self.flash.erase_sector(sector.addr)
  File "/Users/microbit-carlos/workspace/microbit-foundation/DAPLink-mbef-fork/venv/lib/python3.6/site-packages/pyocd/flash/flash.py", line 374, in erase_sector
    raise FlashEraseFailure('flash erase sector failure', address=address, result_code=result)
pyocd.core.exceptions.FlashEraseFailure: flash erase sector failure (address 0x00000000; result code 0x67)
 $ pyocd load CALL_ME_MICROBIT.hex  --target nrf52833
0001507:INFO:load_cmd:Loading /Users/microbit-carlos/Downloads/CALL_ME_MICROBIT.hex
[                                                  ]   0%0002362:CRITICAL:__main__:flash erase sector failure (address 0x00000000; result code 0x67)
Traceback (most recent call last):
  File "/Users/microbit-carlos/workspace/microbit-foundation/DAPLink-mbef-fork/venv/lib/python3.6/site-packages/pyocd/__main__.py", line 150, in run
    status = cmd.invoke()
  File "/Users/microbit-carlos/workspace/microbit-foundation/DAPLink-mbef-fork/venv/lib/python3.6/site-packages/pyocd/subcommands/load_cmd.py", line 120, in invoke
    file_format=self._args.format)
  File "/Users/microbit-carlos/workspace/microbit-foundation/DAPLink-mbef-fork/venv/lib/python3.6/site-packages/pyocd/flash/file_programmer.py", line 171, in program
    self._loader.commit()
  File "/Users/microbit-carlos/workspace/microbit-foundation/DAPLink-mbef-fork/venv/lib/python3.6/site-packages/pyocd/flash/loader.py", line 293, in commit
    keep_unwritten=self._keep_unwritten)
  File "/Users/microbit-carlos/workspace/microbit-foundation/DAPLink-mbef-fork/venv/lib/python3.6/site-packages/pyocd/flash/builder.py", line 509, in program
    flash_operation = self._sector_erase_program_double_buffer(progress_cb)
  File "/Users/microbit-carlos/workspace/microbit-foundation/DAPLink-mbef-fork/venv/lib/python3.6/site-packages/pyocd/flash/builder.py", line 911, in _sector_erase_program_double_buffer
    self.flash.erase_sector(sector.addr)
  File "/Users/microbit-carlos/workspace/microbit-foundation/DAPLink-mbef-fork/venv/lib/python3.6/site-packages/pyocd/flash/flash.py", line 374, in erase_sector
    raise FlashEraseFailure('flash erase sector failure', address=address, result_code=result)
pyocd.core.exceptions.FlashEraseFailure: flash erase sector failure (address 0x00000000; result code 0x67)
$ pyocd flash CALL_ME_MICROBIT.hex --target nrf52833
0001497:INFO:load_cmd:Loading /Users/microbit-carlos/Downloads/CALL_ME_MICROBIT.hex
[                                                  ]   0%0002355:CRITICAL:__main__:flash erase sector failure (address 0x00000000; result code 0x67)
Traceback (most recent call last):
  File "/Users/microbit-carlos/workspace/microbit-foundation/DAPLink-mbef-fork/venv/lib/python3.6/site-packages/pyocd/__main__.py", line 150, in run
    status = cmd.invoke()
  File "/Users/microbit-carlos/workspace/microbit-foundation/DAPLink-mbef-fork/venv/lib/python3.6/site-packages/pyocd/subcommands/load_cmd.py", line 120, in invoke
    file_format=self._args.format)
  File "/Users/microbit-carlos/workspace/microbit-foundation/DAPLink-mbef-fork/venv/lib/python3.6/site-packages/pyocd/flash/file_programmer.py", line 171, in program
    self._loader.commit()
  File "/Users/microbit-carlos/workspace/microbit-foundation/DAPLink-mbef-fork/venv/lib/python3.6/site-packages/pyocd/flash/loader.py", line 293, in commit
    keep_unwritten=self._keep_unwritten)
  File "/Users/microbit-carlos/workspace/microbit-foundation/DAPLink-mbef-fork/venv/lib/python3.6/site-packages/pyocd/flash/builder.py", line 509, in program
    flash_operation = self._sector_erase_program_double_buffer(progress_cb)
  File "/Users/microbit-carlos/workspace/microbit-foundation/DAPLink-mbef-fork/venv/lib/python3.6/site-packages/pyocd/flash/builder.py", line 911, in _sector_erase_program_double_buffer
    self.flash.erase_sector(sector.addr)
  File "/Users/microbit-carlos/workspace/microbit-foundation/DAPLink-mbef-fork/venv/lib/python3.6/site-packages/pyocd/flash/flash.py", line 374, in erase_sector
    raise FlashEraseFailure('flash erase sector failure', address=address, result_code=result)
pyocd.core.exceptions.FlashEraseFailure: flash erase sector failure (address 0x00000000; result code 0x67)
$ pyocd flash CALL_ME_MICROBIT.hex
0001354:INFO:load_cmd:Loading /Users/microbit-carlos/Downloads/CALL_ME_MICROBIT.hex
[                                                  ]   0%0002218:CRITICAL:__main__:flash erase sector failure (address 0x00000000; result code 0x67)
Traceback (most recent call last):
  File "/Users/microbit-carlos/workspace/microbit-foundation/DAPLink-mbef-fork/venv/lib/python3.6/site-packages/pyocd/__main__.py", line 150, in run
    status = cmd.invoke()
  File "/Users/microbit-carlos/workspace/microbit-foundation/DAPLink-mbef-fork/venv/lib/python3.6/site-packages/pyocd/subcommands/load_cmd.py", line 120, in invoke
    file_format=self._args.format)
  File "/Users/microbit-carlos/workspace/microbit-foundation/DAPLink-mbef-fork/venv/lib/python3.6/site-packages/pyocd/flash/file_programmer.py", line 171, in program
    self._loader.commit()
  File "/Users/microbit-carlos/workspace/microbit-foundation/DAPLink-mbef-fork/venv/lib/python3.6/site-packages/pyocd/flash/loader.py", line 293, in commit
    keep_unwritten=self._keep_unwritten)
  File "/Users/microbit-carlos/workspace/microbit-foundation/DAPLink-mbef-fork/venv/lib/python3.6/site-packages/pyocd/flash/builder.py", line 509, in program
    flash_operation = self._sector_erase_program_double_buffer(progress_cb)
  File "/Users/microbit-carlos/workspace/microbit-foundation/DAPLink-mbef-fork/venv/lib/python3.6/site-packages/pyocd/flash/builder.py", line 911, in _sector_erase_program_double_buffer
    self.flash.erase_sector(sector.addr)
  File "/Users/microbit-carlos/workspace/microbit-foundation/DAPLink-mbef-fork/venv/lib/python3.6/site-packages/pyocd/flash/flash.py", line 374, in erase_sector
    raise FlashEraseFailure('flash erase sector failure', address=address, result_code=result)
pyocd.core.exceptions.FlashEraseFailure: flash erase sector failure (address 0x00000000; result code 0x67)

Running the sector erase command directly doesn't seem to be doing anything:

$ pyocd erase --sector --target nrf52833
0001524:WARNING:eraser:No operation performed
$ pyocd erase --sector
0001524:WARNING:eraser:No operation performed

Is the error code 0x67 (103) from DAPLink or PyOCD? That value is too large for this DAPLink enum: https://github.com/microbit-foundation/DAPLink-microbit/blob/7839c6cef09eb1b3ae66e180450753e237559bd7/source/daplink/error.h#L31-L87

Contributor guide

Open the contributing guide

First steps

  1. Read the whole issue, then the project's contributing guide.
  2. Comment on the issue to say you are picking it up — it saves two people doing the same work.
  3. Fork the repository and make your change on a branch.
  4. Open a pull request that references the issue number.

Research direction

Reproduce the failure with the supplied Intel Hex file on a micro:bit V2 using the documented pyocd load, flash, and erase commands. Start at pyocd/flash/builder.py and follow the call into pyocd/flash/flash.py, with pyocd/subcommands/load_cmd.py as the command entry point. Done means the sector erase and load or flash operation complete successfully, with the 0x67 result understood.

Written by the indexing model from the issue text.

Assessment

Tech stack
python
Domain
cli, embedded-iot
Issue type
Bug
Difficulty
4/5
Estimated time
3-5 days
Activity status
Stale
Clarity
Needs clarification
Newbie friendliness
25/100

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.