Skip to content
This repository was archived by the owner on Jan 23, 2026. It is now read-only.

Commit 3d2ae4c

Browse files
authored
Merge pull request #506 from bennyz/rcars4
add support for RcarS4
2 parents f0fa0df + 02c9bc6 commit 3d2ae4c

9 files changed

Lines changed: 69 additions & 12 deletions

File tree

.gitattributes

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
packages/jumpstarter-driver-flashers/oci_bundles/rcar_s4/data/flasher.itb filter=lfs diff=lfs merge=lfs -text

packages/jumpstarter-driver-flashers/jumpstarter_driver_flashers/bundle.py

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,7 @@ class FlashBundleSpecV1Alpha1(BaseModel):
3333
targets: dict[str, str]
3434
kernel: FileAddress
3535
initram: Optional[FileAddress] = None
36-
dtb: DtbVariant
36+
dtb: Optional[DtbVariant] = None
3737
preflash_commands: list[str] = Field(default_factory=list)
3838

3939

@@ -47,10 +47,15 @@ class FlasherBundleManifestV1Alpha1(BaseModel):
4747
metadata: ObjectMeta
4848
spec: FlashBundleSpecV1Alpha1
4949

50-
def get_dtb_address(self) -> str:
50+
def get_dtb_address(self) -> str | None:
51+
if not self.spec.dtb:
52+
return None
5153
return self.spec.dtb.address
5254

5355
def get_dtb_file(self, variant: str | None = None) -> str | None:
56+
if not self.spec.dtb:
57+
return None
58+
5459
if not variant:
5560
variant = self.spec.dtb.default
5661

packages/jumpstarter-driver-flashers/jumpstarter_driver_flashers/client.py

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,7 @@
2727
EXPECT_TIMEOUT_DEFAULT = 60
2828
EXPECT_TIMEOUT_SYNC = 1200
2929

30+
3031
@dataclass(kw_only=True)
3132
class BaseFlasherClient(FlasherClient, CompositeClient):
3233
"""
@@ -123,6 +124,10 @@ def flash(
123124
target_device = self._get_target_device(target, manifest, console)
124125

125126
self.logger.info(f"Using target block device: {target_device}")
127+
console.sendline(f"export dhcp_addr={self._dhcp_details.ip_address}")
128+
console.expect(manifest.spec.login.prompt, timeout=EXPECT_TIMEOUT_DEFAULT)
129+
console.sendline(f"export gw_addr={self._dhcp_details.gateway}")
130+
console.expect(manifest.spec.login.prompt, timeout=EXPECT_TIMEOUT_DEFAULT)
126131

127132
# Preflash commands are executed before the flash operation
128133
# generally used to clean up boot entries in existing devices
@@ -412,15 +417,15 @@ def _busybox(self):
412417

413418
# if manifest has login details, we need to login
414419
if manifest.spec.login.username:
415-
console.expect(manifest.spec.login.login_prompt, timeout=EXPECT_TIMEOUT_DEFAULT*3)
420+
console.expect(manifest.spec.login.login_prompt, timeout=EXPECT_TIMEOUT_DEFAULT * 3)
416421
console.send(manifest.spec.login.username + "\n")
417422

418423
# if manifest has password, we need to send it
419424
if manifest.spec.login.password:
420425
console.expect("ssword:", timeout=EXPECT_TIMEOUT_DEFAULT)
421426
console.send(manifest.spec.login.password + "\n")
422427

423-
console.expect(manifest.spec.login.prompt, timeout=EXPECT_TIMEOUT_DEFAULT*3)
428+
console.expect(manifest.spec.login.prompt, timeout=EXPECT_TIMEOUT_DEFAULT * 3)
424429
yield console
425430

426431
def use_dtb(self, path: PathBuf, operator: Operator | None = None):

packages/jumpstarter-driver-flashers/jumpstarter_driver_flashers/driver.py

Lines changed: 11 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -84,9 +84,10 @@ async def setup_flasher_bundle(self, force_flash_bundle: str | None = None):
8484
self.logger.info(f"Setting up initram in tftp: {initram_path}")
8585
await self.tftp.storage.copy_exporter_file(initram_path, initram_path.name)
8686

87-
dtb_path = await self._get_file_path(manifest.get_dtb_file(self._use_dtb))
88-
self.logger.info(f"Setting up dtb in tftp: {dtb_path}")
89-
await self.tftp.storage.copy_exporter_file(dtb_path, dtb_path.name)
87+
dtb_path = await self._get_file_path(manifest.get_dtb_file(self._use_dtb)) if manifest.spec.dtb else None
88+
if dtb_path:
89+
self.logger.info(f"Setting up dtb in tftp: {dtb_path}")
90+
await self.tftp.storage.copy_exporter_file(dtb_path, dtb_path.name)
9091

9192
@export
9293
def set_dtb(self, handle):
@@ -202,3 +203,10 @@ class TIJ784S4Flasher(BaseFlasher):
202203
"""driver for Jumpstarter"""
203204

204205
flasher_bundle: str = "quay.io/jumpstarter-dev/jumpstarter-flasher-ti-j784s4:latest"
206+
207+
208+
@dataclass(kw_only=True)
209+
class RCarS4Flasher(BaseFlasher):
210+
"""RCarS4 driver for Jumpstarter"""
211+
212+
flasher_bundle: str = "quay.io/jumpstarter-dev/jumpstarter-flasher-rcar-s4:latest"

packages/jumpstarter-driver-flashers/oci_bundles/rcar_s4/data/.keep

Whitespace-only changes.
Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
version https://git-lfs.github.com/spec/v1
2+
oid sha256:f6dc11643eace8728115eaedd7a372c9f4a6402e937d63a3dd653e10d87855cc
3+
size 52413672
Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
apiVersion: jumpstarter.dev/v1alpha1
2+
kind: FlashBundleManifest
3+
metadata:
4+
name: rcar-s4
5+
spec:
6+
manufacturer: Renesas
7+
link: "https://www.renesas.com/en/products/automotive-products/automotive-system-chips-socs/r-car-s4-automotive-system-chip-soc-car-servercommunication-gateway"
8+
bootcmd: "bootm 0x58000000"
9+
shelltype: "busybox"
10+
login:
11+
login_prompt: "login:"
12+
username: "root"
13+
prompt: "#"
14+
default_target: "emmc"
15+
targets:
16+
emmc: "/dev/mmcblk0"
17+
kernel:
18+
file: data/flasher.itb
19+
address: "0x58000000"

packages/jumpstarter-driver-raspberrypi/jumpstarter_driver_raspberrypi/client.py

Lines changed: 20 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,31 @@
11
from dataclasses import dataclass
22

3+
import click
4+
from jumpstarter_driver_power.client import PowerClient
5+
36
from jumpstarter.client import DriverClient
47

58

69
@dataclass(kw_only=True)
7-
class DigitalOutputClient(DriverClient):
8-
def off(self) -> None:
10+
class DigitalOutputClient(PowerClient):
11+
def on(self):
12+
"""Turn power on"""
13+
self.call("on")
14+
15+
def off(self):
16+
"""Turn power off"""
917
self.call("off")
1018

11-
def on(self) -> None:
12-
self.call("on")
19+
def cli(self):
20+
@click.group()
21+
def gpio():
22+
"""GPIO power control commands"""
23+
pass
24+
25+
for cmd in super().cli().commands.values():
26+
gpio.add_command(cmd)
27+
28+
return gpio
1329

1430

1531
@dataclass(kw_only=True)

packages/jumpstarter-driver-raspberrypi/pyproject.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@ authors = [
1010
readme = "README.md"
1111
license = "Apache-2.0"
1212
requires-python = ">=3.11"
13-
dependencies = ["jumpstarter", "gpiozero>=2.0.1"]
13+
dependencies = ["jumpstarter", "jumpstarter-driver-power", "gpiozero>=2.0.1", "click>=8.1.7.2"]
1414

1515
[project.entry-points."jumpstarter.drivers"]
1616
DigitalInput = "jumpstarter_driver_raspberrypi.driver:DigitalInput"

0 commit comments

Comments
 (0)