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

没人{:4_172:}

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

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

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

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

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

问题报错在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不会被加入