`pyocd load`/`flash` fails on micro:bit V2 trying to erase sectors
Nobody has claimed this yet.
- Dominant language
- Python
- Stars
- 1.5k
- Forks
- 560
- Avg merge
- 1h 41m
- Merged PRs (30d)
- 3
Description
-
Intel Hex file used for testing, but should be the same with any other: CALL_ME_MICROBIT.hex.zip
-
micro:bit V2.0 with the factory 0255 release (the "
Firmware for micro:bit V2" button): https://microbit.org/get-started/user-guide/firmware/
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
First steps
- Read the whole issue, then the project's contributing guide.
- Comment on the issue to say you are picking it up — it saves two people doing the same work.
- Fork the repository and make your change on a branch.
- 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