BBB: как да включите Encoder и PWM устройства на linux 3.14

Инсталирах ново изображение на Ubuntu (14.04.2 LTS) на моята дъска BeagleBone Black. Открих, че Cape Manager вече не се поддържа, така че

echo bone_eqep2b > /sys/devices/bone_capemgr.*/slots

не работи. Доколкото разбрах, за да заредя наслагване на дървото на устройството, имам нужда от следното:

  1. инсталирайте RSCM
  2. поправете am335x-boneblack.dts файл
  3. стартирайте build.sh
  4. рестартирайте платката

Така че, аз се съмнявам за точка 2. Как да обедините bone_eqep2b.dts и am335x-boneblack.dts правилно?

Предполагам, че за да активирам eqep2b, просто трябва да променя този блок от код:

epwmss@48304000 {
        compatible = "ti,am33xx-pwmss";
        reg = <0x48304000 0x10>;
        ti,hwmods = "epwmss2";
        #address-cells = <0x1>;
        #size-cells = <0x1>;
        status = "disabled";
        ranges = <0x48304100 0x48304100 0x80 0x48304180 0x48304180 0x80 0x48304200 0x4
8304200 0x80>;

        ecap@48304100 {
                compatible = "ti,am33xx-ecap";
                #pwm-cells = <0x3>;
                reg = <0x48304100 0x80>;
                ti,hwmods = "ecap2";
                status = "disabled";
        };

        ehrpwm@48304200 {
                compatible = "ti,am33xx-ehrpwm";
                #pwm-cells = <0x3>;
                reg = <0x48304200 0x80>;
                ti,hwmods = "ehrpwm2";
                status = "disabled";
        };
};

от нещо подобно

epwmss@48304000 {
        compatible = "ti,am33xx-pwmss";
        reg = <0x48304000 0x10>;
        ti,hwmods = "epwmss2";
        #address-cells = <0x1>;
        #size-cells = <0x1>;
        status = "okay";

        count_mode = <0>;  /* 0 - Quadrature mode, normal 90 phase offset cha & chb.  1 - Direction mode.  cha input = clock, chb input = direction */
        swap_inputs = <0>; /* Are channel A and channel B swapped? (0 - no, 1 - yes) */
        invert_qa = <1>;   /* Should we invert the channel A input?  */
        invert_qb = <1>;   /* Should we invert the channel B input? I invert these because my encoder outputs drive transistors that pull down the pins */
        invert_qi = <0>;   /* Should we invert the index input? */
        invert_qs = <0>;   /* Should we invert the strobe input? */

        status = "okay";


        ranges = <0x48304100 0x48304100 0x80 0x48304180 0x48304180 0x80 0x48304200 0x4
8304200 0x80>;

        ecap@48304100 {
                compatible = "ti,am33xx-ecap";
                #pwm-cells = <0x3>;
                reg = <0x48304100 0x80>;
                ti,hwmods = "ecap2";
                status = "okay";
        };

        ehrpwm@48304200 {
                compatible = "ti,am33xx-ehrpwm";
                #pwm-cells = <0x3>;
                reg = <0x48304200 0x80>;
                ti,hwmods = "ehrpwm2";
                status = "okay";
        };
};

Правилно?

Не можах да намеря готова версия, би било чудесно, ако някой вече е поправил и може да го сподели.


person Maksim Surov    schedule 03.05.2015    source източник


Отговори (2)


Използвах ядро ​​3.18 и за да мога да използвам модулите eqep, ги добавих към моя файл am335x-bone-common-pinmux.dtsi, за да настроя правилно pinmux.

...
/* eHRPWM0 module */
pinctrl_ehrpwm0: pinctrl_ehrpwm0 {
    pinctrl-single,pins = <
        0x150 0x23  /* P9_22 = GPIO0_2 = eHRPWM0A, MODE3 */
        0x190 0x21  /* P9_31 = GPIO3_14 = eHRPWM0A, MODE1 */
        0x154 0x23  /* P9_21 = GPIO0_3 = eHRPWM0B, MODE3 */
        /*0x0a4 0x23     This is not OK P8_46 = GPIO2_7 = eHRPWM0B, MODE3 */
    >;
};

/* eCAP0 module ?????*/
pinctrl_ecap0: pinctrl_ecap0 {
    pinctrl-single,pins = <
        0x164 0x20  /* P9_42A (?) = GPIO0_7 = eCAP0, MODE0 */
    >;
};

/* eQEP0 module */
pinctrl_eqep0: pinctrl_eqep0 {
    pinctrl-single,pins = <
        0x1a8 0x21  /* P9_41B = GPIO3_20 = eQEP0_index, MODE1 */
        0x1ac 0x21  /* P9_25 = GPIO3_21 = eQEP0_strobe, MODE1 */
        0x1a4 0x31  /* P9_27 = GPIO3_19 = eQEP0B_in, MODE1 */
        0x1a0 0x31  /* P9_42B = GPIO3_18 = eQEP0A_in, MODE1 */
    >;
};


/* eHRPWM1 module */
pinctrl_ehrpwm1: pinctrl_ehrpwm1 {
    pinctrl-single,pins = <
        0x048 0x26  /* P9_14 = GPIO1_18 = eHRPWM1A, MODE6 */
        0x0c8 0x22  /* P8_36 = GPIO2_16 = eHRPWM1A, MODE2 */
        0x04c 0x26  /* P9_16 = GPIO1_19 = eHRPWM1B, MODE6 */
        0x0cc 0x22  /* P8_34 = GPIO2_17 = eHRPWM1B, MODE2 */
    >;
};

/* eQEP1 module */
pinctrl_eqep1: pinctrl_eqep1 {
    pinctrl-single,pins = <
        /*0x0d8 0x22     P8_31 = GPIO0_10 = eQEP1_index, MODE2, USED FOR PHOTOCELLS */
        /*0x0dc 0x22     P8_32 = GPIO0_11 = eQEP1_strobe, MODE2 USED FOR PHOTOCELLS */
        0x0d4 0x32  /* P8_33 = GPIO0_09 = eQEP1B_in, MODE2 */
        0x0d0 0x32  /* P8_35 = GPIO0_08 = eQEP1A_in, MODE2 */
    >;
};


/* eHRPWM2 module */
pinctrl_ehrpwm2: pinctrl_ehrpwm2 {
    pinctrl-single,pins = <
        0x020 0x24  /* P8_19 = GPIO0_22 = eHRPWM2A, MODE4*/
        0x0a0 0x23  /* P8_45 = GPIO2_6 = eHRPWM2A, MODE3 */
        0x024 0x24  /* P8_13 = GPIO0_23 = eHRPWM2B, MODE4 */
        0x0a4 0x23  /* P8_46 = GPIO2_7 = eHRPWM2B, MODE3 */
    >;
};

/* eCAP2 module */
pinctrl_ecap2: pinctrl_ecap2 {
    pinctrl-single,pins = <
        0x19c 0x24  /* P9_28 = GPIO3_17 = eCAP2, MODE4 */
    >;
};

/* eQEP2 module */
pinctrl_eqep2: pinctrl_eqep2 {
    pinctrl-single,pins = <
        0x038 0x0F  /* P8_16 = GPIO1_14 = eQEP2_index, MODE4 --- STOLEN FOR MOTOR DIRECTION, ORIGINAL HEX value was 0x24*/
        0x03c 0x0F  /* P8_15 = GPIO1_15 = eQEP2_strobe, MODE4 --- STOLEN FOR MOTOR DIRECTION, ORIGINAL HEX value was 0x24*/
        0x034 0x34  /* P8_11 = GPIO1_13 = eQEP2B_in, MODE4 */
        0x030 0x34  /* P8_12 = GPIO1_12 = eQEP2A_in, MODE4 */
    >;
};
...

след това също в am33x.dtsi:

    epwmss0: epwmss@48300000 {
        compatible = "ti,am33xx-pwmss";
        reg = <0x48300000 0x10>;
        ti,hwmods = "epwmss0";
        #address-cells = <1>;
        #size-cells = <1>;
        status = "disabled";
        ranges = <0x48300100 0x48300100 0x80   /* ECAP */
              0x48300180 0x48300180 0x80   /* EQEP */
              0x48300200 0x48300200 0x80>; /* EHRPWM */

        ecap0: ecap@48300100 {
            compatible = "ti,am33xx-ecap";
            #pwm-cells = <3>;
            reg = <0x48300100 0x80>;
            interrupts = <31>;
            interrupt-names = "ecap0";
            ti,hwmods = "ecap0";
            status = "disabled";
        };

        eqep0: eqep@48300180 {
            /* pinctrl-names = "default";
            pinctrl-0 = <&pinctrl_eqep0>;*/
            compatible = "ti,am33xx-eqep";
            reg = <0x48300180 0x80>;
            ti,hwmods = "eqep0";
            interrupt-parent = <&intc>;
            interrupts = <79>;
            status = "disabled";
        };


        ehrpwm0: ehrpwm@48300200 {
            compatible = "ti,am33xx-ehrpwm";
            #pwm-cells = <3>;
            reg = <0x48300200 0x80>;
            ti,hwmods = "ehrpwm0";
            status = "disabled";
        };
    };

    epwmss1: epwmss@48302000 {
        compatible = "ti,am33xx-pwmss";
        reg = <0x48302000 0x10>;
        ti,hwmods = "epwmss1";
        #address-cells = <1>;
        #size-cells = <1>;
        status = "okay";
        ranges = <0x48302100 0x48302100 0x80   /* ECAP */
              0x48302180 0x48302180 0x80   /* EQEP */
              0x48302200 0x48302200 0x80>; /* EHRPWM */

        ecap1: ecap@48302100 {
            compatible = "ti,am33xx-ecap";
            #pwm-cells = <3>;
            reg = <0x48302100 0x80>;
            interrupts = <47>;
            interrupt-names = "ecap1";
            ti,hwmods = "ecap1";
            status = "disabled";
        };

        eqep1: eqep@48302180 {
            pinctrl-names = "default";
            pinctrl-0 = <&pinctrl_eqep1>;
            compatible = "ti,am33xx-eqep";
            reg = <0x48302180 0x80>;
            ti,hwmods = "eqep1";
            interrupt-parent = <&intc>;
            interrupts = <88>;
            status = "okay";
        };


        ehrpwm1: ehrpwm@48302200 {
            pinctrl-names = "default";
            pinctrl-0 = <&pinctrl_ehrpwm1>;
            compatible = "ti,am33xx-ehrpwm";
            #pwm-cells = <3>;
            reg = <0x48302200 0x80>;
            ti,hwmods = "ehrpwm1";
            status = "okay";
        };
    };

    epwmss2: epwmss@48304000 {
        compatible = "ti,am33xx-pwmss";
        reg = <0x48304000 0x10>;
        ti,hwmods = "epwmss2";
        #address-cells = <1>;
        #size-cells = <1>;
        status = "okay";
        ranges = <0x48304100 0x48304100 0x80   /* ECAP */
              0x48304180 0x48304180 0x80   /* EQEP */
              0x48304200 0x48304200 0x80>; /* EHRPWM */

        ecap2: ecap@48304100 {
            pinctrl-names = "default";
            pinctrl-0 = <&pinctrl_ecap2>;
            compatible = "ti,am33xx-ecap";
            #pwm-cells = <3>;
            reg = <0x48304100 0x80>;
            interrupts = <61>;
            interrupt-names = "ecap2";
            ti,hwmods = "ecap2";
            status = "okay";
        };

        eqep2: eqep@48304180 {
            pinctrl-names = "default";
            pinctrl-0 = <&pinctrl_eqep2>;
            compatible = "ti,am33xx-eqep";
            reg = <0x48304180 0x80>;
            ti,hwmods = "eqep2";
            interrupt-parent = <&intc>;
            interrupts = <89>;
            status = "okay";
        };

        ehrpwm2: ehrpwm@48304200 {
            pinctrl-names = "default";
            pinctrl-0 = <&pinctrl_ehrpwm2>;
            compatible = "ti,am33xx-ehrpwm";
            #pwm-cells = <3>;
            reg = <0x48304200 0x80>;
            ti,hwmods = "ehrpwm2";
            status = "okay";
        };
    };

Създадох отново am335x-boneblack.dtb и копирах в BBB. След това заредих модула на ядрото eqep от https://github.com/Teknoman117/beaglebot/tree/master/encoders и работи добре.

person ZeitGeist    schedule 19.11.2015

В ядрото v3.14 можете да активирате PWM, като зададете състоянието на "добре" за epwmssx, ecapx и ehrpwmx, под am33xx.dtsi в проекта dtb-rebuilder от Robert C Nelson. Това обаче ще активира само подсистемата, а не мултиплексиране на щифтовете или активиране на регистрите PWMXTBCLK.

За да комбинирате щифтовете за PWM, използвайте "config-pin" от проекта Universal IO от cdsteinkuehler в GitHub

За да активирате регистрите PWMXTBCLK, ще трябва да напишете прост модул на ядрото. (Все още не знам как да направя това в дървото на устройствата)

Редактиране: Актуализиране на остарели препратки: В модула на ядрото трябва да пишете в следния регистър: 0x44E10664 Този регистър е известен също като CONTROL_MODULE.pwmss_ctrl

Както се намира на страница 796 от изданието SPRUH73H–октомври 2011–ревизирано април 2013 на Техническото справочно ръководство на AM335X, писането на 0x01 активира pwm подсистема 1, 0x02 за подсистема 2, 0x04 за подсистема 3 и всяка комбинация от трите (например 0x07 ги активира всички: 0x01 | 0x02 | 0x04 = 0x07).

person TekuConcept    schedule 05.05.2015
comment
Благодаря за отговора. Ще опитам. P.S. Колкото повече чета за устройства в linux, толкова повече смятам, че директното писане в регистрите на системата е много по-лесен (и по-добър) подход. - person Maksim Surov; 06.05.2015