Skip to content

Commit dd1ad5c

Browse files
committed
[stm32] Move peripheral enumeration to :cmsis:device
1 parent c507188 commit dd1ad5c

File tree

4 files changed

+50
-35
lines changed

4 files changed

+50
-35
lines changed

ext/st/module.lb

Lines changed: 47 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22
# -*- coding: utf-8 -*-
33
#
44
# Copyright (c) 2016, Fabian Greif
5-
# Copyright (c) 2017, Niklas Hauser
5+
# Copyright (c) 2017, 2024, Niklas Hauser
66
#
77
# This file is part of the modm project.
88
#
@@ -101,6 +101,7 @@ def common_rcc_map(env):
101101
bprops["peripherals"] = peripherals
102102
return rcc_map
103103

104+
104105
def common_header_file(env):
105106
"""
106107
Gives information about the STM32 header files. For example the STM32F469:
@@ -145,6 +146,45 @@ def common_header_file(env):
145146
bprops["folder"] = folder
146147
return headers
147148

149+
150+
def common_peripherals(env):
151+
"""
152+
All peripherals translated to the modm naming convention.
153+
154+
:returns: a sorted list of all peripheral names.
155+
"""
156+
def get_driver(s):
157+
name = None
158+
if "driver" in s: name = translate(s["driver"])
159+
if "instance" in s: name += translate(s["instance"])
160+
return name
161+
162+
def translate(s):
163+
return s.replace("_", "").capitalize()
164+
165+
device = env[":target"]
166+
gpio_driver = device.get_driver("gpio")
167+
# Get all the peripherals from the GPIO remap-able signals
168+
all_peripherals = {get_driver(remap) for remap in gpio_driver.get("remap", [])}
169+
# Get all the peripherals from the normal GPIO signals
170+
all_peripherals.update(get_driver(s) for gpio in gpio_driver["gpio"] for s in gpio.get("signal", []))
171+
# Get all peripherals from the driver instances
172+
all_drivers = (d for d in device._properties["driver"] if d["name"] not in ["gpio", "core"])
173+
for d in all_drivers:
174+
dname = translate(d["name"])
175+
if "instance" in d:
176+
all_peripherals.update(dname + translate(i) for i in d["instance"])
177+
else:
178+
all_peripherals.add(dname)
179+
if dname == "Dma" and d["type"] == "stm32-mux":
180+
all_peripherals.add("Dmamux1")
181+
182+
all_peripherals.discard(None)
183+
all_peripherals = sorted(list(all_peripherals))
184+
bprops["all_peripherals"] = all_peripherals
185+
return all_peripherals
186+
187+
148188
# -----------------------------------------------------------------------------
149189
def init(module):
150190
module.name = ":cmsis:device"
@@ -157,6 +197,8 @@ def prepare(module, options):
157197

158198
module.add_query(
159199
EnvironmentQuery(name="rcc-map", factory=common_rcc_map))
200+
module.add_query(
201+
EnvironmentQuery(name="peripherals", factory=common_peripherals))
160202
module.add_query(
161203
EnvironmentQuery(name="headers", factory=common_header_file))
162204

@@ -165,6 +207,7 @@ def prepare(module, options):
165207

166208
def validate(env):
167209
env.query("rcc-map")
210+
env.query("peripherals")
168211

169212
def build(env):
170213
env.collect(":build:path.include", "modm/ext")
@@ -184,3 +227,6 @@ def build(env):
184227
})
185228
env.outbasepath = "modm/src/modm/platform"
186229
env.template("device.hpp.in")
230+
231+
env.outbasepath = "modm/src/modm/platform/core"
232+
env.template("peripherals.hpp.in")

src/modm/platform/clock/stm32/module.lb

Lines changed: 1 addition & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -128,19 +128,7 @@ def build(env):
128128
env.template("rcc.cpp.in")
129129
env.template("rcc.hpp.in")
130130

131-
all_peripherals = set()
132-
all_drivers = [d for d in device._properties["driver"] if d["name"] not in ["gpio", "core"]]
133-
translate = lambda s: s.replace("_", "").capitalize()
134-
for d in all_drivers:
135-
dname = translate(d["name"])
136-
if "instance" in d:
137-
all_peripherals.update(dname + translate(i) for i in d["instance"])
138-
else:
139-
all_peripherals.add(dname)
140-
if dname == "Dma" and d["type"] == "stm32-mux":
141-
all_peripherals.add("Dmamux1")
142-
143-
all_peripherals = sorted(list(all_peripherals))
131+
all_peripherals = env.query(":cmsis:device:peripherals")
144132
rcc_map = env.query(":cmsis:device:rcc-map")
145133
rcc_enable = {}
146134
rcc_reset = {}

src/modm/platform/gpio/stm32/module.lb

Lines changed: 2 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,7 @@ def translate(s):
3030
return s.replace("_", "").capitalize()
3131

3232
def get_driver(s):
33-
name = "None"
33+
name = None
3434
if "driver" in s: name = translate(s["driver"]);
3535
if "instance" in s: name += translate(s["instance"]);
3636
return name
@@ -42,6 +42,7 @@ def extract_signals(signals):
4242
afs = {}
4343
for s in signals:
4444
driver = get_driver(s)
45+
if driver is None: continue
4546
name = get_name(s)
4647
key = driver + name
4748
afs[key] = {"driver": driver, "name": name, "af": s["af"]}
@@ -238,22 +239,6 @@ def validate(env):
238239
"remap_value": remapped_gpios[key]
239240
})
240241

241-
all_peripherals = [s["driver"] for s in all_signals.values()]
242-
# Signals are not enough, since there are peripherals that don't have signals.
243-
# Example: STM32F401RE < 64pins: SPI4 cannot be connected to any pins.
244-
# FIXME: Allow accessing device file more freely
245-
all_drivers = [d for d in device._properties["driver"] if d["name"] not in ["gpio", "core"]]
246-
for d in all_drivers:
247-
dname = translate(d["name"])
248-
if "instance" in d:
249-
all_peripherals.extend([dname + translate(i) for i in d["instance"]])
250-
else:
251-
all_peripherals.append(dname)
252-
if dname == "Dma" and d["type"] == "stm32-mux":
253-
all_peripherals.append("Dmamux1")
254-
if "remap" in driver:
255-
all_peripherals.extend([get_driver(r) for r in driver["remap"]])
256-
bprops["all_peripherals"] = sorted(list(set(all_peripherals)))
257242
bprops["all_signals"] = sorted(list(set(s["name"] for s in all_signals.values())))
258243
bprops["gpios"] = [bprops[g["port"] + g["pin"]] for g in driver["gpio"]]
259244
bprops["port_width"] = 16
@@ -285,7 +270,3 @@ def build(env):
285270
env.template("../common/connector.hpp.in", "connector.hpp",
286271
filters={"formatPeripheral": get_driver,
287272
"printSignalMap": print_remap_group_table})
288-
289-
# FIXME: Move to modm:platform:core!
290-
env.outbasepath = "modm/src/modm/platform/core"
291-
env.template("peripherals.hpp.in")

0 commit comments

Comments
 (0)