记录:RK3588 PWM调试
内核dts配置
&pwm3 {pinctrl-0 = <&pwm3m1_pins>;status = "okay";
};
&pwm5 {pinctrl-names = "default";pinctrl-0 = <&pwm5m1_pins>;status = "okay";
};
&pwm7 {pinctrl-0 = <&pwm7m1_pins>;status = "okay";
};
&pwm8 {pinctrl-names = "default";pinctrl-0 = <&pwm8m1_pins>;status = "okay";
};
&pwm9 {pinctrl-names = "default";pinctrl-0 = <&pwm9m1_pins>; status = "okay";
};
&pwm10 {pinctrl-names = "default";pinctrl-0 = <&pwm10m1_pins>;status = "okay";
};
参考上面的修改后发现"/sys/class/pwm"中中只有pwm3和pwm7,内核报错"No active pinctrl state"。
分析对应代码(drivers/pwm/pwm-rockchip.c)看到读取的pinctrl状态是"active",这里没有读到所以rockchip_pwm_probe返回错误。
static int rockchip_pwm_probe(struct platform_device *pdev)
{
...省略...pc->active_state = pinctrl_lookup_state(pc->pinctrl, "active");if (IS_ERR(pc->active_state)) {dev_err(&pdev->dev, "No active pinctrl state\n");ret = PTR_ERR(pc->active_state);goto err_pclk;}
...省略...
}
pinctrl_lookup_state 函数用于在 Linux 内核中查找并返回指定名称的 pinctrl 配置状态。该函数的主要作用是根据提供的名称查找对应的 pinctrl 状态,并返回一个指向该状态的指针。如果找不到对应的名称,函数会返回一个错误指针。这里提供的名称就是pinctrl-names = “default"定义的名称,可以看到传入的名称是"active”,而dts中配置成了"default"。所以修改pinctrl-names = “active”,因为之前已经有定义所以这里删除也可以。编译重新烧写镜像后可以看到所有PWM被正常识别
PWM 驱动加载成功后,会在其下生成 pwmchipX 目录,如pwmchip0、pwmchip1 等,此处的 X 与 PWM 的控制器或通道 id 无关,仅与 PWM 设备的 probe 顺序有关。实际用到哪路PWM可以通过"ls -la"查看符号链接的源地址,通过目录中的基地址在dts中可查到对应的PWM。例如上面的"fd8b0030"对应的是pwm3
向 export 节点写入 Y,会在当前目录下产生一个 pwmY 目录,由于 Rockchip 平台每个 PWM device 只有一个 chip,Y 值只能为 0。反之,向unexport 节点写入 Y 就会删除 pwmY 目录。
- enable:写入 1 使能 PWM,写入 0 关闭 PWM;
- polarity:有 normal 或 inversed两个参数选择,对应 PWM 的极性配置 PWM_POLARITY_NORMAL/PWM_POLARITY_INVERSED;
- duty_cycle:在 normal 模式下,表示一个周期内高电平持续的时间(单位:ns),在 reversed模式下,表示一个周期中低电平持续的时 间(单位:ns);
- period:表示 PWM 波形的周期(单位:ns);
- oneshot_count:需开启 CONFIG_PWM_ROCKCHIP_ONESHOT,表示 oneshot 模式的 PWM 波形个数;
- oneshot_repeat:需开启 CONFIG_PWM_ROCKCHIP_ONESHOT 且仅 PWM v4 支持,表示oneshot 模式重复的次数,最后输出的波形个 数为 oneshot_repeat * oneshot_count;
- duty_offset:需开启 CONFIG_PWM_ROCKCHIP_ONESHOT,表示 PWM 输出波形偏移的时间(单位:ns);
- capture:使能 capture 模式,获取输入波形高低电平的时长(单位:ns)。
Continous
cd /sys/class/pwm/pwmchip0/
echo 0 > export
cd pwm0
echo 10000 > period
echo 5000 > duty_cycle
echo normal > polarity
echo 1 > enable
Oneshot
cd /sys/class/pwm/pwmchip0/
echo 0 > export
cd pwm0
echo 10000 > period
echo 5000 > duty_cycle
echo 1000 > duty_offset
echo normal > polarity
echo 100 > oneshot_count
echo 10 > oneshot_repeat
echo 1 > enable
Capture
cd /sys/class/pwm/pwmchip0/
echo 0 > export
cd pwm0
cat capture