Optimised fork of bikeNomad's WS2811 LED control library. Supports KL25Z and KL46Z
Fork of Multi_WS2811 by
Optimised to use far less RAM than the original.
Capable of running up to 8 strings of 240 LEDs each with plenty of RAM to spare on the KL46Z.
Should run at least three strings of 240 LEDs on the KL25Z (RAM limited)
WS2811.h
- Committer:
- Tomo2k
- Date:
- 2014-04-02
- Revision:
- 3:2b5b03a3c0a5
- Parent:
- 2:1c2c9c8788a8
- Child:
- 4:586d20c99dbf
File content as of revision 3:2b5b03a3c0a5:
// Mbed library to control WS2801-based RGB LED Strips // some portions (c) 2011 Jelmer Tiete // This library is ported from the Arduino implementation of Adafruit Industries // found at: http://github.com/adafruit/LPD8806 // and their strips: http://www.adafruit.com/products/306 // Released under the MIT License: http://mbed.org/license/mit // /*****************************************************************************/ // Heavily modified by Jas Strong, 2012-10-04 // Changed to use a virtual base class and to use software SPI. // // Modified by Ned Konz, December 2013. // Using three-phase DMA ala Paul Stoffegren's version. // // Modified by richard Thompson, Marhc 2014. // Uses 8-bit DMA transfers instead of 32-bit, uses 1/4 of the RAM. // Now capable of running 240 LEDs on one pin #ifndef MBED_WS2811_H #define MBED_WS2811_H #include "mbed.h" #include "LedStrip.h" #define MAX_LEDS_PER_STRIP 240 extern "C" void DMA0_IRQHandler(); extern "C" void TPM0_IRQHandler(); /** * WS2811/n * LED Strip controller */ class WS2811 : public LedStrip { public: /** Set up the LED strip @param n Number of LEDs on the strip. Must be less than MAX_LEDS_PER_STRIP @param pinNumber Pin number on PORTD. 0-7. */ WS2811(unsigned n, unsigned pinNumber); virtual void begin(); virtual void show(); virtual void blank(); /** Send a level update to all the WS2811 LED strips * All updates happen in parallel, ensure all (max. 8) strips have complete data before calling this. */ static void startDMA(); private: uint32_t pinMask; void writePixel(unsigned n, uint8_t *p); // Class Static: static bool initialized; static uint32_t enabledPins; static volatile bool dma_done; static void wait_for_dma_done() { while (!dma_done) __WFI(); } static void writeByte(uint8_t byte, uint32_t mask, uint8_t *dest); static void hw_init(); static void io_init(); static void clock_init(); static void dma_init(); static void tpm_init(); static void dma_data_init(); friend void TPM0_IRQHandler(); }; #endif