2017-09-04 4 views
0

私はZynq PS用のPWMトリプルタイマーカウンタ(TTC)ドライバをinsmodしようとしています。 dmesgのログは次のとおりです。?構造体cpwm->チップ内の特定のフィールドが初期化されていないされている場合EINVAL(エラー-22)関数はLinuxドライバinsmodのPWM

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) 

発生しましたか 私はこのフィールドでは初心者です。だから、どんなヒントもありがとう。

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チップの追加が失敗してはならないことを意味します。必要なフィールドはすべて設定され、正常です。

しかし、カーネルビルド設定でPWM(CONFIG_PWM)のサポートが無効になっているため、残りの唯一の理由として、EINVALが返されます。これは、条件付きコンパイルが使用されるinclude/linux/pwm.hファイルに従います。したがって、CONFIG_PWMオプションが有効になっている場合は、適切なシンボルが存在します。また、ドライバーをビルドするときには、this関数プロトタイプがヘッダーから使用されます。しかし、PWMをサポートせずにカーネルを構築した場合は、ドライバのコンパイル時にinline functionが使用されます。これはいずれの場合もEINVALを返す単純なスタブです。

すべての場合、ビルド設定を正しく確認する必要があります。

+0

ありがとうinsmodは成功しました。好奇心のために、PWM出力をCROに接続しました。 PWM信号は正弦波で変調されているように見えました。これは正常ですか? – gPats

関連する問題