mirror of
https://github.com/infiniteCable2/panda.git
synced 2026-02-18 17:23:52 +08:00
Remove spidev2 support from SPI implementation (#2287)
* Remove spidev2 support from SPI implementation Removed support for spidev2 and related transfer methods. * Remove spidev2 from dependencies Remove spidev2 dependency for Linux platform.
This commit is contained in:
@@ -16,10 +16,6 @@ try:
|
||||
import spidev
|
||||
except ImportError:
|
||||
spidev = None
|
||||
try:
|
||||
import spidev2
|
||||
except ImportError:
|
||||
spidev2 = None
|
||||
|
||||
# Constants
|
||||
SYNC = 0x5A
|
||||
@@ -121,8 +117,6 @@ class PandaSpiHandle(BaseHandle):
|
||||
|
||||
def __init__(self) -> None:
|
||||
self.dev = SpiDevice()
|
||||
if spidev2 is not None and "SPI2" in os.environ:
|
||||
self._spi2 = spidev2.SPIBus("/dev/spidev0.0", "w+b", bits_per_word=8, speed_hz=50_000_000)
|
||||
|
||||
# helpers
|
||||
def _calc_checksum(self, data: bytes) -> int:
|
||||
@@ -183,52 +177,6 @@ class PandaSpiHandle(BaseHandle):
|
||||
|
||||
return dat[3:-1]
|
||||
|
||||
def _transfer_spidev2(self, spi, endpoint: int, data, timeout: int, max_rx_len: int = USBPACKET_MAX_SIZE, expect_disconnect: bool = False) -> bytes:
|
||||
max_rx_len = max(USBPACKET_MAX_SIZE, max_rx_len)
|
||||
|
||||
header = self.HEADER.pack(SYNC, endpoint, len(data), max_rx_len)
|
||||
|
||||
header_ack = bytearray(1)
|
||||
|
||||
# ACK + <2 bytes for response length> + data + checksum
|
||||
data_rx = bytearray(3+max_rx_len+1)
|
||||
|
||||
self._spi2.submitTransferList(spidev2.SPITransferList((
|
||||
# header
|
||||
{'tx_buf': header + bytes([self._calc_checksum(header), ]), 'delay_usecs': 0, 'cs_change': True},
|
||||
{'rx_buf': header_ack, 'delay_usecs': 0, 'cs_change': True},
|
||||
|
||||
# send data
|
||||
{'tx_buf': bytes([*data, self._calc_checksum(data)]), 'delay_usecs': 0, 'cs_change': True},
|
||||
{'rx_buf': data_rx, 'delay_usecs': 0, 'cs_change': True},
|
||||
)))
|
||||
|
||||
if header_ack[0] != HACK:
|
||||
raise PandaSpiMissingAck
|
||||
|
||||
if expect_disconnect:
|
||||
logger.debug("- expecting disconnect, returning")
|
||||
return b""
|
||||
else:
|
||||
dat = bytes(data_rx)
|
||||
if dat[0] != DACK:
|
||||
if dat[0] == NACK:
|
||||
raise PandaSpiNackResponse
|
||||
|
||||
print("trying again")
|
||||
dat = self._wait_for_ack(spi, DACK, timeout, 0x13, length=3 + max_rx_len)
|
||||
|
||||
# get response length, then response
|
||||
response_len = struct.unpack("<H", dat[1:3])[0]
|
||||
if response_len > max_rx_len:
|
||||
raise PandaSpiException(f"response length greater than max ({max_rx_len} {response_len})")
|
||||
|
||||
dat = dat[:3 + response_len + 1]
|
||||
if self._calc_checksum(dat) != 0:
|
||||
raise PandaSpiBadChecksum
|
||||
|
||||
return dat[3:-1]
|
||||
|
||||
def _transfer(self, endpoint: int, data, timeout: int, max_rx_len: int = 1000, expect_disconnect: bool = False) -> bytes:
|
||||
logger.debug("starting transfer: endpoint=%d, max_rx_len=%d", endpoint, max_rx_len)
|
||||
logger.debug("==============================================")
|
||||
@@ -241,9 +189,7 @@ class PandaSpiHandle(BaseHandle):
|
||||
logger.debug("\ntry #%d", n)
|
||||
with self.dev.acquire() as spi:
|
||||
try:
|
||||
fn = self._transfer_spidev
|
||||
#fn = self._transfer_spidev2
|
||||
return fn(spi, endpoint, data, timeout, max_rx_len, expect_disconnect)
|
||||
return self._transfer_spidev(spi, endpoint, data, timeout, max_rx_len, expect_disconnect)
|
||||
except PandaSpiException as e:
|
||||
exc = e
|
||||
logger.debug("SPI transfer failed, retrying", exc_info=True)
|
||||
|
||||
Reference in New Issue
Block a user