rpi - pwm_get() - 如何使用静态查找表或设备树
rpi - pwm_get() - how to use static lookup tables or device-tree
我有一个 Raspberry Pi 3B,在 pwmchip0 (pwm0/pwm1) 上有两个电机。
我通过sysfs成功控制了pwm-chip,但现在我想把它放在一个内核模块中。
我看到 <linux/pwm.h>
并想使用 pwm_get()
、pwm_put()
和 pwm_config()
。
我找到了 并仔细研究了 LXR 上的示例,但它对我的帮助不大。一般来说,我对设备树和内核编程非常陌生。
我未能请求 pwm_device (ERR=1) 但我无法找出问题所在。
- 我必须为 consumer_id 指定什么?
- 我什至需要修改设备树或添加静态查找 table?
- 如果是怎么办?
我已经创建了一个设备树覆盖,但是没有用:/
/dts-v1/;
/include/ "bcm283x.dtsi"
/ {
compatible = "brcm,bcm2708";
motor-left-pwm {
compatible = "motor-left";
pwms = <&pwm 0 1000000 0>;
pinctrl-names = "default";
};
};
我尝试添加静态查找 table:
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
我在某处读到这意味着我不能调用这个函数:/
是的!昨天晚上我想通了!
我想我根本不了解设备树和叠加层。
但是我在 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),
},
};
我有一个 Raspberry Pi 3B,在 pwmchip0 (pwm0/pwm1) 上有两个电机。 我通过sysfs成功控制了pwm-chip,但现在我想把它放在一个内核模块中。
我看到 <linux/pwm.h>
并想使用 pwm_get()
、pwm_put()
和 pwm_config()
。
我找到了
- 我必须为 consumer_id 指定什么?
- 我什至需要修改设备树或添加静态查找 table?
- 如果是怎么办?
我已经创建了一个设备树覆盖,但是没有用:/
/dts-v1/;
/include/ "bcm283x.dtsi"
/ {
compatible = "brcm,bcm2708";
motor-left-pwm {
compatible = "motor-left";
pwms = <&pwm 0 1000000 0>;
pinctrl-names = "default";
};
};
我尝试添加静态查找 table:
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
我在某处读到这意味着我不能调用这个函数:/
是的!昨天晚上我想通了!
我想我根本不了解设备树和叠加层。 但是我在 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),
},
};