Skip to content

ESP32 support using the RMT peripheral device #522

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 30 commits into from
May 8, 2018

Conversation

samguyer
Copy link
Contributor

@samguyer samguyer commented Nov 15, 2017

Developed together by Thomas Basler (@tbnobody) and myself based on ideas and code from a bunch of other people. Standing on the shoulders of giants!

Note that the clockless_block implementation is not done -- it's just a copy of the ESP8266 code.

samguyer added 12 commits August 5, 2017 13:27
Credit to Rina Shkrabova for the first cut.
I think there was actually an error in the interrupt enabling/disabling, but I also cleaned it up so that it is more clear how interrupts are handled.
Not fully portable yet, though. The timing numbers are hard-wired for WS2812, and the RMT channel is also hard-wired.
Timing is now computed from T1, T2, amd T3 instead of being hard-wired.
The RMT signal is sent in 10-pixel chunks, using double-buffering to hide the latency when possible. Also: assign RMT channels sequentially.
We were not doing the conversion from ESP32 cycles to RMT cycles correctly. Now it all works!
@samguyer
Copy link
Contributor Author

I'm not sure what the best strategy is for resolving the conflicts. I think that we should just overwrite the old files completely.

@tbnobody
Copy link

Just as a hint: @tbnobody == Thomas Basler, not Martin Falatic :)

@samguyer
Copy link
Contributor Author

Oops! Sorry about that! All these secret names make it hard to give the right people credit.

@samguyer
Copy link
Contributor Author

@tbnobody I guess the "tb" is a good hint. ;-)

samguyer and others added 14 commits December 5, 2017 07:30
On ESP platforms the dev kit provides the function __cxa_pure_virtual, so there is no need to define it.
for chipsets that need it (for example TM1829)
Suggested by @h3ndrik : allocated the interrupt once at the initialization and then just turn it on and off. This is the strategy that the ESP32 core uses also.
Two major changes to the RMT driver. First, I realized that we can have only one interrupt handler attached to the RMT peripheral, so it needs to be able to handle all of the attached strips. To accomplish this, I store each ClocklessController in an array indexed by its RMT channel. The interrupt handler can then take the channel that triggered it and index into the array to get the right controller.

The second major change is that I replaced all of the explicit bit twiddling of the RMT configurartion with calls to the proper functions in ESP32 core. That should make the code more stable if the core changes.
Since the interrupt handler is global for all channels, we need to store not just the controller, but also the buffer refill function for each strip.
This version of DemoReel100 spins off a separate task on core 0 that just performs the FastLED.show() operations. Regular code running on core 1 (the default for Arduino) signals this task to request a show().
Replaced a 500ms delay in the show task with MAX_DELAY. There's really no point in timing out (and crashing the program) just because the application hasn't called show.
Reworked the code again in order to support parallel output, which is now the default mode. You can also now ask it to use the built-in RMT driver if you have other parts of your code that need the RMT peripheral.

Two #defines control choices -- put either or both of these before including FastLED.h:

#define FASTLED_RMT_CORE_DRIVER

Uses the ESP core RMT driver. To do this, though, it allocates a big buffer to hold all of the pixel bits, so there is a memory and compute cost.

#define FASTLED_RMT_SERIAL_OUTPUT

Force serial output of each strip.
Describing the implementation and the compile-time switches
The previous checkin had bugs in the syncronization that caused problems in parallel mode when strips are different lengths.
Made the code bullet-proof in a few ways, but most importantly fixed a terrible integer underflow bug in the code that fills the RMT buffer.
@focalintent
Copy link
Contributor

Sam - what's the state of your esp32 tree? Probably best to get the latest state of it merged over - or is this the most recent set of changes? (I don't believe it is, though)

@samguyer
Copy link
Contributor Author

@focalintent I probably need to issue a new pull request. I think there might still be a more issue with the synchronization, but it is mostly very stable

samguyer added 4 commits May 2, 2018 22:10
The big change in this version is the ability to support more than 8 controllers. Instead of assigning RMT channels to controllers in a fixed mapping, channels are assigned on the fly, allowing the driver to reuse channels as they become available.
Didn't mean to check these in.
Fixed the code so that it works with the built-in RMT driver. There's nothing special to do to enable it -- just #define FASTLED_RMT_BUILTIN_DRIVER true
Fixing some documentation and configuration stuff
@focalintent
Copy link
Contributor

@samguyer, @kriegsman — any reason to not merge this back into master and spin a new release for it?

@samguyer
Copy link
Contributor Author

samguyer commented May 7, 2018

@focalintent Let me submit a new pull request. I fixed some things.

@samguyer
Copy link
Contributor Author

samguyer commented May 7, 2018

@focalintent I submitted the new pull request. One big benefit: it allows any number of controllers, rather than being limited to 8.

@focalintent
Copy link
Contributor

Do you have a link to the new pull request (i’m not seeing it here) or did it just quietly update this one?

@samguyer
Copy link
Contributor Author

samguyer commented May 7, 2018 via email

@samguyer
Copy link
Contributor Author

samguyer commented May 8, 2018

@focalintent Looks like all the recent changes are there. Fire away!

@focalintent focalintent merged commit d416194 into FastLED:master May 8, 2018
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

4 participants