> Personal plug:  I'd be happy to sell capes that don't use gpio0.  
https://kulplights.com
Heh, we've already got all the boards for this project. Maybe we'll revisit 
that design in future projects, though. 

Your software is definitely doing a *lot* more than ours, and certainly 
much more than we need- we just listen for RGB data on a UDP socket. We, 
uh… don't really treat them like lights, and instead as very large pixels 
in a screen. All the mapping/direction/orientation stuff is handled in the 
render stack, which we build custom for pretty much every project. Last one 
was a Unity App that was part of a kiosk connected to a gigantic 
chandelier. Our current project is *kinda* like an architectural scale 
video wall with a C++/OpenCV app driving the pixels.

I might give the FPP image a shot though, if building my own custom kernel 
doesn't help. Your guidance on that was *super* helpful, though your FPP 
kernel did *not* get along with our software (LEDs just didn't work- in 
lieu of diagnosing that, I just opted to compile my own, which is going on… 
right now).  Thanks a bunch!

On Tuesday, March 23, 2021 at 4:17:37 PM UTC-4 d...@kulp.com wrote:

> The debs for the kernel are at:
> https://github.com/FalconChristmas/fpp-linux-kernel/tree/master/debs
> do you should be able to update to our kernel fairly easy.    If you need 
> to start building your own kernel, I'd suggest grabbing a Beaglebone AI and 
> building on that.   It's WAY faster for kernel building.  :).    You can 
> cross-compile from a debian x86_64, but I was never able to get that to 
> actually produce proper .deb files that could be installed cleanly on the 
> BBB so I pretty much just use the AI for kernel builds.  (It's actually the 
> ONLY thing I use my AI for.)
>
> FPP provides a complete UI frontend for configuring the pixel strings and 
> such and we do allow the various 4 channel types.     It does a lot of 
> other things as well.   That said, most of these things are done on the ARM 
> side and not the PRU.  Part of trying to figure out the latency issue was 
> seeing what make sense to do on the arm side and what works best on the PRU 
> side.    If you actually wanted to try FPP and see if FPP's optimized PRU 
> code and kernel combination would work, you could use the FPP 4.6.1 image 
> on an SD card (see the release assets at github).   You would just need to 
> create a small json file in /opt/fpp/capes/bbb/strings to describe the 
> pinout of your cape (use any of them in that directory as a starting point) 
> and it should then "just work".  You would need to configure e1.31/artnet 
> input universes on the Channel Input tab, put FPP in "bridge" mode, and 
> then it should work like a normal light controller and accept pixel data.  
>  (Or use DDP protocol which doesn't require configuring the input)
>
> Personal plug:  I'd be happy to sell capes that don't use gpio0.  
> https://kulplights.com [image: Screen Shot 2021-03-23 at 4.01.22 PM.png]
>
>
>
> On Tuesday, March 23, 2021 at 3:49:47 PM UTC-4 Remy Porter wrote:
>
>> That is *super* helpful. Thanks a bunch. The pinlayout we're using on our 
>> boards uses a lot of GPIO0 already, so it's definitely too late to change 
>> on this. The way we're banging things out, all the GPIOs are being hit at 
>> the same time, so the latency does appear to hit our strings. I'll try 
>> giving your kernel a shot, though- that'll definitely help. And maybe I'll 
>> move the GPIO0 bits over to the other PRU. I hate to have to do that, but 
>> if it's what needs done, it's what needs done.
>>
>> Also, off topic, but poking at FPP: SK6182s support the WS281x protocol, 
>> so you mostly already support them, but if you poke around at 
>> ThrowingBagels approach a little, it's not a big push to get 32-bit support 
>> for RGBW LEDs (we use a lot of SK6182s with the warm-white LED, and it 
>> looks *great*). We've been running a custom hack of LEDScape for *ages* 
>> so ThrowingBagels is sorta a consolidation of the features we use, stripped 
>> down to the bare minimum.
>>
>> On Tuesday, March 23, 2021 at 3:17:25 PM UTC-4 d...@kulp.com wrote:
>>
>>> Wow... You should have contact us before doing a lot of that.   I 
>>> completely re-wrote most of the LEDScape code over the last couple years to 
>>> completely optimize things in attempts to reduce some of the timing 
>>> issues.   Porting to clpru and rproc was already part of that.   All my 
>>> updates are in FPP ( https://github.com/FalconChristmas/fpp ).
>>>
>>> Anyway, to answer your question, the issue is specific to GPIO0.  
>>>  GPIO1-3 is not affected by the massive latency issues.   Thus, the best 
>>> option is to chose GPIO pins on GPIO1-3 and not use the GPIO0 pins.   That 
>>> wasn't an option for me as we needed to output 48 strings.   In the FPP 
>>> code, if nothing is using the second PRU (the second PRU could be used for 
>>> DMX or pixelnet output), we divide the work and have one pru do the GPIO1-3 
>>> and the other do the GPIO0.    If something IS using the other PRU, and the 
>>> strings are short enough, then we split it on the one pru and do GPIO1-3 
>>> first, then do the GPIO0's.   For the most part, that keeps the GPIO0 
>>> problems from affecting all the strings so the random flashes would really 
>>> just be on the GPIO0 strings.   In the case where the second PRU is used 
>>> for something else AND the strings are longer, then we do have to do all 4 
>>> GPIO's at once and all of them can be affected so it's definitely not a 
>>> perfect solution.   
>>>
>>> To minimize the issues (but not entirely eliminate) I do now build a 
>>> custom 4.19 kernel that disables most of the devices on the L4_WAKEUP 
>>> interconnect.  Any power management and frequency scaling stuff causes huge 
>>> issues with GPIO0 latencies so those are the most important things to 
>>> disable.     I think my notes are at:
>>>
>>>
>>> https://github.com/FalconChristmas/fpp-linux-kernel/tree/master/bbb-kernel
>>>
>>> Not sure if that helps enough for you.  Feel free to ask more 
>>> questions.  :)
>>> Dan
>>>
>>>
>>>
>>>
>>>
>>> On Tuesday, March 23, 2021 at 1:45:51 PM UTC-4 Remy Porter wrote:
>>>
>>>> For those that may remember the old LEDScape library, I've been working 
>>>> on an updated version of that library, which focuses on strips instead of 
>>>> matrices, uses rproc instead of UIO PRUSS, and updates the PRU assembly to 
>>>> clpru from pasm. 
>>>>
>>>> Link: https://github.com/iontank/ThrowingBagels
>>>>
>>>> The key thing you need to know is that we hook up 32 addressable LED 
>>>> strips and then use the PRU to bitbang out RGB(W) data. We use the PRU 
>>>> because our timings need to be pretty precise- a few hundred nanoseconds 
>>>> for each key phase of the operation. 
>>>>
>>>> Here's the important issue: we need to address all 32 GPIO pins from 
>>>> the PRU, but not all of them are bound to the r30 register. So we need to 
>>>> go through the OCP port. This is exactly how LEDScape worked, and 
>>>> continues 
>>>> to work, just fine. We've never been able to get LEDScape working under 
>>>> 4.x 
>>>> kernels, mostly because of UIO problems (which is what kicked off this 
>>>> whole "move to rproc" thing).
>>>>
>>>> My upgrade, ThrowingBagels, uses basically the same core logic on the 
>>>> PRU, just ported to clpru assembly and running on a 4.19 kernel. And 
>>>> seemingly randomly, the timings hitch which causes the LEDs to flicker to 
>>>> the wrong color. Phases of our bitbang operation will sometimes take 
>>>> almost 
>>>> twice as long as they should- a sleep that should have been 600ns ends up 
>>>> taking 1100ns. The only operation happening that doesn't have guaranteed 
>>>> timings is writing to the GPIO pins via OCP, everything else we do happens 
>>>> entirely in PRU DRAM. Since this appears to happen randomly, the hitch 
>>>> *must* be coming from that OCP step, I assume.
>>>>
>>>> In support of that hypothesis, if I upgrade from the kernel that ships 
>>>> with the "AM3358 Debian 10.3 2020-04-06 4GB eMMC IoT Flasher 
>>>> <https://debian.beagleboard.org/images/bone-eMMC-flasher-debian-10.3-iot-armhf-2020-04-06-4gb.img.xz>"
>>>>  
>>>> image to the most recent 4.19 kernel, the problem becomes a lot more 
>>>> infrequent. We're blasting this data out at 30fps, like video, and when 
>>>> cut 
>>>> down on the number of services running and update the kernel, I can get 
>>>> the 
>>>> glitches down from happening every few seconds, to happening every few 
>>>> tens 
>>>> of seconds.
>>>>
>>>> My suspicion, and I can't quite prove anything, is that on 4.19 there's 
>>>> something about the kernel or configuration that sometimes adds latency to 
>>>> OCP writes, which wasn't there on 3.16. So my key question is: how do I 
>>>> improve the timing consistency when the PRU uses OCP to write to DDR RAM? 
>>>> I 
>>>> understand that it will never have *guaranteed* timing, but sometimes 
>>>> it's hitting me with latencies of up to 500ns. Anything I can do to 
>>>> minimize that latency would be a huge help.
>>>>
>>>> TL;DR: how can I make PRU->OCP->GPIO more consistent in its timing 
>>>> under a 4.19 kernel?
>>>>
>>>

-- 
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.
To view this discussion on the web visit 
https://groups.google.com/d/msgid/beagleboard/bb06fb70-6349-4624-a321-d6539b5036dbn%40googlegroups.com.

Reply via email to