Re: RPI4 Hardware PWM

From: Matthew Grooms <mgrooms_at_shrew.net>
Date: Fri, 11 Jun 2021 14:21:13 UTC
On 6/11/2021 9:19 AM, Matthew Grooms wrote:
> On 6/9/2021 4:16 PM, Matthew Grooms wrote:
>> On 6/8/2021 4:06 PM, Matthew Grooms wrote:
>>> Hey All,
>>>
>>> I have a project I'm working on that depends on interfacing with a 
>>> few sensor modules using both i2c and PWM. I've got the i2c devices 
>>> to work correctly, but I'm not sure how to interface with the HW PWM 
>>> support of the RPI4. I can see there are settings exposed via sysctl 
>>> for Beaglebone systems ...
>>>
>>> https://zewaren.net/bbb-pwm.html
>>>
>>> I was hoping I'd be able to force GPIO 12 or 13 into ALT0  and set 
>>> the duty values via sysctl, but that doesn't seem to be an option. 
>>> Any help would be greatly appreciated.
>>
>> Replying to myself with a bit more info. I see that there is a driver 
>> available for rpi boards authored by PHK ...
>>
>> https://cgit.freebsd.org/src/tree/sys/arm/broadcom/bcm2835/bcm2835_pwm.c
>>
>> That has notes on RPi2/3 boards, but not mention of RPi4. When I load 
>> that, I see the following output ...
>>
>> Jun  9 18:29:50 generic kernel: pwm0: <BCM2708/2835 PWM controller> 
>> mem 0x7e20c000-0x7e20c027 on simplebus0
>> Jun  9 18:29:50 generic kernel: pwm0: cannot find Clock Manager
>>
>> I assume I'm doing something wrong. Any feedback would be greatly 
>> appreciated.
>
> Hey Everyone,
>
> I decided to take a look at the patch that introduced rpi4 support in 
> Linux. I'm pretty out of my depth here but they didn't look all that 
> extensive. One obvious difference that stood out was that the FreeBSD 
> clock manager driver only appears to load for the bcm2835 part while 
> the Linux driver loads for both 2835 and 2711. Adding the following 
> line to the clkman driver allows the pwm driver to load without an 
> error now ...
>
> --- bcm2835_clkman.c    2021-06-11 09:06:19.893728000 -0500
> +++ bcm2835_clkman.c    2021-06-11 08:50:44.646221000 -0500
> @@ -51,6 +51,7 @@
>  #include <arm/broadcom/bcm2835/bcm2835_clkman.h>
>
>  static struct ofw_compat_data compat_data[] = {
> +       {"brcm,bcm2711-cprman",         1},
>         {"brcm,bcm2835-cprman",         1},
>         {"broadcom,bcm2835-cprman",     1},
>         {NULL,                          0}
>
> root@generic:/home/mgrooms # tail -n 1 /var/log/messages
> Jun 11 08:35:58 generic kernel: pwm0: <BCM2708/2835 PWM controller> 
> mem 0x7e20c000-0x7e20c027 on simplebus0
>
> Additionally, there appears to be valid sysctl values for the hardware 
> pwm devices now. I'll try testing them out and see if I can determine 
> if they're working as expected and report back.

Woops. I was going to include these for reference:

root@generic:/home/mgrooms # sysctl -a | grep pwm
dev.pwm.0.mode2: 0
dev.pwm.0.ratio2: 2500
dev.pwm.0.period2: 10000
dev.pwm.0.pwm_freq2: 0
dev.pwm.0.mode: 0
dev.pwm.0.freq: 125000000
dev.pwm.0.ratio: 2500
dev.pwm.0.period: 10000
dev.pwm.0.pwm_freq: 0
dev.pwm.0.%parent: simplebus0
dev.pwm.0.%pnpinfo: name=pwm@7e20c000 compat=brcm,bcm2835-pwm
dev.pwm.0.%location:
dev.pwm.0.%driver: pwm
dev.pwm.0.%desc: BCM2708/2835 PWM controller
dev.pwm.%parent:

-Matthew