Re: RPI4 Hardware PWM

From: Matthew Grooms <mgrooms_at_shrew.net>
Date: Fri, 11 Jun 2021 14:19:26 UTC
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.

Thanks,

-Matthew