记录: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
### RK3588 PWM 寄存器配置与控制方法 RK3588 芯片内置了4组PWM,每组具有4个通道,总共可提供16路PWM波形输出。各组PWM的起始地址分别为: - **PWM0**: `0xfd8b0000` - **PWM1**: `0xfebd0000` - **PWM2**: `0xfebe0000` - **PWM3**: `0xfebf0000` 每一组PWM占用64KB (即`0x1000`) 的地址空间[^1]。 #### 配置PWM寄存器的方法 为了配置和控制这些PWM模块,在设备树源文件(DTS)中定义相应的节点是非常重要的。对于PWM1而言,其基本配置如下所示: ```dts &pwm1 { status = "okay"; compatible = "rockchip,rk3588-pwm"; }; ``` 上述代码片段表明启用了PWM1并指定了兼容属性为特定于RK3588型号的PWM控制器[^5]。 当涉及到具体的操作时,比如改变PWM信号的工作模式(捕获、连续或单次触发),或是调整占空比来影响连接至该PWM端口上的硬件行为(如屏幕背光强度),则需调用内核提供的API函数完成相应功能。例如,要修改PWM输出状态以适应新的亮度需求,则会先利用`compute_duty_cycle()`依据当前设定值计算所需的有效电平持续时间,再借助`pwm_apply_state()`把新参数应用到实际硬件上从而达到预期效果[^2]。 针对更底层的直接访问方式,如果开发者希望通过编程手段读取或写入某些特定寄存器来进行更加精细的调控,那么就需要了解各个PWM单元内部的具体寄存器布局及其作用。然而这部分细节通常由SoC制造商在其官方技术手册中有详尽描述,并且一般情况下推荐使用操作系统所提供的标准接口而非自行处理低级I/O操作。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

飘忽不定的bug

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值