【问题标题】:rpi - pwm_get() - how to use static lookup tables or device-treerpi - pwm_get() - 如何使用静态查找表或设备树
【发布时间】:2019-10-02 22:23:50
【问题描述】:

我有一个 Raspberry Pi 3B,在 pwmchip0 (pwm0/pwm1) 上有两个电机。 我通过sysfs成功控制了pwm-chip,但现在我想把它放在一个内核模块中。

我看到<linux/pwm.h> 并想使用pwm_get()pwm_put()pwm_config()。 我找到了this post,还研究了 LXR 上的示例,但对我没有太大帮助。一般来说,我对设备树和内核编程非常陌生。 我未能请求 pwm_device (ERR=1),但我无法找出问题所在。

  • 我必须为 consumer_id 指定什么?
  • 我什至必须修改设备树或添加静态查找表吗?
    • 如果是这样怎么办?

我已经创建了一个设备树覆盖,但是没有工作:/

/dts-v1/;
/include/ "bcm283x.dtsi"
/ {
        compatible = "brcm,bcm2708";
        motor-left-pwm {
                compatible = "motor-left";
                pwms = <&pwm 0 1000000 0>;
                pinctrl-names = "default";
        };
};

我尝试添加一个静态查找表:

static struct pwm_lookup crc_pwm_lookup[] = {
    PWM_LOOKUP("pwmchip0", 0, "0000:00:02.0", "pwm_left", 0>
    PWM_LOOKUP("pwmchip0", 1, "0000:00:02.0", "pwm_right", >
};

pwm_add_table(crc_pwm_lookup, ARRAY_SIZE(crc_pwm_lookup));

但结果是这样的:

WARNING: "pwm_add_table" [/home/josh/drivers/motor/motor.ko] undefined!

insmod: ERROR: could not insert module /motor.ko: Unknown symbol in module

我在某处读到这意味着我无法调用此函数:/

【问题讨论】:

  • 静态表仅用于特定用途。您必须在 DT 中定义您的设备,您将在其中放置对 pwm 控制器的引用(就 DT 而言的phandle)。查看内核中现有的驱动程序。
  • 好的,谢谢!我希望我以后不需要它们:D

标签: linux-kernel raspberry-pi linux-device-driver kernel-module


【解决方案1】:

是的!昨天晚上我想通了!

我想我根本不了解设备树和覆盖。 但我在 pwm-2chan.dts 的帮助下解决了这个问题:

/dts-v1/;
/plugin/;
/ {
        fragment@0 {
                target = <&soc>;
                __overlay__ {
                motorpwm {
                        compatible = "motor";
                        pwms = <&pwm 0 1000000>;
                        pinctrl-names = "default";
                        pinctrl-0 = <&pwm0_gpio18>;
                };
                };
        };

        fragment@1 {
                target = <&pwm>;
                frag1: __overlay__ {
                        status = "okay";
                };
        };
};

然后你的驱动程序将被探测:

static int my_probe(struct platform_device *pdev)
{
    printk("Probed");
    printk("Requesting PWM");
    pwm_left = pwm_get(&pdev->dev, NULL);
    if (IS_ERR(pwm_left)){
        printk("Requesting PWM failed %d", ERR_CAST(pwm_left));
        return -EIO;
    }
    printk("Requested PWM");
    return 0;
}

static int my_remove(struct platform_device *dev)
{
    printk("Removed");
    return 0;
}


static struct of_device_id my_match_table[] = {
     {
             .compatible = "motor",
     },
     {},
};
MODULE_DEVICE_TABLE(of, my_match_table);

static struct platform_driver my_platform_driver = {
    .probe = my_probe,
    .remove = my_remove,
    .driver = {
        .name = "motor",
        .owner = THIS_MODULE,
        .of_match_table = of_match_ptr(my_match_table),
    },
};

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-11-21
    相关资源
    最近更新 更多