Skip to content
View in the app

A better way to browse. Learn more.

Armbian Community Forums

A full-screen app on your home screen with push notifications, badges and more.

To install this app on iOS and iPadOS
  1. Tap the Share icon in Safari
  2. Scroll the menu and tap Add to Home Screen.
  3. Tap Add in the top-right corner.
To install this app on Android
  1. Tap the 3-dot menu (⋮) in the top-right corner of the browser.
  2. Tap Add to Home screen or Install app.
  3. Confirm by tapping Install.

Rock Pi4 pwm control - no overlay?

Featured Replies

Hi, 

 

I'm new to armbian and I've started with RockPi4b board. I would like to add fan control with PWM, but adding pwm (or pwm0) overlay doesn't work. I can't also find the overlay for it at /boot/dtb-5.8.6-rockchip64/rockchip/overlay/. Is it supported? I've checked and the /sys/class/pwm/pwmchip0 is present, but accessing export, as described here : 

 

 

doesn't work and /sys/class/pwm/pwmchip0/pwm0 is not present.

 

I've tried to find pwm access examples for this board, but none of it works on armbian (all are vendor builds specific). Can anybody point me in the right direction or give any hint how to enable pwm?

 


EDIT : I've managed to enable/dosable PWM pin with 

 

sudo mraa-gpio set 11 1

 

Although, its GPIO, rather PWM access so I can't control the FAN speed and only power on/off the fan. 

Edited by PetrozPL
update regarding power on/off fan

Solved by PetrozPL

  • Author
  • Solution

ok, I've managed to sort this out on my own. I've decompiled the rockchip-rockpi4.dtb and find out that pwm is disabled by default. So I've wrote new overlay for pwm, just to enable it : 

 

/dts-v1/;

/ {
        compatible = "rockchip,rk3399";
		
        fragment@0 {
                target-path = "/aliases";
                __overlay__ {
                        pwm0 = "/pwm@ff420000";
                        pwm1 = "/pwm@ff420010";
                };
        };

        fragment@1 {
                target-path = "/pwm@ff420000";
                __overlay__ {
                        status = "okay";
                };
        };

        fragment@2 {
                target-path = "/pwm@ff420010";
                __overlay__ {
                        status = "okay";
                };
        };
		
};

next, compiled it with dtc : 

dtc -O dtb -o rockchip-pwm-gpio.dtbo -b 0 -@ rockchip-pwm-gpio.dts

and moved dtbo to /boot/dtc/rockchip/overlays, and activated it in overlays in /boot/armbianEnv.txt.

 

Now PWM works like a charm. I'm just leaving this thread and my resolution as reference, for anyone with the same problem.

 

Edited by PetrozPL
typo fixed

Hi @PetrozPL,

 

I'm using Armbian buster 5.10.12 with RockPi 4C. I can't get your solution to work. Have you made any change since 2020 september ?

 

Regards

 

  • Author

Hi, no I haven't. The previous configuration is still working, so no need to update to new images. The overlay should be compiled via dtc to file rockchip-pwm-gpio.dtbo, and put in location : /boot/dtb/rockchip/overlay/

 

The activation in /boot/armbianEnv.txt should be via overlays variable : 

overlay_prefix=rockchip
overlays=pwm-gpio

Hope this helps. 

 

Best regards

  • Author
11 hours ago, Piscenois said:

Thank you PetrozPL !

I tried pwm, pwm0, pwm1 but no pwm-gpio...

 

Regards.

Yhea, that makes two of us :D It took me some time and digging before I figured out the correct naming convention :D

Your post is the only one accross the Internet to explain how to activate PWM with RockPi4 and it works ! It deserves to be pinned, tagged. Subliminal message for moderators :ph34r:

Hi,

 

I know, this thread is pretty old. Hope its okay to post here anyway.

 

I have a rockpi 4A with penta-sata-hat, armbian-buster (21.02.3) desktop with current kernel and following the instructions from this thread turns the fan on.

Although I'm happy with the turning fan, its too loud and I'd like to be able to vary fanspeed.

 

Following advices from other threads like writing values to .../duty_cycle and .../period does not work. I don't have such files. Pwm related tree from sysfs looks like this:

 

find /sys/class/pwm/pwmchip0/
/sys/class/pwm/pwmchip0/
/sys/class/pwm/pwmchip0/uevent
/sys/class/pwm/pwmchip0/power
/sys/class/pwm/pwmchip0/power/runtime_active_time
/sys/class/pwm/pwmchip0/power/runtime_status
/sys/class/pwm/pwmchip0/power/autosuspend_delay_ms
/sys/class/pwm/pwmchip0/power/runtime_suspended_time
/sys/class/pwm/pwmchip0/power/control
/sys/class/pwm/pwmchip0/unexport
/sys/class/pwm/pwmchip0/device
/sys/class/pwm/pwmchip0/export
/sys/class/pwm/pwmchip0/subsystem
/sys/class/pwm/pwmchip0/npwm

 

Any hints on how I could modify fan speed (based on temperature values)?

 

I also tried the script from nanopi m4 thread - but that script simply turns the fan off. No matter what cpu temperature might be. I have to reboot to get the fan spinning again.

  • Author
1 hour ago, tony013 said:

Hi,

 

I know, this thread is pretty old. Hope its okay to post here anyway.

 

I have a rockpi 4A with penta-sata-hat, armbian-buster (21.02.3) desktop with current kernel and following the instructions from this thread turns the fan on.

Although I'm happy with the turning fan, its too loud and I'd like to be able to vary fanspeed.

 

Following advices from other threads like writing values to .../duty_cycle and .../period does not work. I don't have such files. Pwm related tree from sysfs looks like this:

 


find /sys/class/pwm/pwmchip0/
/sys/class/pwm/pwmchip0/
/sys/class/pwm/pwmchip0/uevent
/sys/class/pwm/pwmchip0/power
/sys/class/pwm/pwmchip0/power/runtime_active_time
/sys/class/pwm/pwmchip0/power/runtime_status
/sys/class/pwm/pwmchip0/power/autosuspend_delay_ms
/sys/class/pwm/pwmchip0/power/runtime_suspended_time
/sys/class/pwm/pwmchip0/power/control
/sys/class/pwm/pwmchip0/unexport
/sys/class/pwm/pwmchip0/device
/sys/class/pwm/pwmchip0/export
/sys/class/pwm/pwmchip0/subsystem
/sys/class/pwm/pwmchip0/npwm

 

Any hints on how I could modify fan speed (based on temperature values)?

 

I also tried the script from nanopi m4 thread - but that script simply turns the fan off. No matter what cpu temperature might be. I have to reboot to get the fan spinning again.

 

I've created the repository on github with all required files, including 2 scripts I'm using to control and query PWM FAN speed.

 

https://github.com/PetrozPL/rockpi4_pwm_overlay

 

Hope You'll find it usefull.

 

EDIT : Also, to control fan speed based on HDD temperature you can use smartctl tool to read HDD temperature from SMART. Example output for my NVMe : 

sudo smartctl -a /dev/nvme0 | grep Temperature
Temperature:                        76 Celsius
Warning  Comp. Temperature Time:    0
Critical Comp. Temperature Time:    0
Temperature Sensor 2:               83 Celsius

 

If you would like to get system temperature instead hdd You can use another script to check thermal_zone0 temperature: 

#!/bin/bash

_temp=`cat /sys/class/thermal/thermal_zone0/temp`
_temp1=${_temp::-3}
_temp2=${_temp::(-3)}
echo ${_temp::-3}.${_temp:(-3)} C

 

Best regards,
PetrozPL 

 

Thank you @PetrozPL

 

... but your script does the same as other scripts: write values to duty_cycle and period.

As I already wrote, that does not work on my system.

Your script returns (as expected) -1

... and manually writing value to duty_cycle or period results in "no such file or directory".

 

So may be, its related to the different kernel version, other dtb, whatever.

I don't know, where to search for support/solution.

Could you please check your dts file, whether it contains "duty_cycle" and "period"?

If you post the surrounding paragraph, I could give it a try.

 

When I use raspian and install the original driver from radxa, fanspeed is related to cputemperature.

With armbian there's no way to change fanspeed.

Well - original driver from radxa uses pigpio and python. I tried to port pigpio to rockpi, but I wasn't successful.

 

I don't care about language - anything that works would be ok for me.

The point is, I don't know nothing about lowlevel programming of pi/rockpi, but if you gimme a hand, I'll try to solve it.

 

  • Author
3 hours ago, tony013 said:

Thank you @PetrozPL

 

... but your script does the same as other scripts: write values to duty_cycle and period.

As I already wrote, that does not work on my system.

Your script returns (as expected) -1

... and manually writing value to duty_cycle or period results in "no such file or directory".

 

So may be, its related to the different kernel version, other dtb, whatever.

I don't know, where to search for support/solution.

Could you please check your dts file, whether it contains "duty_cycle" and "period"?

If you post the surrounding paragraph, I could give it a try.

 

When I use raspian and install the original driver from radxa, fanspeed is related to cputemperature.

With armbian there's no way to change fanspeed.

Well - original driver from radxa uses pigpio and python. I tried to port pigpio to rockpi, but I wasn't successful.

 

I don't care about language - anything that works would be ok for me.

The point is, I don't know nothing about lowlevel programming of pi/rockpi, but if you gimme a hand, I'll try to solve it.

 

Did you tried to call : 

 

sudo echo 0 > /sys/class/pwm/pwmchip1/export

 

Before calling pwmset / pwmsts?

 

EDIT : Ok, I've forgotten about permissions and initialization - on my system it's called once after power up, so there's no need for it on pwmset/pwmsts

 

I've added to repo new file : udev-pwm-permissions.sh. call it with root priviliges or add it to execution on startup.

Am 6.5.2021 um 20:20 schrieb PetrozPL:

Did you tried to call : 

 



sudo echo 0 > /sys/class/pwm/pwmchip1/export

 

Thank you - that finally did the trick!

I have a okdo rock4 c+ with armbian on.

 

I cannot get this to work, I can set pwm duty cycle, but fan speed on board does not change. Any help would be great.

  • Author

Please, post pictures with your FAN connection to the board.

 

EDIT : I've just checked and FAN in okdo is only 2-wire:

image.thumb.png.bc8c6390d4885b7ba37d6c9f48e06023.png

 

so to control it's speed via PWM you have to add additional circuit like on this page : 

 

https://forums.raspberrypi.com/viewtopic.php?t=194621&start=50

 

You need to connect GPIO wire to either PWM0 or PWM1 (one you would like to use to control FAN speed). Without this additional circuit you can't change the speed of 2-pin FAN. The other option is to buy the 3-pin FAN for 5V with additional speed control wire. 

Edited by PetrozPL

just use the dtc tool. Compiled devicetree has .dtb extension. To decompile it to .dts just call : 

 

dtc -I dtb -O dts <COMPILED_DTC>.dtb -o <OUTPUT_DTC>.dts

 

Edited by Petroz

Just now, Petroz said:

just use the dtc tool.

I missed this in this thread as well, I forgot to do the echo to export. The opi5 overlays work perfectly otherwise. But thanks for the reference - haven't found a lot of details on overlays

Old thread but I moved into same problem while updating Rock 4C with Penta-SATA-HAT from legacy Debian 10 image to community maintained Debian 12 minimal image (Bookworm). I lost working OLED and fan did not work anymore.

 

On boot.log I found:

18:45:23+0100 rock4c systemd: Started rockpi-penta.service - Rockpi SATA Hat.
18:45:25+0100 rock4c python3: File "/usr/bin/rockpi-penta/fan.py", line 24, in __init__
18:45:25+0100 rock4c python3: File "/usr/bin/rockpi-penta/fan.py", line 98, in running
18:45:25+0100 rock4c python3: File "/usr/bin/rockpi-penta/fan.py", line 36, in period_us
18:45:25+0100 rock4c python3: File "/usr/bin/rockpi-penta/fan.py", line 32, in period
18:45:25+0100 rock4c python3: FileNotFoundError: [Errno 2] No such file or directory: '/sys/class/pwm/pwmchip0/pwm0/period'
18:45:25+0100 rock4c python3: Waring: init pwm error
18:45:25+0100 rock4c systemd: rockpi-penta.service: Deactivated successfully.

 

Those py-lines are pointing to some files which seems to be missing. It turned out that directory /sys/class/pwm/pwmchip0/pwm0 is missing at all.

 

Based on thread information here and long search I found rock 4C pwm overlay rk3399-pwm1.dtbo at GitHub wich I copied as rockchip-rk3399-pwm1.dtbo to /boot/dtb/rockchip/overlay directory.

 

I updated /boot/armbianEnv.txt by editing line containing overlays= rk3399-i2c7 rk3399-pwm1-by-rockpi-penta to overlays= rk3399-i2c7 rk3399-pwm1.

 

I just rebooted machine and OLED as well as fan return back into working state. Missing directory pwm0 is back on it's place without any additional work. Now I'm able to continue OMV7 installation without further struggles.

hello. Armbian 25.08 for Rockpi 4a executed dtc -O dtb -o rockchip-pwm-gpio.dtbo -b 0 -@ rockchip-pwm-gpio.dts. copied dtbo to /boot/dtb/rockchip/overlays. There is none in /sys/class/pwm/pwmchip1 . /sys/class/pwm/pwmchip0 is available. I can't create the pwmchip1 pwmchip2 folder. Operation not permitted

 

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.
Note: Your post will require moderator approval before it will be visible.

Guest
Reply to this topic...

Account

Navigation

Search

Search

Configure browser push notifications

Chrome (Android)
  1. Tap the lock icon next to the address bar.
  2. Tap Permissions → Notifications.
  3. Adjust your preference.
Chrome (Desktop)
  1. Click the padlock icon in the address bar.
  2. Select Site settings.
  3. Find Notifications and adjust your preference.