2017-09-04 150 views
0

我正在嘗試爲Zynq PS insmod一個pwm三重定時器計數器(TTC)驅動程序。 dmesg的日誌是:在Linux驅動程序中的PWM insmod

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(錯誤-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; 
} 
+0

整個驅動程序的鏈接:https://github.com/XiphosSystemsCorp/cadence-ttc-pwm/blob/master/src/kernel/pwm-cadence.c – gPats

+0

通常在內核命令行中添加* initcall_debug *看更多的細節。 – 0andriy

回答

0

那麼,代碼看起來不錯。這意味着添加PWM芯片不會失敗 - 所有需要的字段都被設置,並且它們都很好。

但是,EINVAL仍然可以按照唯一剩餘的原因返回,也就是說,因爲在內核構建配置中禁用了對PWM(CONFIG_PWM)的支持。這是從使用條件編譯的include/linux/pwm.h文件開始的。因此,如果CONFIG_PWM選項已啓用,則存在適當的符號。而且,當你建立你的驅動程序時,將使用this函數原型。但是,如果內核是在沒有PWM支持的情況下構建的,那麼在驅動程序編譯期間將使用inline function,這是一個簡單的存根,在任何情況下都會返回EINVAL

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

+0

感謝insmod成功。出於好奇,將PWM輸出插入CRO。 PWM信號似乎是以正弦波調製的。這是正常的嗎? – gPats