On Wed, May 14, 2014 at 4:59 AM, Teknoman117 <linux.robotd...@gmail.com>wrote:

> I don't believe that actually will change the I/O configuration.  For the
> pin ctrl entry to be adopted, it needs to be used by some driver.  Turns
> out there is a "pinmux helper" device.  Check out this blog post:
> http://hipstercircuits.com/enable-serialuarttty-on-beaglebone-black/.
>  More specifically, this section:
>
> fragment@2 {
>         target = <&ocp>;
>         __overlay__ {
>             test_helper: helper {
>                 compatible = "bone-pinmux-helper";
>                 pinctrl-names = "default";
>                 pinctrl-0 = <&pinctrl_uart5>;
>                 status = "okay";
>             };
>         };
>     };
>
>
> - Nathaniel
>

With cape-universal, I believe our new path is to include stuff like this
in https://github.com/cdsteinkuehler/beaglebone-universal-io. In that case,
you could simply do something like:
root@beaglebone:~# config-pin P8.16 qep
root@beaglebone:~# config-pin -q P8.16
P8_16 Mode: qep
root@beaglebone:~# cat /sys/devices/ocp.3/P8_16_pinmux.24/state
qep

However, with HDMI enabled, I'm not able to find a valid set of pins to put
together an entire eQEP. Further, the entries for an eqep don't seem to be
in cape-universal. There has been some discussion if they are necessary,
but I haven't been able to expose an eqep as of yet. I'll disable HDMI and
reboot next, but can those with experience comment on if something like
this is necessary:
https://github.com/jadonk/beaglebone-universal-io/commit/5394b3e3813913e2b05253a1f06dbdb9f09341b5

diff --git a/cape-universal-00A0.dts b/cape-universal-00A0.dts
index ad5b388..bc6c005 100755
--- a/cape-universal-00A0.dts
+++ b/cape-universal-00A0.dts
@@ -602,7 +602,7 @@
             P9_27_gpio_pd_pin: pinmux_P9_27_gpio_pd_pin {
                 pinctrl-single,pins = <0x1a4  0x27>; };     /* Mode
7, Pull-Down, RxActive */
             P9_27_qep_pin: pinmux_P9_27_qep_pin {
-                pinctrl-single,pins = <0x1a4  0x21>; };     /* Mode
1, Pull-Down, RxActive */
+                pinctrl-single,pins = <0x1a4  0x31>; };     /* Mode
1, Pull-Up, RxActive */
             P9_27_pruout_pin: pinmux_P9_27_pruout_pin {
                 pinctrl-single,pins = <0x1a4  0x25>; };     /* Mode
5, Pull-Down, RxActive */
             P9_27_pruin_pin: pinmux_P9_27_pruin_pin {
@@ -752,7 +752,7 @@
             P9_92_gpio_pd_pin: pinmux_P9_92_gpio_pd_pin {
                 pinctrl-single,pins = <0x1a0  0x27>; };     /* Mode
7, Pull-Down, RxActive */
             P9_92_qep_pin: pinmux_P9_92_qep_pin {
-                pinctrl-single,pins = <0x1a0  0x21>; };     /* Mode
1, Pull-Down, RxActive */
+                pinctrl-single,pins = <0x1a0  0x31>; };     /* Mode
1, Pull-Up, RxActive */
             P9_92_pruout_pin: pinmux_P9_92_pruout_pin {
                 pinctrl-single,pins = <0x1a0  0x25>; };     /* Mode
5, Pull-Down, RxActive */
             P9_92_pruin_pin: pinmux_P9_92_pruin_pin {
@@ -1727,4 +1727,24 @@
         };
     };

+
+    /************************/
+    /* eQEP                 */
+    /************************/
+
+    fragment@41 {
+       target = <&eqep0>;
+       __overlay__ {
+               status = "okay";
+            pinctrl-names = "default";
+            pinctrl-0 = <>;
+
+            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? */
+       };
+    };
 };



>
>
> On Tuesday, May 13, 2014 1:55:00 AM UTC-7, Strawson wrote:
>>
>> Actually, let me be more specific. I use the pinmux lines and enable the
>> PWM Subsystem as follows
>>
>> fragment@0 {
>>         target = <&am33xx_pinmux>;
>>         __overlay__ {
>>              pinctrl_eqep0: pinctrl_eqep0_pins {
>>                      pinctrl-single,pins = <
>>                         0x1A8 0x21  /* P9_41 = GPIO3_20 = EQEP0_index, MODE1 
>> */
>>                         0x1AC 0x21  /* P9_25 = GPIO3_21 = EQEP0_strobe, 
>> MODE1 */
>>                         0x1A0 0x31  /* P9_42 = GPIO3_18 = EQEP0A_in, MODE1 */
>>                         0x1A4 0x31  /* P9_27 = GPIO3_19 = EQEP0B_in, MODE1 */
>>                        >;
>>               };
>>         };
>>     };
>>
>>     fragment@1 {
>>           target = <&epwmss0>;
>>             __overlay__ {
>>                    status = "okay";
>>         };
>>     };
>>
>>
>> I am not using the following fragment passing parameters to the kernel
>> driver
>>
>> fragment@2 {
>>             target = <&eqep0>;
>>       __overlay__ {
>>             pinctrl-names = "default";
>>             pinctrl-0 = <&pinctrl_eqep0>;
>>
>>             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";
>>         };
>>     };
>>
>>
>> This is for two reasons. Firstly, I don't see how this would change the
>> behavior of the hardware if I'm setting the registers anyway. Secondly, it
>> fails to load because eqep is not a part of the
>> default am335x-boneblack.dtb located in /boot/uboot/dtbo in debian
>>
>> When trying to load this, dmesg returns
>>
>> [  523.086537] bone-capemgr bone_capemgr.9: slot #10: dtbo
>> 'bone_eqep0-00A0.dtbo' loaded; converting to live tree
>> [  523.090030] of_resolve: Could not find symbol 'eqep0'
>> [  523.095581] bone-capemgr bone_capemgr.9: slot #10: Failed to resolve
>> tree
>>
>>
>>
>> In Angstrom, this file was located in /boot/am335x-boneblack.dtb.
>> Attached is a modified version of this that was provided by TI and results
>> in the eqep dts loading correctly in angstrom. This file has since changed
>> in the Debian release and the fix no longer works. As stated in the first
>> post in this thread, it would be nice if the correct eqep entries and your
>> driver were included in the public image so that this functionality can be
>> used out of the box like pwm.
>>
>>
>> On Monday, May 12, 2014 11:53:08 PM UTC-7, Strawson wrote:
>>>
>>> Hi Nathaniel. The correct device tree fragments are loaded, pins are
>>> multiplexed correctly, and all 3 eqep channels work perfectly with your
>>> driver. The supplied mmap code from my last post also works perfectly, but
>>> only if I insmod the compiled .ko kernel module first. Strange, I know.
>>>
>>> On Monday, May 12, 2014 11:41:14 PM UTC-7, Teknoman117 wrote:
>>>>
>>>> I'll certainly take a look at this next week.  Currently in the middle
>>>> of finals and Maker Faire is this weekend.  And in all honesty, once i
>>>> figure out whats going on with the driver, its still a good idea to use the
>>>> kernel based implementation, mainly because you can take advantage of
>>>> hardware interrupts and not have to busy wait.  I know there are sleep
>>>> methods, but unless something like Xenomai is being used, you're at the
>>>> mercy of the scheduler...
>>>>
>>>> Although, just to rule it out - are you still applying a device tree
>>>> overlay?  The supplied DTS files do more than just initialize the driver,
>>>> they setup the IO configuration, as the default board config doesn't bring
>>>> out the eQEP lines.
>>>>
>>>> - Nathaniel Lewis
>>>>
>>>> On Saturday, May 10, 2014 12:25:14 AM UTC-7, Strawson wrote:
>>>>>
>>>>> I believe it is enabled. From my last post:  the PWMSS clock config
>>>>> returns
>>>>> CLKCONFIG 0x111 = 000100010001
>>>>>
>>>>> According to pg 1492 of the reference manual, PWMSS_EQEP_EN is bit 4
>>>>> in this register which appears to be true. Furthermore the interrupt
>>>>> timer register QUTMR
>>>>> is incrementing away just fine. Good idea, but no dice.
>>>>>
>>>>> For good measure I will write this bit anyway, but with |= instead of
>>>>> = since some bits are not writable and I wouldn't want to erase the enable
>>>>> bits for pwm and ecap.
>>>>>
>>>>>
>>>>> On Friday, May 9, 2014 11:33:23 PM UTC-7, James Zapico wrote:
>>>>>>
>>>>>> Strawson,
>>>>>>
>>>>>> It looks like you're not turning the PWM EQEP clock on. There should
>>>>>> be something to accomplish what this line from the kernel driver does:
>>>>>>
>>>>>>   // Enable the clock to the eQEP unit
>>>>>>   status = pwmss_submodule_state_change(pdev->dev.parent,PWMSS_EQEPCLK_EN
>>>>>> );
>>>>>>
>>>>>> I haven't tried this out, but it should be something like
>>>>>>  *(unsigned long*)(pwm_map_base[0]+PWMSS_CLKCONFIG) =PWMSS_EQEPCLK_EN
>>>>>> ;
>>>>>>
>>>>>> -
>>>>>> James
>>>>>>
>>>>>> On Friday, May 9, 2014 9:25:33 PM UTC-5, Strawson wrote:
>>>>>>>
>>>>>>> it seems my excitement was short-lived. While reading the position
>>>>>>> with the previous (and attached) code does work, it only does so when
>>>>>>> Teknoman's eqep driver is loaded. I've added writes to set up the PWMSS 
>>>>>>> and
>>>>>>> eQEP configuration registers and have confirmed by reading them back 
>>>>>>> that
>>>>>>> they are set up the same as the driver does. Any ideas on what I'm 
>>>>>>> missing?
>>>>>>>
>>>>>>> // Write the decoder control settings
>>>>>>> *(unsigned short*)(pwm_map_base[0]+EQEP_OFFSET+QDECCTL) = 0;
>>>>>>> // set maximum position to two's compliment of -1, aka UINT_MAX
>>>>>>> *(unsigned long*)(pwm_map_base[0]+EQEP_OFFSET+QPOSMAX)=-1;
>>>>>>> // Enable interrupt
>>>>>>> *(uint16_t*)(pwm_map_base[0]+EQEP_OFFSET+QEINT) = UTOF;
>>>>>>> // set unit period register
>>>>>>> *(unsigned long*)(pwm_map_base[0]+EQEP_OFFSET+QUPRD)=0x5F5E100;
>>>>>>> // enable counter in control register
>>>>>>> *(unsigned short*)(pwm_map_base[0]+EQEP_OFFSET+QEPCTL) =
>>>>>>> PHEN|IEL0|SWI|UTE|QCLM;
>>>>>>>
>>>>>>> SYSCONFIG 0xC
>>>>>>> CLKCONFIG 0x111
>>>>>>> QEPCTL0   0x9E
>>>>>>> QDECCTL0  0x0
>>>>>>> QEINT0    0x800
>>>>>>> QUPRD0    0x5F5E100
>>>>>>> QPOSMAX0  0xFFFFFFFF
>>>>>>> QEPSTS0   0xA0
>>>>>>> eqep0: -174 eqep1: 544 e^Cp2: 0
>>>>>>>
>>>>>>>
>>>>>>>  --
> For more options, visit http://beagleboard.org/discuss
> ---
> You received this message because you are subscribed to the Google Groups
> "BeagleBoard" group.
> To unsubscribe from this group and stop receiving emails from it, send an
> email to beagleboard+unsubscr...@googlegroups.com.
> For more options, visit https://groups.google.com/d/optout.
>

-- 
For more options, visit http://beagleboard.org/discuss
--- 
You received this message because you are subscribed to the Google Groups 
"BeagleBoard" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to beagleboard+unsubscr...@googlegroups.com.
For more options, visit https://groups.google.com/d/optout.

Reply via email to