From 807a93b2b51fa1304348167998cab50a56f46171 Mon Sep 17 00:00:00 2001 From: MaartenS11 Date: Fri, 22 May 2026 10:11:35 +0200 Subject: [PATCH 1/2] Initial piezo tone/noTone primitive support --- platforms/Zephyr/boards/rpi_pico.overlay | 16 ++++++++++ src/Primitives/zephyr.cpp | 40 ++++++++++++++++++++++++ 2 files changed, 56 insertions(+) diff --git a/platforms/Zephyr/boards/rpi_pico.overlay b/platforms/Zephyr/boards/rpi_pico.overlay index aa559e3f..0056764b 100644 --- a/platforms/Zephyr/boards/rpi_pico.overlay +++ b/platforms/Zephyr/boards/rpi_pico.overlay @@ -47,6 +47,8 @@ <&gpio0 27 0>, <&gpio0 28 0>, <&gpio0 29 0>; + + pwms = < &pwm 2 PWM_USEC(1500) PWM_POLARITY_NORMAL >; }; }; @@ -75,3 +77,17 @@ }; }; }; + +&pinctrl { + pwm_ch1a_default: pwm_ch1a_default { + group1 { + pinmux = ; // Channel 1 A, 1 * 1 + 1 = 2, &pwm 2 in pwms + }; + }; +}; + +&pwm { + status="okay"; + divider-int-4 = <255>; + pinctrl-0 = < &pwm_ch1a_default >; +}; diff --git a/src/Primitives/zephyr.cpp b/src/Primitives/zephyr.cpp index 14f6d370..965e12d3 100644 --- a/src/Primitives/zephyr.cpp +++ b/src/Primitives/zephyr.cpp @@ -130,6 +130,43 @@ def_prim(millis, NoneToOneU32) { return true; } +static const struct pwm_dt_spec piezo_spec = + PWM_DT_SPEC_GET(DT_PATH(zephyr_user)); + +bool pwm_write_freq(pwm_dt_spec pwm_spec, uint32_t period_us) { + if (!pwm_is_ready_dt(&pwm_spec)) { + printf("Error: PWM device %s is not ready\n", pwm_spec.dev->name); + return false; + } + + uint32_t period = PWM_USEC(period_us); + int ret = pwm_set_dt(&pwm_spec, period, period / 2U); + if (ret) { + printf("Error %d: failed to set pulse width, period_us = %d\n", ret, + period_us); + return false; + } + + return true; +} + +def_prim(tone, oneToNoneI32) { + // The argument is in Hz, we convert it to a period in us. + pwm_write_freq(piezo_spec, 1000000 / arg0.uint32); + pop_args(1); + return true; +} + +def_prim(noTone, NoneToNoneU32) { + if (!pwm_is_ready_dt(&piezo_spec)) { + printf("Error: PWM device %s is not ready\n", piezo_spec.dev->name); + return false; + } + + pwm_set_pulse_dt(&piezo_spec, 0); + return true; +} + def_prim(random_int, NoneToOneU32) { pushInt32(sys_rand32_get()); return true; @@ -541,6 +578,9 @@ void install_primitives(Interpreter *interpreter) { install_primitive(display_fill_rect); install_primitive(display_draw_string); #endif + + install_primitive(tone); + install_primitive(noTone); } Memory external_mem = {0, 0, 0, nullptr}; From cd5a6e99cb1416313f91878c24fe1fc93e7d5d4a Mon Sep 17 00:00:00 2001 From: MaartenS11 Date: Tue, 14 Jul 2026 17:40:52 +0200 Subject: [PATCH 2/2] Add builtin-buzzer element to overlay Allows boards to define where a buzzer would be connected so they can target it --- platforms/Zephyr/boards/rpi_pico.overlay | 1 + src/Primitives/zephyr.cpp | 8 +++++++- 2 files changed, 8 insertions(+), 1 deletion(-) diff --git a/platforms/Zephyr/boards/rpi_pico.overlay b/platforms/Zephyr/boards/rpi_pico.overlay index 0056764b..9b435fc9 100644 --- a/platforms/Zephyr/boards/rpi_pico.overlay +++ b/platforms/Zephyr/boards/rpi_pico.overlay @@ -49,6 +49,7 @@ <&gpio0 29 0>; pwms = < &pwm 2 PWM_USEC(1500) PWM_POLARITY_NORMAL >; + pwm-names = "builtin-buzzer"; }; }; diff --git a/src/Primitives/zephyr.cpp b/src/Primitives/zephyr.cpp index 965e12d3..c250f231 100644 --- a/src/Primitives/zephyr.cpp +++ b/src/Primitives/zephyr.cpp @@ -130,8 +130,10 @@ def_prim(millis, NoneToOneU32) { return true; } +#if DT_PROP_HAS_NAME(DT_PATH(zephyr_user), pwms, builtin_buzzer) + static const struct pwm_dt_spec piezo_spec = - PWM_DT_SPEC_GET(DT_PATH(zephyr_user)); + PWM_DT_SPEC_GET_BY_NAME(DT_PATH(zephyr_user), builtin_buzzer); bool pwm_write_freq(pwm_dt_spec pwm_spec, uint32_t period_us) { if (!pwm_is_ready_dt(&pwm_spec)) { @@ -167,6 +169,8 @@ def_prim(noTone, NoneToNoneU32) { return true; } +#endif + def_prim(random_int, NoneToOneU32) { pushInt32(sys_rand32_get()); return true; @@ -579,8 +583,10 @@ void install_primitives(Interpreter *interpreter) { install_primitive(display_draw_string); #endif +#if DT_PROP_HAS_NAME(DT_PATH(zephyr_user), pwms, builtin_buzzer) install_primitive(tone); install_primitive(noTone); +#endif } Memory external_mem = {0, 0, 0, nullptr};