Skip to content

Commit 36f4665

Browse files
committed
Merge branch 'vendor' into vendor-probe
2 parents e9c04c2 + 2e20c3b commit 36f4665

File tree

2 files changed

+23
-5
lines changed

2 files changed

+23
-5
lines changed

universal_silabs_flasher/flasher.py

Lines changed: 11 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,7 @@ class ProbeResult:
3636
version: Version | None
3737
continue_probing: bool
3838
baudrate: int
39+
vendor: str | None = dataclasses.field(default=None)
3940

4041

4142
class Flasher:
@@ -153,10 +154,11 @@ async def probe_ezsp(self, baudrate: int) -> ProbeResult:
153154

154155
async def probe_spinel(self, baudrate: int) -> ProbeResult:
155156
async with self._connect_spinel(baudrate) as spinel:
156-
version = await spinel.probe()
157+
version, vendor = await spinel.probe()
157158

158159
return ProbeResult(
159160
version=version,
161+
vendor=vendor,
160162
baudrate=baudrate,
161163
continue_probing=False,
162164
)
@@ -219,6 +221,7 @@ async def probe_app_type(
219221
self.app_type = probe_method
220222
self.app_version = result.version
221223
self.app_baudrate = result.baudrate
224+
self.app_vendor = result.vendor.strip() if result.vendor else ""
222225
break
223226
else:
224227
if bootloader_probe and self._reset_target:
@@ -235,8 +238,9 @@ async def probe_app_type(
235238
raise RuntimeError("Failed to probe running application type")
236239

237240
_LOGGER.info(
238-
"Detected %s, version %s at %s baudrate (bootloader baudrate %s)",
241+
"Detected %s, %s version %s at %s baudrate (bootloader baudrate %s)",
239242
self.app_type,
243+
self.app_vendor,
240244
self.app_version,
241245
self.app_baudrate,
242246
self.bootloader_baudrate,
@@ -256,6 +260,11 @@ async def enter_bootloader(self) -> None:
256260
elif self.app_type is ApplicationType.SPINEL:
257261
async with self._connect_spinel(self.app_baudrate) as spinel:
258262
async with async_timeout.timeout(PROBE_TIMEOUT):
263+
if self.app_vendor and "EFR32" not in self.app_vendor:
264+
raise RuntimeError(
265+
"Flashing Thread firmware is only supported on "
266+
"EFR32 devices"
267+
)
259268
await spinel.enter_bootloader()
260269
elif self.app_type is ApplicationType.EZSP:
261270
async with self._connect_ezsp(self.app_baudrate) as ezsp:

universal_silabs_flasher/spinel.py

Lines changed: 12 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66
import typing
77

88
import async_timeout
9+
from serial_asyncio import SerialTransport
910
import zigpy.types
1011

1112
from .common import SerialProtocol, Version, crc16_kermit
@@ -109,6 +110,14 @@ def __init__(self) -> None:
109110
self._transaction_id: int = 1
110111
self._pending_frames: dict[int, asyncio.Future] = {}
111112

113+
def connection_made(self, transport: SerialTransport) -> None:
114+
super().connection_made(transport)
115+
116+
# de-assert DTR/RTS, some dongles use these to reset device
117+
if transport is not None:
118+
transport.serial.dtr = False
119+
transport.serial.rts = False
120+
112121
def data_received(self, data: bytes) -> None:
113122
super().data_received(data)
114123

@@ -239,7 +248,7 @@ async def send_command(
239248

240249
return await self.send_frame(frame, **kwargs)
241250

242-
async def probe(self) -> Version:
251+
async def probe(self) -> tuple[Version, str]:
243252
rsp = await self.send_command(
244253
CommandID.PROP_VALUE_GET,
245254
PropertyID.NCP_VERSION.serialize(),
@@ -252,9 +261,9 @@ async def probe(self) -> Version:
252261
version = version_string.rstrip(b"\x00").decode("ascii")
253262

254263
# We strip off the date code to get something reasonably stable
255-
short_version, _ = version.split(";", 1)
264+
short_version, vendor, _ = version.split(";", 2)
256265

257-
return Version(short_version)
266+
return Version(short_version), vendor
258267

259268
async def enter_bootloader(self) -> None:
260269
await self.send_command(

0 commit comments

Comments
 (0)