2017-09-04 1 views
0

나는 Zynq PS 용 PWM 타이머 (triple timer counter) 드라이버를 insmod하려고한다. 메시지는 dmesg 로그이다 구조체 cpwm- 특정 필드> 칩은 초기화되지 않은 경우 리눅스 드라이버 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) 

는 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 칩 추가가 실패하지 않아야 함을 의미합니다. 필요한 모든 필드가 설정되고 정상입니다.

그러나 커널 빌드 구성에서 PWM (CONFIG_PWM)에 대한 지원이 비활성화 되었기 때문에 EINVAL은 여전히 ​​유일한 이유로 반환 될 수 있습니다. 이것은 조건부 컴파일이 사용되는 include/linux/pwm.h 파일에서 따릅니다. 따라서 CONFIG_PWM 옵션을 사용하도록 설정 한 경우 적절한 기호가 존재합니다. 그리고 드라이버를 만들 때 this 함수 프로토 타입이 헤더에서 사용될 것입니다. 그러나 PWM을 지원하지 않고 커널을 빌드 한 경우 드라이버 컴파일 중에 inline function이 사용됩니다. 이는 어떤 경우 든 EINVAL을 반환하는 간단한 스텁입니다.

전체적으로 빌드 구성을 올바르게 확인해야합니다.

+0

감사합니다. insmod가 성공했습니다. 호기심에서 벗어나 PWM 출력을 CRO에 연결했습니다. PWM 신호는 사인파에서 변조 된 것처럼 보였다. 이게 정상인가? – gPats

관련 문제