david11 发表于 2017-2-16 11:34:42

rk3288 PWM 申请失败

照着这个帖子http://developer.t-firefly.com/thread-10801-1-1.html
修改firefly-rk3288.dts
&pwm0 {
      interrupts = <GIC_SPI 78 IRQ_TYPE_LEVEL_HIGH>;
      status = "okay";
};

rk3288.dts 中 0-3都打开 设置okay

      pwm0: pwm@ff680000 {
                compatible = "rockchip,rk-pwm0";
                led-power = <&gpio8 GPIO_A1 GPIO_ACTIVE_LOW>;
                reg = <0xff680000 0x10>;
                #pwm-cells = <2>;
                pinctrl-names = "default";
                pinctrl-0 = <&pwm0_pin>;
                clocks = <&clk_gates11 11>;
                clock-names = "pclk_pwm";
                status = "okay";
      };
&pwm1 {
    status = "okay";
};

pwm0: pwm@ff680000 {
                compatible = "rockchip,rk-pwm0";
                led-power = <&gpio8 GPIO_A1 GPIO_ACTIVE_LOW>;
                reg = <0xff680000 0x10>;
                #pwm-cells = <2>;
                pinctrl-names = "default";
                pinctrl-0 = <&pwm0_pin>;
                clocks = <&clk_gates11 11>;
                clock-names = "pclk_pwm";
                status = "okay";
      };

      pwm1: pwm@ff680010 {
                compatible = "rockchip,rk-pwm";
                reg = <0xff680010 0x10>;
                #pwm-cells = <2>;
                pinctrl-names = "default";
                pinctrl-0 = <&pwm1_pin>;
                clocks = <&clk_gates11 11>;
                clock-names = "pclk_pwm";
                status = "okay";
      };

      pwm2: pwm@ff680020 {
                compatible = "rockchip,rk-pwm";
                reg = <0xff680020 0x10>;
                #pwm-cells = <2>;
                pinctrl-names = "default";
                pinctrl-0 = <&pwm2_pin>;
                clocks = <&clk_gates11 11>;
                clock-names = "pclk_pwm";
                status = "okay";
      };

      pwm3: pwm@ff680030 {
                compatible = "rockchip,rk-pwm";
                reg = <0xff680030 0x10>;
                #pwm-cells = <2>;
                pinctrl-names = "default";
                pinctrl-0 = <&pwm3_pin>;
                clocks = <&clk_gates11 11>;
                clock-names = "pclk_pwm";
                status = "okay";
      };

关闭rockchip_pwm_regulator

测试
#include <linux/kernel.h>
#include <linux/init.h>
#include <linux/module.h>
#include <linux/delay.h>
#include <linux/pwm.h>

static int __init base_init(void)
{
    printk("base_init\n");
    struct pwm_device * pwm0 = NULL;
    struct pwm_device * pwm1 = NULL;
    struct pwm_device * pwm2 = NULL;
    struct pwm_device * pwm3 = NULL;
    pwm0 = pwm_request(0, "pwm0");
    pwm1 = pwm_request(1, "pwm1");
    pwm2 = pwm_request(2, "pwm2");
    pwm3 = pwm_request(3, "pwm3");
    if(IS_ERR(pwm0))
      printk("pwm0 err %ld\n", PTR_ERR(pwm0));
    else
      printk("pwm0 success\n");

    if(IS_ERR(pwm1))
      printk("pwm1 err %ld\n", PTR_ERR(pwm1));
    else
      printk("pwm1 success\n");

    if(IS_ERR(pwm2))
      printk("pwm2 err %ld\n", PTR_ERR(pwm2));
    else
      printk("pwm2 success\n");

    if(IS_ERR(pwm3))
      printk("pwm3 err %ld\n", PTR_ERR(pwm3));
    else
      printk("pwm3 success\n");

    if(IS_ERR(pwm0))
    {      
      return -1;
    }
    pwm_free(pwm0);

    if(IS_ERR(pwm1))
    {      
      return -1;
    }

    pwm_free(pwm1);

    if(IS_ERR(pwm2))
    {      
      return -1;
    }

    pwm_free(pwm2);

    if(IS_ERR(pwm3))
    {      
      return -1;
    }

    pwm_free(pwm3);

    return 0;
}

static void __exit base_exit(void)
{
    printk("Exit ros base\n");
}

subsys_initcall(base_init);
module_exit(base_exit);

MODULE_AUTHOR("david");
MODULE_DESCRIPTION("ros robot base driver");
MODULE_LICENSE("GPL");

测试返回
[ 3402.495385] base_init
[ 3402.495514] pwm0 err -517
[ 3402.495566] pwm1 err -517
[ 3402.495616] pwm2 err -517
[ 3402.495662] pwm3 err -517


david11 发表于 2017-2-16 15:34:22

没人{:4_172:}

暴走的阿Sai 发表于 2017-2-17 09:27:12

可以试试跳进函数里面看看err的报错是什么原因

今夕何夕 发表于 2017-10-16 22:53:33

我也遇到这个问题了,你解决了么

今夕何夕 发表于 2017-10-23 14:46:23

暴走的阿Sai 发表于 2017-2-17 09:27
可以试试跳进函数里面看看err的报错是什么原因

-517 是Driver requests probe retry的意思,驱动程序请求探测重试,这是什么原因啊

hyf 发表于 2019-9-6 10:25:11

pinctrl-names = "default";改为pinctrl-names = "active";就可以了

hyf 发表于 2019-9-6 10:27:54

问题报错在kernel\drivers\regulator\pwm- regulator.c\ pwm_regulator_probe函数中,-- \kernel\drivers\pwm \core.c\devm_pwm_get--- pwm_get --- of_pwm_get --- of_node_to_pwmchip 中,经过测试知道,是在list的链表中没有符合的节点
设备树链表,只会把pinctrl-names 为active的加入到匹配链表中,而为 default不会被加入
页: [1]
查看完整版本: rk3288 PWM 申请失败