rpi - pwm_get () - как использовать статические таблицы поиска или дерево устройств - PullRequest
0 голосов
/ 15 мая 2019

У меня Raspberry Pi 3B с двумя моторами на pwmchip0 (pwm0 / pwm1).Я успешно управлял чипом pwm через sysfs, но теперь я хочу поместить его в модуль ядра.

Я видел <linux/pwm.h> и хотел бы использовать pwm_get(), pwm_put() и pwm_config().Я нашел этот пост , а также просмотрел примеры на LXR, но это не совсем помогло мне.Я очень плохо знаком с деревьями устройств и программированием ядра в целом.Я не могу запросить pwm_device (ERR = 1), но не могу выяснить проблему.

  • Что я должен указать для consumer_id?
  • Есть ли у меня вообщеизменить дерево устройств или добавить статическую таблицу поиска?
    • А если да, то как?

Я создал наложение дерева устройств, но оно не сработало: /

/dts-v1/;
/include/ "bcm283x.dtsi"
/ {
        compatible = "brcm,bcm2708";
        motor-left-pwm {
                compatible = "motor-left";
                pwms = <&pwm 0 1000000 0>;
                pinctrl-names = "default";
        };
};

Я попытался добавить статическую таблицу поиска:

static struct pwm_lookup crc_pwm_lookup[] = {
    PWM_LOOKUP("pwmchip0", 0, "0000:00:02.0", "pwm_left", 0>
    PWM_LOOKUP("pwmchip0", 1, "0000:00:02.0", "pwm_right", >
};

pwm_add_table(crc_pwm_lookup, ARRAY_SIZE(crc_pwm_lookup));

Но в итоге получилось так:

WARNING: "pwm_add_table" [/home/josh/drivers/motor/motor.ko] undefined!

insmod: ERROR: could not insert module /motor.ko: Unknown symbol in module

Я прочиталгде-то это означает, что я не могу вызвать эту функцию: /

1 Ответ

0 голосов
/ 16 мая 2019

Yesss! Вчера вечером я понял это!

Полагаю, я просто не понимал дерево устройств и наложения вообще. Но я решил это с помощью pwm-2chan.dts:

/dts-v1/;
/plugin/;
/ {
        fragment@0 {
                target = <&soc>;
                __overlay__ {
                motorpwm {
                        compatible = "motor";
                        pwms = <&pwm 0 1000000>;
                        pinctrl-names = "default";
                        pinctrl-0 = <&pwm0_gpio18>;
                };
                };
        };

        fragment@1 {
                target = <&pwm>;
                frag1: __overlay__ {
                        status = "okay";
                };
        };
};

Тогда ваш драйвер будет проверен:

static int my_probe(struct platform_device *pdev)
{
    printk("Probed");
    printk("Requesting PWM");
    pwm_left = pwm_get(&pdev->dev, NULL);
    if (IS_ERR(pwm_left)){
        printk("Requesting PWM failed %d", ERR_CAST(pwm_left));
        return -EIO;
    }
    printk("Requested PWM");
    return 0;
}

static int my_remove(struct platform_device *dev)
{
    printk("Removed");
    return 0;
}


static struct of_device_id my_match_table[] = {
     {
             .compatible = "motor",
     },
     {},
};
MODULE_DEVICE_TABLE(of, my_match_table);

static struct platform_driver my_platform_driver = {
    .probe = my_probe,
    .remove = my_remove,
    .driver = {
        .name = "motor",
        .owner = THIS_MODULE,
        .of_match_table = of_match_ptr(my_match_table),
    },
};

...