首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Linux驱动程序中的PWM

Linux驱动程序中的PWM
EN

Stack Overflow用户
提问于 2017-09-05 02:16:20
回答 1查看 358关注 0票数 0

我正在尝试为Zynq PS插入一个pwm三倍定时计数器(TTC)驱动程序。dmesg日志为:

代码语言:javascript
复制
TTC: Inside probe function
pwm-cadence f8001000.timer: PWM 0 has clock source 0 at 108333336 Hz
pwm-cadence f8001000.timer: PWM 1 has clock source 0 at 108333336 Hz
pwm-cadence f8001000.timer: PWM 2 has clock source 0 at 108333336 Hz
pwm-cadence f8001000.timer: cannot add pwm chip (error -22)

当结构cpwm->芯片中的某些字段未初始化时,是否会发生EINVAL (error -22)函数?我是这个领域的新手。因此,任何建议都将不胜感激。

代码语言:javascript
复制
static int cadence_pwm_probe(struct platform_device *pdev)
{
    struct cadence_pwm_chip *cpwm;
    struct resource *r_mem;
    int ret;
    struct device_node *node = pdev->dev.of_node;
    const __be32 *value;
    int rlen;
    char propname[24];
    int i;
    struct cadence_pwm_pwm *pwm;
    printk(KERN_DEBUG "TTC: Inside probe function\n");
    cpwm = devm_kzalloc(&pdev->dev, sizeof(*cpwm), GFP_KERNEL);
    if (!cpwm)
        return -ENOMEM;

    r_mem = platform_get_resource(pdev, IORESOURCE_MEM, 0);
    cpwm->base = devm_ioremap_resource(&pdev->dev, r_mem);
    if (IS_ERR(cpwm->base))
       return PTR_ERR(cpwm->base);

    for (i = 0; i < CPWM_NUM_PWM; i ++) {
       pwm = cpwm->pwms + i;

    snprintf(propname, sizeof(propname), "xlnx,ttc-clk%d-freq-hz", i);

    value = of_get_property(node, propname, &rlen);
    if (value)
       pwm->clk_hz = be32_to_cpup(value);
    else {
       dev_err(&pdev->dev, "missing %s property1", propname);
       return -ENODEV;
    }

    snprintf(propname, sizeof(propname), "xlnx,ttc-clk%d-clksrc", i);

    value = of_get_property(node, propname, &rlen);
    if (value)
       pwm->source = be32_to_cpup(value);
    else {
       dev_err(&pdev->dev, "missing %s property2", propname);
       return -ENODEV;
    }

    dev_info(&pdev->dev, "PWM %d has clock source %d at %d Hz", i, pwm->source, pwm->clk_hz);

}

cpwm->chip.dev = &pdev->dev;
cpwm->chip.ops = &cadence_pwm_ops;
cpwm->chip.npwm = CPWM_NUM_PWM;
cpwm->chip.base = -1;

ret = pwmchip_add(&cpwm->chip);
if (ret < 0) {
    dev_err(&pdev->dev, "cannot add pwm chip (error %d)", ret);
    return ret;
}
EN

回答 1

Stack Overflow用户

发布于 2017-09-05 16:01:15

好吧,代码看起来不错。这意味着添加PWM芯片不能失败-所有需要的字段都已设置,并且它们都很好。

然而,根据唯一剩余的原因,仍然可以返回EINVAL,即因为在内核构建配置中禁用了对脉宽调制(CONFIG_PWM)的支持。这是从使用条件编译的include/linux/pwm.h文件开始的。因此,如果启用了CONFIG_PWM选项,则存在正确的符号。而且,当你构建你的驱动程序时,this函数原型将从头文件中被使用。但是,如果内核是在没有PWM支持的情况下构建的,那么在驱动程序编译过程中将使用inline function,这是一个在任何情况下返回EINVAL的简单存根。

总而言之,你需要正确地检查你的构建配置。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/46042300

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档