2015-05-03 12 views
1

Я установил новое изображение Ubuntu (14.04.2 LTS) на моей плате BeagleBone Black. Я обнаружил, что менеджер мыса больше не поддерживается, поэтомуBBB: как включить устройства Encoder и PWM на linux 3.14

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 мне просто нужно изменить этот блок кода:

[email protected] { 
     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>; 

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

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

что-то вроде

[email protected] { 
     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>; 

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

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

Правильно?

Я не мог найти готовой версии. Было бы здорово, если бы кто-то уже исправил и может поделиться ею.

ответ

1

В ядре v3.14 вы можете включить PWM, установив статус «okay» для epwmssx, ecapx, & ehrpwmx, под am33xx.dtsi в проекте dtb-rebuilder от Robert C Nelson. Это, однако, позволит включить подсистему, а не мультиплексировать контакты или включить регистры PWMXTBCLK.

Мукс штырьков для PWM, используйте «конфиг-контактный» из проекта Универсального IO по cdsteinkuehler на GitHub

Чтобы включить регистры PWMXTBCLK, вам нужно написать простой модуль ядра. (Я не знаю, как это сделать в дереве устройств пока)

Edit: Обновление устаревших ссылок: В модуле ядра вам нужно записать в следующем регистре: 0x44E10664 Этот регистр также известен имя, как CONTROL_MODULE.pwmss_ctrl

Как найти на странице 796 SPRUH73H-октябрь 2011-Revised апреля 2013 издание AM335X Technical Reference Manual, написание 0х01 позволяет Pwm подсистему 1, 0x02 для подсистемы 2, 0x04 для подсистемы 3, и любой комбинация из трех (например, 0x07 разрешает все из них: 0x01 | 0x02 | 0x04 = 0x07).

+0

Благодарим за ответ. Я попробую. P.S. Чем больше я читаю об устройствах в Linux, тем больше я думаю, что прямое письмо в регистры системы намного проще (и лучше). –

1

Я использовал ядро ​​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: [email protected] { 
     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: [email protected] { 
      compatible = "ti,am33xx-ecap"; 
      #pwm-cells = <3>; 
      reg = <0x48300100 0x80>; 
      interrupts = <31>; 
      interrupt-names = "ecap0"; 
      ti,hwmods = "ecap0"; 
      status = "disabled"; 
     }; 

     eqep0: [email protected] { 
      /* 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: [email protected] { 
      compatible = "ti,am33xx-ehrpwm"; 
      #pwm-cells = <3>; 
      reg = <0x48300200 0x80>; 
      ti,hwmods = "ehrpwm0"; 
      status = "disabled"; 
     }; 
    }; 

    epwmss1: [email protected] { 
     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: [email protected] { 
      compatible = "ti,am33xx-ecap"; 
      #pwm-cells = <3>; 
      reg = <0x48302100 0x80>; 
      interrupts = <47>; 
      interrupt-names = "ecap1"; 
      ti,hwmods = "ecap1"; 
      status = "disabled"; 
     }; 

     eqep1: [email protected] { 
      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: [email protected] { 
      pinctrl-names = "default"; 
      pinctrl-0 = <&pinctrl_ehrpwm1>; 
      compatible = "ti,am33xx-ehrpwm"; 
      #pwm-cells = <3>; 
      reg = <0x48302200 0x80>; 
      ti,hwmods = "ehrpwm1"; 
      status = "okay"; 
     }; 
    }; 

    epwmss2: [email protected] { 
     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: [email protected] { 
      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: [email protected] { 
      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: [email protected] { 
      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 и копируется в ВВВ.После этого я загрузил модуль ядра eqep от https://github.com/Teknoman117/beaglebot/tree/master/encoders , и он отлично работает.