Orange Pi One开发板PA6引脚PWM启用故障:DTSO与WiringOP问题
启用Orange Pi One PA6引脚PWM功能的解决方案
问题背景
使用Armbian 23.08.0-trunk Bookworm(内核6.4.1-sunxi),尝试通过DTBO+sysfs和WiringOP两种方式启用Orange Pi One的PA6引脚PWM功能均失败:
- DTBO配置后sysfs无输出
- WiringOP提示所选引脚不支持硬件PWM,但处理器文档明确PA6支持PWM0通道
DTBO方案修复步骤
1. 修正DTSO文件
原DTSO存在冗余配置,且未明确PWM控制器的cell格式,以下是修正后的DTSO(命名为pwm-pa6.dts):
/dts-v1/; /plugin/; / { compatible = "allwinner,sun8i-h3"; // 禁用PA6默认绑定的UART0_TX功能 fragment@0 { target = <&uart0>; __overlay__ { status = "disabled"; }; }; // 配置PA6引脚为PWM0功能 fragment@1 { target = <&pio>; __overlay__ { pwm0_pin: pwm0-pin { pins = "PA6"; function = "pwm0"; drive-strength = <10>; // 增强驱动能力,可选配置 bias-pull-up; // 可选上拉,根据实际需求调整 }; }; }; // 启用PWM控制器并绑定引脚 fragment@2 { target = <&pwm>; __overlay__ { pinctrl-names = "default"; pinctrl-0 = <&pwm0_pin>; status = "okay"; #pwm-cells = <3>; // 匹配sunxi PWM内核驱动要求的cell格式 }; }; };
2. 编译并加载DTBO
执行以下命令完成编译与加载:
# 将DTS编译为DTBO格式 dtc -I dts -O dtb -o pwm-pa6.dtbo pwm-pa6.dts # 创建Overlay加载目录 mkdir -p /sys/kernel/config/device-tree/overlays/pwm-pa6 # 加载DTBO文件 echo $PWD/pwm-pa6.dtbo > /sys/kernel/config/device-tree/overlays/pwm-pa6/path
3. 正确配置sysfs PWM参数
原命令中重复设置period(第二次应为duty_cycle),修正后的命令:
# 导出PWM通道0 echo 0 > /sys/class/pwm/pwmchip0/export # 设置周期为10ms(单位:纳秒) echo 10000000 > /sys/class/pwm/pwmchip0/pwm0/period # 设置占空比为50%(5000000纳秒) echo 5000000 > /sys/class/pwm/pwmchip0/pwm0/duty_cycle # 启用PWM输出 echo 1 > /sys/class/pwm/pwmchip0/pwm0/enable
4. 验证输出
用示波器检测PA6引脚波形,或串联电阻接LED到GND观察亮度变化,确认PWM输出正常。
WiringOP方案处理
WiringOP的硬件PWM引脚映射未更新至PA6,可选择两种方式:
1. 使用软件PWM
执行以下命令启用软PWM:
# 初始化WiringOP并查看引脚映射 gpio readall # 设置PA6对应WiringOP引脚(编号为6)为PWM模式 gpio mode 6 pwm # 创建软PWM通道,范围0-100 softPwmCreate 6 0 100 # 设置50%占空比 softPwmWrite 6 50
2. 修正WiringOP硬件PWM配置(可选)
修改WiringOP的orangepi_one.c引脚定义文件,将PA6标记为硬件PWM通道,重新编译安装WiringOP,但此方法复杂度较高,推荐优先使用软PWM或DTBO方案。
内容的提问来源于stack exchange,提问作者Mathias Nichele
相关产品推荐
相关产品推荐

