add method to reboot a pico (in BOOTSEL)
This commit is contained in:
parent
188976474a
commit
772ae953f0
60
gp2040ce_bintools/pico.py
Normal file
60
gp2040ce_bintools/pico.py
Normal file
@ -0,0 +1,60 @@
|
|||||||
|
"""Methods to interact with the Raspberry Pi Pico directly.
|
||||||
|
|
||||||
|
Much of this code is a partial Python implementation of picotool.
|
||||||
|
"""
|
||||||
|
import struct
|
||||||
|
|
||||||
|
import usb.core
|
||||||
|
|
||||||
|
PICO_VENDOR = 0x2e8a
|
||||||
|
PICO_PRODUCT = 0x0003
|
||||||
|
|
||||||
|
PICOBOOT_CMD_STRUCT = '<LLBBxxL'
|
||||||
|
PICOBOOT_CMD_REBOOT_SUFFIX_STRUCT = 'LLL4x'
|
||||||
|
|
||||||
|
PICO_MAGIC = 0x431fd10b
|
||||||
|
PICO_SRAM_END = 0x20042000
|
||||||
|
PICO_TOKEN = 0
|
||||||
|
# only a partial implementation...
|
||||||
|
PICO_COMMANDS = {
|
||||||
|
'REBOOT': 0x2,
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
def get_bootsel_out_endpoint() -> usb.core.Endpoint:
|
||||||
|
"""Retrieve the USB endpoint for purposes of interacting with a Pico in BOOTSEL mode."""
|
||||||
|
# get the device and claim it from whatever else might have in the kernel
|
||||||
|
pico_device = usb.core.find(idVendor=PICO_VENDOR, idProduct=PICO_PRODUCT)
|
||||||
|
|
||||||
|
if not pico_device:
|
||||||
|
raise ValueError("Pico board in BOOTSEL mode could not be found!")
|
||||||
|
|
||||||
|
if pico_device.is_kernel_driver_active(0):
|
||||||
|
pico_device.detach_kernel_driver(0)
|
||||||
|
|
||||||
|
pico_configuration = pico_device.get_active_configuration()
|
||||||
|
# two interfaces are present, we want the direct rather than mass storage
|
||||||
|
# pico_bootsel_interface = pico_configuration[(1, 0)]
|
||||||
|
pico_bootsel_interface = usb.util.find_descriptor(pico_configuration,
|
||||||
|
custom_match=lambda e: e.bInterfaceClass == 0xff)
|
||||||
|
out_endpoint = usb.util.find_descriptor(pico_bootsel_interface,
|
||||||
|
custom_match=lambda e: (usb.util.endpoint_direction(e.bEndpointAddress) ==
|
||||||
|
usb.util.ENDPOINT_OUT))
|
||||||
|
return out_endpoint
|
||||||
|
|
||||||
|
|
||||||
|
def reboot() -> None:
|
||||||
|
"""Reboot a Pico in BOOTSEL mode."""
|
||||||
|
global PICO_TOKEN
|
||||||
|
endpoint = get_bootsel_out_endpoint()
|
||||||
|
|
||||||
|
# set up the data
|
||||||
|
PICO_TOKEN += 1
|
||||||
|
command_size = 12
|
||||||
|
transfer_len = 0
|
||||||
|
boot_start = 0
|
||||||
|
boot_end = PICO_SRAM_END
|
||||||
|
boot_delay_ms = 500
|
||||||
|
endpoint.write(struct.pack(PICOBOOT_CMD_STRUCT + PICOBOOT_CMD_REBOOT_SUFFIX_STRUCT,
|
||||||
|
PICO_MAGIC, PICO_TOKEN, PICO_COMMANDS['REBOOT'], command_size, transfer_len,
|
||||||
|
boot_start, boot_end, boot_delay_ms))
|
@ -11,7 +11,7 @@ authors = [
|
|||||||
{name = "Brian S. Stephan", email = "bss@incorporeal.org"},
|
{name = "Brian S. Stephan", email = "bss@incorporeal.org"},
|
||||||
]
|
]
|
||||||
requires-python = ">=3.9"
|
requires-python = ">=3.9"
|
||||||
dependencies = ["grpcio-tools", "textual"]
|
dependencies = ["grpcio-tools", "pyusb", "textual"]
|
||||||
dynamic = ["version"]
|
dynamic = ["version"]
|
||||||
classifiers = [
|
classifiers = [
|
||||||
"Environment :: Console",
|
"Environment :: Console",
|
||||||
|
@ -22,7 +22,7 @@ decorator==5.1.1
|
|||||||
# via gp2040ce-binary-tools (pyproject.toml)
|
# via gp2040ce-binary-tools (pyproject.toml)
|
||||||
distlib==0.3.6
|
distlib==0.3.6
|
||||||
# via virtualenv
|
# via virtualenv
|
||||||
exceptiongroup==1.1.1
|
exceptiongroup==1.1.2
|
||||||
# via pytest
|
# via pytest
|
||||||
filelock==3.12.2
|
filelock==3.12.2
|
||||||
# via
|
# via
|
||||||
@ -71,7 +71,7 @@ isort==5.12.0
|
|||||||
# via flake8-isort
|
# via flake8-isort
|
||||||
linkify-it-py==2.0.2
|
linkify-it-py==2.0.2
|
||||||
# via markdown-it-py
|
# via markdown-it-py
|
||||||
markdown-it-py[linkify,plugins]==2.2.0
|
markdown-it-py[linkify,plugins]==3.0.0
|
||||||
# via
|
# via
|
||||||
# mdit-py-plugins
|
# mdit-py-plugins
|
||||||
# rich
|
# rich
|
||||||
@ -95,7 +95,7 @@ packaging==23.1
|
|||||||
# tox
|
# tox
|
||||||
pbr==5.11.1
|
pbr==5.11.1
|
||||||
# via stevedore
|
# via stevedore
|
||||||
pip-tools==6.13.0
|
pip-tools==6.14.0
|
||||||
# via gp2040ce-binary-tools (pyproject.toml)
|
# via gp2040ce-binary-tools (pyproject.toml)
|
||||||
platformdirs==3.8.0
|
platformdirs==3.8.0
|
||||||
# via
|
# via
|
||||||
@ -128,6 +128,8 @@ pytest-asyncio==0.21.0
|
|||||||
# via gp2040ce-binary-tools (pyproject.toml)
|
# via gp2040ce-binary-tools (pyproject.toml)
|
||||||
pytest-cov==4.1.0
|
pytest-cov==4.1.0
|
||||||
# via gp2040ce-binary-tools (pyproject.toml)
|
# via gp2040ce-binary-tools (pyproject.toml)
|
||||||
|
pyusb==1.2.1
|
||||||
|
# via gp2040ce-binary-tools (pyproject.toml)
|
||||||
pyyaml==6.0
|
pyyaml==6.0
|
||||||
# via bandit
|
# via bandit
|
||||||
rich==13.4.2
|
rich==13.4.2
|
||||||
@ -142,7 +144,7 @@ snowballstemmer==2.2.0
|
|||||||
# via pydocstyle
|
# via pydocstyle
|
||||||
stevedore==5.1.0
|
stevedore==5.1.0
|
||||||
# via bandit
|
# via bandit
|
||||||
textual==0.28.1
|
textual==0.29.0
|
||||||
# via gp2040ce-binary-tools (pyproject.toml)
|
# via gp2040ce-binary-tools (pyproject.toml)
|
||||||
tomli==2.0.1
|
tomli==2.0.1
|
||||||
# via
|
# via
|
||||||
@ -150,6 +152,7 @@ tomli==2.0.1
|
|||||||
# coverage
|
# coverage
|
||||||
# flake8-pyproject
|
# flake8-pyproject
|
||||||
# mypy
|
# mypy
|
||||||
|
# pip-tools
|
||||||
# pyproject-api
|
# pyproject-api
|
||||||
# pyproject-hooks
|
# pyproject-hooks
|
||||||
# pytest
|
# pytest
|
||||||
@ -157,7 +160,7 @@ tomli==2.0.1
|
|||||||
# tox
|
# tox
|
||||||
tox==4.6.3
|
tox==4.6.3
|
||||||
# via gp2040ce-binary-tools (pyproject.toml)
|
# via gp2040ce-binary-tools (pyproject.toml)
|
||||||
typing-extensions==4.6.3
|
typing-extensions==4.7.1
|
||||||
# via
|
# via
|
||||||
# mypy
|
# mypy
|
||||||
# setuptools-scm
|
# setuptools-scm
|
||||||
|
@ -12,7 +12,7 @@ importlib-metadata==6.7.0
|
|||||||
# via textual
|
# via textual
|
||||||
linkify-it-py==2.0.2
|
linkify-it-py==2.0.2
|
||||||
# via markdown-it-py
|
# via markdown-it-py
|
||||||
markdown-it-py[linkify,plugins]==2.2.0
|
markdown-it-py[linkify,plugins]==3.0.0
|
||||||
# via
|
# via
|
||||||
# mdit-py-plugins
|
# mdit-py-plugins
|
||||||
# rich
|
# rich
|
||||||
@ -25,11 +25,13 @@ protobuf==4.23.3
|
|||||||
# via grpcio-tools
|
# via grpcio-tools
|
||||||
pygments==2.15.1
|
pygments==2.15.1
|
||||||
# via rich
|
# via rich
|
||||||
|
pyusb==1.2.1
|
||||||
|
# via gp2040ce-binary-tools (pyproject.toml)
|
||||||
rich==13.4.2
|
rich==13.4.2
|
||||||
# via textual
|
# via textual
|
||||||
textual==0.28.1
|
textual==0.29.0
|
||||||
# via gp2040ce-binary-tools (pyproject.toml)
|
# via gp2040ce-binary-tools (pyproject.toml)
|
||||||
typing-extensions==4.6.3
|
typing-extensions==4.7.1
|
||||||
# via textual
|
# via textual
|
||||||
uc-micro-py==1.0.2
|
uc-micro-py==1.0.2
|
||||||
# via linkify-it-py
|
# via linkify-it-py
|
||||||
|
Loading…
x
Reference in New Issue
Block a user