簡體   English   中英

Linux驅動程序insmod中的PWM

[英]PWM in Linux driver insmod

我正在嘗試為Zynq PS安裝pwm三重計時器計數器(TTC)驅動程序。 dmesg日志為:

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-> chip中的某些字段未初始化時,是否會發生EINVAL(錯誤-22)功能? 我是這個領域的新手。 因此,任何提示將不勝感激。

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;
}

好吧,代碼看起來不錯。 這意味着添加PWM芯片一定不會失敗-設置了所有必填字段,並且它們很好。

但是,仍然可以根據剩下的唯一原因返回EINVAL ,即,因為內核構建配置中已禁用了對PWM( CONFIG_PWM )的支持。 這來自使用條件編譯的include/linux/pwm.h文件。 因此,如果已啟用CONFIG_PWM選項,則存在正確的符號。 並且,當您構建驅動程序時,將從頭使用函數原型。 但是,如果內核是在沒有PWM支持的情況下構建的,則在驅動程序編譯期間將使用內聯函數 ,這是在任何情況下都返回EINVAL的簡單存根。

總而言之,您需要正確檢查構建配置。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM