Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
40 changes: 40 additions & 0 deletions scripts/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -30,3 +30,43 @@ Devicetree binding headers for Series 2 are generated using the following script
* Clock Control bindings: `gen_clock_control.py`
* Pin Control bindings: `gen_pinctrl.py`
* DAC bindings: `gen_vdac.py`

## Devicetree Files

### SoC Devicetree

SoC devicetree for Series 2 is generated using the `gen_dts_soc_series2.py` script.
The script takes the following inputs:

* `sdk` -- Path to Simplicity SDK or device package to extract data from.
* `family` -- The family to generate .dtsi files for.
* `soc-yml` -- The soc.yml to use for filtering.
* `out` -- The output path.

Example usage:

```sh
./scripts/gen_dts_soc_series2.py \
-f xg24 \
-s ~/sisdk-release/ \
-o $ZEPHYR_BASE/dts/arm/silabs/ \
-y $ZEPHYR_BASE/soc/silabs/soc.yml
```

### Board Devicetree

Board devicetree is generated using the `gen_dts_board.py` script.
The script takes the following inputs:

* `sdk` -- Path to Simplicity SDK or boards package to extract data from.
* `board` -- The board to generate .dts files for.
* `out` -- The output path.

Example usage:

```sh
./scripts/gen_dts_board.py \
-b xg24_dk2601b \
-s ~/sisdk-release/ \
-o $ZEPHYR_BASE/boards/silabs/dev_kits/xg24_dk2601b/
```
Empty file added scripts/dts/__init__.py
Empty file.
Empty file added scripts/dts/board/__init__.py
Empty file.
83 changes: 83 additions & 0 deletions scripts/dts/board/adc.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,83 @@
# Copyright (c) 2026 Silicon Laboratories Inc.
# SPDX-License-Identifier: Apache-2.0

from util.board import Board
from dts.node import Node, PinctrlGroup


def pin_and_bus(b: Board, define: str):
port = b.config[f"{define}_PORT"][-1]
pin = int(b.config[f"{define}_PIN"])

analog_bus = {
"A": "A",
"B": "B",
"C": "CD",
"D": "CD",
}

bus = f"{analog_bus[port]}{'ODD' if pin % 2 else 'EVEN'}0"
portpin = f"P{port}{pin}"

return (portpin, bus)


def generate(b: Board, dt: Node, pinctrl: Node):
if b.config.get("SL_JOYSTICK_PORT"):
adc = Node(labels=["adc0"], status="okay")
channel_no = 0

joystick = Node("joystick", compatible="adc-keys")
joystick.add_phandle_array("io-channels", ["adc0", channel_no])
joystick.add_int("keyup-threshold-mv", b.config.get("REFERENCE_VOLTAGE"))
dt.add_node(joystick)

dt.add_include("zephyr/dt-bindings/input/input-event-codes.h")

keys = {
"enter": "JOYSTICK_MV_C",
"left": "JOYSTICK_MV_W",
"down": "JOYSTICK_MV_S",
"up": "JOYSTICK_MV_N",
"right": "JOYSTICK_MV_E",
}

for key, define in keys.items():
if mv := b.config.get(define):
node = Node(f"{key}-key")
node.add_int("press-thresholds-mv", mv)
node.add_int("zephyr,code", f"INPUT_KEY_{key.upper()}")
joystick.add_node(node)

pin, bus = pin_and_bus(b, "SL_JOYSTICK")
pins, props = b.pinctrl(
"iadc0",
"default",
PinctrlGroup(
"group0",
None,
abus=[f"ABUS_{bus}_IADC0"],
),
)
pinctrl.add_node(pins)
adc.add_props(props)

adc.add_int("#address-cells", 1)
adc.add_int("#size-cells", 0)

channel = Node("channel", reg=[channel_no])
channel.add_int("zephyr,acquisition-time", "ADC_ACQ_TIME_DEFAULT")
channel.add_string("zephyr,gain", "ADC_GAIN_1")
channel.add_int("zephyr,input-positive", f"IADC_INPUT_{pin}")
channel.add_string("zephyr,reference", "ADC_REF_VDD_1")
channel.add_int("zephyr,resolution", 12)
channel.add_int("zephyr,vref-mv", b.config.get("REFERENCE_VOLTAGE"))
adc.add_node(channel)

user = Node("zephyr,user")
user.add_phandle_array("io-channels", ["adc0", channel_no])
dt.add_node(user)

adc.add_include("zephyr/dt-bindings/adc/silabs-adc.h")

return [adc]
13 changes: 13 additions & 0 deletions scripts/dts/board/bt.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
# Copyright (c) 2026 Silicon Laboratories Inc.
# SPDX-License-Identifier: Apache-2.0

from util.board import Board
from dts.node import Node


def generate(b: Board, dt: Node, _pinctrl: Node):
if "device_supports_bluetooth" in b.soc_features:
node = Node(labels=["bt_hci_silabs"], status="okay")

dt.find("chosen").select("zephyr,bt-hci", node)
return [node]
35 changes: 35 additions & 0 deletions scripts/dts/board/buttons.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,35 @@
# Copyright (c) 2026 Silicon Laboratories Inc.
# SPDX-License-Identifier: Apache-2.0

from pathlib import Path

from util.board import Board
from dts.node import Node


def generate(b: Board, dt: Node, _pinctrl: Node):
button_spec = {
"button0": "SL_SIMPLE_BUTTON_BTN0",
"button1": "SL_SIMPLE_BUTTON_BTN1",
"button2": "SL_SIMPLE_BUTTON_BTN2",
}
buttons = []
for label, define in button_spec.items():
if define + "_PORT" not in b.config:
continue
btn = Node(f"button_{label[-1]}", [label])
btn.add_prop(b.gpios([define], "gpios", False))
btn.add_string("label", f"Push Button {label[-1]}")
btn.add_int("zephyr,code", f"INPUT_BTN_{label[-1]}")
buttons.append(btn)

if buttons:
aliases = dt.find("aliases")

buttons_dt = Node("buttons", compatible="gpio-keys")
for btn in buttons:
buttons_dt.add_node(btn)
aliases.select(f"sw{btn.labels[0][-1]}", btn)
dt.add_node(buttons_dt)

dt.add_include("zephyr/dt-bindings/input/input-event-codes.h")
25 changes: 25 additions & 0 deletions scripts/dts/board/clocks.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
# Copyright (c) 2026 Silicon Laboratories Inc.
# SPDX-License-Identifier: Apache-2.0

from util.board import Board
from dts.node import Node


def generate(b: Board, dt: Node, _pinctrl: Node):
nodes = []

if b.config.get("SL_CLOCK_MANAGER_HFXO_EN"):
hfxo = Node(labels=["hfxo"], status="okay")
hfxo.add_int("precision", b.config.get("SL_CLOCK_MANAGER_HFXO_PRECISION"))
hfxo.add_array("ctune", [b.config.get("SL_CLOCK_MANAGER_HFXO_CTUNE")])
nodes.append(hfxo)
dt.add_include(b.soc_dir / "clock-hfrcodpll.dtsi")

if b.config.get("SL_CLOCK_MANAGER_LFXO_EN"):
lfxo = Node(labels=["lfxo"], status="okay")
lfxo.add_int("precision", b.config.get("SL_CLOCK_MANAGER_LFXO_PRECISION"))
lfxo.add_int("ctune", b.config.get("SL_CLOCK_MANAGER_LFXO_CTUNE"))
nodes.append(lfxo)
dt.add_include(b.soc_dir / "clock-lfxo.dtsi")

return nodes
17 changes: 17 additions & 0 deletions scripts/dts/board/dac.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
# Copyright (c) 2026 Silicon Laboratories Inc.
# SPDX-License-Identifier: Apache-2.0

from util.board import Board
from dts.node import Node


def generate(b: Board, dt: Node, _pinctrl: Node):
candidates = ["vdac0", "vdac1"]
nodes = []

for dac in candidates:
if f"device_has_{dac}" in b.soc_features:
node = Node(labels=[dac], status="okay")
nodes.append(node)

return nodes
56 changes: 56 additions & 0 deletions scripts/dts/board/dcdc.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,56 @@
# Copyright (c) 2026 Silicon Laboratories Inc.
# SPDX-License-Identifier: Apache-2.0

from util.board import Board
from dts.node import Node


def generate(b: Board, dt: Node, pinctrl: Node):
if b.soc_config.get("device.dcdc") == "BOOST":
# Boost DCDC is handled at SoC level
return

if b.config.get("SL_DEVICE_INIT_DCDC_ENABLE") in [None, "1"]:
node = Node(labels=["dcdc"], status="okay")
node.add_include("zephyr/dt-bindings/regulator/silabs_dcdc.h")

if b.config.get("SL_DEVICE_INIT_DCDC_BYPASS") != "1":
node.add_bool("regulator-boot-on", True)

node.add_int("regulator-initial-mode", "SILABS_DCDC_MODE_BUCK")

ipkvals = {
"3": 50,
"4": 65,
"5": 73,
"6": 80,
"7": 86,
"8": 93,
"9": 100,
"10": 106,
"11": 113,
"12": 120,
}

ipkval = None
if b.config.get("SL_DEVICE_INIT_DCDC_PFMX_IPKVAL_OVERRIDE") == "1":
ipkval = b.config.get("SL_DEVICE_INIT_DCDC_PFMX_IPKVAL", "12")
elif b.soc_family == "xg23":
ipkval = "9"
if b.soc_config.get("device.efr32_subghz_hp_pa_max_output") == "20":
ipkval = "6"
elif b.soc_family == "xg24":
try:
b.soc_config.get("device.efr32_2g4hz_hp_pa_max_output")
ipkval = "9"
except KeyError:
ipkval = "12"
elif b.soc_family == "xg26":
ipkval = "12"
elif b.soc_family == "xg28":
ipkval = "9"

if ipkval is not None:
node.add_int("silabs,pfmx-peak-current-milliamp", ipkvals[ipkval])

return [node]
28 changes: 28 additions & 0 deletions scripts/dts/board/exp_header.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
# Copyright (c) 2026 Silicon Laboratories Inc.
# SPDX-License-Identifier: Apache-2.0

from util.board import Board
from dts.node import Node


def generate(b: Board, dt: Node, _pinctrl: Node):
gpio_map = []
for i in range(3, 17):
prefix = f"SL_HAL_GPIO_INIT_EXP_{i}"
if prefix + "_PORT" not in b.config:
continue

port = "&gpio" + b.config.get(prefix + "_PORT")[-1].lower()
pin = b.config.get(prefix + "_PIN")

gpio_map.append([i, 0, port, pin, 0])

if gpio_map:
exp = Node("exp-header", labels=["exp_header"], compatible="silabs,exp-header")
exp.add_int("#gpio-cells", 2)
exp.add_array("gpio-map", gpio_map)
exp.prop("gpio-map").fmt_one_element_per_line = True
exp.add_hex_array("gpio-map-mask", [0xFFFFFFFF, 0x0])
exp.add_hex_array("gpio-map-pass-thru", [0x0, "GPIO_DT_FLAGS_MASK"])

dt.add_node(exp)
34 changes: 34 additions & 0 deletions scripts/dts/board/gpio.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,34 @@
# Copyright (c) 2026 Silicon Laboratories Inc.
# SPDX-License-Identifier: Apache-2.0

from util.board import Board
from dts.node import Node


def generate(b: Board, dt: Node, pinctrl: Node):
ports = {
"gpioa": [],
"gpiob": [],
"gpioc": [],
"gpiod": [],
}

if port := b.config.get("SL_BOARD_ENABLE_VCOM_PORT"):
port = "gpio" + port[-1].lower()
pin = b.config.get("SL_BOARD_ENABLE_VCOM_PIN")

hog = Node("board-controller-enable")
hog.add_bool("gpio-hog", True)
hog.add_array("gpios", [pin, "GPIO_ACTIVE_HIGH"])
hog.add_bool("output-high", True)

ports[port].append(hog)

nodes = []

for port, children in ports.items():
node = Node(labels=[port], status="okay")
node.add_nodes(children)
nodes.append(node)

return nodes
Loading