This commit is contained in:
firestar5683
2026-08-02 12:20:20 -05:00
parent 6d4089feb7
commit d89371c518
206 changed files with 5069 additions and 1790 deletions
+12 -8
View File
@@ -200,9 +200,9 @@ class Panda:
self._handle = None
while self._handle is None:
# try USB first, then SPI
self._context, self._handle, serial, self.bootstub = self.usb_connect(self._connect_serial, claim=claim, no_error=wait)
self._context, self._handle, serial, self.bootstub, bcd = self.usb_connect(self._connect_serial, claim=claim, no_error=wait)
if self._handle is None:
self._context, self._handle, serial, self.bootstub = self.spi_connect(self._connect_serial)
self._context, self._handle, serial, self.bootstub, bcd = self.spi_connect(self._connect_serial)
if not wait:
break
@@ -263,7 +263,7 @@ class Panda:
handle = PandaSpiHandle()
dat = handle.get_protocol_version()
except PandaSpiException:
return None, None, None, False
return None, None, None, False, None
spi_serial = binascii.hexlify(dat[:12]).decode()
pid = dat[13]
@@ -274,18 +274,18 @@ class Panda:
# did we get the right panda?
if serial is not None and spi_serial != serial:
return None, None, None, False
return None, None, None, False, None
# ensure our protocol version matches the panda
if (not ignore_version) and spi_version != handle.PROTOCOL_VERSION:
raise PandaProtocolMismatch(f"panda protocol mismatch: expected {handle.PROTOCOL_VERSION}, got {spi_version}. reflash panda")
# got a device and all good
return None, handle, spi_serial, bootstub
return None, handle, spi_serial, bootstub, None
@classmethod
def usb_connect(cls, serial, claim=True, no_error=False):
handle, usb_serial, bootstub = None, None, None
handle, usb_serial, bootstub, bcd = None, None, None, None
context = usb1.USBContext()
context.open()
try:
@@ -311,6 +311,10 @@ class Panda:
handle.claimInterface(0)
# handle.setInterfaceAltSetting(0, 0) # Issue in USB stack
this_bcd = device.getbcdDevice()
if this_bcd is not None and this_bcd != 0x2300:
bcd = bytearray([this_bcd >> 8])
break
except Exception:
logger.exception("USB connect error")
@@ -321,7 +325,7 @@ class Panda:
else:
context.close()
return context, usb_handle, usb_serial, bootstub
return context, usb_handle, usb_serial, bootstub, bcd
def is_connected_spi(self):
return isinstance(self._handle, PandaSpiHandle)
@@ -357,7 +361,7 @@ class Panda:
@classmethod
def spi_list(cls):
_, _, serial, _ = cls.spi_connect(None, ignore_version=True)
_, _, serial, _, _ = cls.spi_connect(None, ignore_version=True)
if serial is not None:
return [serial, ]
return []
+2 -1
View File
@@ -7,6 +7,7 @@ import struct
import threading
from contextlib import contextmanager
from functools import reduce
from typing import Any
from .base import BaseHandle, BaseSTBootloaderHandle, TIMEOUT
from .constants import McuType, MCU_TYPE_BY_IDCODE, USBPACKET_MAX_SIZE
@@ -73,7 +74,7 @@ class PandaSpiTransferFailed(PandaSpiException):
SPI_LOCK = threading.Lock()
SPI_DEVICES = {}
SPI_DEVICES: dict[int, Any] = {}
class SpiDevice:
"""
Provides locked, thread-safe access to a panda's SPI interface.