Linux's Kernel-Level Software PWM Support Arrives on the Raspberry Pi's GPIO Pins
Backported from Linux 6.11 the kernel-level PWM diver "blows most userspace libraries out of the water," says Philip Howard.
Raspberry Pi users working with pulse-width modulation (PWM) signals on the popular boards' general-purpose input/output (GPIO) pins can now benefit from a new driver based on a high-resolution timer — unlocking the functionality on any pin.
"Add a software PWM which toggles a GPIO from a high-resolution timer," developer Vincent Whitchurch writes of the feature, which is included in the Linux 6.11 kernel. "This will naturally not be as accurate or as efficient as a hardware PWM, but it is useful in some cases. I have for example used it for evaluating LED brightness handling (via leds-pwm
) on a board where the LED was just hooked up to a GPIO, and for a simple verification of the timer frequency on another platform."
The ability to have high-quality software PWM on any GPIO pin will be welcomed by Raspberry Pi users, with one caveat: Raspberry Pi does not yet provided a kernel based on Linux 6.11. Thankfully, a pull request to merge the feature into the rpi-6.6.y kernel branch has been accepted — and the feature should be available through rpi-update by the time you read this article.
"It worked OK on a [Raspberry] Pi 5 with an MG946 servo and seemed solid under normal loads," writes Raspberry Pi's principal software engineer Tim Gover of his testing. "Maxing out the PCIe [PCI Express] link can cause a very small but observable wobble on the servo."
"After many months of gentle nudging and poking it seems like Linux GPIO PWM is finally making it to [Raspberry] Pi," developer Philip Howard adds in a comment on Mastodon. "That's PWM on arbitrary GPIO pins using a kernel level software driver — blows most userspace libraries out of the water."
More information is available in the pull request on the Raspberry Pi Linux GitHub repository.