Categories
IoT Zephyr

Zephyr Weekly Update – Feeling a disturbance in the Force

We are just a few days away from hitting 100,000 (!) commits on the main Zephyr repository, and things are not really slowing down despite the summer holidays 🙂 Let’s dive right in!

New Haptics driver class

It is common for interactive devices to provide haptic feedback to the user. For example, pressing widgets on a touch screen may trigger gentle vibrations while a stronger vibration may indicate that the action was not successful. Well, as of this week, Zephyr supports haptic feedback devices through a new haptics driver class!

An IC providing haptic feedback functionality is typically hooked up to a tiny motor that will vibrate when a signal is sent to it. The actual vibration pattern can be controlled in several ways: directly feeding the IC with a PWM or analogue signal, using built-in “melodies” available from the chip’s ROM (ex. “strong click”, “short double click”, etc.), etc.

The new haptics driver class provides a common API for starting/stopping vibrations, and for now most of the actual configuration is done through hardware-specific API. (PR #76343)

Texas Instruments DRV2605 is the only driver implementing this API for now, but let’s hope we’ll get more in the near future.

I’ll try to prepare a short demo of this new feature for the next blog post, but you may check out this code sample in the meantime.

A practical State Machine Framework example

I have mentioned Zephyr’s State Machine Framework quite a bit in the past, and I am happy to see that more and more subsystems are either transitioning to it, or considering doing so. State machines are something you definitely don’t want to get wrong, and using a proven framework can really help with making your code easier to read, test, and maintain over time.

We have a new very cool code sample that implements a calculator with a fancy LVGL GUI and whose logic is implemented using the State Machine Framework.

It is really nice to see how to turn a pretty complex state machine into something that can actually be executed and hooked up to a UI. I hope this will inspire folks to look at SMF whenever they’re just about to get lost in switch/case madness 🙂

(PR #76465)

SoCs, Boards & Shields

Support has been added for the following SoCs:

  • Several SoCs from Analog Devices’ DARWIN MAX326xx Series (MAX32662 , MAX32666, MAX32675). (PR #73578, #73560, #73576)
  • FLPR (Fast Lightweight Processor) RISC-V core on nRF54H20 is now supported. (PR #75451)
  • Wi-Fi driver for the NXP RW612 has been added. (PR #76289)

New boards and shields:

  • The nRF7002 EK is a versatile evaluation kit in the form of an Arduino shield that can be used in Nordic and non-Nordic host boards. (PR #75714)
  • 01space ESP32C3-0.42-OLED. (PR #74964)
  • STM32F405 Core. (PR #74378)

Drivers

  • New MBOX driver for ESP32. (PR #76301)
  • New DMA driver for MAX32xxx. (PR #76627)

Miscellaneous

  • Added support for Wi-Fi Device Provisioning Protocol (DPP) via hostap. DPP is a secure, simplified method for connecting devices to a Wi-Fi network without needing to share the network password directly. (PR #73707)
  • A new reset_stats() API has been introduced to allow resetting Wi-Fi usage statistics. (PR #75768)
  • New sample application demonstrating how to use the CoAP client. (PR #76069)
  • LittleFS module has been updated to 2.9.3. (PR #74001)
  • POSIX
    • Added support for _POSIX_THREAD_PRIO_PROTECT. (PR #74386)
    • Implemented readdir_r. (PR#74394)

A big thank you to the 16 individuals who had their first pull request accepted this week, 💙 🙌: @alexstanoev-nordic, @nngt88, @pyadvichuk, @duynguyenxa, @juliaazziz, @LeoBRIANDSmile, @aa889788, @yiding, @konrad1s, @unsanded, @thales-nascimento, @pblxptr, @LiLongNXP, @Robibobo1, @asingh-GiN, and @00thirdeye00.

As always, I very much welcome your thoughts and feedback in the comments below!

If you enjoyed this article, don’t forget to subscribe to this blog to be notified of upcoming publications! And of course, you can also always find me on Twitter and Mastodon.

Catch up on all previous issues of the Zephyr Weekly Update:

Categories
IoT Zephyr

Zephyr Weekly Update – Rust coming to Zephyr?

It has been way too long since I posted a Zephyr Weekly Update, so let’s try to get back to a more regular schedule, shall we? The past few weeks have been very busy for the Zephyr community as the new Long-Term Support version of the project, Zephyr 3.7 was just released.

It is a big milestone for the project and it brings a lot of new features and improvements which I’ve been covering in details in last week’s announcement blog post. I also had a lot of fun diving into some of the most significant changes and putting together this video that’s packed with in-depth demos of the new HTTP Server, Precision Time Protocol integration, and more.

As for this week’s news, just keep reading!

Rust coming to Zephyr?

The first few weeks after a major release are the perfect time for new significant features to be proposed, and this is exactly what is happening right now with the proposal to add Rust support to Zephyr.

RFC #65837 describes the bulk of the proposal and there’s now a number of pull requests with actual code and documentation that I highly encourage everyone to give a try.

#![no_std]

use zephyr::printkln;

extern crate zephyr;

#[no_mangle]
extern "C" fn rust_main() {
    printkln!("Hello world from Rust on {}",
              zephyr::kconfig::CONFIG_BOARD);
}

I am really excited to see all the work and discussions happening around the topic as this will be my excuse to finally learn Rust!

Interesting, and related: as of this week, probe-rs is a new supported runner which you can use to flash/debug a supported board. (PR #71627)

probe-rs is an embedded debugging and target interaction toolkit. It enables its user to program and debug microcontrollers via a debug probe.

Upcoming Zephyr Tech Talk

Join me on Wednesday, August 7 (3.oo pm CEST / 9.00 am EDT) for a new Zephyr Tech Talk live stream! Katarzyna Zalewska will be back on the show and we will be discussing some of the best practices for monitoring the health of IoT devices in realtime.

You may join us from YouTube or LinkedIn, whichever you prefer 🙂

Boards & SoCs

Not an exhaustive list, but some of the new boards and shields recently added are:

  • Added support for the Nucleo-H503RB board (PR #75590)
  • Added support for Mikroe BLE TINY Click shield. (PR #76246)
  • Added support for Adafruit Feather nrf52840 Sense. (PR #76135)

Drivers

  • New driver for ST LSM9DS1 9-DOF IMU. (PR #73141)
  • New RTC driver for Micro Crystal RV-8263-C8 . (PR #73385)
  • New driver for Infineon CAT1 QSPI flash controller. (PR #73976)
  • New True-RNG driver for Analog Device MAX32xxx SoC series. (PR #74943)

Miscellaneous

  • HTTP server now allows to serve static resources directly from the file system. The content type of the resource is auto-guessed based on the file extension, and .gz files are also automatically treated as compressed content and HTTP headers set accordingly. Neat! (PR #76106)
  • Emulated UART devices can now be added to a zephyr,uart-emul UART controller. (PR #75827)
  • New LwM2M shell command (obs) to dig into active observations. (PR #74293)

A big thank you to the 23 individuals who had their first pull request accepted since Zephyr 3.7 was released, 💙 🙌: @jacobw, @bas-archembedded, @dberlin, @alexstanoev-nordic, @maarten1C96, @SandraArrow, @Finwood, @juliaazziz, @LeoBRIANDSmile, @Finomnis, @anobli, @gschwaer, @WalkingTalkingPotato, @florolf, @thales-nascimento, @mrodgers-witekio, @VineetaNarkhede-eaton, @GaofengZhangNXP, @munir-zin, @olivier-le-sage, @00thirdeye00, @nordic-pikr, and @jsarha.

As always, I very much welcome your thoughts and feedback in the comments below!

If you enjoyed this article, don’t forget to subscribe to this blog to be notified of upcoming publications! And of course, you can also always find me on Twitter and Mastodon.

Catch up on all previous issues of the Zephyr Weekly Update:

Categories
IoT Zephyr

Zephyr Weekly Update – New SoC porting guide

Before diving into this week’s updates, a quick reminder about our upcoming Zephyr Tech Talk, next Thursday, May 30!
We will be discussing all things tracing and profiling, and I am really looking forward to seeing lots of live demos of some of the tools available out there that can really help you understand better what’s really going on under the hood of your favorite RTOS, as well as potentially identify performance bottlenecks.

MQTT-based sensor/actuator code samples

We have a new code sample that might be one of the most comprehensive to date in the Zephyr tree.

It demonstrates how to implement a simple IoT sensor that publishes sensor data over MQTT. IoT 101, you might say, but the sample is a great showcase of the many services one needs to support such a scenario, among which:

  • Establishing network connectivity using DHCP ;
  • Establishing a secure MQTT connection (using TLS 1.2) ;
  • Using JSON to encode sensor data and send it at a user-defined interval (would be curious to see CBOR or other encoding formats introduced as alternatives) ;
  • Subscribing to user-defined topic(s) on the MQTT server, e.g. to receive commands ;
  • etc.

New SoC porting guide

A new documentation page describes the process of porting a new SoC to Zephyr.

This is a most welcome addition, that complements the existing architecture and board porting guides, and will be very useful for anyone looking to add support for a new SoC to Zephyr. (PR #69475)

Boards & SoCs

  • Several additions to the list of peripherals supported for Renesas Smartbond SoCs: memory controller, added power management support to the crypto and MIPI DBI driver, … (PR #68023, #72994, #72819)
  • Apollo 3 SoC series getting some love as well, with new counter driver (PR #72842), I2C (PR #72913), and watchdog (PR #72830)
  • Added support for NXP Kinetis KE1xZ series. KE1xZ MCUs are based on a Cortex-M0+ core, running up to 96 MHz. These MCUs support up to 512 KB flash, 96 KB RAM, and a complete set of analog/digital features. (PR #71670)
  • Added support for Microchip MEC5 SoC family. (PR #72876)

New boards and shields:

  • Added support for NXP FRDM-RW612 board.
    The RW612 is a highly integrated, low-power tri-radio wireless MCU with an integrated 260 MHz ARM Cortex-M33 MCU and Wi-Fi 6 + Bluetooth Low Energy (LE) 5.3 / 802.15.4 radios. (PR #72306)
  • Alongside KE1xZ SoC support, the NXP FRDM-KE15Z is now also supported. It contains a robust TSI (touch sensing interface) module with up to 50 channels, making it highly flexible for handling touch keys.
  • USB device controller now available for nRF54H20 DK. (PR #72774)

Drivers

  • It seems like the Video subsystem is getting some attention recently, and it is really nice to see a new driver just landed for the OV5640 CMOS 5-Megapixel image sensor. (PR #71854)
  • New driver for Festo VEAA-X-3 series proportional pressure regulator. (PR #69047)
  • New LED Strip driver for Texas Instruments TLC59731. TLC59731 is a 3-channel, 8-bit, PWM LED driver with single-wire interface based on the EasySet protocol. (PR #68617)

Miscellaneous

  • A new rtt-console snippet has been introduced to quickly switch serial console output to Segger J-Link RTT.
  • When using the sensor_shell code sample, you can now include a fake sensor implementation, which can help when you don’t have an actual sensor at hand 🙂 (PR #72833)
  • You may now enable CONFIG_EXCEPTION_STACK_TRACE_SYMTAB to have symbol names printed in stack traces on Arm64 and RISC-V. (PR #72973)
  • Added a new module implementing MIPI STPv2 (System Trace Protocol). MIPI STP was developed as a generic base protocol that can be shared by multiple application-specific trace protocols. The new module can be used to decode a stream of STPv2 data. (PR #72151)
  • Add a modem backend statistics module.
    Similar to how you can use kernel stats to e.g monitor how “high” your threads go, you can use this new module to keep an eye on buffer usage within the modem subsystem, and use the information to optimize their size. (PR #72576)
uart:~$ modem_stats buffer
ppp0_rx: used at most: 124 of 2048 (6%)
ppp0_tx: used at most: 2048 of 2048 (100%)
uart@b000_rx: used at most: 233 of 4096 (5%)
uart@b000_tx: used at most: 4062 of 4096 (99%)
cmux_rx: used at most: 124 of 2048 (6%)
cmux_tx: used at most: 2047 of 2048 (99%)
dlci_1_rx: used at most: 124 of 2048 (6%)
dlci_2_rx: used at most: 25 of 1024 (2%)
  • Hierarchical state-machine operations in SMF (State Machine Framework) now follow a more “UML-like” transition flow. (PR #71729)
  • New sys_bitarray_* APIs to now allow “popcount” (count how many bits are set), xor with another bitarray, as well as find the Nth bit set in a region. (PR #72901)
  • New Kconfig, CONFIG_MEM_DOMAIN_ISOLATED_STACKS — on supported architectures, thread stacks within the same memory domains are now isolated, i.e. threads within the same memory domains have no access to others threads’ stacks.
  • Added support for bt_disable in the ISO implementation. (PR #72690)
  • west build now allows to pass the list of shield(s) you want to add to your board via the --shield argument — much more natural than the old way of passing -DSHIELD as a CMake parameter. (PR #72720)
  • USB device “next” stack now has initial support for BOS (Binary Object Store). (PR #72215)

A big thank you to the 7 individuals who had their first pull request accepted this week, 💙 🙌: @alex-bellon, @charliegilliland, @luqasn, @roger1wang-intel, @nicogrx, @zaporozhets, and @srmnw.

As always, I very much welcome your thoughts and feedback in the comments below!

If you enjoyed this article, don’t forget to subscribe to this blog to be notified of upcoming publications! And of course, you can also always find me on Twitter and Mastodon.

Catch up on all previous issues of the Zephyr Weekly Update: